From 5ce3a18adf37ff56fa230cc385c79f3210533e4c Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 14 Feb 2024 22:17:54 -0500 Subject: [PATCH 001/168] projectors init. added projectors to zipper, laid out some infra --- src/haz3lcore/zipper/Projector.re | 21 + src/haz3lcore/zipper/Zipper.re | 5 +- src/haz3lcore/zipper/action/Action.re | 5 + src/haz3lcore/zipper/action/Perform.re | 17 + src/haz3lweb/Init.ml | 14380 ++++++++-------- src/haz3lweb/UpdateAction.re | 1 + src/haz3lweb/exercises/Ex_OddlyRecursive.ml | 8 + .../exercises/Ex_RecursiveFibonacci.ml | 7 + src/haz3lweb/explainthis/Example.re | 1 + src/haz3lweb/view/BackpackView.re | 3 +- src/haz3lweb/view/Code.re | 39 +- 11 files changed, 7497 insertions(+), 6990 deletions(-) create mode 100644 src/haz3lcore/zipper/Projector.re diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re new file mode 100644 index 0000000000..568eac5141 --- /dev/null +++ b/src/haz3lcore/zipper/Projector.re @@ -0,0 +1,21 @@ +[@deriving (show({with_path: false}), sexp, yojson)] +type p = + | Normal + | Fold; + +let toggle_fold: p => p = + fun + | Normal => Fold + | Fold => Normal; + +[@deriving (show({with_path: false}), sexp, yojson)] +module Map = { + open Id.Map; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Id.Map.t(p); + let empty = empty; + let add = add; + let find = find_opt; +}; + +type t = p; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 61e1cbe04d..de60e2780b 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -27,7 +27,7 @@ type t = { backpack: Backpack.t, relatives: Relatives.t, caret: Caret.t, - // col_target: int, + projectors: Projector.Map.t, }; let init: unit => t = @@ -39,7 +39,7 @@ let init: unit => t = ancestors: [], }, caret: Outer, - // col_target: 0, + projectors: Projector.Map.empty, }; let next_blank = _ => Id.mk(); @@ -97,6 +97,7 @@ let unzip = (seg: Segment.t): t => { ancestors: [], }, caret: Outer, + projectors: Projector.Map.empty, }; let sibs_with_sel = diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 272570169a..fd28daa28d 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -43,8 +43,13 @@ type select = | Tile(rel) | Term(rel); +[@deriving (show({with_path: false}), sexp, yojson)] +type project = + | ToggleFold(Id.t); + [@deriving (show({with_path: false}), sexp, yojson)] type t = + | Project(project) | Move(move) | MoveToNextHole(Direction.t) | Jump(jump_target) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 58bc516123..7ab09bdcfa 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -8,6 +8,7 @@ let is_write_action = (a: Action.t) => { | Unselect(_) | Jump(_) | Select(_) => false + | Project(_) //TODO(andrew): ?? | Destruct(_) | Insert(_) | Pick_up @@ -17,6 +18,21 @@ let is_write_action = (a: Action.t) => { }; }; +module Project = { + let go = (p: Action.project, z: t) => + switch (p) { + | ToggleFold(id) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(p) => { + ...z, + projectors: + Projector.Map.add(id, Projector.toggle_fold(p), z.projectors), + } + | None => z + } + }; +}; + let go_z = ( ~meta: option(Editor.Meta.t)=?, @@ -45,6 +61,7 @@ let go_z = }; switch (a) { + | Project(p) => Ok(Project.go(p, z)) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 2b1e937fa5..acc9ff770f 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -26,9 +26,9 @@ let startup : PersistentData.t = context_inspector = false; instructor_mode = true; benchmark = false; - mode = Documentation; explainThis = { show = true; show_feedback = false; highlight = NoHighlight }; + mode = Exercises; }; scratch = ( 0, @@ -37,93 +37,109 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 81269f55-a66c-48d1-9fbe-83187a492f55)(content(Whitespace\" \ + 27df84bb-b653-475f-9e4c-8d35ae0a6d33)(content(Whitespace\" \ \"))))(Secondary((id \ - a4e41744-51dc-43bb-b359-47cb9649dcd4)(content(Whitespace\" \ - \")))))((Grout((id ef3fb913-bd26-4ef8-af2f-424a73c5c753)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + 13407fab-2a62-46d5-b541-352b37ffedc9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3ac7d870-0bd4-40d2-a4a1-33bfcf55c366)(content(Whitespace\" \ + \")))))((Grout((id f8cc8f12-7375-4c7a-8a63-beaa19d85a2b)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 3fd71a3d-9baa-4362-9887-450674850113)(content(Whitespace\" \ + 35003015-fbef-4b09-92fb-9c595d680cfe)(content(Whitespace\" \ + \"))))(Secondary((id \ + 915a1d4d-7375-4dbd-a027-acc97eb86fa5)(content(Whitespace\" \ \"))))(Secondary((id \ - 140c0376-4f67-40b6-8056-8cac787af42d)(content(Whitespace\" \ - \")))))((Grout((id 35a88970-2d50-43a7-a476-f81f5b36728d)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + db94144c-b1e8-45fd-8993-31fa9d707fb5)(content(Whitespace\" \ + \")))))((Grout((id d524e629-726d-4409-b082-295582f53acb)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 36ace27f-cd35-4880-b50c-7629d3a8476a)(content(Whitespace\" \ + 1829a9f9-d1fd-4d9c-9e0b-cf2411c3e3ec)(content(Whitespace\" \ \"))))(Secondary((id \ - 39a56f0c-5214-443b-8bd9-931ac9a7720a)(content(Whitespace\" \ - \")))))((Grout((id cbfc7b9d-7a60-4d4d-9a04-5239fe7008a3)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + b70dd120-f653-44a3-b021-205022ce5bc1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1ad97a42-fe88-4022-b429-66ade9a6ca40)(content(Whitespace\" \ + \")))))((Grout((id 06943c01-52f1-4b60-a0d5-3d4effb0fdc8)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 83b9a843-4947-43b0-8232-fb9ce31f8628)(content(Whitespace\" \ + 8012a4dc-0e86-4a80-a7ea-8f1c2fcc84da)(content(Whitespace\" \ + \"))))(Secondary((id \ + ae12f9e4-a42a-4ff2-ab72-4294d60abc21)(content(Whitespace\" \ \"))))(Secondary((id \ - abca2150-7d0a-4c6c-8502-bdef953a11be)(content(Whitespace\" \ - \")))))((Grout((id f292f825-054d-4023-80f7-5e436bbc25ff)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + d14b7725-4c89-4afc-9cf9-68f47518a0c8)(content(Whitespace\" \ + \")))))((Grout((id 7e68a559-45b9-4196-9d73-aa81c2f3b407)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 520a7c0c-6bb8-4bdc-a548-5431ef003028)(content(Whitespace\" \ + b56a604f-e332-4801-85af-28bc06a7d216)(content(Whitespace\" \ \"))))(Secondary((id \ - dd7c1758-0001-46c0-8ab3-e43a23285e0e)(content(Whitespace\" \ - \")))))((Grout((id 06807411-26c5-493c-8835-258878cb073e)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + 82e7a0c9-5db3-4050-91e3-df034164eed9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 17d51d16-010b-4ed0-b521-3f5b9f63b2b2)(content(Whitespace\" \ + \")))))((Grout((id 19012cd2-c47e-41de-a26a-0ff5274f7e40)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - c0748728-2618-4872-881c-ccb38dbd0c58)(content(Whitespace\" \ + 5aea5bbd-8b47-4a3e-80ac-435082d1e589)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7f20b4bc-ff3d-46ad-857d-a9f857736d9f)(content(Whitespace\" \ \"))))(Secondary((id \ - ab68e973-bf30-463d-989b-c7e37921aca2)(content(Whitespace\" \ - \")))))((Grout((id a9b8ab49-ba54-46b5-b504-c85c3f615c64)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + a7425e24-658f-420a-887b-f2a062ae7355)(content(Whitespace\" \ + \")))))((Grout((id 193e5c93-b34a-48e1-8437-9d9f68761f20)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 53f99ea5-f1e2-4c4b-bb11-8bb270cc563d)(content(Whitespace\" \ + 47b6d6a0-707a-4e9c-90c7-92cc267869b2)(content(Whitespace\" \ \"))))(Secondary((id \ - 0595315c-7bd1-43dc-8cd5-ef755f9d7538)(content(Whitespace\" \ - \")))))((Grout((id 6ee496e0-c06a-4c46-bfdd-c844017a8bd2)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + ea6dfdb9-b42b-4f24-bd59-8c6893d3a933)(content(Whitespace\" \ + \"))))(Secondary((id \ + 80c4359a-b297-44a2-bdec-a3e0f5fa97b9)(content(Whitespace\" \ + \")))))((Grout((id 27c22608-ce4a-4f85-b7f9-af3692db1347)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - cdc8e64d-6836-4d9f-9353-969397bfe2ab)(content(Whitespace\" \ + 5fe7cabe-3f08-4390-9d34-d9754bc1520b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 93f66164-b39f-4c4d-8091-3c1ff23dad25)(content(Whitespace\" \ \"))))(Secondary((id \ - 82f3fe37-c665-4aeb-af3d-01ad0de37d40)(content(Whitespace\" \ + e07cbe1b-176d-4853-9da2-6a8e125943e2)(content(Whitespace\" \ \"))))(Secondary((id \ - 749ce88d-f0e0-4694-b13a-0831f733b0ed)(content(Whitespace\" \ + 4a7eca7f-2ad4-4ff0-94e2-97b8f2824e6e)(content(Whitespace\" \ \"))))(Secondary((id \ - 4a7e3e85-8563-4160-a121-bc3c0911118b)(content(Whitespace\" \ - \")))))((Grout((id 75ba0150-8d58-4efe-9253-cc2d7f4df1c4)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + 8f8896d1-cf4d-468e-82a2-01cc2a5df1c7)(content(Whitespace\" \ + \")))))((Grout((id 13e6876e-c26f-414f-82c3-dd35b58a62df)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; }; ], [ ("scratch_0", Evaluation) ] ); @@ -134,8395 +150,8561 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 8068a0c4-8131-4ce5-a850-c17e7e7e38a7)(content(Comment\"# \ + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 4513e0b2-70cf-4541-9ca2-8797759b23ca)(content(Comment\"# \ Internal Regression Tests: Function literal casting \ #\"))))(Secondary((id \ - 3be72b01-de96-4cd5-910f-b6f3ab6a172e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4d828014-6d8f-434b-abf2-6a662fe33c69)(content(Comment\"# None \ + 8977768f-526c-46cf-94c3-d2b524e6dc05)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c8937095-d29d-4564-9770-d784e425a0d8)(content(Comment\"# None \ of the below should trigger runtime exceptions \ #\"))))(Secondary((id \ - c3af568c-60e3-49fb-b4b6-aceb07a91e97)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e57439be-1c01-459a-bcf9-cd5f3aa8c65d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ce9fa5fe-b457-40f2-b69a-1dd30d72b19a)(label(let = \ + ca3b6a21-58af-4be5-96d1-c7662e7d113b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3c605615-ed09-4a8c-b0b3-4c5563abcdb7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a4fb43f6-86ee-4ad8-afd1-4bd3eb777559)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cbeba9b0-28a2-4e5f-84d3-1ac692fdadac)(content(Whitespace\" \ + 5973f436-1fb0-46a4-b071-2e4fb3ca8a8b)(content(Whitespace\" \ \"))))(Tile((id \ - 5c050101-1fa6-4df8-b20b-b19c253a622d)(label(g))(mold((out \ + ffeb6fc5-a0be-4383-b310-52e68d59ad8d)(label(g))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f9aa410a-67dd-402d-bb0f-4a7681401d98)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 19b9e385-4290-4094-be42-699b9a3f7f74)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 364edc1f-bb6f-4b64-b3c8-88889944ab35)(content(Whitespace\" \ + aeecf78f-b1ec-4fe9-9622-e753e1cede32)(content(Whitespace\" \ \"))))(Secondary((id \ - 8bd22357-2c15-4dcc-92b8-5aa2f6e4762a)(content(Whitespace\" \ - \"))))(Grout((id f20dff97-39f2-4f4d-8f31-684088be69f0)(shape \ + 924c52d1-b1a1-4ed9-961a-0f81454a67c3)(content(Whitespace\" \ + \"))))(Grout((id c0ea92c4-2936-4dd9-a993-32f4f652fe68)(shape \ Convex)))(Tile((id \ - ca20cc5f-f628-4149-9310-d59868ecc7a9)(label(->))(mold((out \ + e6953228-35f8-4e93-826b-cc94ce535e79)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 5cb83599-6fff-4fe6-8b1b-fbc0f2b16df6)(shape \ + 9dc79b6f-179a-4516-86ee-1424a66b1797)(shape \ Convex)))(Secondary((id \ - b6ed15b5-4d03-474f-8079-ff23578cb9c3)(content(Whitespace\" \ + bcc72c1d-16a0-431c-b119-102efefac6bf)(content(Whitespace\" \ \"))))(Secondary((id \ - 90761b49-64e0-4fa1-b3b8-2baf37151b32)(content(Whitespace\" \ + e84afad4-c313-460e-a428-7a5ae6c6fcb1)(content(Whitespace\" \ \"))))(Secondary((id \ - 8784e29d-9fb1-47e6-9833-13964e30a390)(content(Whitespace\" \ + 8bff5b25-05dc-4f85-873a-cd219e8be7b5)(content(Whitespace\" \ + \"))))(Secondary((id \ + ec9a3ba9-3c1a-4458-ae03-0bc1781ca95d)(content(Whitespace\" \ \")))))((Secondary((id \ - 881872c6-0d5d-4618-a27f-2d8189d891d3)(content(Whitespace\" \ + f22d8033-ac10-4b5e-9a93-e96ce2877d7d)(content(Whitespace\" \ \"))))(Tile((id \ - ec558c21-a417-440e-8649-5d1e471ac938)(label(fun \ + 62e89cc5-4c0f-4a58-9ea8-c66caf8d955d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6cafce86-7cfd-4966-890f-1ff63e7c59d1)(content(Whitespace\" \ + 213965e6-9c76-4595-9d55-f4e409af802c)(content(Whitespace\" \ \"))))(Tile((id \ - e6197a04-5d43-457c-b9ac-2863dc99c9aa)(label(_))(mold((out \ + 7c6ea234-5b8d-410c-a193-84cea3cd932b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8bc5b8c6-b9f6-4f7f-bdc0-cca1ee17ace0)(content(Whitespace\" \ + b44663a7-dc46-4a2b-b579-6e7a7b008129)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5fa91f17-5b9d-4375-8c21-48ea2a17f79b)(content(Whitespace\" \ + 17e2bc31-f2b4-425d-8520-d20eda1311c7)(content(Whitespace\" \ \"))))(Tile((id \ - 729bfaa3-4d19-45ab-b2ea-0ee7cbf89f6a)(label(9))(mold((out \ + 038a4211-e388-492c-9965-993698c62263)(label(9))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - efb902d5-fca7-4ea6-811b-8fa5cacf00a6)(content(Whitespace\" \ + 86e5e626-80d1-4293-a96a-327bc5009761)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4b388e57-61f6-4c4f-8288-28300d5c63be)(content(Whitespace\" \ + c8bc16bb-2bfb-4f5c-8e51-d159c6a9cdbd)(content(Whitespace\" \ \"))))(Tile((id \ - 54988076-8257-438a-800d-614fed5dbf32)(label(-))(mold((out \ + f90129c4-1298-4de4-9874-ee0b39ceb804)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ - 2))(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6760425e-a4f8-4974-8ae4-59d7cb943370)(label(g))(mold((out \ + 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ + a25c0804-5919-441a-9401-b9327b500a32)(label(g))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bfb3339a-8286-43fb-9ba1-28b3ccd4f57c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 8cd5cd0b-f692-40f1-96f0-518117080388)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c39698c7-0f2e-4bef-a04f-8a39d9a055d0)(label(1))(mold((out \ + 2713281c-1453-487a-a917-240525d9bb25)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - fa356f00-e672-434b-affe-c17ba6a33b8b)(label(\";\"))(mold((out \ + e67c9a06-134c-4853-a5fd-68eb7bb90394)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7816c92f-1592-4df0-b2c9-079260acf77c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - eb8b1deb-50e1-4a00-b58c-c1203e082d85)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c244a67e-156c-4a5b-8976-9c33b02945ab)(label(let = \ + 02d7ddd7-f3f7-43d2-a252-2212ea546e3b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cbf1a599-fbc7-4011-a72a-2c4438c63995)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a0babb87-2d63-4010-997e-ed35688a2009)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 058e2ec9-8a44-404c-a984-b5e3fc44526a)(content(Whitespace\" \ + 7857b5ee-a782-4134-a2ef-0372d2a5c0e2)(content(Whitespace\" \ \"))))(Tile((id \ - d9a0395f-eb34-47a7-9962-cc212a342bae)(label(f))(mold((out \ + 3117e9ab-269a-4e8a-9d70-4e9290ce39f7)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 700d354d-c0ce-4a53-b12c-cbee7556a60b)(content(Whitespace\" \ + 497c989e-d13f-445a-9fe9-cad756909645)(content(Whitespace\" \ \")))))((Secondary((id \ - c4653559-da72-40fc-a7e7-bcc45abf19cc)(content(Whitespace\" \ + 38494d4b-cc5d-4561-8794-e4d26259afee)(content(Whitespace\" \ \"))))(Tile((id \ - bd681a2c-d7c4-4483-af87-fc929dd43eda)(label(fun \ + 58f2107d-4fe4-4bf6-b76a-18765a0177be)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1a9f798b-6df6-4aac-a512-699c4f0e4914)(content(Whitespace\" \ + be5a7be1-4262-4fe3-b571-020e43cdc0db)(content(Whitespace\" \ \"))))(Tile((id \ - 998f8e6f-d099-444b-9c75-891ab31f1768)(label(b))(mold((out \ + 1c7f7743-e689-4e73-94f8-090bdbffe2eb)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a5faaaaa-e2f9-46ad-932a-0289bd5b39ec)(content(Whitespace\" \ + 7c3152f8-3143-4778-96f4-de986576b1d2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5c84c891-35bf-4c68-a116-83e16699136f)(content(Whitespace\" \ + df25e1ba-21d9-4831-ae30-7ba11a4c971b)(content(Whitespace\" \ \"))))(Tile((id \ - 74466136-5bab-4a17-af60-4e45651ef15c)(label(b))(mold((out \ + bd033cd0-99d7-4af7-a392-470699e9bcc0)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9708006-883e-4b2d-bb30-c16eceb968dc)(content(Whitespace\" \ + 9b1acda6-3317-4a09-b6ff-4f05227d29f0)(content(Whitespace\" \ \"))))(Tile((id \ - 5b08b814-e7df-456c-b93f-0612e8ae5e9a)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 6a9eeffb-2a80-4e45-b5c5-97cdeb983e93)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cad35cba-3f46-4c8d-8e95-874ac1cbb84f)(content(Whitespace\" \ + c407cf81-11f3-4ef0-9d1b-bc37eb8179cc)(content(Whitespace\" \ \"))))(Tile((id \ - f130da22-b535-4868-8c28-bb7d6e114694)(label(true))(mold((out \ + 532465b7-a7e8-4a20-96de-f48bd3a0f62f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6e17c3c4-3b95-4524-abd9-64fb1a179665)(content(Whitespace\" \ + 91c841bd-ce77-4bf2-9a10-e7ff44352f1f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3d264c86-a12c-4dc2-8d06-9bfc92ff1160)(content(Whitespace\" \ + b9f81427-fd67-4e04-b754-31a35466c0d7)(content(Whitespace\" \ \"))))(Tile((id \ - 53ac5aaa-2c96-4159-a15c-be816540dcf6)(label(f))(mold((out \ + fa8b50dd-6c87-40ff-a89c-766290651eee)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3fbf338a-1948-42bd-9d25-93b98002a1a8)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 1a1fb467-7318-4017-8603-b6d6c14d24a4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5a6b4ca1-8b45-43e5-88e7-0df7ab9a8291)(label(true))(mold((out \ + d10d9bdc-3b9d-4108-988f-5194c70d0e89)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 5b9cad15-2118-48bd-8a90-930a1a14fc34)(label(\";\"))(mold((out \ + 4104a061-f2e9-49d1-a9d2-624dc64d43e9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cd49f1aa-27da-42f3-8f0f-02f845ca8cd3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4b5a4b1a-c654-4b0c-a3d3-53794844fe64)(label(let = \ + fa874c41-3b99-485d-ad43-20ba3821f04f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f45956e2-2a4a-4762-ac89-c803b49c22ea)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2b4ded00-335f-42d5-af7c-3ddfa436f524)(content(Whitespace\" \ + 71cf1a45-b7e3-4103-84b9-b32d689d5b0d)(content(Whitespace\" \ \"))))(Tile((id \ - 083512d6-17a6-4288-a83a-faea34192510)(label(f))(mold((out \ + d4e4c92d-e07c-428b-b43b-d664ab476935)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a5916772-9b05-4c21-a6ee-9ecbd54516be)(content(Whitespace\" \ + 6c41be94-a392-46ac-a21d-9c78ba5deb0f)(content(Whitespace\" \ \")))))((Secondary((id \ - 666f67e6-24c9-446f-a7ab-38e2c015f9cf)(content(Whitespace\" \ + 8f156447-b9fd-44c1-b152-ad84f07382e3)(content(Whitespace\" \ \"))))(Tile((id \ - f0807ef5-df8e-4eb7-9f78-339003a5b8de)(label(fun \ + fb8f8fb6-5f51-4a03-9643-14c0f0a12391)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 106fc984-125d-427f-a0b1-acbe77f0ffba)(content(Whitespace\" \ + 754385fd-2ea1-4547-ab5d-f7a47ff25f32)(content(Whitespace\" \ \"))))(Tile((id \ - a049e806-20c5-4b1d-a099-7755a9097b7c)(label(b))(mold((out \ + aa722fb8-fd7d-442e-baaf-7392aefbd4e9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 43a50e94-546c-4d1a-8dd8-c5b597a73727)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + cc43d795-d7d6-48ff-b1f2-2059e7f050e9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - a2958e5b-2da8-4f25-903f-220583955a32)(shape \ + e8ccdc7c-3eb4-4f75-9008-26c85a683f1a)(shape \ Convex)))(Secondary((id \ - 2a78f83f-11c1-488f-8e1b-81f27b9d6a73)(content(Whitespace\" \ + 3e0790f2-4a3a-4ea6-8384-8f252df408e1)(content(Whitespace\" \ \"))))(Secondary((id \ - e24760a0-00f4-411c-bd9e-6ddaafdfa45e)(content(Whitespace\" \ + bae45e43-19f6-47e1-825a-4608fa91aec6)(content(Whitespace\" \ \"))))(Secondary((id \ - cea3d12d-01b1-4cde-8fab-0249d492ab91)(content(Whitespace\" \ + 02109c03-53eb-4655-8b10-8818fb5d9c1b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7a586f77-e7d0-4e4b-bd32-86dbf0e2b7c2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b1651b66-ecf9-40e2-87b6-1467f19c6199)(content(Whitespace\" \ + a792cf48-d235-48e3-9031-24109e86d560)(content(Whitespace\" \ \"))))(Tile((id \ - 76e9f1a4-edd2-4dcc-ab7d-bb5ce3daa033)(label(b))(mold((out \ + 1b9ac3a4-8a3d-470d-a9f6-d95a24759cc3)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 29b18195-9677-4596-a89c-b9fc61267425)(content(Whitespace\" \ + b3d5a072-e0e3-4418-bf30-d40d801542a4)(content(Whitespace\" \ \"))))(Tile((id \ - 43ab9ff3-2fac-440f-ba6f-67cde6a259fd)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 4a168637-97b1-40fb-b286-46bc8de1e0b7)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f48bf544-6b5f-45c8-a4b4-2d2b8b8d62c4)(content(Whitespace\" \ + acdb4e6f-e6ff-497b-a386-5279c6cc9350)(content(Whitespace\" \ \"))))(Tile((id \ - c73a3100-a782-46b9-a401-3194788d3ab9)(label(true))(mold((out \ + 2725d779-bf25-421f-a562-b50d769fea51)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1755c477-85d2-427c-8240-a91649c21dfa)(content(Whitespace\" \ + 5d4174a8-03fa-4cf9-b639-a291c4b18879)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 77a083d4-1e8d-46a3-9844-c2a929afae23)(content(Whitespace\" \ + 5c1701ed-b772-49d5-a40d-e2f3f9f0f78a)(content(Whitespace\" \ \"))))(Tile((id \ - a40bdf1f-e175-48aa-b34f-c6c3c2ac61d9)(label(f))(mold((out \ + 98de3d6c-95a1-45af-90d7-3107e9264ffb)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a08d599a-5b8d-4b5d-8f5f-8a28646b9e01)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + bd5345f9-ffe0-49fa-bf38-87caf27eeac3)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a7b66a4e-4c88-4a7d-b325-1ef561c8945d)(label(true))(mold((out \ + 47ff3937-a409-4194-a82a-b858884ec848)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 506b50ea-1e13-4309-83ed-9e2646874c49)(label(\";\"))(mold((out \ + 8f4d840b-492b-4cc4-a981-1b7b1ffb871f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 08da3a5e-3737-4e5e-9fb3-9b18d8142310)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d0c3bbff-de90-4c18-bc64-f06637a0c534)(label(let = \ + 3ed86443-4cd5-4c89-aa64-d12dbfd43595)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c8175bf2-719a-4aa4-9a15-50156d9cf29c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd3ce62f-26d4-4583-895c-b1703388b2b2)(content(Whitespace\" \ + 2c569a02-61a8-4ef5-8c0c-5aeed9799b0e)(content(Whitespace\" \ \"))))(Tile((id \ - 98686f54-7a2c-4951-b59d-48a861d27aab)(label(f))(mold((out \ + e79f7c1a-b610-4563-999e-0b43158f3734)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7d9fa3db-ad61-4696-9c7e-9b897a1bf2b3)(content(Whitespace\" \ + f193660b-2817-41e5-8e24-e0c22459ecc1)(content(Whitespace\" \ \")))))((Secondary((id \ - c3afe279-39cc-4c43-9185-e19ce5ba31ff)(content(Whitespace\" \ + 3fe4b5d4-322c-4211-bbd7-7c4dff7ce7e0)(content(Whitespace\" \ \"))))(Tile((id \ - 5965539f-7948-4f36-9160-aa18475144e3)(label(fun \ + 6db7ae83-3c08-4a1f-b9e3-64cf73057c11)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d7403374-174d-4a55-a4bd-423d6c907a22)(content(Whitespace\" \ + 2efd79e5-498f-4def-a5e4-effe171be5dc)(content(Whitespace\" \ \"))))(Tile((id \ - 9f58bd61-2540-4de4-877a-275ea138c657)(label(b))(mold((out \ + 04df02d1-17eb-4e5c-afe9-851a1b6ec96d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 84123ab9-18d0-44aa-98a8-08f1eb3c0b42)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f9994a77-a390-4d44-a4c6-9c577dc6585d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6134bd22-8950-4612-a5a7-5fff5a16abed)(content(Whitespace\" \ + 98e7d74c-6b55-4ae8-b13d-df8b064f47ff)(content(Whitespace\" \ \"))))(Tile((id \ - 9a1a6bd7-feb2-4476-9be1-81af953c33da)(label(Bool))(mold((out \ + cfefa68c-ead3-4e88-91cd-70778ba23bf5)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a2a9a9ad-3751-4443-b863-9075a213e282)(content(Whitespace\" \ + f2057d9b-bf72-48da-8cfb-a1d1b99b9033)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7dd4efd1-b246-4cef-a279-e45029f3f048)(content(Whitespace\" \ + 61accecf-2c2a-4102-b868-aa38c3f44d7e)(content(Whitespace\" \ \"))))(Tile((id \ - 50d4bc14-0110-47f1-9ff3-9173fb4c799f)(label(b))(mold((out \ + c7ad7889-cd6a-4046-910e-d201b00eb621)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1cbbf7f7-82f6-4d5f-8af4-694afddaa340)(content(Whitespace\" \ + 8a311226-869b-487c-82a8-d208ba19cc70)(content(Whitespace\" \ \"))))(Tile((id \ - 07740340-432f-404b-a4b4-58c849178faa)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + d98a35a1-2510-4917-97a6-1a836997cb5d)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2f0a5a7a-2a8a-442a-9b42-bb29ace672ba)(content(Whitespace\" \ + d64ad2eb-88f7-40ad-af63-4e6c9b29391d)(content(Whitespace\" \ \"))))(Tile((id \ - 8cfe83fb-95ca-430d-b614-7ad6a1f060fd)(label(true))(mold((out \ + bdd32c4f-6be9-4de0-bbbe-4e73e6db5259)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c49a3f96-09b3-4c92-9d9a-4e0e129bfd4d)(content(Whitespace\" \ + fa0a556e-eed7-46b2-b62f-238a3f2649ef)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ccc17a8b-20f6-41ca-aced-8ab1e37b51af)(content(Whitespace\" \ + d2352cbb-0030-4a7f-9ae8-3e2b4b861b81)(content(Whitespace\" \ \"))))(Tile((id \ - 9d4cca74-c8be-47b6-aab7-db4a81519644)(label(f))(mold((out \ + 8b4ace74-3775-48bc-8c2d-302ecc5d1f58)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b0b5f605-6c2a-4163-91af-2db67039b026)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 35f467db-24d5-471b-a20f-d6c77f3335b9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a52dcc6a-5f33-438c-bfa5-f5065c49dd3a)(label(true))(mold((out \ + 5a1ac369-54b4-4b23-a877-74d5f95ff7fa)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 823c2d05-bfca-456f-8ea7-3dc327249035)(label(\";\"))(mold((out \ + 23f88f0a-40d9-4193-b71c-b67c31c7cd00)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6ef23420-91b3-4e62-a6ad-acc727256268)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 812d4f83-80f9-419a-862b-7fbcd5ca14ce)(label(let = \ + adbbe295-ac3d-4af2-a1e5-f5383c61748c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 72c467a4-33f8-4ebd-a820-6f02956bde62)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 74ec9114-7deb-4131-95fa-ef6596f0727f)(content(Whitespace\" \ + 26ec9d21-1cfb-49bb-b33c-dbd2b35cf8fa)(content(Whitespace\" \ \"))))(Tile((id \ - 9a1e62b2-f5a8-44d6-be05-e543aa063c03)(label(f))(mold((out \ + 35af5060-31cc-422f-865a-abb7e0a304d1)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f8d525db-5cf3-454e-93f4-dd805dbfece7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + fb7ddfe3-cb9b-4daa-b23d-4d1d2e9cc50e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fe35e44b-a3d8-4d9f-b052-d95ce9dff21c)(shape \ + 44535cf7-dbad-4da8-b7c2-96e2f777f3b9)(shape \ Convex)))(Secondary((id \ - 68211388-5a88-4811-959f-947ab63a5bcd)(content(Whitespace\" \ + e12e8fbf-b955-4fba-a59e-fed86b8752c4)(content(Whitespace\" \ \"))))(Secondary((id \ - 3a3a303f-be27-4df1-9b21-86efdcb6ec46)(content(Whitespace\" \ + 4de37596-6a3b-44e2-a21f-b717f58b7172)(content(Whitespace\" \ \"))))(Secondary((id \ - 442407b8-023a-4380-ba34-3a9d13d031a0)(content(Whitespace\" \ + 6c1ff3ed-068a-435c-95ef-17184cc90a45)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4b3030f7-558e-4c2c-8eb1-0ba8db188bec)(content(Whitespace\" \ \")))))((Secondary((id \ - 0fc60cb0-46de-4545-a2fb-4282bd97be44)(content(Whitespace\" \ + 6f60abf4-bb4b-4e4c-a922-a2f3134d37a8)(content(Whitespace\" \ \"))))(Tile((id \ - d0c96440-b4ab-4e5f-b547-568097937dcb)(label(fun \ + 842a9e31-880a-41a4-8bf7-fdc7250c1549)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fde88b1c-69da-461c-9b0d-6c47f1a9ed6d)(content(Whitespace\" \ + bd935af1-8a16-4613-a8e5-b13937d4196d)(content(Whitespace\" \ \"))))(Tile((id \ - 32ff1b3a-0010-4190-9ff8-18086ad6e5d8)(label(b))(mold((out \ + 48698381-6f54-4d28-bbe9-5e7309b067ca)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 10d76632-a4a7-4622-8872-8c5886c49e42)(content(Whitespace\" \ + d4eda7f7-6a16-40bd-8458-8261dc8cea3c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1e546a71-cd49-4ebd-aff1-dd6d1aa7c4a0)(content(Whitespace\" \ + 96361760-efe1-4cf7-b0a4-26ee809dec11)(content(Whitespace\" \ \"))))(Tile((id \ - 808bf4f2-1a68-415e-b997-01ff2037d799)(label(b))(mold((out \ + f806e1bb-75da-4031-8b43-ea5fcbdf1b2b)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 05c7644a-7a22-4c20-a812-1fd5b8e02005)(content(Whitespace\" \ + ae65efda-417e-4167-a8c0-bdf019e5effb)(content(Whitespace\" \ \"))))(Tile((id \ - 5e74bd2d-8a05-4ebf-aee6-6fb3ec824145)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 83047c2d-ed67-4dc8-b6ca-d3232dc7313d)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ec28d888-794d-4201-abda-94b6e3f1bbdf)(content(Whitespace\" \ + 6fbfc169-02a4-4144-8a2e-38b0b5d96942)(content(Whitespace\" \ \"))))(Tile((id \ - 3ef7de3a-2a14-4188-a55f-51527113ef74)(label(true))(mold((out \ + ff269e9b-fe40-4cca-8918-0bcd0159108e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9a6d019d-7e68-4607-acda-eba022cdc741)(content(Whitespace\" \ + 0fe695f9-072d-4858-9e11-fc125d910386)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5aa34837-e964-4ba3-a34c-ad5fd015a710)(content(Whitespace\" \ + 0b23a9b2-9251-40dc-89aa-185d30eb2299)(content(Whitespace\" \ \"))))(Tile((id \ - 7632724e-1f20-4d15-ba4e-e01b565bbf4f)(label(f))(mold((out \ + d289a6ff-7bb2-4e6d-bfe8-1975f8ff3c8c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 002d2fdb-a677-4f81-9c2e-1867a5407bbb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + b8f0229b-68ea-41f9-9e67-24d1a40f79a4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 62820ee1-7863-4a17-90f8-e04dad881c64)(label(true))(mold((out \ + e0c06d3d-023d-49ac-8d3f-f9322c135555)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 4dfb1076-524e-4527-9a36-4f2b33913898)(label(\";\"))(mold((out \ + 4031b812-dc50-45dc-8059-2c9b987aa2bb)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ea549dfd-7437-4aa5-83fc-c59393a44e84)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3ac5d13b-c645-4a2d-8500-f753ba61e239)(label(let = \ + d4ca12af-5e8d-4a5c-a54e-0838bcf1c868)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 13c56e5f-c5c7-4329-9ec7-308523291539)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3772fc52-5d80-49a9-a915-10132f4413a7)(content(Whitespace\" \ + 7457bcfb-e4bd-46aa-9134-378395e9782a)(content(Whitespace\" \ \"))))(Tile((id \ - 88657220-85e6-4449-91d5-4b282ca9468a)(label(f))(mold((out \ + e189d1e8-5e9b-4167-acdc-ec558885ceb2)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 753a4301-8388-45c4-bd4e-626eeac2f55f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f40b9593-d854-486d-9fb5-fa171c4169f7)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 30afec45-3066-4a0f-817b-4f99697585e3)(shape \ + 3010680c-1f2d-481b-89fc-1280e80b3095)(shape \ Convex)))(Secondary((id \ - e534716b-c249-4bc8-8bdc-c492a72acf60)(content(Whitespace\" \ + 5c3fd634-a4bd-4a94-9010-f83587a8c38e)(content(Whitespace\" \ \"))))(Secondary((id \ - bf464cbe-a15c-4dc8-9376-f14dafd49ee5)(content(Whitespace\" \ + 05fc9fb8-856b-4d60-ae0c-528f70defd0c)(content(Whitespace\" \ \"))))(Secondary((id \ - 00da0773-8c3b-44a0-93ee-552d6d00d643)(content(Whitespace\" \ + d6c91b88-fb8b-4f4f-80b6-233e206c11e7)(content(Whitespace\" \ + \"))))(Secondary((id \ + aa7abb72-965f-44fc-889e-487d0ce1ff38)(content(Whitespace\" \ \")))))((Secondary((id \ - ff437f2e-8a76-4186-857b-56cc23c8cf53)(content(Whitespace\" \ + 4fdd9500-5904-4e18-a2a4-b9b52ea181e1)(content(Whitespace\" \ \"))))(Tile((id \ - 28ba42f0-050b-43dc-a8f4-918c72fa935a)(label(fun \ + efa41b4a-ae37-4e6c-8460-c14168038d53)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 868be89d-7e08-463c-8dcb-33e6c8f69e94)(content(Whitespace\" \ + e506c067-85b0-4291-8e42-838936e3e9f5)(content(Whitespace\" \ \"))))(Tile((id \ - e7c53b17-975b-4397-b6bb-7f4811d6db82)(label(b))(mold((out \ + 3214dbdd-14db-49e6-ba05-f4f8d7b9e1fa)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d163d4ea-0f31-47a1-aec4-8ae8015d8b51)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + b13c9738-a410-4da1-a8db-5af280743784)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - afab5ad9-7a2b-423d-b78a-79c436c4cbec)(shape \ + f4023bbc-d333-463d-8107-59aaebee9ce6)(shape \ Convex)))(Secondary((id \ - daa148af-3377-4878-bc2c-d694b57ffbe3)(content(Whitespace\" \ + 5872d1a7-490d-4dc5-acbb-5063ff944e1a)(content(Whitespace\" \ \"))))(Secondary((id \ - 090d5f42-f40d-40b3-8852-e3df2288f312)(content(Whitespace\" \ + 65a0f97a-9806-450b-82ee-949b2814683f)(content(Whitespace\" \ \"))))(Secondary((id \ - 7de52110-c900-4a11-ba4e-037c4505322b)(content(Whitespace\" \ + 333d4657-5034-4e2e-87f9-9599b60999c0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 306e26b8-afef-4d97-adb9-07d413b0f0e0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3ea7ec25-bb44-4ba0-a941-ec8f0e78e32b)(content(Whitespace\" \ + 8be45247-7464-4e8e-873a-9e72ec552c59)(content(Whitespace\" \ \"))))(Tile((id \ - 9ccb96b2-2464-4556-9643-4c8f617f7308)(label(b))(mold((out \ + d6152a57-357d-4dc1-8343-638e8615ea2b)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b961beb3-fa7b-4fd9-b91c-239f69cbcfc7)(content(Whitespace\" \ + edc725b2-610e-4eae-a662-4cbdcde1c4f1)(content(Whitespace\" \ \"))))(Tile((id \ - 93a136c6-b09d-4b15-8b00-d4f06bb96300)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 37b056e2-86db-4512-9ca1-743520f8f885)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fb29a56a-0ef8-4287-bdfb-8b44145f44f5)(content(Whitespace\" \ + db829664-9db4-4b1a-9784-76b849a43109)(content(Whitespace\" \ \"))))(Tile((id \ - 88f0e812-40f5-411c-8a59-835cd8fbc13d)(label(true))(mold((out \ + 2681d881-7c2d-40c2-9ac7-63c3adccc927)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 28d36d6d-a119-43bb-8d70-6906b2dae317)(content(Whitespace\" \ + 2b364945-53c0-438f-b425-1f568dbd45d8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f599939a-5936-40bb-89ba-7d21ec9a5f63)(content(Whitespace\" \ + a58ff0d1-800f-4f58-882b-aa190a011fd3)(content(Whitespace\" \ \"))))(Tile((id \ - 97f492eb-a350-479a-a781-5a08d6abe259)(label(f))(mold((out \ + 8dfa7251-8c4d-44c9-9e0e-c1204501d98e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - aaf0812f-7972-41b6-8eac-ef5929e5c3f8)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 9a0eafad-15de-4c6a-a658-5ff411c50bfd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 34eaa419-274e-4ff5-bfd0-cce8e39cde76)(label(true))(mold((out \ + 9f077f67-c728-4afc-9285-c741f1e0505d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d9380579-9c65-4d68-96bf-3abf614f7fe1)(label(\";\"))(mold((out \ + 01723fa2-eda6-4ce9-99a3-e46c149926c1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5caf86f9-67c6-400a-a3ec-80666f040bce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ae9cf20e-e9fd-4972-8cd6-17fe70d28f57)(label(let = \ + 6540d7af-0b45-4dcd-9f6f-f8085cb43b73)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ce2b7e40-addc-4e4b-a048-1cb6ed9a532f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c7ff1ba0-287d-4225-9e45-8c57f590f6ff)(content(Whitespace\" \ + 53eaf352-dade-4d8e-bc89-f4bc36527e5f)(content(Whitespace\" \ \"))))(Tile((id \ - 80f77759-243b-4ab5-937f-081e5b14ffc4)(label(f))(mold((out \ + 1bacbd62-6ec6-4f54-aee5-4ff01315a784)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5a385233-70ca-472f-9efa-868afa2fa920)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5c7c85c8-1fa6-463a-8ee2-16e691ecbd95)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 6796dd02-e021-4bf4-9af1-a07ef4b1bc74)(shape \ + 8c868f9e-be84-46d2-9a3f-841f2f079062)(shape \ Convex)))(Secondary((id \ - d110d938-d497-4c04-8e89-066a813de449)(content(Whitespace\" \ + 38e06f33-79fb-4aee-9ad7-2b3058418c48)(content(Whitespace\" \ + \"))))(Secondary((id \ + abe6159b-41de-42d9-9275-6f9b8ad818f6)(content(Whitespace\" \ \"))))(Secondary((id \ - ffe2143a-7389-4770-a4ba-5b0979fbb22a)(content(Whitespace\" \ + 5d6f7686-5ae8-474a-8135-a7734754bbcc)(content(Whitespace\" \ \"))))(Secondary((id \ - 06d75ddd-e9dd-4ea4-85a0-9cb33d5e406a)(content(Whitespace\" \ + 5a858904-5b68-4604-ba89-35910d065091)(content(Whitespace\" \ \")))))((Secondary((id \ - 834a19b1-916e-4db0-8d77-b31479e219cb)(content(Whitespace\" \ + b5d96223-2a3b-428d-851e-08ce7b721ab9)(content(Whitespace\" \ \"))))(Tile((id \ - ca32f0d3-79d9-45cb-baab-9a1a818bc52b)(label(fun \ + 0488c69e-62d6-4d44-889b-958e261f2a0d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 49378f89-aa16-44d9-aa6f-6e528ad367ca)(content(Whitespace\" \ + 0a4a0186-b65a-45ce-9630-208ac32cf844)(content(Whitespace\" \ \"))))(Tile((id \ - c2dcb59b-085d-422b-b984-96edb2fe98fa)(label(b))(mold((out \ + 32ce5c06-3673-4c88-82ab-05646d50601a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dcbe313a-40c0-4155-89fd-6582504c3f81)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 51170fe6-741e-4c79-b0e6-27075d5bb9fe)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a1b7d325-6d0e-4afd-a524-d1f2f5e082c0)(content(Whitespace\" \ + dcc1ca73-6305-485e-90b7-5ec8c4c8653a)(content(Whitespace\" \ \"))))(Tile((id \ - 1dd3c27d-ad8a-4b97-ae84-4a00f750be6b)(label(Bool))(mold((out \ + ffe7b677-45e5-411a-aab3-d365be8a2e44)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0d8bce72-a5c2-4493-9f8f-b9befeb6d851)(content(Whitespace\" \ + 9d768faa-28f8-4e8f-bab6-2e5a70183850)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 226181f6-33c1-4475-a7eb-8e4b6d096408)(content(Whitespace\" \ + 94975586-4549-4fc2-ab67-48e09fe8c8fc)(content(Whitespace\" \ \"))))(Tile((id \ - d28519f5-0922-4439-9fa1-c5f0c3ebf346)(label(b))(mold((out \ + 59a53165-c308-4b63-a85f-f5b4d6a39abb)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a1755b32-1b4d-41c7-9f1a-42c71e180ab9)(content(Whitespace\" \ + d19a72d1-053d-44eb-81b0-c0965210191e)(content(Whitespace\" \ \"))))(Tile((id \ - e70a5d41-2a81-4b8b-9529-15ada2e2d985)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 1c033c43-63fa-4521-a68c-72464608c85a)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a4d0485e-9be2-448b-b811-10012453597e)(content(Whitespace\" \ + 37ad3c08-a8e1-48e8-9670-b3d764899ebc)(content(Whitespace\" \ \"))))(Tile((id \ - 6c05f4c4-ced6-4bac-a9c1-ff0cca03b949)(label(true))(mold((out \ + f92ce557-1081-415a-9728-9b3bd8e3df7e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2052fc4c-45d1-4ebb-bb45-fc58fe231e86)(content(Whitespace\" \ + 3f735ca1-07a0-4709-87ec-baea55b05e42)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c69713d2-f7da-4b5c-b8e7-8e34eaa355bb)(content(Whitespace\" \ + 2ac00c56-5b69-46d1-a14d-53fb88079218)(content(Whitespace\" \ \"))))(Tile((id \ - bcc0d062-fadd-427a-bbbf-393d2c1453a5)(label(f))(mold((out \ + 81b8d494-510c-4196-b01f-6c387f010c18)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 73554d67-a033-432c-8893-95c4a1107285)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 72ef30ce-f13a-41ef-8c59-92dceeca24d5)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f9277e54-1eea-447a-94a2-c46212addbd5)(label(true))(mold((out \ + b3586b2f-62a1-4f12-bfdc-d0a17de5ca29)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 1d784b8e-e8e1-4428-9fbd-841578540e06)(label(\";\"))(mold((out \ + 37a4d0df-d177-4879-b313-7745b0db12e3)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f6e71659-ddb6-407c-a44c-fa8ac8b1a95f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bf419f2f-1813-4df4-8df1-06b6521e381b)(label(let = \ + 6282a0aa-eae4-42c5-967a-c20c7775edd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 13f48ecb-2540-4b37-8c5d-fc8d99c10b11)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8a12e1d1-a399-476e-9f36-f029c3da0076)(content(Whitespace\" \ + de950ab3-ab57-40fc-9db3-fb1f845de77f)(content(Whitespace\" \ \"))))(Tile((id \ - ba5af55f-56ba-4c36-b8b2-4763bd1f8403)(label(f))(mold((out \ + 6b06aaa0-4d0b-45a9-b837-e69f2ecaefec)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 231d72bf-ffa0-407e-9a80-dac8576384aa)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + dc027e14-023b-4b06-8fe1-0989fe8b8d0d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6349b04a-89c5-48bc-828b-601385c813ec)(content(Whitespace\" \ + 1394944f-9f38-46f3-a441-267789c03c1d)(content(Whitespace\" \ \"))))(Secondary((id \ - 300af8fe-da24-4862-a697-9fda2ccd15ac)(content(Whitespace\" \ - \"))))(Grout((id 2e1cb501-4636-43ae-a721-3b06106ca7f8)(shape \ + 02e818cf-9f7c-4070-9284-cc8c01def3f6)(content(Whitespace\" \ + \"))))(Grout((id 83482750-07e1-4df4-8393-f66e905c890e)(shape \ Convex)))(Tile((id \ - 7a863ad1-643f-4ace-abcc-4625e9ea7713)(label(->))(mold((out \ + 9dc1a904-41cd-4cfb-b1b9-7e76a3b03630)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 325d83b9-7bd5-4d03-b996-98219a52d07f)(shape \ + 3b42dda4-f4e9-414f-9b8b-58b43c377508)(shape \ Convex)))(Secondary((id \ - 914121e7-476e-4557-9696-e8d677b591cc)(content(Whitespace\" \ + 91f989a5-ed3b-4c42-bbe1-5e39cf2e5c55)(content(Whitespace\" \ + \"))))(Secondary((id \ + 68335fa4-5bf9-4f7f-8a24-80d2353a0f25)(content(Whitespace\" \ \"))))(Secondary((id \ - 08d4b228-9a88-4fcf-86dd-7581a05b4207)(content(Whitespace\" \ + 97d4c5e8-672c-4c91-9a8b-7ad39149caad)(content(Whitespace\" \ \"))))(Secondary((id \ - 1662f538-d638-42d6-b647-bf9ae68bb3d1)(content(Whitespace\" \ + cb69c7a0-8ed6-447e-9698-34555fd5ca4a)(content(Whitespace\" \ \")))))((Secondary((id \ - a5131d05-9af9-48d2-8776-4301cee7e196)(content(Whitespace\" \ + e89b5245-a255-4f8a-ac04-60cef6195a8c)(content(Whitespace\" \ \"))))(Tile((id \ - b1ebce05-efb6-4e07-9255-dcf4b9632bc3)(label(fun \ + 192066bb-aad5-438d-8e1f-19e5693d9095)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ee33ac9f-1e5c-499f-b988-c68f182700f8)(content(Whitespace\" \ + eca49d26-af1c-4cb0-b186-4a24ff62850a)(content(Whitespace\" \ \"))))(Tile((id \ - 7b683cf1-7c30-4818-86e1-ad0102609037)(label(b))(mold((out \ + fe826692-6323-41d7-8fcb-bfd3e3ba2892)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7aee4283-eb8d-42f5-bc32-d407f9d046a0)(content(Whitespace\" \ + 2f8d5a57-c587-4aad-bff3-5f623642dac1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6ac93f7c-968d-4bb9-8148-f892ae614c3a)(content(Whitespace\" \ + dfc09091-3ca3-459b-a6e1-8a9ea50d094f)(content(Whitespace\" \ \"))))(Tile((id \ - 04ec40c2-edc6-40e1-ac4d-f1a949691806)(label(b))(mold((out \ + c0b14af7-353e-40ab-bee5-fea9554edfdd)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3b678b8d-211a-4fa1-9344-729b448d82bb)(content(Whitespace\" \ + 375a0e05-466c-440c-84d5-69f54b0fc10a)(content(Whitespace\" \ \"))))(Tile((id \ - 32608e0e-8fe8-4d33-9b37-28e22c243df5)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + e5df557c-4611-4c11-a6a6-18c1fba7a620)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a73619dd-e865-4ce1-b758-395688fb1c65)(content(Whitespace\" \ + ae1fa1ab-2e8c-4b30-b466-7295c94c8d92)(content(Whitespace\" \ \"))))(Tile((id \ - 12a9a007-8459-4b89-83f8-b0786a30babb)(label(true))(mold((out \ + fe62cc2a-71e2-444d-816a-15bc9b2e591a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f1feb2dc-1c4e-4ccd-a46d-9c44fae706bd)(content(Whitespace\" \ + ae289cd0-de0a-4ea4-ab0b-bb2f62b36dcd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 377b7b06-2219-44a3-a15a-40eefb2e4132)(content(Whitespace\" \ + 158ec98d-65fa-4797-82c8-4eb2b53540d6)(content(Whitespace\" \ \"))))(Tile((id \ - 37969eef-8b95-4739-b8da-f41e471ccfa9)(label(f))(mold((out \ + fb972cc9-ed9d-44e6-81a7-310d977a2a77)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 596e83c1-9c00-4fdb-b68d-f9384c7b1110)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 817a3541-c039-48db-9381-8583b5ec2874)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 555b22e7-eb09-4585-977e-99fc324f2db5)(label(true))(mold((out \ + 33b0c204-0a27-4e9d-b85e-a3e5903c907a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9982abb7-950a-4217-be18-20263b12066e)(label(\";\"))(mold((out \ + 3883b692-ca0d-4995-9e95-4d7e64c841cb)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b8d5affd-d5a7-464e-a101-458fc8ccbb34)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52c76936-5dc6-4266-9f1c-50728358a6b0)(label(let = \ + 08985975-bfa1-4be5-a984-7e0d407f31cf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4fdec0d0-d08e-450c-90a4-b71785ed2596)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fa9b46a1-4671-445e-ba93-4daf9b41dccd)(content(Whitespace\" \ + cf40f0f7-f098-4077-b4cb-6d3aa1423dcc)(content(Whitespace\" \ \"))))(Tile((id \ - 13fcf121-d1c9-4733-a645-16917683156e)(label(f))(mold((out \ + 1438aa0f-c6ff-4d64-b876-6f3c52dbc0b9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3e666899-520e-4d5f-a5b9-741b23fac52f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 6b8373b2-d79f-4bd8-95d6-a3f1c098baff)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e3916692-423e-42e8-aad0-992b23ba6401)(content(Whitespace\" \ + 4ee8eac6-cb4d-4ba8-b8da-e610a644f6ee)(content(Whitespace\" \ \"))))(Secondary((id \ - 60a5d2b6-b776-416d-a27a-1f38435c44aa)(content(Whitespace\" \ - \"))))(Grout((id 97f80bde-4e54-4773-bfdd-e1e39bb02e30)(shape \ + dfedfe2b-c7c0-4653-ae18-8b1cc39cfd0e)(content(Whitespace\" \ + \"))))(Grout((id 92961956-917d-42d0-a28b-16983478b7ef)(shape \ Convex)))(Tile((id \ - bdd84f49-6015-422b-bf6b-aa51b66be74e)(label(->))(mold((out \ + 86a58780-42d7-4a2c-b6e3-3e423b97f59c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 53bd85d3-c103-4f9b-8770-a8581176c6ab)(shape \ + af78881f-4064-49a3-aa85-d5478819950e)(shape \ Convex)))(Secondary((id \ - 8aef858f-e556-4ad7-b733-17fb07da11f8)(content(Whitespace\" \ + 3d0b8787-3742-4e33-97eb-1a06fa7b81c6)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6da66252-4787-4102-93db-26180559f8fb)(content(Whitespace\" \ \"))))(Secondary((id \ - 8a80e9ca-c622-425c-9f32-5fe40508e4dc)(content(Whitespace\" \ + 07a1d627-522f-418b-b031-3464780b9e7c)(content(Whitespace\" \ \"))))(Secondary((id \ - 959b2dfc-eb6f-4f46-a02d-7fc57321f8c2)(content(Whitespace\" \ + 86bdaab5-eecb-4b18-b358-42e4a1eeee32)(content(Whitespace\" \ \")))))((Secondary((id \ - 7db316a0-00d5-41f6-a15b-121345f0a3c8)(content(Whitespace\" \ + b4c41ec1-3534-4135-ac5e-b373438ca5a5)(content(Whitespace\" \ \"))))(Tile((id \ - 430e3009-1f1e-4cba-9ad0-67bf501c5d45)(label(fun \ + aa02f5d3-8c62-438f-b7b6-4efc2ee0b701)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - cb8887aa-ab8c-4ae3-9ad8-1bfce8b545b8)(content(Whitespace\" \ + a6cb6af6-cff1-493d-ba59-49f02b8a8aeb)(content(Whitespace\" \ \"))))(Tile((id \ - be8254b4-1db5-41d9-a1d0-024dc2fe54aa)(label(b))(mold((out \ + 7b192f67-e318-474d-ac41-8113ac2a2ceb)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 282800ed-cac0-47b3-83ef-ab6843b4ce6d)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f3950b11-e5ab-42b2-96c7-b14f14a32be1)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4bd0c0a8-1496-4877-9cb1-f2b5a1ad6f8c)(shape \ + c506a2c7-177c-4f2b-83ce-60744a9c9b79)(shape \ Convex)))(Secondary((id \ - be99f047-d20f-4b32-8c3b-95ae257327d7)(content(Whitespace\" \ + 708f2954-5178-4153-a526-5112ab95ee8f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5264170c-43c7-48f4-b145-a73105ec1075)(content(Whitespace\" \ \"))))(Secondary((id \ - 731bf1cb-a888-486e-a008-52cb805d53c4)(content(Whitespace\" \ + aa62e05e-4764-4eaf-aa75-d829095fdbdb)(content(Whitespace\" \ \"))))(Secondary((id \ - d734de9f-b9f4-4799-ba57-85b7bd56763d)(content(Whitespace\" \ + 717247eb-16c8-4bdf-a85d-c09887b60158)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 76fe1a22-4d7d-4da9-b93c-723622eb8f52)(content(Whitespace\" \ + 1a3e4129-52ca-4a1a-979b-12f7dcfa5ad1)(content(Whitespace\" \ \"))))(Tile((id \ - db29a378-12ba-4014-88e2-7b1e8788bc21)(label(b))(mold((out \ + aa15d7c7-43f5-49bd-8b03-f2bb42286fac)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4e0e88ad-62f0-4f4d-8187-54829cbd9d3a)(content(Whitespace\" \ + c0ffc66d-f344-4a75-85b0-333593e743fb)(content(Whitespace\" \ \"))))(Tile((id \ - 6b0463f0-e659-45d3-8a5d-478d3eafa552)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + fc75a655-8394-45b0-a2ce-0a5b7afb803f)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0e2b6a75-5330-4cef-bdf3-c4daba073b70)(content(Whitespace\" \ + 444d3c78-9510-48c9-9d07-68bc9f9f1c99)(content(Whitespace\" \ \"))))(Tile((id \ - 690f42b0-20c0-41c2-bc14-21afc8e55342)(label(true))(mold((out \ + f29bb6fa-ca63-4fc8-9955-87c507984a02)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 07ed1101-e100-4f00-bcb1-351cdb727daf)(content(Whitespace\" \ + 5559c135-4878-403e-82e1-47ae069b2731)(content(Whitespace\" \ \")))))))))(Secondary((id \ - df7bc075-fd66-4d14-9888-c27d2372de72)(content(Whitespace\" \ + aba57a68-db7f-4536-9e3a-0248b43b64eb)(content(Whitespace\" \ \"))))(Tile((id \ - e2909eca-2597-49d2-9b20-eda5cb3bc6f1)(label(f))(mold((out \ + 36171d1a-2b3b-42ab-90a1-54c1b052e258)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d4f0cc4a-52bb-43f0-a22d-c5caa759a828)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f77b5ee1-7f3f-451c-9112-badaef1ad16f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2c0ca6fb-edaf-4087-b530-75f284dce06d)(label(true))(mold((out \ + 87f08c37-e441-471e-a0fe-006246b12c2c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b03435cc-9239-4a01-9877-8cf2ddbb304f)(label(\";\"))(mold((out \ + 3f71a4a8-f5e3-44d4-9af3-fb99b92ac81c)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b82930a2-7541-4e3d-9d48-14b74043814d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f764d69c-d357-4aaa-b10b-80245fe61511)(label(let = \ + 303fa164-06fd-459d-91d7-46073713d9f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fd075e9b-2378-4fd2-97dd-1251fe5127bf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e021a7bf-f9fd-49fb-9050-226e8b78077d)(content(Whitespace\" \ + be18dcf7-1d51-4ad9-a6c3-5050263d4074)(content(Whitespace\" \ \"))))(Tile((id \ - b4b3dc4f-bcdc-4b56-b1c8-04580c305741)(label(f))(mold((out \ + 3576fe59-2bef-4fe1-afca-d3bf11bc48c0)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ee00a4a4-6dd7-404b-8403-b041de299a00)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 339fcd7e-cfe3-4fee-86aa-7b4d38b979ed)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6ee4d23b-cbb3-4c17-9faf-8ac1a858a5e9)(content(Whitespace\" \ + 04f39485-efcc-4748-9a7f-b1c972321b35)(content(Whitespace\" \ \"))))(Secondary((id \ - 222a12ea-0006-4a36-9e2b-701e74fc101a)(content(Whitespace\" \ - \"))))(Grout((id bfea8648-7604-4e2c-a04c-b701e0bfa12a)(shape \ + 49d0f26e-a2fc-4777-af5f-da06c24a7ddc)(content(Whitespace\" \ + \"))))(Grout((id cf0e1fae-2866-4058-946a-9d4a05b565af)(shape \ Convex)))(Tile((id \ - 3406101e-5b28-4a55-a3ad-b2d2e05fa239)(label(->))(mold((out \ + d6c0b1b1-4b2a-4335-9879-efc9d8ed0c32)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 3f63a985-4fb1-4411-badb-3a71c88787fd)(shape \ + c74ae9f7-58ca-4f6c-92c0-050c5922bfe0)(shape \ Convex)))(Secondary((id \ - fd038d1b-0f85-46ac-bfc4-c8936b28fa1e)(content(Whitespace\" \ + cac7e3b8-a117-4451-8f80-b80686fb63b1)(content(Whitespace\" \ \"))))(Secondary((id \ - 061a6f1d-8a6a-437c-958c-ee53dffa6704)(content(Whitespace\" \ + 8d2c451c-63f1-43a5-8f63-4b86b505e5ee)(content(Whitespace\" \ \"))))(Secondary((id \ - e9b8e31f-ef12-4386-ab71-737ecc8bb303)(content(Whitespace\" \ + 5b2db501-7cc8-4101-9c6e-50d8287789ff)(content(Whitespace\" \ + \"))))(Secondary((id \ + 70488382-8549-4512-9572-cdfa13f25028)(content(Whitespace\" \ \")))))((Secondary((id \ - 79f92bf1-8162-4a61-a2ce-5dc11b32f5b9)(content(Whitespace\" \ + edf01e85-04e4-4df7-84f1-4b39b165e56c)(content(Whitespace\" \ \"))))(Tile((id \ - ae51cf87-8075-4f34-bc4b-c04a2509c922)(label(fun \ + 51780a54-63b4-4b50-8f95-7955f8f91f4e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 13f9a6db-c358-467c-b63d-aa80de578827)(content(Whitespace\" \ + 6eedade5-f7f0-4206-8808-626d63028527)(content(Whitespace\" \ \"))))(Tile((id \ - 53cd4541-4855-4b45-9b57-21a5a55e6536)(label(b))(mold((out \ + 44350841-7ce9-4e86-a8a7-7ec5773c092d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 419711ed-f234-4d83-a1de-052392ed4f33)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + fe716da0-f009-463b-8c96-b40774867f5a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0a1c5f44-56fb-424c-b8a8-02be82320d0a)(content(Whitespace\" \ + 93b3a899-51dd-4b27-875e-6610990da6c9)(content(Whitespace\" \ \"))))(Tile((id \ - b454ce6b-f260-450f-8fd1-5b061fb59b7a)(label(Bool))(mold((out \ + 9d1621f4-28f5-402a-8052-2d6fb623063a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b1186b20-55a7-46bb-9e3d-0a2597e8ca10)(content(Whitespace\" \ + c8f22d93-c6db-4409-b7d9-6358146fe03d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f025b713-4446-41b8-b8a1-b9deec7170ec)(content(Whitespace\" \ + 49fe41b4-28ef-4af7-abdc-e89c12452cc2)(content(Whitespace\" \ \"))))(Tile((id \ - 6b7eb9e1-a57b-42e4-b4c5-f8c8b7559e8b)(label(b))(mold((out \ + b5c9ba5b-b251-46de-a704-c650d0366340)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 59076a3b-3dac-452e-bd83-72fddcd63292)(content(Whitespace\" \ + b1aa0527-7599-413b-b7c6-3c534e0a3c64)(content(Whitespace\" \ \"))))(Tile((id \ - e5460c69-8e8c-4c6a-9764-6c2899686e42)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 27eef18a-17b6-4e87-9ce8-0636ebb3b5b7)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f549d916-2c17-452f-94cb-fcd429bd40dc)(content(Whitespace\" \ + da9fe58d-cef9-47d4-8a6d-0aef727660f3)(content(Whitespace\" \ \"))))(Tile((id \ - 54695a1c-ec86-4a5d-a698-c870608f6b81)(label(true))(mold((out \ + eee1a87e-3f40-4427-90d2-a8af27166716)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a5db26f2-f9c0-434c-838c-3e798e9aa599)(content(Whitespace\" \ + 47b6f8a4-6ddf-4e68-90bc-777c94a947ec)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bfdeadd1-583c-48ff-a3cb-6a1e25de8e27)(content(Whitespace\" \ + 4ba11c21-413c-4dfb-a2c4-056f592a7b29)(content(Whitespace\" \ \"))))(Tile((id \ - b83e4de4-dba2-4277-887d-7e7342cc2d93)(label(f))(mold((out \ + ae095a44-c1e1-4b31-b8c6-c632a6564ded)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fa11dd40-1c46-4ad0-8c2d-cf7714a80450)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + dc8eb1f8-cd87-4cac-bac3-e16e2e3a5e8c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1afd78bb-0f0c-406d-8315-5a73551c079d)(label(true))(mold((out \ + d855252f-8692-4697-914e-bd3bbf08b9b3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 53a67607-e548-47a7-8ca9-eda64d28b744)(label(\";\"))(mold((out \ + a81f21c3-014d-4bee-aad3-22111d271eb1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d3bc7420-82b1-44bf-9f96-8a489511a052)(content(Whitespace\" \ + 55806e21-f6f8-4166-a40d-abf7fca387af)(content(Whitespace\" \ \"))))(Secondary((id \ - 9fea6b9b-a8d0-40ca-9462-9666163ec246)(content(Comment \ + 15b1047a-5e4d-4bc7-9aac-664b010b219d)(content(Comment \ #ERR#))))(Secondary((id \ - 3c8ad85c-d1e6-42cd-bc0e-8dafcb0ef8d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 10450a13-ad0b-479a-8e17-72fc85252260)(label(let = \ + e2b286b8-a540-40c8-95d7-e3b7561c2be5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 607644e8-6ef9-44eb-9851-09f6a87dbc82)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8fbbccd0-369c-47b8-a053-4bf41f8a5f5c)(content(Whitespace\" \ + aff7b64f-b2c3-4f43-adac-5bec1bd40f0e)(content(Whitespace\" \ \"))))(Tile((id \ - 847efb1d-395e-4107-a3f2-f00078659bba)(label(f))(mold((out \ + cb828e27-2abf-4fd6-8390-92ae75883183)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e4ba3265-8220-49a1-b676-e1b0c7b7e91b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3b461d7c-b221-4d76-ad2d-7cfa36d73911)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8f0f3df3-dae1-4f53-a9cd-cf0fe15fa5c4)(content(Whitespace\" \ + 7da883ac-b024-402f-9a9e-930fa0f4ed0f)(content(Whitespace\" \ \"))))(Tile((id \ - 18cc88a3-8cbb-4138-ab0f-e21b7e2556b7)(label(Bool))(mold((out \ + 15bb6429-a0fc-4915-b572-cb48eea378fb)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 08f5024b-27a6-4292-b774-150a34a9e35b)(content(Whitespace\" \ + 5390701e-cac6-4266-b8f0-eb2c77fa5b95)(content(Whitespace\" \ \"))))(Tile((id \ - edd367c7-2d69-4927-a1ca-9de4cac6e1f1)(label(->))(mold((out \ + 4b941678-f474-4810-aadb-95c049f5d67b)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 12b2b5aa-dfe0-4ed7-a09b-d661786ba319)(shape \ + 8892dd8d-8aaf-460c-a0a9-bd8836ceba15)(shape \ Convex)))(Secondary((id \ - a030ef24-0415-456a-bc89-543c379922dd)(content(Whitespace\" \ + f27ba5e8-4ac2-4f5f-a562-e4716c66f8fa)(content(Whitespace\" \ \"))))(Secondary((id \ - ecf39cd5-ac32-4876-902d-0fc26899d9c6)(content(Whitespace\" \ + 9092ab11-609a-4bbb-a688-a5612ba88eea)(content(Whitespace\" \ \"))))(Secondary((id \ - 9139333d-80e3-41a6-91c8-5048f147651e)(content(Whitespace\" \ + fe04f82d-60f6-46c3-ba70-b940e7aef277)(content(Whitespace\" \ + \"))))(Secondary((id \ + a368fcd7-4a37-4743-81b7-69794b1875fe)(content(Whitespace\" \ \")))))((Secondary((id \ - 0ed479dd-00cf-48f9-9c9e-3caff02c00ad)(content(Whitespace\" \ + 3096a059-f4f3-4ed0-87df-da4568b5f30e)(content(Whitespace\" \ \"))))(Tile((id \ - 973e21b7-9ebd-436b-afc7-0480b31454f8)(label(fun \ + 0ee03a55-10ef-43bb-9a38-adfd112d0b21)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - abae88f5-5ff5-4525-8f11-90e09122b78b)(content(Whitespace\" \ + e8405540-dadc-4a6b-9090-968cab9f4ec8)(content(Whitespace\" \ \"))))(Tile((id \ - 4af1e9e8-18d1-4bdf-881d-ad039219bef1)(label(b))(mold((out \ + 53c2eaaf-6a43-4a10-98c8-15b4adecb51b)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3de8793a-102c-430d-a326-119e531dfeba)(content(Whitespace\" \ + 4d116565-adb1-44e6-88b8-08067ec749ed)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b5635065-6adb-44ff-baff-849222e1f9ee)(content(Whitespace\" \ + 07491eae-5f14-454c-a01f-e92b2d43476e)(content(Whitespace\" \ \"))))(Tile((id \ - c57cccfe-f3ea-4ff8-b0d0-5557cb6ecc9f)(label(b))(mold((out \ + 14768e36-1522-412f-ad60-84f6cb4024fe)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 33487927-233d-48c9-bfd6-0368813cb10e)(content(Whitespace\" \ + 88d52fbf-dd8f-4395-a4e2-e7589a0fde2e)(content(Whitespace\" \ \"))))(Tile((id \ - 33868a11-98b8-47ad-b7ef-cde8b26ed0b5)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 117f9f20-ed82-4fda-b808-b53505ed579a)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c777cfa2-b327-4842-b6ee-886d567092ce)(content(Whitespace\" \ + 7f93c156-6ac6-43a5-a74b-136abafcd5a4)(content(Whitespace\" \ \"))))(Tile((id \ - da697965-271a-468f-a241-d2d182c69bba)(label(true))(mold((out \ + c5ee6d7f-f44f-446c-8b96-3e8ac217de4d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7f5f7a01-d759-4f6a-8658-6ef3e240647b)(content(Whitespace\" \ + 8ee9ccbb-e25c-4088-bf47-cf7cb4927fc0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e45018a7-3a31-4a26-bab5-3dea3da77d2d)(content(Whitespace\" \ + b42da58f-e0d7-4125-8893-8462f1364c24)(content(Whitespace\" \ \"))))(Tile((id \ - 9b183ee0-efce-4c3f-9b41-e6395eb534e6)(label(f))(mold((out \ + c7afce13-1a50-4cc1-920f-e2388f12e3db)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 91fabbec-4dcb-478d-91a1-617f3c0fec09)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + fe04ff53-5035-4348-8e19-6bbd201a94ce)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8ead3805-23d3-4ff4-a827-fcb998b0b815)(label(true))(mold((out \ + 07110fd4-3a2f-4526-b81e-b455e9a6c219)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d1051422-7f8c-478e-8cea-291b10007dc3)(label(\";\"))(mold((out \ + d4d0a0b9-e058-4125-8e84-d7468da7fd54)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cc586bd6-8b7f-40eb-b338-af3e2832626e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 002eafbf-5cc8-4b0d-ad74-54a1bd7bed62)(label(let = \ + 3cc036b7-e238-4e67-a979-e3abbb186e28)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6e183e3b-74e1-4695-82bd-ef5adef388da)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 10def638-b735-41b9-a4b4-44958a75431c)(content(Whitespace\" \ + 9fc8778e-5301-4b64-a49e-19f116aa5b0c)(content(Whitespace\" \ \"))))(Tile((id \ - 34227ecb-5f39-40a3-b527-77e3060fc15f)(label(f))(mold((out \ + ea332fc6-7449-4924-8870-3be08c4e52d6)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2e4fe4fb-fe0b-499f-95dd-4c18f2c86746)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c9ef1dd9-0790-475f-9410-df6f14bb77e8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cfb7cf79-3941-4e7d-b713-0652acb4798d)(content(Whitespace\" \ + d7af9817-0186-445e-b6ee-a891ddaec1bb)(content(Whitespace\" \ \"))))(Tile((id \ - adedeb3d-6221-44c5-8f8a-96953097d926)(label(Bool))(mold((out \ + 0a7c72ef-f826-4520-8b64-ca08abb5c238)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 60eabbf0-6e8f-40b1-9756-c74fb9dfd772)(content(Whitespace\" \ + ce9b598e-f5bd-4877-a113-63231400684c)(content(Whitespace\" \ \"))))(Tile((id \ - 2d940b34-55d1-43d2-9651-6229281f850d)(label(->))(mold((out \ + 997038e1-7918-45fd-b0da-e2335334bf39)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - ccbe068b-76b5-4c11-a5de-02bf5c12511c)(shape \ + baf88c08-cf17-4bc7-8ad9-3af846a6acb5)(shape \ Convex)))(Secondary((id \ - 309ba515-2819-477c-9d4a-63a3820fff4d)(content(Whitespace\" \ + 7af26442-ed9a-480d-9c23-cb9dc3dc07b4)(content(Whitespace\" \ \"))))(Secondary((id \ - 7d0ca20b-3b04-4dec-9e51-f68ecf607766)(content(Whitespace\" \ + a3efb0fd-6fe5-4e4b-bce6-e4c35d4de49a)(content(Whitespace\" \ \"))))(Secondary((id \ - fa6b22ec-4842-44c5-86cc-053bb5676bd7)(content(Whitespace\" \ + 37506495-f207-4790-8302-e6653b1a8f34)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8af1a52e-256b-49f8-87d3-4e8ea414a998)(content(Whitespace\" \ \")))))((Secondary((id \ - bc092c89-6f2b-4334-9d03-33fcbf3bcf92)(content(Whitespace\" \ + 6d3f0189-eb41-42ef-9048-8c6494d6aed2)(content(Whitespace\" \ \"))))(Tile((id \ - f240ac06-da74-44da-b83d-384293baab04)(label(fun \ + 5408e15b-fa72-449c-a7df-782530d70685)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b510947f-7fe8-436a-9896-e92cfc6e95a8)(content(Whitespace\" \ + 4fa73419-93a6-493a-98ba-6e7532066467)(content(Whitespace\" \ \"))))(Tile((id \ - 79747594-21f5-4d9c-837f-2db67ce70c0e)(label(b))(mold((out \ + 8aa20bf3-e66b-4496-9c03-b714ae6bee6a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e534f388-e8b4-43ca-bfc2-9d21ece36b2f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 42a20ea0-2270-423c-b399-f1aab1921b14)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 356dadee-c7d8-4161-a582-4908e0f40864)(shape \ + 6ff47399-1766-415a-a8b6-f62032588af4)(shape \ Convex)))(Secondary((id \ - 030f1466-5e09-461f-915b-7d8409966d8a)(content(Whitespace\" \ + cb6aaaf7-768f-4226-a314-b116486c8501)(content(Whitespace\" \ \"))))(Secondary((id \ - 8a5cbd13-b805-460c-8b27-f403a65f9c49)(content(Whitespace\" \ + 6a787b5a-d39b-4579-9332-05ab2dc48134)(content(Whitespace\" \ \"))))(Secondary((id \ - a7060bf6-c262-43c3-b510-c0d7155c9a77)(content(Whitespace\" \ + c65a5173-7735-4440-857f-d51a90bea271)(content(Whitespace\" \ + \"))))(Secondary((id \ + 75108fa4-6ffb-4d43-9b57-406235b5b83f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 589cfde4-d192-4a10-8d64-2b696c08e274)(content(Whitespace\" \ + cb720542-197b-461e-a5ee-46e7e4deeee4)(content(Whitespace\" \ \"))))(Tile((id \ - 33459de8-1b3b-4b90-9188-34565416cdd3)(label(b))(mold((out \ + 577e7880-2413-4a2f-ada4-9126ed7e0a15)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cf03ebe5-2c1a-4cda-b22d-8aae648ec611)(content(Whitespace\" \ + 1e875e5f-9161-4cb1-b5af-0f6587ad9a5c)(content(Whitespace\" \ \"))))(Tile((id \ - 24f7b13f-5702-4682-9271-d55c54c4c1f5)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 86dacbfa-6493-4286-bb07-35c46a2fa2a3)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bd2dedb1-8524-4186-b94f-27880af5efb8)(content(Whitespace\" \ + 9abb6439-2736-4ce4-a6b6-749666784819)(content(Whitespace\" \ \"))))(Tile((id \ - 65e6daa9-88ec-4bc0-85e6-720617dfd875)(label(true))(mold((out \ + 8655cf90-51ac-43c9-ada4-cff8f97ead68)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e9e62ff5-7066-41df-aa7f-ac0045157f1d)(content(Whitespace\" \ + 282d1bb8-ea70-4042-a04f-107235a4885d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f4e2682f-8ecc-4221-a1de-9ad09065cc20)(content(Whitespace\" \ + 53842990-0694-496f-91b1-b570d6adfb27)(content(Whitespace\" \ \"))))(Tile((id \ - d8a5286d-e3c6-4032-8fda-676d2c62b47c)(label(f))(mold((out \ + 183447e3-4b15-41ea-a7dd-b7bc86954e47)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1feb8b74-da74-437c-a190-1b721dccc0d5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5d40784b-8087-4ee7-94d4-c8815877c21a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b029c2d3-b880-44da-846f-783ef7114058)(label(true))(mold((out \ + 1cb699db-1917-42fd-983c-f9bf7447a84f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 58031230-cd07-4bbc-bbe0-8831a15d1739)(label(\";\"))(mold((out \ + 07c7e0f7-6179-4deb-a221-4528c988a1ed)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ef306d3d-51e8-45c5-a2e9-06fb5c51c094)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ce8b6223-a04a-4fc8-bafe-929344732e75)(label(let = \ + 6e753517-5f81-4bba-b4c7-2c509758d84f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cd2fd3f1-14c2-460e-b2e1-f6ca6ea5a4da)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 540caf79-e72e-4ee6-aa19-5d937511cefd)(content(Whitespace\" \ + ead08dee-c899-4c4c-8e29-e67e21f275be)(content(Whitespace\" \ \"))))(Tile((id \ - cee423a7-829a-462b-9e9c-6358aa538d77)(label(f))(mold((out \ + 7b27357f-379e-4ed1-a6dd-3e8df595887f)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5f386074-6bd9-4dad-ad40-d1c0520a00ae)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + d14e2b06-cb14-44a6-9490-049e834cd139)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - de59295a-8148-40fc-ad40-ba710271d679)(content(Whitespace\" \ + df28aa72-1e7b-4b30-89ba-b5e108befafe)(content(Whitespace\" \ \"))))(Tile((id \ - d639b433-4528-4dab-8cae-32118b2788c9)(label(Bool))(mold((out \ + 749ff386-870a-413e-bd80-517177d9e2da)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - abc9163e-b23b-4a34-bf14-356bf63dd72c)(content(Whitespace\" \ + 0ddd711a-d270-49b4-a894-21a6c7179ed1)(content(Whitespace\" \ \"))))(Tile((id \ - 23b041df-c458-40d5-9693-d3069569941e)(label(->))(mold((out \ + 1e5d478b-aced-4a6c-8a20-c0264fd86a63)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 96a1c24e-5803-4601-b4c3-1c5dacd7adf4)(shape \ + a8fef003-fe1c-4359-9648-8b1e8078e8ab)(shape \ Convex)))(Secondary((id \ - e07b7063-17c4-40f7-85b9-613e58020174)(content(Whitespace\" \ + 4e5add81-10ae-47dd-81e1-378863dbf6cb)(content(Whitespace\" \ + \"))))(Secondary((id \ + 25bec1ce-c291-41de-8138-24c5571192a8)(content(Whitespace\" \ \"))))(Secondary((id \ - d7ec1800-e79e-416d-b565-2ba6f602e882)(content(Whitespace\" \ + 8901204d-5e88-4743-b328-fd6d02bb631a)(content(Whitespace\" \ \"))))(Secondary((id \ - 88e1b34a-9dc5-49a8-aea3-6ccf72a76c14)(content(Whitespace\" \ + 7496f078-dda7-423b-a0e0-c11464c48065)(content(Whitespace\" \ \")))))((Secondary((id \ - 03e17ec5-2a7e-4ba7-beaf-06ce0a8c8bf7)(content(Whitespace\" \ + b6d30c79-7828-4bb2-8dcb-83c4186ef4c2)(content(Whitespace\" \ \"))))(Tile((id \ - 52731693-ca1a-44f8-bb49-c956d5eea584)(label(fun \ + a6b326d3-8c80-4ef7-9311-93dbc7ea5030)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e984ac11-b7db-46bc-a73c-e1bfee8ee762)(content(Whitespace\" \ + e9cc3ead-61a7-4702-b488-484711c1cf61)(content(Whitespace\" \ \"))))(Tile((id \ - b1320a35-0415-4b66-8741-5f9faabdafa4)(label(b))(mold((out \ + 5368e2f1-bb85-4e0b-b979-ec4dc24b07bf)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f4b15672-aa8f-4001-b506-3b0d632e7887)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c9908b3e-ab5d-4f95-b98a-6887a6830fee)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 78a0d7bc-a7da-4f3a-a46d-2f1ab36651a0)(content(Whitespace\" \ + a65b3116-86ef-4f71-b6ae-b3a3e0edbcad)(content(Whitespace\" \ \"))))(Tile((id \ - 9c67e498-55aa-4221-94cb-12b4b17cb677)(label(Bool))(mold((out \ + fb016d50-6fb5-4ebe-898f-741ed4f6a501)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4cd8a778-6d6e-496d-8cdc-a91177ec34cc)(content(Whitespace\" \ + 62ed6924-d011-4c35-b9dc-5d302e45a9a0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1ed08aee-b8c3-46ab-86ef-20c19c1070fd)(content(Whitespace\" \ + 8655939a-cdcc-444a-9e5b-58a38312380b)(content(Whitespace\" \ \"))))(Tile((id \ - 9e461602-eb6f-4837-ba1f-f1c1aae17d5b)(label(b))(mold((out \ + 6241f498-000e-4e9d-8eb0-19e5852e3daa)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e51c2a8d-d47a-4d7b-ba9f-9ce6b11ff755)(content(Whitespace\" \ + 8fd7adde-b656-443f-9f04-2e787140e620)(content(Whitespace\" \ \"))))(Tile((id \ - a0a5f279-8b84-4a83-b12a-5398d19d8196)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 7f4df1ad-a870-476f-864f-919be18409d5)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f1aae1ab-9373-4309-b756-28aa629b5989)(content(Whitespace\" \ + c195a743-f704-485e-bd35-3190c7694021)(content(Whitespace\" \ \"))))(Tile((id \ - 33484890-2dfe-4f33-a4bc-cabc060f846a)(label(true))(mold((out \ + 1f2eaed1-718a-40c1-96ce-2c31348d2ece)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b932b818-c84b-4ca4-8612-ff0cb53b26ee)(content(Whitespace\" \ + d4c262b6-7c1d-41b7-b7ae-9129f2a0b480)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aa3d6c49-42b2-41cf-b8ac-083b693ca537)(content(Whitespace\" \ + 2e9b4c20-7c72-4d43-9589-605a8dd447d6)(content(Whitespace\" \ \"))))(Tile((id \ - 230c52c7-6470-4756-ae9f-4b9d35485b53)(label(f))(mold((out \ + 1c0ecd06-bf0f-458c-94cc-068248093c83)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 807d3924-d03b-445a-b24b-7295b4db0436)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + e3aa329c-f6bb-4f9d-acf3-c793ce2c9706)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e8b3278f-6914-46b9-8dca-3dfd5762a5a5)(label(true))(mold((out \ + fc28aa29-9ae6-4484-b792-3ae1266f26e7)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a16437a1-ef9f-4168-a489-5024543cf24e)(label(\";\"))(mold((out \ + ea9f9cf7-86c0-4595-aab5-caaa8bc17fe9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7f71fd7c-ad20-4f09-a306-2153a6870280)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a5a5c919-1120-49b6-8072-0a6f60656704)(label(let = \ + f1653f68-0798-4ffc-b840-574d203b692f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c50c2d45-9780-4232-8dbf-14f335bd2f61)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 139f8553-a9fa-4ecd-b51c-5f19d4bdc376)(content(Whitespace\" \ + 32fceaf3-6778-43fa-bc28-f7a27f23505c)(content(Whitespace\" \ \"))))(Tile((id \ - eb8399c9-8e9b-4f50-8673-15d764bc7429)(label(f))(mold((out \ + 8579a942-bfde-481d-9079-416b47bb33b8)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5786939b-f2d2-4c23-81d9-8851344edd85)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 808ed137-190d-4cac-af68-fdc1addff0db)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f780a436-b288-4066-ad25-25539b6a4aad)(content(Whitespace\" \ + 80a1f4cc-8d76-4f92-97de-e0a3e580075c)(content(Whitespace\" \ \"))))(Tile((id \ - 0e575c01-2cda-486f-a77a-bb3ca218c75a)(label(Bool))(mold((out \ + fc9db7be-38c8-40d0-9e34-c119c62a6cf8)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2635219c-ea70-4c49-b775-392873cb7458)(content(Whitespace\" \ + 0911ef58-83c2-4fb3-a0bf-e014a6f90518)(content(Whitespace\" \ \"))))(Tile((id \ - 49004b33-f151-4e09-8d1f-c8fb71fb8e74)(label(->))(mold((out \ + 85d9004e-d1f1-4a82-9a97-542bae897256)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1771e8b3-6fd3-4ee1-88fa-eda3484af174)(content(Whitespace\" \ + e4947b8d-a648-45bc-908c-8ecd554c347e)(content(Whitespace\" \ \"))))(Tile((id \ - d6a736ba-1150-4d21-88d0-08ce100d2e9a)(label(Bool))(mold((out \ + 06957c9d-9544-4b0f-a8bd-eb8de824cc4b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3dc11eb9-1c13-4155-88f9-7e404000b193)(content(Whitespace\" \ + 88d2133d-65ca-48dd-a34b-c2e4c2419c8b)(content(Whitespace\" \ \")))))((Secondary((id \ - db87b2bd-43e1-44b3-8982-01e87cce4132)(content(Whitespace\" \ + c0148ed3-43e9-4229-b070-262ff31c9325)(content(Whitespace\" \ \"))))(Tile((id \ - 8be2a7db-bbe3-4d84-afd6-bd4870c8fbac)(label(fun \ + 062649a4-d793-4701-a715-8d18f88b0011)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c7f3772f-596e-4e5f-a152-736896e548cb)(content(Whitespace\" \ + 893bd5a2-c636-4940-80bd-9f3a96566c71)(content(Whitespace\" \ \"))))(Tile((id \ - 8be53eff-63b1-4c09-9265-d4e7b070ca60)(label(b))(mold((out \ + b0a16173-d490-4ae3-9ff5-fd4bae050f87)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 24418b5b-65c1-4a5d-b21b-10a3ede829ea)(content(Whitespace\" \ + 56326c7a-4315-4a55-8c3e-ab562ada3b3a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e5c60fa6-987d-4192-ac64-819873e0e19e)(content(Whitespace\" \ + 73c8ed36-8d00-4379-85f2-a3f636079e46)(content(Whitespace\" \ \"))))(Tile((id \ - 004ff029-4290-4c1a-a043-972e79144369)(label(b))(mold((out \ + 1a75a52e-876e-4b88-a727-2d730dd79cfb)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0d8de894-511e-486a-9e68-1348ae2276d0)(content(Whitespace\" \ + 16e191a8-53c6-4f75-b276-789d19f6a358)(content(Whitespace\" \ \"))))(Tile((id \ - a8b7f3fa-e086-48f0-90c2-fd03eebc1626)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + c1c34c01-a4c7-414e-95bb-7aa96155c336)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a8335f03-9b62-408c-8b67-1586b1808b0b)(content(Whitespace\" \ + 184c6ea6-7f7e-4aa6-b6dc-243443cb1697)(content(Whitespace\" \ \"))))(Tile((id \ - 843ff32c-c9f3-47ba-9397-134ca2634b5a)(label(true))(mold((out \ + 586d5d90-9a02-4714-9ae0-69c89a77cfea)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 40d5ca79-00bc-4d8d-b1e7-f51ad765aac5)(content(Whitespace\" \ + cfc091f3-f70c-48c5-b938-bb0680fd798c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4c634236-d833-4c55-87a8-10a074115af1)(content(Whitespace\" \ + a1976d2e-00ed-4958-919e-44900a4570c2)(content(Whitespace\" \ \"))))(Tile((id \ - cb424cc9-8cf6-4bef-9657-c17e2727bf88)(label(f))(mold((out \ + b92e0d96-b298-4993-ac88-c43a3ca77d8b)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 27795b79-de23-4499-a81d-421966b8dbef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f8088b58-78f8-4c6c-b234-6f543af846f7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 483d5d5b-e649-4fda-84ca-e6ea2b3f767e)(label(true))(mold((out \ + 08aeb418-feba-4323-8063-ec811ba6b00c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b2f02c29-b676-4de1-975c-847fe2d569d5)(label(\";\"))(mold((out \ + 577cf875-4d37-449a-bbb8-f7c44d5ec69b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5bfaf192-0044-460a-bfee-5eb8b975cf4a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e9052dcd-8da9-43d4-8645-d6fcac723d17)(label(let = \ + fd0b3675-ad83-4de8-a027-82d47a271e36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fead603d-0a15-4ab7-bfd3-7d1e055ccd5f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 353a4ec8-f2ef-4f11-acd3-e00f4f517d0d)(content(Whitespace\" \ + 4d2f7c38-d842-47ff-8757-c439befee20d)(content(Whitespace\" \ \"))))(Tile((id \ - ff603e69-8b64-47fe-bf43-4214de89096e)(label(f))(mold((out \ + 92fc18ed-f0b5-4d7b-a967-0d67d6b12507)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a83f0099-fd53-41ef-a4cd-243830c35b16)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 00616c8e-76d1-43bc-ae69-6b96c0fa95de)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 58c882c8-817c-44e4-9c5b-d02967d09cff)(content(Whitespace\" \ + 56c4a13b-c2cc-471f-972f-5e4e1fde8478)(content(Whitespace\" \ \"))))(Tile((id \ - 944ae72f-edfa-4c02-bfcf-143ee540a904)(label(Bool))(mold((out \ + 4055948d-188d-4c29-b8d7-6ae34387768d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 949a8619-56d3-4784-ae02-8e5ae1d73040)(content(Whitespace\" \ + ced2efed-8785-48ea-9196-f55c0a22c813)(content(Whitespace\" \ \"))))(Tile((id \ - f8b627d7-fd7f-4486-b2d0-47a4f59d2973)(label(->))(mold((out \ + 73091ac9-3a45-4bc7-ad14-18116f8f23a5)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3ab54a3f-2d2e-4e59-9148-f64309490357)(content(Whitespace\" \ + 930ebd52-b938-4621-8a20-4ebff2d70ee1)(content(Whitespace\" \ \"))))(Tile((id \ - 696f179b-9f45-4327-a6d4-878b7d134c8b)(label(Bool))(mold((out \ + 0ab69d05-ccb7-4ee3-9bab-a323da5713a3)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a2435252-6b4b-4121-8341-78e4fbcccca3)(content(Whitespace\" \ + 8dc58755-7da5-4cd9-b3e9-ebcda8d5c182)(content(Whitespace\" \ \")))))((Secondary((id \ - a143f8ac-6c26-4f74-9145-2a74fa041f1b)(content(Whitespace\" \ + d9059153-9f06-427c-bee0-37cc240fab05)(content(Whitespace\" \ \"))))(Tile((id \ - 9ec68868-5105-46e4-9056-5aeb383d4679)(label(fun \ + ca134b4e-b4b7-4c3c-9fab-e24fc264a477)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d3048a5e-9bbf-43b7-933d-be81f39adcf4)(content(Whitespace\" \ + a63e6ef2-1c9c-412c-a3fb-6d99800fd79e)(content(Whitespace\" \ \"))))(Tile((id \ - 210a8714-8e9e-411f-9ae1-5c74bac00093)(label(b))(mold((out \ + b837de0c-57f4-43eb-94d7-1c54403ceb0c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2f5a5a94-c9ad-4824-aacf-1cac8d5361cf)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1b746e81-503f-49aa-8377-91afb8447ab9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2ed40092-401e-4d29-a9a1-1e68171cb073)(shape \ + 43b8150d-0456-44f0-bd2b-1f4e61fc122e)(shape \ Convex)))(Secondary((id \ - c63ef644-91e1-4e9d-82c3-4bc7bcde981b)(content(Whitespace\" \ + a9324d1e-f1fb-4505-9f84-0f0bc47e47b9)(content(Whitespace\" \ + \"))))(Secondary((id \ + a1db7c87-0f69-47d5-b371-a7864711139b)(content(Whitespace\" \ \"))))(Secondary((id \ - 16217a54-e0f3-4705-a22d-4a19de000394)(content(Whitespace\" \ + 1f8935b0-5ee3-4e9a-940c-6670a364c6e2)(content(Whitespace\" \ \"))))(Secondary((id \ - 36f1e72c-9c4a-4faf-aded-a88a176d4abd)(content(Whitespace\" \ + 151a15aa-7a6e-4c29-b70b-84f074e5f288)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eb763170-c55f-47a1-b63b-1e0466b17806)(content(Whitespace\" \ + 7f88a01b-8031-4a23-9fdc-c462aa979645)(content(Whitespace\" \ \"))))(Tile((id \ - d15e3c67-be75-4070-81f8-6293e96755e9)(label(b))(mold((out \ + 61eff510-da2c-404a-8fc2-1db816db79f0)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - da81336e-2f36-4358-a49c-6aa2d5c2a613)(content(Whitespace\" \ + d5853605-33dd-42fa-b7ac-a917e7e26e7d)(content(Whitespace\" \ \"))))(Tile((id \ - 79f09050-aa99-4ebd-8195-1e99f7c2c0a1)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + e7956a81-da26-44ea-8681-60dcd13b4a30)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a5af519a-a045-43e7-8dcf-e3557a425bcb)(content(Whitespace\" \ + ef3120a3-e345-4222-a368-c66e97de51d6)(content(Whitespace\" \ \"))))(Tile((id \ - 133b8fa7-2c8f-4df8-b7e7-2fc18ebcd2f9)(label(true))(mold((out \ + 056196b5-3381-4193-b928-248c62e9a631)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bd4db6cf-e8cc-4f0a-97f3-88ab28476947)(content(Whitespace\" \ + 0a824d69-1162-4e44-b44a-d126047683fe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f7f5dd63-8fe4-4ad1-86be-7fc537a46176)(content(Whitespace\" \ + 18240d48-47e7-4711-b6df-4ec3d94e2acf)(content(Whitespace\" \ \"))))(Tile((id \ - ec8aa607-2390-4953-ba7c-2f5afdfbde09)(label(f))(mold((out \ + 91ac08bb-0e40-4b8f-bac2-8fe0c597f367)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9d2ff58e-d2d0-43be-b2c0-583ccae1ae7e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + c5c67012-2c5b-44a3-82a4-149cd39b37ee)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bbc53dcb-5eb8-42f0-b216-c6000d58ce42)(label(true))(mold((out \ + 14354e42-77c3-4ae7-bfbb-f003bf32a701)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 4364fd68-68e9-4574-9894-16a3956e95ed)(label(\";\"))(mold((out \ + 66103e4f-e225-4667-a63f-82c16de4f7ee)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 36328de6-3b6f-4cfa-8b92-39e50750b06c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e587d340-f37a-4afd-ba21-2cc57548e22a)(label(let = \ + 93fda463-0ab7-409b-9594-14a1c539b2b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1ed68432-4e8f-411d-8233-d133b200cb6d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b97a2200-2074-4adb-807f-52356b9fb435)(content(Whitespace\" \ + 172b22fa-e177-4328-80e5-f7ec221b3944)(content(Whitespace\" \ \"))))(Tile((id \ - 7b53075c-8209-4948-9ce7-776096b5fd82)(label(f))(mold((out \ + c9fee522-6a29-4a23-a524-d82d0fb4329c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 805b9744-3bee-4bdf-b0f2-67b029f95bb5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 17f92c8b-077e-4e6c-9d1d-e260b90b74aa)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3058802a-3ce1-4d35-9e01-b66285ba12cc)(content(Whitespace\" \ + b074a49d-5c8e-4ec4-b36e-6d1cc4c0203d)(content(Whitespace\" \ \"))))(Tile((id \ - 847c44a3-e6b2-4dc1-b2ac-bb75d953921c)(label(Bool))(mold((out \ + b51b45b6-f44e-4964-b221-771cac279275)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - aa2bb2fb-b9a7-4f6f-979c-22d0c33256ab)(content(Whitespace\" \ + 1ddce984-706e-4e01-8b92-6f23fc776ca3)(content(Whitespace\" \ \"))))(Tile((id \ - 6bdfb38f-de93-4876-bbe8-022c27d3e62b)(label(->))(mold((out \ + dee3a1f7-25d2-4c85-9e56-2e2ac037258e)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 353c26c9-5fe4-4e23-90d2-b1a3afc4dd37)(content(Whitespace\" \ + c393f505-6e3d-4df5-82ae-b6102e4080e7)(content(Whitespace\" \ \"))))(Tile((id \ - 7bb6e07e-5595-4d66-9372-56fdef1c0817)(label(Bool))(mold((out \ + 09d6ed39-9bd0-4a88-a72b-423e5b57c08a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f89ee9c0-d510-4374-822f-9a5eb871a98e)(content(Whitespace\" \ + 5864d9d4-7c3e-43d6-a5d6-7ad5f9f1acca)(content(Whitespace\" \ \")))))((Secondary((id \ - cb72487c-b3a2-4355-973c-eda6e6629972)(content(Whitespace\" \ + 2c3b7f07-ea58-41aa-9271-0045bed697fb)(content(Whitespace\" \ \"))))(Tile((id \ - d93e1d3c-1503-4fd4-9265-469568dc7aff)(label(fun \ + 194d000b-1879-441d-abf3-1d0f9e9fd41e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8e9eaa84-1980-49df-a8eb-375256e3a927)(content(Whitespace\" \ + 569d6241-2573-4452-94e7-fe3b02a60580)(content(Whitespace\" \ \"))))(Tile((id \ - d5a87173-b27e-4664-b6f6-a5ab393bb0bf)(label(b))(mold((out \ + c8626215-cc1e-4b3f-9ab9-373683820459)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 98b23989-7819-4d0e-9568-380f4a50c624)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + dd1230bf-e193-4ee7-9773-036f1bd3a0ba)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 35022138-f989-47b3-8f71-79ee5281736a)(content(Whitespace\" \ + 8da5d4eb-e237-4f38-8552-7d1b1d7d1dbe)(content(Whitespace\" \ \"))))(Tile((id \ - e909e184-ef9c-4329-9dd4-768015c862b5)(label(Bool))(mold((out \ + 7bbbefa3-e855-4cc1-8f27-f50ce3c8adda)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - dfc0b1b2-b2e7-427b-b2e0-0c0c3a042bf1)(content(Whitespace\" \ + dd46425f-60f6-4464-8b8b-df9d4416d0a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e25285d2-3ef0-4fc1-a72c-db5ddf07f61b)(content(Whitespace\" \ + 635a9e1d-0eda-4e55-becb-377c87fce358)(content(Whitespace\" \ \"))))(Tile((id \ - 28c7908c-e262-4380-afc4-db24ef5f8d1d)(label(b))(mold((out \ + 901bb792-99ab-469a-840a-de204d95d61d)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 607388d8-3378-4b51-9a7f-8b7d9668dfe3)(content(Whitespace\" \ + c7e709fd-d98d-4744-af81-bc21fbb9dcaa)(content(Whitespace\" \ \"))))(Tile((id \ - 1e7c7068-6952-4d3a-a24d-cfe1720cd7ac)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 6cfc72b4-0b90-4bdc-a167-f9593d7e5a3f)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4a80ae70-7a60-42b1-8ee4-906ad68625c6)(content(Whitespace\" \ + 5c9c6eab-a4f4-4425-a51c-72c36d638319)(content(Whitespace\" \ \"))))(Tile((id \ - bb91703d-865e-4da7-b4ea-6ab0168bee00)(label(true))(mold((out \ + 79b07d2d-d725-4e3f-926f-9766877a9204)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 87a2590b-ef12-40b8-82cf-831ce54e7605)(content(Whitespace\" \ + b859a615-5215-44ea-8bf3-44c588bb4d73)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 519c4134-b611-4e2c-bc61-1ce1fc037a66)(content(Whitespace\" \ + a7cfe7a6-32bd-4bc4-bda0-90a56ec8e009)(content(Whitespace\" \ \"))))(Tile((id \ - 480ec920-3cbb-4a57-8c18-4bfb5f7b7585)(label(f))(mold((out \ + 0f300def-0934-4f25-8893-6cfd9d65dc56)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e9396887-20a0-467f-ba0e-b3ada37e8000)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 88565aa2-e93c-4375-867e-17c1a1eaf752)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4b4482fc-f137-4c88-83e3-14e58f1ccc63)(label(true))(mold((out \ + ef2559cd-0cc9-4101-a442-ce1bed65a503)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f7a9587c-a02d-4cdd-9a8c-4fb3c5713bbf)(label(\";\"))(mold((out \ + 22cc6540-c18a-4ae2-8e84-a093c0983f0a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e21366f9-7e34-4cc2-91fe-97b547efaf04)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d3450794-e083-4bc3-8c39-d8bc120cfc52)(label(let = \ + a1bf1132-c6f3-48ee-a4bb-a83bddd2a3e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c74feddd-e3cc-4276-9fb6-1f7dbb6aec27)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 08462db6-6625-4c95-8042-c53c96efd1fe)(content(Whitespace\" \ + 4da71f79-1773-4964-a174-32fb0cf53aab)(content(Whitespace\" \ \"))))(Tile((id \ - 2fe1d1ee-8b06-4266-8ebb-498e75a798fc)(label(f))(mold((out \ + ca09975c-0306-46ad-99a4-593a17970ce7)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 79dde745-c7e1-4a32-96ae-c123339e98f2)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 98d2756d-c70c-4bb6-9c53-6f4a673f7ed3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 22664132-0459-4655-9515-f67ce37b3e07)(content(Whitespace\" \ + 190646d8-64c8-4ed6-9668-01c0382b22e6)(content(Whitespace\" \ \"))))(Secondary((id \ - 75be864f-c108-4c59-bd87-096f8d494334)(content(Whitespace\" \ - \"))))(Grout((id 527d475f-3dd1-402a-840a-d61bb10bb04d)(shape \ + bc39e914-b4a6-4057-8b77-6a15ebf104d3)(content(Whitespace\" \ + \"))))(Grout((id a3b4df43-edce-4251-b73c-d789a475bd56)(shape \ Convex)))(Tile((id \ - b7b6082e-0469-40ec-a80f-a7a34c2aa61d)(label(->))(mold((out \ + 0a3ac9ef-5776-4333-8a0a-a1b1a5698844)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0b9c3818-d16c-412b-86af-335c4ce351b3)(content(Whitespace\" \ + a136e534-3f22-444c-9236-acea1198d8dc)(content(Whitespace\" \ \"))))(Tile((id \ - 4da3cd0e-7dd5-46d4-b9b1-d031b7ea89c6)(label(Bool))(mold((out \ + 7c168894-d013-4cd6-b421-556c3b97c8af)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b0c1483c-8d31-47bf-8f2f-f43aa5884c22)(content(Whitespace\" \ + 3e7fa74a-e3ca-4176-b59a-0fcae88d7b72)(content(Whitespace\" \ \")))))((Secondary((id \ - 3eab2831-982a-44e3-a1d8-09b8b659ac3e)(content(Whitespace\" \ + 22a1cdb3-e50b-4b22-910f-1eadd9a4f6db)(content(Whitespace\" \ \"))))(Tile((id \ - 6d4d20a4-a534-49c5-9a32-76e09040eb1a)(label(fun \ + 1bc12853-b067-4d79-a57e-00665aeefe56)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7a04c6e0-2b87-470b-8593-609afeda4b4c)(content(Whitespace\" \ + 6c876ed4-6e2c-4b35-88d8-8fbfac51a709)(content(Whitespace\" \ \"))))(Tile((id \ - b2dbb36a-f170-4317-9006-bb355cb2f29c)(label(b))(mold((out \ + b5a46baa-0996-4731-8ca7-c567d163bc0d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2d891a66-59e5-47bf-8d5d-4e81fd885dec)(content(Whitespace\" \ + cd03ae06-fd21-4a52-826c-c13cb3ef4f3b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 772da6b2-4737-40aa-9814-cf8e6a301175)(content(Whitespace\" \ + 590d0ef7-dcee-4670-9246-ee9069bffe0c)(content(Whitespace\" \ \"))))(Tile((id \ - 1b7cf3d2-9b01-4ada-b516-3cb6d7385476)(label(b))(mold((out \ + 9f7926a7-84ef-4d0c-b273-d4e6a4633ad2)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 379f6e7b-a8c3-4660-8303-9c3b0858d87d)(content(Whitespace\" \ + 0ef4e468-94e6-4efc-8f2b-6c7e1254bbff)(content(Whitespace\" \ \"))))(Tile((id \ - 873dff3d-0bea-4edb-ac34-db16ac06ef8d)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + d16beb02-ce5c-4294-8445-0e223c2aa874)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - db991128-d193-4847-8938-4f806c8665fe)(content(Whitespace\" \ + 5f45c285-651e-4eb3-a423-8c9320104100)(content(Whitespace\" \ \"))))(Tile((id \ - b9d56fe7-3f54-4534-8bcd-49e2ef006a26)(label(true))(mold((out \ + 65160969-a0f9-428d-aea1-1cc70ab6064e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6a81ab4a-7186-474b-beec-0805abdbdbf8)(content(Whitespace\" \ + 32ca5192-a923-4b35-b36a-f1db1f7ccca4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1abe8e0c-f549-4125-ba51-5981e8fdc4ec)(content(Whitespace\" \ + e2ddfc39-f908-4dfb-af59-700a4bac03f7)(content(Whitespace\" \ \"))))(Tile((id \ - d9596c34-ab5b-4f96-8d74-5858bf8e8152)(label(f))(mold((out \ + c6d7ce91-98f6-4411-b18f-9cd7577b3a5c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5a4fa3c7-7607-4774-b8a8-18986dc89193)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 7cd76351-baae-43f3-b77c-1355ef9c5830)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e3950884-d2b0-40e7-b32a-01065fd32331)(label(true))(mold((out \ + d9c1fffc-f78d-49bf-8812-65fa44a09f94)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 4f32e87f-a0e8-405f-a291-e397d64767a3)(label(\";\"))(mold((out \ + 31a54411-e9e1-487d-99c9-7bfc685ca918)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 05ddc6cc-87c6-48c0-9626-94a4efa6b933)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 694066b4-70c4-4f4a-b6fa-bb51de900106)(label(let = \ + 390c198a-3ed3-44b9-b9a6-1c10dffadb26)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9ad93f11-9575-4111-ae0b-004f42578907)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a3cb892d-00ba-4546-ad7b-7a0d789c7d51)(content(Whitespace\" \ + a8da4d73-d01b-43ec-911a-236e425a7fd4)(content(Whitespace\" \ \"))))(Tile((id \ - 97ef53ac-fd0d-4bdc-a808-e9088abeffde)(label(f))(mold((out \ + 6a30323d-c56f-4f05-8688-6f79fd1988c5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 56b028aa-38c5-4edd-99f8-79e7759b8a1c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 810fe827-7624-4d34-9c38-6d9dc461b794)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 17052864-ee4c-412e-8183-77ff429eb1b5)(content(Whitespace\" \ + d5b1817a-69d9-4b94-a639-7ec3e089138c)(content(Whitespace\" \ \"))))(Secondary((id \ - e6307017-fc25-4f2c-8c4e-af9eb418e95f)(content(Whitespace\" \ - \"))))(Grout((id d1d34494-d503-42b3-b8a2-7df3e596d360)(shape \ + 52fcb68c-968f-4297-8ce1-64382af00405)(content(Whitespace\" \ + \"))))(Grout((id 927ddb04-3048-47c4-b4d1-8a7ecefb8739)(shape \ Convex)))(Tile((id \ - c18f12e6-5888-4299-969b-72b72a2fb3be)(label(->))(mold((out \ + 59ef03b8-7b88-4873-a19b-e7e6342ce56c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 528c0513-d586-41db-804a-3b2951462da0)(content(Whitespace\" \ + f2483725-5d64-4afb-a395-5873753e1295)(content(Whitespace\" \ \"))))(Tile((id \ - bbbfda1e-9479-4d8f-8d81-5e3947c324d9)(label(Bool))(mold((out \ + 6aa0833e-0929-4a70-9ed1-455fb70fbba0)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7558a507-f539-4c5b-a3ac-8549007de485)(content(Whitespace\" \ + f2dc8246-3902-4c25-8459-26b63dcee101)(content(Whitespace\" \ \")))))((Secondary((id \ - fbc4b010-7a1a-470c-96f3-aaaad440f714)(content(Whitespace\" \ + b37cf78f-ac4d-40a0-a40b-a54d8ecf69f9)(content(Whitespace\" \ \"))))(Tile((id \ - 61ed8466-1264-49b2-aadd-6908f1a9d1f8)(label(fun \ + 16665911-0429-4454-9727-6864ef126e95)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1754e748-c92c-4a85-877b-933e6bf784ac)(content(Whitespace\" \ + e543e53c-758b-4bb5-8c75-5197a21fa16e)(content(Whitespace\" \ \"))))(Tile((id \ - f56d749f-e0d7-4a1d-b695-8920cf16663e)(label(b))(mold((out \ + fb24a277-1392-4bb5-985c-fc79da73dfca)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - aba41e3d-8cc2-4126-8254-0afa3d63c274)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f8ebaf3b-d241-47cd-a18d-687510035f00)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 75a04d71-ee98-4080-b655-0ab4fdab1634)(shape \ + 019771de-0324-4aad-9caa-e29fcbb37d02)(shape \ Convex)))(Secondary((id \ - 358eb656-bf64-4f3c-8644-3a3ae97941b0)(content(Whitespace\" \ + ab3e3578-7470-42a7-bad1-b2efa5fa386b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1066ebf7-09bd-4e46-a97a-b31521ab8a60)(content(Whitespace\" \ \"))))(Secondary((id \ - 133f9e97-f882-4ddb-883b-7ca1638b7c19)(content(Whitespace\" \ + cd7b8d44-0a70-45c0-9630-72a497ba7fa4)(content(Whitespace\" \ \"))))(Secondary((id \ - 7ac0a147-6efa-4d75-889e-ac486cf80490)(content(Whitespace\" \ + 9e752c2a-b0c0-4f9e-9797-947709a14cf9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 48cd780a-78aa-41a6-b5ef-b6a4037a943d)(content(Whitespace\" \ + 60dd1ed7-4f5f-441a-8d40-c9f53fe88db7)(content(Whitespace\" \ \"))))(Tile((id \ - 4c72163e-7684-4e80-bbc9-155f9b7267a6)(label(b))(mold((out \ + e164d8f9-5654-4648-8e55-4adc8192438b)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f998ac7b-9b23-464a-9cd9-1af495c9e983)(content(Whitespace\" \ + 7e746f80-99d3-4919-8b63-b9124ce0299b)(content(Whitespace\" \ \"))))(Tile((id \ - f0cba194-e7a6-42ba-b4ba-0b095fff8574)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 9bcd062b-7894-4660-af76-4a7fb3b97b02)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3d42b016-55e9-4e64-9db0-0f9337180909)(content(Whitespace\" \ + f610ff1d-b1a4-45c1-b551-1719533375be)(content(Whitespace\" \ \"))))(Tile((id \ - 457f8f99-9f11-4c61-9d85-8ceeb02c5973)(label(true))(mold((out \ + d3ce9ba5-de80-40af-b4ff-e0a52cad0245)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c768e601-28f5-45c3-b14c-e6f70ed32ff5)(content(Whitespace\" \ + 00958c15-6975-43a4-920b-a45067ccbded)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 808aff3e-ddc0-4f41-8471-8828d3304850)(content(Whitespace\" \ + 6ff00d9a-2f4e-4383-aeb4-de4bd7f8e548)(content(Whitespace\" \ \"))))(Tile((id \ - ca7da666-83be-4b0a-b52a-9d30e756a956)(label(f))(mold((out \ + 3322489c-8140-46af-b068-4829a167706f)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d154ac67-5709-4d9c-8fb4-b5519a268524)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ee2ee216-a7da-49b8-babb-cca07169fa1b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 104ec290-6e09-4845-9b66-1e5dd0a27643)(label(true))(mold((out \ + b75c1fe5-301d-4500-a7c1-01a18f8aaa8d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 8de6cf6b-df21-42dd-a0a4-a00867eb53c0)(label(\";\"))(mold((out \ + 421383ed-8bc3-4767-a0f8-2bb8f7506ab5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9ca66412-77c9-4ecf-96fb-b4a0c7a886cf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f3edd654-9d34-46d4-917a-a7913eecdb81)(label(let = \ + 685cc08e-bc09-4350-a22b-d69689995efa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 99c9244a-ce14-4ae9-86b3-16af45a4ca93)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 48b45298-851b-47ba-9bbd-886e14b38a6d)(content(Whitespace\" \ + d075699b-d670-4d74-ada1-285e9a793699)(content(Whitespace\" \ \"))))(Tile((id \ - 0c2cd033-a38f-49bf-8f57-8879c4a74478)(label(f))(mold((out \ + 4507f019-6453-451a-bc52-44ee36d07b62)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd92c069-4f1d-4349-bbea-0bb3b22c5edd)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 779cb84b-c760-494d-9e1b-30031a864a31)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9492e529-df90-4edd-b524-1d2fb30369a2)(content(Whitespace\" \ + 9d787d61-5bc6-498e-976d-cbf27886f7d6)(content(Whitespace\" \ \"))))(Secondary((id \ - 2e2cf058-e06d-4bf7-b828-190af11f6642)(content(Whitespace\" \ - \"))))(Grout((id 15ccf080-e782-45af-84ad-f78c9de1ea15)(shape \ + 22427037-5629-41ed-9f90-3d5a9b54f515)(content(Whitespace\" \ + \"))))(Grout((id 877952bc-3b68-4d1a-a43a-678fe96f0362)(shape \ Convex)))(Tile((id \ - f18005d4-f5ca-4b9c-83ed-283b798c5c98)(label(->))(mold((out \ + c9c61eac-eecc-4f70-b4b2-785a9b3dca10)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 39c1ad08-f549-4d38-a0b9-9ddbbc2a5f57)(content(Whitespace\" \ + 45e7afd4-e6e7-4fd2-a77e-cd5b482f8bcc)(content(Whitespace\" \ \"))))(Tile((id \ - 35096049-b682-48bf-9450-9fb44612578a)(label(Bool))(mold((out \ + b5fd5728-c20a-41f6-9ff9-4088cab44241)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e2220176-cec9-4e88-bcc0-acd6bad55f9c)(content(Whitespace\" \ + 29166bed-8857-4aaa-89d5-11eba942a4cf)(content(Whitespace\" \ \")))))((Secondary((id \ - 1fdf07c6-0e73-4189-9cce-afc15dd53309)(content(Whitespace\" \ + c4590d48-e5eb-4f26-9d88-5cadbf265b4e)(content(Whitespace\" \ \"))))(Tile((id \ - 55c8a7f9-eac9-4edb-bf31-adf6688b9c49)(label(fun \ + 5a566b4c-3e87-435e-86fe-3e61cd45f2b3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a358e631-40da-40ff-920e-82620cf0e895)(content(Whitespace\" \ + ee1dd963-be8c-4f45-b413-57607b48e356)(content(Whitespace\" \ \"))))(Tile((id \ - 18328c4a-5078-475d-bb8c-d4e90a1b0497)(label(b))(mold((out \ + 7abce92f-20a0-4187-ac4d-47b544fb6bfb)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7ce5810b-541f-460d-9476-252c7e65ff28)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 8279c6d8-4fc2-41e0-83ca-bc0162b88096)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 93b31a11-1151-4f2b-8e4e-0a6b37d7d740)(content(Whitespace\" \ + c55e3fa4-c7b7-4dd9-83ae-458938772492)(content(Whitespace\" \ \"))))(Tile((id \ - 48f0b576-c989-4659-bb0b-4273c9b9d310)(label(Bool))(mold((out \ + d2062fc1-7181-4ee8-8911-6c9a9ce0518e)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e067f2d6-080e-4645-9b29-844db6dee9a8)(content(Whitespace\" \ + 923a688c-2f79-4405-99fa-2fe618096f9b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c9253d66-4faa-474e-a6af-b66d3424b61f)(content(Whitespace\" \ + e73e8c00-9fc2-4df4-bb4c-97d1ae7338ee)(content(Whitespace\" \ \"))))(Tile((id \ - a72a1cfc-45b0-43ab-9836-b088e976abe9)(label(b))(mold((out \ + 59b770cc-5454-4229-8df9-9dfe5bc98259)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7157f70b-705b-49f8-9d25-ae2f34ec0334)(content(Whitespace\" \ + 2ee920ab-4567-4475-96c2-52792eb8a9f3)(content(Whitespace\" \ \"))))(Tile((id \ - 42e8023c-f381-489f-88b7-706cb8eb8f4a)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 50067ad7-5c1d-487f-871a-5f74a5c869d9)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 638378c9-b559-46ec-b39a-1d3583d613ff)(content(Whitespace\" \ + b6a55e9d-ad0a-48d7-a9a6-166e8e2ff849)(content(Whitespace\" \ \"))))(Tile((id \ - c8c3c6ca-c1a6-4cbd-98fc-88970d20e004)(label(true))(mold((out \ + e479fc9b-6995-46a4-93e2-e44619461a7e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f5e324ec-914b-44ff-9be2-84edcbbe4e83)(content(Whitespace\" \ + 958e3475-519d-4e2e-a585-abe653052b25)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eb3d2f44-a836-4d7a-9a09-36b6fbbcc3c9)(content(Whitespace\" \ + 143fbd99-5be1-4fbc-928f-7c0882c99267)(content(Whitespace\" \ \"))))(Tile((id \ - d22c1b02-a31c-4df4-a4c2-054a58c409b9)(label(f))(mold((out \ + 699c6e02-b53f-4a64-b517-bc29b5901c4b)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 71ca34e9-9611-4e2a-821f-ab7b4c75c2fc)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + eb6709fd-8150-494c-880e-d8c5cc0c5c20)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6eab7e2a-5b54-4189-897a-d703a254dd37)(label(true))(mold((out \ + 690e2a82-583c-462e-bf3b-b523642720b1)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c74ac4bf-c8e1-4cb0-aecd-951a46b6f2ed)(label(\";\"))(mold((out \ + 5e725c42-af60-4c41-99d6-e67c9cb91c7f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1e4cb0f7-0b78-4ce6-ad15-b3fe169e1eee)(content(Whitespace\" \ + 5d389b61-02fe-46e7-89c2-02d7c0f3a471)(content(Whitespace\" \ \"))))(Secondary((id \ - 24f901a9-f6da-4a53-a22f-5f05c0e30da9)(content(Comment \ + b62b0e9b-1705-4797-a023-67146999c501)(content(Comment \ #ERR#))))(Secondary((id \ - 93a274cd-cbc9-49fd-ae6d-3f87e7f7015c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8106b070-02e2-447a-8409-2156ceb7128f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9edc746b-d54c-4cf0-9576-68bf4e5ca2e0)(label(let = \ + a0ee9619-2bc4-487c-920c-f65faa1ab8fa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8b986f1f-ae4a-492b-aa54-a3dd6f7e9bc4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b7a0abbe-4185-482d-b221-bd2d2dd9f520)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b1972565-5233-4b9f-91c9-a2fae3c6a59e)(content(Whitespace\" \ + 2d34297b-076f-4482-8901-5a45610b8b89)(content(Whitespace\" \ \"))))(Tile((id \ - f87ffd56-048d-404e-aa36-d0de2fd4e5cc)(label(f))(mold((out \ + 3f2261b6-8469-4f33-9c64-7267477e9377)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b438fd18-ba07-497f-b4f3-777060017d7f)(content(Whitespace\" \ + 1f1bba37-54d0-4040-adad-4f6fd6f11377)(content(Whitespace\" \ \")))))((Secondary((id \ - f5cff6cf-3e3e-4bf3-b5d4-78928ec0b317)(content(Whitespace\" \ + e09327b0-af4f-492b-810e-de84db45dee4)(content(Whitespace\" \ \"))))(Tile((id \ - cbbd8d0c-e584-4c09-b213-894971bc1faf)(label(fun \ + c597df8d-e197-4728-87c7-40684b5b74f4)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1127e605-9044-46c9-bb28-f6852d7947d7)(content(Whitespace\" \ + 710333d3-1e35-417c-9ca5-a52a3da36762)(content(Whitespace\" \ \"))))(Tile((id \ - 12846edd-8ef2-486f-a3dd-465462fe4a6c)(label(b))(mold((out \ + b2c17586-7624-4aed-bd53-a1191ca1a4c3)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f6613404-b691-4a7b-b752-bb166bbdcdb0)(content(Whitespace\" \ + 501e4ba4-2991-4598-8c22-0d34ece06b76)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 00003fe7-fc85-4b35-9f62-18293b2cbda0)(content(Whitespace\" \ + 866a7268-e028-4e77-9fb9-0590c3c74bb0)(content(Whitespace\" \ \"))))(Tile((id \ - b4d0244e-e948-4235-892d-ac5bf023ce66)(label(b))(mold((out \ + 60c156c4-310c-4a4e-9ed6-27c9f73587f2)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a80b2c39-eb3c-48a0-a2e3-17923969fe44)(content(Whitespace\" \ + 07a7a0cd-e513-46c3-bc25-4d274e77cbb9)(content(Whitespace\" \ \"))))(Tile((id \ - bddcafce-7849-45b1-af50-889c78a390f0)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + ea88b462-92ce-4299-8c49-3844c75fa2b1)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aa1221e7-143d-4d1c-b409-a06055fd5761)(content(Whitespace\" \ + ef42820f-bdb9-4843-9c96-654ae895b710)(content(Whitespace\" \ \"))))(Tile((id \ - 5ba03980-b852-4885-a04e-cfa57275e8d9)(label(true))(mold((out \ + 5f742fda-1143-4194-8ee5-e58f87776f6a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f8bc12af-f910-4824-b77e-366be5909df2)(content(Whitespace\" \ + 53300648-71ae-46d1-939c-5f194c16136c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fb7af25f-7598-4f40-802e-a8f1d57365c4)(content(Whitespace\" \ + 29ba6025-7d3d-413f-a3f7-fddc822000a8)(content(Whitespace\" \ \"))))(Tile((id \ - 820cd996-1610-4f5e-a266-540960f4c4dc)(label(f))(mold((out \ + 99535c4d-01d8-494e-811d-57506853f9c1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1333bb7c-855b-4a5d-bcd5-827171f09e6e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 50be4508-9340-4001-b1f5-3d62273be001)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1afee2ad-9ad4-4767-822d-d87e99720936)(label(true))(mold((out \ + 4e66157d-41a7-47a4-9456-cff6ea343870)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e967f122-900e-4e89-8a01-57ff820ee1b8)(content(Whitespace\" \ + a233018b-94a7-4536-b928-f4367dc74ef4)(content(Whitespace\" \ \"))))(Tile((id \ - 232cd412-63a5-4d1c-98e6-c5bb5ffb5eee)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + e535793c-9fd3-4fda-883e-cd7fbf144510)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c3b0d2f8-eb19-4af3-af20-17633157c84e)(content(Whitespace\" \ + 4c34959b-9477-4c56-8795-cb2c6170e392)(content(Whitespace\" \ \"))))(Tile((id \ - de6ced50-9af1-424e-809e-cbf7e7e7e24b)(label(true))(mold((out \ + 11e55bea-2665-4185-a52b-66b6bffcc76a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e643707e-b4b7-4f3a-9f1c-e7936f41e676)(label(\";\"))(mold((out \ + bc57352e-ed9e-43ce-aa5c-50d007c4c432)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 883179cf-135d-4b83-8d12-d2409f8a21cf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3b2da582-d9f3-4e55-8e2e-1508daa5b3b5)(label(let = \ + adb8b86b-ec48-4f8d-bdca-3a63852ff426)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a9bbc3e9-41b4-46ae-8e9d-ef0db7669e6f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0a555ee8-3ee1-4228-bf5b-0d7db686e897)(content(Whitespace\" \ + 9c38b6ac-eeb4-42e3-b501-10ec47740541)(content(Whitespace\" \ \"))))(Tile((id \ - 14bd7839-8eee-43ad-a004-dedecf68e840)(label(f))(mold((out \ + aa998a53-3864-457e-bbc8-564153a76ed5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6d5e0294-eb7f-418a-a349-a2bbe3a42a20)(content(Whitespace\" \ + 17ccdeb4-eb08-4ccb-9563-1295c0b19794)(content(Whitespace\" \ \")))))((Secondary((id \ - 4f240250-1391-4dff-bb8a-1d3f48478741)(content(Whitespace\" \ + d6c5ceee-8035-4509-9c0b-5ca8aa7cd85f)(content(Whitespace\" \ \"))))(Tile((id \ - c8f0ad05-abb6-49bd-91cf-d0a16b72fd75)(label(fun \ + b3ba78b8-8454-4773-bec1-578a69efaeb8)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d66d5683-d914-4dc6-b7d5-a19bbc0af995)(content(Whitespace\" \ + 43f31307-0cf4-4521-933e-3a9f46a7aaaf)(content(Whitespace\" \ \"))))(Tile((id \ - 142a2136-43c7-4518-905a-4a31ef1833db)(label(b))(mold((out \ + 2f7a1964-df17-4347-972a-a11cf37e99a0)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 77c57bb0-6a06-474e-bc0d-ee283bb8c8ad)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 03132640-437b-4e76-b914-b7bd3f7f482b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - bd14c4ae-02a8-42d9-b247-2e5547436b33)(shape \ + 39c542cf-a0c2-41b8-8520-e252abe73c1a)(shape \ Convex)))(Secondary((id \ - 1b30100a-435d-447a-bf76-f4f09d78eec1)(content(Whitespace\" \ + 4ebedb81-bdb1-4f18-bb3b-da9db4b6272d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2c1c56c4-4fe2-4d83-97b2-74703b4b8c8f)(content(Whitespace\" \ \"))))(Secondary((id \ - d0e81340-778c-4ba5-81bd-7f05a8afdde2)(content(Whitespace\" \ + 4dd7a77a-3fbe-4c1b-af48-be05e98a213c)(content(Whitespace\" \ \"))))(Secondary((id \ - 44d45046-c1de-447a-a6ab-6d6b8d4a854d)(content(Whitespace\" \ + 0bc9c874-e0b4-4b3a-86ec-6c64deabdc66)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 62fa65ea-81cb-4476-88b8-a4bde7674ceb)(content(Whitespace\" \ + 0aedd0e9-b7b0-446d-8f30-89666a987d2d)(content(Whitespace\" \ \"))))(Tile((id \ - e43f4d29-9356-4316-9034-81bd15301d71)(label(b))(mold((out \ + 6820463f-2046-4c1d-9afb-6a6443a5e849)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8019195d-613e-4a8e-a0b3-a7c577861ea9)(content(Whitespace\" \ + c272c80d-518c-4e4e-bac5-162535032b95)(content(Whitespace\" \ \"))))(Tile((id \ - b75f7bf5-e751-4ab3-9d71-3937cef6fe1c)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + ab7f6b4a-782b-441d-814e-d711fd0dae3f)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f48e9313-1406-4f84-846f-03b25a473d67)(content(Whitespace\" \ + 3c39c15a-af2e-47c3-a8ca-adfb954c3f01)(content(Whitespace\" \ \"))))(Tile((id \ - bc344eca-3cf8-4f71-9b80-9cbefd835a21)(label(true))(mold((out \ + d4019d5b-0539-4d29-8be1-1028214711d5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fa5b2245-39df-4d97-b5f5-80ccd7615228)(content(Whitespace\" \ + 84b0eca1-79ae-4a66-ac51-b7e4aec3fc0e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4f2129ef-0318-4ca6-b5e0-655b969854d6)(content(Whitespace\" \ + cfe0ae35-92aa-436f-b828-43f6969ca3e4)(content(Whitespace\" \ \"))))(Tile((id \ - 4a4ed116-ca13-4cfc-b767-a231cd11b1b1)(label(f))(mold((out \ + b1534f30-51ed-4202-abac-e5fb5bf6ddb3)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5f2b05eb-a2de-41fc-b7d2-9dab487365e7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 4f0cd3f5-e4fd-41bc-9bab-4a386fc8976a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a94f2393-025d-4798-b63c-48934ba349c8)(label(true))(mold((out \ + 8e02fb7a-fa69-4abd-9372-862293acb95f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2cb9581e-59ac-43e1-8cb7-2556aad2954f)(content(Whitespace\" \ + edf21139-8986-40de-a295-9272409af698)(content(Whitespace\" \ \"))))(Tile((id \ - 1f4903a4-e48f-40a3-bd5b-974a07b9c5f4)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + dd9179e0-b0c3-41b8-b1bd-4933fe1456ab)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d8c418aa-ab2d-40a4-90c8-f26b9c337273)(content(Whitespace\" \ + 95e2f796-7ef7-4b0d-ae9d-3e5a39bb5a40)(content(Whitespace\" \ \"))))(Tile((id \ - 87d4c21c-3df7-4b91-a381-e8ba84591c1d)(label(true))(mold((out \ + 9a7172b8-b30c-4fe5-8aae-b893551a04d5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9cf3d798-b10e-45f4-a5b2-7d268897692f)(label(\";\"))(mold((out \ + 61f04a6a-56f2-476a-a4ff-da7e656fafac)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e4075d1c-28d4-4166-8291-de1d3af67fb5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6f2165dc-3f61-4e1e-8789-0330f088b39d)(label(let = \ + 66b70a48-b296-408d-8db1-a3f32ff2e048)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 57dbc75c-6a3f-48e8-8b56-f925fbb67b01)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 839c814b-e1f0-415d-a7d0-672f3253a2b7)(content(Whitespace\" \ + 2ff2e170-5ad4-46b8-814a-b8a56e0459c6)(content(Whitespace\" \ \"))))(Tile((id \ - dfc577dd-8a74-4879-adde-0aa4ae95c94d)(label(f))(mold((out \ + 1fb668d4-9b95-425f-a89d-dc5b03f31d98)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - aa3a36cf-6347-4722-a5d1-09711312efd4)(content(Whitespace\" \ + a27d99c4-4c79-4147-a702-51b129cbdd4b)(content(Whitespace\" \ \")))))((Secondary((id \ - 06ddb22b-3499-457f-91ed-05add3c22ee0)(content(Whitespace\" \ + 3c047527-e2d5-4263-847a-3aeefe07f8b7)(content(Whitespace\" \ \"))))(Tile((id \ - 29786d68-5467-47af-b47d-0e740f4c9a16)(label(fun \ + 003af475-fd97-44d9-ba6e-f2403c31d6e9)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f37e9a6e-4bb1-4e67-8d50-6fb2a14a8bf4)(content(Whitespace\" \ + 2a95e875-e5ec-4f51-812a-396bd106411c)(content(Whitespace\" \ \"))))(Tile((id \ - f3ed678e-f223-4cff-9b59-8b8a7a6b9cd3)(label(b))(mold((out \ + ac2495ef-d2cc-49b6-a506-0573259e4cdf)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f57a1cef-e80b-40c3-8d30-c57c67d720d0)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f9b48f8b-f070-4a71-acec-704feb9826e4)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dcdca7df-b2ef-4e82-aded-efcc9fae3b6a)(content(Whitespace\" \ + 7fb59992-990a-49c6-85c9-22b9090900e1)(content(Whitespace\" \ \"))))(Tile((id \ - 758f83e9-d647-4d54-a6d1-35deaa585f05)(label(Bool))(mold((out \ + ebeb9b99-e46d-4cd9-af35-41f60fa02047)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0f584200-d83e-4110-aa0c-9e52a2b137c9)(content(Whitespace\" \ + 02f34ab8-a93d-46ab-8b19-99446802017b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 504dec65-6792-43c3-8321-1ab79125297b)(content(Whitespace\" \ + f1f8282f-c25c-4b6b-8373-0e81484aa527)(content(Whitespace\" \ \"))))(Tile((id \ - 31c5e7ae-c7a9-44a7-ba7a-78bcf230dd5b)(label(b))(mold((out \ + 2246b457-4c9a-4002-b69e-29e231192d52)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - feb1b848-deaa-4736-99f0-4beccf61a5bb)(content(Whitespace\" \ + 97ebbb2d-a465-4a8a-82cf-71d9c84821af)(content(Whitespace\" \ \"))))(Tile((id \ - ac41ac6f-2360-481c-9e37-7bf709f793f0)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 991280b2-6e51-46aa-b6d0-de0e4e55cc0b)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 353887ee-58db-4778-a1f4-292626241948)(content(Whitespace\" \ + d6d6656e-2730-4930-88ae-0ab5f89ca96d)(content(Whitespace\" \ \"))))(Tile((id \ - cee49f88-02ea-419d-b943-5b1d94c2165d)(label(true))(mold((out \ + a3bb68ce-b3fc-4092-82e9-0f12360592b9)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6c317419-f723-4623-99f0-078dbaeae142)(content(Whitespace\" \ + d72dcd0f-e1ac-43ba-be3c-bf43c25dd337)(content(Whitespace\" \ \")))))))))(Secondary((id \ - babf0e4d-228d-4726-9a14-ae21b5edc6c0)(content(Whitespace\" \ + fbf6b243-e0a0-4511-9c2c-a0c115302643)(content(Whitespace\" \ \"))))(Tile((id \ - 2e2eea74-5c81-4fe0-b987-f952f86e01ed)(label(f))(mold((out \ + 7ef055fd-4877-4d5b-aaa0-69bafd3d0b92)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 10511c27-d376-4ed7-a46b-113b5b6a9dfd)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 8c51d0cf-855d-4257-a490-c48bb9dddd98)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 888ba43d-2657-4274-a150-e3ec98013f10)(label(true))(mold((out \ + 3502e709-d294-4543-9aae-c5854a223d01)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 50cd1923-dda8-4f7f-8f5b-d320681cc050)(content(Whitespace\" \ + 516fea90-c995-4f29-9fc7-ee5d14d1f0e8)(content(Whitespace\" \ \"))))(Tile((id \ - 5d023581-7000-44d8-902e-884f0ebadeb3)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 1e2291ac-3285-4a11-833a-33571f22732d)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ba1de608-148d-4189-b19b-7f4c638f2685)(content(Whitespace\" \ + 9465d458-0feb-435b-8b1e-ef307dad2dc6)(content(Whitespace\" \ \"))))(Tile((id \ - 277903d5-b80a-4d2c-966f-74cf8859bbe1)(label(true))(mold((out \ + 46789fa4-3d0e-44dc-b695-8f0015ea06c6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2355d66a-e991-40e3-bfb0-ba8a19f25b30)(label(\";\"))(mold((out \ + d80c192a-0baa-4041-979e-4d1be54f8189)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8cd62e8e-a681-4e84-9392-c4fadbec7779)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e919bc9e-238e-4e1e-b7a3-b36d823a844a)(label(let = \ + af6970d5-be47-4a23-ac95-c297bffc84fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b0d46039-f969-4e90-aa99-a7047be09b44)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a264266f-c818-4800-987f-8f159a22edd9)(content(Whitespace\" \ + f548c8bc-087e-4d0c-9f90-d271a5808bb4)(content(Whitespace\" \ \"))))(Tile((id \ - cb8746e0-8bb3-46c3-abd0-139e174dff49)(label(f))(mold((out \ + 812059ac-7292-45e2-ba61-4d908385bb4c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a33ede3e-f25d-4bf2-b792-3b362e7ffe53)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2d702eea-e48c-44c5-a9c2-7df7bed0b50b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 366cce6a-e675-412a-8dfa-6f649470c506)(shape \ + 8ce6a743-ed4b-4e6f-b1e4-f4f3d16b5b01)(shape \ Convex)))(Secondary((id \ - 08c165cb-2e48-4998-a60e-1cc513301278)(content(Whitespace\" \ + 77d17beb-c73b-449f-b1e2-cb46759c0e4b)(content(Whitespace\" \ + \"))))(Secondary((id \ + bc31eba1-4e70-4ef6-9d82-b938f51be1a8)(content(Whitespace\" \ \"))))(Secondary((id \ - da19d4c1-9f19-4e7c-b57e-1e1e3952eab0)(content(Whitespace\" \ + a77c929a-5483-4a19-a587-6f194a098baf)(content(Whitespace\" \ \"))))(Secondary((id \ - 4ccc0f28-a241-4e7f-b2d9-749160995066)(content(Whitespace\" \ + 7958b3fc-8cd5-46ff-9927-fe3774c1e052)(content(Whitespace\" \ \")))))((Secondary((id \ - 4c9cab9c-b008-4dfc-b736-063873ed49d6)(content(Whitespace\" \ + f5759079-0082-4691-b62d-8a9e22f59c43)(content(Whitespace\" \ \"))))(Tile((id \ - 1e8b20ae-6b08-4fe5-9f4d-984426b53013)(label(fun \ + 19d819a2-8f69-4889-849d-17d51a0f6d68)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a5497755-fe99-4b6e-bfa4-2b506ae94ed3)(content(Whitespace\" \ + 6537b350-d300-465a-bc63-d5bd5c12cbe5)(content(Whitespace\" \ \"))))(Tile((id \ - 32898186-883f-4598-bf5b-ba99c4fd7441)(label(b))(mold((out \ + 168d30ef-3526-4640-8083-4743614e390f)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 31b7f030-673a-46d2-91a5-802c5d5c0050)(content(Whitespace\" \ + e10cba2a-c657-4fe3-a172-759d3dfddd20)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e02d502c-b1f9-4ffd-b24e-048db75550fb)(content(Whitespace\" \ + 45a0d383-79bf-4337-bfcc-461ede853e35)(content(Whitespace\" \ \"))))(Tile((id \ - a01655cc-bdbe-453c-a35a-81012be7c308)(label(b))(mold((out \ + 18c479d9-2d27-4eb7-b704-558212b400df)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c1a0baed-c8a2-429d-833c-6ed12fbebbb2)(content(Whitespace\" \ + 50e87e25-d452-47b2-a20f-3fb633ce787a)(content(Whitespace\" \ \"))))(Tile((id \ - e57b24c2-2862-4bbd-a3ea-b16447fefea4)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c4a4a8f9-4449-4923-9065-f12099c43b50)(content(Whitespace\" \ + 2b728f25-94f0-4b7b-9730-86b7f4c0f3e6)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 20685cb3-165d-430a-be74-0666e5253714)(content(Whitespace\" \ \"))))(Tile((id \ - 479d118a-5d4a-48c6-bf47-03364c601277)(label(true))(mold((out \ + 6b050fdb-58e6-468e-8fc4-ab811a61e743)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3ed7c3c5-9c9b-4b8c-a6cc-e5d38f0884f7)(content(Whitespace\" \ + 233395be-27e3-4bce-a8c4-6f9df4decb83)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b8b607d6-5e91-4166-9030-e6062c5bdfde)(content(Whitespace\" \ + ee6fac43-afdc-425e-bf3d-d9aa724cf063)(content(Whitespace\" \ \"))))(Tile((id \ - 09f543ad-eaf3-4890-8f00-364e65bbeb9c)(label(f))(mold((out \ + 80e65a16-2aee-4b04-b38a-cddde9426a0c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b1f15536-570c-4dc0-9549-dcb2b230feac)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 0f1fdde2-45af-4686-a254-7011a0ec29e7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 064cc832-ce4d-4774-ba20-f8ecf0a48b37)(label(true))(mold((out \ + 658f97d3-2e66-4279-85b7-86afef69b1c0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 4c73ec7c-d01c-41f3-8a0f-11412cd6a732)(content(Whitespace\" \ + 4a0208dd-668e-4bf9-91fb-16bca37001c6)(content(Whitespace\" \ \"))))(Tile((id \ - fc65cafe-9149-4468-8ea0-f92ebe2d968a)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 54e009bb-f96b-42bc-8628-1b9e22c9756a)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5c9ee7ae-9db7-4924-93c1-1a8418513aee)(content(Whitespace\" \ + a79a2122-1939-47ca-b934-14fc0faec285)(content(Whitespace\" \ \"))))(Tile((id \ - e7cad16e-7d7b-4115-9a8c-af93f221acb9)(label(true))(mold((out \ + 54c2e19c-ef08-4d7b-a8dd-6630d2603161)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fa8e5241-13ec-4c4a-8e28-4699b23444a5)(label(\";\"))(mold((out \ + ba3520b8-68b9-4adc-87b2-cf190b51f554)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e779d1de-c381-4048-8509-32d2a4fad77d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 78024387-9521-4a53-ae68-0ede50bf3755)(label(let = \ + 1dad7f98-8460-4a45-b43a-c228dc74fc0e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1378eed9-713f-4458-9bd6-6c895cdb189a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9b5f8ce4-8a09-4d4f-aac9-3b1669efe5ee)(content(Whitespace\" \ + f08b2095-5f59-41f8-b7b3-4265e7c8099c)(content(Whitespace\" \ \"))))(Tile((id \ - 050ad0bc-cd58-4ff3-9517-1d272cfb1dc6)(label(f))(mold((out \ + 2b6a96c7-9b81-423e-bd64-ca7628398a21)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fabc0073-2285-41f6-90a3-748f83b2f6fc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + ee1b2972-1bc0-4555-9870-c36b15909609)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 60502944-c980-4eba-9d89-b341dfaa767a)(shape \ + 86b1b0dc-324a-4585-a7d5-cc0019cbacbe)(shape \ Convex)))(Secondary((id \ - e3656e85-0260-4a63-9c23-b0fe822eaaf0)(content(Whitespace\" \ + fa21ce37-7059-4de8-9a77-322688476189)(content(Whitespace\" \ + \"))))(Secondary((id \ + 407d0f76-dbbb-45b5-8bb9-a92a218f2a3d)(content(Whitespace\" \ \"))))(Secondary((id \ - a0800885-7858-470d-b5c6-f7350dc5a52b)(content(Whitespace\" \ + ec18225b-81ba-4e1a-ad40-c62e3e98e5a4)(content(Whitespace\" \ \"))))(Secondary((id \ - 22fdd3e9-c9fe-4d4a-96ed-e18661b9f453)(content(Whitespace\" \ + 9b84a72a-804c-45f4-94dc-f47183bc5774)(content(Whitespace\" \ \")))))((Secondary((id \ - a80d307d-9238-49c1-9a6d-114d8cd618b5)(content(Whitespace\" \ + 60ceba61-8fa2-4bff-bf61-41e998992f05)(content(Whitespace\" \ \"))))(Tile((id \ - 3e95229c-1e09-4428-ab3d-778449bfacd6)(label(fun \ + e558fc1f-12bc-44f6-9f99-3428adf34403)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 345d959c-c0e3-4325-856a-03b451afb788)(content(Whitespace\" \ + 591d9a53-b7c3-408e-b25a-5a7b1b2aabaa)(content(Whitespace\" \ \"))))(Tile((id \ - ad7d9601-3b12-4f28-9d0a-4edb752606e8)(label(b))(mold((out \ + 55311a83-ac8c-4f98-8daf-2e7378ed78c2)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd65c356-1ef7-4512-9ab9-eea9984c1092)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 99cd75ff-fe66-4f78-b4b2-7302b05d6b9b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - b0782794-c9d5-4083-baf1-32e183dbeff9)(shape \ + d107205e-4b1a-4f93-88b5-75f627f3b3dc)(shape \ Convex)))(Secondary((id \ - e0c1bec2-69ca-4a42-8a3b-be53a3eee8ef)(content(Whitespace\" \ + 6241cf4c-6cae-44ee-b723-42c8c4508f01)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6e606c02-5c5d-4642-8253-268342deba9d)(content(Whitespace\" \ \"))))(Secondary((id \ - 4f9a74ca-94d8-473f-8e1f-7d9e81720c6f)(content(Whitespace\" \ + 8f90ee3a-409d-4619-bfa3-fff68c6135fb)(content(Whitespace\" \ \"))))(Secondary((id \ - bcf86e8b-7f81-45ea-a4af-f991a8286ec4)(content(Whitespace\" \ + 09e29e90-6ee5-4b05-9318-1c2b7ddaaa18)(content(Whitespace\" \ \")))))))))(Secondary((id \ - da2a3eb5-e4cb-4596-ba40-b29ee4fafed7)(content(Whitespace\" \ + 49f77e7d-36ed-44b4-bd72-cedf899316d0)(content(Whitespace\" \ \"))))(Tile((id \ - befc9916-b11d-46d5-847a-875ee9a25659)(label(b))(mold((out \ + d3de0ce8-a2a6-4d4e-9248-664b74de9731)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 419fd78b-a064-4bff-85e5-7a58faec7fe1)(content(Whitespace\" \ + 39d471ed-582e-4a9a-8f91-899da355b6b2)(content(Whitespace\" \ \"))))(Tile((id \ - e93b830b-4890-490c-82c6-1fc52ab97cea)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 1a8775aa-54c4-428a-b4e3-c243b79a62ba)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a54cd696-f9b0-4928-bba6-ce8d008cf0b8)(content(Whitespace\" \ + 7e1dfad4-652b-4c6f-bf42-77f52811d497)(content(Whitespace\" \ \"))))(Tile((id \ - ee86723f-2eb0-4801-b190-3da7822b3246)(label(true))(mold((out \ + 1a1b4ec3-b7b5-4c25-89ae-194eb7ac24cb)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a93e8247-9329-4e31-ab36-bd4fb103c31d)(content(Whitespace\" \ + 21545bae-ecf0-4bf4-aa5e-238c4f4137d8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6bc7a8f1-a5e1-4c83-95ce-47ab12734e9a)(content(Whitespace\" \ + 0f8ae9d8-e1e0-478d-9bdb-337f315ac3f6)(content(Whitespace\" \ \"))))(Tile((id \ - 922d00aa-39a9-403f-9e2d-9006299c0089)(label(f))(mold((out \ + 93092ee4-700e-4026-8765-dc5d09889592)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0cbfc86c-62a2-4e35-846c-419445841b20)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 197fd06d-e3e5-4971-9e64-a78c4cbafb47)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7e1a34cf-d41e-4581-ba52-4bc25e1e3d49)(label(true))(mold((out \ + 3a577dff-ab5a-4a98-8374-7945262aeb50)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a949f8fc-26c9-434f-9b99-db5150203e1e)(content(Whitespace\" \ + f2ed0932-af69-49b1-a7b6-8d96dabc0c1b)(content(Whitespace\" \ \"))))(Tile((id \ - 6f9b120a-b758-4553-b9e2-4c0c979ed6d0)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 4db53e53-4849-4848-86b0-454849bc0513)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 74ff733f-c95f-4053-9369-e5d4bfa47efc)(content(Whitespace\" \ + 3f9923da-24fe-446d-a5e3-ced701cb58a7)(content(Whitespace\" \ \"))))(Tile((id \ - a4713350-3b6a-4c4c-8976-8773fcc47b4d)(label(true))(mold((out \ + 241ddf2e-a507-4ed1-93f9-6ded0c0b4610)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 62f78eda-a670-4b8b-a9de-d6804c10abe0)(label(\";\"))(mold((out \ + 94d4dbcc-946d-4f56-8e66-2c765d5e1486)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3c34799e-b421-4e12-91b9-8f73492669bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f1cddc20-e71c-4d62-bff2-2c79bb66d03b)(label(let = \ + 1ca68eed-f99c-47d3-8950-18b3780d23a2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1a362fe2-25f6-446a-a0bd-05cba32852fc)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9845f59d-6345-444b-b86f-dab9a738fa2e)(content(Whitespace\" \ + cc6f780e-18b6-4c1c-b6ad-8f12246c3acd)(content(Whitespace\" \ \"))))(Tile((id \ - 59cd16e1-b021-48b8-a31a-3eedff49c12f)(label(f))(mold((out \ + bd373afd-2107-4383-8c91-a9daf07ca150)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c765c652-21dc-4c5c-bc0a-9e2bf54c8d4c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 57b28608-23cb-4737-b726-081e9957f981)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 01b55507-fc6e-4f9b-b7fe-2de70d68ae85)(shape \ + 2e03d47f-61d1-4eb1-a832-782ef2780111)(shape \ Convex)))(Secondary((id \ - 60a8198b-7d3b-4ae5-852b-1b9279a22496)(content(Whitespace\" \ + c0e2cc03-f8e3-44ca-b9ff-f1e5b6de9d26)(content(Whitespace\" \ \"))))(Secondary((id \ - 63db4e70-84e8-4ad7-a912-6a10b549edb6)(content(Whitespace\" \ + fe5e963b-edec-4c04-943d-252f9cb229f0)(content(Whitespace\" \ \"))))(Secondary((id \ - 67dc3deb-0f65-4199-b01b-c4d08bc2ede9)(content(Whitespace\" \ + d1fb8529-a98b-4876-b8f8-692605a76616)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3c3aae70-ba7b-403e-97ff-edb1797f7d4a)(content(Whitespace\" \ \")))))((Secondary((id \ - c91a4785-3400-4d3b-a807-8ec7cca6fe42)(content(Whitespace\" \ + 7041413d-c8b4-4c6a-b72a-61130a12fbb0)(content(Whitespace\" \ \"))))(Tile((id \ - 4f49d514-2780-4f49-99b5-cdc6c21c42da)(label(fun \ + 685d3e96-10e0-4bcc-9e36-eccb06a4bc90)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 13abf15a-a4f0-4319-9d0b-77645ad48137)(content(Whitespace\" \ + 3e46b522-6276-43ad-9c6d-c716d5b3405f)(content(Whitespace\" \ \"))))(Tile((id \ - 2f03b79a-01f2-40cc-8619-7ae5d08848d1)(label(b))(mold((out \ + dedb85e6-97f5-410e-b7cd-620c419c868a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 587eb7c5-6cc7-4678-a196-2808537549d8)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 8f05e18d-e3e2-4344-8fd5-ee645bc39832)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 56a345e3-90b2-4bfd-9cb5-9c47541b310a)(content(Whitespace\" \ + 1d33e33e-d3a9-44dc-be8f-a1ef99a9ff90)(content(Whitespace\" \ \"))))(Tile((id \ - 5553baea-93f2-4356-8029-cdbac97a9fbb)(label(Bool))(mold((out \ + 883b9061-baec-493c-b028-db65808f4ffd)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 454bcfc8-ecab-47c0-ac70-506d96ae1ada)(content(Whitespace\" \ + 5538ec55-54a8-4653-beb4-38f29087b461)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 218987e9-922f-4609-822c-314279d863bf)(content(Whitespace\" \ + f76996e1-563f-4bb0-8722-bd1a4b31273b)(content(Whitespace\" \ \"))))(Tile((id \ - 7465bb73-9f4b-464a-9f9a-8405eb57c91b)(label(b))(mold((out \ + 5ba00249-1cca-4c45-913e-e81cd19e70e0)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 369da5af-5f2e-4f1b-a50f-1515222357ca)(content(Whitespace\" \ + de9c2cb1-3ebb-4f20-a9c3-ca73f11b4e4a)(content(Whitespace\" \ \"))))(Tile((id \ - 90512813-86e6-469b-bcac-0267834646e6)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 2cb79e7d-c79d-4dd5-84d3-64c0c946b2d5)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 758cb590-8371-4bff-991d-e69e9dc51bab)(content(Whitespace\" \ + 18a861dd-7a13-42d6-b198-fbcfca97e1fa)(content(Whitespace\" \ \"))))(Tile((id \ - 97d8cfc9-65e1-4658-957e-8527db8230f8)(label(true))(mold((out \ + f8a6bff2-9036-449f-9900-53c911d2fe1a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cf1feb8c-9f0c-4fac-8457-ccec09dd7719)(content(Whitespace\" \ + 2dc3898c-c666-4b37-ac8a-cd3db6bb4c5d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4a041d67-9016-4ca4-9dce-11ad319cca96)(content(Whitespace\" \ + 90ead382-945e-43fb-b823-a64da5509f2c)(content(Whitespace\" \ \"))))(Tile((id \ - c9680e92-4454-4a3c-9e82-23375259b15c)(label(f))(mold((out \ + ac578193-c80d-4cc0-bdf5-ea05b74fdfbc)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4bae0ba8-e49a-4e03-8514-633fe6f9fd1f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f7ddb630-6342-45a6-ad9b-c5beaaa4211a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c8aac4c9-6fcf-4edb-999e-a956693ee999)(label(true))(mold((out \ + c3131eee-81db-4311-91c1-45e82647dbbf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 549eacb0-6d86-46cf-9249-e243a9a4fdf4)(content(Whitespace\" \ + 2f03fd4c-dc2a-493a-96bb-581ce4f32f4e)(content(Whitespace\" \ \"))))(Tile((id \ - e694950f-4597-4e61-b9fd-a05c746abe4e)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 07ec0158-2f25-43a1-8ec4-4f969827eee8)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9c2868d5-7874-47b8-93d2-9c506244e763)(content(Whitespace\" \ + b12f13c9-7a15-4758-83b4-70d4d9b48cdd)(content(Whitespace\" \ \"))))(Tile((id \ - ddfbe440-e3f8-479b-81ff-3080a5c7b70f)(label(true))(mold((out \ + d5aa9c32-dc39-4ad3-845b-8d5b9895711d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 84d65640-d9d2-419c-aae8-d6b04c12bf7d)(label(\";\"))(mold((out \ + a5604d6b-9845-4b42-9882-b73f13044f59)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 902afcdb-68b6-47f4-af98-7e843ac1fa0e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0559dc24-ae2b-4e1c-9be6-3ac5e82e36a8)(label(let = \ + ef18b357-4b72-441d-bf7a-9381e68d4eb5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f7fdf1a1-8871-4cb7-92d9-e03cda823874)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 81499aa1-a36d-4fbe-9411-4d82b5501efb)(content(Whitespace\" \ + bfa6adfb-bb16-4646-a0b0-f897469793b1)(content(Whitespace\" \ \"))))(Tile((id \ - 49a4b0f8-81cf-49d4-9766-a99963214b85)(label(f))(mold((out \ + 60ad8d3d-5f54-40a9-afa1-011d28823bf0)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a66248b4-bd53-42c6-96d1-0440d70abe68)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + a964dd76-dd1b-47dc-8cb9-fb11e47a0d6d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f8502677-bd6f-44b5-a1cb-ab7912281602)(content(Whitespace\" \ + 73e6d7d9-d9de-446b-aebb-a35389332fd9)(content(Whitespace\" \ \"))))(Secondary((id \ - 0ccd9911-9e15-42f8-9efa-2e24bb3f9d9f)(content(Whitespace\" \ - \"))))(Grout((id 334adc6c-9f26-45b0-8561-5045b4d7d5fb)(shape \ + f982779c-2eff-4ab6-851b-6d07d54b181d)(content(Whitespace\" \ + \"))))(Grout((id 27a027e0-6b17-45bd-a137-07db10378138)(shape \ Convex)))(Tile((id \ - b2743f3c-ed5d-4a2b-b554-d08eedad8478)(label(->))(mold((out \ + 6c1d4e1a-4058-4aec-a653-6810e81e454d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 463a0555-bb7a-4506-9009-8854f2e89e34)(shape \ + 71b2616f-f023-4be4-9758-613382b4bfb8)(shape \ Convex)))(Secondary((id \ - c7f29ef8-b541-4037-84a5-905e00927df4)(content(Whitespace\" \ + 5013f58c-13b1-445f-8a50-f0d4a2c2d2de)(content(Whitespace\" \ \"))))(Secondary((id \ - 0b2edba7-987e-4278-8767-db5bf683bb2d)(content(Whitespace\" \ + 012beeb5-86d3-44eb-bbe1-8c01d8c94bb1)(content(Whitespace\" \ \"))))(Secondary((id \ - b10e02cc-08e1-44da-afc7-c6be0cd97ad6)(content(Whitespace\" \ + 052ff6e6-8c96-4397-bc4f-856432ec902d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 41a7b697-1488-4472-b22a-87296906fb5e)(content(Whitespace\" \ \")))))((Secondary((id \ - dda0be53-ad2b-4e53-930b-0cb7e6f7948a)(content(Whitespace\" \ + 44d390ad-175f-4667-80cd-f69e0a20b20b)(content(Whitespace\" \ \"))))(Tile((id \ - 3f616dd7-2e1c-4994-bba7-3ff2ae2d009f)(label(fun \ + 78a63590-4f04-4ecd-93de-5d3c7320d2f3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0f5af089-9bbc-49cd-9265-ee3ca2cf6ace)(content(Whitespace\" \ + 160f0b9f-d426-42b7-87f4-6644e37130d6)(content(Whitespace\" \ \"))))(Tile((id \ - cb0f9f2d-7e60-4990-ac6f-16760eb105c5)(label(b))(mold((out \ + c71c0c07-5fbd-411a-af3c-60c560395c8e)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6636c11c-4be6-4b48-8c28-aa2a07cc7295)(content(Whitespace\" \ + b1e56c81-a887-495c-8746-df89e6c82dcb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7c664c94-7dfc-4767-8ccf-a6e76913edbd)(content(Whitespace\" \ + c21f5d94-a514-4a9d-b6ee-3b839d8b1a74)(content(Whitespace\" \ \"))))(Tile((id \ - 81eb253a-5e19-4b4d-804b-f3eaae9d08aa)(label(b))(mold((out \ + f7e8d364-6c3a-4626-8011-1956477a1556)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4e458e97-f12d-4915-8bde-a822f8d14a49)(content(Whitespace\" \ + dfdf3910-42bb-43f3-8fda-48367852adee)(content(Whitespace\" \ \"))))(Tile((id \ - 333b9d71-ac78-4403-830e-fcd058dc6a56)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 4e7e7052-73f9-4351-bfa7-8016b084aa12)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - deb814fe-e232-4f27-b98d-7a2ea24c082c)(content(Whitespace\" \ + 74acf77d-2e30-4005-94d6-bd1047728d46)(content(Whitespace\" \ \"))))(Tile((id \ - 5d3b1805-c4bc-4ba8-9706-f5ea459434c7)(label(true))(mold((out \ + 9dced731-e36e-4ca9-b812-3f747d908400)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79732f22-2121-474b-9db4-46e01e01e900)(content(Whitespace\" \ + 42732025-27ab-4e03-9b3d-46fd84496c36)(content(Whitespace\" \ \")))))))))(Secondary((id \ - acc847ff-b677-4327-8def-4345e13297f4)(content(Whitespace\" \ + 7205b5c9-7220-4fa1-bcbc-199da3614b9b)(content(Whitespace\" \ \"))))(Tile((id \ - bdb4ad16-b715-49e7-9594-6630dec245b4)(label(f))(mold((out \ + 9a839fd0-76f8-4bde-b695-61356f04f901)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 00958786-584d-4a6e-b5c3-61ebb8af0fd8)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 33608e75-9522-45a6-b1fd-95676cc0214b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ca939cd1-4dd9-42ef-9ab4-a4292d3042f5)(label(true))(mold((out \ + 35f8e5e7-1e45-4180-9dac-5fdfaf5e9213)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 196a55c4-004f-4997-9a82-4c116c44f58d)(content(Whitespace\" \ + e2a2dc0d-31b1-4222-ab47-4cefb4c272b4)(content(Whitespace\" \ \"))))(Tile((id \ - 45530c89-21b9-4da6-a411-be788347ff05)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 17702a02-4ae1-4bd2-ac8b-d2b03e8bbae4)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 19ccad19-db00-4012-8cd9-090e58e34d2f)(content(Whitespace\" \ + 5df892a8-cea4-47f5-b764-fd8839e36c97)(content(Whitespace\" \ \"))))(Tile((id \ - 65269777-d11f-44d2-a3a8-2bd0703d931b)(label(true))(mold((out \ + c08308f9-c27f-4ed9-8646-ea1c313fcb06)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1f58078f-b848-4839-bebf-8aae0b139a85)(label(\";\"))(mold((out \ + efb6ac7c-feea-4484-8545-6237d8049984)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e45cc210-7d11-4115-8e0a-19aa91b5cf85)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 95711e32-58c5-494b-b912-0cd1da1944ab)(label(let = \ + 755a25f6-5f65-49aa-af37-86fac0a44830)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3a16cfc9-c4b6-40a6-9a34-d01f9d0694ec)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 05d683a4-b423-4906-b626-95272e089863)(content(Whitespace\" \ + 57208890-7d71-4306-a9b7-7545deeeba3b)(content(Whitespace\" \ \"))))(Tile((id \ - 19b1c876-def7-4ff4-a273-83a47cec3faa)(label(f))(mold((out \ + 603e866e-f5cb-4df4-b5cf-c70b9065404c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c80439ea-f422-49be-bb47-44ce041545bc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + e0768be1-7d29-4e58-9ba2-8d642149d853)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7c5999b8-ed2e-4914-90e7-883585f46fa6)(content(Whitespace\" \ + 0a0d958d-a728-47b3-817f-28dc9bf45d32)(content(Whitespace\" \ \"))))(Secondary((id \ - b66ca63f-d073-4e34-b5cb-5c6a50be38c9)(content(Whitespace\" \ - \"))))(Grout((id 92c3c219-ac9f-4f4d-af39-7a87433ee68f)(shape \ + 7f03b181-76e0-49dd-b086-a3531eb488f6)(content(Whitespace\" \ + \"))))(Grout((id cabf4d71-480a-4af4-b090-f58ebc57a971)(shape \ Convex)))(Tile((id \ - d5a45e15-9eca-41ee-bd0e-91cf154473de)(label(->))(mold((out \ + d14715fb-b049-4bd8-8d7b-f529d4bc7e0e)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9fd54931-31d4-4074-af43-f92faa65f163)(shape \ + 16926afc-66d1-4271-8871-1af513af284c)(shape \ Convex)))(Secondary((id \ - a51d6bbe-db2b-470e-a677-c5d553674981)(content(Whitespace\" \ + 4b92e4e1-7313-4bb9-a8c1-18528f14058f)(content(Whitespace\" \ \"))))(Secondary((id \ - 70408414-c362-4277-974d-5fd9979c2215)(content(Whitespace\" \ + 768855d1-319d-4aa9-8ab4-2ef59217480b)(content(Whitespace\" \ \"))))(Secondary((id \ - bd381de5-1ece-4e62-a2b9-3bcba8736c27)(content(Whitespace\" \ + 20666716-4b06-4721-902e-d9d5cb7769c5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6f7033ac-848d-4e8c-a54e-dcf1a337f904)(content(Whitespace\" \ \")))))((Secondary((id \ - 6fd64089-30ea-4435-9635-168ceefce138)(content(Whitespace\" \ + 3f7ffdf1-ad0c-4b36-a9fa-c91b374942c7)(content(Whitespace\" \ \"))))(Tile((id \ - 199a5e0e-7724-468b-b556-44a91bd42ec3)(label(fun \ + b5323b6f-bd06-4341-b0a8-684f2fc0066b)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ce3db5ad-adb4-4b1e-aadc-17e112447cfc)(content(Whitespace\" \ + cd90892a-fcf5-4fae-864a-fc2beb27d574)(content(Whitespace\" \ \"))))(Tile((id \ - 9579cd24-36b2-4cac-9bbe-c79e73be06de)(label(b))(mold((out \ + 4b63493a-3f77-4454-9ac6-f8123cc2ed13)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c47ca04c-8e09-4d04-8690-81d8362a407d)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + fc19adf0-f2ef-4f0c-8051-ec1476018bf0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 514b0fa4-cc73-4f80-958f-7a191a068d88)(shape \ + 2de04a1e-c14f-4f65-867a-c416a2219ed9)(shape \ Convex)))(Secondary((id \ - b7aa5bde-8384-49d2-aff4-ade2cd61d341)(content(Whitespace\" \ + d34cd1d1-e12c-4a88-87b0-db00c16222a3)(content(Whitespace\" \ \"))))(Secondary((id \ - f77eaa78-6d27-4e18-b77c-593396192565)(content(Whitespace\" \ + 97c5ff61-006e-404c-99d6-431bbca6a3fa)(content(Whitespace\" \ \"))))(Secondary((id \ - 314d6e20-a3cc-4b14-a048-fbd76c4134e9)(content(Whitespace\" \ + d2b92827-a875-4f61-b51c-6e198cb3308c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 355446e1-0e38-48e1-b16e-5e4f7c8a7e4a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - de1bb128-289c-45a2-858b-1b625fb2df55)(content(Whitespace\" \ + 4ea0f50d-727b-429a-b040-e436c04e118c)(content(Whitespace\" \ \"))))(Tile((id \ - 53c7c075-ff4e-40c7-83f0-9aef4ece7934)(label(b))(mold((out \ + 2e3dbfa6-2fe8-4c78-b769-6345e845bb36)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c0ac69f0-46de-4ac5-a592-0259cf25c098)(content(Whitespace\" \ + 11b0e1b8-12ed-445f-9cbb-1b38146c2606)(content(Whitespace\" \ \"))))(Tile((id \ - a72518dd-352d-47a4-b054-3778e2240920)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 42da6cee-5d0c-4b77-89c8-f9e422b32916)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cf693380-0cfe-46db-bf12-02c17a2aa5d1)(content(Whitespace\" \ + 3b785e14-4227-45cc-9b1e-81d830871c74)(content(Whitespace\" \ \"))))(Tile((id \ - 6df1647e-2f6c-4350-b6be-ee0a149948d0)(label(true))(mold((out \ + a836a2db-4e5f-46a2-be78-fa14b23d56ea)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1e5d2feb-aeaf-4b5a-990e-721741af9415)(content(Whitespace\" \ + 37d59ed9-af4d-4bf5-bd6f-56b9e0e1afe7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 82f4bbc0-c3a7-4905-8bcf-24e6dfd3587e)(content(Whitespace\" \ + 5521457d-6cf2-43dd-98e9-a9d7df92e9c4)(content(Whitespace\" \ \"))))(Tile((id \ - a602693d-8766-4acc-a621-b6bc94edff92)(label(f))(mold((out \ + 04eb2f4e-a50d-4a33-8725-c9104b79851f)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7efbc47f-66e6-4e95-b592-ca445a855202)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 89369cb3-51a8-42fc-a6fa-3ff4a9e06bf4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 158da482-bbcc-4b98-abb5-ae7240ca085a)(label(true))(mold((out \ + 33d81b13-87c5-400a-9e3b-4cc95fd7fe27)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 32241379-1075-4aca-9656-f326aaae6f99)(content(Whitespace\" \ + 1b20962e-73e6-4ab4-af2f-66743011fd49)(content(Whitespace\" \ \"))))(Tile((id \ - 37f36a46-08be-4e43-9d0b-d0cc4670f173)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 2f18f52b-fcf0-4c74-a5ea-3d9277483d87)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 33d9fa38-98e4-410f-96ef-3814cda0ca91)(content(Whitespace\" \ + 450c3eed-3bbb-49c9-8a36-7dd77af0ba6c)(content(Whitespace\" \ \"))))(Tile((id \ - ee9cacdc-1f65-46b1-ace9-c3563f8d198c)(label(true))(mold((out \ + 52bf5292-c8d2-4680-9a91-c94fdca39f28)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d7527cc-81a6-4a4a-b0ba-2fe9d9aad62b)(label(\";\"))(mold((out \ + ca93c267-9833-49cb-8a2f-ce9c1cfb8688)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c4cfa363-28dc-4c07-8388-89511e2b021d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 20243ab7-fdd6-4be4-849e-084f814706a4)(label(let = \ + 9d5ede7f-8fec-4112-a9a1-dfa09242134b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cca03013-94a1-41bb-9aaa-40a61bb4b967)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 195a02a3-1cc1-4584-b028-c6adab8678d3)(content(Whitespace\" \ + c383ed9c-9976-496d-8d33-0d91bd7de454)(content(Whitespace\" \ \"))))(Tile((id \ - 8914e2c3-7ed0-4184-9de9-c8c71bc84ded)(label(f))(mold((out \ + 2fb45cc0-9e24-40f8-8dfe-d49e05b5e8e6)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 45dadb48-ba95-4353-826f-10544c399bac)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 46d099fe-7ed9-434c-ba89-0f6046ff95ed)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - afde939f-0fe4-46cd-9044-7190b86fb63e)(content(Whitespace\" \ + b37f512f-824f-4714-bdaf-c34da5d50937)(content(Whitespace\" \ \"))))(Secondary((id \ - 9e5b265f-aaa8-4aad-9014-3f91abd0f1fd)(content(Whitespace\" \ - \"))))(Grout((id f43f1d26-9790-40e6-8c26-d559056442b8)(shape \ + 4b4e481b-ed0e-4b8e-9b5a-79f6e0daedea)(content(Whitespace\" \ + \"))))(Grout((id 0345e588-2bcc-4db6-9756-e2d5600f62ed)(shape \ Convex)))(Tile((id \ - e6f2d81e-74cf-46b7-9b72-224b017542f1)(label(->))(mold((out \ + 9fa88c44-7345-4ed7-bb7e-e9df09135100)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2c8885b0-9e83-49b0-9bb6-eac06b6b1dc6)(shape \ + cd1f514b-c2f1-4db7-ba5e-ef788f5298f2)(shape \ Convex)))(Secondary((id \ - 678bd368-85ae-4b6e-8f8a-a2106b84d126)(content(Whitespace\" \ + 638ef6c7-e565-4025-b11a-cdd4207c33d4)(content(Whitespace\" \ + \"))))(Secondary((id \ + d11b2f70-3adc-4ab1-bf1a-8eccea47f3f7)(content(Whitespace\" \ \"))))(Secondary((id \ - 722a324e-a9e2-4819-bdc3-0aa7b19e1a67)(content(Whitespace\" \ + 9c66d267-d8e3-4d0d-9d2c-ef1bdf13d326)(content(Whitespace\" \ \"))))(Secondary((id \ - 5940e2d7-b76c-40b8-b3ca-2f4e83d89c10)(content(Whitespace\" \ + 001ebfc8-fd51-4c0f-b5b6-d969d2922403)(content(Whitespace\" \ \")))))((Secondary((id \ - 6257d75d-660d-4574-abe8-e7af6b9d1b42)(content(Whitespace\" \ + 39186db7-2642-4b36-a610-4b9aa1e26b88)(content(Whitespace\" \ \"))))(Tile((id \ - d357e807-390d-4e1d-a4c6-a258a74260d3)(label(fun \ + 232c92cf-5b17-49b0-9b0a-d244918f827f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 53d32836-c517-497a-9c8d-4dd4166d72d2)(content(Whitespace\" \ + b765006e-6e75-44fe-ba9d-ae51f70e6008)(content(Whitespace\" \ \"))))(Tile((id \ - bc43d610-5d39-422c-90c1-99c19b61185a)(label(b))(mold((out \ + c6a205b7-80cb-48e8-a5f4-24db741cf7de)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ea17cd76-456c-4f64-865b-97b0809a04e5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2170f1db-c288-4be1-894f-3ae1f0f8ea33)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9db87b7b-1787-4164-ada7-be267ad1c889)(content(Whitespace\" \ + 0465d5d3-bbc1-40b3-a2a5-f2ee522da580)(content(Whitespace\" \ \"))))(Tile((id \ - e7b890a4-c153-4935-86ba-712f9b6fb293)(label(Bool))(mold((out \ + 1ed71b8d-2be2-4895-ba24-a357dcd48810)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f60a55f3-2c3d-4805-b2a5-6aa5180e1634)(content(Whitespace\" \ + 84e19648-70fb-4396-80af-282752914f27)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a98d7c92-73d5-4dc7-aa1a-698d699c254f)(content(Whitespace\" \ + 42c995e5-8731-4863-afed-00cff3bec890)(content(Whitespace\" \ \"))))(Tile((id \ - 13163b9a-c8a1-4018-ac8b-f82e9aed7a02)(label(b))(mold((out \ + 3c4eb7a5-76aa-40f9-b1f8-353e8bdc3999)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c379e843-e2e5-44fe-a233-224a671d9cbf)(content(Whitespace\" \ + 28f11fff-1db2-4f1b-99a6-c0a46faef9da)(content(Whitespace\" \ \"))))(Tile((id \ - f5eff3f0-1072-4f8d-87bd-624091b2182b)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 214fdf21-148e-4d90-a7ef-92ae38ebf07e)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 079d9993-25ab-46e5-ba58-99e1e13d5730)(content(Whitespace\" \ + 86d5b648-036d-4a8a-a85a-5c30db39d245)(content(Whitespace\" \ \"))))(Tile((id \ - 36d45045-38b3-49fe-ba96-21a0596aef7b)(label(true))(mold((out \ + f283831c-a328-4dea-a2dc-886116d47f90)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 57684621-723f-40b5-b736-65f23b7a539f)(content(Whitespace\" \ + a0963d68-bdba-4426-9336-32994575fc83)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 06c16dfe-8fd9-4672-afa3-f1de2f342e30)(content(Whitespace\" \ + 19fc3011-3a8a-4340-a610-20d23c8c6379)(content(Whitespace\" \ \"))))(Tile((id \ - 0af9c58d-aba1-4edb-9a80-5d2e3d3492e5)(label(f))(mold((out \ + 8ad6d48d-6f37-49c0-beb0-9cb9874f5fd8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f57502b2-6858-4af7-bcd5-d899d462eb36)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 719bee1f-6f13-40db-9f77-50c637b337a4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d67bea13-16e7-410e-8473-cc9ebcbeea7e)(label(true))(mold((out \ + 965bf8cd-aff9-4808-b6b0-2e9b349c4f2c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2a06fdca-dcc5-492a-a9eb-b51e87a91fb9)(content(Whitespace\" \ + ad3d9fd1-6476-4f87-bb38-34f4f7f38595)(content(Whitespace\" \ \"))))(Tile((id \ - b7ee1179-4557-454f-bb83-05a493d357f8)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 40b17abc-ead0-4680-9005-c9a70c5b62a6)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e14b3dc7-b3e6-47a7-a734-fcfedc9ae80b)(content(Whitespace\" \ + 9c8aab7e-dc49-4f96-b06d-c093291ec80a)(content(Whitespace\" \ \"))))(Tile((id \ - fc1a8228-d9a8-4aca-b279-383684bdbe05)(label(true))(mold((out \ + b8f22027-a3d1-4cda-8c8d-367ecdb39b6b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7867277d-b26c-4ac1-901a-5560bf448222)(label(\";\"))(mold((out \ + f15876a8-f53e-42b3-96c0-5a86430e7999)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 81f3dcd8-5598-45dd-b0ac-dc3aa27ebc1a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e5615653-8302-4f02-9aaa-79e7601a810c)(label(let = \ + fcce66b5-2c98-4554-a35f-6fe9356f4ff3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 11cd68d4-3055-4e6d-b2ba-d532fe47caed)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - beb40d29-9522-4c9f-b342-9e626d359fec)(content(Whitespace\" \ + 010533b3-77f0-4e2f-af0d-5f2c996e436a)(content(Whitespace\" \ \"))))(Tile((id \ - d8571f2b-0932-4396-bee6-337d02c5d442)(label(f))(mold((out \ + d64b6898-cc91-4d59-81ac-747515c6c627)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 97fd33a0-7de7-42f3-ab59-ee519aafa0fa)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + e2cb63f0-5082-442e-b602-3bf3b218b89e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2c0875ff-6419-4b2d-989e-35bc2a1a3036)(content(Whitespace\" \ + 17ac70f9-402a-4ff4-80a9-20c61fc8314d)(content(Whitespace\" \ \"))))(Tile((id \ - de8c86f9-72b4-41a2-8e49-2ae5bd904c34)(label(Bool))(mold((out \ + 7f528aaf-f2a2-4935-917b-ce20709839b4)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f5359fcd-929f-49ac-acd3-cb4e468e95b8)(content(Whitespace\" \ + 05000601-d579-4e80-9972-bc6d8f3b2e28)(content(Whitespace\" \ \"))))(Tile((id \ - cba7e26e-5324-45ee-a040-b99f74a6345b)(label(->))(mold((out \ + 36df75da-0dd3-488b-a9d9-5d21c171cc9a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 92053cf8-4aca-482b-9a75-feaf27038833)(shape \ + 6463f7cf-2b42-4e08-a17f-f407e057c0bb)(shape \ Convex)))(Secondary((id \ - cbedb124-6ad6-4594-8995-48b938280662)(content(Whitespace\" \ + 45ecbd7b-f73c-4d0b-b46e-9e360161face)(content(Whitespace\" \ + \"))))(Secondary((id \ + 09f02bdb-8e5f-4bdb-bd01-d7dfa9241610)(content(Whitespace\" \ \"))))(Secondary((id \ - 92b22cfa-fcd5-4e64-b1eb-42350efa6005)(content(Whitespace\" \ + 1e00cde3-c1b0-4de2-9a00-a34e2ff7c655)(content(Whitespace\" \ \"))))(Secondary((id \ - e92bba3a-02e8-49ce-933e-608106fa1d5d)(content(Whitespace\" \ + 8b301dda-83af-4a8f-a0fb-a609537e21b4)(content(Whitespace\" \ \")))))((Secondary((id \ - 20d12cd7-8150-4900-b429-ada033c245c5)(content(Whitespace\" \ + 28849283-0d26-40df-9733-19e27ea79ddf)(content(Whitespace\" \ \"))))(Tile((id \ - e31eafc0-adae-4acb-a0e7-dc70ce82d66e)(label(fun \ + 6d2ad017-4926-4a91-890c-2ee9878eb57b)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 92e6efec-ea3b-4263-bb24-790ccfaadfa1)(content(Whitespace\" \ + 2d532352-1000-4c3b-84eb-c061d6f89b87)(content(Whitespace\" \ \"))))(Tile((id \ - 763f4ad4-9606-4a1a-a5e0-92902c767d9f)(label(b))(mold((out \ + 248543bd-79cf-4dc7-9ccc-a335930da2ae)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dd4eec56-8f3a-42f8-883b-617269d33edb)(content(Whitespace\" \ + dca1f43d-fc2c-4db7-8629-ddca28b02384)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d587040f-8fdc-44c3-bcaa-a2d3673d573b)(content(Whitespace\" \ + b0fb2925-c05a-47d6-beab-9a5bc077e390)(content(Whitespace\" \ \"))))(Tile((id \ - a8c46661-9b28-4712-8e26-4a5bfd32070c)(label(b))(mold((out \ + f30d6fe5-fc15-4165-b5cb-74b581608850)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a75b25d8-23e0-4a7d-be44-026f8ac16c8b)(content(Whitespace\" \ + 28de10b0-ee86-4b36-868e-efa974c7fefd)(content(Whitespace\" \ \"))))(Tile((id \ - 3c325158-7e37-4ce7-8851-04b86f9ef104)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 034b93e1-e68b-4c71-9aa9-8b88a1f6717f)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd54c5ca-e661-4d82-8153-491bdd93efd6)(content(Whitespace\" \ + 0aa13a16-8a85-4b6a-af46-3259e80498b9)(content(Whitespace\" \ \"))))(Tile((id \ - 629d7054-84b0-4df5-827d-a53d1d9fcc3c)(label(true))(mold((out \ + ca718d01-9143-41df-a9dd-9695bee7cc40)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 45157d16-447b-4148-b709-d756534e56d0)(content(Whitespace\" \ + 6108da88-cd31-4bbd-98a1-74870b6f5f59)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d9102e0d-7373-423f-b803-06bd4bbfa12e)(content(Whitespace\" \ + fc08e84f-6f5c-406b-a370-4d8764076c0e)(content(Whitespace\" \ \"))))(Tile((id \ - 640ccec8-05de-4d42-8463-99b80258070e)(label(f))(mold((out \ + 3264ef95-4518-47c6-8186-3e040a2878f3)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 17d54597-59d6-4e72-bddc-544c46818c04)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 083896f7-521d-45eb-b5e2-a0693472b6f8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - aa80ef64-4be6-443b-a6f3-1e61ed8069fd)(label(true))(mold((out \ + 9a445efe-d95a-43c3-9230-bbdca765a148)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 0830394e-ba5d-40e0-98b0-132c96adf0a7)(content(Whitespace\" \ + 56f63e5c-89b9-4b8d-aeec-1a57863e4b5e)(content(Whitespace\" \ \"))))(Tile((id \ - 133b206d-3940-44b1-a424-7f8244505a72)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 93508e37-b4f3-4830-ab96-9ceb29388e53)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 35a3cfb3-0761-4bbe-b332-25bb83b35310)(content(Whitespace\" \ + 8c1e6a65-a640-417f-b2a3-43ee0693e64c)(content(Whitespace\" \ \"))))(Tile((id \ - 0e6f463b-c79e-44ed-af9b-544e8e6ee43a)(label(true))(mold((out \ + 5afd5f9f-3941-40a3-8f97-4a83aabd5d0d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d355c1e9-d709-4fbd-9f06-08c518077346)(label(\";\"))(mold((out \ + 3e5c743a-f3a5-4d3a-9360-ea5b2b36e6d1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2ce5c0a5-2431-49c5-9d55-4eed5b2cbd52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dc86465f-5c0a-48b5-aef1-51dae9a80e31)(label(let = \ + ec976b0b-cbbf-48d4-9868-a1baa3a2571f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fca344de-2eb5-40bb-9f6d-0c8442b1f763)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ea6e7924-e38c-4ba0-8acd-622db92a1d3e)(content(Whitespace\" \ + 596d5e3f-1701-4791-b5a7-c090e993e604)(content(Whitespace\" \ \"))))(Tile((id \ - 6546cc92-3d5a-4a40-af7e-f081c2b83470)(label(f))(mold((out \ + 8c80bd17-ae12-40f3-95f6-4811a3cb94da)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - eb1aeb12-f9cf-47bb-8a69-c26b20a3779b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f9316f37-d724-4b33-8902-682f3419ec73)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c9602d72-4ccd-42b1-8542-7b5c8cb8e7ac)(content(Whitespace\" \ + ffcb227d-6bad-44a2-b874-744b86e8a8e3)(content(Whitespace\" \ \"))))(Tile((id \ - 704a5137-6382-4a53-8776-c36c02b40863)(label(Bool))(mold((out \ + 8246fdc4-2f51-40ed-bf24-c9b189a72ce7)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a90dd745-12b6-452e-a3a9-f052298fd2de)(content(Whitespace\" \ + 70a96cc6-0821-4f30-9c32-aaace439c4a2)(content(Whitespace\" \ \"))))(Tile((id \ - 4266fd4f-6ea5-4dac-9610-97cae7ebb411)(label(->))(mold((out \ + 55f875ee-c926-4d7e-9581-552f36cbaf05)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9adbdab5-f905-434e-a6bf-791180566e08)(shape \ + ab4093d9-720a-4143-8e79-1255e712e234)(shape \ Convex)))(Secondary((id \ - d8c438dd-8c59-4c3d-b05f-961580fbacf7)(content(Whitespace\" \ + 943861f0-fd63-4cbe-9115-d69860ad12a1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 442c7424-afaf-4b69-81fe-5af0238388c9)(content(Whitespace\" \ \"))))(Secondary((id \ - 1004425b-ab5d-474d-93c4-1911af40434b)(content(Whitespace\" \ + c4474715-a547-46ab-b40a-a244cef264c9)(content(Whitespace\" \ \"))))(Secondary((id \ - 368965ce-b2a2-46bc-987e-d30c517601fd)(content(Whitespace\" \ + 29705c2e-e88c-480d-b7bc-1440d024e5b5)(content(Whitespace\" \ \")))))((Secondary((id \ - ffd37850-24e1-4703-accc-aca35365a4bd)(content(Whitespace\" \ + 576a7ae2-ecba-4052-b24c-5c21a53c33c9)(content(Whitespace\" \ \"))))(Tile((id \ - 1f86e198-5228-4a1a-afe3-20887f3b3bcc)(label(fun \ + e9c92d0e-19bb-4954-bf3e-fdc999cf2496)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d4a9281e-b622-4a07-83e4-95836388416c)(content(Whitespace\" \ + 497e2f36-1649-4374-88a6-21d26a2abd04)(content(Whitespace\" \ \"))))(Tile((id \ - ceaa600f-332a-4512-ae7d-ccd431312463)(label(b))(mold((out \ + 5408491e-14c3-4ac0-97b7-a4a169bf3e55)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0c01a344-f1c9-4c7e-8ad3-573c45ef2a08)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + d582ea88-8616-4a46-943a-d23cfd396ed6)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 31b2b80b-fd60-4a15-8201-9fd3775e2356)(shape \ + d15964eb-dbb5-4e2f-ac89-d30c814d2368)(shape \ Convex)))(Secondary((id \ - 3b8d624e-7cbf-4806-88a0-790cc43db5e9)(content(Whitespace\" \ + 39a5836d-ea50-4b1c-9b7e-5ab281b1ba9d)(content(Whitespace\" \ + \"))))(Secondary((id \ + bd0aadbc-209c-4243-a9e7-a9b54106ae2e)(content(Whitespace\" \ \"))))(Secondary((id \ - eade9501-66a6-49b4-837b-a005cd7b2674)(content(Whitespace\" \ + 7d458f40-8936-4796-8b61-f5d0743609af)(content(Whitespace\" \ \"))))(Secondary((id \ - c0696d59-61ed-46f0-9fab-7577204d5e8a)(content(Whitespace\" \ + 3c0a02fa-fc7c-49ea-8ae3-197a8ebcca98)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a5b77b0a-dafe-4e5c-ae2b-95b835546eb4)(content(Whitespace\" \ + 6737dfac-e94b-438f-8982-58f7bee19633)(content(Whitespace\" \ \"))))(Tile((id \ - 7406966c-01c1-40ae-8438-894d1bd59a01)(label(b))(mold((out \ + 4b15c4f7-ce91-4281-854f-1188f75bf5bc)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 97504d19-0589-43ad-9def-8eefdf693b19)(content(Whitespace\" \ + e654b815-f44b-44d6-a742-38eb2b6b8235)(content(Whitespace\" \ \"))))(Tile((id \ - b24017a8-1060-45de-8438-0cb0f0c69baf)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 6048be0a-77c8-4cd3-a1cc-2b101deb8219)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - dbe84fb8-9cde-4815-8f5b-68370e14c05a)(content(Whitespace\" \ + c4980224-f3bc-4216-ad5d-ffe0c145a643)(content(Whitespace\" \ \"))))(Tile((id \ - 235d8af6-52e2-4b8e-bf91-009e4447eb50)(label(true))(mold((out \ + a76cc209-2468-4999-b945-987771e356c2)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a9d0e871-e802-414e-bd30-bbc48f9f6dc9)(content(Whitespace\" \ + 75e578c6-daa6-4299-97de-a6d8c66c48d6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2a7c5668-e30e-4e8c-b140-dc0e219c3a94)(content(Whitespace\" \ + 5561ee81-b3e9-4509-9394-5026f562c29c)(content(Whitespace\" \ \"))))(Tile((id \ - 742b6c6f-3db9-4d16-9914-a5d914ad92f9)(label(f))(mold((out \ + 60acaab5-41d2-4adc-bbe6-94c69ac6beb8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a0091632-5ca2-4a0a-8693-af46c964b707)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a11bab41-cca9-448a-8eca-014ac0ee2cc4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 900e40c3-df7f-43de-868e-529a722d69b6)(label(true))(mold((out \ + 28ebdf1c-b7b1-49c9-8a4f-8db534b555b4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 7f669310-1611-4150-9484-022033cbbc76)(content(Whitespace\" \ + 93d8e458-a2c9-468d-907d-23dbc4b705de)(content(Whitespace\" \ \"))))(Tile((id \ - aa13d4f2-71e1-4dd8-b9c8-523e1a2cd552)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 255ad8ca-26b2-4b5a-811c-737046ab2eca)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 906bec45-5fa8-4910-b1eb-0bd172b39cff)(content(Whitespace\" \ + 51a23c09-d225-4235-a0d7-6fc4830f4e43)(content(Whitespace\" \ \"))))(Tile((id \ - b493b63b-3673-4cf5-9fc6-bebb42db1396)(label(true))(mold((out \ + 47960195-5bee-4004-b241-78df30e2294a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2e133c45-2e48-4006-b0ed-ca719e6d9ddb)(label(\";\"))(mold((out \ + 6e02f82c-6501-4810-8c7c-eaf13131fe5b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 871541cf-13ed-4348-9a2f-b93f45dca05d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4d10f655-2634-4c1b-9762-63ed6a7780de)(label(let = \ + 60481f3e-2959-464c-a0a3-b2e1988ea492)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fdfe41dd-9c7e-4a19-9343-954c3b393735)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 45785c6c-5f7a-4373-b7cc-f67910580015)(content(Whitespace\" \ + 0a76ce8d-b223-4a5e-87a3-bdc07041bd10)(content(Whitespace\" \ \"))))(Tile((id \ - bc8d814f-86c6-4f6c-ae4f-3cdf5b2c049c)(label(f))(mold((out \ + 21d61a6e-f2e2-4007-8b22-081f7996a8b3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 50bc8550-04dc-4d90-a4a9-be8df5d98a3f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f2ee63a3-94f0-4861-8682-e05bdea64975)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ee84e1a7-15a8-40db-8a5a-4d9870cb2edd)(content(Whitespace\" \ + 7e018fae-fc46-436a-a7c2-9c69a1714586)(content(Whitespace\" \ \"))))(Tile((id \ - a368cd1a-a7f6-4903-b2f7-d3beb1537bdd)(label(Bool))(mold((out \ + f26115c0-a57c-433e-95c0-983c94e220a6)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3d1c071c-bfda-4037-b178-019b06488b8b)(content(Whitespace\" \ + 64c51762-8008-4e55-bfc2-9cfde5c80559)(content(Whitespace\" \ \"))))(Tile((id \ - 0fe78a55-a7de-4ff0-8787-ecd69bc9e239)(label(->))(mold((out \ + d6f79c9b-7c9b-4bbe-a160-eaaf8a3ad6d7)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - ec97cc38-d201-44ca-ae64-28806c5d8d48)(shape \ + a0667515-d8dd-4e72-960b-48ef0ff056c4)(shape \ Convex)))(Secondary((id \ - 369b2741-2397-4f99-acdc-460eb71dcc12)(content(Whitespace\" \ + 0f802e30-af30-4eb1-9614-afa9e50dc48d)(content(Whitespace\" \ \"))))(Secondary((id \ - 8d566925-4560-45ce-af57-70d001f7af47)(content(Whitespace\" \ + 853517a7-56a3-4ec7-8d52-37b8bc6a9c04)(content(Whitespace\" \ \"))))(Secondary((id \ - 2f590b5e-aa3b-4967-b0c4-f7cc737b8d5c)(content(Whitespace\" \ + 718e1e1c-cf19-4e36-8f26-cc3583643e14)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7f374afe-d137-4715-9eb5-e322f0e0dba8)(content(Whitespace\" \ \")))))((Secondary((id \ - 435c918e-b179-42f3-85a8-1c2de3f745a5)(content(Whitespace\" \ + 19c9fb30-4c93-4077-a3e3-b35e23f7a7f8)(content(Whitespace\" \ \"))))(Tile((id \ - 162de82e-a946-4fb9-9526-1019b2dc13dd)(label(fun \ + 46f92a3f-da8d-4285-8ead-9ec1ce0abddf)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 19beca4b-cce6-4ab2-b079-15e467628ba7)(content(Whitespace\" \ + 54b051d7-e80b-463a-b74d-6b40de79bad2)(content(Whitespace\" \ \"))))(Tile((id \ - 7e2e4f39-845f-4a7b-82cd-571ec45b852d)(label(b))(mold((out \ + a67f2834-c727-4bc9-bb32-526102ff03f9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 673c44a7-ac40-4ed6-8b0e-90e7220f4134)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3071c88f-37ab-4ab4-84ec-13714c72f4e6)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - feceacc8-a63c-48bf-82ab-7b0b97d47a90)(content(Whitespace\" \ + 8a2c4ca2-c97c-4e19-ab90-d5f66cfa20f7)(content(Whitespace\" \ \"))))(Tile((id \ - 9478b03d-b2c3-4714-88cd-76863e56b029)(label(Bool))(mold((out \ + 91d340ce-225e-4152-93b3-40d3053254fe)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - feacb768-8686-440a-b28b-9e33df74853a)(content(Whitespace\" \ + 1efec563-79c5-4e32-9451-84575119377f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - db49bbf6-b497-4ba7-bc17-5a1971908944)(content(Whitespace\" \ + 6795be87-8534-475c-be6f-7c96d853ba01)(content(Whitespace\" \ \"))))(Tile((id \ - dfde7bb5-0af1-4d93-bcd2-d90bdf3d04c7)(label(b))(mold((out \ + c1c5fdc8-219c-4dd9-a21e-3112db64b8e8)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1cea4d62-89da-4bdd-b13f-7dcd4608ece3)(content(Whitespace\" \ + c51c32c3-1905-4fce-b636-f2a4f3d0001b)(content(Whitespace\" \ \"))))(Tile((id \ - ae82c61c-e474-4d87-9bf1-f9931d692738)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 222fcd2e-9f60-4c4b-9a38-271b602bc23e)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - dd934033-111e-46e7-aaae-b0df65816e53)(content(Whitespace\" \ + c0ec4ef1-124b-4613-908f-79c33988ee0d)(content(Whitespace\" \ \"))))(Tile((id \ - 9a69136a-bcab-4cf0-8da5-f535f7e26d27)(label(true))(mold((out \ + 341b3887-efbe-4f8b-8fd0-a9471ad9b18d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e90533d0-3cce-4094-92c5-72dfcb56abdd)(content(Whitespace\" \ + 67d44ffa-74b8-4080-a29c-1ece364b9a73)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c6226fbd-11f6-4419-85ff-ab3c2498e170)(content(Whitespace\" \ + 28985c6c-b2b9-489e-b6c3-6e139b178c18)(content(Whitespace\" \ \"))))(Tile((id \ - 41bd500b-631c-4c81-9c59-55f283d35d0f)(label(f))(mold((out \ + a0b6f2bd-251a-4cf5-ba7d-654a0bba207e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c5598d7f-05d1-4f6d-bda7-d4418e1a4093)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6e041455-834d-496e-9296-47d80f312bc8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 52536945-61d2-4a8a-b34c-0f97f74678ca)(label(true))(mold((out \ + c431601b-29c9-4ce8-ad01-f08ef2b718ec)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 74bfea44-e314-4b68-aa4e-8624bdc8ce7a)(content(Whitespace\" \ + d8327bcc-4852-458f-a143-5d6fd9635754)(content(Whitespace\" \ \"))))(Tile((id \ - a263c68f-6725-4707-b6ad-7dd38477d1ce)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 45c9bb25-dd64-46ca-a51f-290721f6c6ab)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5fb52d35-62b1-4553-95ec-908a25026114)(content(Whitespace\" \ + 8607f6f3-caf4-42f7-9c23-542a4ac5409a)(content(Whitespace\" \ \"))))(Tile((id \ - dd524143-3ef6-4d77-a5aa-1d1607996ea3)(label(true))(mold((out \ + fbf85a57-7107-4f76-be20-ec4fd4de8414)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7e8e6138-15f6-4d0a-a1c2-9a8bbc2408f5)(label(\";\"))(mold((out \ + cdd7d4ce-2b97-4130-bb78-f602befeb688)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6015d050-9f6f-4c94-aab9-b6beb618f94b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9271a2da-695c-4a84-a5f1-782b6d1a0aa3)(label(let = \ + c96646f1-a366-498d-9cc7-d4a041ded860)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fd66b6c6-6c7e-4745-9a7a-4fe6a4e10b23)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 34844e16-5aed-43ae-a080-46a40717dadc)(content(Whitespace\" \ + fa28cf4f-ce9a-4cce-b193-a5e948d90b18)(content(Whitespace\" \ \"))))(Tile((id \ - 7dee8226-5eba-4a93-a598-fe1c5f7f7320)(label(f))(mold((out \ + 7fd69968-da34-4a32-b6d3-49d068124e96)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2e94a4f6-50ea-417f-bf87-9b38816eb882)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 6f14f8d2-964f-4ec8-81d1-2f636752a3f0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ddfb9fe2-8c13-4c32-a518-c81106179548)(content(Whitespace\" \ + 75a251da-4dfb-4d18-831e-6592543a5fd2)(content(Whitespace\" \ \"))))(Tile((id \ - 83327e64-693f-4bb9-b698-87a789323c9a)(label(Bool))(mold((out \ + 5c548775-922f-44c5-9dd4-a482f96397fd)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d466c4b0-bfee-4b81-a549-29ff26e5be9d)(content(Whitespace\" \ + 8f09ef73-27e1-4e23-8fbb-859ae92168d4)(content(Whitespace\" \ \"))))(Tile((id \ - ad3e8603-24bc-42ef-a50c-25f61ba914a7)(label(->))(mold((out \ + f71ccf61-d921-4144-bc50-cf734fff1e07)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7a253466-e174-446b-ac4b-1033e9f6b871)(content(Whitespace\" \ + a62140e6-3119-41f9-839e-4017096fceb8)(content(Whitespace\" \ \"))))(Tile((id \ - c0fa1d45-e9e0-4a59-9bf7-a5043d8cc002)(label(Bool))(mold((out \ + da9079ab-625e-4e66-813c-fb1d1028e8c1)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 10fd4c96-baa1-4e8f-a53e-100cb36aee6c)(content(Whitespace\" \ + 54af84a2-4d74-4069-93d8-9c4149de83d6)(content(Whitespace\" \ \")))))((Secondary((id \ - 6aa641dc-56bb-4b33-82e3-1cbb94491d1f)(content(Whitespace\" \ + 26655250-b104-4b6b-9a6b-ee34ff40545c)(content(Whitespace\" \ \"))))(Tile((id \ - 2efa7e74-501b-480d-9be2-0b91ab400b25)(label(fun \ + b892c8a0-7935-42d3-b9ae-d85529770a4e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - bbb4dfea-a227-493d-8320-effb69611423)(content(Whitespace\" \ + 89aa3597-97ba-49d0-98fc-a7d278267ff2)(content(Whitespace\" \ \"))))(Tile((id \ - d7d6b45e-36f9-4c77-87cc-9564261d6fff)(label(b))(mold((out \ + d35cac24-6deb-4934-8a66-587be5365e3a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ac7ab096-53ba-433c-94b6-c05d8703f2cc)(content(Whitespace\" \ + a0b2eec8-c65c-45d8-b12d-0e87bf5dac80)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8325b5f5-d41a-4dff-8114-99b59ecd3e85)(content(Whitespace\" \ + 011898c2-8326-40ed-a1ea-fc3331fa1656)(content(Whitespace\" \ \"))))(Tile((id \ - e8f221da-21e6-4912-9914-31697964caa5)(label(b))(mold((out \ + d7cff5ed-2a65-49a8-8fed-f9f9e6967e68)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f5bf4238-4163-4d18-8580-2313d921959c)(content(Whitespace\" \ + e86956f8-d506-4875-b563-86dcd60f66d2)(content(Whitespace\" \ \"))))(Tile((id \ - ce6a2eb1-970d-4e35-96e5-ce797fa6aacc)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + de8a8713-4bae-4f21-961f-d88ada28f203)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 59e29b21-17c5-4c1a-8b3c-54189c96e778)(content(Whitespace\" \ + 4e305125-c826-4892-8e3b-fbb9b24c8e00)(content(Whitespace\" \ \"))))(Tile((id \ - d52afa68-cf8e-4632-a745-24e9d0a5253c)(label(true))(mold((out \ + 5b25630e-abfe-4d96-ba06-39e199e57fac)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e71e9c30-311d-43e3-8dc5-a28b95f9efd6)(content(Whitespace\" \ + d2395d10-9d6d-4fb6-949d-4ae89c509252)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8749f93-4f77-497e-b667-a20333ac73ef)(content(Whitespace\" \ + 98e45812-06c9-4163-9670-c9cd14baac1d)(content(Whitespace\" \ \"))))(Tile((id \ - 9101bfb6-4ca9-4ff0-94dd-98f16a638608)(label(f))(mold((out \ + 6d9d336c-0377-4a14-9aad-ef4bc86e5ac2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 16a464ee-12de-4725-bbfc-30139156c5b2)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 744de733-f6e0-4563-8883-655a73995137)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 026be924-3fc1-4243-ab59-d413f936b923)(label(true))(mold((out \ + c5c37a9b-cb08-44f8-a7ef-24c637f85e5c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b53dda25-5f7a-4033-bf2a-cf2d81e6335c)(content(Whitespace\" \ + e7bcdffe-61e6-4e61-b110-77a836c8230c)(content(Whitespace\" \ \"))))(Tile((id \ - b65ae5ba-d37b-4317-81b0-b9dd36d60103)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 6a0b316b-303e-4a32-a723-8cad2b466d3e)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9d106574-4e8c-4fae-94b5-2c2464948b43)(content(Whitespace\" \ + 9ba3bf2f-1b7b-4902-a7bc-3cb29958723a)(content(Whitespace\" \ \"))))(Tile((id \ - a8c8b27e-2262-43a1-ad3e-9ce34e3eeedd)(label(true))(mold((out \ + 46b4f5d4-91d6-4f56-a528-e5854c889117)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b4e87bb7-2370-4ec5-91a1-e7fba20e2b96)(label(\";\"))(mold((out \ + 7216c9c3-cf9d-4cd9-be12-f71c1089b3b2)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8ecd5c16-c27b-4db8-841e-7a7d84b56783)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 56f5b307-ccbd-4055-a5d0-e15d2eee7c3b)(label(let = \ + 87da09f6-80db-4e77-9f49-a621bfe605bb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f4095cc-a71d-439d-9f31-a9ae0986c524)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 91762bf5-6066-440f-98de-eedf468d2efc)(content(Whitespace\" \ + 5968ffce-0fd2-4b90-bbcb-d6757fb6bce2)(content(Whitespace\" \ \"))))(Tile((id \ - b10c2aeb-2def-4842-909d-39519641905a)(label(f))(mold((out \ + fb5f7fd6-46a5-4df2-8abe-2e5922e75ff7)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b5dfa606-edd8-4917-b5e8-e167cb639daa)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f075af34-6bf2-4e2f-aaae-9cf3a57f3bb3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 70c3fcf2-0d68-4f7b-ab6e-77544c8ec3bb)(content(Whitespace\" \ + 1289f0f9-9fa3-4000-9920-d56965773608)(content(Whitespace\" \ \"))))(Tile((id \ - a8e10085-b0db-442e-8e0e-36280840e81b)(label(Bool))(mold((out \ + 0efc091c-4b53-4848-b4af-ba6b2932da3c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e333d71d-9fda-41db-8e17-86e23097d28e)(content(Whitespace\" \ + eac43b9c-d4e0-4ad0-a2e5-676b8ae64198)(content(Whitespace\" \ \"))))(Tile((id \ - 1404d298-b539-42aa-b1f7-2e3d7d4c24b0)(label(->))(mold((out \ + 95240bbe-9588-4382-bbf2-17de9ceec5a1)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1a889cc4-fe72-42d2-bea1-e2f61e37ac87)(content(Whitespace\" \ + 59c6d5f6-f04c-4241-bbb8-dff6567b63cd)(content(Whitespace\" \ \"))))(Tile((id \ - 5ecb8198-c2a0-4664-b928-3c703caf0add)(label(Bool))(mold((out \ + 6b1133f3-7163-4cec-8db6-62630c735aa8)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8ba66779-25d9-48b1-926e-5a34765c312d)(content(Whitespace\" \ + 87e0e8a8-3eb0-4f9f-abc0-68b932fdb065)(content(Whitespace\" \ \")))))((Secondary((id \ - bd6d0014-9e77-4225-9ff8-c0a7de2825b7)(content(Whitespace\" \ + 09b6809a-fff8-47a8-9914-217fba4d9a0e)(content(Whitespace\" \ \"))))(Tile((id \ - 29dfd12a-2d87-4df6-aece-53cf6bba0c52)(label(fun \ + b6f2a206-130b-476d-8aac-3cce8eb97149)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4294c873-5c21-4a94-bf88-758b5fdf2f7f)(content(Whitespace\" \ + 92d62283-1f76-4fc7-8f03-9c29bd93fa0d)(content(Whitespace\" \ \"))))(Tile((id \ - d466322f-a8b5-47c0-9dc6-bbc7a28d284a)(label(b))(mold((out \ + da9b4f2b-3576-4741-a893-d96592a712fb)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8b147a7a-1da4-46c6-a28d-091fa16861c1)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5b89009f-c1db-4659-9ceb-820ca43848b2)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e5d814f6-aa9c-47a9-b63c-42fd335f953f)(shape \ + a072455d-2263-4e11-9261-45f2812fcaab)(shape \ Convex)))(Secondary((id \ - aaa67ede-7822-4cf7-9f19-303fa33f8aba)(content(Whitespace\" \ + 07477c75-3d9d-4cf2-9a83-d559dc990338)(content(Whitespace\" \ \"))))(Secondary((id \ - 6e552c40-4071-4359-b9e9-37aa5802101e)(content(Whitespace\" \ + b8ebf16d-0eec-4680-ae29-a4af45ff4304)(content(Whitespace\" \ \"))))(Secondary((id \ - f5a43ffe-b44b-4887-a2f7-c7ad2c748a8f)(content(Whitespace\" \ + 0bd4fd48-0f4d-4b54-9d42-e43f303916df)(content(Whitespace\" \ + \"))))(Secondary((id \ + cd00641b-c26e-4a77-a78c-773244c23324)(content(Whitespace\" \ \")))))))))(Secondary((id \ - afb4920e-7c70-4c30-80a8-b59dda228ee5)(content(Whitespace\" \ + b304dce3-027d-4740-b014-3aadcf732962)(content(Whitespace\" \ \"))))(Tile((id \ - bf7732e5-78e7-40c8-a9c2-a8ecb70093b1)(label(b))(mold((out \ + 662a94b9-46e3-4786-a208-0b22db654526)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ad412ee5-7ba6-43fc-a25d-326aab9770cc)(content(Whitespace\" \ + a3a15271-f413-4f26-8b4e-a3451319e3e8)(content(Whitespace\" \ \"))))(Tile((id \ - 0ca89b07-36d4-48f6-8290-1c8b24c034be)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + f5fcc2c1-6422-4d5b-a5a3-007a1627044e)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cb3c95fb-ae39-4615-973e-ec79808abb70)(content(Whitespace\" \ + c6230b68-81a1-43bc-96c9-9c21eafc6230)(content(Whitespace\" \ \"))))(Tile((id \ - a6f26646-3b0d-46ef-bbec-37d88efc98cf)(label(true))(mold((out \ + bc58ab39-2d3b-4438-8ae0-a6ddc93391d4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 205acc81-396b-4654-a205-a613a8eec959)(content(Whitespace\" \ + 331d92e6-fb7f-4db6-b17c-869e425a0cab)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a47cbbe4-adb2-4be2-aab0-61f00f9562e1)(content(Whitespace\" \ + a0d63e76-05bc-4660-b154-364702e807fe)(content(Whitespace\" \ \"))))(Tile((id \ - cec4d937-3598-40f2-9397-c6a8e97a8685)(label(f))(mold((out \ + d3dee762-c950-47d5-a019-977f86e32398)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 481fb687-e80b-4b1e-ad16-d118f96518d3)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5db5eee2-3883-421f-a709-d25227563cad)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8bec8bab-36e3-4f51-a0ea-e1c25b102bc4)(label(true))(mold((out \ + 83e15250-2c6b-4418-a137-9c4c6e6b14e4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c515d61f-d2ee-4687-aa95-d27c345d9124)(content(Whitespace\" \ + 9e0632cf-1ae3-4376-ab57-491f18d2b968)(content(Whitespace\" \ \"))))(Tile((id \ - 2987470d-5adb-4c4b-b833-a6053464f507)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + c9d784ac-7302-4c2b-8191-bd5be8c83cf6)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 921d2a1d-8b94-416f-9310-896690875100)(content(Whitespace\" \ + f569f511-1442-4f32-8122-d2828f4969d6)(content(Whitespace\" \ \"))))(Tile((id \ - 1e9ee143-0c04-44d7-9377-b00d030d9e8d)(label(true))(mold((out \ + 75bad9b4-36e5-4730-aec5-b3a3d4462063)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e0eb56a9-fe68-4c96-a5bb-1d4dd7699c0d)(label(\";\"))(mold((out \ + 6ab03724-3bdd-4b33-b088-a6f4004cc33d)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ce674ccd-c248-497a-be93-2d1827321580)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 77df4c7b-d395-4223-9069-a41ccc5bbcec)(label(let = \ + 3b92ba6b-19a1-4b0c-a3c7-806fe36fc713)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f97c2119-7208-4846-8d49-f50df66882f5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 37e216c7-b5bf-4c84-94e2-809bf6f37566)(content(Whitespace\" \ + 915eb545-56d2-4b3b-8a42-e8a62b9d5ced)(content(Whitespace\" \ \"))))(Tile((id \ - 6ba77d63-777a-4ea8-8e2a-b749252fc99e)(label(f))(mold((out \ + edaa9a3c-8382-480b-aa95-7e1df21d4f17)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e7b23270-f09c-49d9-99c9-63cfb246bf84)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 40844ddf-3718-4c9c-9418-357180d9307a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0a0f7a4c-5607-4b44-8f2f-7d7fea49ad79)(content(Whitespace\" \ + 414bd942-6026-49f8-a13e-0da73f9c46cd)(content(Whitespace\" \ \"))))(Tile((id \ - 43c8c778-7a13-45ca-84b0-7f325e56c3aa)(label(Bool))(mold((out \ + f4f46c53-5198-4362-b54c-9b952a0f6102)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3d7b8db2-5f04-432b-8e91-08dcb9396fc1)(content(Whitespace\" \ + a2294884-214f-4101-a29b-4079aa26a253)(content(Whitespace\" \ \"))))(Tile((id \ - 46647b2a-ce9e-433b-b19a-34524e8a3936)(label(->))(mold((out \ + cb66f8cd-97ed-4f63-b3e9-840155744430)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2948e58b-e983-47f2-99d0-ee3888d9dd2d)(content(Whitespace\" \ + 69fb31c9-316a-4ad2-802f-0ea2e330986a)(content(Whitespace\" \ \"))))(Tile((id \ - b321fb83-884e-48ab-9f0d-821af55f2875)(label(Bool))(mold((out \ + 0b545548-9127-469b-8174-2c9e0abf1a39)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 319dd3f4-27e9-49fc-9cc9-c1061871c35a)(content(Whitespace\" \ + 43b1c848-46e5-49a9-89da-dd2ddbd8df6e)(content(Whitespace\" \ \")))))((Secondary((id \ - 0bd2e23c-685d-4f29-bfe7-a69b36196188)(content(Whitespace\" \ + 34936e38-7ac5-4bb5-8456-223fe2c52ae3)(content(Whitespace\" \ \"))))(Tile((id \ - acbfef52-103f-477e-bb21-04b4d1bdffa7)(label(fun \ + df2e6ff1-1b0d-44b5-9576-0d25c0a25635)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 41fb3d84-8b61-424e-804d-ec69c303fb6e)(content(Whitespace\" \ + 18d08929-f4ad-451f-8b89-6e62b74d5e06)(content(Whitespace\" \ \"))))(Tile((id \ - 9b5d610f-0469-4739-aca7-5119fecf545b)(label(b))(mold((out \ + 907b484b-9b0e-4a13-b173-f8d0530a539c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c410566c-dabb-4c16-a9d3-529919c4aed7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 49a63e2f-507e-4b0c-814d-49805544d22e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f58d88f3-e73c-4460-af33-c98310bcf84c)(content(Whitespace\" \ + 0ab5f8d7-a7e9-4f59-a6f5-b80a304c6508)(content(Whitespace\" \ \"))))(Tile((id \ - 74f034a8-1c62-4a1b-949d-3d5d9ab06300)(label(Bool))(mold((out \ + dc39c8bf-cf17-4771-a6d5-5eacebedf535)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 457e1f7b-6d2e-4f14-ab9d-ffdd7504178d)(content(Whitespace\" \ + 8590ab2a-dc65-49d3-9af6-8b1d116c58a4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 068412e9-a2c9-453a-9471-5c85ca109a50)(content(Whitespace\" \ + 61640a3a-e81a-4173-b858-85ac0776eeec)(content(Whitespace\" \ \"))))(Tile((id \ - c9e91907-caf6-439b-a853-daf48c23c644)(label(b))(mold((out \ + 6260560e-1501-43f8-9553-ff363e51c692)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f2c60bb1-7cf7-4e8a-a851-b2777cefe181)(content(Whitespace\" \ + e4bf9a24-8b79-4acc-ace1-4200caf896a1)(content(Whitespace\" \ \"))))(Tile((id \ - 377c0269-ab26-471d-82ed-240201592a29)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 1501e7ab-dca6-4e78-b17e-f58900254f22)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9c093f60-be9d-4cb6-a5eb-1da93f0e2024)(content(Whitespace\" \ + 751f7b84-d34e-4034-923b-fa699462b2a5)(content(Whitespace\" \ \"))))(Tile((id \ - ef606d34-8568-40f3-9202-3c38e4be1b75)(label(true))(mold((out \ + 5aee0834-bdaf-4f66-9c3a-3a91755163aa)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a4529399-1837-4eec-b112-9938302ef97a)(content(Whitespace\" \ + 612f5d6f-575d-4a44-be8e-4ced1d7feea3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 22922dfd-dafe-4fda-9d42-5edb7349ef5f)(content(Whitespace\" \ + a82539d0-09cf-4dc6-a794-27e8212c37d9)(content(Whitespace\" \ \"))))(Tile((id \ - d60e887f-7cde-4ee3-bee9-380b0c41f4c8)(label(f))(mold((out \ + 27145e94-f582-4553-a437-3e622cb641d2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bebd0d47-8506-427e-bed4-9246a8fa3621)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 949b0157-0f61-4ea8-b17f-37444778ee39)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e8d45f5f-4215-4eb2-9887-f5ec0c765f36)(label(true))(mold((out \ + b0ed89f5-0e34-40de-9578-ec25325c358d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a1fec6ee-8077-4339-bd56-4ad81eb6f9f1)(content(Whitespace\" \ + 8e21cefd-2576-41ee-b6d2-38f76eeab831)(content(Whitespace\" \ \"))))(Tile((id \ - a821160b-ec97-4f7a-9998-ff6f05d1ed41)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 51bd9248-0b18-41e5-8a62-ad8c58f69d22)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7f093f83-8c79-4361-ad05-6c8f5abd5b59)(content(Whitespace\" \ + c43af710-5079-4be1-9077-a1b9cb129c6f)(content(Whitespace\" \ \"))))(Tile((id \ - e1640f07-6616-4e3b-984b-dc450a6bd185)(label(true))(mold((out \ + 6f098917-8017-4bff-b096-4afdeea315ae)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3c27e8eb-4eec-4d0e-a200-069eea15262e)(label(\";\"))(mold((out \ + 4be7b6d3-2fe6-4e2c-89a3-baa825a564f1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 231b5583-44e9-4949-a331-b28a92cd214b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 454d0a65-bb35-4776-a9ad-eb5f8e46878e)(label(let = \ + 5eb5b0c2-0592-4c35-9251-768c9cb553a0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 566b41f3-649c-4d91-8abf-23dbb935cba4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - eaddf229-c03c-456d-92ba-61829c5734ca)(content(Whitespace\" \ + 9ae40712-0636-48df-a4bc-b91ddb9da9c2)(content(Whitespace\" \ \"))))(Tile((id \ - 3ab0bf37-42ac-4125-8e53-97ffa6cfa810)(label(f))(mold((out \ + 3daee0f3-74a3-450e-a21a-47492af9b839)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9adba8ee-9969-44f3-8b85-d43128748f9a)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f412a385-a544-4744-834e-1a31d1d53084)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 98c65d51-bfe5-4013-a0a8-51f782896775)(content(Whitespace\" \ + d1a82b37-cff5-42d7-97c9-0abe944a41bb)(content(Whitespace\" \ \"))))(Secondary((id \ - bfd8acf7-a1e9-47a9-8fb2-5c081e0b2792)(content(Whitespace\" \ - \"))))(Grout((id 06b65df5-0379-4b3f-aecb-8bf155c70e95)(shape \ + ec945ea6-0f00-4865-9397-defa21dfd606)(content(Whitespace\" \ + \"))))(Grout((id 790ccb5c-16aa-48b0-b9dc-87bd35339514)(shape \ Convex)))(Tile((id \ - 5cbf5af7-2983-4b7a-b9e2-97d2bd4f0d0c)(label(->))(mold((out \ + b62a5f8b-4c6e-4509-be11-2e2224cbb3d2)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 80529a17-bc7e-4717-a0f5-aa7139bc6ec0)(content(Whitespace\" \ + 2730f7fe-fff4-4ddf-b69f-6e1cc9614f8e)(content(Whitespace\" \ \"))))(Tile((id \ - c8ccd9cc-6cfd-4669-80d9-65d5b3366014)(label(Bool))(mold((out \ + 4cf61217-e831-4313-8065-63531bc1a87f)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b35aca9b-0125-4534-baf8-a3c52144bbc3)(content(Whitespace\" \ + 1ba85a19-4516-4bb9-96e5-3ff2f18262ad)(content(Whitespace\" \ \")))))((Secondary((id \ - 1788e3ac-e9d2-4997-8700-1619e77b4c1b)(content(Whitespace\" \ + 8849ad08-e83c-48de-af24-8e965759f356)(content(Whitespace\" \ \"))))(Tile((id \ - d3debcd2-11b8-4475-820d-10af6ec26e85)(label(fun \ + 6822d5e1-2032-4e09-9777-9659fee0cc30)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2af4105d-3a26-4ec1-affc-268540239e73)(content(Whitespace\" \ + 80044288-1994-4620-81e7-5af22840acc3)(content(Whitespace\" \ \"))))(Tile((id \ - 676d9a2a-d045-4e30-aa75-08aacceaeda3)(label(b))(mold((out \ + 9aaacd74-e7bd-4201-96aa-60f4eeca3954)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7b4b3bb9-0ab2-49bb-9535-13a4dc5aa33a)(content(Whitespace\" \ + 325c4c46-4d8b-4080-aeb4-f68f33c86c7f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2b90b3a2-7992-46d0-85c7-564d7220d786)(content(Whitespace\" \ + 3a0e1d15-e193-49c6-bc97-5ae655b2e4ea)(content(Whitespace\" \ \"))))(Tile((id \ - aff6e94c-0622-4fc0-aef8-d37dd2c054ac)(label(b))(mold((out \ + f71c28bd-ac2e-4639-be9b-543c68a416ae)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bee3c868-d07f-4ea9-ac8e-114e44b4238a)(content(Whitespace\" \ + 50f7f340-211c-4b1d-b020-ea496a80584b)(content(Whitespace\" \ \"))))(Tile((id \ - 57a107f3-350c-4caf-90d2-f9b19caf3dd2)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + fd4c79eb-68d6-4364-8310-088461e64c88)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 92398e33-19dd-42bc-ba65-f748223fdf19)(content(Whitespace\" \ + 69b1a43f-e268-4d87-ba1d-47c2168823fb)(content(Whitespace\" \ \"))))(Tile((id \ - 79ba26a3-029e-42ce-a5f6-e608849dfb20)(label(true))(mold((out \ + 923b329e-606b-40fa-8d31-a55af4403862)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d275d071-0005-43ff-a9c3-f60932cc73f5)(content(Whitespace\" \ + 97a51e4f-dd34-4c87-a908-92cd52f46cb1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 69a16adb-2f59-496f-8a9e-a7f9a4778ab6)(content(Whitespace\" \ + 31d458c7-cb6d-4e3c-b1c3-79602fe2a906)(content(Whitespace\" \ \"))))(Tile((id \ - 4cddd64b-aad4-4393-a692-1229aad0d708)(label(f))(mold((out \ + 724bfe8e-5f4e-4288-bf48-0a84a27769c1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 31699a11-f0f3-4bbe-835c-2d9a0547c923)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + cd72e344-a153-495c-a147-3d64248bea4e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 246914bb-94b5-4385-857d-15a9c726ca94)(label(true))(mold((out \ + 9d1b9872-d062-41ae-a952-28fbad475657)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 9ac692e8-fd99-4364-8fa9-d900a79de82b)(content(Whitespace\" \ + 7cd991f7-f4f6-46dd-aaf7-ab88e1f05396)(content(Whitespace\" \ \"))))(Tile((id \ - 56b9fd19-52bb-4f4f-bef4-de4cae06ddc5)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + d13c7d7f-72e4-4985-992e-a05f763f9ef8)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aad6e147-4ced-4e41-9521-29dd02ca74fb)(content(Whitespace\" \ + 27939642-ac52-4920-a5ad-2ad875dd5f08)(content(Whitespace\" \ \"))))(Tile((id \ - bee762ec-aa9d-4543-aa94-8780dcee6ceb)(label(true))(mold((out \ + a327b9f1-3f84-4aa4-b6c2-11c704041366)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 937d88fc-8b2c-486b-9533-462f90c13af9)(label(\";\"))(mold((out \ + c9beb2a6-91e9-4a92-99a9-18df9dda6473)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 209d44df-86f3-47a7-bde2-71f302b90fd2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 59d846d3-03cf-452b-9725-f9c2a788049a)(label(let = \ + c1d883de-d1fe-459c-b2f2-476c7699507f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4ac2a769-b258-4e87-9e09-05b9e1df89f6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e18f7773-c0d1-4f56-a7a3-595ee339c11c)(content(Whitespace\" \ + f2ccc8d8-8069-4405-91e1-7c808fdf056e)(content(Whitespace\" \ \"))))(Tile((id \ - bdcfa538-d94a-474f-bf0d-a59aa8e41531)(label(f))(mold((out \ + 1429edc3-3c7f-435c-8dfb-c21788c4b15e)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8573f11e-bd23-4638-8864-ab61cc09d5f7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5a5742bb-53a9-4370-8987-5283cbd7217b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2d10e49c-cc56-4a48-ac01-2b7ab70bf0cf)(content(Whitespace\" \ + 2d14b488-6913-4e43-8feb-79fbcb7115d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 93713604-8132-4740-bfe2-f91f72612180)(content(Whitespace\" \ - \"))))(Grout((id b2ac825c-c14e-41d5-b475-0af2705abf9f)(shape \ + c1349708-4d9d-4047-8224-101d11926f61)(content(Whitespace\" \ + \"))))(Grout((id 5a878575-c654-4ad4-a576-e42d4e3fd974)(shape \ Convex)))(Tile((id \ - ed7d0ae5-2e08-4d63-998c-316da7727a3a)(label(->))(mold((out \ + 406cd59d-06d0-49a7-8754-5a941c2b5896)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6f194494-9a99-4d40-9500-2f07c3f9b9a1)(content(Whitespace\" \ + 06ead568-006d-4309-9e3a-96a34f0fbb9e)(content(Whitespace\" \ \"))))(Tile((id \ - f9578f84-93f2-49ba-9361-184e182cd368)(label(Bool))(mold((out \ + 6d420a9a-d0a6-471d-874a-e6fe0c0855ab)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a7b14fde-e4f7-48f0-ba87-cf4519b613be)(content(Whitespace\" \ + a9a0d3c0-bd16-483c-b0b8-f3cffc17f087)(content(Whitespace\" \ \")))))((Secondary((id \ - 16db7155-34e2-4ab2-a55a-21336cbc8ec5)(content(Whitespace\" \ + 8cd4ff5c-854f-4a98-af1a-bd1d4cfea94a)(content(Whitespace\" \ \"))))(Tile((id \ - bf9a5376-28d0-4a89-9a35-ff5398c40061)(label(fun \ + b04c29ea-2497-4ba0-939b-e26dbaa666cc)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fab475ce-6534-45a1-b664-32cacf8ebc4b)(content(Whitespace\" \ + 82d15910-09ac-43ad-ab43-4070ca66c8d2)(content(Whitespace\" \ \"))))(Tile((id \ - eac01f24-a260-421e-9b9d-29de30d8fda8)(label(b))(mold((out \ + c89f82a8-8e1b-47b9-b592-ebfb6f942030)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e8603777-8e85-41b1-98b9-188469481100)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + ddcd6a7c-2dea-4859-b3ee-eb137e96e07d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - b31c69e3-0aee-4628-a3d2-37fc8cc998d2)(shape \ + 385b39ea-ffa2-4cfa-9bbc-35a31877d4a7)(shape \ Convex)))(Secondary((id \ - fc7d961a-a770-42bc-ad2c-0752044409a1)(content(Whitespace\" \ + 94fe35ff-27ad-4181-933d-84f75336ff9d)(content(Whitespace\" \ \"))))(Secondary((id \ - 2af44ecd-cf04-4504-8892-763831adf8c7)(content(Whitespace\" \ + 0cc4c82e-a12d-4ba1-bcdd-5a9aa15e7f5b)(content(Whitespace\" \ \"))))(Secondary((id \ - 5f47194e-e532-4f25-a499-cb5a5b98f79b)(content(Whitespace\" \ + 516c2289-18c7-47d2-944e-9c753d8409f2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6e1f3d98-c081-4fbd-b1fa-ac31d8ee1ae8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4a0ea005-9236-45cd-913b-8e19c02bad26)(content(Whitespace\" \ + d7c97ebe-2be2-4b7c-822f-125fd87e4fc6)(content(Whitespace\" \ \"))))(Tile((id \ - 77b9aa74-7611-4159-89bc-55f3a1e036c9)(label(b))(mold((out \ + be6a120a-2170-4cfa-b5b2-3cc159a42ec0)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3f713165-a7c3-40d2-9a13-10386afc489d)(content(Whitespace\" \ + 743475d0-2ca0-4664-bc76-c5bc84e01ac9)(content(Whitespace\" \ \"))))(Tile((id \ - 422853f0-6b86-426a-9b6b-573f627c4314)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + fb0d2bfd-4212-49b3-b5b9-31ed8e35f9ca)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fb69c827-bacd-4b12-a1ec-75aed8dc3c8d)(content(Whitespace\" \ + 0fc7d1f9-855f-4b1a-b765-80946407b339)(content(Whitespace\" \ \"))))(Tile((id \ - 697fcbee-c3e7-4381-b3ba-dadc5121e8ea)(label(true))(mold((out \ + 861f0601-783e-40c2-9f5a-d0b00fb40a7b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5e9c4dac-6fcc-465c-b41b-e23c7207a212)(content(Whitespace\" \ + 8399d94a-eca2-42d6-b012-2af15b0ef8d2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5137a4dd-0105-466d-a6b1-004906ce67af)(content(Whitespace\" \ + 0dc4b044-07ae-4dfb-a0aa-e37ce2188114)(content(Whitespace\" \ \"))))(Tile((id \ - 87121951-34c8-4ff8-aa35-d1bcf4cbad6c)(label(f))(mold((out \ + 94575a3d-10e2-4a3c-91a3-da5b4151a419)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 38c7acb0-cc5d-4637-b5ed-4829ba4d553c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 68d75235-d51b-49e8-906d-aee3fe00f11b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 39add059-c1fd-4ae0-9c04-915ae75755ad)(label(true))(mold((out \ + 23569d3d-efbf-429c-9300-58d1c8b04723)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6bd28861-5fa4-4c01-ac8e-2cc4bd0ebff7)(content(Whitespace\" \ + ddd5a005-8b15-4fd9-8148-e7db12860c3c)(content(Whitespace\" \ \"))))(Tile((id \ - 10cf3a56-0d60-43d9-9f29-472c0a9d0f90)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 89188388-880a-4076-8cf7-942633c98365)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 20e31d77-bfa3-4c0a-9089-7ddbc5acb42b)(content(Whitespace\" \ + 17656d73-23fd-4259-a5bd-f74dd8dad9b3)(content(Whitespace\" \ \"))))(Tile((id \ - 11752607-8680-4bb6-918f-9f4facdd03e4)(label(true))(mold((out \ + fdc096fd-cff5-4934-ba23-ff0ece6580bb)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7cf700c7-61b1-4da4-9cbe-80dd6b6ea35d)(label(\";\"))(mold((out \ + 1b7905d6-dd11-4b7f-8e71-2a496fd23bd2)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 32735b5e-86ff-401f-8f0b-465d864fba23)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a0f39e86-b682-44a7-bb34-187bba6375c4)(label(let = \ + ebe5270a-0fee-42b4-b375-45127773794d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9b5574b7-becb-49fe-bdf3-9ac4bc7577c0)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ccfe7ff3-74a4-41b8-a225-ac872f661848)(content(Whitespace\" \ + 929d9983-f1ff-418d-b87b-16cba3032d8b)(content(Whitespace\" \ \"))))(Tile((id \ - 1b827ef7-8ba2-492b-aaff-51d0b08ad64b)(label(f))(mold((out \ + dff3f8b6-ee7a-4e17-832b-5efb96ca720e)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ea96e86d-1e1d-4f9a-8e0a-e1bbbefede1e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + dcc1f506-37cf-49de-9abf-542f983d08c8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 13a7fe84-18b7-43c0-85b5-8231c0292f99)(content(Whitespace\" \ + cad1e0d5-a90f-42cd-ba86-5e695bc90b08)(content(Whitespace\" \ \"))))(Secondary((id \ - cddb13f6-712a-4f37-8118-d9df403cc909)(content(Whitespace\" \ - \"))))(Grout((id 06164e6c-0ca8-4628-97a3-ce5f03f898a8)(shape \ + f870d364-994c-49bf-b1ec-9056a961ab2a)(content(Whitespace\" \ + \"))))(Grout((id 1a305147-d99b-4e98-8dff-ed45d3d7080a)(shape \ Convex)))(Tile((id \ - b84ab32d-27ff-4bea-a65b-e1406ec1ff30)(label(->))(mold((out \ + 84c417be-7625-4025-9e98-65130a2a060b)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 047ad6e8-8204-43f4-ac8d-f51e5d516363)(content(Whitespace\" \ + 759173b3-8467-4129-ad15-f986c67ffc98)(content(Whitespace\" \ \"))))(Tile((id \ - 189542d6-5784-48e2-9bde-bc3a1ac46935)(label(Bool))(mold((out \ + f474f8be-f914-4d0d-ba07-99f0e9fe963c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 16f3e09a-cd27-4c8a-bae8-8d8dda88b10e)(content(Whitespace\" \ + 729a763e-9e87-4b83-bd25-51db05e84029)(content(Whitespace\" \ \")))))((Secondary((id \ - d27e1b79-0ff3-4ec6-ad1c-fa91837a5db6)(content(Whitespace\" \ + e72a4ac7-ba57-4618-b2af-a1bad7859604)(content(Whitespace\" \ \"))))(Tile((id \ - 82eb621e-3141-41bd-b780-54d4fe318d40)(label(fun \ + 94ac4ab7-df2a-4775-bfa1-d8acc45969e3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c30f6128-442c-4625-bd51-6b207dbd2bdb)(content(Whitespace\" \ + ffe494c8-3180-43b7-bbca-31081e57ca14)(content(Whitespace\" \ \"))))(Tile((id \ - db25fbde-03f0-4fde-a532-fce4ee36c9d3)(label(b))(mold((out \ + 7702e4ca-2cc5-47d6-bd50-3800bdfd9e33)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f0e23317-b8d0-4b14-a5dd-62255e38dba4)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f1230c65-7bfd-4b6d-8d44-256a29d25285)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cbf2e344-bc2b-4988-86f1-ad2ea49ffe74)(content(Whitespace\" \ + d4c44284-7be1-4acb-b6da-dd5a6a21414b)(content(Whitespace\" \ \"))))(Tile((id \ - 0a7bf2b0-1e40-4c82-8b80-119f187ddaa6)(label(Bool))(mold((out \ + 6b344839-bcb3-4f80-b401-2cb96c42764b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2f1ea14d-6e80-43af-adb0-ba76c9b97f77)(content(Whitespace\" \ + 3822229d-37a4-4234-ac28-2f6c42bb30cd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5fa8455c-642a-48ac-8e63-9d6ecaa92e58)(content(Whitespace\" \ + 56dd2df8-58db-4311-9882-5d466c5158d5)(content(Whitespace\" \ \"))))(Tile((id \ - 541d68bf-b628-4eae-9209-ea46219eaa14)(label(b))(mold((out \ + fcb8079b-cdc8-4d64-961b-87bb7dafa018)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bedbdee3-8633-46e8-bb14-fcef7a175066)(content(Whitespace\" \ + 3eeb844c-0922-48a8-a4cf-9a11301f0633)(content(Whitespace\" \ \"))))(Tile((id \ - 105d38e5-d35a-40a7-afc9-9c3b508a711f)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 0d5784b1-1900-4b43-8a8a-ee5c15da97f0)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 70b7a496-5161-4b21-b196-9ae260847a90)(content(Whitespace\" \ + 8467e3e1-ad96-4f5d-9b39-113a9e290b75)(content(Whitespace\" \ \"))))(Tile((id \ - 33de37fa-e7a3-46d0-9887-5c970f204d05)(label(true))(mold((out \ + 9078ec68-3d78-4273-861a-6ef9f664178e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f3222076-490c-48e3-9b8d-f54df590d9ee)(content(Whitespace\" \ + 260e3a4d-ff90-4aaf-8697-d7e1c4be6ac1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3a2578d7-b939-4ee4-a634-dc8059abede5)(content(Whitespace\" \ + d3b517dc-2018-4231-a0bd-8f87800b9115)(content(Whitespace\" \ \"))))(Tile((id \ - 4d6390c4-d52d-4204-97a1-30f0e0521f0d)(label(f))(mold((out \ + 7f0aae2e-6981-4a40-a2fe-43f14959f272)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 74708d45-4c6f-4811-93de-4523189e4366)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + b422931e-e182-4877-9515-6e8c36c4f97d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 04dfbcc9-1f39-49c5-969c-eb07e2587306)(label(true))(mold((out \ + ab9ba0cf-153a-4834-a4d0-8d4d33021ba6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - dc6bc0a1-9b0e-4567-b1e3-260aded8f84c)(content(Whitespace\" \ + 183bdb34-9709-4869-b996-4ab3c63e4e1b)(content(Whitespace\" \ \"))))(Tile((id \ - 213076fe-ad6d-47f6-9c71-41b1120cfa7d)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + fc741fde-7e09-47b3-8f8a-1fc60eafe060)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 60fb9e75-75ff-405c-be95-45bd10a55acb)(content(Whitespace\" \ + 76f66c98-2c96-4fb6-b697-b536671b2984)(content(Whitespace\" \ \"))))(Tile((id \ - 3460ed7f-7888-49ef-a6c9-0a9880c01706)(label(true))(mold((out \ + a2701254-a4d2-4e7a-86bc-a1b1689cc1bd)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cdbea899-1534-4944-8e68-6205942615bd)(label(\";\"))(mold((out \ + f0d96485-31a5-4e0d-a2f7-2eebf8a84e6c)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 341dfd2f-b694-419e-82f3-42b57a0ab5c9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1fe0bd69-7327-4bfa-a88a-0f435a111ad3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 58c25d88-386f-4029-a5ce-9a66cd7f3861)(label(let = \ + 9fbb94ec-b0a9-43c6-9ce7-690cc5778911)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5ebeff21-1ae9-4b5a-a9dd-dd18e4e55bb9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d0b179ef-b39f-4e0b-a0a3-718233c45530)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - de4ab77e-dcb1-4e71-86c6-c3beb4dc4402)(content(Whitespace\" \ + 9c8f1a40-24fb-48f7-9c85-cb98317d5e24)(content(Whitespace\" \ \"))))(Tile((id \ - ddbfd7c2-71f2-4287-a290-7b1ddb64c0f6)(label(f))(mold((out \ + ff1bbab3-c584-472a-971e-9f5ecd822b8f)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 562ba7d0-49f0-433d-90a2-23878c49f43c)(content(Whitespace\" \ + b7917bd3-af6f-47af-accf-80292068118d)(content(Whitespace\" \ \")))))((Secondary((id \ - d3b4654d-2960-46e0-95c2-257bbb7cf4aa)(content(Whitespace\" \ + d4fa39c5-5542-40f5-acc0-a07eeb9ffd1e)(content(Whitespace\" \ \"))))(Tile((id \ - 2e04c8c8-2563-4a75-b537-9148ae8df736)(label(fun \ + a757e982-ae14-4dff-830e-c9c32b9a82aa)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b7615011-85f7-44e3-9639-c42a9ffe4770)(content(Whitespace\" \ + 475f8f5c-4814-43a6-9804-9291f031b280)(content(Whitespace\" \ \"))))(Tile((id \ - ae6bd94c-e8ad-4d2d-8d91-6f1fcfa88725)(label(a))(mold((out \ + d612c8dd-f408-40da-8100-0d1819d9edfc)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f5f77bdc-330a-438f-a0f7-c360c0fff8be)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 892435f8-4d13-4d71-ba19-0e1c7a644a57)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - d9e63c3c-f72f-43a0-b96f-080430114f0e)(content(Whitespace\" \ + 53fd9f06-4a3d-497d-b55f-d29210c5a37a)(content(Whitespace\" \ \"))))(Tile((id \ - 86d5cf2c-52e7-43f4-9010-0c4c94d70751)(label(b))(mold((out \ + 1aa627dc-f3f9-47d8-8070-6243bc098816)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cdf4c3bb-f419-46e4-a64b-41c4c1333f3d)(content(Whitespace\" \ + 30c18950-0eec-48a3-817b-b287d4c2278b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bbe7464b-c3cb-421a-8618-b5aa0d0edab0)(content(Whitespace\" \ + a490d8e5-b043-4bb6-852e-eb6e08ed8a3a)(content(Whitespace\" \ \"))))(Tile((id \ - 3e4b0bdd-3e68-4f12-8bc2-d17f6056ee2d)(label(a))(mold((out \ + bc0b0303-9ad2-4530-bb61-eea0c7a1f8e1)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 418df9ee-b794-4953-9cbe-f3279474e4b8)(content(Whitespace\" \ + 001da831-7a5d-4a88-b1b5-8b1779043c7c)(content(Whitespace\" \ \"))))(Tile((id \ - 61a97d93-48d8-402b-9f67-5a283b18c5d9)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 40bcad1a-e2af-4703-a86a-f4131003ce1e)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 09e88407-5edb-4bac-8ee4-1ad7df50e0a6)(content(Whitespace\" \ + 5219c371-d726-42b3-a039-38d756f723d3)(content(Whitespace\" \ \"))))(Tile((id \ - c61d45ed-cec4-42fb-abcc-f4a5f125950e)(label(1))(mold((out \ + 332c7fc7-e2a0-46d6-9d5c-83d087297ba2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a917be30-7c5f-4298-aee6-38851c2660cb)(content(Whitespace\" \ + b7afcbc2-b4b2-4ce8-88c9-d09fc5ef65a0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7b259183-e434-47b2-812b-db9642bd94c5)(content(Whitespace\" \ + c3c4efcf-6257-42aa-8abf-9f21f3a06074)(content(Whitespace\" \ \"))))(Tile((id \ - 9301cf6a-70a8-41bf-a622-49c49fd00754)(label(f))(mold((out \ + 346592ad-d92d-4fb5-8129-5ea9bb2e7cd3)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7b9ee891-5f0f-4a58-a32a-e9db8f1ac4f0)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 8c6e7c6e-498f-47d8-bc6e-35d04efebcdd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - dda4c579-0408-4a51-b1dc-6f97ccdd2e05)(label(1))(mold((out \ + 3ab39d13-3668-4a95-a8a9-7d074b5ea65e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 27b1be15-9e4a-43aa-87f5-26de83265103)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fba4b3d2-e2e6-4182-a14f-c73394a01b53)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd081940-f5aa-43bd-8a30-720800cddeb0)(content(Whitespace\" \ + 543ef4ac-d0a4-407b-a12e-4a22506c1860)(content(Whitespace\" \ \"))))(Tile((id \ - f6192cc1-0d1f-4ea4-bb9f-3666c704a62c)(label(2))(mold((out \ + c2676e99-8ea7-4c43-91d3-7665aa54de9b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - dff5f94f-934b-4588-8789-dfd06aa0fdb9)(label(\";\"))(mold((out \ + 6691affe-3599-434f-9958-fde848721f29)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6a653547-3323-48ae-8e53-9da33293859b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a18871d7-6f65-4b54-a155-4618c6093206)(label(let = \ + 9410af55-2a27-47e7-b439-1d75bceb2687)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b29f69cf-4e26-49c6-bd4a-28cce5226084)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 21140476-577b-466e-b4d0-34c4817295a8)(content(Whitespace\" \ + 40b8a3ff-604b-4211-8c50-901c9f80e2ad)(content(Whitespace\" \ \"))))(Tile((id \ - 031c0681-9ef4-416e-9061-b617ef8b6043)(label(f))(mold((out \ + 7efd79cc-0667-43d5-8276-4c988598bc12)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1fa066e4-b63b-4947-807e-63ba8187294c)(content(Whitespace\" \ + 4ce809c9-8946-4507-b552-f79744e225c5)(content(Whitespace\" \ \")))))((Secondary((id \ - c4cf3db8-07b6-48e9-badf-0fefbd343a40)(content(Whitespace\" \ + ddef7c88-21b9-4912-8524-60681e3ae1fb)(content(Whitespace\" \ \"))))(Tile((id \ - 8d0afd46-38a8-4d86-ae34-f16e7127521b)(label(fun \ + 00742cd9-5e06-41c8-a5b4-b162e6d53203)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 47cc914b-c68b-44e5-abd4-66cf763e18d9)(content(Whitespace\" \ + 7961e384-77e0-446e-871c-73b8c06ac2ef)(content(Whitespace\" \ \"))))(Tile((id \ - 35fe143c-210c-4fe4-818b-2b6d2ad67057)(label(a))(mold((out \ + b69b7b35-be06-47d9-ab0b-dd96f675f91a)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bc6a873a-8e9d-4901-970e-4e769873040a)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5dcbf26c-2b42-4772-859d-5fd3d8640790)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2fdf6d92-bf05-497d-b1be-082ae2bfc752)(content(Whitespace\" \ - \"))))(Grout((id 08fd8118-cf68-46df-9f4c-e60d517fcb32)(shape \ + 756d30df-b08c-4f9a-8726-d8f1f234ccd5)(content(Whitespace\" \ + \"))))(Grout((id 51d13b39-2b0c-48d2-8bae-7443be55c20c)(shape \ Convex)))(Tile((id \ - 7c634ee5-b6ad-4e60-a1ac-8f56da4145c7)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 3a452939-6af2-4826-b2af-2ca581f9b4da)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a63a12dc-947d-454c-b1b1-7161215aa674)(content(Whitespace\" \ + 0215a642-1a1d-4b5f-bf14-4e53425fae58)(content(Whitespace\" \ \"))))(Tile((id \ - 0f9334ee-1bdc-40cf-9b6f-58fe6bdc93ab)(label(b))(mold((out \ + d1015a90-f58f-430d-b7c0-e3eab8db92e3)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - df144b08-6d20-4e11-8a10-0af0c509eb9e)(content(Whitespace\" \ + 9c811e2d-2605-4d9a-9ef5-c703405f9a0b)(content(Whitespace\" \ \"))))(Secondary((id \ - 54d73ad5-4629-4898-8a74-12e979918871)(content(Whitespace\" \ + 77f0afb3-0ace-47ba-af6e-3abc5ff5860c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 31c6a068-93b2-42c9-a71d-b16d3c7f048f)(content(Whitespace\" \ + 134aa00e-6db3-4b9f-950a-02838ad6e96a)(content(Whitespace\" \ \"))))(Tile((id \ - 3f505df7-a328-4d45-a811-2c6c355cd953)(label(a))(mold((out \ + a378b042-5542-46b3-9a27-43e84cc254d3)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 11ee247a-91a9-4169-a85c-0a13c293b2de)(content(Whitespace\" \ + fde71fec-574f-4242-b196-ca1d2965a499)(content(Whitespace\" \ \"))))(Tile((id \ - 34ca9c74-f656-4b8c-8afb-6433b3488aba)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + f0d7606e-fa27-4984-8a7c-2163ecb88e32)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 05af1d13-4d8a-4b67-85d5-501c72bc0d2c)(content(Whitespace\" \ + 68ffbb21-af80-4457-a12c-5f2dee03439d)(content(Whitespace\" \ \"))))(Tile((id \ - 0fd4bd7c-33b0-42ff-ad0e-7b041c6a4854)(label(1))(mold((out \ + d8b6a5fc-a995-468c-9879-fc78ce64056a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7b8c4ad6-43ea-4219-a589-b62c7573826c)(content(Whitespace\" \ + 9adaf2e2-acd2-463e-92c3-f464804a5266)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9410ff28-6598-4d54-a937-8d528a4d52f5)(content(Whitespace\" \ + ee073d2c-adc0-479a-a98a-633f665a8d5d)(content(Whitespace\" \ \"))))(Tile((id \ - cb3a4fbc-6ac1-4633-9873-5182610424ff)(label(f))(mold((out \ + 7a328416-67f2-497c-8620-4844f189ae19)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 20263dd0-e85b-4840-9b0a-5ea37bf300b5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + af64ba3d-874c-49d1-a59e-b5dc4a9b69ba)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8e8285c8-a16e-4c6d-9c58-180436ca454d)(label(1))(mold((out \ + 7838ac57-dcc0-4be9-a9ba-fe7453310957)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 08e08e23-695a-4f12-ace7-e7f27ecb372a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 349893ea-27cb-4a50-93a3-b2aa3ec127e4)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f7f40d1f-9c7f-4f5a-8509-4651a853ee11)(content(Whitespace\" \ + 9250f90d-5fc6-4eb7-af67-648ecff7d044)(content(Whitespace\" \ \"))))(Tile((id \ - 1a5f1393-c37c-4e56-996e-1b896672296b)(label(2))(mold((out \ + 4558d9b6-2487-4be5-8fe1-8b9a7387b616)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9ce44ffd-32dc-4159-9f2f-6d71d7fe5657)(label(\";\"))(mold((out \ + fc197af3-e75d-4303-b7bf-1811d0ce7b07)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 708a3c9e-7292-4e02-a2e2-3debb4ae1184)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f99b4fc8-4211-4b61-953d-b345391a2dfa)(label(let = \ + db4302c5-0a40-4ae6-9ad8-1db5605eeea7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 63e4674f-475c-4edc-8a72-28a66aed92c5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 79116db3-94b8-4afd-8ed6-c05838975946)(content(Whitespace\" \ + 5be93333-f90f-47d6-8625-5d1dd31c47f9)(content(Whitespace\" \ \"))))(Tile((id \ - f4b8b596-cf5c-4544-be05-8f4076334668)(label(f))(mold((out \ + 8c25d37f-e094-47ec-8fbb-a51ef8e61401)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 93fcc7e9-2ccd-4dad-b55b-932bf474735f)(content(Whitespace\" \ + 7033d52f-67b5-4d3e-8047-9e936cbb126d)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c38d970-3c9f-4c85-aeb9-48cddfbcf8d8)(content(Whitespace\" \ + 43b00301-5052-49e6-aed6-77020f376322)(content(Whitespace\" \ \"))))(Tile((id \ - c0cdf1c5-37e0-4f27-9d65-1f7e8b7974b4)(label(fun \ + 72c533dc-2ea7-48e1-b21b-473e8e6e744c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a4aaa32d-e542-49c5-af81-0f83b813893f)(content(Whitespace\" \ + f0788970-7079-4007-a667-ab130036abda)(content(Whitespace\" \ \"))))(Tile((id \ - 96f2f3fa-666e-4636-a17d-cf906d747c29)(label(a))(mold((out \ + 05062ecb-e9e7-415c-a10b-4a4e93f87464)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a2ba97d7-5816-4de0-bfc7-bccecf3f7e1e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2c3d8ad0-e032-46b9-af22-ef30378dd35e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e90d08d3-4008-47f8-9719-8e5850767521)(content(Whitespace\" \ + c24ee2dd-ce61-487e-b793-a36a1b251701)(content(Whitespace\" \ \"))))(Tile((id \ - 1df5e4a9-efbc-446f-b348-e2729fa7bbc1)(label(Int))(mold((out \ + 1b6c9850-b0e4-4511-bd7c-46e08a5907c5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9c17b513-e699-4468-b715-e4b3bef16d7a)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + ddd07d5f-6d77-4851-af97-0bbada96a1cd)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - dc6fe2ac-0844-4831-a69f-8268fee4cd5d)(content(Whitespace\" \ + 95dd3fba-5691-48ed-bece-f4f302e8bddd)(content(Whitespace\" \ \"))))(Tile((id \ - c7a314cb-ce89-4011-814e-cafb5de89929)(label(b))(mold((out \ + 997880de-9aba-4146-8a6e-0f2b38975b33)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ecd17226-2fde-4fa3-8ac0-3c5f2b26c782)(content(Whitespace\" \ + a4d39c6b-facc-4cbb-8e88-f76c3c21bc96)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f35b75f3-dbcc-48c9-944c-c64cfa85c0cc)(content(Whitespace\" \ + 20ea35c7-7232-4558-9b28-f9a8568613b1)(content(Whitespace\" \ \"))))(Tile((id \ - 399863c2-7096-4af6-bb8b-69906019eb47)(label(a))(mold((out \ + 63690bc8-6017-4973-912e-c80ff4c94543)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 113a25c0-9431-4175-932c-78c5f11b03af)(content(Whitespace\" \ + ee3eda93-22e5-4e78-8184-c2361594375f)(content(Whitespace\" \ \"))))(Tile((id \ - c9c0de07-5476-464b-8e92-b9a68cb7994e)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - bf427820-4f8e-45f6-8284-73d63c6b617e)(content(Whitespace\" \ + 592396ec-4030-408d-88b5-8e361e651fd9)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 5ae65e6c-2299-4f1e-a4b0-5a1fc6934c49)(content(Whitespace\" \ \"))))(Tile((id \ - 359007d5-6cd8-441f-9c23-05b0e723cb23)(label(1))(mold((out \ + 53507e7f-c5e1-4dca-9037-f0b516aee23d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9282171f-8148-467b-ad22-90e959765351)(content(Whitespace\" \ + 39e860f3-5bbe-413a-a749-0dab5a3ef9c6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e00be104-2058-4558-81be-4c95e7dba78c)(content(Whitespace\" \ + 71df145c-828d-4fee-9167-eb759c499815)(content(Whitespace\" \ \"))))(Tile((id \ - a58bd02c-1452-4a03-9c84-f6bddd6119dd)(label(f))(mold((out \ + 1299fe39-5ef2-4d41-a4f4-471c449d69ca)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2deb153f-02e6-49b0-97a2-7fa27e44684e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 89f29068-538a-46d1-b9e1-f0a73270e8e5)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 08f00ed0-7003-47db-b330-939913302b0a)(label(1))(mold((out \ + 6018fb5f-2c57-4acb-aac9-3b3c93c521b4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6e29a81c-3bae-4035-8877-6e2e7c4d1951)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + e8f92be1-04d2-4e36-9be4-56a1745be3af)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 596659fb-ee22-4335-b1f4-01f31c811ecb)(content(Whitespace\" \ + 5df69079-5a69-414e-aae9-fa933a8a6b93)(content(Whitespace\" \ \"))))(Tile((id \ - 6500abfb-77d1-4b10-8d77-721c7e37c19d)(label(2))(mold((out \ + 0a38cf41-ecb3-45c4-a511-3e4ca484f114)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 51053908-2b8c-4779-b9a4-b02be031e7ea)(label(\";\"))(mold((out \ + b13bc0f8-18f4-4b17-82e1-81b37665a206)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 59c89ff7-2830-4fcc-9d7e-fa6772eada69)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fe420401-4767-4801-a917-8196ec3b9195)(label(let = \ + a26830d9-c5b8-4469-b1d1-6821d104d13b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f2a215ef-4114-4a54-8a71-f86d7e04c089)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6c023ff7-7387-4969-9430-7a5f358234d2)(content(Whitespace\" \ + 3f375f1f-64da-4b1f-8c25-cfcc3e6f27c3)(content(Whitespace\" \ \"))))(Tile((id \ - fb4ad5d8-8a71-4cb9-a6bb-e886aafebc1e)(label(f))(mold((out \ + 6fa50cb7-a2f0-4056-bb53-75b7f1445146)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4e30b722-84f1-4351-9558-3b22b4138087)(content(Whitespace\" \ + a3de2efc-0bc9-4afc-a617-978a48b4a2ac)(content(Whitespace\" \ \")))))((Secondary((id \ - 07bd7835-aba9-4576-a6b0-5b215203f830)(content(Whitespace\" \ + 9bbb8ff9-e72f-4d7e-9064-a7b65a698017)(content(Whitespace\" \ \"))))(Tile((id \ - 734c36fd-3278-44fa-a630-27c45846ad45)(label(fun \ + 86e40599-87af-4cfd-811e-0f374665de65)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 28c0b0f3-1d07-4291-b94e-84c3edb8411a)(content(Whitespace\" \ + 15d656ca-7eb8-42a3-a0b6-466542dce7e4)(content(Whitespace\" \ \"))))(Tile((id \ - be3344ab-13f0-4196-a242-d58ddedb4086)(label(\"(\"\")\"))(mold((out \ + 8acd0a2f-12bf-486a-b4b0-b6db08e1679b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 74bca819-f017-4337-9415-6c7abcde4ccd)(label(a))(mold((out \ + a9a214d1-7580-4ec6-8f1d-2f892e2522ac)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 433b7881-2167-4c49-b41f-34eedd90a1f5)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + eb1f6ba1-c70d-41e4-9523-3cf0ded83e93)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c90e84a5-c611-4465-abe0-f4a0f0dad107)(content(Whitespace\" \ + 312bdde5-2fd0-463e-8693-0cfba3cffb22)(content(Whitespace\" \ \"))))(Tile((id \ - 8a2c42e1-3f6a-4f9a-afa9-d8544edeaeb3)(label(b))(mold((out \ + ea40f3f4-a72e-4c64-8994-b26ac1e3a8ba)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - b2e834b5-ed02-412a-a5ef-34a5c16b9847)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3d50f394-3af5-46d2-9136-def8d2ab9576)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 892d9e90-2a2e-48ec-8487-8695555e6dc3)(content(Whitespace\" \ + 81670e1e-5474-486f-b130-e5131e5bb49a)(content(Whitespace\" \ \"))))(Tile((id \ - 1888f269-f7ef-45d2-8512-8d395f78f772)(label(\"(\"\")\"))(mold((out \ + ac1664cb-074a-4953-ac1a-e18dadc49879)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2640ea25-cae1-4f62-bfeb-0ee5e6e2429a)(label(Int))(mold((out \ + c23c11d7-d91f-4a51-8245-c2fe190b8083)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 66c241fc-9f12-42ec-9efd-d0695cf61f8f)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 44929c70-8a20-49a7-b9cd-eee62809aded)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e70a85e3-9a91-4a5b-8464-6757d36b6cb5)(shape \ + 7d4579d4-91cc-4e50-86e7-50f5d7c9a419)(shape \ Convex)))(Secondary((id \ - 4a5a880c-1ee3-48ad-912b-5d7ca04bd101)(content(Whitespace\" \ + 7ad092f4-8bfc-43ea-a4f5-27a0a0955e78)(content(Whitespace\" \ \"))))(Secondary((id \ - ec8115ee-947b-4f7e-8bf4-9ecc99e9e230)(content(Whitespace\" \ + 58211cfa-80bf-498b-a91f-fb8be112bb3e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5f2f52cd-9547-44e0-b5cc-8cfe90aaff44)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e97f099b-5db0-4e16-995e-0e9f35f7d7b1)(content(Whitespace\" \ + 9b50c679-d94c-4e7d-939f-2fbe45d10bf8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5e268789-9fbc-49bf-a7c8-be69e68b3bdc)(content(Whitespace\" \ + 4daffb6d-9d40-4eec-b0fc-1d38cdd2d771)(content(Whitespace\" \ \"))))(Tile((id \ - f96c361c-d526-466b-84c8-7de23fbafafe)(label(a))(mold((out \ + 4983e179-2e98-4723-bb7d-1dc342c0a4f8)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 78de6f1c-120f-4090-a3cf-b6970752ec5e)(content(Whitespace\" \ + 75b604b0-ac95-433c-ae66-2c8ff7318cb6)(content(Whitespace\" \ \"))))(Tile((id \ - e0463001-bf12-421f-b5cb-c2aeb6be4e0a)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 328ac98b-1f02-41c9-b5aa-c3d8fd43add1)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0433e19e-1b31-4c8f-aa0e-bbcdc08ed996)(content(Whitespace\" \ + 5d50b4f8-fdbf-4c14-b2c1-a7caa962565d)(content(Whitespace\" \ \"))))(Tile((id \ - 21d714f3-d2a5-4ac0-9488-b3db501e68cc)(label(1))(mold((out \ + a305c41e-4f8f-4af2-ac3b-85acdbc57af2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a71562c6-dbdd-4ba9-a72a-e27d48aa24bd)(content(Whitespace\" \ + 1a0c311c-c305-46d5-8231-d44f115c637c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8ea80c4-6496-4ce0-a907-98037672582b)(content(Whitespace\" \ + d7204ed8-cf90-424e-b030-08361e345816)(content(Whitespace\" \ \"))))(Tile((id \ - bef81cac-3090-4851-b59e-4034bf3f7e9e)(label(f))(mold((out \ + 175031ee-3d1f-43d8-9e85-9e4d85747c6e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ac4038f0-7de1-4828-9dea-d81b7ff60c8e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 20f42551-cf83-4d2e-b184-9549f6cd3466)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ea845820-5614-4597-b0b8-34e9b1de2e3d)(label(1))(mold((out \ + 1f6d5bb7-2f78-49b2-a5ac-6a67f9c6a2f4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f35a801a-8a84-431d-a9df-544c86be377b)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 20f59798-fe3c-4a6c-ae33-d9c1510cbb26)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8313aa88-1111-4b7f-a9cd-b56edca2aef1)(content(Whitespace\" \ + 2c624608-4e35-46fe-ad73-01c59419272f)(content(Whitespace\" \ \"))))(Tile((id \ - 5de2a053-2140-4836-8e14-224bbbf67cc0)(label(2))(mold((out \ + 8b6a0f94-a405-4e67-af69-1b20a09a5918)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 74dc559d-c97e-41a4-a44d-9ef55f467189)(label(\";\"))(mold((out \ + dcfae7ca-a255-4b73-b464-b64ef146de0d)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4f8e4039-136f-4377-89e5-0de00c9c5cf6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4ba7d136-2a5d-414d-955a-8f66fce3bd2d)(label(let = \ + 76c9b253-b8d4-4279-9e2c-551f5bcdbaf7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2feb1f6e-34cc-4cc5-b342-44af1cc12543)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 89151a29-cce6-4e8b-9c00-6faf9e160b4a)(content(Whitespace\" \ + 3561bf77-c6e4-4920-b2c7-8bb4a93038b2)(content(Whitespace\" \ \"))))(Tile((id \ - 4dd75df6-e379-4371-9ffa-34f0c9ff7b61)(label(f))(mold((out \ + 7fda9988-a993-48c2-b2d9-904b32f289a4)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 514bdbff-46e9-4315-94b4-97783bd08e1b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3953807d-847e-42ab-b174-7fe458198617)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 48378b91-cc9f-406a-98a4-8d74ac57e788)(shape \ + fc718f33-df92-450c-ac86-802e8f915d55)(shape \ Convex)))(Secondary((id \ - 67d6ed9b-e49a-439d-b198-b354334ac8ef)(content(Whitespace\" \ + 4c192394-c97a-4942-9dd3-1236aa5d6171)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9243b820-716b-4cdf-9edb-18a66aa708ce)(content(Whitespace\" \ \"))))(Secondary((id \ - d6f626ee-ef80-4947-894a-075e9b008492)(content(Whitespace\" \ + 2829630c-4aba-4bd3-a0dc-bae7667b6a16)(content(Whitespace\" \ \"))))(Secondary((id \ - 071e4f9e-9bc8-424c-a944-1c5899681627)(content(Whitespace\" \ + b0070bc2-3a9f-445b-b59c-f881852ecb76)(content(Whitespace\" \ \")))))((Secondary((id \ - 5394fd6d-55cb-4d03-985c-02b3d8961366)(content(Whitespace\" \ + e168d383-d52a-46ba-8339-33203b8837d9)(content(Whitespace\" \ \"))))(Tile((id \ - a0186f29-bd0a-43f1-a0f2-22d73a560b5d)(label(fun \ + 935d0dca-0570-488e-bba0-12617adb81b0)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7c2b3512-7912-44e7-ac9a-799ca399e4d2)(content(Whitespace\" \ + 99bf2b71-f951-4eea-8e2c-865c7aea6e9c)(content(Whitespace\" \ \"))))(Tile((id \ - c1f22398-3f61-47eb-9d20-ba339a9a8d2c)(label(a))(mold((out \ + 2d097e81-f216-4144-b475-9f0667e0bc37)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c4bba7fb-230c-4b77-9cef-718a198e2327)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 956ce9ec-77d9-4641-82f1-adf78db82d9d)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - d1c3d11f-29f6-4d60-8b8c-c11cf055c178)(content(Whitespace\" \ + 381a5bf6-1224-4a2d-b204-7c266703c632)(content(Whitespace\" \ \"))))(Tile((id \ - 4f933492-4ade-4884-a3f1-4ba1eee9297f)(label(b))(mold((out \ + 6ca4fbf4-9ed3-48bb-9b9c-96743f146158)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5680848b-ce89-44dc-8028-81bd8dfe6e45)(content(Whitespace\" \ + 6bdd8cfb-fc79-4e2c-8b8c-e3d3dfb7bef1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - df436f74-5947-456b-9981-9e3018118299)(content(Whitespace\" \ + 435115a5-3606-48d8-8ac2-29d5b8f30c40)(content(Whitespace\" \ \"))))(Tile((id \ - fa6a29ae-3613-4579-bacf-2e07389c09fb)(label(a))(mold((out \ + ec4ea498-5768-43db-b282-ad48a94014aa)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6e6f3ba2-8ead-4042-b51f-c7bcdaa4c458)(content(Whitespace\" \ + cd97908d-5d8d-4716-8c9a-a456e03c5b83)(content(Whitespace\" \ \"))))(Tile((id \ - e56f5829-3e0e-4a9d-9631-85f007248a66)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + a42db2d0-d2b9-4ecc-9ec1-428769bfeae9)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a327b0a0-b24b-466f-82fe-4ea35b4b617b)(content(Whitespace\" \ + 4d140807-e6db-4f94-ac28-13a4fc9bdc35)(content(Whitespace\" \ \"))))(Tile((id \ - 3c4f6c56-8f8f-4d2c-911f-958798355c0d)(label(1))(mold((out \ + 11628792-79c6-4d1b-9db1-120a43ff9f23)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 981d6f5a-a9e0-466f-a4c0-d4618c137a0f)(content(Whitespace\" \ + aa40938e-dca8-4d96-8470-2bd894f1e12c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9b237eee-32e0-4ad3-8e5e-5f3f4d7d5f6d)(content(Whitespace\" \ + 67b0e1e4-ee7f-45a8-8c87-5b553a9dcd34)(content(Whitespace\" \ \"))))(Tile((id \ - c758ecb8-91ae-4cf2-b482-eb2c61f6a4d5)(label(f))(mold((out \ + 5a76410c-754a-4367-8577-09d73fb039bd)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7c826751-a5ac-49ea-925d-a49796671502)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5ea61f5f-e858-490b-8ed1-8186cddcd0a4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 78c75c87-1bf3-49ef-a53a-efe6fd959f51)(label(1))(mold((out \ + e440302c-df0d-4b3b-924a-779c00e131b8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4a884c1f-cf71-47bf-a614-19d345ffd1ca)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fffcb647-fcf0-4724-bf3d-a8730d05cee3)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 160f714e-76b5-4219-8495-8bbeb9896f8a)(content(Whitespace\" \ + 4a262d6e-5e58-4248-b974-f1d2624a0474)(content(Whitespace\" \ \"))))(Tile((id \ - 3b8fcb74-e9f0-4169-b6d8-b695a45fdcae)(label(2))(mold((out \ + 4df1b8c0-e2dc-4f14-b541-b6c3735647aa)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0e13eb73-fcf5-4568-a51e-5a41c56a73f8)(label(\";\"))(mold((out \ + 141dcfa2-a499-4484-a6c5-ec818712509a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cc9fccbc-dc1c-46fa-9aae-36da349cdff1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2664e9ba-80c0-46ef-ab8c-05c6eb8d2ba9)(label(let = \ + 69e9cbf3-7d18-47a1-894e-74c78142969f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + db71d307-2ef7-45fa-aa6a-29f51fb7de3d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 886f81a1-cd66-4790-992a-faef2daf7824)(content(Whitespace\" \ + 91d66f25-c8e0-44b0-a6ba-7470792df230)(content(Whitespace\" \ \"))))(Tile((id \ - e91fdad4-82bd-47f7-a425-881b8b422fce)(label(f))(mold((out \ + 964ce16b-db32-49fc-b16f-544c9e7c5559)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 68599205-45d7-4614-94a9-ac84b48fc937)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + a7c2baa4-e944-4c07-b883-c2ab12a0b859)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 59c65e10-9a81-4070-ae86-44ff5b9ce289)(shape \ + 86c734d4-789f-467c-9aea-371d78f13a31)(shape \ Convex)))(Secondary((id \ - 5fe21479-94f2-414c-92ac-a938e4fb0062)(content(Whitespace\" \ + 56d5a9c9-9757-45dd-8b68-d861b9e9e590)(content(Whitespace\" \ + \"))))(Secondary((id \ + abcd2e5f-7cae-4932-99aa-7dd185a9eedd)(content(Whitespace\" \ \"))))(Secondary((id \ - ccafed6f-a493-4e20-9dc6-d8e2669a5ac1)(content(Whitespace\" \ + 8e002a2e-b200-48f8-ae88-33f662d2796f)(content(Whitespace\" \ \"))))(Secondary((id \ - 1dd7b3fe-4b2d-4933-8ca4-ccaed398f740)(content(Whitespace\" \ + 04a7b375-2688-4fc5-99a9-38b5eaa15538)(content(Whitespace\" \ \")))))((Secondary((id \ - 51e9905b-6f53-4cf3-8ca6-52fda987cb48)(content(Whitespace\" \ + 29177e5a-f49f-4d15-ab02-906e13feef06)(content(Whitespace\" \ \"))))(Tile((id \ - 94630f19-e1be-401f-9b44-076440cb1a9e)(label(fun \ + 9197c21b-8125-4a1c-a545-a1694f36921c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f44f94cb-b2a0-49fb-b71c-b9baf92c9f24)(content(Whitespace\" \ + eb29b5a0-6d84-46c6-a92f-994bdbb99f89)(content(Whitespace\" \ \"))))(Tile((id \ - 4622dd39-aba3-4668-adaa-654ed961417b)(label(a))(mold((out \ + e9ec2156-97f8-4352-b910-e844b867cac5)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ec32b24b-c1f6-483b-b5d5-fd06024a933e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5eb3dfe5-c69a-4400-9373-f1b3a5ea5850)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5ce24499-96ae-4a74-b2a9-13cddb41f580)(content(Whitespace\" \ - \"))))(Grout((id b08c9fee-9e36-4b3b-b30c-b0cf238462ee)(shape \ + 73d20fe3-1d78-4d89-b2a5-d980a41b6bba)(content(Whitespace\" \ + \"))))(Grout((id e9c578b4-9fe0-4e4b-bbe2-008874516c16)(shape \ Convex)))(Tile((id \ - c003c497-f096-493f-9b4a-9c7b547de3b9)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + c4f24eb2-a855-489c-bd37-ada69350a5dd)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 6ff0b2a2-3cf4-44e5-9db4-5dd98f4f9ca7)(content(Whitespace\" \ + ceafad7d-abdf-48eb-81c9-22e640489ba8)(content(Whitespace\" \ \"))))(Tile((id \ - 34f536d8-c020-4dbc-a269-1f7f0ecfd398)(label(b))(mold((out \ + f9e91a1f-1fe9-4ce7-a01c-f5c823d3c8d9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 13599e43-14f1-445b-840e-51d3be3f6e7b)(content(Whitespace\" \ + bf28c0ff-5303-45b7-aa99-5703787d3db6)(content(Whitespace\" \ \"))))(Secondary((id \ - 3fd11cea-d5c4-4ef9-b938-6d0d036ee281)(content(Whitespace\" \ + 40dd2f6a-5e7d-4cf9-a4ce-6fc0976c13c6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1b3b4787-4bb2-4274-9835-95747fd0f36d)(content(Whitespace\" \ + 4610b348-cfe6-48e6-bbb5-547430d1413a)(content(Whitespace\" \ \"))))(Tile((id \ - 577ef5ff-24ed-488b-ab2b-9047226f4990)(label(a))(mold((out \ + 8e07d0d6-29e5-403f-8d3e-22a29a8e37b5)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 51fdd1b6-69bb-4df6-aa37-b305c5876e34)(content(Whitespace\" \ + 8aa8da6b-778e-44ee-98b0-8720f09f80e4)(content(Whitespace\" \ \"))))(Tile((id \ - 15ab0441-624a-4370-8461-c15ff7c5aa2b)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + ab90af2d-ad92-4757-b2e9-aaa8c8ed93a8)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6a0db09c-6038-4b14-9689-ea0e3e922284)(content(Whitespace\" \ + ba42d147-5763-4b54-aae0-2827a3276415)(content(Whitespace\" \ \"))))(Tile((id \ - 53b13857-d843-47ff-a268-05d4b137f48b)(label(1))(mold((out \ + 685e4cd3-ed2b-4d9b-a0a6-dcacc53419fd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6ffb31b7-7893-468c-be10-c1ca3aeec81b)(content(Whitespace\" \ + edbc8700-890a-4991-b890-d698192358e9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aaac161f-e37b-458c-8db6-fb176d656910)(content(Whitespace\" \ + b6a5e63e-f20b-4e10-8f8e-ad0d6e7ace14)(content(Whitespace\" \ \"))))(Tile((id \ - 1a524a9b-dd67-429b-845d-e3eebc20f9d3)(label(f))(mold((out \ + 1854bbad-ad53-4028-b3a6-e2ded3932912)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d52eafd1-b439-4155-a06f-af8fa57c3c01)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 1e97b3ca-b107-4047-9c49-3a58c75fd619)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8806bed7-7e74-4ad7-bd03-908bb6b92d3a)(label(1))(mold((out \ + 5ce388e0-0b28-4c64-a99e-a4f0aff8aee0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8d70c9ef-3c5f-4ce8-8852-c887d0df6bbd)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fd5a746e-fcc8-48ff-80c8-4699f135c65a)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 588413c7-9a41-4dcd-a663-ce8a71232787)(content(Whitespace\" \ + fd960288-ba02-48e1-954d-d3a91d6e382a)(content(Whitespace\" \ \"))))(Tile((id \ - 0918c04c-58ce-4b4a-b674-ddd13bdc9088)(label(2))(mold((out \ + ef621b2a-6bd3-4518-962a-bf7fd1e4c163)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f2fdd943-38a4-49be-868f-551b5e4e8a62)(label(\";\"))(mold((out \ + c9106c47-0493-499e-bee2-cb6abcc5f048)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ff95314a-2a59-448a-91cb-1ea41665a5c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 46068684-be56-47ea-8364-a9470099dad6)(label(let = \ + 6d514b42-d09d-4fcd-8321-4fac6a77be5b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 21562688-1347-4c7e-be27-0226defcb12a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fb5080a6-f268-4d34-b2b3-cf14ee08ee6f)(content(Whitespace\" \ + 77020c32-318e-44f9-bc54-2dbc8cdce53c)(content(Whitespace\" \ \"))))(Tile((id \ - de1823a7-a2f1-4a51-9b4e-8912840e67ef)(label(f))(mold((out \ + 5e91068b-221c-40bf-a6ce-a6d46efaea19)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b0c9f1c9-5a83-45b2-8431-4d761a9a398a)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3301c1eb-814d-493d-8c02-fecae11058d3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f52d917a-eebb-4dc1-9a76-ec3ac7e334c8)(shape \ + f1e2cff0-47f3-46bc-b734-f167e81c7183)(shape \ Convex)))(Secondary((id \ - e1ad7bdd-d270-490f-9393-e6788840d8b3)(content(Whitespace\" \ + 37685087-0abf-4617-bb95-9809500b6994)(content(Whitespace\" \ + \"))))(Secondary((id \ + 18a3f965-2ae7-4e89-a7f0-c4fe8223b15b)(content(Whitespace\" \ \"))))(Secondary((id \ - 1949e9c6-c52c-439e-bfbc-3b7e841d9d2d)(content(Whitespace\" \ + 24006329-87f1-49f7-8185-f5f091c5a9ae)(content(Whitespace\" \ \"))))(Secondary((id \ - 769bfcb9-ccc4-487d-bf49-c06aaf82ee64)(content(Whitespace\" \ + c54f12fe-39d2-457c-ae41-b2c5010ca4b6)(content(Whitespace\" \ \")))))((Secondary((id \ - f9524197-e261-4db8-9fb6-7d93bb19b088)(content(Whitespace\" \ + 979b53f8-410e-4d5a-a8c6-59d92f175772)(content(Whitespace\" \ \"))))(Tile((id \ - db72b634-32b9-43e7-98c2-6184a6c83281)(label(fun \ + 12b034d4-9efd-4dd8-840a-e886b1b3e14e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 547ecae3-5664-4e03-9bff-75a7af435cca)(content(Whitespace\" \ + 8a76a8c8-7314-4cae-916c-4a2be58ffe69)(content(Whitespace\" \ \"))))(Tile((id \ - e8a65c89-9c1e-4ad4-af3f-4a337006262b)(label(a))(mold((out \ + 38f4a281-c6f7-43d9-981f-a1c4f880b310)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 22e73070-01e2-446b-94b8-41464ff24175)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1bff4971-ca15-417e-9729-883074b05ebe)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d5481b05-3f3f-4592-b1cc-7ca6727dc526)(content(Whitespace\" \ + d7828d07-5f1d-45fa-802f-5d44845f176e)(content(Whitespace\" \ \"))))(Tile((id \ - 6bdc3740-20b1-4041-b82d-db05a12f27fa)(label(Int))(mold((out \ + a9636049-914a-4b4a-bde9-c663024772c2)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a41d0624-2d7a-4ce4-9b2c-00f5ab93b6a3)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 04f417bb-7053-4975-ac0b-9326540aa47e)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c54283cd-ab5a-4296-a20c-668605ffd54c)(content(Whitespace\" \ + 3a5faa38-cdd1-481d-91e6-0792db09017b)(content(Whitespace\" \ \"))))(Tile((id \ - 38ad3d7c-9721-4a26-a60b-a480602c2ba0)(label(b))(mold((out \ + eb27f466-955d-4987-86ef-d1ad0fb300e1)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 26a95aa0-4916-41c0-9f6e-bdd8b5dd2517)(content(Whitespace\" \ + 6b277728-9153-4ddf-a7bf-69756937ec23)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c587fda8-04cf-48be-be91-f59793b2a1b3)(content(Whitespace\" \ + f9cdd37e-d051-4e7f-bb7d-3cd149eddb2d)(content(Whitespace\" \ \"))))(Tile((id \ - 5e438c36-f9b9-4a1a-bd1f-a951182bd756)(label(a))(mold((out \ + 1b3fbffa-6f05-42c5-bca8-d1b5826e434e)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2ad47140-867e-4613-907f-b7238c41b8ad)(content(Whitespace\" \ + fd47e64d-daf9-4e0f-9e93-a85d8f7f8eb9)(content(Whitespace\" \ \"))))(Tile((id \ - 1305879a-485e-408b-ae05-1ab69c10e83c)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 1394c6f6-3fa9-47b4-9b7f-bb2353c3ab19)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 223dc1e1-8647-4ce7-8e0e-87e75c67b413)(content(Whitespace\" \ + e15a24c4-a221-4c23-9ac0-4437bbd43614)(content(Whitespace\" \ \"))))(Tile((id \ - b2669416-0e2b-46be-b416-3df1ad01ae8a)(label(1))(mold((out \ + 7b7ca6ea-d1e1-4609-a6fd-dcc57b21a176)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f3d88687-5683-46f0-bb0e-e675637a38ab)(content(Whitespace\" \ + 734538ad-6662-43c8-a588-1b6bf3591954)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 00f23ebe-6645-4707-a8d3-a068bafc36cd)(content(Whitespace\" \ + b718e2d1-9be0-475d-b3ad-bb3310d734bf)(content(Whitespace\" \ \"))))(Tile((id \ - 6a4c26e1-181d-4001-8334-582e4251021a)(label(f))(mold((out \ + 498f783a-683f-467a-bc21-8dc8abb8cdbe)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f5254ea2-ae5a-49da-965c-354479138abb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 968a2b0f-044a-4b87-a43c-6a82b9f99a1d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e14346e0-4390-48d6-8257-df82e4c47054)(label(1))(mold((out \ + 6fc6814d-dccc-479d-8c8b-197a49ec54b2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 395462c3-38fa-43c9-8436-8ea9f4b3ef97)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + a5a2ddff-92df-46b5-8a10-295fee71ac7c)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8530fc8b-b0d6-4dae-9ec4-c4734ef4f3ba)(content(Whitespace\" \ + b77aa261-cb36-4307-8a07-20634cabfb88)(content(Whitespace\" \ \"))))(Tile((id \ - b4f9b65e-c96c-4453-9ee5-c4c7f4d56ac5)(label(2))(mold((out \ + 8fd20ee8-9096-4fe8-98e4-48bea398ba10)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 7c160907-2dd9-4ae2-8995-8aa6880e79bf)(label(\";\"))(mold((out \ + c4cd1f4e-ea64-4492-99e4-43505fc0534a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eab922a5-0028-4211-a2c4-4abeae1b9db1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 12674297-fbe5-4c49-9e96-2abf3ec9640e)(label(let = \ + a7726994-ec80-49e5-acac-21db10025e87)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4db35f89-bc24-4136-b91f-a1b4db7d0cc6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b2dc47f3-8ae7-4d5c-ba85-f3e34b255a2c)(content(Whitespace\" \ + 784c9906-a3d8-4605-821c-cd0f14d551c2)(content(Whitespace\" \ \"))))(Tile((id \ - 806579a2-5f5c-4db4-bb44-c9b1e47cdbdd)(label(f))(mold((out \ + cbe0b3b0-51b1-445a-8e6b-dcd3f1a39475)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7ad3b972-787b-4d59-beee-cc1e3c4f9488)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 6ee18ad9-de1c-44e0-8662-a5ba4a153a7e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2841681d-6b54-4be4-95ec-4616f4efcfa3)(shape \ + 2f5fb109-ae11-496c-95d7-793176997546)(shape \ Convex)))(Secondary((id \ - 04ead003-9194-4751-8ae8-b1cf86b01ae5)(content(Whitespace\" \ + ce7a4d0b-d1fd-4a2a-8940-0577a27d374c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8a26da39-7d18-411a-a176-41763bc4ae4b)(content(Whitespace\" \ \"))))(Secondary((id \ - 9a86e8e2-094c-449d-81a8-63e0b970d42f)(content(Whitespace\" \ + 582486c8-a289-4139-b57f-d97088e635bc)(content(Whitespace\" \ \"))))(Secondary((id \ - 969a0f33-e384-4ac0-aeb0-5feaf54ba650)(content(Whitespace\" \ + 31001117-aea2-4ef4-8194-7dfc10cd11b4)(content(Whitespace\" \ \")))))((Secondary((id \ - a7e7f5cc-cdf7-4fc9-8f2c-f0e7d777928c)(content(Whitespace\" \ + e82b63bc-70bb-4eee-9017-f4a29245f54b)(content(Whitespace\" \ \"))))(Tile((id \ - 302b82b5-b847-4354-a263-83cafbaade46)(label(fun \ + 968a811b-da22-4cf0-b00e-2f76d87a568e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 54fde547-0723-484e-a2c0-cfca6293af04)(content(Whitespace\" \ + 9693ceaa-dda7-4371-b385-264a0290861b)(content(Whitespace\" \ \"))))(Tile((id \ - 080384ee-1937-4627-b9c3-1d44a1039bad)(label(\"(\"\")\"))(mold((out \ + 184b3b99-9944-45e9-b570-48fef88b0c5a)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - fe621d18-a199-4044-99a8-9e5af1cd5c5f)(label(a))(mold((out \ + d26aabcd-fe68-4a83-b108-41986b047cf6)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bddd4394-5867-4787-ad0f-6bc42af709f1)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 837018fd-fe92-4c26-a8e3-92524eeeb6b4)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e9e027f3-f9b2-4dbb-8013-00e9c9e7f64f)(content(Whitespace\" \ + feb1d885-8bf4-4dab-a380-3e6f08d7270e)(content(Whitespace\" \ \"))))(Tile((id \ - 8879a754-5312-42b7-8a5b-611b7606e66e)(label(b))(mold((out \ + ad86332a-1b25-4f73-a96d-9003f147c816)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 034fedcf-7741-4990-b024-1b18224cab51)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1bb39a60-7efb-4e50-a1c9-222a4e2ad77b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9462a388-8f09-4d9e-8d8d-5320871f0948)(content(Whitespace\" \ + 8726abf7-0004-45fc-987b-03c04f80290a)(content(Whitespace\" \ \"))))(Tile((id \ - 120a403b-e816-4400-8da5-17a770d9b144)(label(\"(\"\")\"))(mold((out \ + 6b239ee0-3dbd-45e7-970d-52a84ebe5a3b)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - b46908ca-f7a4-44f9-90e0-bed59a3f4438)(label(Int))(mold((out \ + 51d6e599-610c-40fd-98b7-1dc4690125bd)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 6f9cf9da-85a7-4b98-b51a-bbcdbfaf3472)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 90ab602e-a068-47d2-bb8b-470d150edd02)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 49e768ef-d4fe-4182-bf9c-32fb501c9006)(shape \ + d955884c-5516-4e0f-9d3b-f3b5a350f67f)(shape \ Convex)))(Secondary((id \ - c3b1e2a1-420c-4b3d-89da-c590b7d57cba)(content(Whitespace\" \ + bfcb0cf6-9c3a-44c3-916b-b104c6013a14)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5bfe2831-8ca3-498b-b7a5-2f72fc9541b5)(content(Whitespace\" \ \"))))(Secondary((id \ - fa5c7b61-fe69-4f7d-a85f-408d2c19f2d7)(content(Whitespace\" \ + e969add0-25f2-40ee-b27d-47347660cb55)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a712a55d-a172-4460-a2e3-de391f93009a)(content(Whitespace\" \ + 0c64e867-9ab1-4be9-969e-7e8ea38ba6f6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3c1ccce6-3740-41a7-9714-61494d59a8f4)(content(Whitespace\" \ + 528781ce-c7ee-4822-a4e3-07884c2ad1f5)(content(Whitespace\" \ \"))))(Tile((id \ - 8c08f5b8-a312-4d43-94b3-e8f41d64ea56)(label(a))(mold((out \ + acf6f5fb-858b-4ddc-8ae8-a8437b585246)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6006a74c-f6b1-4c70-8106-51763d2b8a88)(content(Whitespace\" \ + b279f9cf-75a3-4149-a82b-7efe3f5045ef)(content(Whitespace\" \ \"))))(Tile((id \ - d2e37fa9-dbfe-4597-9805-ab213a208b41)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 34e95715-ec0b-45ab-9e76-42fb406afa8e)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3756b5a0-2564-41b4-aa59-612c18b37f73)(content(Whitespace\" \ + 5ef600ef-fbf8-463d-8942-c7d115288fd4)(content(Whitespace\" \ \"))))(Tile((id \ - e46d27fa-0dae-4f5b-a5af-9a39e5fc86cb)(label(1))(mold((out \ + 335daf9d-bf8d-46be-9ae7-88e887b38bf3)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e228e125-3501-4076-b6e4-ba2680d12417)(content(Whitespace\" \ + cc7b5bc4-ac83-4b56-a00f-14a7b0d63f69)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 22ae36c3-b80f-4728-bd82-928629215942)(content(Whitespace\" \ + d311851b-f735-4aa2-82cf-3f253cbdd47e)(content(Whitespace\" \ \"))))(Tile((id \ - 71a4157f-8ce9-469a-bab7-65f5c72f6b01)(label(f))(mold((out \ + 56e5bdb9-8484-4c50-877e-4efef3864bbe)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 64af3b09-a5a3-4800-bbe8-eca9cb2fda11)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + df865363-8a53-4452-83ba-c69264f60435)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8f1813e0-521d-46b1-9881-4d4b34f153ed)(label(1))(mold((out \ + d1e1c7b1-0885-4961-83b9-c4c612290745)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 92484a79-9c21-4583-b55d-bca83fb35382)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 01c84fa9-8a5d-42c9-9040-4a9282c780b3)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ec4c1a18-6700-4f65-81b1-1746daf0050b)(content(Whitespace\" \ + d2140561-31ea-461f-b108-1fa8bdff73d2)(content(Whitespace\" \ \"))))(Tile((id \ - 7effe18c-56ea-40b4-8fb4-a18108acbeb6)(label(2))(mold((out \ + 17275d13-0c6e-42f4-a0b7-86885a21511b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 849cbcf1-5025-45ce-bccf-acf86d3d0c8f)(label(\";\"))(mold((out \ + 985767ad-b01f-4b63-9204-e6c63d3e2c35)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 445a7d03-d6eb-4fcc-a222-038aed01e048)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5d926892-1a99-4f8b-ae7d-2ba3a482fc9d)(label(let = \ + c4a167d1-5c77-41d4-8fdc-f1424b07fe45)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 83ce8b95-252b-4020-b633-c95fd80443a6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 78227439-828d-48e7-aa75-2576047cce62)(content(Whitespace\" \ + a9ca2d21-1754-4e2b-be76-3b417d6cba76)(content(Whitespace\" \ \"))))(Tile((id \ - 73d41a68-3175-4104-9c11-356b5278aa3c)(label(f))(mold((out \ + 1d76bbc4-83b4-4305-8e7a-97d5e62daa4d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6bf2d999-641f-4ea7-9688-d338adc5d4b5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 0a0f2fc3-641f-4d46-9a68-68257193fbe2)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2167d358-4a0f-4a69-b711-d2d00fd6b460)(content(Whitespace\" \ + c10f8365-1c5c-4629-8ad9-a5959c6903eb)(content(Whitespace\" \ \"))))(Secondary((id \ - bf4be0e0-b6b7-40a2-9936-5b30c72c55af)(content(Whitespace\" \ - \"))))(Grout((id 4abf0c94-cc8d-4cf6-9a4f-596b77886b83)(shape \ + 4eeda34f-4758-40d6-a149-a647b273d36a)(content(Whitespace\" \ + \"))))(Grout((id 517d8bd0-a2ba-424a-b61c-adb29e6483c9)(shape \ Convex)))(Tile((id \ - 080e0fba-f3b4-406a-bc52-1fc9790f8247)(label(->))(mold((out \ + ba304aeb-4587-4959-a20d-a94d9d34cb93)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fcd27852-8867-4366-82ab-8a86f14df4d7)(shape \ + 70a8204e-1d13-45b6-b25f-ea1b214d780b)(shape \ Convex)))(Secondary((id \ - 71c84ce2-707c-4eef-9331-2e42187d70d0)(content(Whitespace\" \ + 837bcb68-f75c-45c2-9942-c886fedb41fc)(content(Whitespace\" \ \"))))(Secondary((id \ - 649ff12d-0f5c-4c94-a545-c0d935d5cfff)(content(Whitespace\" \ + c86535db-0dd0-483d-8e3c-29d14974c63d)(content(Whitespace\" \ \"))))(Secondary((id \ - f3019b50-c74f-4a23-8e00-9ac6b6b1de53)(content(Whitespace\" \ + 1f81b1c9-8ba1-4469-acb5-b900830ff0a3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2ca75fd6-7343-45bc-9e70-0dc93649d740)(content(Whitespace\" \ \")))))((Secondary((id \ - 3d97d579-5011-4e31-8694-1e5e76b459db)(content(Whitespace\" \ + 06a28117-fd71-4e8d-8f90-c931810f8ad2)(content(Whitespace\" \ \"))))(Tile((id \ - 8b7e5e00-3489-460a-aab3-c9a458041674)(label(fun \ + 50e5be80-3698-4f05-b4f0-051d1e04aa9a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 49ac90da-d790-4480-bd4c-33bc5d4fa016)(content(Whitespace\" \ + 53ce7f68-36bf-45f8-96db-755abbe9bded)(content(Whitespace\" \ \"))))(Tile((id \ - d6c67aab-bb93-4805-ae55-37c283d8ad7b)(label(a))(mold((out \ + d7afae00-1a71-4663-9646-56203a70bd61)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fdd53596-ea98-4510-b997-f2d53ce4561e)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + dcd918c8-9cc6-4908-8cf2-6c3a6b10813d)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - af47a325-997d-4f97-a611-c82df473381f)(content(Whitespace\" \ + c986b970-44ee-4a99-af19-88779f6d820b)(content(Whitespace\" \ \"))))(Tile((id \ - fb2b1f51-3298-4121-8cbb-134507d84091)(label(b))(mold((out \ + 66eeb1de-a1cc-4fbd-955b-9ffff5487eef)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 541cef2f-c9df-496a-a353-876f96bce8b4)(content(Whitespace\" \ + 919bed8e-4c66-4248-a5c9-e91092258353)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 69bd9432-f733-4df0-af4e-07e6ea9825be)(content(Whitespace\" \ + ec92c6c9-baa5-41d8-a1a8-9fdfe0366179)(content(Whitespace\" \ \"))))(Tile((id \ - 25fe1452-68e8-4b6c-ad91-87bef4266c69)(label(a))(mold((out \ + d05bc698-67a3-43b6-a641-106cb4a11d0f)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f6cef768-dc51-4ae4-b5f5-69f1026a3731)(content(Whitespace\" \ + 8a1f54c5-adcd-400c-b75e-bae94a39a949)(content(Whitespace\" \ \"))))(Tile((id \ - a31e74e4-30f0-4328-85d1-686cd2954c91)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 441e27f9-3c1d-4d2b-92ec-45d760e639df)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b3f5a747-7a61-4393-9da4-953a89ea697b)(content(Whitespace\" \ + bfeea19e-d38b-431d-bdda-bf616cdc3516)(content(Whitespace\" \ \"))))(Tile((id \ - 130d4823-80b7-4e70-b9c1-53c8464cc96e)(label(1))(mold((out \ + 6c4bed74-0d2f-46d7-9d07-27744c09bbc3)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3a0a21b0-0441-4afd-9bd9-d2883ea6985b)(content(Whitespace\" \ + 8424ebd6-c3dc-4342-9f48-33c226381c5d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 92d3dc42-f5f0-4df8-98e0-5473fab1b249)(content(Whitespace\" \ + 43d562a3-5fba-448f-84c6-3b8db57421e3)(content(Whitespace\" \ \"))))(Tile((id \ - 79b45272-de5b-4471-b893-b71f6a38e306)(label(f))(mold((out \ + 38d4d4d8-9cfb-40a9-a3e6-414801ea53f8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9e3a1f40-64cc-4ce2-ac49-3679b5fe35e2)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + c416ab12-0fac-410d-9c53-500629fb365c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ae29e4d4-7dd9-4765-b2c5-b286db3e9ca1)(label(1))(mold((out \ + b79a4f59-62c5-4f5b-835b-9b9dcf8a185d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 501efae8-0d02-403a-b43d-4b96c6cd5cdc)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 4a7c9519-1a70-4f5c-be3b-f0f5163030a1)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 45db7ca5-2d7d-478d-b678-71059ee0bf82)(content(Whitespace\" \ + 7227af17-b28c-43d5-ac09-4bd4e3ef1c76)(content(Whitespace\" \ \"))))(Tile((id \ - b0be5df8-cfa0-4dd2-9833-b0154c70dfc8)(label(2))(mold((out \ + 84fa523a-b25d-4366-9afb-b5392df0518c)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - ea02bd03-e77a-46ce-9402-3d18a13500a1)(label(\";\"))(mold((out \ + 448b367e-251f-4c0e-a94b-b38194266019)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 61fc7047-e4b5-41ab-9349-51804a5dad2b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d625be96-fb0f-4ec1-965b-b36a310356c5)(label(let = \ + 20b03f4a-8032-4b3f-bd5a-ca4e7bc41ba8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2bd63cbe-5845-4cb7-8a0c-72a8dc25b0b5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3346918c-5de4-4380-b7bf-983770dbdf55)(content(Whitespace\" \ + bdf8cc2d-2635-483a-8dc1-f774abee49d2)(content(Whitespace\" \ \"))))(Tile((id \ - 86a0461f-0286-495d-a979-f9a153bf440b)(label(f))(mold((out \ + f87776cc-e382-417b-8d86-18b282771911)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd7fe18a-ecee-471f-a879-b26e3d233dc2)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 9f94ca87-cf4f-4238-b457-bfd0fa817f3e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 015a5ce2-d221-4141-9119-a9dd23ce66b5)(content(Whitespace\" \ + 8a286b27-e63a-4cda-aa44-470e7bcd0a5e)(content(Whitespace\" \ \"))))(Secondary((id \ - 3748be85-000f-4b4e-ae7b-eae258f8cec8)(content(Whitespace\" \ - \"))))(Grout((id 84a4dbd8-f6a2-40ee-934a-0c4b2fa73545)(shape \ + c083591c-e992-4ac1-ab0d-78edb5cbbd8b)(content(Whitespace\" \ + \"))))(Grout((id bcddf638-1831-4d54-9d84-6aa42241399f)(shape \ Convex)))(Tile((id \ - 40f12435-4cb3-4ada-881d-eb1bd59e1677)(label(->))(mold((out \ + 57306077-9487-4e8a-ac8c-dd6282a2e2fe)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f09063ab-291a-4d0c-9357-5bf017bd4ad1)(shape \ + 18f65da1-f47b-48b0-a3b3-ad48a22be0d4)(shape \ Convex)))(Secondary((id \ - 697f6c93-47fc-4e43-a210-699c5a91ae1e)(content(Whitespace\" \ + fc155d3b-9901-46ec-b6b5-b965f76edd21)(content(Whitespace\" \ \"))))(Secondary((id \ - a8cff37f-d20d-47c2-8c42-6dcbbb58ebec)(content(Whitespace\" \ + 27f08074-2223-4516-b6a8-c93e23185ae3)(content(Whitespace\" \ \"))))(Secondary((id \ - 19748f4f-bff1-46b2-9a5a-3a398b5e8e04)(content(Whitespace\" \ + 08f152f5-e8c7-4bab-a052-faf148f5c1e0)(content(Whitespace\" \ + \"))))(Secondary((id \ + cdd118f1-7410-4183-b8e2-36a1e7683b85)(content(Whitespace\" \ \")))))((Secondary((id \ - 9f778a0c-0fce-4deb-935f-7c8a5f4ed963)(content(Whitespace\" \ + 03e67cde-b136-4d3c-8416-900b1dd6fd7f)(content(Whitespace\" \ \"))))(Tile((id \ - 239d2509-e0db-4696-950d-a17acd4746e4)(label(fun \ + 594f6b9f-efdf-4d10-a252-f3189c1e813c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2b87fc41-faf5-4f43-a5ae-3a953f6bb3c8)(content(Whitespace\" \ + 0631c415-c1db-426a-97a4-587814e54118)(content(Whitespace\" \ \"))))(Tile((id \ - 170ed6f3-180d-422f-9ec3-1fe79a017bac)(label(a))(mold((out \ + 69df4530-5eca-4452-86ab-b1e53c355e4f)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c403741c-61e1-4a7d-bf8f-aab2714035fb)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f89d426c-946b-4045-a4a1-afed0e92bb26)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a456d165-1014-4ece-8ff3-65d980754c5d)(content(Whitespace\" \ + 77cb9da2-f7ea-4978-a386-bed632465fd7)(content(Whitespace\" \ \"))))(Secondary((id \ - a5dd89a3-6bfe-473d-be59-2d8510084b87)(content(Whitespace\" \ - \"))))(Grout((id 9a5a57ba-7fd1-419e-88c9-9d678c421528)(shape \ + 1e5a5975-6df0-48c1-ae48-fab9c631fdb2)(content(Whitespace\" \ + \"))))(Grout((id 53fa57a4-cc97-48b4-a8cc-c9c8daf1fa3a)(shape \ Convex)))(Tile((id \ - 4b72b557-625f-4bd0-a3e6-1d893a913fe2)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + b29aadd6-ac36-4f96-a5dd-b87ddde0cc39)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ea5dad31-fa71-4ed0-bb9b-3729cc6c60e8)(content(Whitespace\" \ + 4b991c76-6ed3-497e-aab1-a10f8c26496b)(content(Whitespace\" \ \"))))(Tile((id \ - 2f75b5d2-dac8-4e96-b1fe-fb20661e815d)(label(b))(mold((out \ + cef1b5b1-deda-4fcc-83e1-ceb9676ccb91)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 293b37af-4fe1-4822-9640-41696a0d5dcb)(content(Whitespace\" \ + 70bccb6d-c441-4645-a3a6-8db7070f4c34)(content(Whitespace\" \ \"))))(Secondary((id \ - 1c542d7d-962f-4558-a39d-a666ad67bf44)(content(Whitespace\" \ + f5ead7c9-7fbd-4c3c-8fe7-d0c1a1909738)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fe71147b-6655-46ab-b0a7-845eb47fa595)(content(Whitespace\" \ + ccdb17df-9183-4c15-8ade-401c1e18a00d)(content(Whitespace\" \ \"))))(Tile((id \ - 9261fb87-4189-4b5f-a4e6-1e21b0b4729a)(label(a))(mold((out \ + e1ed7eef-11fd-4ddc-9e94-dbf94b5372c0)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8eb5744b-358f-41d3-a484-9d1be69a6fe7)(content(Whitespace\" \ + 6c5eb260-4dae-4cd8-9e04-9c0ad8b777b8)(content(Whitespace\" \ \"))))(Tile((id \ - e0b93445-c49e-4af2-bae9-7260f5f0494c)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 050082f9-8db6-4a10-bc9f-36864f2eb100)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d403496b-ccbb-48b1-8a6a-79994e331142)(content(Whitespace\" \ + fd2f7ec4-e69b-458a-b36e-19549847b639)(content(Whitespace\" \ \"))))(Tile((id \ - 628d219b-3844-497d-acf3-d6906e71ad5e)(label(1))(mold((out \ + e3f57c85-dbdf-4084-bc1f-849a437133cf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a3a0da08-2979-4421-9acc-fc8c9f1bf9bf)(content(Whitespace\" \ + c7bbcce4-d144-4804-b1fa-4bedc65b2119)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 906625c3-05ce-4adb-b987-bc3931798668)(content(Whitespace\" \ + b302da3e-0301-40f8-8f3c-a0b5b4554377)(content(Whitespace\" \ \"))))(Tile((id \ - 2d5f3fc3-72f2-4e4c-b3d8-8e34e966ee17)(label(f))(mold((out \ + 849d2bea-dbc3-44cc-b4aa-9bef31b0a35a)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 62c113a4-2abd-47ee-9cb1-49dc00f1ba0d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ee8f2264-870c-47a3-a7a4-215771332d67)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c1ac6161-d471-4523-9b42-1a39ed0a18bc)(label(1))(mold((out \ + a26377b4-8bd9-4ad5-9d58-7a42cba54d48)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - af1131ee-b56f-4503-978e-1c5fa6af9e9c)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 466c0cb9-3337-4574-859d-6278a5026893)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5ac33347-e517-4b9f-84c0-ba3a3201b496)(content(Whitespace\" \ + b0fd0f95-ee10-4814-bbde-8e447199efc0)(content(Whitespace\" \ \"))))(Tile((id \ - 51ee0c63-a223-4cf4-9335-585535f92f12)(label(2))(mold((out \ + a1098e42-6852-46d1-aa87-4c8df4f362dd)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0081d95b-b438-4f2e-adeb-b7b797627447)(label(\";\"))(mold((out \ + c7399831-7b11-43a8-b4a8-63ae7cd72779)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e14f57ab-f267-45c0-85b3-b07e5d856269)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 295028a2-3ce4-49c3-91f4-8421256d5aac)(label(let = \ + 8c7db2a8-a7bd-4c58-bff4-9b130bb3b85e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4fe518de-a7d0-4166-896e-992364d9e7a5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 193e459a-6a83-4d20-a445-d0ca3e0aa711)(content(Whitespace\" \ + e5aba834-40fd-4e64-a0f5-960f93e92ee2)(content(Whitespace\" \ \"))))(Tile((id \ - c1eabaf8-2eb6-4f07-a16b-7e0321ab34f6)(label(f))(mold((out \ + 9ca20ad4-adb5-437c-8b5c-e11e0c228d0d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd895c62-5adb-4ce0-88ed-7db656306bbf)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + ed8463e2-e66f-4493-9c5c-d5d9926de2c3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4690664a-f922-4620-99c0-a13c45a973ae)(content(Whitespace\" \ + a15bb011-cc63-4a2d-84e0-c515238725d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 123a2b5b-b75f-4e75-a50f-4e049db0a787)(content(Whitespace\" \ - \"))))(Grout((id a2e478ba-36a7-41d9-9a39-7831ceb93168)(shape \ + 7c049d48-f3fc-4b52-9fd7-99ba269cf387)(content(Whitespace\" \ + \"))))(Grout((id a408e3c2-69eb-49bf-a0fb-2ee615868eb4)(shape \ Convex)))(Tile((id \ - c4842cac-e5e1-4b12-8190-ae237261948a)(label(->))(mold((out \ + 52eb2640-38d6-46db-b623-27cb56f4c728)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 11b87ab0-b173-4c7f-904c-3f0f6cd38a6c)(shape \ + dc45c658-bebc-416c-8c3d-cb8fcde81c18)(shape \ Convex)))(Secondary((id \ - a5e5e515-0398-4227-bae3-7e1d3ab4088d)(content(Whitespace\" \ + ab1f6fff-dba8-47b8-bb7e-691a34a83462)(content(Whitespace\" \ \"))))(Secondary((id \ - 78675615-c06b-493c-bdc7-31c9e1a71f64)(content(Whitespace\" \ + 3d01ba4b-cbd3-4354-9450-0d0f40e985f8)(content(Whitespace\" \ \"))))(Secondary((id \ - 0f12b2f5-a0a3-42eb-9841-65fcd4b17622)(content(Whitespace\" \ + aae3c458-224d-49be-866c-a099f1f03212)(content(Whitespace\" \ + \"))))(Secondary((id \ + b9be9d94-3b41-4ef2-93c5-bdee3ec41b4f)(content(Whitespace\" \ \")))))((Secondary((id \ - ef873d46-5e64-4393-b815-f85d09aaf097)(content(Whitespace\" \ + 78353ed0-7ca7-41c4-8f3c-c4b272719a76)(content(Whitespace\" \ \"))))(Tile((id \ - adeaa9a8-f7c0-491f-a86f-6f4e573119fa)(label(fun \ + d8139083-bc22-4686-bd2a-2cee472b8a3a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 480cbf26-7bf1-4dde-a11d-cd9a3c784307)(content(Whitespace\" \ + 7ab0cb62-5e4a-41bc-915e-afd27e5d0d55)(content(Whitespace\" \ \"))))(Tile((id \ - 7685fb4c-98c5-4cc2-a8af-0333ec41b51f)(label(a))(mold((out \ + 011f90f4-3d16-4c35-8255-95e293abade8)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7d960d16-91c6-4d23-8e9a-ed26f4be9801)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3477d21e-4fa7-49b7-ad9e-bf2520148f6a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4f83eecc-b187-45f8-9784-877665a45a90)(content(Whitespace\" \ + c41eaaf5-07d0-4098-a337-bd819093c711)(content(Whitespace\" \ \"))))(Tile((id \ - d0eaf2fb-0ce0-4a2a-a7e7-5129fb36a9ae)(label(Int))(mold((out \ + 8bce6618-567a-4b43-a89b-28df2d53eb99)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 13616c24-d14e-4503-9f2d-24311f7142c5)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + e78101a0-0004-4081-b5d0-27557f519fc0)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 08c5bfc2-9989-4ba5-b33d-83c0ad686d8e)(content(Whitespace\" \ + 5182eb13-4233-4b23-84dc-990b2ab04d5a)(content(Whitespace\" \ \"))))(Tile((id \ - f34dc9f4-43f7-4b4d-b87a-2280cb6e68c8)(label(b))(mold((out \ + e0b00135-59a1-4024-87f1-409f3b2db3e7)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bdac8a5e-eb25-4418-b076-6d20660bf23a)(content(Whitespace\" \ + a2d37aea-8dae-4a56-8d77-e1cef82c1786)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a65a5fb4-f650-4b44-b6e7-65d69db483e7)(content(Whitespace\" \ + 0c279aa3-6ae0-49d9-92a0-5f7cdc3935a5)(content(Whitespace\" \ \"))))(Tile((id \ - 36735ffe-8a40-429d-aef1-f28220fc9548)(label(a))(mold((out \ + fdddf2dc-29d3-4de4-b4e1-8e6f41e59cc2)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 62fae7b1-a85f-406f-b42a-c9d23e11f27a)(content(Whitespace\" \ + c073676a-71df-443a-9e72-da1f350660c2)(content(Whitespace\" \ \"))))(Tile((id \ - 942bad54-7d36-40c8-b83b-89559a6ce004)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + ada4fda0-4927-49fc-ad91-604da1b62b70)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e7baa58c-aae7-4e4b-9b8a-912d761cb415)(content(Whitespace\" \ + 147b5873-b304-4468-9d7e-c5a75b80bd3b)(content(Whitespace\" \ \"))))(Tile((id \ - 05f965cd-de14-4e61-9afe-eafa91fb6526)(label(1))(mold((out \ + bd5eeebf-1765-4114-8002-0b81da4a38e5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 73625cb6-76b2-40ea-ad68-cd5b1ddf9c5c)(content(Whitespace\" \ + 9af3cf95-9dc5-4fb4-8fc1-a47724d106c0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 34985849-d438-4551-9962-d8076805220c)(content(Whitespace\" \ + 48afdf6b-5496-4127-82da-b35502f7b68f)(content(Whitespace\" \ \"))))(Tile((id \ - ba2667af-5b5f-4cdf-bf28-b2ec7d910143)(label(f))(mold((out \ + ec01553f-fd03-443d-a604-2ce116ccd4bc)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 74d59911-c7fb-445c-b808-f8f6ca292a0f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + eda0abf8-8a4a-4a79-b4bb-1aec209951a8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ae7b522f-710f-4ee0-89ba-4d7656b7a569)(label(1))(mold((out \ + 5e3089f8-06ca-4e3c-a551-5c56157012be)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d8ceb537-4e43-498f-ad8a-aa8018986ddd)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 2b7ded3a-13d7-44de-a711-bc1d662aa427)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 075edc4a-286d-450b-8e34-ad506c9a8e24)(content(Whitespace\" \ + ca84afef-5e9f-4053-919c-d670e5eb8671)(content(Whitespace\" \ \"))))(Tile((id \ - a6a5be6d-b11e-4492-9297-b076924e611c)(label(2))(mold((out \ + 42226930-77c1-4611-b1e5-2da13817e7e0)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 1b91d7d4-689d-4758-9ab4-849c73a95988)(label(\";\"))(mold((out \ + e99e8e0d-d282-4fa1-a3e7-28fb84ad21e1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5801334c-7b19-43ec-9a23-a57cd91dfef5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4784be6b-aac8-4074-8fb5-c2d56d922642)(label(let = \ + 1589e905-70e9-4637-9f6e-914d38bc78c2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 426d3563-9955-4e7b-b079-74a00facdecd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 01ac6af9-3fd8-457a-8309-02eedc9357fa)(content(Whitespace\" \ + ec843bbd-3324-4ef1-8716-f39abb579a49)(content(Whitespace\" \ \"))))(Tile((id \ - e81fa8bd-0208-4d16-b5c2-070574775b37)(label(f))(mold((out \ + 49733db8-ac26-4cb1-a31f-5aee5529d790)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 16792ef2-b245-4c35-af9d-b850563dd853)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 7730c6f6-b7e7-490b-80e2-3e43a8c9be89)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dea95d53-1e5a-4435-9ee9-8b5ea379d672)(content(Whitespace\" \ + a73d87f7-4d17-49d6-9567-b64018e79136)(content(Whitespace\" \ \"))))(Secondary((id \ - 1087164e-19c8-498a-9049-80f5b349f791)(content(Whitespace\" \ - \"))))(Grout((id 20e37104-d952-4bbc-b6be-4c2f6e5ed58f)(shape \ + 6ce66a60-c5bf-4482-8dac-c5342ee5a2e3)(content(Whitespace\" \ + \"))))(Grout((id 98c8f209-4e72-4f1d-945f-bad1d13fcca0)(shape \ Convex)))(Tile((id \ - f32cf633-09b0-4ea7-8a54-0137c0af4835)(label(->))(mold((out \ + 1ed7f780-6d10-4a24-b09d-d82168312778)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e03c3ca9-0c90-494b-9f41-23bce1b882b5)(shape \ + 73566dee-36c4-4f0d-9ad7-b26190fe4d04)(shape \ Convex)))(Secondary((id \ - 216f6702-fc94-4f2d-b957-95df48f24ffa)(content(Whitespace\" \ + bff6abbe-8ec2-49fe-bfb6-56dc3a205006)(content(Whitespace\" \ \"))))(Secondary((id \ - a68f2ba2-b02f-4e2d-9ff3-59db489401c5)(content(Whitespace\" \ + 54c74bfd-329b-4464-b0bb-03749a70ab44)(content(Whitespace\" \ \"))))(Secondary((id \ - 0824765b-7b74-4ff7-bbd9-60471f543c4f)(content(Whitespace\" \ + 7b1e3324-724b-4771-bea6-9a8212a01b2a)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5254184f-2967-4ebf-9ae5-c475273f11cb)(content(Whitespace\" \ \")))))((Secondary((id \ - 3f96ff97-8384-4e35-b711-43f834e66941)(content(Whitespace\" \ + 4eadaed1-19e3-43d9-ba0c-eff6b781121d)(content(Whitespace\" \ \"))))(Tile((id \ - 677b6530-a329-41cc-8731-9c2b8695cf3f)(label(fun \ + 107e386f-a18a-4b34-9e7e-2a3dba62893e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 65182407-4ede-4942-8b97-6d5c3a15dade)(content(Whitespace\" \ + c7fcef59-2b97-423c-af92-c8732761ceb9)(content(Whitespace\" \ \"))))(Tile((id \ - 71de9629-e701-4c79-99a4-8ba69db8431b)(label(\"(\"\")\"))(mold((out \ + a8363bf3-c579-4be1-b94f-3a35c0767014)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 4c07c419-2a10-4668-96fc-aa784e388c59)(label(a))(mold((out \ + f4f2cc02-0f0b-44c8-955b-65bae06c3092)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e9af1d9a-0b31-4c71-80c3-6013787e024b)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 2244a42f-e0d5-42bf-94b2-2b8a14d3e6c2)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 904078a4-049c-4047-b96c-e66b938e76b7)(content(Whitespace\" \ + ed593dfd-4be1-47cf-8a93-9b2fddfe8668)(content(Whitespace\" \ \"))))(Tile((id \ - 63fdef68-cc87-4060-a166-fa2108be6d90)(label(b))(mold((out \ + 85a59389-595b-4621-9926-812a7c0f0929)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - d46777a3-c613-450a-a8d2-0381e4387950)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + b08d1286-8c83-4666-a6d6-bc822e9c5dbb)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6f206cdb-a76a-46a1-af12-e859c5584980)(content(Whitespace\" \ + 453f2b50-ba8d-4ac2-96cc-9585f96365f6)(content(Whitespace\" \ \"))))(Tile((id \ - 087add82-77eb-44bf-800b-a0c4d350fd3b)(label(\"(\"\")\"))(mold((out \ + 7d61967a-95b0-4542-8bd3-c81528db1bf5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 638a72da-e2f0-40f2-b9f9-b3e0177663e5)(label(Int))(mold((out \ + cb4fc898-fc33-486c-adc3-9715e5baef41)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a02e4530-703e-4392-8b25-a63a6116c984)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 7f5a8891-c67b-4f50-adfe-aa619cd21c1c)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - bf5dc96f-2fba-4b50-a441-2b201a061500)(shape \ + c705631b-475f-4929-9eb9-95536c0057fa)(shape \ Convex)))(Secondary((id \ - 653c65da-53be-45cb-9da4-dd484fd7a703)(content(Whitespace\" \ + dd3c1293-547b-465d-bd30-0437c0435908)(content(Whitespace\" \ \"))))(Secondary((id \ - eea31b95-8506-481f-92a6-cba41a19247d)(content(Whitespace\" \ + e47ab165-90b1-4e1f-b9aa-9261a91e1f72)(content(Whitespace\" \ + \"))))(Secondary((id \ + 436e0e52-f172-4a95-95cc-4a981a8543a9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bc23a34e-bb24-4dcc-9fd5-16531dcd2f43)(content(Whitespace\" \ + 6811383f-93c7-4022-90f7-a615a7aee617)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 77374c90-5488-4be8-a13d-5ada491fd096)(content(Whitespace\" \ + 80348f1e-4497-4eb8-84b4-bb65c0a28175)(content(Whitespace\" \ \"))))(Tile((id \ - 171572bb-446f-4e67-ab14-9a757706f5f2)(label(a))(mold((out \ + 395854d4-c109-4080-a3fb-84fb6708e4b0)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3705eb7f-991a-402c-a12c-333b9f8e83df)(content(Whitespace\" \ + d9e6ef0f-5f0e-4ae9-adbe-e5f1d10dc4f4)(content(Whitespace\" \ \"))))(Tile((id \ - ec6e4dbc-4b5a-4547-9792-342b79568cd0)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + ff036928-c230-4190-b77f-37437ea47a24)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 72eec4ad-1779-468b-98d9-11e9dffbddc2)(content(Whitespace\" \ + 208f3e4f-acbc-43a4-9426-ab471b516b5b)(content(Whitespace\" \ \"))))(Tile((id \ - 51ba0778-4c11-46f3-b6d8-c72feb736cfe)(label(1))(mold((out \ + 09da4585-2795-4c96-a39c-74477efc7830)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cb88c4ba-1178-46e8-9221-9fd4f4f4dc45)(content(Whitespace\" \ + 7c4655fb-b81c-4f44-abae-8b6340412a12)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e8f4ded3-3731-4656-951a-ec3e8d4bc07e)(content(Whitespace\" \ + 9ab1c99f-9c2a-444e-a933-a0a1d7a81816)(content(Whitespace\" \ \"))))(Tile((id \ - 557d9194-e948-4d44-a147-26245b0841f4)(label(f))(mold((out \ + 498345d9-4e06-49a8-bd5f-f2b8e5c68421)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4ab0085b-ae43-4a0b-a5bb-82fcc89d1c16)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 7711aafb-5e26-41c1-952c-5b795aae0f91)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 44811b93-d85d-4822-9c16-3fd0a0557bff)(label(1))(mold((out \ + 70e3c5c6-6f79-4e21-bccf-a7260e28b88d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 33d8f49e-8b26-4bbb-84fe-64b520a6c7d1)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + daf45ebe-fd82-4fba-a5fe-47326eb9ceb6)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8a8ce6d2-f2a8-4e34-8c20-42bf2ffa68c9)(content(Whitespace\" \ + 16903195-51ff-4738-9cd8-a0d237ec6781)(content(Whitespace\" \ \"))))(Tile((id \ - 7a4c3917-381e-4fa2-b933-65b610b9faf7)(label(2))(mold((out \ + dadcff18-d860-458c-9494-644a535ec6f6)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 578f4bbf-4d56-4507-81c5-0c21160d6d73)(label(\";\"))(mold((out \ + 3a8ce154-f251-4b34-9e3d-db8429e8d79a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5a31cbd0-f9a4-4038-a7de-cffb1628f225)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e91ab766-2e5e-47df-9880-416186f304e5)(label(let = \ + 3d65585e-3e34-4462-9ed3-c4c93371b8d7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc66001d-553e-46f7-8d59-c6b6de375d88)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6448c51f-80d6-4afe-a297-c75b7e468a99)(content(Whitespace\" \ + e2323d0c-9769-495b-ac9c-393e2fe33762)(content(Whitespace\" \ \"))))(Tile((id \ - a46da087-3433-4654-88e3-4a7f6d422821)(label(f))(mold((out \ + 9dab995e-0e0e-4430-9823-4f4284ae4007)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 072d6af1-94a4-4032-a8f7-3def69d0a07c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 01fe2842-26db-4b65-9301-6c1dce9cdd61)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3038b770-0df1-4212-b762-95cbde5f327e)(content(Whitespace\" \ + a46ab23f-3200-4016-aacb-31954acc9f72)(content(Whitespace\" \ \"))))(Tile((id \ - 6fb025a5-c0c1-4613-a067-3866714cbf40)(label(\"(\"\")\"))(mold((out \ + 44a710b7-81ed-4db4-9e20-4c6c0f488109)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - abb26a18-8364-4e16-90df-6547f7cffe5d)(shape \ + 61d6db40-68da-4abc-a3e9-77bc5fd7d4e2)(shape \ Convex)))(Tile((id \ - 914d5f5d-efc8-4fe5-9986-2388663820a1)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + e7a63eee-c6cb-47b4-8072-3aa33cf5376e)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 061bb903-58e8-456f-938f-739acda10415)(shape \ + 33970745-8987-412d-a3c7-74eaab1914d4)(shape \ Convex)))(Secondary((id \ - d1fac0d0-8273-4b40-bd3c-80540dbb49bf)(content(Whitespace\" \ + e94a703d-9593-4691-a626-a997c43adc93)(content(Whitespace\" \ + \"))))(Secondary((id \ + a179d7be-c198-42fb-854d-72cebcc39ddf)(content(Whitespace\" \ \"))))(Secondary((id \ - 10e3fb0e-9faf-4a89-b2e8-ee95afebf1ba)(content(Whitespace\" \ + 105bad3b-5e73-4abe-9c86-8b148b9e6357)(content(Whitespace\" \ \")))))))))(Secondary((id \ - af376a6f-dfde-49d7-af95-47925e3f6206)(content(Whitespace\" \ + a079c66a-9124-44b8-b183-96d4ae609ebc)(content(Whitespace\" \ \"))))(Tile((id \ - 6f68afc5-fee7-49d2-a36c-3a47f8b3ac2f)(label(->))(mold((out \ + 4575be30-e6c8-486b-ad08-661b0507e239)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9613b237-74cc-45ea-b5c8-2b17bdd9618f)(shape \ + 3bf7b03c-c751-4b39-989f-a831a353f253)(shape \ Convex)))(Secondary((id \ - 0b31ee1d-0ad9-474b-bddf-00154d216769)(content(Whitespace\" \ + 942a4a7e-6c8a-4aa0-8d26-8a6a6ed90c53)(content(Whitespace\" \ \"))))(Secondary((id \ - b410dbb1-fabd-41ca-b784-b99cdcfc5eba)(content(Whitespace\" \ + 13b0a988-5a67-41a5-aaa5-bb81cd1aaf25)(content(Whitespace\" \ \"))))(Secondary((id \ - 8fd5f496-31bd-4e3f-b51f-0b6a51ca2dcd)(content(Whitespace\" \ + 0a7315bb-879e-4dae-885f-26b1044d6a6d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9d4e8047-0e1d-4219-ab29-8868c9ac55ca)(content(Whitespace\" \ \")))))((Secondary((id \ - 3282d800-60dd-4de9-a28e-bf7e684d9b8a)(content(Whitespace\" \ + 72a0e204-0be8-48a8-b0f5-4d3d3ca12152)(content(Whitespace\" \ \"))))(Tile((id \ - e7f2229a-768a-4ad8-b720-4dc50f88daca)(label(fun \ + b58d5f05-4e5d-433b-b717-6c236baa06b2)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5b0edbcc-38ea-4108-9bdc-4c6b8394ac8b)(content(Whitespace\" \ + ea7a02d9-3bd6-492e-83cc-11a5846c6097)(content(Whitespace\" \ \"))))(Tile((id \ - 9c9f5baf-4414-4d97-8160-774712d7f699)(label(a))(mold((out \ + 61612e92-a360-42b0-9bdd-cfc1e0a6352f)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8a3ef432-cd29-4937-b9bd-312829df51e5)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + a3e5cbaa-13fe-4969-99f9-8746749bc5cd)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e83f627b-0105-41ab-aa9b-980231731d2b)(content(Whitespace\" \ + 788d2df8-796c-43ad-91a6-012f307c8d25)(content(Whitespace\" \ \"))))(Tile((id \ - 9751b2c6-b35d-43cb-b986-c3c138ffc44d)(label(b))(mold((out \ + 46ff2fb9-d781-45e6-9de2-7182d2e895cf)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e8b29464-2ce0-47c4-97d1-045478b68af4)(content(Whitespace\" \ + bf203cce-4173-49ed-b107-22e0a135a50e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4caee35-a182-46b0-8c31-ab1f14865df3)(content(Whitespace\" \ + 49a5545b-97ec-41f1-809c-52ea8331a64a)(content(Whitespace\" \ \"))))(Tile((id \ - f89c6f23-2126-47bc-bfbf-03a141f18881)(label(a))(mold((out \ + dc36cc09-b786-4f6b-bdac-ab7ece25ef46)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c8b42539-e3db-4527-92ca-a28898cc31a0)(content(Whitespace\" \ + 3a6dd01b-3733-4527-8e5d-ca4b821fe607)(content(Whitespace\" \ \"))))(Tile((id \ - 793e3c7f-1a50-4f0e-9e3d-a954b62ebb3b)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 8981ad87-7b7b-4b58-bf00-f6d9e79506f7)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 506ee6ac-f965-4695-86fa-4b6f65c40880)(content(Whitespace\" \ + 3e8c9546-17bb-49b3-ab2e-f6eb123e5f1f)(content(Whitespace\" \ \"))))(Tile((id \ - cf41bcdc-fdb1-4fba-9c9d-d9a095157908)(label(1))(mold((out \ + fcf56690-e195-4ca9-b443-e0e9ad518be9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a2fcc73f-c20e-46ba-a083-d59bf02a54be)(content(Whitespace\" \ + 57aca788-8fa8-476d-bb63-4209e540e44b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 01c8a13d-464f-493d-b285-b6884c9cfe6e)(content(Whitespace\" \ + ebe462d4-ba0d-4be2-b4e1-443e710cfdaf)(content(Whitespace\" \ \"))))(Tile((id \ - 27fa1b9e-1c83-4366-813b-59aaf302a5ef)(label(f))(mold((out \ + af25e769-bfb2-46da-a17b-2f4790018825)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - de6c5fd3-529b-4805-83d9-5b123615c295)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 95c2d07e-1e4e-4c88-924b-7812745f557d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 32184568-a8fb-4504-ad5f-4e79abb70bc1)(label(1))(mold((out \ + bea0ec60-d1ba-411d-b024-de700ef95c61)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7625ed65-dc23-481d-8cf4-7bec9ce2d61b)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + e4a2bd49-cb22-4ed4-88f1-f9c5ce3c2611)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2d64477d-0af4-4e4b-9fc5-6759029362a4)(content(Whitespace\" \ + 056166d3-e6dc-4403-8931-c2ed56abb68d)(content(Whitespace\" \ \"))))(Tile((id \ - eac776ea-6d34-4d5f-8b0a-a5bc742778da)(label(2))(mold((out \ + 6da2ad63-a0ab-427f-ad07-fb3d75354b47)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - fb93ade1-a5bb-4e65-9f2a-f7ce945af7ae)(label(\";\"))(mold((out \ + 77084eff-60a6-4f6a-ba97-b35e696da51f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b48b8eae-4690-4248-a8a9-e00392cc76a3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 249e737b-7462-4cda-987f-dbd1c040a305)(label(let = \ + f782a013-491e-4079-8f25-c2d6abae34d5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6049c33f-b1e0-48d2-9089-baab0185b9ba)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ab2e61f8-918a-4a8e-804b-6b8258d068ea)(content(Whitespace\" \ + d0df6431-69ab-409b-afcb-2787b058c85e)(content(Whitespace\" \ \"))))(Tile((id \ - 239b9b3a-655b-40e0-ba7b-21e7731d12a8)(label(f))(mold((out \ + f78df769-2f64-473d-9ea9-004d37e02a68)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bcb33fbd-3493-4e9f-8a95-362ec76b082a)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 9bef26bf-ffaf-46a1-b64a-eb3ca135c691)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 855d053d-78ea-4ebc-b206-5d5400dfee1c)(content(Whitespace\" \ + a5c36d31-61c9-4cb5-a516-07a467c334aa)(content(Whitespace\" \ \"))))(Tile((id \ - 5a9ac697-149d-4cbf-b476-aab022ee05e1)(label(\"(\"\")\"))(mold((out \ + 6733d7a4-18eb-4609-9cc2-7770e92cbe36)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 8f5dd867-a41e-4363-926f-c989367cd3bf)(shape \ + f1309a56-6623-4622-bd62-dc2b03666722)(shape \ Convex)))(Tile((id \ - a6c7aebb-51f2-4b36-ac15-be1668105a95)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + dbfca95c-26c7-443d-af2b-bea74a2fecd0)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e4d0ad35-d7d6-4bf1-8ee3-f5e39a905fe8)(shape \ + 3e497aab-8a37-41d8-b461-6e5c38497b2a)(shape \ Convex)))(Secondary((id \ - ab7b2100-5e43-4d55-b7bb-f742bb65f8ab)(content(Whitespace\" \ + f6c23c57-a8d2-46fd-a6d5-53cdb5ddc1e9)(content(Whitespace\" \ \"))))(Secondary((id \ - b393f5db-c3c4-4e85-86ff-0fb0662bc978)(content(Whitespace\" \ + 6cc495fa-6fa2-45e8-9f24-f1c55240a0f4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9b2e62e8-2702-49b9-8752-17576dfcc74f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f9757c3e-4bc4-449e-822c-9035e2e36eb8)(content(Whitespace\" \ + 9d49aa99-4823-488b-be71-ed09aee42c79)(content(Whitespace\" \ \"))))(Tile((id \ - 74f56b23-6fb8-4e03-96b2-06ea9e7040ed)(label(->))(mold((out \ + 7e4cdbc0-d775-4c11-86b1-fd39027efcb4)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 6d983f70-23d1-463d-adc0-a3709a640952)(shape \ + 303fc384-f4b2-476b-92ca-443acdeac8cf)(shape \ Convex)))(Secondary((id \ - 196b58a4-63de-4642-85bb-175c2ea9fd1a)(content(Whitespace\" \ + ebbd1079-da67-4a2b-ae20-cb29372e0601)(content(Whitespace\" \ + \"))))(Secondary((id \ + 461e4e53-be52-4803-a22d-1774daedd411)(content(Whitespace\" \ \"))))(Secondary((id \ - 1329bb91-6f9f-4c47-9109-da58bb468bee)(content(Whitespace\" \ + e1b135a2-d878-44bf-bed1-269463fd9827)(content(Whitespace\" \ \"))))(Secondary((id \ - ffada2ab-fc36-4533-86ab-de10f916869f)(content(Whitespace\" \ + 85cdf1ee-632b-4427-9bb2-1df99bac31fa)(content(Whitespace\" \ \")))))((Secondary((id \ - f40d6acc-e229-4f0e-9184-83d9349dcf7b)(content(Whitespace\" \ + b01b9ef9-e760-4f36-aa3c-47d542322385)(content(Whitespace\" \ \"))))(Tile((id \ - 4c338a43-8850-43e6-afc9-be37ae180fdc)(label(fun \ + f57afa48-0b85-4df8-b585-48aa1b27a8f2)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 534da083-b8ce-459b-b75f-88af8447cd42)(content(Whitespace\" \ + 63484dd7-d313-4a7f-86cc-f763a2261cfa)(content(Whitespace\" \ \"))))(Tile((id \ - 6ba8154a-1771-4256-b396-678df94f8799)(label(a))(mold((out \ + 055fd588-82fc-4f9a-9c89-1ba65b926f02)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b1250a41-9d06-4016-936a-951599368c67)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 09e32d7a-cb91-42c5-a059-12fa7ccc7ecd)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 776456c4-5444-4a55-841e-3c9ad0e0620b)(content(Whitespace\" \ - \"))))(Grout((id 0ed1f5e7-1207-4b48-bde6-af2b757e9f71)(shape \ + 1f654480-4ab4-4f0c-ab6b-f7a8e1f678da)(content(Whitespace\" \ + \"))))(Grout((id 46f7d16f-f68f-46c4-ac6d-f1fa58195a2d)(shape \ Convex)))(Tile((id \ - 649ce7e2-8418-495d-a672-b758cdece86d)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 1028ab90-112b-4c70-b97a-ee0bbf92cf57)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - fff13e2a-4465-4e20-b5ba-25100a3b1c34)(content(Whitespace\" \ + 846f80e6-29e5-4e47-8daf-ae6583d1a010)(content(Whitespace\" \ \"))))(Tile((id \ - 820aa7a6-d0ef-4680-845e-05ae7b496bd1)(label(b))(mold((out \ + eed68bd3-4e52-444b-8505-3c3f9bb2af53)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 43a7d8c9-79c2-4a16-8504-4ce744835909)(content(Whitespace\" \ + 8c0a1860-6a94-4ff7-ad71-897486e8cc48)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 072b6626-4224-438a-8153-083b3b5cf909)(content(Whitespace\" \ + e52fe322-f595-4860-933c-3ec740c3ad22)(content(Whitespace\" \ \"))))(Tile((id \ - 7d4ca940-d58b-4a51-b2a4-6c46f63bb321)(label(a))(mold((out \ + ddedc239-d1f9-49e9-88d0-be9f9510d3f6)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 61afc556-4ad7-44f8-aa2f-a9ccf2777603)(content(Whitespace\" \ + 8e5ce762-262d-4346-a637-4f88f9766041)(content(Whitespace\" \ \"))))(Tile((id \ - aaad6f7a-5f9c-4d97-93f3-60736e0e1b34)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 99764cfc-7746-4fbb-a6b5-3a8eb839ad38)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9d2e0609-d39c-42d6-9115-6f55f381ae68)(content(Whitespace\" \ + bb338045-ca4a-4f4d-beaa-50ca180cb216)(content(Whitespace\" \ \"))))(Tile((id \ - 10dbe8de-b23d-4d56-a5bd-195980d3e27e)(label(1))(mold((out \ + e164a61c-bdb7-4b00-9446-9954c9039b5b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2681e2bf-4a97-4b26-adba-f80d88129390)(content(Whitespace\" \ + 9e4373fa-16ea-4cfc-8f74-7597a053a815)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bfb0bc27-e706-49ed-bed3-343d8fe52c92)(content(Whitespace\" \ + 6a218fb6-b4bb-4039-833b-51089a549632)(content(Whitespace\" \ \"))))(Tile((id \ - 4c2b5934-01d6-4447-8b62-e1243765a918)(label(f))(mold((out \ + f088d728-199e-485f-8f33-decac70928e8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c312395a-d53e-4841-973c-2f70d81bd841)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ffa07078-0f06-41eb-bc12-325ee845bc10)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 31a6bc96-cfde-4df5-b3fb-b35b53bb45f3)(label(1))(mold((out \ + a651339c-dec0-476c-9bcb-3839a3dcd538)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d773d0fe-76f2-4e64-b241-48a9802190c1)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 49f7b439-e17e-4758-8486-b1652fbd9942)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bf8dd4e7-b0b1-4926-8d19-b6cdea0b4c4a)(content(Whitespace\" \ + 87f5f66a-8c48-4769-918f-43d83a69a305)(content(Whitespace\" \ \"))))(Tile((id \ - 52c87b39-533a-41a5-b2d3-ecb7b7e09b9d)(label(2))(mold((out \ + 08263235-73d5-435d-9ddd-399c592b44fe)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 77fc0afc-64b0-4b62-9923-01c233655640)(label(\";\"))(mold((out \ + 187e9b1d-44f9-4536-82e8-4375256213a6)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3d4f21cb-318b-44eb-8f72-efddcfe42c3f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c497a148-10d9-400f-803c-e5548b970239)(label(let = \ + d42ab740-3056-435d-bf08-e32784bb80ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d8970079-d4d7-44b4-84ea-fddb47f15d61)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e5f892c-5624-4ba0-877c-ccf641e44ada)(content(Whitespace\" \ + be6a887e-db96-41ee-9809-0ff7aea7cbe6)(content(Whitespace\" \ \"))))(Tile((id \ - 87f24316-5f4e-414a-a979-eae897c60f04)(label(f))(mold((out \ + 265c62f0-244a-4c0a-8585-1a30e5d95093)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 020719c3-8271-4308-924e-17d12fc562dd)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c5b3690c-8b37-4971-b0ab-09502d6eb34c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 901e7b31-f793-4763-af03-e436ea2169ba)(content(Whitespace\" \ + 4515ffbb-37c5-482f-b7b6-da15343b53b7)(content(Whitespace\" \ \"))))(Tile((id \ - 856c69d4-5ede-4311-a698-b6f151ed6b92)(label(\"(\"\")\"))(mold((out \ + 2cce24f5-7638-42e1-a46f-97cd78d22391)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - aa044aed-35a7-41fd-9251-d9e3b1964b62)(shape \ + 12fae552-acbc-4144-a99c-9ee06940b78c)(shape \ Convex)))(Tile((id \ - f34cf6f7-bbfc-48de-b5bb-a95a084b32e2)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + e49ee3d8-c564-48b4-a4ec-29939c236ab6)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 35351958-a081-4ba3-8102-519ceaa460dd)(shape \ + 4051c994-8c5d-44c1-8ab5-24a1d5ad73f3)(shape \ Convex)))(Secondary((id \ - fbb9e319-e64d-482b-bd3b-daef1c8e800a)(content(Whitespace\" \ + 7ae17503-e2f2-47c7-a393-cfa118448d73)(content(Whitespace\" \ + \"))))(Secondary((id \ + f581f576-6a47-46f1-bab4-cc0bb6306f60)(content(Whitespace\" \ \"))))(Secondary((id \ - b6383ff0-91b5-40e4-a7e2-c6b5c46e4890)(content(Whitespace\" \ + db194adf-0d7d-4c87-b69b-0698e2d35374)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a0e9f0c3-86c5-401d-b475-59d17c414966)(content(Whitespace\" \ + fcb48981-a7c6-439b-b1d2-9b69472b38f7)(content(Whitespace\" \ \"))))(Tile((id \ - 72657097-7b58-4dff-bc2c-83d73f538d45)(label(->))(mold((out \ + 72857959-3cec-4aca-bd5f-f7c137d2f6f2)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9bfde24d-4ef0-4dc2-ab96-ac55fb65de8f)(shape \ + 1faab939-8bb9-4e42-bbef-43b58da73001)(shape \ Convex)))(Secondary((id \ - aa2494e4-13cd-4758-8a46-2597daf09c41)(content(Whitespace\" \ + 8b18ebb9-db8c-41d4-ac49-6e3c773dba2d)(content(Whitespace\" \ \"))))(Secondary((id \ - bfe5e1c9-9c69-43ca-ba16-ae36fe57904b)(content(Whitespace\" \ + c362fd7a-9737-483e-b967-a138dbdc9bf4)(content(Whitespace\" \ \"))))(Secondary((id \ - 04cbb703-fe6a-431d-a7c2-326e4e6fe519)(content(Whitespace\" \ + 022c4ee8-5c23-427f-8ef8-a9d8e7a6357e)(content(Whitespace\" \ + \"))))(Secondary((id \ + fcc383ce-4242-48b4-8d0b-b136db9eb497)(content(Whitespace\" \ \")))))((Secondary((id \ - 9fda2313-41ed-4929-b39d-d2e819057b01)(content(Whitespace\" \ + 115b14c6-4b2b-4218-a49a-7521f1cf39e3)(content(Whitespace\" \ \"))))(Tile((id \ - 93bc7e43-afa4-4f4c-9862-e580158dc828)(label(fun \ + dc8ea8e2-a095-411f-b4ec-f42c1dfa864a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0ac577f5-b8b5-40ef-9d08-173792993634)(content(Whitespace\" \ + 13cae123-914d-4ab9-a0bb-95e74b757177)(content(Whitespace\" \ \"))))(Tile((id \ - ae0d121d-1143-436a-9741-a763b0dfdf00)(label(a))(mold((out \ + effeeb48-f8ae-4434-99ee-6b324ea1030c)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6aaea59d-b0a5-4e34-996c-5a21aa20bc76)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + fe204965-5d4b-4a7b-89e7-08c8a68faa7f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 33f126bd-42a9-4371-b630-847dc42755b9)(content(Whitespace\" \ + 93ab4776-8bc4-44b3-9c85-9df3e428e7e2)(content(Whitespace\" \ \"))))(Tile((id \ - 493f02cf-9ceb-4e21-afab-d3b601c47b18)(label(Int))(mold((out \ + 3b936c94-608f-43f9-a289-9a2c60986937)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 6b92ff6d-971c-4992-9f64-bc8c4451b443)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + e7536a82-e11d-422c-8df6-5c8538922999)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - cc01eba7-de02-448e-ada4-74122754b6cc)(content(Whitespace\" \ + 591a9e54-e725-4068-b0b5-0aab93b6cf5d)(content(Whitespace\" \ \"))))(Tile((id \ - 0d10179e-353f-4668-829d-d7f9efaa9009)(label(b))(mold((out \ + 6e42376d-7307-4aa0-9bf7-874c6ede51bc)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 39136aae-8579-4a60-b784-83b9564d6ad5)(content(Whitespace\" \ + a1ebe614-6941-428a-b341-6126da9b507c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8fdf301d-12bc-4cda-8a96-b655327d22e3)(content(Whitespace\" \ + 7629c2c2-6617-477a-935b-b68dd45d2cb5)(content(Whitespace\" \ \"))))(Tile((id \ - 06316225-a915-46a7-8a46-2c2a41ab5c6e)(label(a))(mold((out \ + 3f99bbaf-191c-44f2-ac0d-d9ea4e2b2cb7)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b1f396df-c42b-426a-af63-e32ad23c66b6)(content(Whitespace\" \ + 7b0c0908-7467-418e-a13a-90a311ef94b6)(content(Whitespace\" \ \"))))(Tile((id \ - 393997ef-d898-41b1-8ea5-77ccb7688570)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 472b4173-b211-4f61-b0ad-8c76ebbfd6cc)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ea85289-f845-48d3-9215-1e6c6deaea89)(content(Whitespace\" \ + 7a0995c2-8221-4342-afeb-ef342ece91ab)(content(Whitespace\" \ \"))))(Tile((id \ - c8ccff99-0b00-41a4-a306-5035cddb3693)(label(1))(mold((out \ + 36300a74-5371-4559-943c-48f494c41aba)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ce407ed0-d44c-4e84-ad83-8934db80e6a4)(content(Whitespace\" \ + 40f5a161-495d-430a-ad72-badf3bdbb3c5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90af6c58-0b3d-4556-b921-12f1eb895618)(content(Whitespace\" \ + 79d68432-85ff-4eb7-b009-a5a75d5be95f)(content(Whitespace\" \ \"))))(Tile((id \ - 3668e811-b918-4386-b78d-2dd800c9c0b2)(label(f))(mold((out \ + 3710c1b9-5165-47de-8530-5476531f03c4)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 680d3017-66a5-49d4-9337-35bfd56d9c42)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + d71ef906-a04d-4169-b6d1-35e3126ddf74)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 21cdc7d6-400b-422f-b6d8-87863509eda8)(label(1))(mold((out \ + 28f33431-1054-44c3-91f3-5a82a3272166)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4db36db2-d937-469e-8501-5c4a6627a282)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 6adc49ee-f2ed-469c-a1a6-a86d30ab2b29)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d5fb6cf3-2516-43dd-881a-a13c85df28b2)(content(Whitespace\" \ + 69c2c6e1-a14b-4685-a2f6-6a4e66086ae9)(content(Whitespace\" \ \"))))(Tile((id \ - 76602b5a-9369-4d20-90b5-1eebb367c4bb)(label(2))(mold((out \ + a9678f5e-29c2-4f5b-90a7-96834caac967)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c243a46a-10bd-4f86-a80b-3b6f94db9b89)(label(\";\"))(mold((out \ + e8214e60-b570-4790-b0f0-865ee68708b1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 90b1ad9e-a0ab-4b09-b59d-50124a8a9b0e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - def5d21f-6b1e-458e-a61c-3839eaa2df48)(label(let = \ + 6c339fd3-1985-42d3-9f9f-cf343e05d642)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 63aae96a-2e54-4a31-b7e8-f37341e30cb1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 63279d89-32a6-4c9f-a91c-b5707e335bd9)(content(Whitespace\" \ + 41150a00-9e44-4cc2-9cc0-e9b824b28585)(content(Whitespace\" \ \"))))(Tile((id \ - 6ad6b968-b933-424b-b840-581a0165cc98)(label(f))(mold((out \ + 061b6f26-f65e-4b33-8d59-c410cfe89886)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9bc7a73f-aa25-496c-b777-e0b11ab6159d)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f61cb2bb-b09e-4fbf-9557-52d3870a33e1)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 13760f56-38e7-4641-8187-d77e1462bf17)(content(Whitespace\" \ + aee00318-d9ac-4675-b2cc-8b5df62abab6)(content(Whitespace\" \ \"))))(Tile((id \ - da0c998e-d726-4174-ba68-20936cf2f251)(label(\"(\"\")\"))(mold((out \ + c2488260-74de-4668-9a05-35b5ad8bc816)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 3669c5a2-0c11-469a-b91a-93575fa3afba)(shape \ + a5aaa2e1-cc92-4bb0-a570-54695358709d)(shape \ Convex)))(Tile((id \ - 5a694cf5-1c13-49af-8fd5-876c64002b6c)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 2bf41b7d-6966-4e05-bf86-81cbe8ae9e6a)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 24a8484f-e471-4bdd-93a5-4aaf6f44e9d2)(shape \ + 9d3d0402-bc3a-4cf4-8b7e-9c101851f04d)(shape \ Convex)))(Secondary((id \ - f04be29f-40d3-4bf5-b424-99c06bf3095d)(content(Whitespace\" \ + 402098c6-c1b2-4bb1-9b9d-c57ff9814821)(content(Whitespace\" \ \"))))(Secondary((id \ - e18df519-621d-428b-955a-28f5648c3d42)(content(Whitespace\" \ + 06f0fb0b-7b02-453f-b2a3-913fe3e06ff0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2c2a7296-aeb1-453e-b766-7d761181ea56)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fa73b247-4f0b-4fd8-9690-51f0249d4144)(content(Whitespace\" \ + 90ebc460-5afd-41c0-b75f-aeae32dfa2d3)(content(Whitespace\" \ \"))))(Tile((id \ - de246edd-2272-4f7c-af68-19bc4414c199)(label(->))(mold((out \ + c8108162-8534-4e07-b581-b29995ae5093)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 22631d33-fb4c-4978-816c-e2af9acfef79)(shape \ + fba94540-3ad4-42e9-8ed5-b7c888ffcd23)(shape \ Convex)))(Secondary((id \ - cfded247-2e57-4a79-b472-95d5a8600d15)(content(Whitespace\" \ + c2243f7e-ad6e-4651-afe1-b515c427cb38)(content(Whitespace\" \ + \"))))(Secondary((id \ + 195863db-6c4c-4406-983d-93ceec9d82de)(content(Whitespace\" \ \"))))(Secondary((id \ - 3cfbb36c-12b8-4430-a2a4-b133cfc3974f)(content(Whitespace\" \ + a4aed3dd-59cb-4167-b919-329dc55b269c)(content(Whitespace\" \ \"))))(Secondary((id \ - bfaab898-1775-450f-882a-3dd08f985489)(content(Whitespace\" \ + 5a0269c2-6858-462a-bda8-5229bd177147)(content(Whitespace\" \ \")))))((Secondary((id \ - c7e883b3-42e3-46b1-9dfc-97656d7be54a)(content(Whitespace\" \ + 8d9b764d-2ca9-4661-be80-2cfcdfe339aa)(content(Whitespace\" \ \"))))(Tile((id \ - b3140d37-9cea-4dbf-93ba-6134296486ce)(label(fun \ + 5ff3acc9-0297-4c57-9c04-c14dec59fad5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7c4a3fc1-3a07-4ccd-9faa-908668202e26)(content(Whitespace\" \ + 795369bd-4839-42bd-9ef6-d46089eca6cc)(content(Whitespace\" \ \"))))(Tile((id \ - 1d0414eb-36be-4862-a175-e4d6a7cec02f)(label(\"(\"\")\"))(mold((out \ + 32b5640d-0d03-42e5-8163-713a3c23410b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 369c17c8-794d-4aab-8bc6-8a7c7ba854b5)(label(a))(mold((out \ + f0f5d7ef-a571-49aa-8e83-970c5da8c73f)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ab148e68-bafa-4082-b20f-b4163ff35892)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 04ba332f-1c67-4c94-8c16-35f0e3e65049)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c07e8d76-a161-4583-b953-ca7d9bf2a0c0)(content(Whitespace\" \ + 48987d6c-4c40-4aaa-8f7b-46523f1f011d)(content(Whitespace\" \ \"))))(Tile((id \ - 7a7bfb79-5e3c-4591-88f6-22e5df3e33ef)(label(b))(mold((out \ + f688b9a7-5a6e-4eda-b4e9-1605f5b5a7f9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - acb3da75-9cd4-4baf-b2d9-45c8ec3b39e1)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 81ace651-9718-4bc6-8a8f-b1029c99aa5f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bcb74525-4b49-4270-aac7-7aa74cf41f67)(content(Whitespace\" \ + 68db984b-14d2-4c4a-a1ac-130a81e4a13f)(content(Whitespace\" \ \"))))(Tile((id \ - 600185b8-e4f6-4983-b503-5c67dbfb394f)(label(\"(\"\")\"))(mold((out \ + e6a2d40e-149e-4aa5-bca7-d24f443d6ca6)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 825efdd7-2e52-4613-8ea0-23f1f08a5c8f)(label(Int))(mold((out \ + b64a6b34-a6a3-4a34-99a2-e182b11c2a0b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 416a3ca4-5560-488a-a774-be822a2a7e32)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + e02d9e4e-4a94-4077-b024-d771158a2be0)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 15708ed5-f452-4958-a896-ea9fae8491b0)(shape \ + 38127717-ca61-42b0-8951-c55bdf1526f9)(shape \ Convex)))(Secondary((id \ - 37fb9d0d-9315-4c67-987c-236d46a1b702)(content(Whitespace\" \ + ac01d5ae-b7e9-45ad-8057-19a904a84d7a)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9e82cc11-910c-4f8b-905e-a08385ab8cd9)(content(Whitespace\" \ \"))))(Secondary((id \ - 9e538009-4c7e-4c7f-b695-3bdc6befaffd)(content(Whitespace\" \ + 1f215d80-75d2-4175-9a7c-9e09017706d2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e0631ef1-e8ca-444d-baf8-463265173097)(content(Whitespace\" \ + d36f5613-3059-42b6-bc83-b2083ac5dcc9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eba08687-8d35-4697-af6b-2812d6461973)(content(Whitespace\" \ + 72254ceb-87dc-49a2-a994-8833935a480b)(content(Whitespace\" \ \"))))(Tile((id \ - 7c5b8c16-96d3-46da-b8ea-afceae9437d5)(label(a))(mold((out \ + 28663e12-09e1-4e35-ab20-4cb6d1edb6ea)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b91ff2ee-f8ee-4c61-b0f5-9115f6c0f230)(content(Whitespace\" \ + 07bcd538-b4e8-44c7-9ec2-2b41a62d86dc)(content(Whitespace\" \ \"))))(Tile((id \ - a006a807-6a04-4f10-87ec-54487587aadd)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + c3c83954-68f6-475d-bddb-039421f29988)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ba3ef35c-d7ea-4e3d-a353-5715c665edbb)(content(Whitespace\" \ + 6fcb70b9-fea4-40ed-a584-74c4a312356e)(content(Whitespace\" \ \"))))(Tile((id \ - 08f3255f-fb50-4034-b5b3-9de9e8a1375b)(label(1))(mold((out \ + bfe81cb8-bf12-4c56-99a9-b5d0c2e8d99e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8628da55-6d68-428d-8067-26879297a915)(content(Whitespace\" \ + fcfc49d4-ddb1-4c86-af4d-6d69443d130a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - abf3eb4d-ca65-45a5-9113-fefba16ac490)(content(Whitespace\" \ + 87588ec2-9b85-4f89-8127-5a4c023f5e64)(content(Whitespace\" \ \"))))(Tile((id \ - 97122918-d74c-4094-b55f-07f8f9d3fb5b)(label(f))(mold((out \ + 50e258cf-754d-4890-966b-7ef15cf040ef)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3007137a-f275-4b2d-aeba-fdc5c734e34d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 4dab0b99-7216-4b28-adfb-61cccba280df)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - da501029-8b89-483d-b62a-1035209f21ae)(label(1))(mold((out \ + adf0b799-a05b-4396-a402-c3aadf0ce504)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fb3441c0-a2d6-45b3-ba4a-fad65d2cffcf)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 814d6777-9a77-454d-9fbe-c889c427edd6)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6974d029-9697-4cb9-aee8-8a2fc801adad)(content(Whitespace\" \ + cea1387d-460c-41fc-95bf-4aa85e1c72c4)(content(Whitespace\" \ \"))))(Tile((id \ - 6f02e6fe-3354-42ce-af69-36f1c2411215)(label(2))(mold((out \ + 86089a6a-7a0a-41f3-bf64-6dd4f90af113)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 915fbcf2-5371-450c-9b2e-67e891528a3a)(label(\";\"))(mold((out \ + 8ac88a53-3a64-4a02-bee1-7e1b842fcc68)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d9be22e1-cbbe-4821-bd9f-26608d605971)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bf560209-22f4-4ee0-bd63-569256e742e7)(label(let = \ + 31e4f794-5573-4a5c-85d8-bf102109436a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3e3d29df-6e04-4372-9ff3-27aa8b86b6fb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 80ac1a50-c17b-4403-a0a6-bcb3b464e877)(content(Whitespace\" \ + fbed3e2c-2ac5-4e84-b7e8-c1e8557752d5)(content(Whitespace\" \ \"))))(Tile((id \ - b36b16ef-cf98-44f2-a266-72ad615a819d)(label(f))(mold((out \ + 7a3f942f-104c-4e58-bfd2-42e5ebfa2002)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 54b60b1b-fb9b-4159-9699-b283f3c8b73d)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3959afd0-3b4c-40c6-b24a-b923725a9186)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ad030d34-b50d-4247-8c95-ee49be92279c)(content(Whitespace\" \ + 6bbe543c-055c-4eb7-ba67-80bb7bdad579)(content(Whitespace\" \ \"))))(Tile((id \ - bd41a1f4-e654-41f1-a9aa-44c2caf97687)(label(\"(\"\")\"))(mold((out \ + 68d98c26-cb44-47a8-96b1-30416ee986a1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 1602a4a2-e4cb-4f9c-91cf-99fdfed14c92)(label(Int))(mold((out \ + c7ce9a1a-ca77-4df1-b0b4-b6ee283c3c46)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0d544688-8378-4763-973d-0142b040ef3c)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + b48679cc-12c5-4943-986a-5a1e978e6c18)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - d9d067c7-ae3e-46cf-9520-f92e45e3bd90)(shape \ + 38b0fb5b-3255-4730-be50-f5d240e77726)(shape \ Convex)))(Secondary((id \ - 607a5271-42e8-4f70-8d7d-7265f5a37e11)(content(Whitespace\" \ + 8d42a2ef-7465-4303-91a2-8be5db09223a)(content(Whitespace\" \ \"))))(Secondary((id \ - 425cbee2-8599-4d9b-9bb8-7d4b74e07400)(content(Whitespace\" \ + 7dd0e694-8f7a-40fb-9e1f-15739d3dee0b)(content(Whitespace\" \ + \"))))(Secondary((id \ + eb5f3c72-5326-404b-84ac-e5f89f34fcb4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 31e910a3-4e72-4adf-b897-e52c3b081c11)(content(Whitespace\" \ + 6b22cb73-8841-41ff-bf1d-1077a0fa17ef)(content(Whitespace\" \ \"))))(Tile((id \ - b7a4ac2c-7706-4377-8143-58a9c0dddc05)(label(->))(mold((out \ + 16692e8d-8f80-4e54-869e-742fa027343a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 13c642f2-d87b-455a-9803-fa66c8f68c70)(shape \ + fecb0fe1-5af9-4b2b-b470-f291ac6c1668)(shape \ Convex)))(Secondary((id \ - 620216db-24ef-41a9-93e5-7f4c86674e2d)(content(Whitespace\" \ + 509ab176-69bb-42d0-95e7-b8f0226b391a)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4bcd3c12-27a9-40b2-aeb1-f345a63ec185)(content(Whitespace\" \ \"))))(Secondary((id \ - 2e0af26d-3f9a-492d-9511-120e00c895f9)(content(Whitespace\" \ + 4cee1f22-05f3-4d3e-8e70-2f63bb2b933f)(content(Whitespace\" \ \"))))(Secondary((id \ - af907e4b-a3a9-487e-bb69-6c6bcfae8c26)(content(Whitespace\" \ + 9d9f7f0b-c1dd-458e-b4af-dd3ef659aea1)(content(Whitespace\" \ \")))))((Secondary((id \ - a07a4037-3c49-444e-9406-ac293aa962ae)(content(Whitespace\" \ + 02883074-1b2c-44e2-b414-cf1d6ad92a66)(content(Whitespace\" \ \"))))(Tile((id \ - f01f6941-3084-4711-9593-85eaadad4101)(label(fun \ + 1faf63ae-35bf-4c32-81a3-3d3404447a22)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e4e8a34f-56f5-4bd6-a10a-3e6b46fa24e2)(content(Whitespace\" \ + a0624ce4-0463-4322-b5d2-cbc48238beff)(content(Whitespace\" \ \"))))(Tile((id \ - 32161cc2-6f99-4954-bdd7-34cf8f0ca2d2)(label(a))(mold((out \ + dff046ab-e701-4b99-98dc-aecd9f0274d1)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9274b0d6-af2f-4ae2-8cdf-fe3678efa264)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + eb379ff0-4866-46ef-9396-f72572693a94)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - b7ca123b-74f0-4d2e-9c29-8284e2afe6b7)(content(Whitespace\" \ + ddfa12c7-f302-49a3-a0fd-d4667e739b17)(content(Whitespace\" \ \"))))(Tile((id \ - 0575a076-e79c-411e-83ef-a100b0917804)(label(b))(mold((out \ + 589471b7-1fa2-4704-8ffc-27a850d04360)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 37f0e61d-c395-44f7-ab59-bdb9b162b1f0)(content(Whitespace\" \ + 4879ce5d-7074-41a1-a703-53d950aae317)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f1640ff3-9870-48f8-800e-ca5f4ec1ad9e)(content(Whitespace\" \ + b23486be-7faa-4b4a-82c1-08143c583190)(content(Whitespace\" \ \"))))(Tile((id \ - 38d71e64-e6cd-4040-a7f9-4342a7632a7d)(label(a))(mold((out \ + e4895aae-0fcf-4e0d-8f6f-1d1cd492fd94)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d2ceb287-f66b-4499-9b64-445ef3f32c07)(content(Whitespace\" \ + d30d3b7b-d5b5-4d67-a721-0a37eb2d7fa5)(content(Whitespace\" \ \"))))(Tile((id \ - 04053ae5-9986-43e7-8081-c00a8f699105)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 38ba8650-14c7-4fc4-9683-7ec2ca3dcba1)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e16a258f-cac7-4e38-b790-a7e57addc69a)(content(Whitespace\" \ + 1b391273-58f2-4a9c-b51c-28906a94d82b)(content(Whitespace\" \ \"))))(Tile((id \ - 788d35a7-8e52-4b3d-ae51-82e464d5815b)(label(1))(mold((out \ + 0aa30864-a7a1-4366-8005-8cf23c7a6de2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 219ca7c2-32c3-46c4-88c8-c07a44f70546)(content(Whitespace\" \ + c6fb75dc-e0f1-446c-91db-0a9bb67a7765)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 69ed07ee-5be8-4064-84fe-b37022365ea7)(content(Whitespace\" \ + 8deb8dea-70fc-4d5c-9464-4b26eeffe4a4)(content(Whitespace\" \ \"))))(Tile((id \ - a17a73c2-0f68-49f7-bbb7-550085684c5f)(label(f))(mold((out \ + e5472ada-a478-4aff-9a1f-5e0c8af1bc19)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b1ae580a-12f9-4106-a59c-86c97ac196ef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 2de9d557-60e5-4f1d-a292-efe62d314f9a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d1409192-3c6e-4276-820c-5ac263859192)(label(1))(mold((out \ + c512e04f-8cbe-4433-b433-ad3c66d367b8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee65c7d4-9367-480f-bc8a-42714e9e771a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 2f7db17b-5b06-44fe-9853-8b78aa6a52cf)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9f0c9bf1-ec71-460b-92fe-7d6f8ae80037)(content(Whitespace\" \ + 12d68f5a-76e7-4336-8ac0-e5b94a2cf11b)(content(Whitespace\" \ \"))))(Tile((id \ - 391c7891-6ee0-413e-b61d-ff4b533485a1)(label(2))(mold((out \ + c8783e11-d525-42a2-9b37-b21c87d4dd27)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - bf8fa20c-d917-47ce-916d-b4ad8a624d01)(label(\";\"))(mold((out \ + 9828c26d-7c0e-40fa-9044-db3df9433364)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 26afcff3-cf21-480b-b10f-11b60d0f7314)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 859b9124-2bd1-4ef0-a9b0-440c5346fc51)(label(let = \ + 4dc4360d-7277-497d-ace7-bef4f64260f2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ad550174-8a4b-437e-9aea-b0654bb46fbf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a4fa0510-6ae2-48e6-8b02-0443d33bddce)(content(Whitespace\" \ + de5b7a77-9eea-4a4b-bca7-2c1f7abdd35a)(content(Whitespace\" \ \"))))(Tile((id \ - c29e4914-8d49-4e69-be7a-c07f72f9de4f)(label(f))(mold((out \ + 50c075c6-dadb-4d6f-a8e8-1d4e5df350a5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c015d488-3679-442b-a2f0-fb95ec525321)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + a2309dc4-92ff-4817-a72e-b278666ecf0d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 15c2b6b0-297e-4582-97d3-369dc2a80d7e)(content(Whitespace\" \ + 706b5a80-86c3-42e3-b17b-ceb32ce225fa)(content(Whitespace\" \ \"))))(Tile((id \ - 2bc80c4d-768e-433b-926e-c1e6f16c2e40)(label(\"(\"\")\"))(mold((out \ + f6a0d5e2-eca9-485e-b687-4a96f09c2079)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - bfd24439-663d-4705-8273-e29b751604f3)(label(Int))(mold((out \ + e9fab92c-cd64-48fd-ba7d-a58740488fa5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 09a3fdf8-a96b-48a3-9ed6-eda73c65a277)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + e5b46ecc-4f95-4a5e-b0cf-9d045885caf9)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - dff36c0a-c494-4773-85d3-22dc40828194)(shape \ + dd95b714-a35a-4c30-830d-a48d7fb4e450)(shape \ Convex)))(Secondary((id \ - 82a71844-313e-46dc-ab39-2168277862cf)(content(Whitespace\" \ + 00867422-e03b-4e1c-8edd-140e2e303507)(content(Whitespace\" \ + \"))))(Secondary((id \ + 30ce2c99-6f06-4a12-a630-7305544b3636)(content(Whitespace\" \ \"))))(Secondary((id \ - 8d216058-fbf1-496d-9743-0c5e0cd76feb)(content(Whitespace\" \ + 895ba0ce-70a9-4ea7-ac3d-ceceebbe7b62)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 14415fb7-a422-4548-819e-44934a15fbaf)(content(Whitespace\" \ + a873546d-01fc-4995-871b-e39aa763242a)(content(Whitespace\" \ \"))))(Tile((id \ - 2bf97cb3-fa08-4a66-af35-19f80ebbf18c)(label(->))(mold((out \ + 063130ba-8342-4168-8dae-7098249b387d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 361a98e7-250c-4a8a-894d-3c142b544a3c)(shape \ + c5b7be20-3c31-496b-b6cb-b761b232fae4)(shape \ Convex)))(Secondary((id \ - afdf67f8-ca10-4975-a82b-cee627045d6c)(content(Whitespace\" \ + 1ae25522-1243-4f44-937c-c3b131ea8f44)(content(Whitespace\" \ \"))))(Secondary((id \ - 1d7ea360-85de-41a0-8d28-2560fce817d2)(content(Whitespace\" \ + 69bbc385-38ec-4d1a-8e62-1f785d42d294)(content(Whitespace\" \ \"))))(Secondary((id \ - cc3932d6-ddb5-4b38-bed5-0f804b30c249)(content(Whitespace\" \ + 475e3acb-d543-4fe4-92c9-16d559f1167f)(content(Whitespace\" \ + \"))))(Secondary((id \ + dc2eb0be-4057-4328-bdc4-e2dd1cdeb4f1)(content(Whitespace\" \ \")))))((Secondary((id \ - 0646a454-d94c-4a32-86e5-e945b7ba3281)(content(Whitespace\" \ + 4d47f2b6-499d-45ed-9c5f-42162bcb95ef)(content(Whitespace\" \ \"))))(Tile((id \ - 1376e637-b0fe-4c0a-ab2e-2e3668294b2a)(label(fun \ + 24e91ad4-87d3-454f-9dc9-f090ac5f56ab)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 00d6aabb-0632-418a-991d-3244cbac05f3)(content(Whitespace\" \ + 4d4e0f01-6ad1-4b86-9f20-963f70328669)(content(Whitespace\" \ \"))))(Tile((id \ - bc3da52c-3df7-4024-bbed-ccfbc627a7b0)(label(a))(mold((out \ + a444473c-b35f-4e7e-a9e3-dfe845229c73)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2a8f19a0-cfc7-40af-b6b9-3348b68b8339)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + a7a91a88-b619-40d1-9ee7-c6ed18a52caf)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9f76cd87-b09e-4a77-ace3-b7b950b35b5a)(content(Whitespace\" \ - \"))))(Grout((id ba54939c-0b30-45f6-b043-9b78bfc61ccc)(shape \ + d9015c98-269e-4403-866d-2765531ec3c7)(content(Whitespace\" \ + \"))))(Grout((id 31450075-b9b8-4bfa-847d-b7313d39d2be)(shape \ Convex)))(Tile((id \ - a3d1bf28-0582-4434-8016-7e16d9c49168)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 73995931-36d1-4228-94aa-f474eb30225b)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 5224a37d-a8cb-434c-8296-c6848f946521)(content(Whitespace\" \ + a6e67fcb-d36f-48f6-80a9-9ae4f5bc6f55)(content(Whitespace\" \ \"))))(Tile((id \ - 4a059766-ec30-4672-8936-beb7b9222bd6)(label(b))(mold((out \ + bde5a9c6-5b7e-4e87-a0d4-d069fcf1b8f0)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c1602bc9-19c5-4170-82e8-577d85ed7754)(content(Whitespace\" \ + 74d45876-83e9-47f6-8bb7-1e6d58f031d9)(content(Whitespace\" \ \"))))(Secondary((id \ - 8d33d61f-552b-4d9f-8ee8-be0441e23a97)(content(Whitespace\" \ + c45072de-7247-44bc-85aa-e62c3412acf3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 890ff4a2-a745-448b-8115-b2934cc0b80e)(content(Whitespace\" \ + 15908387-4f72-40f7-a795-b4a84823581f)(content(Whitespace\" \ \"))))(Tile((id \ - bf14169f-746b-4146-8c4e-e59d02155bbd)(label(a))(mold((out \ + 66de2dca-2935-44e6-8aa0-8630bbe3fbcc)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0df42a3a-eda0-4448-89eb-767d22428d00)(content(Whitespace\" \ + 13e86771-fb5e-4ee2-90a2-36e59ddded6c)(content(Whitespace\" \ \"))))(Tile((id \ - 33cd3314-9af9-4322-97aa-077b7aee80b8)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 71d512ca-e864-445e-b9ce-e0fcd6e8d93e)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 36b0afb8-4162-465a-ba53-dadc8ea48eec)(content(Whitespace\" \ + b80ade63-797c-4584-89ad-9d3ecfb90774)(content(Whitespace\" \ \"))))(Tile((id \ - 7acfd26d-e427-4492-8b93-486f2ef7056e)(label(1))(mold((out \ + 5a1c8f51-73e9-41da-953b-1a78223bc7d9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f7e38c4e-9f89-4a5d-9d29-8fc5c23f2cad)(content(Whitespace\" \ + 770a7123-6c4b-4688-a85d-70de0d8bf6be)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fb9d57c8-fe4b-4cc1-acbc-0d1a9892bab8)(content(Whitespace\" \ + b061a640-d80d-4ef8-bfab-be192a5a232a)(content(Whitespace\" \ \"))))(Tile((id \ - ef1b1b01-cf68-4b48-b7b9-46acb5e163b2)(label(f))(mold((out \ + 9bcc62a7-41ce-4364-a7c8-555cec20b750)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6e190c88-1aee-4ec5-8e4e-8a19928c9bd1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + d8b7f4da-e56e-4ab5-8beb-5230668181d1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 78705e87-a0b1-4251-8446-d6b43ef044ce)(label(1))(mold((out \ + 763c7b6e-2149-4908-b25a-ddfa948e5029)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 690f7619-8921-4e38-b639-16560567cb1e)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 4936f587-257b-4ec3-be3a-0d3928e1ada1)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eca2e22d-e738-4f42-a208-0ee61aa75be9)(content(Whitespace\" \ + 47b4dbc8-10dd-4a9a-8b69-a8ebe0a75865)(content(Whitespace\" \ \"))))(Tile((id \ - 0acc0b7b-5590-4de1-8ebf-ce7ce50f99c0)(label(2))(mold((out \ + c046e24a-40b4-4dce-a82f-e229f1f727ba)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 5e7aa6a5-67db-452b-bc45-bc6613713567)(label(\";\"))(mold((out \ + c62b3b79-b38f-472b-9637-24690eef7e60)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c4a2663f-7fea-4727-8ac4-10ef3933c70b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f85f8f98-196c-4aea-a519-ea1002fea7d2)(label(let = \ + c4703325-779b-4bed-8f17-430cb41d9c64)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f40f054-be4f-4731-829e-e9a9c280b868)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7a1d296d-ddf2-4800-b920-f4116eb01eb2)(content(Whitespace\" \ + 0fbaeb29-2938-44c6-98f6-17dc0e078189)(content(Whitespace\" \ \"))))(Tile((id \ - 9897f8ff-41ce-4364-a5d7-b366ec0bb8bc)(label(f))(mold((out \ + e24b38f0-98a9-4976-8f60-42181899dd4a)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ce2d263e-6278-465a-8f81-e831b766b1e5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 766cfa4e-a2b4-49db-82c1-421197a93413)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 967f4497-6a86-4dd7-a089-2f18712a0d67)(content(Whitespace\" \ + 853a1459-d22e-4360-97ee-682b9d933269)(content(Whitespace\" \ \"))))(Tile((id \ - 416de460-73cd-4105-9a1d-676283260d75)(label(\"(\"\")\"))(mold((out \ + ba4bddde-4e1f-49ba-b002-fe7724650f33)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 38e4b386-735b-48c4-8a0b-ff4cfdd52bcb)(label(Int))(mold((out \ + 1d23e646-fb4b-4e44-8ef7-a78767e3243a)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 51976577-6ffd-4315-bc7b-cd2d54f8a710)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + bb0cd056-753c-4e2f-b91c-033d5f300bc2)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fa144b5b-e12d-4105-af0b-621f0d0ab9ae)(shape \ + 050b7a95-67f4-4567-8583-b818b145c0ef)(shape \ Convex)))(Secondary((id \ - 37d11023-6ee0-42b2-aa34-e0c2821a1f46)(content(Whitespace\" \ + e7af0f0e-bb35-472c-a6ad-54d36a167e25)(content(Whitespace\" \ \"))))(Secondary((id \ - e3009bd1-94cc-4f72-9d97-3a936ddd965b)(content(Whitespace\" \ + ecabbba0-2d9a-4c00-b881-8ae7c4c2d6ee)(content(Whitespace\" \ + \"))))(Secondary((id \ + f0d7d36e-ce5e-4028-b837-1ff06308114b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 78c11afd-7779-41ba-847b-bf00b2cd0e23)(content(Whitespace\" \ + 7ffe7222-6922-41a9-b96a-0005c2437041)(content(Whitespace\" \ \"))))(Tile((id \ - 0ab478a8-af38-4bdd-91bc-b042c8fc1a28)(label(->))(mold((out \ + 6e554f30-51c0-4680-a8a4-d3a1cbd820bf)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - ac0f5375-8a7f-45fa-883f-22598fb49e4f)(shape \ + e72ef343-3321-4dbb-add8-1c89cf38241d)(shape \ Convex)))(Secondary((id \ - 71e88bb0-162f-4acf-b4cd-2d8dfcb98676)(content(Whitespace\" \ + c17ce21d-6149-4be2-b6c4-780dcfaac041)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4135504a-e34b-4677-98a3-c7a68c257a11)(content(Whitespace\" \ \"))))(Secondary((id \ - 16f969cb-615e-4d0c-a454-9ab748dd889c)(content(Whitespace\" \ + 3c53fadf-e48d-4725-a8a6-5bdde4daa591)(content(Whitespace\" \ \"))))(Secondary((id \ - 30bd0a7e-1b39-403d-9d29-314fa4015d6f)(content(Whitespace\" \ + 72ad9c9f-b70d-4a29-a114-b07c57805c2b)(content(Whitespace\" \ \")))))((Secondary((id \ - 63214078-2ba6-41de-ba10-3e4c34a44258)(content(Whitespace\" \ + f3294862-1e1b-4017-be4b-84e60147bda2)(content(Whitespace\" \ \"))))(Tile((id \ - 09178b2f-ef8f-4ad9-a4e7-832c67204695)(label(fun \ + e9a85d8e-40bf-4cc3-9f64-86462ccfd625)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d5cf9139-9af8-4179-9e1c-7d101750015c)(content(Whitespace\" \ + 3f371173-8e8c-4cf3-b7e0-b1a9e6369020)(content(Whitespace\" \ \"))))(Tile((id \ - 3cbc7411-534c-4f04-ad2f-4c62642f92bd)(label(a))(mold((out \ + fac1b4e0-caae-40ca-9cfc-aa156914b779)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2712059c-cdcf-41d9-868f-3b47a023519c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + bb8816e9-bf80-494b-b114-9d9081d2f645)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 357f64ca-739e-452c-ac34-6e86af829339)(content(Whitespace\" \ + 49f35b36-6f56-4f35-a2ac-6ca4718c34f2)(content(Whitespace\" \ \"))))(Tile((id \ - 1ef6e3ed-b83d-40d9-80c6-ce7bd066a3cf)(label(Int))(mold((out \ + 42d036ca-6ed9-43f8-a334-c656ee00b268)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 714e50f1-382c-4b30-ad8f-14a29d00eed9)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + a8ecbdba-1e8d-48ff-931f-16400a3c84c6)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0eeed07e-8ecc-4400-a0f8-648a08060a9c)(content(Whitespace\" \ + 362a6111-5daa-4d90-87e2-7e755fb4fd85)(content(Whitespace\" \ \"))))(Tile((id \ - d0ad4dfb-81fd-4ea6-9436-34e9aa10d2e0)(label(b))(mold((out \ + a1db34b9-fbf6-4ed6-ac88-6062bd2d14c9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c11d7f64-46a7-4dbb-9ce6-d5e65854762e)(content(Whitespace\" \ + f2064b7b-3a3d-4b46-8ce0-2b2a60ffda9d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4196328d-f970-4e72-89de-d3dc5a3b800f)(content(Whitespace\" \ + d656dc22-ebaa-4f18-950b-00a868c9b867)(content(Whitespace\" \ \"))))(Tile((id \ - 0ac8ba99-28b0-4c20-b6dc-fdda5208130c)(label(a))(mold((out \ + 95eeded0-9ca5-476e-81f1-9bee335ab198)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2701275f-0054-49cc-a806-e50b5a1d9407)(content(Whitespace\" \ + c2e3591f-4b2f-4a5f-8174-dce3dcf03775)(content(Whitespace\" \ \"))))(Tile((id \ - 5c928d16-9a42-44a8-9599-e9a2ef7cb4a9)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + eacc22fc-8e12-473f-8ee7-a5545633cd55)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3992ab52-0322-4a10-8993-9bbc73b4a47d)(content(Whitespace\" \ + 36aa0501-c99e-45f9-b3d6-8f51b28b67cb)(content(Whitespace\" \ \"))))(Tile((id \ - c7dee409-5099-439b-9479-cb196bf85da9)(label(1))(mold((out \ + b9a9ccaa-d701-43d5-a8b2-e140b1c1a5a1)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7f472026-0d8e-44fc-bf53-183b363fab7f)(content(Whitespace\" \ + 2f850cae-7453-433d-92fb-f84d5b3e49d4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 93ca28dc-c1ad-4310-8917-b968a2a3ba0b)(content(Whitespace\" \ + 4b7f2643-599b-474c-90b4-455f797cf7fd)(content(Whitespace\" \ \"))))(Tile((id \ - d8799670-d6a5-49df-a740-89c175fdb36f)(label(f))(mold((out \ + 7c075dba-e170-4496-947e-19d0dea1cb96)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 14eb48a9-3e23-4e76-92bc-3c43c7fff444)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 81ba2018-609b-40ed-90e4-e1e83068c994)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 997a2997-4ad4-4248-b9f1-c96ff5941789)(label(1))(mold((out \ + 5589cb1e-022a-405a-80c9-256fcae44d4e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 43a93d20-b827-4f0c-a3ee-c695e5df9e95)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 1406c6ba-21c1-4522-aa71-9de7980c8a69)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bcb0c02d-7357-4984-9fbc-f93897b4492b)(content(Whitespace\" \ + 4d624f30-15ae-450f-8523-47df552dd67a)(content(Whitespace\" \ \"))))(Tile((id \ - 4736d2f7-5fa5-4544-b6b0-30cbda4b5b62)(label(2))(mold((out \ + a0348c8e-1a7c-41b0-8f4d-b5083264bd37)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 3ab4ec30-9a09-4644-8841-92e7f6cb8847)(label(\";\"))(mold((out \ + 289edee8-bb2f-4db0-885e-e91a70ac7867)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 487472ef-1212-4ed3-88f2-63c4ab35afbe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3d02d2c6-650e-4442-b1c7-67b32cf9b8ad)(label(let = \ + f31e820e-9dea-4931-aee8-19981977caa7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + de0b7640-1ae9-468a-94d0-50c5cf6525db)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6191f40e-7c16-452e-8c76-6f33eba1d329)(content(Whitespace\" \ + d96f4f67-be48-495f-a365-f5bd63b8f682)(content(Whitespace\" \ \"))))(Tile((id \ - fa4b8668-df61-4e1b-8cec-341034c7a3a7)(label(f))(mold((out \ + 33c9c8c9-c360-4423-9900-340d328ecda3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ec67395c-ef7f-4eff-83d1-feb53acd6054)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 146b64c3-f32e-445b-82e4-fd3d5a6a312c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 466da28c-9cf0-4722-8957-eaf632a6cd98)(content(Whitespace\" \ + f5bf4d4a-bb60-47e8-9bb0-49ec53c6ed2f)(content(Whitespace\" \ \"))))(Tile((id \ - 7f79e5b3-e434-4b06-9b0b-3877b56986f4)(label(\"(\"\")\"))(mold((out \ + d7175a56-73d7-45b9-9e47-c17723d7b3dc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a79ba610-804c-4e2e-994a-155e1833c2c3)(label(Int))(mold((out \ + 4773ff41-a5b1-42d6-9f98-68f4850b9af3)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 64a932ef-9cd4-45ae-af2f-390ae7392104)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 8b7e2d10-47d5-4057-a256-9a4421d83399)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 8b753d04-627b-46e9-8d0e-98d66a31dd4c)(shape \ + f67fd215-ee3d-430b-a848-1423b4fc59c0)(shape \ Convex)))(Secondary((id \ - 600dac5a-52dd-4c54-8858-a4c872fa3317)(content(Whitespace\" \ + ea3d9c7e-9634-4265-983d-2366efb0e742)(content(Whitespace\" \ + \"))))(Secondary((id \ + ac06becd-6c71-4701-806c-241f1a78e79f)(content(Whitespace\" \ \"))))(Secondary((id \ - a800be14-da4c-403d-907c-b550055bc6c9)(content(Whitespace\" \ + 9747c1c7-1418-4b9b-af29-974bfba259b8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fa75fd51-22af-47fe-b374-4bf058b6aeab)(content(Whitespace\" \ + 8e23528c-c6f0-4baa-bb87-8b50a93ff829)(content(Whitespace\" \ \"))))(Tile((id \ - 5f527de5-501f-4c14-b543-a9512e1869ae)(label(->))(mold((out \ + e7aca703-0531-40d7-9338-a58ec18277fd)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 053b4322-a3a3-42e2-9188-0287bd43e17b)(shape \ + 1a78161f-1aab-42ac-903c-b2180dfbd7a4)(shape \ Convex)))(Secondary((id \ - d85d2f27-47ea-4ad0-bd9b-cf6d50ae2b89)(content(Whitespace\" \ + 8cda9233-f920-442f-8ff5-2f54f25ca83f)(content(Whitespace\" \ \"))))(Secondary((id \ - 8029ce44-a191-477b-9785-fa6eb2dc427d)(content(Whitespace\" \ + 911c9440-4148-43be-acfa-fff00c3b9cc5)(content(Whitespace\" \ \"))))(Secondary((id \ - d9665998-b692-44b5-8d1b-97ed7eebd24c)(content(Whitespace\" \ + 9e079fc0-7b5b-429f-a802-bd93324b42cc)(content(Whitespace\" \ + \"))))(Secondary((id \ + d7b744a6-0de3-4365-bd75-f23fcccfae61)(content(Whitespace\" \ \")))))((Secondary((id \ - 3cfeee66-ca95-4f7c-8969-dd92161cde90)(content(Whitespace\" \ + ae5c1596-02fd-4960-9697-f73adc136762)(content(Whitespace\" \ \"))))(Tile((id \ - 1203feeb-b475-4294-ba3a-71af647f676f)(label(fun \ + 68dcdeb6-8f27-4cd7-a4ce-4b01a9bcadc5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 25158f94-7af8-4d68-9abb-4a365a130b55)(content(Whitespace\" \ + 16aae6e2-c723-4811-9dbd-2a7c4cc3009d)(content(Whitespace\" \ \"))))(Tile((id \ - 4b7d5c04-3e4c-4369-8917-f6bd1d93c9dd)(label(\"(\"\")\"))(mold((out \ + ecf0c43e-3a05-45d6-8e4c-48ff0e99353a)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - db0db77e-bbb1-4738-b207-c118cced483e)(label(a))(mold((out \ + 39a6650f-3ab4-4ef0-aba7-183f6baa2cc9)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ff1961f4-9798-4200-b14d-fa9ed8c23a3e)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 628ee25f-c44e-43b4-a4d6-2ff5e886aeed)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 73fdb448-3691-42ae-ab3c-c35be7f073d1)(content(Whitespace\" \ + 87fdfc0e-8a5d-4fa2-b876-ffa71cecad65)(content(Whitespace\" \ \"))))(Tile((id \ - 4ab4a56a-4cc3-40cc-9609-3dfa2e644314)(label(b))(mold((out \ + 64488a6f-eb19-4fa5-bf49-b3c64e89fb04)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 50cbfb20-0b9a-4cfd-b962-0e061a417c0f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + bfd9c6cd-c508-4fb6-9910-5923337a24b4)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ff8c1605-b9e3-419a-9aab-f66d51fb7478)(content(Whitespace\" \ + 864db579-07a4-4bc0-9bfa-0c5ea89d15a4)(content(Whitespace\" \ \"))))(Tile((id \ - 8e68bb74-bf64-44f9-9385-d1f66367770e)(label(\"(\"\")\"))(mold((out \ + 3b1e83b6-4a8e-450c-aa8a-d7a0a87238a2)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 857912e5-bd11-4c26-b394-dd2cd928636b)(label(Int))(mold((out \ + 2339918a-66cf-4ea0-9fae-4635d5fd4b6c)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 7b50ab67-1a8d-4cb2-bae8-1ec785e3c8f4)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 9e5daaaa-a850-4a2e-83a1-0d63eb6aefd3)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4ccb8f1c-c712-445f-96f9-7f746b28e6d8)(shape \ + 4bdb5ff2-f5f5-4b83-a871-2a0c50c32bac)(shape \ Convex)))(Secondary((id \ - a90928e0-4dc2-4a78-af9b-e03da908d2f3)(content(Whitespace\" \ + c93acc29-6f0d-4548-bb4c-a79f6ae261a6)(content(Whitespace\" \ \"))))(Secondary((id \ - 677fa960-7bed-4e08-ba47-baed1f64c898)(content(Whitespace\" \ + 186e9c42-94c4-4f1c-8c72-03151b226dfc)(content(Whitespace\" \ + \"))))(Secondary((id \ + c178330b-7fc5-42f4-9b12-bd4143e7a081)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 187239a0-573c-4dd4-a576-2c9b9f5663cb)(content(Whitespace\" \ + 1ab7cd61-7a63-4902-ac6b-5519b41a74dd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eaed48a1-3bee-459b-b7d6-a039e99046a2)(content(Whitespace\" \ + 4e3562fe-8bda-4180-9968-efa5d769fd15)(content(Whitespace\" \ \"))))(Tile((id \ - b925b8b3-6174-407c-8d0a-2c403a01379a)(label(a))(mold((out \ + fb29c220-2ba0-488b-8b4f-dd470175794e)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 314d702f-4312-443a-ab9e-57da31954acc)(content(Whitespace\" \ + f9b26649-0c2a-4ea6-ad47-221eb07dd0fd)(content(Whitespace\" \ \"))))(Tile((id \ - 79584246-2c43-4cdd-a2a1-3ff950621fb5)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 71c6ca75-6393-49b2-b425-06f7179330c4)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eb20decf-03e9-4149-82e6-d53e2798b851)(content(Whitespace\" \ + 7ee42f2b-fb54-4bc3-82d3-e2ec52eb1585)(content(Whitespace\" \ \"))))(Tile((id \ - 26e66a82-4bd0-4c87-bd53-fc3ab14145cf)(label(1))(mold((out \ + 88f0770b-1272-4414-9eba-67003eccedcc)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - db3c2d25-3ecd-4d1e-8a7f-0cb819336a6e)(content(Whitespace\" \ + 6c42f123-9cea-4ed5-ae5b-b8c2e2a942c7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 78255577-7358-4a9f-b7dc-bcbbc258d278)(content(Whitespace\" \ + 4c9beab6-89f8-4430-a41b-f9b504f94fc4)(content(Whitespace\" \ \"))))(Tile((id \ - bd3c7ccb-c3a8-400b-bbe3-3b97a27bf604)(label(f))(mold((out \ + 5568a4dc-3aa8-4752-86b6-b9009a685e75)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b0902f59-30f9-453f-a11c-f9e0a116cc65)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + c0dbfa8b-57d6-444a-9c6a-278f665aecab)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c22f8cf5-6891-4ec6-bf3f-d8006cdf2c86)(label(1))(mold((out \ + 2786036a-1700-4ad1-a169-a3833ba80b85)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c33216ef-f39a-4f55-a05e-5301d5c8d934)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 44d7525f-50bd-4d55-bf6a-44fa6ddb6d96)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 29bc4824-fa3c-4e22-a1d3-c0f603df933c)(content(Whitespace\" \ + b2250004-082f-49c8-aa1f-962ae7ac043d)(content(Whitespace\" \ \"))))(Tile((id \ - e8dd7c29-5f0d-4c00-82a0-711e5bacd6f5)(label(2))(mold((out \ + 8bf464c7-90d2-46d2-9ffa-7a4292ed2ce7)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - da788c99-cf8c-425b-9960-ba7e8d1b3ce4)(label(\";\"))(mold((out \ + 835bc565-a2ec-435f-89a5-3480d0c7f8de)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2e1ed404-00e5-4130-bd00-654f0cc85eba)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 41a5d82c-8d38-4453-bf1b-0daa6ee4fc98)(label(let = \ + bcac0509-a42c-41bf-835c-91c71468aba7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5136f388-18ba-4a95-abeb-0e88a05d8d86)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fc64a15a-4665-41bf-8ed8-9f586450d3e4)(content(Whitespace\" \ + f87b5640-9f45-4449-9bca-f5f75f823596)(content(Whitespace\" \ \"))))(Tile((id \ - df06f73a-d19f-41f0-a65e-85f120aaa148)(label(f))(mold((out \ + 30021ea1-ea8c-4fb4-b390-c052d4683e2b)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 17834340-4fe8-46df-833b-c36aa06f86ec)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + e4b4bdf1-9017-43da-b1d0-368565245c26)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7f43728c-3ef8-4792-b7e1-d5bf79a8f422)(content(Whitespace\" \ + e45c0013-337e-4493-ae0c-de06c0667908)(content(Whitespace\" \ \"))))(Tile((id \ - 6983e2cd-73a9-44b8-afaa-a3889253a938)(label(\"(\"\")\"))(mold((out \ + 6c0bb721-7e2d-4b6f-9cc1-427af04cef69)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d26b4c0c-a3f0-46dd-96ca-790b4589772a)(label(Int))(mold((out \ + cf06dab3-31c7-4608-b861-7c0d63de193e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 156f371f-f261-412b-a0be-cd01f8a543fb)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 30b18d09-9f2e-43cc-a7a5-d50428913412)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 88a30c1e-2bd2-4106-b502-ab0183a76da1)(shape \ + 1f5f5e12-6b97-40e3-84ab-d1274537ca85)(shape \ Convex)))(Secondary((id \ - 655329c9-8f7d-4667-b71e-dd487c4298ad)(content(Whitespace\" \ + f26b0b9d-004e-4ecd-a996-680ec958f6e0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 622a653b-e7c9-4526-b9a2-08ac21d4cd57)(content(Whitespace\" \ \"))))(Secondary((id \ - ab32ae5e-ca30-489f-be79-3265e7e1ed7c)(content(Whitespace\" \ + 2280fb21-e600-445b-8cb4-ba205541771a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 431d79db-199d-4e48-8ff3-b61ac052050d)(content(Whitespace\" \ + 0119daf9-ffe2-47b7-828f-3e36cd01939a)(content(Whitespace\" \ \"))))(Tile((id \ - 6ac15623-b03a-4c10-990b-f31481532ee8)(label(->))(mold((out \ + 4a55088b-f2b0-4df9-8790-8a808d7ca177)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b3f6b8e8-5b1e-4f84-8891-d5591f5696a4)(content(Whitespace\" \ + f09d619b-c99a-46e3-85c3-63c98dedb51f)(content(Whitespace\" \ \"))))(Tile((id \ - 107bc734-b12c-4d40-91a3-132fcc830136)(label(Int))(mold((out \ + 71332adc-323f-4c5f-8dbb-b7d9bc8155e6)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 5a9b1828-9af8-4675-a9b9-c056ba86fae3)(content(Whitespace\" \ + de3569d5-aac5-42bf-8a5e-0845d65db228)(content(Whitespace\" \ \")))))((Secondary((id \ - 1a0fd972-a9c4-419f-964a-8a2b633f33dd)(content(Whitespace\" \ + 5803e4b5-beb5-4d13-9357-848aacf8e125)(content(Whitespace\" \ \"))))(Tile((id \ - bd8afcd8-74a2-4004-8b4a-7026fef058ed)(label(fun \ + 9ca74c81-f846-46e8-890c-d6ef40bfbbc6)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c63a1bee-7e32-4ecb-afd0-a724aef0b98c)(content(Whitespace\" \ + 061721bb-df11-404e-aef0-4e1c985ad9ed)(content(Whitespace\" \ \"))))(Tile((id \ - 850fb734-647f-4343-8fbe-52636f374c6e)(label(a))(mold((out \ + 93ee75be-254c-4640-ad4e-49568f20c8ef)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c04c80f3-4064-4c68-acc1-ca5c299bbd77)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 1777e6b7-591b-497a-a6e1-1999b40a6f43)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - dd4462f2-7949-4878-a142-a2283001ad6c)(content(Whitespace\" \ + 36e3d56a-2134-44aa-8d2d-87a1e83ed10f)(content(Whitespace\" \ \"))))(Tile((id \ - 2cb05f48-5922-48e6-9256-e013f5793cf1)(label(b))(mold((out \ + a0bba5c5-278e-4899-8d8f-cb15470b6c43)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 339ee181-b96d-46bb-8a43-f3ff8229c30d)(content(Whitespace\" \ + 9643464d-c242-4be7-8845-97e4089bd58b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2061e785-5a18-4a0c-a4de-c1492b30e278)(content(Whitespace\" \ + 0fdceec8-37ef-46c6-b19e-f6484c9f2d45)(content(Whitespace\" \ \"))))(Tile((id \ - c811f868-2b43-468b-94c7-bf3bf1456409)(label(a))(mold((out \ + c2add7cc-b896-48c5-82bc-df319bfc2e27)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1a797da7-7c1d-441f-a6e9-5e4d028213d1)(content(Whitespace\" \ + 4c997f2b-73ee-4068-be01-2504808a9197)(content(Whitespace\" \ \"))))(Tile((id \ - b099d96b-e2de-41e8-bf2d-58c1d7f0f0e4)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + b26310ec-93bd-4e39-a3bd-0023a8aed824)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 584a877b-b2ac-4742-a979-3005537901fb)(content(Whitespace\" \ + 950dbf05-6c2f-4479-8c6c-0bdcf9e65780)(content(Whitespace\" \ \"))))(Tile((id \ - c6077bfc-7116-4a05-ace0-ad4834261381)(label(1))(mold((out \ + 8f18b64b-c26f-4267-95e6-52149758e262)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9963f7f-6ae9-4027-9ede-0b3e538aecbf)(content(Whitespace\" \ + 8159a7a5-9bfe-4886-80a2-eb1de0a701bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3f2145ac-3415-4d74-9576-5563fe64e77e)(content(Whitespace\" \ + b04feb14-582e-4409-83d9-2de95ee360a9)(content(Whitespace\" \ \"))))(Tile((id \ - 59a6b6f1-80d8-45e4-9b6d-67fb47835905)(label(f))(mold((out \ + 1f3c8988-e979-4d33-9c8a-2b988d6af590)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b2efdfc0-231d-41cd-8358-d88497d7c6ce)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + c7c40244-065f-4416-89b2-45dc2973c677)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ac6c8e5d-e4f5-4d7d-b0cb-199a2d89e8c3)(label(1))(mold((out \ + d86dabc6-4a35-457d-997f-5dd1745c942c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 47d49893-385d-47eb-8f79-932412df8120)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 18130974-1223-469c-9335-57691b0d0f09)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1dffae48-7e03-4120-8147-e8e1c71f051d)(content(Whitespace\" \ + d66e1e64-946a-46f2-97f9-c93096f6e8db)(content(Whitespace\" \ \"))))(Tile((id \ - 4407083a-71c2-4a70-be60-1415bf0a1c57)(label(2))(mold((out \ + 74e58855-f241-416d-9f54-b8e271d3be37)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f8cafdb9-5115-454f-8301-cadc935954e6)(label(\";\"))(mold((out \ + ca19b144-55cc-4fc5-bb88-6e1cac2b99c0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 186a5f65-820e-4718-9aaf-89d16d38edb1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9bc20274-fb1c-4393-ac92-808ff1b94a79)(label(let = \ + 672a922f-f6c3-46f4-9bb0-fbfc13e6b150)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0e335cf7-889c-4bb7-a5d7-7d0f5c7a71f5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 13991968-82b9-4964-90e5-0359a90e47fd)(content(Whitespace\" \ + 9cb8b1dc-0c4b-4315-891d-7b5784a5863c)(content(Whitespace\" \ \"))))(Tile((id \ - 5b8c99b5-3e5a-4934-944a-ffd97749442f)(label(f))(mold((out \ + 7c5f349c-24e7-4a2f-8454-35ea89053144)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 80a93c7e-384b-4dd1-b4bb-d9a3911a3ae5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 837a5d29-00a1-4152-8dc4-3492fe61e7ee)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1d9f52b1-a850-490f-a292-b47fb7a96138)(content(Whitespace\" \ + c668f238-b661-4e8e-a59d-541a5d96392d)(content(Whitespace\" \ \"))))(Tile((id \ - 0816d375-1b2a-460a-a84c-4c5aefa58e81)(label(\"(\"\")\"))(mold((out \ + 7962dec5-6bdc-41be-8e0f-458bc89ed3b0)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - e5f9862a-51f0-4e5d-8ae3-dfb0d14e36ac)(label(Int))(mold((out \ + 2dd0a138-b7ed-4642-8808-99b0926fd629)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b758d84b-d213-4a78-9b35-18bf57006721)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + c1d3ec25-cbd8-427c-a333-192d6a897e68)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 7f9a1bde-138c-48a0-a74d-66c75ed7ab5d)(shape \ + 96695643-1b0c-44ee-b2b4-d1cabcb50180)(shape \ Convex)))(Secondary((id \ - f872865f-46a1-4c40-880e-77586055f9ab)(content(Whitespace\" \ + a5295940-2563-466c-aaa6-8ca9da4d48dc)(content(Whitespace\" \ + \"))))(Secondary((id \ + cf7e1aff-0659-4aaa-a86a-d1fc0c423a25)(content(Whitespace\" \ \"))))(Secondary((id \ - 8b11e4a1-23b7-4cdc-8cfd-403715695b01)(content(Whitespace\" \ + b7946df3-c9c2-437a-83a3-f0578395ae05)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8eec57c4-abb0-4311-b0cf-e092c09d06e4)(content(Whitespace\" \ + 0ed4f47f-67a4-4584-b3fc-5402b7bd90c6)(content(Whitespace\" \ \"))))(Tile((id \ - 2b6083c1-baec-4672-8a01-f6c99b160e64)(label(->))(mold((out \ + 8030df3f-5ee9-4e7d-8f97-a2d5e9e446ef)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 036ccb48-b246-4a19-9742-35c7ad061176)(content(Whitespace\" \ + 0d126c50-ac37-473d-a786-99171621e36f)(content(Whitespace\" \ \"))))(Tile((id \ - 76481d4c-d3b4-40be-8cea-2cadfe14df89)(label(Int))(mold((out \ + 19767020-38c4-49b2-9f69-71fa03d4fdea)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e5c48255-c736-4d2d-891e-fef414217d00)(content(Whitespace\" \ + 692ffccc-7f95-4ee5-a748-dc424648ef03)(content(Whitespace\" \ \")))))((Secondary((id \ - fe4cc3df-ecf8-406c-b9be-0a377d0d7813)(content(Whitespace\" \ + deedae70-0bab-474b-984b-b6a750e30ff6)(content(Whitespace\" \ \"))))(Tile((id \ - 8502085a-73f8-4d1e-8e33-1dc2223a63fd)(label(fun \ + 6edc5b49-902b-439b-813c-8780ab2a1486)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1dc44d66-5a48-4ec9-924f-411b68da14c0)(content(Whitespace\" \ + f5950683-3279-4510-8f44-853289f07b7d)(content(Whitespace\" \ \"))))(Tile((id \ - e3962dae-fd33-47b5-bdf0-82c72409aa11)(label(a))(mold((out \ + 919762b1-7193-4c52-905f-807adaa9fa02)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5dd93d5d-b656-45b5-ad37-d49fe0ea23ec)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + d0963770-45ec-4eed-90d4-d0439869fff0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a10f02bb-a200-4a01-89a1-39e27bb8162b)(content(Whitespace\" \ - \"))))(Grout((id 281e77a2-ba43-482c-a93e-cfe10259989d)(shape \ + bdd93646-39dc-4761-9b0b-2663ee815f0b)(content(Whitespace\" \ + \"))))(Grout((id 602031c5-6a9f-482c-b103-fae3d559b137)(shape \ Convex)))(Tile((id \ - 23de4bdc-0af1-497e-83e0-cc5bca1b3855)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 79128de0-b9e0-4c95-a2c8-2cef2d6f3d12)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e64bc015-5917-4465-904f-8af5124b9bcd)(content(Whitespace\" \ + a1059cc9-f4e2-4255-966b-604b813b1c70)(content(Whitespace\" \ \"))))(Tile((id \ - 95ce2ef8-d860-4f18-85d3-9822fc8d459a)(label(b))(mold((out \ + db34c768-6a7a-4e0a-8f47-762e74183e0a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 21cd3096-d858-4ec9-9007-2b1ace927c03)(content(Whitespace\" \ + 8d28ee11-21ef-4fb9-967e-f8b0bec01f56)(content(Whitespace\" \ \"))))(Secondary((id \ - 005f8b6e-a906-429e-beb9-439d29d3a76f)(content(Whitespace\" \ + 1c661a03-f7c5-4010-bdbc-99c6e10ad95d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7cb7b539-3bb6-4782-a60e-b06fe71c43ac)(content(Whitespace\" \ + 67a5dfb1-084f-4397-a7ce-aea71d89d603)(content(Whitespace\" \ \"))))(Tile((id \ - 5be6ea6d-0754-467b-9327-5f1578911f06)(label(a))(mold((out \ + 6af292b1-c8cf-40c3-850e-a9f57d0b01ae)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8698ee48-48d4-4696-994e-17077bb11986)(content(Whitespace\" \ + 8a824172-67fd-4122-8172-b604807dfa36)(content(Whitespace\" \ \"))))(Tile((id \ - c360a076-4dd9-45c7-9db2-2b3c60c0303e)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 4d678f68-f617-47cb-8aff-465b1eeb8b3b)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6e979b62-9763-4e7d-bdae-d0ffb58c60d8)(content(Whitespace\" \ + 90a12374-4576-48db-8e13-165a9a21c350)(content(Whitespace\" \ \"))))(Tile((id \ - afa9df4b-9fa9-44bc-8ba3-f77e81e75310)(label(1))(mold((out \ + ea78e47c-f511-4a2d-8fb7-ee025f317737)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79d79ed8-f8cf-4f3a-9a1b-475b14198afa)(content(Whitespace\" \ + 46260c07-be9e-4386-8dee-dab4b741a5cc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 27f19fbb-97a5-4ed4-8afc-6de00791df62)(content(Whitespace\" \ + c3829b28-a233-46a1-a6ca-191802323243)(content(Whitespace\" \ \"))))(Tile((id \ - 3c514af7-2182-4b0a-a4ea-19e14d9fae32)(label(f))(mold((out \ + 30947342-4312-42a2-be5a-9a0a5d758a56)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 88dcb230-1f6b-423b-a117-d05d9d446f3f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 4e51c244-6225-4e93-af67-83613640fc2c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 690e9897-85c7-4922-991e-0f942c89dc0b)(label(1))(mold((out \ + e9bbe4ad-8032-4153-930d-69e078e6a425)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 70533e9b-4c3e-4ce6-a86e-384267c022b3)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 7877efdb-4f49-43e2-a10b-9336cd1078fa)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8730d036-9d20-45ec-b09c-daaaec74ce03)(content(Whitespace\" \ + 06f706c7-edc0-4c53-abaf-653bee08519e)(content(Whitespace\" \ \"))))(Tile((id \ - 9f0be8c9-658a-421f-baa1-8a502712cd2c)(label(2))(mold((out \ + a0d3ce6d-c01b-437f-8c15-799b7c290b2e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 5719931b-6b7d-4eb4-b867-e9eabb4db935)(label(\";\"))(mold((out \ + f7f1fe30-f76e-4f09-a642-dec5acfd3e52)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4bdc2209-c2eb-4db7-aa63-043d96e5686e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a872ee48-4669-43c4-bec3-1186db91148b)(label(let = \ + 408fc2b0-793a-43c4-a2c3-3247418af171)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 38c32938-8c8a-4898-ab92-bfd9b0046658)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 17434130-d1d1-413e-afa1-6998cc68025d)(content(Whitespace\" \ + fb37a419-dcde-4b3c-9359-723ebb4c61c2)(content(Whitespace\" \ \"))))(Tile((id \ - 1bec817d-8b8a-478a-af31-abd16028b864)(label(f))(mold((out \ + 1799cdf0-8ed6-4b82-aece-da0808c4228c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c25eea0b-ab19-4c02-8578-87a0d9ab7f31)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 29102023-1a5b-4447-bbb0-aafc7ac8c573)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8e40e986-1715-4e9f-8fa2-8473bf0d1468)(content(Whitespace\" \ + 305a2b6d-3c3e-478f-91b2-0af8ac8c98d1)(content(Whitespace\" \ \"))))(Tile((id \ - d634c2c3-b754-4067-b7e2-0f8207ced53c)(label(\"(\"\")\"))(mold((out \ + e15899d9-68c6-4086-83aa-6d01e56d892c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - b04350a6-808a-49f8-9e1c-fdc388772171)(label(Int))(mold((out \ + a09d060b-a50f-4fac-a0d2-9622796d866e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - fda74513-a1b9-432a-82b8-e3544b49cb04)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 244abda5-730e-48c8-9a4e-7d1f44144bf0)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 6fe3a505-3d3a-4db2-a2a0-d6c3be91ca71)(shape \ + f8b354b9-a827-4278-9107-b0cba7f06efb)(shape \ Convex)))(Secondary((id \ - 4b53b9aa-7664-41ae-a400-e0dd16b62509)(content(Whitespace\" \ + 6dccec00-de23-4f9c-8f45-c7e8117538e6)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7189ce31-cb8d-4e09-bae1-2cf87591683d)(content(Whitespace\" \ \"))))(Secondary((id \ - 92b30817-375a-433b-915a-1c006150cf4c)(content(Whitespace\" \ + 33261f91-20dc-43ad-a71a-9732e33e94ff)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9de55cbb-b6bd-4c57-ae4b-fdad96a970cf)(content(Whitespace\" \ + ad5246a6-85f5-423a-8182-0e133efdbdfd)(content(Whitespace\" \ \"))))(Tile((id \ - afda7489-fbc7-4d45-9a54-ff7dc065dcf0)(label(->))(mold((out \ + 659b9ebc-1af5-49b5-872b-0e295bac1f62)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - da2edaf2-06f9-49b0-9c52-0692d36feb1e)(content(Whitespace\" \ + ade62157-6f94-4645-b4a9-3ec15d795e0c)(content(Whitespace\" \ \"))))(Tile((id \ - fe5903b2-837a-4bcd-9ef5-1c2428f8a2f1)(label(Int))(mold((out \ + 586ee7a4-59cc-4c8c-90ab-cf1faf0b7876)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d0cfffab-e8d2-47c3-a805-8674d049622b)(content(Whitespace\" \ + f9859a85-2aea-4e56-9f4d-11254c4de8c6)(content(Whitespace\" \ \")))))((Secondary((id \ - dc042fb4-d72a-4240-828f-dd621adbc20b)(content(Whitespace\" \ + fb2ec18a-2d75-4a04-a5c1-b0787a205336)(content(Whitespace\" \ \"))))(Tile((id \ - fa4a9b14-7e47-493b-b496-b6e38e830ad8)(label(fun \ + c3e0703c-abe8-40d0-b3fa-3c63ea47483c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - cd361305-ba60-4635-9bfc-33eb27e07c44)(content(Whitespace\" \ + 24ef38f8-8e53-40f7-9cfd-5c5627d925ee)(content(Whitespace\" \ \"))))(Tile((id \ - b14bc419-8dce-4fcf-b8bb-82dd99c04dd2)(label(a))(mold((out \ + 6eed80be-2011-4dd4-bfc8-f571bea100cb)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8a72a69a-b947-4054-8244-0388911347f5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2f183a0a-de5d-4efe-9c1c-4c669cf9d4e9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d44000e9-2c1d-4260-af86-dbef475879a8)(content(Whitespace\" \ + daec8d15-905c-4316-8301-3aa674f026d8)(content(Whitespace\" \ \"))))(Tile((id \ - 6b3a34ab-f687-410d-b155-b117acda0886)(label(Int))(mold((out \ + 47beccea-7e84-487f-9ab9-f761b00383e2)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 07f3c1ff-5677-4ba5-bbb2-a9eea1932cd8)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + d016d41f-801c-4793-b3d0-ecd33e37f205)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 2b485099-40a8-4b37-991c-c13947cfdcf4)(content(Whitespace\" \ + b267102d-ba9c-4b17-9f0f-3428b2337027)(content(Whitespace\" \ \"))))(Tile((id \ - cb881fc9-3ea5-4207-aa2b-e23e634e7bc1)(label(b))(mold((out \ + 3679576d-8ca7-4afb-abd8-a04192ba414b)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a415c809-2799-4852-bffa-0cf66d2afaa0)(content(Whitespace\" \ + 9c4afb61-40df-4943-a033-aaa259e249fe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 45e22326-9dac-4eb5-8835-9da95894cb0b)(content(Whitespace\" \ + 17721f47-c0dc-4e23-9341-8a0c2a37a906)(content(Whitespace\" \ \"))))(Tile((id \ - 4b9ba7f3-6159-4020-960c-6c725c45c9c6)(label(a))(mold((out \ + fbd40537-4e0c-48fc-afef-d866502fccc4)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ce206ee6-866e-4bc8-96d6-ad8a58194a73)(content(Whitespace\" \ + ede9a8ca-43db-4930-9285-1406628c896f)(content(Whitespace\" \ \"))))(Tile((id \ - 1112cc54-8977-49a9-896c-f45d78bc0c01)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 56ebe246-3b97-48e4-b685-dc383d766cdd)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 53909189-4422-49c1-863d-60707bf196ae)(content(Whitespace\" \ + 418a6ccf-97a6-45b3-832d-7462588ce695)(content(Whitespace\" \ \"))))(Tile((id \ - f76561a1-0b5a-4482-8716-e7bb3a4745ea)(label(1))(mold((out \ + 36e744be-17bc-4523-a04e-8f9c81c67838)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fbe2251e-9b29-4a4f-8f50-eef65cd19f3c)(content(Whitespace\" \ + 186313e6-f099-491e-bfe6-67eda5c29054)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4386e434-302f-4fcd-8350-8b97d76d32b0)(content(Whitespace\" \ + 216eda00-92cd-47c3-9b2b-47fd5b6e96e6)(content(Whitespace\" \ \"))))(Tile((id \ - d0b49131-03e8-4b32-a97f-d8903d8b8248)(label(f))(mold((out \ + c08c18a5-12e9-4384-ba31-042d7d46b4e1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0348cc19-de1e-4a2b-ac72-fde8ea77dcf7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 525eb658-667b-4414-819f-9c7fe3c1f2cc)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0d196b4e-3689-4ee2-a64b-0115793d6302)(label(1))(mold((out \ + 16f981f0-8141-4d22-b474-b569fe24a0f5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a428c920-3772-4cd4-a9c2-9bfeb9e2954a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + d45c5ca7-6fb0-40a6-b4c5-677bfa7f94d5)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 43ffb69a-14e6-40ed-9038-8fd652c5e9f3)(content(Whitespace\" \ + 3b370437-e9a3-4ffc-9312-8284a99157b2)(content(Whitespace\" \ \"))))(Tile((id \ - 6a1223e4-df11-4025-9411-567efebb5f3a)(label(2))(mold((out \ + 78a530ea-c689-4c64-97a8-f1d5b965dc99)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d44c175b-4647-4a1d-92b2-95084289ba26)(label(\";\"))(mold((out \ + 179e5879-afba-4fe7-aa18-5da2ef106bed)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3896cd69-a0f5-4781-ae0f-7b90b3924dee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0c77a664-2b94-4237-83c2-e3eea15490e0)(label(let = \ + c3be3c08-bce7-4b02-9764-9611e379e6fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 99ac78e3-4cf4-45f0-ab03-866a069dcc51)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7c706dfb-7bc0-4154-a062-491cdd811036)(content(Whitespace\" \ + b258b4c7-c386-451d-b7f1-5020942da564)(content(Whitespace\" \ \"))))(Tile((id \ - f63ce723-9ddd-41ef-986b-97f097c7bd89)(label(f))(mold((out \ + 335a6690-58e4-410a-ae7b-1a4705db4d9f)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 74336659-23c4-483a-9d57-8661f8289701)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 4aaf3fbd-24d2-4655-840a-67d67d685e22)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6b4a8b16-3250-4f2a-a66f-2c63da6f26ed)(content(Whitespace\" \ + 7c2d4144-90a7-430c-899e-ace6145ca414)(content(Whitespace\" \ \"))))(Tile((id \ - 5c0e2f73-2e73-48d1-8b68-6c7b20076c9c)(label(\"(\"\")\"))(mold((out \ + 97289ff1-93ad-45b5-aee4-78637a324c14)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f9dacf8a-5014-47ce-ad50-8c8deddfc5e4)(label(Int))(mold((out \ + 56e4df84-fcd5-4b53-a0fb-4485a034702d)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9bed43c0-a447-4aa8-b21f-50da595d633b)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 9611b7b3-4fd1-4130-85cf-a32bf4474afe)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 613b9ada-fe18-4369-b5d9-70d3f1e53514)(shape \ + db7ad3c0-4504-4c44-8057-50fb96503ef3)(shape \ Convex)))(Secondary((id \ - c1b1ee36-9ce6-47da-95df-3bd2fabb54c7)(content(Whitespace\" \ + 1e15d179-7a0e-492a-9472-4ed948ef5d53)(content(Whitespace\" \ + \"))))(Secondary((id \ + d6194650-5984-43cf-afc2-221c9b9edc7c)(content(Whitespace\" \ \"))))(Secondary((id \ - 3f8dd0d4-b5c3-4a00-be38-632c75924975)(content(Whitespace\" \ + bb44d050-397d-4f09-a825-a9e288bb2ef8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 210586ad-11cb-4fdc-8598-b61597743070)(content(Whitespace\" \ + 0f6ec549-f9db-4207-927c-eec4f0a7df5f)(content(Whitespace\" \ \"))))(Tile((id \ - 2411959f-40b1-45a2-9a26-78b2966fe759)(label(->))(mold((out \ + 157340e3-9719-4770-a926-e0cb4c0d7c91)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8468a458-1d6e-4688-b961-30b672c7b784)(content(Whitespace\" \ + 217220ff-a9bd-4fbe-ab6e-e39e71dd7c0f)(content(Whitespace\" \ \"))))(Tile((id \ - 9636cf6a-c36b-4a1a-ae3a-088c1fa1a615)(label(Int))(mold((out \ + c3ea6e30-410d-425a-a924-066b5a0b70ee)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - af7b6ff1-4b4e-4353-a76a-34423b12789c)(content(Whitespace\" \ + 63fdc9a9-6b35-463e-943d-e715ce781a31)(content(Whitespace\" \ \")))))((Secondary((id \ - df973686-43a2-49e2-afee-a50d321ec924)(content(Whitespace\" \ + 1e7db639-f289-48d1-a736-652a8775a2ad)(content(Whitespace\" \ \"))))(Tile((id \ - 7b0dc971-354a-4109-8088-cbcb76976b4a)(label(fun \ + db8d8b9e-7ea0-41ac-99a8-a7510ebbb8fc)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2a59225e-0206-442c-8cb7-d473bdefa5f4)(content(Whitespace\" \ + 0ee79c80-e6a7-43ba-91b1-ab079873b4e0)(content(Whitespace\" \ \"))))(Tile((id \ - f035d365-b3db-4c44-b821-75267fa9e43a)(label(\"(\"\")\"))(mold((out \ + 6fcff986-dc50-4012-a998-4afefd9503bd)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3e446bad-6497-4089-a3df-cd18e6bf487e)(label(a))(mold((out \ + 9826d7b5-b6ce-4dda-9a1f-b3e3f787c202)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d31d780d-e1f7-484a-a4df-948428a8be88)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 6e336792-a7c6-499f-a483-8cd8a3d1f860)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c9906747-28ce-448c-b32c-460c1fbfcba0)(content(Whitespace\" \ + ecfe0be8-49eb-4a95-918e-5eea06086693)(content(Whitespace\" \ \"))))(Tile((id \ - f26eca5e-f6f6-488d-bb10-84359f8cfff6)(label(b))(mold((out \ + 2652ca66-7145-4427-942f-bb9e2c2c505d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - f6304be2-2391-41f4-b07c-8577d6723ea6)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3dae0dfb-2d9d-4805-a810-f3065bf44dbe)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a97d9656-ba87-48a5-9236-16057c6c8db9)(content(Whitespace\" \ + 35fdfb89-9162-4f18-afa4-5b21f031792f)(content(Whitespace\" \ \"))))(Tile((id \ - 668b47f7-32b3-41da-aee9-67e935ad47ce)(label(\"(\"\")\"))(mold((out \ + fceda397-d473-402b-86e0-909a75930cce)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4a6eb5c5-2492-4036-ab60-2ec5236e63c9)(label(Int))(mold((out \ + f754468b-87bb-486c-b95f-e3cd02b09cf9)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d59e589c-fe70-49e1-a8d7-616b473740c0)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + eec33fdd-8574-4c87-95e2-2d1ac57f6309)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4ad3a1e2-6569-4caa-afe4-da4da9fe3d1a)(shape \ + 0a3f1ef7-fe0d-43b1-90a0-e5589138f588)(shape \ Convex)))(Secondary((id \ - d796506c-840e-408b-a08d-0ad475707e48)(content(Whitespace\" \ + 4f22bf09-98c6-4204-893d-f5263e57a726)(content(Whitespace\" \ + \"))))(Secondary((id \ + b8d40633-c604-41d2-9a9b-268130bf5d76)(content(Whitespace\" \ \"))))(Secondary((id \ - 8b2e5ede-ec8b-4884-a35c-bfc00af45040)(content(Whitespace\" \ + 7aef0d74-8a81-4190-ab7c-8e8c47eb6e35)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 95f218f6-5291-4bb1-939a-d2c9c8dce1c0)(content(Whitespace\" \ + 5a2fd7e6-1856-4640-8a21-df412669eebd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 25d47725-d6db-4a27-adf3-41610dd615b4)(content(Whitespace\" \ + 16ab6ab0-3d6c-4800-a44a-9b0b0950bc50)(content(Whitespace\" \ \"))))(Tile((id \ - e450962c-c9cd-4836-af1d-53fa57875af1)(label(a))(mold((out \ + be1a6391-c1f7-4780-a6db-c1f8f7500058)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fd4721fa-fa6f-4ed2-bb0f-54c0a151fec6)(content(Whitespace\" \ + c3e5dcc1-9137-4ede-899e-09f9e82938c1)(content(Whitespace\" \ \"))))(Tile((id \ - ff6dbec8-5267-488a-b3b5-80ab0d700c44)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 3ff81597-b364-4e23-848e-c47bb26b1bfe)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e5be275a-a1bc-4ade-b700-b97349739cb9)(content(Whitespace\" \ + 4d86c05d-e02e-4aba-a962-1822675de667)(content(Whitespace\" \ \"))))(Tile((id \ - 033a3db3-6138-4464-a9b4-c4869961146c)(label(1))(mold((out \ + 9e0f66c8-c9aa-43d1-b456-e0e652ae2020)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 94eda17a-ad4c-4393-ae10-8302b53e2d7c)(content(Whitespace\" \ + 1d369fb1-2dc5-4447-8915-12487790edbc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c7067830-b673-4dd0-8655-5f4d97c2aabc)(content(Whitespace\" \ + be2fff4c-d1c3-4503-96d4-04d0037224d0)(content(Whitespace\" \ \"))))(Tile((id \ - 4f724995-67b6-4b4b-bb5f-fcf1893a916d)(label(f))(mold((out \ + 62ff48f7-a3e9-45de-bfc0-e34bc0ec2760)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 67493c89-eb02-46da-a207-711ea889fdd5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 761724b8-7e91-45e7-b52f-6cd9a3cadae7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6e16ad8d-fbee-4c7b-8fe3-80c0dc66454e)(label(1))(mold((out \ + a99dfc1e-264a-4739-8800-1868f1e89e68)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 52bb5578-b1f3-4d68-a8b0-9dab84317f20)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + ace5b158-f6ff-4ee8-bd41-3ed5ec5ffde1)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd6ae394-4a3b-412c-bc4e-281e3aaeb2f5)(content(Whitespace\" \ + a1de0c7f-e868-4e71-944f-3ae90a85e456)(content(Whitespace\" \ \"))))(Tile((id \ - 894d7f45-79e1-4d32-a6bf-b51d97b102b8)(label(2))(mold((out \ + 0fc7cb34-f657-4db1-a021-3632c7887859)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 25bf6d42-5a8f-4449-a3bc-ad9bbfbde8f3)(label(\";\"))(mold((out \ + 327b6589-861d-4691-be3f-9b8792818cec)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 65967ee6-68c2-4430-bc4f-4fe243a7f89c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bf5cdf3f-9ed1-4e43-bd7a-833e2c043ab4)(label(let = \ + b20391a6-01b9-4f37-a613-bbf4e03cb0bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 24d47d08-6b41-4f26-8dcc-7d5baaed3e09)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b6207fe7-e2ff-440f-b49d-f772f54a8a4d)(content(Whitespace\" \ + 0dd39046-06b7-4023-b190-e31c0d021a36)(content(Whitespace\" \ \"))))(Tile((id \ - c5fd7629-2245-4de3-ad4a-e43577f378d4)(label(f))(mold((out \ + 728a6798-5239-478e-a409-c508a3103c1c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8b77b9a3-da5a-49d3-89d9-2389716d38a9)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 7b9d10f7-45f8-4993-aabf-92be6dc2bdbb)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - da6cf85e-784b-4688-b4bb-a5de6895cb9e)(content(Whitespace\" \ + 6ec41b2e-40f7-4078-a961-94aac27be53f)(content(Whitespace\" \ \"))))(Secondary((id \ - c9436d2f-9525-4014-81e0-13627c84fed3)(content(Whitespace\" \ - \"))))(Grout((id f72daea4-0e1c-46d4-a577-11dc663c4c3c)(shape \ + a736d742-53d7-4fb6-9ec9-1d2eac804a86)(content(Whitespace\" \ + \"))))(Grout((id 4329136f-264c-4372-8ea7-f8c10487ba95)(shape \ Convex)))(Tile((id \ - 3f04215c-9c0b-418a-9fed-5a345edc51ae)(label(->))(mold((out \ + 2b76ff0d-dc63-4264-9454-2c193f26235a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4505142a-ee63-4255-b9a1-45967d536e7d)(content(Whitespace\" \ + 7b9907d8-9300-4180-a175-2c24270ec658)(content(Whitespace\" \ \"))))(Tile((id \ - 850f1156-171d-450d-a697-2d7426fef890)(label(Int))(mold((out \ + 1e1fb328-d749-474d-bb5f-f472340b26ff)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4c43eaeb-6058-41ea-9175-5593ce489446)(content(Whitespace\" \ + 82a839db-b207-4243-8ef9-a0fdd1d4977b)(content(Whitespace\" \ \")))))((Secondary((id \ - 4ac2e2d2-5e2c-483a-8419-90979d2acb87)(content(Whitespace\" \ + 28017d7a-90b4-42d0-a224-14df635f5cb9)(content(Whitespace\" \ \"))))(Tile((id \ - 45721068-5191-41c0-97d7-0ecec60d398c)(label(fun \ + 2de57b79-70a0-42ec-b6c3-fa87e309c7ae)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a10f8fd9-bcf7-44d9-aeef-b09b800ef4e5)(content(Whitespace\" \ + 10f48b4f-ff10-4b86-aad9-b5922fb5da8c)(content(Whitespace\" \ \"))))(Tile((id \ - 72f6c14b-dbe3-4b2a-bc68-c3b77326634e)(label(a))(mold((out \ + f2348448-61ad-4896-9efe-f5c68d6126d1)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9a531af1-8ffc-43f1-b926-4dc9f2c11e75)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 0f3408cf-6a89-4975-b1f9-a2f59967085a)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 1e8944ec-aed0-4ae0-9f09-dcadc92e3a1e)(content(Whitespace\" \ + 26c7004c-0b50-45af-bf64-b952d5570936)(content(Whitespace\" \ \"))))(Tile((id \ - ef3da217-434a-4bd8-8fe9-d314eeebd0b2)(label(b))(mold((out \ + 31b7aa1e-caeb-4bf5-aea7-a7ef550410d1)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8fd1e860-a469-4bbb-9ba0-a21f39f8a73a)(content(Whitespace\" \ + de6a2956-02d1-4dec-bb7f-f519ab1b22ae)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 34aea284-bd45-4f35-a7ca-dabfac1a7c40)(content(Whitespace\" \ + 3e8e3852-2189-4731-b126-62cc040cb7fb)(content(Whitespace\" \ \"))))(Tile((id \ - 9b3e623d-741c-4c2c-8792-9e1cb669ec9b)(label(a))(mold((out \ + 1a75004d-8654-47d8-9ef8-cdcda6af8abe)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7ea12851-27c9-438a-a64e-60d23f7d2fdb)(content(Whitespace\" \ + 3097e62b-6fea-4285-9c2d-76ddd8cd327f)(content(Whitespace\" \ \"))))(Tile((id \ - 68c7ad7c-cb45-4e5e-95fb-62e8b057459a)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 522631b0-51a6-49ef-9abc-b6273bf20c7e)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4b02ca6c-e206-4d48-ac79-e586dacf95c2)(content(Whitespace\" \ + a56243da-d4a7-414d-8d86-c68f744db057)(content(Whitespace\" \ \"))))(Tile((id \ - 590fbd3a-dc13-4b98-8b16-cff8ede68c0c)(label(1))(mold((out \ + 8ebacfdd-9092-4a93-9ec7-2e92f8643c09)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 855f8c1d-1b60-4b7d-b241-00508971446a)(content(Whitespace\" \ + f6df533a-54f3-446d-853e-f69eb8a6d193)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6d3a220e-5996-4892-8c80-3a1a2f0db1f2)(content(Whitespace\" \ + 27d516fd-eb3d-43fb-808f-2d82a643cdb8)(content(Whitespace\" \ \"))))(Tile((id \ - 93989e5e-b66c-4af9-b823-b4c08c5f4fc5)(label(f))(mold((out \ + dea5ae80-2015-4ecc-9896-25bf87d3f4d5)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 424566f7-fea8-497b-be94-cecbf4bad21f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + b2f5575f-8ec6-4cb6-af4a-0615a67562a6)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 870675ce-55e5-49ca-a65b-dddca83a5ae6)(label(1))(mold((out \ + aea0445c-e483-407c-a437-8b6af5a169cd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1187b178-0c2a-43d5-a21d-e143d9341953)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + b4eaa61f-b26e-45e6-be82-a8ebfafd706b)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0cb654fb-692c-45d3-ad49-91eb6b083f7f)(content(Whitespace\" \ + 64122c13-c11b-4214-bd9d-1510bafa1641)(content(Whitespace\" \ \"))))(Tile((id \ - 40aacc49-f016-4522-8928-3acda44d7542)(label(2))(mold((out \ + 2bd7c6a6-cdad-49fb-9567-610d42a1c8d8)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a2a6aadf-7f5b-41f7-8171-6779ec582301)(label(\";\"))(mold((out \ + de26956d-57fb-4a03-8a45-0ccb33d5bb90)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a8d850ee-6980-4d7b-92f3-36da569100ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 61c23189-a6bd-423f-80d0-1835a313ccf1)(label(let = \ + 46a3c13e-1b01-42aa-b0d4-b13476e95a7d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 535cd622-f095-4182-aff5-7053a18f977f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - db64bd98-a11e-4305-b7f3-b452b1888ba7)(content(Whitespace\" \ + b01cdc62-89e3-4fe8-bb27-e947cb94db9c)(content(Whitespace\" \ \"))))(Tile((id \ - d67f7404-2ac5-4079-ae12-a9ed9fb85d31)(label(f))(mold((out \ + 7cc510a4-ded7-41bf-9823-1bec60d9e27c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f69341bf-96a7-4961-9a5c-2d3f200f22fc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 71a88a9a-3d75-4cb2-8e88-a32ab70a60eb)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 20e3841b-6918-428c-a2af-1bad8782d4bf)(content(Whitespace\" \ + ebf21bdf-3bce-4b70-9a08-5736c3b6d2ec)(content(Whitespace\" \ \"))))(Secondary((id \ - b724bbf3-7f25-4669-ad55-bb9bbf4e8115)(content(Whitespace\" \ - \"))))(Grout((id cf84f16e-f166-4b51-b4e6-049b1ce1dec9)(shape \ + b2542236-2b19-4028-a326-ee543b6682ae)(content(Whitespace\" \ + \"))))(Grout((id 4904f6f4-5647-4f1e-a20b-f66d448c7376)(shape \ Convex)))(Tile((id \ - 0abbf0b4-2348-4efb-aacb-52012081dc37)(label(->))(mold((out \ + 00321b6f-ba79-49d7-af93-ecfc59f95179)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d46fa747-5e85-489d-9d69-059a7f07f977)(content(Whitespace\" \ + bd018672-ca63-49db-b999-0717aad334f3)(content(Whitespace\" \ \"))))(Tile((id \ - a0a02c22-c092-4ceb-b17a-450331c8d17f)(label(Int))(mold((out \ + 6fcbdb9d-0643-4a21-9cb6-3f18b93dd295)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 639db5f8-2ee5-4660-b6d4-5852f63d6b99)(content(Whitespace\" \ + 9fc4fd55-fb9c-43af-a714-2e6868b4220c)(content(Whitespace\" \ \")))))((Secondary((id \ - 6fa1692e-f4dc-47f6-904a-f6efc37a65b2)(content(Whitespace\" \ + 946755b3-5079-40b2-8ff2-e323564a19ee)(content(Whitespace\" \ \"))))(Tile((id \ - cdf83aa5-2b6b-4e42-97ab-f6c922a3b3f6)(label(fun \ + bd49e1fd-89ea-4e9d-a310-3209512d08c2)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3fe95f8a-f9d1-40c6-bb91-d31bea6aafcc)(content(Whitespace\" \ + 23549daa-3b71-4579-9f0b-b964225577c7)(content(Whitespace\" \ \"))))(Tile((id \ - a1ebc17b-a578-4ebd-bda3-8fcdaa59d3eb)(label(a))(mold((out \ + f7a154bf-1645-4cc5-87ad-35a4f88d8a09)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9d1ddd32-a36a-4514-970b-4d6651f8c4ba)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + e203b066-ff99-4c9f-806a-edd8ec223888)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 51f2df2f-b75e-44fe-abdf-5f5e0179e334)(content(Whitespace\" \ + 45fbcd2e-e805-426f-a661-115a0c8806df)(content(Whitespace\" \ \"))))(Secondary((id \ - 67fb4d36-10b1-44d6-a3e7-21dd1060c696)(content(Whitespace\" \ - \"))))(Grout((id a7fb5a73-2ad4-45be-9217-a15421b94b51)(shape \ + a74f8035-9b04-44b9-9f51-4d13331dc7d9)(content(Whitespace\" \ + \"))))(Grout((id 8eafc01f-7c09-41a0-8f80-3cced03c8ef1)(shape \ Convex)))(Tile((id \ - 17a41687-b08f-4ff2-98af-2fea47f95f24)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 7e00b638-2c46-4f87-a513-030a1fbd58ac)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c406ea25-c689-4fc6-9a0b-a86d384636bf)(content(Whitespace\" \ + 036ea3e7-445f-41d5-a6a5-571fac37a6b6)(content(Whitespace\" \ \"))))(Tile((id \ - 16ca4023-75c3-4218-878c-8f629b0dedd4)(label(b))(mold((out \ + c30bf2cb-2fec-475f-b2e2-7710a7428fdc)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d926a732-ae87-4767-a100-e9858bd52605)(content(Whitespace\" \ + 971be3f4-5d32-4025-b7ca-759bc80b2b5f)(content(Whitespace\" \ \"))))(Secondary((id \ - b640f897-88a9-4dce-b9e3-7473d6e85e22)(content(Whitespace\" \ + 57e35c16-243c-49d4-bede-5ee3cf1d17fd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f0f645d4-8e99-42a1-ac9e-69bd4f9cd1b5)(content(Whitespace\" \ + 5655c2b4-ec64-4663-9d0e-cbcd97695216)(content(Whitespace\" \ \"))))(Tile((id \ - 35053850-23f5-4acd-bf45-2f1258d00b66)(label(a))(mold((out \ + 99fe2662-76cf-4f90-bb20-518c9286396b)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ce99772e-caa1-4d3f-ac59-6d4ad3a887dd)(content(Whitespace\" \ + d3d045d4-aea0-4908-aaa1-475a642301f5)(content(Whitespace\" \ \"))))(Tile((id \ - 963ab1b4-4cfb-4718-bb45-9dabf362279b)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + bcec14dc-b0d4-48eb-9448-26fb5086d77e)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e58ebe60-aa42-4470-925b-062afaa8f755)(content(Whitespace\" \ + 7c2138b7-1474-4325-8368-63d97bd2b2ff)(content(Whitespace\" \ \"))))(Tile((id \ - f9dc59ff-5f53-4d2b-8633-516f300f2be5)(label(1))(mold((out \ + 14a6742b-7a0a-4f01-b469-ef428281d4bd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d66d2f4c-5c43-4cbe-9fcc-b9839b8c81b3)(content(Whitespace\" \ + dc5fe424-8c81-42ee-bf7c-6259aad8be89)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 357f7de3-fa55-47cf-a63e-546895193402)(content(Whitespace\" \ + c1b8ef09-78c6-41ff-afe6-97f9bed07b4e)(content(Whitespace\" \ \"))))(Tile((id \ - d85833ba-41c6-4a25-9b63-4b8b3a2fc33c)(label(f))(mold((out \ + e0af1a70-221e-4ca5-b529-f8f9e9e24075)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 09900b61-5baf-4d89-a9d0-a211fcdbaf30)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ea937068-03c3-46b5-838e-8431ac511223)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3a620d4b-f98c-4e09-90e2-edc51467b958)(label(1))(mold((out \ + c04f2911-e937-4997-8dec-044f8062e0ef)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 54ed2b3a-d7ed-46a5-b5e9-6062e3d706b4)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 2ddbce58-512d-454c-9414-71cc83365048)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fa59e47e-78df-4f99-9887-513007871ab6)(content(Whitespace\" \ + 902b01ab-4426-436c-85fe-c1177823af7a)(content(Whitespace\" \ \"))))(Tile((id \ - 20aed684-0a33-4837-9c91-b6f388a392a4)(label(2))(mold((out \ + 231978f4-f1a2-4195-a82b-240349d0e1a4)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c3ec9096-55e5-4952-a2dc-c38d9a1934e3)(label(\";\"))(mold((out \ + fb53893b-398d-4528-b5a7-07397f1fde0a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4a957aeb-2c1f-4f0a-8186-0e897c718626)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0068b781-4219-4451-8db5-cae8ea87da2d)(label(let = \ + 3c25df64-783c-4df9-a51b-a0e030b1b234)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f49582c7-8751-4026-b008-a40322fd6163)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7748ffc0-75ef-428d-9b58-4580dd7c3b78)(content(Whitespace\" \ + 36cd6b35-6bbd-4777-8c79-728c62f8e9f1)(content(Whitespace\" \ \"))))(Tile((id \ - 5b1744c1-7cc5-4cab-95c6-c805bfb455bd)(label(f))(mold((out \ + d58d666e-eeb7-4fe2-80a4-7e3d47cb0bd9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a9b7c3da-34fd-4c13-ba76-8d12eaf8b013)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 8db0136e-51cf-4e0f-a71b-b36cbab2505d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 668fe660-3748-42f2-8750-1d9233647860)(content(Whitespace\" \ + ad59ce9e-71fb-4e09-b957-0086013b9b2d)(content(Whitespace\" \ \"))))(Secondary((id \ - 792a7fe1-914a-41ec-8e3c-6946087ccb17)(content(Whitespace\" \ - \"))))(Grout((id 09163549-d4c0-4420-8fde-0ee1b95a3e00)(shape \ + fd9389db-acbb-4615-bf01-172db6faf640)(content(Whitespace\" \ + \"))))(Grout((id 23589f3e-8d1b-46ed-902b-c7988503d002)(shape \ Convex)))(Tile((id \ - f21a218e-97b1-4cb9-a0a5-e5f1548d6c1f)(label(->))(mold((out \ + d51a3452-36eb-49ee-8210-d128252e1395)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1b95ea63-2f0a-4cd3-80ae-4e148633c82c)(content(Whitespace\" \ + 3acceab2-5529-43c1-b4b3-3c735851c937)(content(Whitespace\" \ \"))))(Tile((id \ - c1b4fac6-c1d1-42b0-b94e-1f77eef60360)(label(Int))(mold((out \ + b440cb2d-cb3b-4b89-a57c-061ec3ec16e5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 661f88ef-101a-4467-875d-74cc19f532ff)(content(Whitespace\" \ + 398b718d-35b1-4cce-95de-f2c5ae2b9b7e)(content(Whitespace\" \ \")))))((Secondary((id \ - 0c5f4384-d374-490e-baf6-73c6fba62014)(content(Whitespace\" \ + 25698a56-7f09-4f3d-ac8a-a0b1a8997d96)(content(Whitespace\" \ \"))))(Tile((id \ - b0a61c54-5ce1-4d07-b2aa-0c24d8d47304)(label(fun \ + 306f8858-47c3-4474-aa45-7d87a6a5e7bc)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 03c97a1e-5e63-43ff-9f90-9fb5071cefc4)(content(Whitespace\" \ + b02f33bc-0210-4d50-84fc-8aaec13c23a0)(content(Whitespace\" \ \"))))(Tile((id \ - a269e135-5e34-40cd-bbaf-5d7ca7264d07)(label(a))(mold((out \ + aa8337bb-b7be-48a0-88d7-807386376e4f)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7085914d-118c-4596-8040-01e10f0c7a3b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + fcdedec1-0897-4e17-a83b-edbdc270c9b8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 38face3d-4e38-4679-b334-0641b60b839c)(content(Whitespace\" \ + 6c81acb8-9a8c-4401-b421-799ef8fa97ad)(content(Whitespace\" \ \"))))(Tile((id \ - 21029f89-c5b9-4076-aa4c-f2dcfcd21835)(label(Int))(mold((out \ + dacf631f-a9b8-4e67-ae16-b9bc829c76cc)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 705b9a88-adf6-46d4-b9a8-5bbc2648d9aa)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 27298d20-d9fc-4e51-bd60-77d6a97afdbe)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 75f847fe-c467-438e-b118-f885dfe12d11)(content(Whitespace\" \ + 38e9da4c-d007-49da-bb56-c05c71300c6e)(content(Whitespace\" \ \"))))(Tile((id \ - 48befa9f-1d82-43a0-8a9f-b4a551b4f538)(label(b))(mold((out \ + 2d57aae5-e641-4b64-b776-e54f4e69c53d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f8e72f0b-089c-4495-a457-0d036c53b27d)(content(Whitespace\" \ + bf0eabd8-fb7a-4bf9-8d7e-67f2b9c227c7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b6019a27-ed9d-46e4-a071-aac0a9f7c1fa)(content(Whitespace\" \ + 4184250c-108e-46b7-8827-7c71940ff09f)(content(Whitespace\" \ \"))))(Tile((id \ - ee76ee53-6f9c-4531-92ff-d337918caa29)(label(a))(mold((out \ + bedade1a-15a6-4390-81b1-4c5d1bee160a)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 776ef91f-ca17-4184-a363-23134f2301f2)(content(Whitespace\" \ + 8d96fe72-1ea6-4a92-a74e-c26b836ecc4a)(content(Whitespace\" \ \"))))(Tile((id \ - 7f03b0d0-5251-4546-ae2d-c920f979d361)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + cea9adc5-879b-46e1-884b-4cd50eb2c561)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a84bf77d-1b35-4af4-99e4-57dd207e2da7)(content(Whitespace\" \ + 812965df-8ad6-4758-bc97-52ffceb743f2)(content(Whitespace\" \ \"))))(Tile((id \ - 8d0a816c-0467-461b-addc-9f0d300a86bb)(label(1))(mold((out \ + fcde7ed9-59a7-4e06-983d-bf3123d70b82)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7e60b9c4-2c25-4122-9031-34457a0806ff)(content(Whitespace\" \ + ddf5e9d5-bebd-442c-a466-000a7b87f36b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ddbb24ed-5566-4c35-95b5-860a12dd5248)(content(Whitespace\" \ + 279145a2-d13d-434b-8542-2a3b1bda8cfd)(content(Whitespace\" \ \"))))(Tile((id \ - 0cf8366e-ca71-475b-8399-e9d2a34c9a0f)(label(f))(mold((out \ + 48348a80-8ce4-4a94-83fc-4863761517d2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a0c66c4d-d74c-4be8-b2e4-964ebf05472e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + de254a37-5ee2-40a6-8358-1cebda171dfc)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 44160bdc-9ad4-44a8-89c4-6f50038919a0)(label(1))(mold((out \ + 781f5803-be44-44e0-97d3-8cbfff60ce67)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b34e08c3-7662-496c-96df-e9111bd1f643)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 15422ad3-b89d-4468-978f-6b5759648433)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4853538d-a2c9-4fbd-ad15-1d72ee2b3cc4)(content(Whitespace\" \ + 90ac4093-4bc5-45f2-8af9-566d3cef9f0a)(content(Whitespace\" \ \"))))(Tile((id \ - 56533393-9f93-4caa-80e8-59db930e67e1)(label(2))(mold((out \ + 94887070-f174-4e25-9859-fe832c7f3223)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d2ca34fe-412e-47e4-b04a-41ad670be882)(label(\";\"))(mold((out \ + 16ca04b3-ef11-43b8-9554-88ad6a639054)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 94500cf2-356a-48b2-ac6b-86ccaab5b10a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 36893a4d-0c01-4b09-a92c-59fc51e0fe57)(label(let = \ + 38ec8e6b-64b6-4d0d-9a4a-df986fd14112)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 086df4d2-2dda-4c82-afa2-f33d7ee0efe5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ebd1fe9e-621b-49d5-a3a1-fd8d35b79b76)(content(Whitespace\" \ + a30874fc-f8d0-46e7-92f1-d8d9110df9dd)(content(Whitespace\" \ \"))))(Tile((id \ - 46873372-79aa-46af-8ad8-a39a129c39e0)(label(f))(mold((out \ + c2630add-a437-48d2-bc35-1589ff25fd09)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 54a7084b-48ee-4a0f-8ef8-147037d2a9c7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c2a3eca8-59f9-40ee-9836-1f28ecc30933)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 40a726b4-63f5-477b-a0bd-e2b03a68185c)(content(Whitespace\" \ + 2935e898-128a-4fb3-8f98-a3fa209c2c83)(content(Whitespace\" \ \"))))(Secondary((id \ - e2bb9e20-2b1a-4334-960e-72614d04a5a4)(content(Whitespace\" \ + a8eb29d6-58cd-4515-8d47-3c4516f221f2)(content(Whitespace\" \ \"))))(Secondary((id \ - 38119e9c-e593-47bd-88f3-c67c7f07eada)(content(Whitespace\" \ - \"))))(Grout((id 1039458f-6394-4c7f-b3fa-21bf51f0f87f)(shape \ + 717fda3f-72e6-4285-86dc-73c268bee886)(content(Whitespace\" \ + \"))))(Grout((id c80495a2-eb33-4fb6-b814-3c9c5c1a57b9)(shape \ Convex)))(Tile((id \ - 6dc643c3-18a1-437f-88ae-150eb3ac249f)(label(->))(mold((out \ + 56f48c8e-49fa-46f6-b8f3-791e755dee84)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ec6c3bba-8579-42ad-b386-2c2ce60b5abf)(content(Whitespace\" \ + f55a22df-bb3d-4b51-9edc-36f337251dec)(content(Whitespace\" \ \"))))(Tile((id \ - f95ad0a8-1d39-4985-9d77-a9a93b7efeb8)(label(Int))(mold((out \ + 2b53e25b-49db-466a-850c-4c4c925ffb20)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 689ea5ce-5b0e-4a75-b13f-b09246c6a669)(content(Whitespace\" \ + d6d44fdf-8409-4585-8f72-556c13b30aac)(content(Whitespace\" \ \")))))((Secondary((id \ - e920b192-de5e-4855-ace7-75ba3208fddc)(content(Whitespace\" \ + f7d35b64-c841-41c4-8dcd-1a3a62d1cc26)(content(Whitespace\" \ \"))))(Tile((id \ - b6495520-5564-40e9-bbea-d38a193c72ac)(label(fun \ + f75bc43e-01c3-43a0-855f-8be780fbeaf3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0e052a09-7aba-466c-bfb4-81468b12f9fc)(content(Whitespace\" \ + 9299c0b4-265e-4cbc-a09e-693dd074be5b)(content(Whitespace\" \ \"))))(Tile((id \ - 2daa0ef8-d29d-48ae-a138-61fc401ad950)(label(\"(\"\")\"))(mold((out \ + 7cc935c9-a97d-4ba0-8416-b50fca6b9d72)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - be490e19-a602-45dc-b654-6715e590f251)(label(a))(mold((out \ + 494eab00-c809-4722-a02e-b0fc68d4a3f6)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 22e34140-165f-4fac-9ec4-d8e7ab2a3c6f)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 4b656dee-a4bb-49a6-9ac8-aed5a2f09458)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e768b6ff-d460-4807-8e1a-576f981d6fe0)(content(Whitespace\" \ + 6e57ee07-52bd-4f27-90a5-b4607dc51f1e)(content(Whitespace\" \ \"))))(Tile((id \ - 76dde3d8-37bc-4d08-adad-a0c2bb6ca9b9)(label(b))(mold((out \ + 05a00a59-ae7b-434f-bab4-1a50caa79401)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 7e067617-dee0-4e7e-9bef-685a9c58dd46)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1f6d136a-6df2-4a71-a77e-90224285b84c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 28a0ef59-40cb-436c-b2f4-ca6fcfcaa5db)(content(Whitespace\" \ + cb595d47-bdb4-4ce7-93b9-b210d53688fa)(content(Whitespace\" \ \"))))(Tile((id \ - 8da29f2d-2d2b-46e2-94b6-aabbaf1d97ae)(label(\"(\"\")\"))(mold((out \ + cb5a0da8-2604-4c5d-9af2-fba64593117a)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f5353b7f-ffe4-4905-a0dc-1ccd0ae837d1)(label(Int))(mold((out \ + 5d5a98da-3ae9-4d3f-b669-c89d27c520a6)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - f30a6544-8281-4ce8-84f0-74b01fee295e)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 939f45f3-8613-423a-b1b6-2d770d037f75)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 36b63b80-40b3-4279-9a52-c4ebc96ef1b9)(shape \ + f5a556f3-b755-4bea-8be1-3117ce6472a2)(shape \ Convex)))(Secondary((id \ - 90dac9a3-cfd2-40e8-bc28-60071381900c)(content(Whitespace\" \ + 32a7c4d7-a79e-4224-94ec-657c5f29eb39)(content(Whitespace\" \ \"))))(Secondary((id \ - 763d28e2-674b-430d-b1c0-542d17ea7b09)(content(Whitespace\" \ + 8ac5867b-6fc2-4e18-8cab-2c03b9f9aca1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 793c838a-1fae-4b08-8996-447c82f6e6a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8eed44c-5714-46bd-8ba6-e588a046a98e)(content(Whitespace\" \ + 0839f24e-e181-4ccf-b0fa-51aa3ecf37f6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5a58bc3a-ca4b-4d00-81bd-45b88acc6ab8)(content(Whitespace\" \ + 303c7cc4-a770-4570-8be1-79b6ed766777)(content(Whitespace\" \ \"))))(Tile((id \ - 92f7f67d-26e0-425d-8322-757c09aa842f)(label(a))(mold((out \ + 2e0d1e0b-ec0b-4771-a9bd-d5cbca4fea15)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2d14adb7-a543-4fbe-8716-dde2b18f1cb5)(content(Whitespace\" \ + 9d90178e-c585-41e8-82e8-c9af3e367704)(content(Whitespace\" \ \"))))(Tile((id \ - 0a8920a0-6a21-4b0d-af8b-b051f64a1706)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + cfa499f2-d351-4cb2-b77e-1eedc3d0ef71)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 60571abd-7342-438a-bd31-f359378027cd)(content(Whitespace\" \ + af4c72fa-4302-4294-b4d7-2d9be7af0f84)(content(Whitespace\" \ \"))))(Tile((id \ - c8fda687-4976-4c47-a208-15ebb62dffdb)(label(1))(mold((out \ + f63b3f8c-ce1d-42b8-b93a-8f2a69d62a3b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0b01d85b-d751-4392-824d-6b52b3b6aea1)(content(Whitespace\" \ + b0fea629-b8f0-4b8c-8728-984adeafe22c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7860cae2-6f31-4aa9-b131-39cec4057ea0)(content(Whitespace\" \ + 5f6cd696-65e5-4d98-b2b1-9265700a04cc)(content(Whitespace\" \ \"))))(Tile((id \ - 0ca76690-1cf4-41c4-8da5-d4360b4f861f)(label(f))(mold((out \ + 00b620d3-78fc-4b8a-a564-25d0bf672cb1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1fe1d913-15ab-4a15-a3f3-81ea684b4397)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + bdfb8de6-3b93-4725-9d75-075a5ff2a87a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ff2435e9-c2e0-4316-ac4c-5fe3d2fb687e)(label(1))(mold((out \ + 9f054021-8f5b-4486-854a-f96e4fda32e4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6d0b606c-d057-42b3-9d3d-33679988a5a0)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + c497b161-0b64-4555-af52-284b0c8196c0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 617a93e3-6dd3-46e4-9def-86803cd285d2)(content(Whitespace\" \ + 6a05f4c6-0047-464a-8822-fb7e0708b9e8)(content(Whitespace\" \ \"))))(Tile((id \ - b7f7bb7b-95dd-4cb0-9f3d-b119c4e00b2f)(label(2))(mold((out \ + 32414123-8c1f-4a63-93aa-c5d8c3a32644)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c9999f9e-81e5-457f-bcf4-6fe7400c3e28)(label(\";\"))(mold((out \ + 2b7f6bb1-9e33-4935-bb14-4ad9e3e0f6c1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 726577bf-09ce-4f2e-beae-8218ea89f6ef)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 52fbcb6c-95d9-4124-85d3-f3ce3a042329)(content(Whitespace\" \ + 92309307-3065-4eed-b0e7-131763ec7773)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5c4effee-fad1-4099-b9ac-0f0c201f87c6)(content(Whitespace\" \ \"))))(Secondary((id \ - 177b5c85-7c56-4a83-a5f7-51cdd52cbba7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 12f1f2ad-fae3-4ca3-a8fe-fa6fe4b1b167)(content(Whitespace\" \ - \"))))(Grout((id 2b4b41a7-f15e-4558-a584-c0cdce779d18)(shape \ - Convex))))))(ancestors())))(caret Outer))"; + f637b2a3-4c1c-4743-b131-166fad34191b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 40618bbb-cda3-483f-9799-f66777e8fec2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 94f5a2c3-7ba6-40dc-9242-ed582dea46ac)(content(Whitespace\" \ + \")))))((Grout((id \ + 81bb6c1b-2172-4115-971f-d156eccb7acb)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; backup_text = "# Internal Regression Tests: Function literal casting #\n\ # None of the below should trigger runtime exceptions #\n\n\ - let g: -> = fun _ -> 9 in -g(1);\n\n\ + let g: -> = fun _ -> 9 in -g(1);\n\n\ let f = fun b -> b && true in f(true);\n\ - let f = fun b: -> b && true in f(true);\n\ + let f = fun b: -> b && true in f(true);\n\ let f = fun b: Bool -> b && true in f(true);\n\ - let f: = fun b -> b && true in f(true);\n\ - let f: = fun b: -> b && true in f(true);\n\ - let f: = fun b: Bool -> b && true in f(true);\n\ - let f: -> = fun b -> b && true in f(true);\n\ - let f: -> = fun b: -> b && true in f(true);\n\ - let f: -> = fun b: Bool -> b && true in f(true); #ERR#\n\ - let f: Bool -> = fun b -> b && true in f(true);\n\ - let f: Bool -> = fun b: -> b && true in f(true);\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ + let f: = fun b -> b && true in f(true);\n\ + let f: = fun b: -> b && true in f(true);\n\ + let f: = fun b: Bool -> b && true in f(true);\n\ + let f: -> = fun b -> b && true in f(true);\n\ + let f: -> = fun b: -> b && true in f(true);\n\ + let f: -> = fun b: Bool -> b && true in f(true); #ERR#\n\ + let f: Bool -> = fun b -> b && true in f(true);\n\ + let f: Bool -> = fun b: -> b && true in f(true);\n\ + let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ let f: Bool -> Bool = fun b -> b && true in f(true);\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true);\n\ + let f: Bool -> Bool = fun b: -> b && true in f(true);\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true);\n\ let f: -> Bool = fun b -> b && true in f(true);\n\ - let f: -> Bool = fun b: -> b && true in f(true);\n\ + let f: -> Bool = fun b: -> b && true in f(true);\n\ let f: -> Bool = fun b: Bool -> b && true in f(true); #ERR#\n\n\ let f = fun b -> b && true in f(true) && true;\n\ - let f = fun b: -> b && true in f(true) && true;\n\ + let f = fun b: -> b && true in f(true) && true;\n\ let f = fun b: Bool -> b && true in f(true) && true;\n\ - let f: = fun b -> b && true in f(true) && true;\n\ - let f: = fun b: -> b && true in f(true) && true;\n\ - let f: = fun b: Bool -> b && true in f(true) && true;\n\ - let f: -> = fun b -> b && true in f(true) && true;\n\ - let f: -> = fun b: -> b && true in f(true) && true;\n\ - let f: -> = fun b: Bool -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b: -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true) && \ + let f: = fun b -> b && true in f(true) && true;\n\ + let f: = fun b: -> b && true in f(true) && true;\n\ + let f: = fun b: Bool -> b && true in f(true) && true;\n\ + let f: -> = fun b -> b && true in f(true) && true;\n\ + let f: -> = fun b: -> b && true in f(true) && true;\n\ + let f: -> = fun b: Bool -> b && true in f(true) && true;\n\ + let f: Bool -> = fun b -> b && true in f(true) && true;\n\ + let f: Bool -> = fun b: -> b && true in f(true) && \ + true;\n\ + let f: Bool -> = fun b: Bool -> b && true in f(true) && \ true;\n\ let f: Bool -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true) && \ + let f: Bool -> Bool = fun b: -> b && true in f(true) && \ true;\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\ let f: -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: -> Bool = fun b: -> b && true in f(true) && true;\n\ + let f: -> Bool = fun b: -> b && true in f(true) && true;\n\ let f: -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\n\ let f = fun a, b -> a + 1 in f(1, 2);\n\ let f = fun a: , b -> a + 1 in f(1, 2);\n\ let f = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: = fun a, b -> a + 1 in f(1, 2);\n\ - let f: = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun (a, b): (Int, ) -> a + 1 in f(1, \ - 2);\n\ - let f: (Int, ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun (a, b): (Int, ) -> a + 1 in \ + let f = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: = fun a, b -> a + 1 in f(1, 2);\n\ + let f: = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: -> = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun (a, b): (Int, ) -> a + 1 in \ f(1, 2);\n\ - let f: (Int, ) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun (a, b): (Int, ) -> a + 1 in \ + let f: (Int, ) -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun (a, b): (Int, ) -> a + 1 in \ + f(1, 2);\n\ + let f: (Int, ) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun (a, b): (Int, ) -> a + 1 in \ f(1, 2);\n\ let f: -> Int = fun a, b -> a + 1 in f(1, 2);\n\ let f: -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ let f: -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> Int = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: -> Int = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ \ \n\ - \ "; + \ "; } ); ( "ADT Statics", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 28357f24-0bee-423a-8233-69bbb2cfd787)(content(Comment\"# \ + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 89e33248-1bc7-474b-8cc1-52f14e3e707a)(content(Comment\"# \ Internal Regression Tests: ADT Statics #\"))))(Secondary((id \ - da7d803e-5f91-4afc-b529-fbd0ec0eaafd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 505df48d-38fb-4b63-8962-c4aa88f70e50)(content(Comment\"# All \ + 454449e8-3659-42c5-a25e-6d1d6155d5a0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4937d8bb-3b30-468e-880a-41c0acb969cf)(content(Comment\"# All \ commented lines should show errors as described \ #\"))))(Secondary((id \ - 70e54a1b-8e3f-4e8a-a0f2-f132102dcca2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0c97d2fe-e4fa-4699-889c-26f406fc97b7)(content(Comment\"# No \ + 59e213c9-ee8d-4d0b-b4d1-7bf5f1489768)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0da14afd-2ea6-4f68-9976-4093be981c87)(content(Comment\"# No \ other lines should show errors #\"))))(Secondary((id \ - d99dce2d-ee04-4e13-bcef-375f0608d8c9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e13aaf5d-7c93-429f-93ff-47ddd45609b7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 545d83f6-f159-4fe2-9fb6-f9514dd064b8)(content(Comment\"#type \ + 7ea28ccc-7a2f-4ca7-b581-7d56e6089cd3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 669a1d0d-426e-42b4-80a0-89e1ac7b1e1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3eaa3286-66f6-48f7-b4ca-ec8b7b2b3529)(content(Comment\"#type \ definitions: no errors#\"))))(Secondary((id \ - b8fe9b8a-9e2e-4774-8e8d-c5202e4d567c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 54e23d33-2b44-4416-baa9-b82dd9d49fcb)(label(type = \ + 808fe9c2-af5d-4c17-a3fb-be4d7a2c766a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e4e6500c-a7a7-488c-a2ab-6457b37c07a4)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - db084c97-20fe-487e-8d52-80bc76bd2ede)(content(Whitespace\" \ - \"))))(Grout((id 7273a907-7f31-458a-b84a-ea0a5f3bcab0)(shape \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Grout((id \ + eb7a40e6-c374-4b1e-8635-73f7e9638420)(shape \ Convex)))(Secondary((id \ - 1b874263-3f04-4e50-8ea6-a6a6631c789d)(content(Whitespace\" \ - \")))))((Secondary((id \ - 540a9dc5-a060-46f2-987e-8c45d8a3d040)(content(Whitespace\" \ - \"))))(Grout((id 99c6cef7-771c-4b30-afc6-648a2a9b52eb)(shape \ + a4c96856-06b0-4f22-94ad-c1a12aa21acd)(content(Whitespace\" \ + \"))))(Secondary((id \ + c46a43b1-f059-4cff-8b93-98d6a088ebe1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3c8d1cd2-d58b-4c90-9bda-6819b71f5993)(content(Whitespace\" \ + \")))))((Grout((id \ + 2a226a3d-e11a-4751-9bda-80c03315b18d)(shape \ Convex)))(Secondary((id \ - 67a07a9c-618f-4947-87a0-229733d058e4)(content(Whitespace\" \ + d110a090-41b4-438b-85a9-980720f1b566)(content(Whitespace\" \ + \"))))(Secondary((id \ + 40133c92-2461-4b2e-8d6e-1a466021540f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0cce4077-2709-4f68-8c87-e596ef4f1107)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e7b21ff9-855f-4af8-b136-61cdf82cb732)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bbd37bb2-75f6-4660-bc03-060f3fcb88d3)(label(type = \ + 8d281563-ca03-4ef5-82c7-ef46c0ccdb6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a5af0ca8-4063-4a44-b68b-b0c0e00bd328)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 28baacf9-b184-4689-89d2-5898e15b4425)(content(Whitespace\" \ + 45d0c30a-2f38-477f-9404-5f8f4e5a1637)(content(Whitespace\" \ \"))))(Tile((id \ - a215e8bc-91aa-4d2a-864f-8779cd29c147)(label(SingleNull))(mold((out \ + 3e437a95-c750-4a60-b1bc-70c279b913c3)(label(SingleNull))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 5f8c6a8b-efdc-4ae1-a9e1-34ce7faad82f)(content(Whitespace\" \ + 6749722f-b18b-4b75-ac08-adb4566ed755)(content(Whitespace\" \ \")))))((Secondary((id \ - 6689bd94-617b-47c9-807e-08b9cf84b8c5)(content(Whitespace\" \ + 56b82221-d544-4e7f-9b0d-5265a7d67d91)(content(Whitespace\" \ \"))))(Tile((id \ - f98d916f-8631-461e-a64e-95d75cccc6fe)(label(+))(mold((out \ + b28f5d37-cf4a-4490-aea6-4845ed7baa3a)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - ae3f938a-935c-46ea-b4ca-e8fb41f6e001)(label(One))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + c06936ef-5bc4-4f85-9892-786d4a2e34b5)(label(One))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 50a7b73d-2fc8-4357-ae31-b83c1f5bd467)(content(Whitespace\" \ + 35c9c81c-03e5-43ea-93b9-c1c1ac29956e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 41b177e8-90f3-4af9-8186-cda93d46bc46)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5d191c2c-9036-42a0-bdcb-92b382e55d8d)(label(type = \ + 3e6eeb53-4b68-4c18-9c17-5a910ecd8edd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2c5c41b2-febb-4589-b286-68f1a2b46c0c)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7a6b25d9-e7d3-4b55-b5e5-404c4c2ae4f5)(content(Whitespace\" \ + fce12697-fa94-4f10-8ce0-aa9c5cce633b)(content(Whitespace\" \ \"))))(Tile((id \ - a7de9e4b-174d-4958-9e7f-7d36445348e0)(label(Single))(mold((out \ + 2a095719-b314-479f-9664-89494a5415c6)(label(Single))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - d45238b2-8b1d-4f18-a077-3827151dc45e)(content(Whitespace\" \ + c5f9fa2a-fa58-49ee-aaa7-d187d7920cac)(content(Whitespace\" \ \")))))((Secondary((id \ - 0425820e-04bd-4c29-8adb-4124b681d57f)(content(Whitespace\" \ + 61b7c8d3-15f2-41c4-975c-b63abefef8f8)(content(Whitespace\" \ \"))))(Tile((id \ - 01b63189-aee2-41a6-aa07-ffd4bddc1a49)(label(+))(mold((out \ + 8695b4a9-dfd3-49f1-bf63-86ac6f930f79)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0f58b71b-37d1-4270-8ce3-21eeb577bfb7)(label(F))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + c7d21efa-c21e-4d5a-95e3-6341813a3069)(label(F))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - fa9a4146-4da4-469f-a26e-81cf3f45b2ae)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 609f2e05-ddec-439e-86fa-5fc4e82b2d23)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d110cf17-d811-464f-8726-e6dfc9f8b6bb)(label(Int))(mold((out \ + 420049a0-30d3-4a01-8ac1-c836abc9bdb0)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a109dce3-009c-4f4c-aefe-7cab4536d392)(content(Whitespace\" \ + 2c130ce1-a652-44ef-9316-ce1a0e7401d8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b7cdb552-04a7-48b4-9cfb-998bf9d18055)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f54c8ce4-d565-4704-b224-8e252cb8cbd3)(label(type = \ + a5ef9581-177d-4ad9-a070-dd2053c29926)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 837fa1f2-aedb-4ec8-9e3e-93f6cb63be79)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cfdef333-8e4e-4e5e-8fa9-58da5cb2bbdd)(content(Whitespace\" \ + 69b1dbde-158f-41e7-9f2a-d03f0e928c68)(content(Whitespace\" \ \"))))(Tile((id \ - e0846c5c-ed48-4e17-8047-68e9d0bfd72d)(label(GoodSum))(mold((out \ + f07a6e45-700d-40ac-9a18-fe3ecfeeb4ad)(label(GoodSum))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 16a4fa3b-9c47-432b-baa5-e268c973baf5)(content(Whitespace\" \ + 0074aaf1-18fc-404a-8bdc-f57533a30b4e)(content(Whitespace\" \ \")))))((Secondary((id \ - 967321aa-0d95-49e6-89e0-9d388d6da469)(content(Whitespace\" \ + dd8700e2-dd7d-405f-9221-fbe60f0a1fe2)(content(Whitespace\" \ \"))))(Tile((id \ - 149bf644-2adc-49e6-8d53-81b03ecf4d49)(label(A))(mold((out \ + 37f3fcb7-e173-405d-9808-bf3fe20033a2)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6c0d12c7-17a4-44f0-a149-19aa3f780d21)(content(Whitespace\" \ + 8ce30bc8-4d6b-4fe8-965b-8b70d200f1dc)(content(Whitespace\" \ \"))))(Tile((id \ - 7294404d-be7d-4cb7-ab89-fa2b0d214512)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 6c9386af-fb9d-47d4-b950-7837c2a42810)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - faac7e2c-4caa-46ff-b72c-fd1b78b76f75)(content(Whitespace\" \ + 46d6e55d-cb09-4726-be93-8c9abf825bea)(content(Whitespace\" \ \"))))(Tile((id \ - 4e5dcc2f-b3f6-43fb-a906-5184199c86df)(label(B))(mold((out \ + bb77517b-ecc6-4be1-9ca6-ef3fdc086ea8)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 37516c52-36a1-4c80-99b1-a0d857c1dda7)(content(Whitespace\" \ + 827a04b9-aaa9-415f-a9e2-84c3f0ce9548)(content(Whitespace\" \ \"))))(Tile((id \ - 86c8fa45-1c54-4752-9ffc-c889dc6a8e52)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 1bc7e76d-b958-4703-a7ff-c87d08446317)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 45cd1be9-10c7-48e1-979e-6549e563f9b9)(content(Whitespace\" \ + f291e28c-2612-47ff-80bd-e22c80016a0a)(content(Whitespace\" \ \"))))(Tile((id \ - 2a3ba33f-56e2-4b87-99c7-733ca87a6dce)(label(C))(mold((out \ + cc232f7e-f22c-4af9-bfc1-2d10299a5049)(label(C))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ee980372-17e2-419f-bb0f-a575cf8e7fc2)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + a1a1f23c-bbff-4b37-9093-7cb84131096b)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d95d1829-297a-4db4-8e52-fea95862c74a)(label(Int))(mold((out \ + 92c7ceec-473d-4004-be1a-bd2807ca3720)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6bc9a1c5-257c-4cd4-80b8-236a3ae60b01)(content(Whitespace\" \ + 3bc33329-3c76-4102-9387-b16f704c8902)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ca4f5031-e534-43f7-87b2-d78f8cda1acf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e7ed2a86-c44c-4a31-ba4b-608de76fd6a2)(label(type = \ + 2d50361b-8f4b-4a92-8acd-39aa805c7e14)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6666eb68-101d-4fa7-b2d3-ca5ff5d8c517)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 69656e33-f418-48a4-a438-00db04b42210)(content(Whitespace\" \ + 7df3d9b7-0a72-416a-b9c7-0f083012a32a)(content(Whitespace\" \ \"))))(Tile((id \ - 3218a5c6-c361-4146-be25-3bfb3d172ea3)(label(Partial))(mold((out \ + 75b207cf-db91-49c2-9cae-07cfabb882a3)(label(Partial))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0e2357e6-9d96-42ef-bef6-f72319502c77)(content(Whitespace\" \ + b98420b9-743e-400d-939c-d1062d22abe4)(content(Whitespace\" \ \")))))((Secondary((id \ - 2b2cdc66-752f-428d-965f-1a79b080ea98)(content(Whitespace\" \ + a19b4798-1502-4f8d-bc06-8b15a4f6409a)(content(Whitespace\" \ \"))))(Tile((id \ - b8972117-909f-48c0-8f59-7a51b7cf5db7)(label(Ok))(mold((out \ + 62955e9a-3d95-4605-9e00-143ad300c5c2)(label(Ok))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - febdbbdb-4585-4803-9e84-bcd3304ffb1f)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + f2d36b5b-7864-40e1-8339-e4ec027d1f20)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - c7b12338-0a19-4fe2-820d-1cb076b6dca3)(shape \ - Convex))))))))(Secondary((id \ - eab5c8f9-998a-4cc3-b3d7-f453b90dbe8e)(content(Whitespace\" \ + 99606fb6-88d6-4fc5-870f-6a5850d37eb0)(shape \ + Convex)))(Secondary((id \ + 93e4ed49-b2b1-48be-98bb-970f18cd4945)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4f336c71-34f8-40c8-b567-8d6ef36ea809)(content(Whitespace\" \ \"))))(Tile((id \ - 319b516d-0c4c-4a26-976b-bf76cd5c0ada)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 24ae6999-d0e6-426f-86d6-dc39fa14c86a)(content(Whitespace\" \ - \"))))(Grout((id 5fd021dd-31d5-4767-8e92-1c1526e9d3c0)(shape \ + 708d6f03-55cb-464b-b88e-e0a8150fe1d6)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Grout((id \ + 7efc08c0-8655-4d19-8ef5-a13798e574c2)(shape \ Convex)))(Secondary((id \ - 7448de20-a1c9-4b99-8495-60e37df82175)(content(Whitespace\" \ + 4543b862-6cd4-4844-bed6-f2e3c09d42c4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 48deb597-0118-4b24-925e-9d5866b39d9f)(content(Whitespace\" \ + \"))))(Secondary((id \ + bdb8e8b5-e361-4b88-8d90-784217577a2e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ed8aed8b-a1d6-438b-a7a4-ed310d325dbb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 10a6df79-02e4-412b-b1d7-f4690c81ccbf)(label(type = \ + 96f6afab-3951-4eff-a4a3-a2bfe653f246)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 133867b0-6488-4d53-8a3e-eac9ea123c3a)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d77a36ab-5548-4eca-8db5-66b91ba8b3f3)(content(Whitespace\" \ + 844f0954-2482-425a-acb6-8bdae3e575a1)(content(Whitespace\" \ \"))))(Tile((id \ - 8a111ed2-1c78-4c10-bac2-2e855f655112)(label(DoubleAlias))(mold((out \ + 1de15d73-d5ec-4300-89f3-e625abf25fa1)(label(DoubleAlias))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1b510d24-fb50-4d72-982c-3b584ef54135)(content(Whitespace\" \ + 48940ece-c21b-406a-a835-70def77436f9)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c5b5b7c-6f48-4730-a1cd-23ad4911baae)(content(Whitespace\" \ + 23add4d0-c0c3-4839-af2d-157e3263d6f5)(content(Whitespace\" \ \"))))(Tile((id \ - 765c6668-f5f8-4fa6-8c23-46cbf50a2169)(label(GoodSum))(mold((out \ + 2a8d861b-ed0f-4d4e-a5da-66177133b1d2)(label(GoodSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8ab02e4d-1f40-4182-b669-3002e91971d8)(content(Whitespace\" \ + 07bf7bba-0e93-4e83-914b-7606ed4a0073)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2f94abb3-22ba-49ed-b336-378757f564dc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8d517f36-a20a-4cd2-a280-8a24d56a2b25)(label(type = \ + 37a671ca-1074-4060-a541-f7b8816bd0a1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4a63d8bf-a486-4f6d-bdd7-9ce0d0486c8c)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9ed73f0a-2269-4eb6-a371-a8710e4f9a1e)(content(Whitespace\" \ + 4e2f946b-bea5-4bde-9310-2cf6314df466)(content(Whitespace\" \ \"))))(Tile((id \ - d78a7e50-97e1-4487-94c5-7620f7057b62)(label(VerticalLeading))(mold((out \ + f20b6d69-f647-440b-9aa6-576476344f9a)(label(VerticalLeading))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - d0fa2c86-1a80-4489-8dad-0864eac411ce)(content(Whitespace\" \ + e63a953a-b13a-4c7c-b196-72b2a2ff22bf)(content(Whitespace\" \ \")))))((Secondary((id \ - c550f4d9-2252-459d-881c-1ea2d5113920)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 48ec824c-86ef-419c-bea4-01af75ab209c)(label(+))(mold((out \ + 73ec6fe7-c3d6-41a1-8b93-7583933e8c99)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 313aca52-ad71-45ec-a91c-4643849cce0d)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a3f051cd-9ac0-4f5e-a687-7436f35311fa)(content(Whitespace\" \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 06adf35e-9b04-406f-b737-134bc2bc0805)(content(Whitespace\" \ \"))))(Tile((id \ - 110f994d-9f94-435a-a662-650195526a66)(label(A))(mold((out \ + eca64c6d-220d-4c27-ad92-54d23d4e7873)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - de227626-c88d-4f8e-9b7d-8d239bc6b7a2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b7b57d94-9f0b-41ff-8805-383757288c54)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 4e1bc11a-cc46-470a-9665-ce67099df2f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e0530d2e-876a-4d61-aef4-724a2089820c)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e76c4cf4-6b52-4f61-8613-8418c2b54e04)(content(Whitespace\" \ + c6de3880-44c4-45d3-b74d-8e304f6a8eb3)(content(Whitespace\" \ \"))))(Tile((id \ - 4de6fd61-26fa-4770-842d-f6c40b502f33)(label(B))(mold((out \ + 72fecc0c-f072-4bac-b361-48c5d3c538fb)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e0d70e07-aba6-40e3-897f-ac02915c5454)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 78ac48c2-f63b-40bc-8b03-15f33e2fe22a)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 375f169b-7f67-4190-b980-3292822c286a)(label(GoodSum))(mold((out \ + 6af87973-e7e8-417c-b4c6-c93c58e3be70)(label(GoodSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 226a9d4c-109f-4813-aee7-94e2ad45fae2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a38444fb-d2c4-470c-b660-47c92bb89991)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 3a89891b-6279-4522-b31e-b992fbf42eea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a97ddf83-7e6f-42f0-9058-89420eca125f)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c587c505-748c-41c1-8279-71522de8cec6)(content(Whitespace\" \ + ce6f9b84-8b77-4948-a6ca-7fbcd1f8f3ce)(content(Whitespace\" \ \"))))(Tile((id \ - 974020d7-e351-4812-9397-5018920e0a45)(label(C))(mold((out \ + 8a7c62eb-eb9b-4a62-865a-2bfd9ac50c8f)(label(C))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d080e933-5349-49b7-b35b-2e5f24d3b007)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 8e457293-c546-46fe-9aab-77dd8a962c8a)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 78af8147-201f-46f3-b58d-4bcf7bfdf0bf)(label(Bool))(mold((out \ + aca95780-8bd5-4837-9685-d5a43d756204)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d873c642-102b-4997-bac4-f1f0b75a1624)(label(->))(mold((out \ + d25668b0-5da2-4400-b17d-cde3f9523cec)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - 3676c2d8-c573-497e-b7cb-d61cae5b5da6)(label(Bool))(mold((out \ + 409a48b9-6f56-49da-93c0-3908a21b20d3)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - f1e2ccb2-8186-4934-a292-57abb525d91d)(content(Whitespace\" \ + 1bf0a21e-602e-48e0-a913-89acda895fa2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9fa48fc0-e740-436a-a834-d85c442e6d3b)(content(Whitespace\" \ \"))))(Secondary((id \ - 546c1a20-e58f-4db5-88be-c29ff7e117e2)(content(Whitespace\" \ + ba96a205-d3ea-47fb-a133-2bdb095b4075)(content(Whitespace\" \ \"))))(Secondary((id \ - 2f7eeab0-c2c0-462f-8a7f-6dce1a9479ec)(content(Whitespace\" \ + 273bd99c-5f05-4f93-9f87-8b24ba051cc0)(content(Whitespace\" \ \"))))(Secondary((id \ - cc3e6a4c-73de-4450-97b7-d622e501a65d)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 50745623-8820-453c-bc0f-62ef453d38f0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f71ed59f-f6c7-4b69-a8c4-e12a77a9b82e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dec0a291-91c0-413e-942e-2cf40b652dcf)(content(Comment\"#incorrect \ + dcb11eda-d2e6-4613-afb6-39816ed80b31)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 85197060-af85-460e-b571-73408983cbab)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dd2c2412-6928-4540-9a05-64d3f699b3a9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fa41dd9f-9858-4325-8ffd-892dba7e3cc1)(content(Comment\"#incorrect \ or incomplete type definitions#\"))))(Secondary((id \ - ff85a206-092e-4b47-8496-75171a46cb21)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2a29b5e5-296b-423e-8876-ea638cf99c39)(label(type = \ + fa9e4b4a-1f9a-425b-b5b6-4f15f84a16df)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 729eb092-6bca-4c44-9c9c-a94a4b7cffd8)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 88097564-6cb6-40df-9dbf-8726f15e8023)(content(Whitespace\" \ + 73adf4e8-c8d3-4ebc-b516-5c8f92404ec9)(content(Whitespace\" \ \"))))(Tile((id \ - bc56b1af-baac-4afa-927b-5b260ef9528d)(label(badTypeName))(mold((out \ + a2f1763d-ef60-4232-99ae-7647d78338f2)(label(badTypeName))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 06bec89d-de70-42d6-85ac-73cd1ddc86c7)(content(Whitespace\" \ - \")))))((Secondary((id \ - 46400187-d912-4ba4-a220-7326db747f86)(content(Whitespace\" \ - \"))))(Grout((id 71cde0f8-e7ce-4994-9f73-381e4eeb7e3d)(shape \ + f8b520c6-f264-4076-9649-17a864a4b86f)(content(Whitespace\" \ + \")))))((Grout((id \ + 8a941955-fd4c-4e66-b139-0474d6d02d66)(shape \ Convex)))(Secondary((id \ - bbd999fc-99d6-4022-beec-290ae2883829)(content(Whitespace\" \ + df256ea3-7ffe-4af3-8e07-436da632b54e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5b85bc2c-b39c-4766-8c73-86e61c131d5c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 276c4b02-c984-4019-a43c-0fb22e42c460)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 06fea02f-7527-4678-b8d4-23eb2895fced)(content(Whitespace\" \ + 4e52dd2a-a324-4b26-92b5-cb43d228c19f)(content(Whitespace\" \ \"))))(Secondary((id \ - b76fdcc0-e6df-4bc1-a494-6c22207a0088)(content(Comment\"#err: \ + 06714ab5-4fef-41e3-b49d-bee494043255)(content(Comment\"#err: \ invalid type name#\"))))(Secondary((id \ - 8557100e-b121-44a6-9904-88d04e14afe2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 037ed10b-ec8f-4e74-91ab-8b5ac06d43e4)(label(type = \ + 18328d79-df7d-4a3b-9f09-5b372c335600)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a6481775-519e-46e8-9ec6-2e589373d24b)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d07a788d-e8bd-4292-815c-c1b2aeb50ce8)(content(Whitespace\" \ + 2a07e4a3-d81f-4526-80f1-32bbafb8899d)(content(Whitespace\" \ \"))))(Tile((id \ - 0fbc61fe-ea41-465c-8229-5c191b82ad22)(label(\"(\"\")\"))(mold((out \ + 8b94d1a8-2e1f-4e82-9826-585834db8914)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - bd55016e-8768-4ffa-9206-24cd3b8ea73b)(shape \ + ea3f39e9-9d0a-4e79-b900-09de6ca7c0dc)(shape \ Convex)))(Tile((id \ - 5e281346-8c28-4270-9131-df8eadaa2d7a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - d70d0656-a8c7-4daa-9f47-f63a09e7581a)(content(Whitespace\" \ - \"))))(Grout((id f61afea0-f3fd-4f9c-8917-0aa5e600782e)(shape \ - Convex))))))))(Secondary((id \ - 6f6d1712-ed54-43e9-bfcc-2aca0a93ceca)(content(Whitespace\" \ - \")))))((Secondary((id \ - d2d9a292-469b-401f-b5bc-525561ca82da)(content(Whitespace\" \ - \"))))(Grout((id 18cb0921-300c-4001-8c45-e4950ce6b20b)(shape \ + d78cad4b-9cb1-4187-a2b4-3daf04450c52)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Grout((id \ + 4fe172c4-68be-4570-8516-1cba23643c8d)(shape \ Convex)))(Secondary((id \ - 4dec9e0d-5df5-4954-8107-2d3a56728db3)(content(Whitespace\" \ + 67439ffa-f8c4-47fe-b519-e4e2170b0ba8)(content(Whitespace\" \ + \"))))(Secondary((id \ + bc09892d-51f0-4c7b-a25d-a1f8d346376d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + d315fa5f-9cf2-4a6d-9493-f0de67fedb89)(content(Whitespace\" \ + \")))))((Grout((id \ + 44bb8352-d0bf-4933-bac3-d227bae5dec7)(shape \ + Convex)))(Secondary((id \ + 84ea582b-1547-4d08-b776-ac84dcb6786f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 25a50e72-913a-48a7-a298-7d19a54ff746)(content(Whitespace\" \ + \"))))(Secondary((id \ + a9e30a2c-3899-4977-8467-0cdff6a05dcc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e16bf39c-26cb-47fe-89f4-33a1a9970651)(content(Whitespace\" \ + fc5706bb-edcd-4bc8-9618-4fdca8c7377d)(content(Whitespace\" \ \"))))(Secondary((id \ - d950efef-1383-4e50-a303-aff3be6cfa78)(content(Comment\"#err: \ + 782d8ab3-80fd-4e18-a67f-957c385efcae)(content(Comment\"#err: \ invalid type name#\"))))(Secondary((id \ - df4aa51e-b18e-4cd1-98f1-446b1c9d721d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e93edd08-38c1-4e34-afd9-33525f28d292)(label(type = \ + 776c65b7-6960-4c83-ac48-1dc6ddd6316c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 92eb8b7a-cae8-4111-be52-6530b229a36f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - e3a09bfa-b86c-4849-be8b-7c9929b754ed)(content(Whitespace\" \ - \"))))(Grout((id bb1bee1a-abe7-47aa-993f-85fa842b6fbd)(shape \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Grout((id \ + e2a03ab3-180b-4d31-9278-cbe499404aed)(shape \ Convex)))(Secondary((id \ - e5a4c884-61e0-46e0-ba51-aa8027c03b75)(content(Whitespace\" \ + be085a86-4c10-429a-9172-df2d77c0f85c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1e0ee740-e633-4246-a7a4-9f4a5d2b3a76)(content(Whitespace\" \ + \"))))(Secondary((id \ + 10dc8f28-f0f9-407b-94d6-b6327a6ad407)(content(Whitespace\" \ \")))))((Secondary((id \ - b245fa5f-585b-4a67-94e2-2510e636670e)(content(Whitespace\" \ + 3d2eaf9e-22e8-428d-8670-36e50d66d2fc)(content(Whitespace\" \ \"))))(Tile((id \ - 52ac5bf6-1b0b-4acf-9c46-e099e018c4ee)(label(badTypeToken))(mold((out \ + 2af8f5e7-032d-40a4-b733-2af5c7947e3b)(label(badTypeToken))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7c99b199-bb9f-42d3-b28e-3940e92a3533)(content(Whitespace\" \ + f422eefb-364a-461a-875b-0e01df1babe5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 248b83b9-3ed2-4889-b3a9-4728d8345ad7)(content(Whitespace\" \ + b5be4351-0e7f-473f-9fb5-6fa055130592)(content(Whitespace\" \ \"))))(Secondary((id \ - a561938e-1e8d-485f-92f5-0976d7377be1)(content(Comment\"#err: \ + 38ed1b1c-b840-4f12-8505-64e9a8aaf0ff)(content(Comment\"#err: \ invalid type token#\"))))(Secondary((id \ - d7d0d95b-1e27-492f-91a5-97176f237c71)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bbc7927d-aa81-4f04-8190-92349f23e545)(label(type = \ + 238a9588-4c4e-42e4-bd27-6c24e84a47db)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f6bc3423-dfd7-4840-acda-b87b7db7ff5d)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5c927f79-7c3e-49bc-afc5-355081fc688e)(content(Whitespace\" \ + 2af16e97-3598-4aab-9875-8183e5ce77d6)(content(Whitespace\" \ \"))))(Tile((id \ - 4f7eda69-8e88-46f6-af92-18e977fc4e57)(label(NotASum))(mold((out \ + 5bdd4d69-6eda-4d89-bae6-7216a7a01877)(label(NotASum))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 514b34b5-fae2-434a-b5ad-3c180fc704e1)(content(Whitespace\" \ + 334bda6b-3d6f-4964-a2a0-74555ca5e900)(content(Whitespace\" \ \")))))((Secondary((id \ - 2158eae1-2f2a-4df9-a342-b5fa191925cf)(content(Whitespace\" \ + fe0e1a5b-4c6a-4219-86aa-343dcf537aba)(content(Whitespace\" \ \"))))(Tile((id \ - ad1bd59c-b07c-4854-878b-fb73b714bb34)(label(NotInSum))(mold((out \ + be97b584-8d86-4227-a785-68c71572668d)(label(NotInSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - acb6b1d5-bda5-45c2-aab3-b9bc747ceb49)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 2afa8050-cee7-4375-8369-9164fc66f62b)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 553dfa61-d24d-4394-ac50-4aa83e07bb21)(label(Bool))(mold((out \ + 4c73234e-fa09-4876-a4d4-347ae6f315fd)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c55a91f3-69b1-4505-b31c-ac9db253b5f2)(content(Whitespace\" \ + ad45f964-71b8-4365-a280-ba112e276d91)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 51fb312c-cdcd-4db6-9a97-c06f9349262f)(content(Whitespace\" \ + c06e3e90-296c-418b-aeea-9eee8436c3d1)(content(Whitespace\" \ \"))))(Secondary((id \ - bdcdee76-a147-457c-bdc5-911d1b51a26a)(content(Comment\"#err: \ + 70714876-4c76-4d34-80f0-39e632fb11c4)(content(Comment\"#err: \ cons not in sum#\"))))(Secondary((id \ - f2cd045f-7c64-4ea8-8452-c4ab758dec7a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4221a1d8-bcd9-4132-9916-5bec3de4a625)(label(type = \ + d64987dc-6404-45da-8ca0-7879e7b52b4c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2099bd11-4147-4ad6-9039-9f6fc88f643b)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9d96a3ba-2e82-4741-a739-916745c2095a)(content(Whitespace\" \ + b4df731f-29a8-45c0-8e20-be09fbdfef06)(content(Whitespace\" \ \"))))(Tile((id \ - 1fe95f07-86f7-4ba0-83ca-ecfcca5215f8)(label(Bool))(mold((out \ + b6aab60a-6dfa-4384-a6ed-22d767fafe6f)(label(Bool))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 7fe1273d-e45b-4e86-ad79-a9a30cf0afd6)(content(Whitespace\" \ - \")))))((Secondary((id \ - 290c38f5-c4da-4a8e-b556-8503adc36c8a)(content(Whitespace\" \ - \"))))(Grout((id c27057f8-540d-448e-855e-692824076cb2)(shape \ + 436efcc2-d901-4cc8-88b6-2528b5df5c9c)(content(Whitespace\" \ + \")))))((Grout((id \ + 4e7f6907-2a35-4077-ae80-a4097862ca2e)(shape \ Convex)))(Secondary((id \ - c77c2cb7-8f94-4093-9dc1-3dc1c76202b0)(content(Whitespace\" \ + 1494fed6-37ff-43dd-b1d1-b4afba3d8c46)(content(Whitespace\" \ + \"))))(Secondary((id \ + 036ce76f-9c9c-4aaa-a8c8-6064a15cc4b1)(content(Whitespace\" \ + \"))))(Secondary((id \ + d43d8b3d-9311-427f-8613-830da33b4a91)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e93265b2-2163-4c24-a77b-75e0743fdefc)(content(Whitespace\" \ + 6a8bf3d1-33f7-49c4-b75f-3aea2421be31)(content(Whitespace\" \ \"))))(Secondary((id \ - cd8907a9-81d2-40cf-a12f-cdf75f85ecae)(content(Comment\"#err: \ + ae3890e7-841c-406d-8fac-05fb53dc383c)(content(Comment\"#err: \ shadows base type#\"))))(Secondary((id \ - ce97e91b-7183-4964-9dad-5248b847cb2b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 524585ce-43ab-4dc4-a476-d2be15591182)(label(type = \ + de591822-1253-473d-955d-a86be697c0ab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 79f4f791-e8bc-4083-beb3-35433524c7be)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 033bf566-1b52-4a6c-966d-45efa4175c0d)(content(Whitespace\" \ + ba4e9b22-4497-4839-b4f8-4560b9862fc1)(content(Whitespace\" \ \"))))(Tile((id \ - 41911e97-fb92-4173-b3cf-f5d4eed85938)(label(Dupes))(mold((out \ + aef1e763-8ae8-4ebf-b3bf-f7713b673bb8)(label(Dupes))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - ff3b3be2-040d-47a2-b628-d957c263c18f)(content(Whitespace\" \ + e8de319d-0f69-44fa-ba5f-475f25d5a8d7)(content(Whitespace\" \ \")))))((Secondary((id \ - de16dd5e-f90f-4941-b9b8-232e569d9078)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 94ecd3bc-97eb-403e-9563-421273cac80f)(label(+))(mold((out \ + ed5090b7-8616-4a08-90cf-734a7fcb1cfd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 512f8e9e-2709-4e10-9220-420bcb444a3f)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - adef1e3d-eab2-4810-9a16-263d1a6d36bf)(content(Whitespace\" \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + db3a5b00-6bf0-43de-87c8-ce29d78857d5)(content(Whitespace\" \ \"))))(Tile((id \ - 4d3a0426-5dbe-4845-a282-d11a40094d78)(label(Guy))(mold((out \ + 81a8b322-9945-4229-ac29-410b6c02db6a)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b710d3be-0810-42a3-89d3-358051f7013b)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 808e4d48-d491-40b2-a130-717c8db241f9)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c9d5f791-f9bf-4844-9869-3c064b839810)(label(Bool))(mold((out \ + 738b6238-06ce-4ac2-a655-dde56ef050cc)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 9058a038-a0f4-48ee-b778-3fc60e5c9fb7)(content(Whitespace\" \ + 0b604fe8-c45b-456a-b255-4c635a8be945)(content(Whitespace\" \ \"))))(Secondary((id \ - afea3bbf-04a5-4e37-972b-6c9f976e7a4d)(content(Comment\"#no \ + f97fd8a5-b07f-4f57-b4d0-14adc03b6e1e)(content(Comment\"#no \ err#\"))))(Secondary((id \ - f837183a-06ad-4583-b423-4d17dbbc4aae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cfde56dd-4d78-48db-b5b9-e3349e8ba3dc)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 83f62094-807b-4a6c-b9d4-d648c0ce6c56)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a43d2fdf-3eab-487a-898b-97d7fccc9e87)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d81137df-f2cf-49dc-bb0e-fe21538e3a64)(content(Whitespace\" \ + 5e010b4a-4440-40dc-a37c-d6a7ad147749)(content(Whitespace\" \ \"))))(Tile((id \ - 02201697-1922-4a2e-9180-4dcea7428a5c)(label(Guy))(mold((out \ + 31fa86c5-0158-4144-aa17-baf657163fee)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 4868483e-5f32-49c6-adc4-6630dbe6ced7)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + ddce3444-295a-4bd4-b64e-b86f16cb9b98)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - fc54a64a-a135-44c8-9cf6-a7ce8a527315)(label(Int))(mold((out \ + fef9efec-93e0-43e2-93e2-25d5029ad3e8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - fadea698-7c37-48a8-8c95-2787e6e3b20a)(content(Whitespace\" \ + 98860875-fbb2-42cb-9505-4b22eb59e513)(content(Whitespace\" \ \"))))(Secondary((id \ - 9571f9ca-05e9-4a77-accb-b92d6f3b5368)(content(Comment\"#err: \ + a7b96775-6858-4ee1-8148-96e8cb60d2d6)(content(Comment\"#err: \ already used#\"))))(Secondary((id \ - 55aa05ad-0b6a-4f64-ac40-113f79ffe7f1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8c570671-41ed-4e52-a50b-3cf2809fbbe0)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + e83feb84-e824-4e24-be26-cc7f4a79fb0a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 534d4a01-bf40-462f-a9dc-2604811ca5ae)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - de416faa-f1fa-4900-9ad2-f32009445925)(content(Whitespace\" \ + eaa13358-69f5-4f93-af91-01f47ae43e53)(content(Whitespace\" \ \"))))(Tile((id \ - 7feec638-5149-4401-92cc-65748cf149ff)(label(Guy))(mold((out \ + 09266814-631b-471a-9356-088e28c64f94)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1e3d16ab-a72d-4342-b2f9-0b8b1fe14657)(content(Whitespace\" \ + afc90f5b-9892-4659-ab07-bc8f8027b79b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5a84c480-9a4b-47c7-9d5f-cf03b1112f4b)(content(Whitespace\" \ + 150ee1fb-29b8-4f8e-b7ee-fa4549224882)(content(Whitespace\" \ \"))))(Secondary((id \ - 79a4e032-0c92-41ac-b21f-198802c8ed00)(content(Comment\"#err: \ + 5ced057b-edc4-49bc-937b-12dd1f8a8a2d)(content(Comment\"#err: \ already used#\"))))(Secondary((id \ - 3c76eb37-d0d6-4e5d-8b6d-fe3e0a29815d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dc4a691d-60ff-4962-96b6-9f50d0fee6d7)(label(type = \ + f9280917-76e3-4844-bc7b-25f3509ec9c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 42576613-4978-4df6-8c81-9f2c4c9e5803)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6f82cfca-5b64-4104-8719-e56652b83ca8)(content(Whitespace\" \ + 5da6891b-90d6-4380-8323-ea3156b4cc29)(content(Whitespace\" \ \"))))(Tile((id \ - 55211581-d61b-4ea6-8c0e-43853ab7088e)(label(BadCons))(mold((out \ + 0eed58e4-da77-4d2d-8e88-3ea0dda9c959)(label(BadCons))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 541a269d-3b0c-4c6b-b421-cf2757f096d6)(content(Whitespace\" \ + be82dbe2-4d5d-4435-8871-511cc4e29a99)(content(Whitespace\" \ \")))))((Secondary((id \ - f24cb71c-259a-4d1f-8a4b-04e51ed80b23)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a034eadb-e82a-4983-b0da-52deba544b92)(label(+))(mold((out \ + 5ca402e1-16f1-46a8-9a2d-2537a3455334)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 797865f0-0a70-48e0-a7c3-06abf1098061)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0ae1f486-6b64-49f1-9839-a3071a4d5e26)(content(Whitespace\" \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 792b4716-921e-4f5a-ab4f-7d513f7dee7a)(content(Whitespace\" \ \"))))(Tile((id \ - 576f5861-9df1-465d-aa6a-02b20f6e63c4)(label(Um))(mold((out \ + 5fd4af46-9c59-462a-ad65-a5511988ba5b)(label(Um))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8b8364bd-ddbd-470d-95ca-8d3eca892887)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 249a8ad7-6f9b-4d25-a98d-393c96fb54ad)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 327a32a4-b4b8-4537-a4a4-ff819776b7d8)(label(Unbound))(mold((out \ + 04b0aa5d-a432-42ac-816c-f40c06d40e1d)(label(Unbound))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 4f4387fc-fbdc-41b3-90ad-1def00e5713c)(content(Whitespace\" \ + 3d794ae0-161f-4552-8bd3-8d57d0442002)(content(Whitespace\" \ \"))))(Secondary((id \ - 8892cd2c-0885-4957-80ab-3e2675f4bb75)(content(Comment\"#err: \ + 7b97a728-0efb-462c-9b46-d5f2811508cc)(content(Comment\"#err: \ unbound type var#\"))))(Secondary((id \ - 80d01050-b2ce-4ac8-9ec6-0170deda3533)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2b1798d7-13de-432e-95a5-48bf480f4831)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 2e5636bb-e0a6-465f-a1df-fdb0f5e24653)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6447751b-29e3-44a2-a405-29f98eee4685)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 469c772a-6cdc-4419-bb66-aaee9d260caf)(content(Whitespace\" \ + eece4248-72e4-4468-9b89-5e1bbca0b065)(content(Whitespace\" \ \"))))(Tile((id \ - 18f0f427-bf66-4c29-8220-dce417a0dad5)(label(notvalid))(mold((out \ + e8f50522-7c0f-4131-9b6a-554d07d132ba)(label(notvalid))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c1667cf8-ac3a-4b57-a1af-5add1cadbdec)(content(Whitespace\" \ + 0bc1c863-e71d-4db4-ac91-6b68ed84b9e9)(content(Whitespace\" \ \"))))(Secondary((id \ - 7a66d06b-fdbc-4a07-8f9c-fb0cab06be80)(content(Comment\"#err: \ + 6de1f294-e9eb-4720-97bc-78170bad857f)(content(Comment\"#err: \ invalid#\"))))(Secondary((id \ - 9b1ca2ba-300f-4f4a-a664-85b57811b1c6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 78cee115-8bb2-4e76-b6c6-3f104bfe0764)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + c45eb0a6-04ce-47a3-a776-4fd5b3c1b454)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 08fabaec-69c7-4590-9f88-5dd0fc4011ac)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d54d1a84-8d14-486b-a4e7-a47e9a71bbe8)(content(Whitespace\" \ + 73b55a89-bb15-4c63-9e19-bf13a4ac8a86)(content(Whitespace\" \ \"))))(Tile((id \ - 688f920e-c2a2-442b-b6be-4fd3aaa2bfe9)(label(Bool))(mold((out \ + 573530e5-070f-45b4-8e60-2ca26c23eb2f)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 42a13800-3507-4688-b610-92bd8f40b64a)(content(Whitespace\" \ + c4d4dea2-5a5d-4c51-bd33-7554baf0dacf)(content(Whitespace\" \ \"))))(Secondary((id \ - 3f5bc604-c1a1-4b28-b62a-f379cb00bf13)(content(Comment\"#err: \ + 0bddc992-c58c-4636-9c62-24c335ff304c)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - fac092ba-b3ca-4bfe-b67f-7b1712db8cf6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a34b8831-ac9c-4b15-9f36-bad3a9623bea)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + b3c1200b-b957-491c-9115-bd2a5943c19a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c7e0d488-2743-4a9d-90ce-e49810f08ab5)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a744ef23-572f-40e9-835f-814d1ced928f)(content(Whitespace\" \ + ad4e6ac1-c04c-4888-b982-0ea1f09ef59e)(content(Whitespace\" \ \"))))(Tile((id \ - 0658f89a-28ce-4de6-a50b-dae44302c439)(label(Int))(mold((out \ + b5cf2934-55eb-41a8-9d82-4759d1b82ce7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 98717293-02df-4aa6-9b0c-0c4adee6cf7d)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + a6aed30b-b938-47be-8d62-611b65951da8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 57276d63-e061-4585-9e5f-3c0a07471900)(label(Int))(mold((out \ + 06dfb39e-dd31-4205-88cc-e24f7dfab38c)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 32f93082-70cc-490a-bd9a-8b1b863ea1c4)(content(Whitespace\" \ + 9e6ee42b-65a6-476e-b29c-2f9247d67510)(content(Whitespace\" \ \"))))(Secondary((id \ - e4902f69-d522-4a3d-9480-c4bf75b44cba)(content(Comment\"#err: \ + 37c34bae-9b6c-4a8c-95be-8c753179e59a)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - 5df67ca1-51f1-4f0a-9e42-60b4955d7370)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3723b143-134a-4d1b-9482-e3db9ca2b754)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 20510235-1727-451f-9c67-ad5db70bda44)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4c385804-9778-42b2-9871-79b44326e3ea)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4c7b2401-fc05-4a9a-8005-5a731405d897)(content(Whitespace\" \ + 02f80476-bd32-4a17-9fac-2926671e95c9)(content(Whitespace\" \ \"))))(Tile((id \ - ee423a74-19f5-4331-96ec-32fbec96ac1f)(label(\"(\"\")\"))(mold((out \ + df043d06-b59c-4fe0-9ce8-3abbf82beb5f)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 69b680ca-10e8-4999-a9ac-cd35c530f38e)(shape \ - Convex))))))))(Tile((id \ - 4127b3bf-d6f0-4328-a943-09f3937d4335)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + b9bd046b-2dfd-46b6-85f1-fe86e5c80420)(shape \ + Convex)))(Secondary((id \ + c85014e9-1006-444d-8c7d-14788b21d112)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 652f973c-ba42-4de9-a595-d0420b1234ca)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4b70551f-8d18-404c-abc2-7be85297eaeb)(label(Int))(mold((out \ + 7ad3ba3e-d211-41e8-b230-61cbe5884e92)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c162b951-60e2-40c5-b2ce-7fcf5abb6129)(content(Whitespace\" \ + 008443c8-979b-486e-8a8a-c97367c97e8d)(content(Whitespace\" \ \"))))(Secondary((id \ - 1f35f928-4a5e-4d0f-83f0-f92ad23e37e8)(content(Comment\"#err: \ + 6bd41e53-b5ab-4ebb-8d75-1b4c72f9bbe3)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - e11318ea-b24e-4c36-bc1e-48f0cf45a6ab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bb584618-cce6-4fde-9fd5-d7664d50a6ac)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 6f14377b-1dde-4a48-ba48-1300ec9e0fe2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8043c836-6993-4e5e-aca7-da849e70dfab)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e3341aa8-5447-4345-b26e-771ef6594422)(content(Whitespace\" \ + f2c938bb-0ce1-426d-b0e6-f64d856fa370)(content(Whitespace\" \ \"))))(Tile((id \ - a89f44e0-6c1b-4392-aa86-a40eb1ad7d60)(label(A))(mold((out \ + f5734ceb-e7eb-46ec-9c21-ee3c0206f64b)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - cf28523c-f133-4218-ae35-7036d973c1d5)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 1602f845-c07f-463b-8065-4670979bacfd)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d5667e50-e604-4129-a70f-12d796a23781)(label(Bool))(mold((out \ + 981c85c2-0813-4ca3-a55b-d99af769b8a2)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 1e352928-e4c6-4fca-ba2e-11cef32fefe4)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + dbc4fbf5-088f-4298-8d64-e7412dae6c09)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 1ed09b61-a337-4e8a-a34d-2ab888561c24)(label(Int))(mold((out \ + 780a24dc-da03-4dfa-b901-25d60fe42377)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 7da994bf-6340-45c4-8599-a03ca2341769)(content(Whitespace\" \ + f8657c80-1c9f-42df-965f-5515cfba6bb9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 671e969b-0148-4345-b52f-d953506f9225)(content(Whitespace\" \ + 10d4fcfd-b3c3-461f-8e2f-485162c71892)(content(Whitespace\" \ \"))))(Secondary((id \ - a99ba882-d549-424a-8bbb-e6bb6cc14f5b)(content(Comment\"#err: \ + 7cbd30bc-2053-4dc5-8710-aedb5197a14d)(content(Comment\"#err: \ expected cons found app#\"))))(Secondary((id \ - dafc64b1-0620-41c6-88cc-4d3700a91400)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 63fd0ca5-5526-4d63-8602-7dc819005e93)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 56d28a0f-2244-4055-97e7-d87e504f59e6)(content(Comment\"#sums \ + 6c4fb36a-b55d-4692-8bb4-3c2fce732e90)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0b4a81ab-3f85-4b10-bac0-d340a15aa6ff)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9e70b9ba-7e15-4d8a-8022-4efd6423e778)(content(Comment\"#sums \ in compound aliases dont add ctrs to \ scope#\"))))(Secondary((id \ - a292fd1c-d0c3-4aff-aea6-54fb47db6aad)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4df5e4d4-8390-4158-a53e-ff75907deb30)(content(Comment\"#but \ + 2736b75a-d763-4723-94ff-7b15cc7da021)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 87e1101f-508a-44da-9e98-6fae75646d5f)(content(Comment\"#but \ compound alias types should propagate \ analytically#\"))))(Secondary((id \ - 3fda8862-fca6-41ca-a9e4-bc4154218455)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c6539017-bac8-4921-b1a2-dbd7686fd99a)(label(type = \ + 5aef793e-beec-46e0-9a19-e831574d6432)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b6f2f4cf-2288-49ad-8064-b8edfa689d0b)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c9219eb3-0e7a-447a-8e35-254101e3dd24)(content(Whitespace\" \ + b0187792-3c02-4ce0-8d40-bded09318831)(content(Whitespace\" \ \"))))(Tile((id \ - db95f67d-acf2-475a-ab91-4fa87ab97edd)(label(CompoundAlias))(mold((out \ + 66169d2b-6b8d-4797-a3ee-3772e4258dd7)(label(CompoundAlias))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - e6628e78-f477-4bab-a09a-929b617b2083)(content(Whitespace\" \ + e3e17be1-6491-451c-8fcc-21b82fe5442a)(content(Whitespace\" \ \")))))((Secondary((id \ - 4a64ac40-4679-4366-91a0-b89dca268279)(content(Whitespace\" \ + d74159b4-8c2e-4d98-8e04-a60b7145cb86)(content(Whitespace\" \ \"))))(Tile((id \ - 34933335-7008-497f-9d8c-b31135833d16)(label(\"(\"\")\"))(mold((out \ + 7402e78a-c22c-47e9-aad7-3c2f59e9fbfa)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c218a674-f28d-4146-930b-eb6f796111e0)(label(Int))(mold((out \ + 06e7788d-4918-4aeb-87c5-35974a312cad)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 76077180-868e-4535-9870-6f45077f1279)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + fa769906-28a2-4729-b0a1-cd19dbb31320)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2fdfc791-1dbd-4794-ac3d-acb08e108b1d)(content(Whitespace\" \ + 3ff83eee-734d-48bf-8e6f-95368d916953)(content(Whitespace\" \ \"))))(Tile((id \ - 660b1ff5-f543-4a94-9e0b-040501cb6950)(label(Anonymous))(mold((out \ + 1b76e89a-5a21-459e-be3e-a098b9ac4262)(label(Anonymous))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ca0b24b7-26e4-4f18-a5ac-03da0194292a)(content(Whitespace\" \ + ffd6a15e-c992-49cb-b093-4de734ef226a)(content(Whitespace\" \ \"))))(Tile((id \ - e54319f0-eba4-46ba-8904-e80e9db0b1da)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 5a058f00-b1eb-4aa5-a326-f319549949d5)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b5119751-b957-4a65-a4c2-ccdc1ab2bc89)(content(Whitespace\" \ + 635bde49-7101-4609-8eeb-b1dd62c58ac4)(content(Whitespace\" \ \"))))(Tile((id \ - 148914d3-99cc-446c-8bb2-3422cc4a553a)(label(Sum))(mold((out \ + 0081bb3b-8957-4a9e-ad93-b57958e59e09)(label(Sum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a3295e9c-3446-4e30-81b6-f9ea31d00099)(content(Whitespace\" \ + c43ee57a-f9ae-42e8-b32a-92dfb225a273)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 85cfca79-ca13-4d16-82c1-5f9b090483d0)(content(Whitespace\" \ + 33d8aa3f-3654-4675-a887-a7c2ddb0b5f1)(content(Whitespace\" \ \"))))(Secondary((id \ - 3addc8b5-77a2-4d3f-b240-a42a1bdbacea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4250cef5-a35d-47b8-97c5-c92a48b1c8db)(label(let = \ + dd1ee30a-19df-4146-8077-29987772f7ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4d1e176c-830d-4f05-a557-2c0157120cd1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f2a63b3a-1ebe-4375-9749-4f12edd18d35)(content(Whitespace\" \ + 59740414-4047-48f5-aa87-c4f30485a202)(content(Whitespace\" \ \"))))(Tile((id \ - 714cbc78-0a5e-42e9-a83d-41a301f4dd1d)(label(_))(mold((out \ + 58487b2a-8323-449d-a1c5-b017932c7335)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6724882b-9190-4687-9383-cacd82d63928)(content(Whitespace\" \ + a8267f0c-50be-4a58-b34e-3b8da2fabbd7)(content(Whitespace\" \ \")))))((Secondary((id \ - fd8b2b27-0be7-4768-a187-fe62a0a02300)(content(Whitespace\" \ + 506c2e86-935d-44e9-97a9-dc4cd11a48db)(content(Whitespace\" \ \"))))(Tile((id \ - 2da8f63b-a4ba-4fe2-9e78-af2a352f2036)(label(\"(\"\")\"))(mold((out \ + 4347e7fa-dbb9-4ae4-9a39-2b6645e72ab4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 503e30a9-aeeb-42d7-a42f-c02ef125b0e2)(label(1))(mold((out \ + 67e30d22-06c5-4f0e-b4d4-73d6940f21ed)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0d92f21e-fd16-4b4b-a512-afae726117e3)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 1cbf654d-a2e5-43f3-9d92-d997b3f32e7d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0fd5bd23-a708-4b48-98a0-4e4b9fa05c32)(content(Whitespace\" \ + d95ea558-5838-47ed-8f86-0449e50032a1)(content(Whitespace\" \ \"))))(Tile((id \ - f9d77557-184b-4f52-acde-16f41d4166fe)(label(Sum))(mold((out \ + 314e666e-f0c7-4136-8ee4-a27863b197ca)(label(Sum))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 0f2dbf7a-c881-4050-ad37-0ad7f6d6a7b2)(content(Whitespace\" \ + 0109e3c7-c5ca-4142-bfa0-0b2fcc225ef8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 917c166d-0721-45a6-bed2-681f750485ca)(content(Whitespace\" \ + ae7ea7eb-43e2-48ec-910c-5dcc8a7a54ad)(content(Whitespace\" \ \"))))(Secondary((id \ - bbefa4fc-0966-4f39-835f-64d3516e5f53)(content(Comment\"#err: \ + c6c9c717-c333-4f63-8199-d1f56e8a4202)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - 60bc2aa4-0b81-4356-943c-e68f7ac510ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c01847f6-15bb-44ff-9f05-209367f03f7d)(label(let = \ + 189df76f-8380-4723-8ee5-e0022c1f9791)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3c9e3372-e111-4cd0-aa30-63e1c14c68c3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 591380d8-d43c-47cc-94ca-249f078a157e)(content(Whitespace\" \ + ce687dde-da25-42c2-9514-f796bc01711c)(content(Whitespace\" \ \"))))(Tile((id \ - 3fd95373-6092-40e3-b2bf-8f178061f9c0)(label(_))(mold((out \ + a0cd2872-0616-44ad-bf1f-589eca58a542)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4fdc4342-3d28-4d46-a063-da90e9b4d7bc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + e5d9baf6-d033-472c-8f95-e13379cc67a0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cd43dede-f632-4f59-9e54-d8ad47755667)(content(Whitespace\" \ + 9ec88df4-5c76-4be6-82b2-ec41313290fa)(content(Whitespace\" \ \"))))(Tile((id \ - e1c2481f-fa45-4215-8081-d2eef4f8e8b5)(label(CompoundAlias))(mold((out \ + 2f81d35e-6d30-4bb6-9c85-eca4c40534b6)(label(CompoundAlias))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6188a6f5-c684-4af8-ab9e-3256c23b7c1d)(content(Whitespace\" \ + 7ee66fed-2563-42b8-a6cb-dcbed6c52f83)(content(Whitespace\" \ \")))))((Secondary((id \ - 016923aa-5b98-4d44-9372-e16836d64f36)(content(Whitespace\" \ + 8c659dcd-5658-4640-a5e9-2fe4782170d1)(content(Whitespace\" \ \"))))(Tile((id \ - f705a020-a72d-4355-a982-13faad65a8ec)(label(\"(\"\")\"))(mold((out \ + f1bcc86a-a392-4941-8c9d-320f7e01e822)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - eefcbd7f-aec0-4db9-a17a-b9ff21d5bc95)(label(1))(mold((out \ + 2e913e3c-664e-4bab-822e-d7d040d74dbf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cbdd1550-c48b-4dcd-95f4-bce1f98a6d1d)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 706fb612-3ed1-42ce-8996-e356942c7e76)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 98a3cc68-afee-4809-aba5-75e733c673cd)(content(Whitespace\" \ + 0b296129-a5df-4847-be1e-04c02fac5abc)(content(Whitespace\" \ \"))))(Tile((id \ - 37d16e1e-6da9-47f9-a9fa-50cdc3cd94a5)(label(Sum))(mold((out \ + 95e7a4a7-bf57-4dac-bb63-7986929c12e8)(label(Sum))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 4ae0a91d-b46b-4c3b-8f85-52bd7748fedf)(content(Whitespace\" \ + 952d0ff7-4b82-4982-9e13-51bb7a59b980)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 40bb855c-6b45-4476-adb8-20151c081ee9)(content(Whitespace\" \ + 30365859-c813-4c56-9424-d12b5b394608)(content(Whitespace\" \ \"))))(Secondary((id \ - 39500a9e-b189-468f-9103-b24cf76f040d)(content(Comment\"#no \ + 36a46e75-d205-40be-a9f6-cacedaa64cc8)(content(Comment\"#no \ error#\"))))(Secondary((id \ - e7eb628c-3fa7-495a-a51b-e110980554fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a1406680-cf51-4b14-8f13-9a43b73fba46)(label(type = \ + 9bc0a005-9b92-4090-94a6-df3cd4cbf181)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7a858d7f-897a-4fe2-bc82-4670e6305b1f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f98204ac-7408-40ef-8189-a32946d1c192)(content(Whitespace\" \ + 8f021de1-9cdc-4c15-9532-058ba604ea9b)(content(Whitespace\" \ \"))))(Tile((id \ - cbc36712-eb03-4be1-919b-c80e5bf9822a)(label(Yorp))(mold((out \ + 0efc7b1a-9960-4b18-aa25-75defcdb8138)(label(Yorp))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - fc7c8c66-f357-43de-9b25-a108f59d2910)(content(Whitespace\" \ + 31d2b55f-57cb-4ab2-9182-271e87236af4)(content(Whitespace\" \ \")))))((Secondary((id \ - 14ab2d99-a891-4eb9-b55c-0b38ab4fcb0c)(content(Whitespace\" \ + 97dbe6a3-ad64-468d-a97e-9ceb519b0d8f)(content(Whitespace\" \ \"))))(Tile((id \ - 20f829db-22e2-431e-ab11-8eddaa088129)(label(Int))(mold((out \ + 36284329-5087-46b2-a15e-12a52b4cec90)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4fce041b-ac8c-434e-af8e-391e3ae60d74)(content(Whitespace\" \ + 0de46358-0bfd-459c-a28e-526de56fcadf)(content(Whitespace\" \ \"))))(Tile((id \ - a301e74b-6e03-4455-9cc3-2e325e942fa2)(label(->))(mold((out \ + 173eb4f7-d828-40cc-b2b6-1a7bdca2301e)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 839e1f10-a8d2-40f4-9bc9-3dd5941cd664)(content(Whitespace\" \ + 6af92d08-2e0c-4768-b3ba-3500a41655fc)(content(Whitespace\" \ \"))))(Tile((id \ - 4630be6e-eca5-4718-a71e-239de5a48d4e)(label(\"(\"\")\"))(mold((out \ + 5b8b8ab9-eb4f-4ea2-911a-fc425796fbed)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 697f3706-b9ac-42b0-917b-2b57ad0f1c95)(label(Inside))(mold((out \ + 9a3c9fbb-8943-44f0-9382-5c697351f723)(label(Inside))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8399b277-7d98-453b-a117-a188b78a2f7b)(content(Whitespace\" \ + 439ee441-17d4-49c6-b33f-3610ae8cfe7a)(content(Whitespace\" \ \"))))(Tile((id \ - bb39161b-72ad-42c8-bbcc-2011a7bb0927)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 535dcfa5-0ba6-4ab8-a9b8-e5e923cef893)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0ca22f75-e67e-4179-8574-0251182b7355)(content(Whitespace\" \ + 83710256-ec5f-455d-ba99-b02a86b49362)(content(Whitespace\" \ \"))))(Tile((id \ - 11752147-f120-4116-9aa3-c51df039f52e)(label(Ouside))(mold((out \ + 641e2a99-c82b-4826-95c2-8e7a4a0a149d)(label(Ouside))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3890ca6c-f213-4520-9198-cdb016151871)(content(Whitespace\" \ + 0b173734-9ef6-410f-9a12-004d77c532ae)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3ee55537-d8e2-4bc6-9bbf-fbf18d98d1e5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7a297494-386f-44f7-b248-19650fadbab5)(label(let = \ + e70438f1-0691-4df6-956c-a529d934c330)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e83c5c81-b423-418d-9bd4-97ccb1879b87)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d826df8a-e45f-4b11-b7ef-a6180ef6a475)(content(Whitespace\" \ + 6954a797-3c98-4dd2-b4a9-12ee61e237fd)(content(Whitespace\" \ \"))))(Tile((id \ - 2d440fcf-b0de-4f95-a41f-cf7c6458ce03)(label(_))(mold((out \ + 05146188-2968-43fb-9cf1-bcfb3a7d674e)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3aa15bb2-877d-414f-afc3-ae075ea7d51c)(content(Whitespace\" \ + 8d94dc74-c4d7-4bb2-836a-5e64851c3087)(content(Whitespace\" \ \")))))((Secondary((id \ - 6892ff00-0519-4456-89cd-7592ef4f1bfc)(content(Whitespace\" \ + b50b0346-d9d0-4607-ad97-22fca24b825b)(content(Whitespace\" \ \"))))(Tile((id \ - 83e43479-5702-4249-a6b3-9715fb2223e9)(label(fun \ + 9b92f3dd-c819-480c-b3ad-cd268ff2fd7d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 56a67b30-cab3-4c6f-beb6-a0624c4fe56e)(content(Whitespace\" \ + fe797497-b536-4b25-8437-8a7cd2e55ff8)(content(Whitespace\" \ \"))))(Tile((id \ - e1100f99-f60d-4b5d-9df2-c8aa54744ac9)(label(_))(mold((out \ + a825960c-acc9-40e9-a4bd-fd5f09d4970f)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 943e41f1-b39e-46b1-a484-115aca74a68a)(content(Whitespace\" \ + f823a7a6-4d75-4559-b2fc-d55197989bcb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 79623b4d-7d1a-4db8-bd72-22f39a30e159)(content(Whitespace\" \ + dd672122-e01f-4f5e-b497-9816d563cec2)(content(Whitespace\" \ \"))))(Tile((id \ - 2cf9dd1c-d6f8-4592-80e2-2deb9c8e0d22)(label(Inside))(mold((out \ + 8a6c5c41-fa31-4e73-b367-9b0b45266716)(label(Inside))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f295d8a6-6d2d-4b4e-86b3-38c9846765e3)(content(Whitespace\" \ + f9d34fa3-4ae2-421b-bb05-eae8415b738f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9f125b81-04ab-4719-9aa9-32ad8fddb18c)(content(Whitespace\" \ + 9cd1f306-fe75-4483-85f9-8991a3e61c19)(content(Whitespace\" \ \"))))(Secondary((id \ - 2e22a04a-a6fb-4372-a13b-f2ef4f66411b)(content(Comment\"#err: \ + 0b009971-7be6-4f5a-a976-b05f729296ef)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - aa6021c3-7440-4d98-ab16-742f2f2233a3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 712b71b1-7293-47bd-900c-abe487b15154)(label(let = \ + d921e65a-b36b-40b5-a9fe-cadf0a6eaaac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cb07440d-14f9-4c5b-999a-9de966dd0412)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f833c960-f1ea-4226-8132-55f684151f32)(content(Whitespace\" \ + 01de7a81-45c3-4933-8f75-55c013fc08cf)(content(Whitespace\" \ \"))))(Tile((id \ - 44154061-c60e-475b-b9e5-23afba0699d2)(label(_))(mold((out \ + 9cea3814-76a7-4cbb-827d-971d4877c9cd)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6ab2c025-ed6a-4bf4-b339-28982ccf8ee5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 70adbd13-f652-44e3-bbb7-df4acd5c9051)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - aa8f8cbf-d98e-4dc1-b9a0-841b244cfb78)(content(Whitespace\" \ + 44d9778a-a5ed-483d-b320-180a734179d7)(content(Whitespace\" \ \"))))(Tile((id \ - 7046ff8f-5b8a-4d57-a39d-f5bd20916f68)(label(Yorp))(mold((out \ + 4d448086-e1ac-44a1-a9c6-55b87c5440d5)(label(Yorp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f14c92c8-9975-4598-baad-febacbc66ced)(content(Whitespace\" \ + db1f92e5-9d4e-40a3-bde2-ad6e2ed431f8)(content(Whitespace\" \ \")))))((Secondary((id \ - 65eef072-dfab-48aa-a0bb-9f35dc517f96)(content(Whitespace\" \ + 9ea40d04-ab90-458f-b115-a28e9c148a41)(content(Whitespace\" \ \"))))(Tile((id \ - 1d7f6f4d-2b5c-42c6-8fd5-e6e978b7da18)(label(fun \ + 0e8afa74-4226-4955-a78c-9c95d5bb8a06)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 89ddccbf-2594-4e32-ad8b-9f360d7b2de3)(content(Whitespace\" \ + 5bcc3376-e134-42bd-9534-dcf84a76a769)(content(Whitespace\" \ \"))))(Tile((id \ - 30add1cd-018c-4a6d-b28a-ef0301b8f0e2)(label(_))(mold((out \ + 08282231-07dd-42dc-b32a-888f32dc2e7b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b0884aed-306d-4f86-adca-5545e9d2cae5)(content(Whitespace\" \ + ab96b531-4122-4fa4-aa17-d30da9e8c8bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ff752faf-57fc-4b58-a8c3-d6739562f516)(content(Whitespace\" \ + fb85f35a-3094-4796-938b-ce367925d7b0)(content(Whitespace\" \ \"))))(Tile((id \ - 7281c949-f27a-4bb8-b84f-50a2d364a4ce)(label(Inside))(mold((out \ + 0111dde3-9015-4f28-a685-efba2430c585)(label(Inside))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fd023a10-7c70-40dd-9b9f-0d0e60a6118a)(content(Whitespace\" \ + d43dc0b4-abcc-4231-8605-be7d310849b1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee8c6a7c-5bfc-4974-8e61-edbefe26b78d)(content(Whitespace\" \ + 65fa306c-dd07-462a-9e9f-9f2fa64e1424)(content(Whitespace\" \ \"))))(Secondary((id \ - 5202ef3d-18f0-420e-9931-73e28fb1fe38)(content(Comment\"#no \ + 77be74bf-70fc-4d95-a296-701da26a9a50)(content(Comment\"#no \ error#\"))))(Secondary((id \ - 1efcebbb-8780-4255-a3f8-d175f1ee073e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e1e7b69d-469b-4ba0-a495-e75b857b3f20)(label(type = \ + 65da2cb7-2faa-405a-a60a-0de4dcdd3532)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7ea29e58-e41d-4d6a-9f0f-2a771b685b74)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 99a1a829-4099-40b8-bd35-b503867a2c46)(content(Whitespace\" \ + a8c94dd6-f6d6-41c3-a38e-851124d4f255)(content(Whitespace\" \ \"))))(Tile((id \ - 36788d6a-dbb4-4e09-9fb8-2b47e13d425b)(label(Gargs))(mold((out \ + 784162d7-63f2-4f85-8469-2b1e2320c817)(label(Gargs))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - aa5ad82a-3e90-49f0-8d2e-a906d1993166)(content(Whitespace\" \ + 175b4850-e7d8-4325-9089-4b163d3888de)(content(Whitespace\" \ \")))))((Secondary((id \ - 1975dae3-c37c-4e2e-87ef-3e34676c43e4)(content(Whitespace\" \ - \"))))(Tile((id 9a270162-b5c3-4967-9e80-4500ba8315f6)(label([ \ + ee04d44b-1904-408e-b925-cf3c143fe29b)(content(Whitespace\" \ + \"))))(Tile((id a6cf2e3f-6941-4a4c-97f4-cd2c8a96da30)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - cf62e16d-8837-43bc-9925-2b62630a4d2e)(label(BigGuy))(mold((out \ + 36aa4130-03a2-47af-9349-522b96d8f199)(label(BigGuy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 67a6ef6f-0833-4b56-9cfa-dc35a26e5267)(content(Whitespace\" \ + dcb8aa31-3ac4-4b96-b2ba-cf6468ede6f4)(content(Whitespace\" \ \"))))(Tile((id \ - 3e5b4c41-f8a7-464c-aa35-0497b093c87e)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + b789f3e4-ecdb-469c-b262-2a76db3f6894)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 33950ea1-db28-4d4c-80fd-5d9458c01376)(content(Whitespace\" \ + 88dc28e4-609c-465e-a73e-7a063c69eb05)(content(Whitespace\" \ \"))))(Tile((id \ - a7d579a3-3c20-42ee-84bc-fd774067d9c6)(label(Small))(mold((out \ + 259909ce-534b-40f0-9d0f-fbc30bee9c6c)(label(Small))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 57f96072-51dd-45a6-8a75-1e3c5b61f249)(content(Whitespace\" \ + 79071c31-8c41-4a02-9dce-ae47656d956e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 01577e64-bf58-4a7f-bd69-f78e1fc244b0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d898b799-4ca6-4d0f-ba7a-05f5457b1f3a)(label(let = \ + 3a0428c8-4272-4911-b85f-9336534077e1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e48d07d2-030e-482d-b6f7-72e17d0a4a37)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8f4217dd-d8cc-4ebc-a8be-6681e68928c9)(content(Whitespace\" \ + 0e90b094-89c0-4b46-ba9b-5e1070260e9b)(content(Whitespace\" \ \"))))(Tile((id \ - d68dff3e-1a30-4cf7-a591-82353680b3a2)(label(_))(mold((out \ + 1fc7fe68-63a5-4967-8af8-896adf4735af)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dabef24a-a341-4bb6-ac2b-11634c79d0f4)(content(Whitespace\" \ + 7f3440d2-51fe-4ef7-a976-ee959114985b)(content(Whitespace\" \ \")))))((Secondary((id \ - 98584257-10e7-42b6-a45e-7c7e92a94153)(content(Whitespace\" \ + e44f712e-f0be-4fdb-9b7a-924fde75f780)(content(Whitespace\" \ \"))))(Tile((id \ - 19c2c0cd-dc53-49d2-ac55-69c81f10a046)(label(BigGuy))(mold((out \ + e7688dd3-5226-43f8-991e-e68f4e07dfe0)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4c7017d0-6c48-4ee3-9e52-333862ef0c21)(content(Whitespace\" \ + 2185b51f-d263-41b2-83b9-b2492445aeb8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 440e44c5-ed6e-4921-b99f-f2595612e93c)(content(Whitespace\" \ + 79ebdd9b-b381-4be9-aede-3f693b1a45d7)(content(Whitespace\" \ \"))))(Secondary((id \ - 0f6e0333-dac5-452f-b3a4-d45adad5af85)(content(Comment\"#err: \ + 6572a7bd-4a4c-4a8b-afbb-19bacb9624ab)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - 90807928-26cf-4f5f-806a-9164725c1556)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0e8a3461-af04-4423-b651-9fe8c006f323)(label(let = \ + 69a37450-5ea6-4963-8cc8-4b816cbde54f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 976cabc2-b5d6-47cb-8c34-2e59bc3a266a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 50404f5d-c653-41c6-bba8-42e228222987)(content(Whitespace\" \ + 2dafa352-6f12-4e95-92f6-2595d201b540)(content(Whitespace\" \ \"))))(Tile((id \ - d96dca89-99af-4d53-a42c-c655ff25b297)(label(_))(mold((out \ + 016212af-d424-45d0-ac79-01c2153f4095)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0ba9f9c6-47c4-4b3a-a90d-60ee56bee461)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 315dd016-1d29-4ab7-9f3b-61abe8bd1fe1)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c6f76877-8139-4175-b824-ea94b3c86e5e)(content(Whitespace\" \ + 7685d7cc-ad63-446f-9657-3a5cdf2e6ecf)(content(Whitespace\" \ \"))))(Tile((id \ - 6f6c6001-5a0b-47e4-aa39-5153f95cf4a5)(label(Gargs))(mold((out \ + df26fd12-8151-46f2-9564-577058e2f0fa)(label(Gargs))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - dfab673a-1f3e-4652-9586-549617a9401b)(content(Whitespace\" \ + c885efba-c282-4c1c-8274-041c72432a92)(content(Whitespace\" \ \")))))((Secondary((id \ - 41d055f1-a91f-45cf-9c01-c3b1e2db1161)(content(Whitespace\" \ - \"))))(Tile((id 8c8bac84-8384-448a-9df0-cfa8bce1af0f)(label([ \ + add94470-6bc8-4d5b-a37e-7940753c50b2)(content(Whitespace\" \ + \"))))(Tile((id a3c57640-3278-457e-8fb5-3a72fa66a0d7)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 1acf9314-5f5b-4fb5-872d-0343ea92d419)(label(BigGuy))(mold((out \ + 0b6294e6-2bf0-4991-ae7f-0af20554273a)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 08897f29-c87f-481a-8c6f-a22edb0788ba)(content(Whitespace\" \ + eb7b2d81-ba05-4ab3-9a89-a28aafee5224)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 92cfe191-ff9d-442c-955f-5f995271f866)(content(Whitespace\" \ + 820922ab-491a-4b7d-ae95-7e703d2d184c)(content(Whitespace\" \ \"))))(Secondary((id \ - 9810fba7-a0fb-4af2-9cb0-dd4b84e377ae)(content(Comment\"#no \ + 9825e2ba-4223-4a19-a11f-bd077860d960)(content(Comment\"#no \ error#\"))))(Secondary((id \ - 66ceb841-6611-4337-a31a-12a5cbd24089)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9c2b5104-6ccd-4899-bd24-18b19dc8ca1a)(label(let = \ + 8e822759-cd6e-4d1b-b320-1f0fa82bbc5e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 07950888-1ae0-4a58-ae03-e53b76ecbe66)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ff106bd8-3e77-44e0-8776-98534a59abe1)(content(Whitespace\" \ + 2fe07886-2a9f-47b4-b2a4-0cad5c9f09f1)(content(Whitespace\" \ \"))))(Tile((id \ - ca8e9c0b-34b4-4bce-bc7a-b389e315ddae)(label(_))(mold((out \ + 0856f7fc-9098-413d-a09b-378bb44cc4bc)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 37b16295-00a0-4622-a632-7147c389de04)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1d0cee5d-c88e-4305-ba1d-aac90160ab12)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0c26e47f-4c09-43f2-850c-54878337e8b1)(content(Whitespace\" \ + 139bae96-9e8f-47a7-9eba-b07233f0b861)(content(Whitespace\" \ \"))))(Tile((id \ - 89c04f2d-1440-4140-98ed-728ab5007f3c)(label(Gargs))(mold((out \ + 08d31be5-4580-4e27-87e8-1f989015b2d7)(label(Gargs))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 374242b0-7851-4223-bf66-05a4ec39e3f4)(content(Whitespace\" \ + 3a100426-dfaf-4f58-a9ee-d8b8562efdb2)(content(Whitespace\" \ \")))))((Secondary((id \ - c8c6ece6-9625-47ac-8268-fd5b088022fb)(content(Whitespace\" \ + dff2591f-a430-4a10-bc31-bc64231f8d80)(content(Whitespace\" \ \"))))(Tile((id \ - 23a2160b-4511-4bf4-93b4-1f683c8ea3e0)(label(BigGuy))(mold((out \ + 50a16d96-4611-45e8-b115-a57a41380ea6)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0fcfb4cb-206c-4271-8e01-21b8f8b8a829)(content(Whitespace\" \ + 27932146-7dd3-46f2-91c4-681dc23bb3d3)(content(Whitespace\" \ \"))))(Tile((id \ - 2231f476-155a-4eb4-95b4-2ffd29b80a7c)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 0f2b9d2b-69f4-467b-abde-197e718324ee)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 487db073-d8c5-48e5-b123-ba3a2f6db6e2)(content(Whitespace\" \ - \"))))(Tile((id c76ec439-420a-4861-b42a-8e79930609d1)(label([ \ + b90c6d5e-8372-4296-bdab-6c604bd64477)(content(Whitespace\" \ + \"))))(Tile((id dd1bcd24-c7c6-4da4-8ef0-aadb68d1c14d)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - e5b75fe3-89f4-40c4-b9a4-b5cb51fac788)(label(BigGuy))(mold((out \ + 323c9734-00ce-4b0b-aaf5-0bd788e68bf0)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d3dd54fc-7ffc-4d0c-8dd0-bf7ef6457b44)(content(Whitespace\" \ + c62dbc37-b24c-4baa-bf1e-43d7dcf625ca)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e339ef99-da83-4e07-b97c-0ea6eb0bf0d2)(content(Whitespace\" \ + 5061740b-b79f-4aeb-a03f-efaf50e757c4)(content(Whitespace\" \ \"))))(Secondary((id \ - 07b8ca66-0b3b-4ff9-96a7-1b6c3d1ee2e2)(content(Comment\"#no \ + d0e3c1f0-c0cd-4169-a73b-a099a53d2852)(content(Comment\"#no \ error#\"))))(Secondary((id \ - f4fbbeba-e830-4d0f-bc01-c7fcf2c72149)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 798f7692-dcd9-4a69-b8d4-d864b81d9e46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ccb10986-e1c2-4717-9e40-f483a023fe77)(content(Comment\"#unbound \ + bac315c4-f2ae-48ae-bb04-ec67cb3de0e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 33ab653b-5849-4bf8-aa58-b288ff8174c3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dddee9b8-d1c2-423f-867b-a734af7224a2)(content(Comment\"#unbound \ tyvars treated as unknown-typehole#\"))))(Secondary((id \ - 8fbfacd7-4f4c-447c-8cee-8b8389804820)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 219161a8-500b-4644-96ca-3cc60f837891)(label(let = \ + 4fd36965-8d6a-43cc-81c1-7c17733edd22)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fadf4153-4afe-4e72-9059-700a6fea3664)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4d5a6229-7faf-48de-947a-95bf207cae81)(content(Whitespace\" \ + 596c93f3-10d4-444e-b72c-2bae3b06476f)(content(Whitespace\" \ \"))))(Tile((id \ - fda91126-1717-4aa9-80d9-eccc25f22d69)(label(a))(mold((out \ + aab31b3c-6876-4b75-9f9b-88312601e537)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2404d77c-60d3-405f-b281-1780231f4fcb)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + da84d488-fe11-47eb-b13a-647c6731a15a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - afd302f2-0780-438b-aa2e-cc8d650057da)(label(Bad))(mold((out \ + a04db2e9-b0b5-40f6-9d0e-dacf2deb3c46)(label(Bad))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 74226087-3a3d-4492-94e3-6e9eec279213)(content(Whitespace\" \ + 3ba1dc68-0c14-4ab7-af7b-8d39bd28b355)(content(Whitespace\" \ \")))))((Secondary((id \ - 87c77f09-c937-4d5b-b4fc-af4cde8e96c6)(content(Whitespace\" \ + 634b036c-d91d-48e4-a1ee-deaf108519d9)(content(Whitespace\" \ \"))))(Tile((id \ - 44d53111-ae73-4baa-bc1e-21b2bcdab066)(label(0))(mold((out \ + 230cecce-3b89-4f31-a1fe-0b7cd6b0fa22)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b6420725-968b-47e3-8088-b6f9ad69191d)(content(Whitespace\" \ + 16486275-25a7-47c5-8264-e3df1569dc4a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d1463fc7-e198-4505-bde2-3194a4b9f059)(content(Whitespace\" \ + fae8f93f-455f-4de1-b043-5c3fe5b10fc2)(content(Whitespace\" \ \"))))(Tile((id \ - a40251c7-b8fe-4d13-88ab-7099f374f1ea)(label(a))(mold((out \ + 09fe7c74-613d-4d1d-bd3d-57ab38816f92)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a67ce1eb-c586-427f-8760-73d05c4a0868)(content(Whitespace\" \ + e95cde87-6345-491b-b29a-401efaffafc8)(content(Whitespace\" \ \"))))(Tile((id \ - 5c6ac5ea-9314-44bd-b505-3555f3fda0c6)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + dc126979-0ced-49c4-b296-5c635913d6d4)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f27a6e17-4598-4c77-97aa-b23ad5c57c30)(content(Whitespace\" \ + 5173e9f1-50dc-4a68-b52e-b9e0f99856ac)(content(Whitespace\" \ \"))))(Tile((id \ - 5f4aa276-21ab-4df9-837d-47fc7f5c2329)(label(0))(mold((out \ + 41c4256a-822b-44bc-87bc-d15b00d595d6)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 790d9673-2597-46f1-a7a8-ca126695ca31)(label(\";\"))(mold((out \ + 20496593-240c-4de8-8d38-e572fd722783)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - be418afa-4704-4ff2-8fa7-518de2ea1b7b)(content(Whitespace\" \ + 811c65ce-11d8-473b-b49c-7b7104380039)(content(Whitespace\" \ \"))))(Secondary((id \ - 1163438f-7bc2-45f0-ab80-d831fe6e89e9)(content(Comment\"#err: \ + c22ebe06-a43c-4030-827a-833e462e79c3)(content(Comment\"#err: \ not bound#\"))))(Secondary((id \ - 96b31255-b1fe-4de1-9617-e368995784f0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 25e19ea7-ad9a-4c94-ad6f-afa03f50fd1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7199f788-c3e2-4104-957d-9773562d080a)(content(Comment\"#non-sum-types \ + b0c3a277-c4a3-4812-a140-6e873acf93f2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 54533a63-7ad0-4eb5-b010-9940a2303997)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cf48446a-6d87-42cf-a4cd-5d29de82f757)(content(Comment\"#non-sum-types \ cant be recursive#\"))))(Secondary((id \ - 93fdc15b-1031-418d-843d-6337df2d79a5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 89d68700-afb1-4562-838e-9db767e0c312)(label(type = \ + 64761da1-646d-43e6-a630-f2b263d0fd1d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 79357723-f5dd-4391-ac2a-c45772ea6cc4)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a4301ab5-ef0c-44b6-a261-a7d4e497d257)(content(Whitespace\" \ + 23c2f5d2-38b5-417e-ba77-6dedd7ca37e0)(content(Whitespace\" \ \"))))(Tile((id \ - f0e88a3a-e5bb-42d0-a432-76e6acaf6d68)(label(Lol))(mold((out \ + 61a0fce4-0836-4f18-9f8d-a23734bbe408)(label(Lol))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 47321d59-c948-4d9b-bc9d-3275566f8c45)(content(Whitespace\" \ + 027e2f10-aa7d-4b3c-bf52-b75f039c172e)(content(Whitespace\" \ \")))))((Secondary((id \ - d19fa033-9912-429a-9ca4-5dd4838bac64)(content(Whitespace\" \ + b0ef397c-5681-4106-89ea-00012ccfaf26)(content(Whitespace\" \ \"))))(Tile((id \ - ab3fb279-a3ca-4074-81dd-0ae7c80527e8)(label(Lol))(mold((out \ + b64eb82f-b885-429a-b170-cf68abc94889)(label(Lol))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c293d6ff-8104-4f4f-acc5-12d691fb5ac9)(content(Whitespace\" \ + 39be849b-d5ac-4656-8259-0f19e1a390f6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f93712dc-73e7-40ae-8a21-42d313da2ff0)(content(Whitespace\" \ + 10302ae2-d6c3-49c0-a97a-0c333a55c08d)(content(Whitespace\" \ \"))))(Secondary((id \ - 6f1c746b-deaa-4270-bf25-4c85957dc2a5)(content(Comment\"#err: \ + 62ee35f7-a3ae-4523-8c6d-7112a79b50b4)(content(Comment\"#err: \ not bound#\"))))(Secondary((id \ - 405eced9-cd91-478f-b4e2-de6e57f425ba)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b5021224-ac6e-4754-9f51-a2bddece86e6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 29d254a0-4e1b-49a3-a099-668728f1c89c)(content(Comment\"#no \ + 85e3bbd4-d6e0-4277-a0e9-d39f2a5cb30a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ae476def-0fd5-44b4-b666-d3add644450c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8413d846-66c3-42d1-9a3f-54d49c7e22c5)(content(Comment\"#no \ errors: analytic shadowing#\"))))(Secondary((id \ - 686f7f49-42c4-4b2a-9a23-ee4512165db0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1ff64461-15b5-446b-a76c-24c13d5d444a)(label(type = \ + cac017e1-e73b-49bf-8569-e71b6e0d9879)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 14bb8104-238d-416d-9880-237ebad3fc72)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8edfaff4-4919-49e7-9e15-8520f5b09f76)(content(Whitespace\" \ + 5eb44d32-f9cd-4529-8a9e-b68c59f3ba20)(content(Whitespace\" \ \"))))(Tile((id \ - 1becea0c-d28f-4f43-b256-9ae031247317)(label(Tork1))(mold((out \ + 7c1e0603-06ba-4be8-b7e0-646139014e21)(label(Tork1))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 3f451423-322f-4a03-803c-a9fe4469059d)(content(Whitespace\" \ + 87bf3976-3053-497d-a433-d168125abc5d)(content(Whitespace\" \ \")))))((Secondary((id \ - 149cde0a-a955-4583-bf00-ba75531fb9a8)(content(Whitespace\" \ + c4b85778-b4d9-4847-80ba-7f633be567aa)(content(Whitespace\" \ \"))))(Tile((id \ - 525b3590-dec9-42c1-a039-3a89cec2c3a3)(label(+))(mold((out \ + 861cc199-b66c-4a2d-8471-f3c69ed093cd)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9f71a0e6-300e-4185-9579-11f23a8c84be)(label(Blob))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + f8c69811-f5da-47b0-998d-6c867f0ce84e)(label(Blob))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fd7ac165-1225-4f0a-a44e-9e63673f88ee)(content(Whitespace\" \ + e9aaf397-d10f-4ce9-8f80-ff421f209e9f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 25c9763d-04cc-4384-8fa3-1b7bd69ed0e5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 16d2afaf-e258-4525-b753-8c2bf7f491ff)(label(type = \ + 311c9489-1709-448e-8238-9e99b47d6521)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2fd07eae-7124-4d07-b278-33f356d9c384)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a83010c6-6c5a-462c-82c0-61ae9e2321a6)(content(Whitespace\" \ + adcaad39-b81c-4d6d-a372-67c12540310f)(content(Whitespace\" \ \"))))(Tile((id \ - 30177813-493b-425d-b6b9-0882ddc5599a)(label(Tork2))(mold((out \ + 21ce4c2b-8860-4591-8870-2889e02ddf23)(label(Tork2))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 2990e467-ad88-4071-be30-5931c90b96d2)(content(Whitespace\" \ + 2fcacfd0-b98b-4168-9490-5709a20840aa)(content(Whitespace\" \ \")))))((Secondary((id \ - d591a449-b5a5-4b2c-9816-7b60f1319af0)(content(Whitespace\" \ + 7a5e4428-1ee0-40c7-9053-091351ac9797)(content(Whitespace\" \ \"))))(Tile((id \ - 2572cd15-f6fb-4b7a-8d0c-3359281fc897)(label(+))(mold((out \ + 8d00c7ba-9925-4314-9ee2-25c3d145348a)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - daba6aeb-2bd4-4768-9c28-a5197ed2e69d)(label(Blob))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + 71562cd9-7273-46c9-803a-f2c5820dcd67)(label(Blob))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7c56b1d3-71b0-421b-9093-f54733ab5a14)(content(Whitespace\" \ + d5b9b831-c34b-4ed2-a34a-40ffc4ddb3e9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0a54f1bb-05ab-474b-894c-0b29d1449cce)(content(Whitespace\" \ + c7b1434c-3c5a-4b94-8f42-a7a0b64a81fa)(content(Whitespace\" \ \"))))(Secondary((id \ - 30114535-b613-4192-b939-eef1e5ccb79c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2a304f33-da99-4aa3-979c-e747ef575d92)(label(let = \ + 37716e1d-8849-44ef-9b30-2fe2c31abd06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 38abd967-c609-4ea7-ad9b-98bf746ab7db)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 81d70396-09a7-49cf-b791-a13e263e658e)(content(Whitespace\" \ + 120f6417-5120-4498-abd9-4dd6335462e4)(content(Whitespace\" \ \"))))(Tile((id \ - 35f31cae-e178-4ee3-b131-a2e4e9d05c3c)(label(x))(mold((out \ + 11eb7810-85f8-4eb9-88e2-e78c34717ba4)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 21d5be43-0bd5-4b04-9451-cd49e298eb43)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c7c9683f-84dd-4fa2-85ea-a93cc18d6872)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - 8c464058-23fd-4d6d-8989-199cd73fc794)(label(Tork1))(mold((out \ + e03ac765-578e-4342-bfad-f20c1d5a86e0)(label(Tork1))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f917dbed-94bb-4c09-9661-5869bd3c2f73)(content(Whitespace\" \ + a6324a47-4636-4006-96a8-9d45acc91cd7)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c883f5c-19c0-4005-8d64-7b957c3875e6)(content(Whitespace\" \ + e32d3aeb-8919-4505-9efa-00ee4ea66b09)(content(Whitespace\" \ \"))))(Tile((id \ - 29ec207b-0631-4208-95c3-fbafcfd0b834)(label(Blob))(mold((out \ + 8af921e9-695f-4528-bcc5-13b452c3e9b2)(label(Blob))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ded79c28-cd8f-43e0-a245-7b07826d1f68)(content(Whitespace\" \ + a46dcefa-ec57-4068-82ee-a90dd68bd423)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9c15d35c-6b79-4da6-94be-31c638ff9d74)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4221f40f-9932-4357-9991-6036e9995b01)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fd3ef32c-2c79-4426-ae9f-fc1167b82b4b)(content(Comment\"#exp \ + 75906e32-dc58-445a-9f9f-7a9edd4eda5a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 80299e98-fdee-4552-8f48-3f210266467b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 837e8595-0afd-4e61-b424-14941efd9d6a)(content(Comment\"#exp \ tests: happy#\"))))(Secondary((id \ - adf5313e-1df5-4df1-864d-9b7c5a812667)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d4348036-dc0a-4680-bb8e-cf0047c0940e)(label(type = \ + 4b68c71d-22a1-4311-acb4-1bcdbbac2593)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6831865e-d18d-4c87-bffd-63dd4fbe2c2c)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8086acf0-34a1-4686-be8f-26863527daee)(content(Whitespace\" \ + 5d175f0c-a3b8-46ed-95cb-99701a6c1dfc)(content(Whitespace\" \ \"))))(Tile((id \ - c5aecbc7-c328-4ba8-8cd9-9d7a00e0cb21)(label(YoDawg))(mold((out \ + 3b5e84a9-9684-4fd9-9be0-3ae150b79e52)(label(YoDawg))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 7b2e209a-0ea1-4915-9cf2-f3c2be5a2879)(content(Whitespace\" \ + 0363ac84-e1c3-405a-b7ef-c0c5f17ce0c3)(content(Whitespace\" \ \")))))((Secondary((id \ - 820a2676-823e-4bc6-b300-5214aa0789f1)(content(Whitespace\" \ + 60c1154b-1909-4275-aace-15536e76b9fa)(content(Whitespace\" \ \"))))(Secondary((id \ - d15001dd-0eae-4e73-afd4-482ab7a3162f)(content(Whitespace\" \ + 5cf25833-c236-43f9-b44d-404a0a530d5f)(content(Whitespace\" \ \"))))(Tile((id \ - 0d01ffdf-6b97-4486-8ff9-044f5a9b3022)(label(Yo))(mold((out \ + 81ff3831-01ac-49d8-bd9d-65176c187d2e)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ac7e5081-6998-4cb3-9c1a-c40837a12f5c)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 1619d870-a4ba-4b89-861b-462b8ea608b6)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 99b838e7-8c34-4a56-b293-1b1ae38a1049)(label(Int))(mold((out \ + 09bc9325-bb34-4c37-8bfe-913035b1c212)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0c38c8bc-db43-480a-841e-10779cde50a6)(content(Whitespace\" \ + 952e2540-4400-47c7-b623-520c4b7cad13)(content(Whitespace\" \ \"))))(Tile((id \ - b0edf54b-6bef-45ba-838d-7403aadd4f27)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 6746b971-47c9-45af-b45a-d00d210e4cba)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5cab4b3c-9cb4-4ab2-9d42-924eba8f3aa8)(content(Whitespace\" \ + 083caf45-7125-404b-854b-0f94fc5a89f2)(content(Whitespace\" \ \"))))(Tile((id \ - e51124be-f1a0-49e6-8574-38bc09feb291)(label(Bo))(mold((out \ + 03309c87-c0b5-4875-ba80-f8cd01eadcf7)(label(Bo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 64254a44-0afb-4267-b67e-45209d5fd9e5)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + cdfa6f77-ed2b-4327-acd5-d2ddae561b18)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 5ef14ff0-0634-4e9e-bb53-8288e942193c)(label(Int))(mold((out \ + 88ca33b7-b505-4ad9-a78e-c3525211fda8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - e9ac6fe6-8a71-45a7-8da8-1f5f90f28133)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + e784c014-b674-45a8-baf7-84e245c73179)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 155ba47c-7565-4213-8397-d934baca7e3d)(content(Whitespace\" \ + e1351172-03df-458e-9796-956bb49015c6)(content(Whitespace\" \ \"))))(Tile((id \ - 4037ef97-2006-4a44-8e3f-52e9f386789e)(label(Dawg))(mold((out \ + f7e496fa-dafb-4477-8419-0717a83a55fd)(label(Dawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c29d5af2-a7e7-4eae-80be-e02c08500412)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + d70849ac-407b-4114-b51b-9e3011e3bcba)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f193a595-7f99-4b7d-9d65-7d8e43ec39be)(label(Bool))(mold((out \ + d58fdf72-d917-46c5-9e0c-54f9b6e39119)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 72564c9c-d9d3-427d-afd2-4ac8076568c3)(content(Whitespace\" \ + e1a0b239-df48-4273-a1e1-5eef9b0cbc07)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3f1708db-324e-4323-b079-049b8b24bf4d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 39838558-510b-43f5-94ea-1123d44a4893)(label(let = \ + 226c1629-506c-4c09-96e5-e385800ffcfd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 24b8565b-cf26-4776-97ae-8177a49db853)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a9543098-44f2-4343-a935-103e66129cd6)(content(Whitespace\" \ + 85619906-4ee5-461d-840e-ed8971dd4c3f)(content(Whitespace\" \ \"))))(Tile((id \ - a4bb3cc6-2f5c-4aa4-b759-64f98efebc6e)(label(_))(mold((out \ + 0dd0114a-5592-4ca5-86ae-885d584a7c4a)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a952baf6-5bcc-4bb5-9b5f-ec904f22493d)(content(Whitespace\" \ + 3c5809b8-ae6e-4fff-b26e-1155a005808e)(content(Whitespace\" \ \")))))((Secondary((id \ - c05f234d-1302-4f88-a783-8cdf34d3d40c)(content(Whitespace\" \ + 68a92422-0a6c-463b-970f-5bd2f113dfd6)(content(Whitespace\" \ \"))))(Tile((id \ - 41e38c8d-fb14-449f-b631-c92243735859)(label(Yo))(mold((out \ + 550e52fd-c10c-4b81-9586-476fd1b2904d)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2af715e2-01fd-43a7-b51f-11eb8b512622)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 4602ee19-bba6-4240-972c-412a33834e35)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7bc5dec7-96f1-4cf0-b1c0-4656eaea8caa)(label(1))(mold((out \ + a19d0368-5b47-46c2-a1bf-1ef58ff3cd88)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - acc97d46-0081-47cb-8390-cf07cd221dfd)(content(Whitespace\" \ + b88f2a40-e44a-4f34-b5ca-6fcbb6de1d9d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - faafe673-8162-4792-9f78-ef39ad8711d9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e440a940-5e6f-41d0-b461-d2623f941031)(label(let = \ + 7ebb7580-025e-4f2f-a1ad-2f2f48713676)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fdd00c16-ad86-4854-801d-b096fd92e59e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 108659a4-8b68-4b8c-b7b5-6b789ceef204)(content(Whitespace\" \ + 740e68c9-3eb8-4553-88ff-d3cc45bed0ba)(content(Whitespace\" \ \"))))(Tile((id \ - 4c444ede-7a17-4cc4-b1cf-a5c908b81294)(label(_))(mold((out \ + c5a82470-76d2-4d10-8556-ff610d18f893)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 73c083d3-7732-4eb4-8805-320031e221c9)(content(Whitespace\" \ + 000b716e-cae8-4166-9bdb-37b24fc88f29)(content(Whitespace\" \ \"))))(Tile((id \ - 55113fea-afb6-4ce4-86f8-2eaeea055cb9)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 93a423c3-cc81-44e8-9bb6-d919ef19bc60)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 75cc1d9e-47cd-4b09-a995-76d799797482)(content(Whitespace\" \ + bcf0a48e-dcc0-416c-926c-604f0a7b7918)(content(Whitespace\" \ \"))))(Tile((id \ - 66fde9e3-e01f-4432-ac18-3514f5d420e2)(label(YoDawg))(mold((out \ + 3ddd3a34-7db9-4127-b929-7a8ab189b022)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ad6b6fa0-0ed3-43e5-bc22-33ff5e4474d1)(content(Whitespace\" \ + 7d7f5c0e-5e5b-40e0-9639-d8f44bfd1415)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c87c560-68ee-4aa6-ae62-b51025662c41)(content(Whitespace\" \ + a6f6fe24-e01f-48f0-9559-cb634d0eab1b)(content(Whitespace\" \ \"))))(Tile((id \ - 7c917f3c-12da-47df-bce7-dcaef2e9d144)(label(Yo))(mold((out \ + 519a8a69-1f5a-4fc8-ae2c-f5648325c5ea)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dfc92cba-547f-46e3-a1ce-33d261945c01)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 127211d2-f216-4272-a87f-e3232a112a93)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ce99c4d-452a-407b-a6ad-9ee8c8b794bf)(label(2))(mold((out \ + 91c54255-dcf3-4f17-87f9-f8805e58a83d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 5cb5dc92-6dc9-4099-8240-b068232de661)(content(Whitespace\" \ + 6b30eca7-6a07-489c-b74d-9a7c9a4b44b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8d2d26b3-42ba-435e-a638-b38b16e28cbb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e09c21c8-8a84-496d-813a-f55700f64d96)(label(let = \ + b4fcc95c-b959-4511-b5ae-b5be41a81662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 71e28ebb-8cc9-4f66-8323-175501ee7851)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dd2a10c9-a86b-4cc6-9a2f-8b27d8d75b11)(content(Whitespace\" \ + 91b4ff47-a4f1-4ad7-a76c-b6d8765eaf35)(content(Whitespace\" \ \"))))(Tile((id \ - af04d0da-9208-45b3-addc-a29c293f6f40)(label(_))(mold((out \ + 15d2051a-3f2b-4270-bbbf-91e96eca5f74)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 35ccdacb-fc30-4f21-b258-7f69e627d7e2)(content(Whitespace\" \ + e5301b98-238e-47cd-82e1-04691579ba72)(content(Whitespace\" \ \"))))(Tile((id \ - f558961c-a720-4e29-a7ce-0c632b872292)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 47da17fc-b1be-4ec7-a93c-3457a8f246f4)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ca42123c-25ad-4a5a-b973-594607c93d58)(content(Whitespace\" \ + 5376e017-91fa-4e3d-b533-7a58f87b6ef9)(content(Whitespace\" \ \"))))(Tile((id \ - f52df601-dcc7-48bf-b6fe-b341c76aaa8b)(label(+))(mold((out \ + 499aebed-8298-40e0-9ef5-8a6c46bdf1eb)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 147816da-20b4-427b-9dc1-ede6c2110c6c)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + 1ab2a1f8-1c71-4437-a409-84001d19e584)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 357b2aa0-b570-468d-92d2-6875660183dc)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 65f09b20-4ad3-488a-9641-1a9d8992ea0c)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 20b39e9a-6f5b-44b1-8ddf-ce4dcfa8026b)(label(Bool))(mold((out \ + c4b585dd-801d-49ac-b963-8968066e3deb)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c8716d17-a9b6-41be-995d-ef7e42e6f73b)(content(Whitespace\" \ + 99e349a8-6cb5-41c3-ae33-b24f57b0f03d)(content(Whitespace\" \ \")))))((Secondary((id \ - ab2471b5-5cda-4a87-98c4-de2f8dabc2de)(content(Whitespace\" \ + 91722274-7576-46a9-a54c-580c7668f195)(content(Whitespace\" \ \"))))(Tile((id \ - f845997e-ab21-4c3b-92af-c65664ab5dad)(label(Yo))(mold((out \ + e1291828-9ffe-4425-ab12-75ab5c2569da)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 377ba38f-d98e-40ba-ac48-e4fda0ca1581)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + e0caba8d-ced9-4271-9e42-1fa335403c23)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7d3a00c2-3da9-4479-a008-90b827278327)(label(true))(mold((out \ + abae89d6-d0cf-411d-b7cb-0edd874ae5e6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ee221f24-9e4c-4268-a868-bffb24fcadaf)(content(Whitespace\" \ + 1077e0f1-6811-4870-9a02-dc130a67db72)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 68ca6027-bc33-4fcd-a466-07a44cdd968d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a70b3bf3-5204-4dd0-acbe-760d495de0bc)(label(let = \ + 9466d8b1-c617-4ec7-bbb3-1cba8579feb7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 05416b66-302c-4f05-88e7-9a6f03640ebd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 297e5d36-9fb0-425f-9580-d5fffbb4cc1b)(content(Whitespace\" \ + 0bba44cd-16e9-4edb-b102-46d53eb63913)(content(Whitespace\" \ \"))))(Tile((id \ - 9d07da15-bb00-4575-ad9f-2cdce9a942e7)(label(_))(mold((out \ + 6cfa7875-0cd0-4198-aef7-aed14c6bc130)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a2a2fd58-2ac5-4b0b-a55b-01646a3b4dde)(content(Whitespace\" \ + 3fa61264-cdbe-4489-8260-f909fbe2e1bd)(content(Whitespace\" \ \"))))(Tile((id \ - 34107bf2-3ea5-46b6-aae0-89f6cd092b45)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 90a9d82c-9132-42ab-a881-504f07b031e3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 113c2063-7bd7-481e-87b9-2aa4059e6231)(content(Whitespace\" \ + f5387297-82cb-4db0-83b4-5d4cc6a18bc8)(content(Whitespace\" \ \"))))(Tile((id \ - b5dc00aa-d47c-4504-b69f-17fb572dfdb3)(label(\"(\"\")\"))(mold((out \ + e5b5505f-a92a-442c-a4fd-2880d5d8aadf)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f55ed323-bad7-4e71-b23a-4e6453806221)(label(Yo))(mold((out \ + 22b06aea-ea92-4d1a-9a11-4d0309cf8d23)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2149c166-a141-457c-b055-391325a4286a)(content(Whitespace\" \ + 3a81cbef-b945-47ec-9e3d-87da7d1446d6)(content(Whitespace\" \ \"))))(Tile((id \ - b9604112-c199-4512-809b-c28949c61ec6)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 7bc3b394-2ed0-4504-af88-fe11f1d989d9)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - db69385d-7e0f-43f1-b596-64d0716e89cd)(content(Whitespace\" \ + 65cd35b8-683c-45ab-ac03-fa2c2b24855b)(content(Whitespace\" \ \"))))(Tile((id \ - ed502769-4b80-4bcf-90ea-7475b3465f16)(label(Dawg))(mold((out \ + 8f78d519-7707-4b03-86bf-074dfa0a1965)(label(Dawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 5c5a7f0e-8ec1-47d0-aa25-88b1a5d2240d)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + d38cba09-db72-4515-bfe7-6317af3ca192)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f786b8df-f704-401c-8f06-03146741d04b)(content(Whitespace\" \ + a00c8682-b008-45a1-98ce-5cb61aeaf013)(content(Whitespace\" \ \"))))(Tile((id \ - 408c24ca-b6ed-43f8-b6cb-d173502ce7a4)(label(Int))(mold((out \ + 254de1db-6815-4958-837a-a42e5271197e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - f6263446-35b6-41a1-b626-78f8b2081d88)(content(Whitespace\" \ + dd7a7601-bb5f-4ce9-b7a6-259cfcc34786)(content(Whitespace\" \ \")))))((Secondary((id \ - 9240e351-39af-4a2d-a743-047f38fd4264)(content(Whitespace\" \ + 96e61f4e-1336-4ce6-b8ef-2ed13e01aad6)(content(Whitespace\" \ \"))))(Tile((id \ - 44e42610-d59f-41f1-9fec-349064f14fa8)(label(\"(\"\")\"))(mold((out \ + d87ea0b3-3c25-42e7-9e1e-c3ab019e5a53)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9b5de60d-6b0f-4263-8c72-4400bfa1ca8c)(label(Dawg))(mold((out \ + 609879ce-93a6-4bde-ad2c-8122af915ffb)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7f9eb770-d68a-4627-ace4-c65c6b0ab48d)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + f028bdab-8cf0-45b4-acec-a19acfe88531)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 2eff9e96-1453-4d9c-ae1c-bf2556b1d509)(label(5))(mold((out \ + 9a7b916b-3baf-4835-a8b6-b84795ae64e1)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 18fdf605-7889-4a62-80ae-2690a3eba6fe)(content(Whitespace\" \ + f744a767-ab21-401d-9fc0-10af7c64b4f7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 17c91e4a-08af-484b-9e62-38bed1629b38)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - daf02719-0436-46e2-9554-1cc670d63753)(label(let = \ + 71c91ec7-5cf3-4c65-afbd-eefd68fe3210)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7d746bc5-b970-4dae-ae2d-8fc3ed5a4732)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cc5f08f2-7e67-4773-b6ed-089380bd1fcb)(content(Whitespace\" \ + 41d3d274-b6d0-4c5a-9d8a-c757bbeff2b5)(content(Whitespace\" \ \"))))(Tile((id \ - 5a84271a-4bd5-44fb-aaa1-91f75980da76)(label(_))(mold((out \ + 073141f9-7efd-4725-88cf-238eb07587ec)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dcabb994-94a1-4658-873c-3f4e26f8e8f2)(content(Whitespace\" \ + 0cfeda56-8d94-46d3-82e1-a4e880ee0277)(content(Whitespace\" \ \"))))(Tile((id \ - e45f5970-56f9-4229-ab5d-2eb80e7c7289)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 550e3dee-e7cd-4f70-9590-c8bdc314c509)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e1af6915-c79d-4580-b3bf-2ec99966c111)(content(Whitespace\" \ + edf9eaee-e757-4062-bdd1-98550a0528fd)(content(Whitespace\" \ \"))))(Tile((id \ - 2eaeb051-8993-404a-8188-3f1f0e0d4d28)(label(DoubleAlias))(mold((out \ + e0298e39-721e-4a15-abd6-9c3bf05e9e4a)(label(DoubleAlias))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4c25bfa1-4b04-4d21-b44a-0f03571f90e4)(content(Whitespace\" \ + e78f1b4f-bd46-45dd-83e8-d0f05122a56c)(content(Whitespace\" \ \")))))((Secondary((id \ - da448888-f8a0-4e10-8564-68af9da9e873)(content(Whitespace\" \ + d38c93dc-ec6c-4aa8-afa3-cfb65e1a6ba4)(content(Whitespace\" \ \"))))(Tile((id \ - 71f1c710-a5db-4a42-89af-ca5f7b12e3be)(label(C))(mold((out \ + d81d5bc0-7722-4b85-a09d-d169d8af06ad)(label(C))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 63858904-cc65-4fd1-a40d-500f743980dd)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + dd653590-25c0-4e14-8723-e37e8656c60e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3876d9ab-2ce6-449e-8b16-33ff4191f02d)(label(4))(mold((out \ + 3638e5ed-8548-4f5e-978f-37217eea5922)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 23806cf2-01ce-4bea-9d88-13e6981f1bb0)(content(Whitespace\" \ + fbd192b0-9e19-4659-b682-238dd1664219)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 387918c2-75b1-4cef-bd48-acf19e9e2f38)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f1e04837-231f-41a2-99ea-bdfc6e060045)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 52bd8fd8-f689-4946-891c-2291dc031ac1)(content(Comment\"#exp \ + 610bfb9c-7eee-4272-b73d-4c61e1e4f3dc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cfa41b90-de19-4254-8a7c-f6bc8a37fc3e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 88e99a99-99ab-4d44-aae4-f3583ecd3586)(content(Comment\"#exp \ tests: errors#\"))))(Secondary((id \ - b2be6e9d-fc09-46bd-aa5b-b4390c4ef179)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4214db3a-ee62-4418-80f2-85552aceee58)(label(let = \ + 4c95811a-a555-4453-b1c5-d498745ac251)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 18718f33-d54b-4157-97c6-a1dc942030d0)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 09711721-4aa6-44e0-bbca-862af2e9ccad)(content(Whitespace\" \ + fdd0e6b2-5d3b-40f5-92c8-ee240a51b94d)(content(Whitespace\" \ \"))))(Tile((id \ - a3bcab3e-81d4-44f5-a4b8-e3a2f9e02b1b)(label(_))(mold((out \ + 00970778-c7e8-48f8-a806-0bc761323140)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b028f571-25be-4657-80f6-de23b1a02bd3)(content(Whitespace\" \ + 10d55465-7d2b-4bcb-a4de-8ce030fc2f8a)(content(Whitespace\" \ \")))))((Secondary((id \ - 2c29cefe-10a5-4367-ad6e-d6db9b69f8f2)(content(Whitespace\" \ + bb3fc577-1905-4353-87ec-4cc8f6b20640)(content(Whitespace\" \ \"))))(Tile((id \ - da5545a4-8e25-4438-be2d-1138f4cddee1)(label(2))(mold((out \ + 67fbfb4e-8a86-44e7-a04f-0c109b21322e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 19964660-f5a3-4d24-a945-ceb4ae1e444d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6619f315-39f5-4d2c-a61f-b579a1e39f90)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 502113ba-b30b-48e6-a02b-8916e4099f10)(label(1))(mold((out \ + 3e8dae88-b9a9-492d-828a-ca47fc87a6f6)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 923b8dd5-2b03-49c1-b375-c3bd8a5be1cb)(content(Whitespace\" \ + d8d1d5dc-8e8f-403d-bf57-513a89dc0212)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 08f65795-5f41-4555-8738-a9d7ba8f4db1)(content(Whitespace\" \ + 9283070a-f8f0-4bd7-b6ef-6b09973e3131)(content(Whitespace\" \ \"))))(Secondary((id \ - 4ac9fda9-dc04-420c-8de4-71f715a8e8ce)(content(Comment\"#err: \ + f9003896-4dc7-4927-9a2b-28cd82628318)(content(Comment\"#err: \ incons with arrow#\"))))(Secondary((id \ - 9cc1e342-4765-424f-8588-b2da5a3c8812)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7f83fafe-e3fd-4d48-b9bd-c981ab1ec228)(label(let = \ + cd479c13-375a-4d66-afc3-929398356260)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5e952eb-cafc-4578-9e01-5ab18d7efade)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2ed49797-a540-4383-a55f-7f997769fcf8)(content(Whitespace\" \ + 4f10cc48-2580-4932-bc20-84ac71d92a2c)(content(Whitespace\" \ \"))))(Tile((id \ - b0d6c8d9-0f55-4622-8540-ad3ec40e8dcc)(label(_))(mold((out \ + b795bf9e-3b14-42d2-bc3e-3acb39ac0ecf)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 931434c2-9bfd-47fb-b860-4f94fb56abc6)(content(Whitespace\" \ + a42fe1bd-f27d-4b3a-9b85-dcb23a02270a)(content(Whitespace\" \ \")))))((Secondary((id \ - 0c45d1da-dca6-4bcf-824e-086ff3619e11)(content(Whitespace\" \ + 10b276ab-e611-48cc-8cdb-819c72e6dbfe)(content(Whitespace\" \ \"))))(Tile((id \ - eeec54a7-e110-4085-9e20-e2587dd419b5)(label(Undefined))(mold((out \ + 3ecd5ad5-1f30-4881-bd58-c5ca370ea3fa)(label(Undefined))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6dfa2802-7123-4ecc-af5c-d24ab138e89b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 59154690-1c29-4054-a5bb-92e22423faaf)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4871baec-a321-43d7-99d5-c51059493083)(label(1))(mold((out \ + 09d10f11-c3a2-4741-a446-8114bf6961ee)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 74f30173-b867-483a-bf32-5b5649f34e00)(content(Whitespace\" \ + ceb03570-ba4c-4720-bf12-033c6f2d4dc1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f489bf80-e026-44ed-9f51-b40da91947bf)(content(Whitespace\" \ + 85462f8d-c93e-4c47-b07f-0e5315ee3261)(content(Whitespace\" \ \"))))(Secondary((id \ - bdda38c1-44fa-4426-a68d-90e1e3f577a8)(content(Comment\"#err: \ + c4a51896-f00c-4079-911f-3bd54660122f)(content(Comment\"#err: \ cons undefined#\"))))(Secondary((id \ - fa273c71-3434-46da-a671-626cc6049caa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7dca8b6c-989c-4741-a4a4-f1ae62408a90)(label(let = \ + 53cbda6b-24c2-4478-802e-bfa68cbbacca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d74e8f8c-7f1b-4e26-8122-df31691ae11f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9cb2acad-feff-4672-8d7c-43c467f8e391)(content(Whitespace\" \ + b58a2832-d00c-462f-b585-40ebfc8590d8)(content(Whitespace\" \ \"))))(Tile((id \ - 75506b66-e182-491d-b788-99a377d7e3d6)(label(_))(mold((out \ + f0e63c46-dda5-4412-b9d9-8bf2a90035d3)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d53d0f49-aebd-470e-9c65-7d77561bfd5a)(content(Whitespace\" \ + 94b55a49-df96-49fa-a80d-9a7fb226ce2a)(content(Whitespace\" \ \")))))((Secondary((id \ - 32bfdb59-116b-4f75-82fb-7b7a7a9ee1fc)(content(Whitespace\" \ + 3a3d35df-262f-4734-a764-284a2d9823d4)(content(Whitespace\" \ \"))))(Tile((id \ - 7a5c1b27-7917-43cc-96b7-68c9a0aa125a)(label(B))(mold((out \ + 4e6ca64e-d391-4424-9889-d47c4327bd2e)(label(B))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6d2f6d4d-5b34-440c-99ef-1b173e491ca2)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 21ac9b5d-cfb0-4cd9-8fce-71bd2798f263)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4265c52b-55ce-4fb0-917e-79f99b4545c6)(label(\"\\\"lol\\\"\"))(mold((out \ + 662d40f3-01b1-4eb2-8815-5a79d5a9b3a4)(label(\"\\\"lol\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 126bad8c-fff3-4a21-85ff-3a93fc73af37)(content(Whitespace\" \ + ed08401a-6756-473e-b1dd-13f7a3778cac)(content(Whitespace\" \ \")))))))))(Secondary((id \ - acc21816-6762-458e-b052-98fb57fcd6e8)(content(Whitespace\" \ + 9a661316-8230-4b15-930f-527f4423feee)(content(Whitespace\" \ \"))))(Secondary((id \ - 2e7148d4-ec87-4c83-a879-b1cb5a5ed1df)(content(Comment\"#err: \ + 84db63ea-a086-4259-b23d-ca1f14d6e9d7)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 29738cc2-dd27-4ee6-bf83-f0d00a16d47a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c9c142a0-b9d1-423e-afa6-950070639487)(label(let = \ + aab6ab02-a6cc-4093-b529-7f7be5f33375)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 775f6485-5c7b-4481-be4a-390261d379b7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9ca198f1-a4ab-4e6a-b9ee-7af24b2b0ddb)(content(Whitespace\" \ + 45a4a3e4-71a9-4b8d-ac99-c54c38b78e24)(content(Whitespace\" \ \"))))(Tile((id \ - 17ff72b2-b93a-4051-b699-dbcdae7307c6)(label(_))(mold((out \ + 5e97135c-420d-4e94-b783-f967604ec01d)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bc97a62f-b7e1-4ec3-81bf-83184a4c8c87)(content(Whitespace\" \ + 00e9fc7d-ff44-42cd-b9f9-678630b21085)(content(Whitespace\" \ \"))))(Tile((id \ - fec091dd-0e47-4833-ae00-53762c786ab6)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 01e8ddfe-e1d9-4dc8-97dc-31113fdd7bb8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 62922425-2203-4454-9523-f8fcbeb03c9c)(content(Whitespace\" \ + 9fbd8017-30e1-4a26-ad88-4ba3e60a694d)(content(Whitespace\" \ \"))))(Tile((id \ - f82a5fb1-5509-44b0-bd40-44313f75c4c1)(label(+))(mold((out \ + 4e55a03b-41e3-44c2-b2f4-ee87dc9372a1)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3161a5c3-aab6-4b37-abdd-0b4545799278)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + daee7156-58dd-45a1-9da0-51c3ff494245)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8b7427f3-fa5b-436f-92b8-7d8c6cc0d036)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 0eb7994b-3d38-44f4-b420-7501b13fed3c)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 89074e55-142d-4e4a-a5e8-7a442c699a0f)(label(Bool))(mold((out \ + 5a8e48e6-8934-47b9-9c2c-1b225173555b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a0d5f29a-cd3a-4686-a1b5-09113a40195c)(content(Whitespace\" \ + 80b6e4cc-3036-4de0-88e8-4cc7803c147b)(content(Whitespace\" \ \")))))((Secondary((id \ - af4c6438-89a1-4132-9ad5-c4ffac91fd1d)(content(Whitespace\" \ + 0bba84ed-7a96-4ac8-874e-59a2cc71c862)(content(Whitespace\" \ \"))))(Tile((id \ - c580e9e7-7d6e-4e80-82be-25aaca79b942)(label(Yo))(mold((out \ + cde685ac-5fd0-4d08-a8e1-5fca7bffc1e9)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a8c5832b-cebb-4c6a-92e6-07b5e552505e)(content(Whitespace\" \ + feb6cb38-e79f-4881-8f3b-b23d5e9a11eb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 631f4c3c-a5f4-4edc-ba88-8af7bac59d7d)(content(Whitespace\" \ + b6ebe4f2-c8d9-4b8c-aedf-c62c8568e7e9)(content(Whitespace\" \ \"))))(Secondary((id \ - c75d5e54-515d-42cd-953e-a5b2af960eff)(content(Comment\"#err: \ + 34c40819-d1be-40b3-a1ad-b1b236c136ac)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 8e89e058-3e4f-4213-b1b5-21b75a12b3b0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 092d401d-4681-45ca-a417-469e1b9521fd)(label(let = \ + 9c3900a9-119c-4483-88ce-08bcc1bb25e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1426be3c-40a3-4676-a187-1d4b4c806b0b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1f09dee4-0e3a-4be6-95dd-bbe0e77c4996)(content(Whitespace\" \ + 7f30e696-53b5-4453-a672-a2a8af69ffc9)(content(Whitespace\" \ \"))))(Tile((id \ - bba1db7b-a310-4067-a50d-809d39548a5f)(label(_))(mold((out \ + 35976ab6-6e70-4422-9587-a0ca4919cddb)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5d32cae1-d451-4c5e-827e-5452b099b557)(content(Whitespace\" \ + f0795f81-a345-43db-b8c4-23517de1479c)(content(Whitespace\" \ \"))))(Tile((id \ - 44e0dc21-fd90-4f29-a33d-2939e59e8c1b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c12cb9d9-3c25-47c2-b120-a810aad6f61d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 947af2f6-7b71-4b9c-9fa8-0dad02fbe631)(content(Whitespace\" \ + a523315f-3e6e-4344-97e6-35c38482a428)(content(Whitespace\" \ \"))))(Tile((id \ - 33d7eb57-0fa1-4227-a093-3c10974b72e5)(label(+))(mold((out \ + fcdc783f-8fc3-4400-b8bd-b9885649cdc8)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - a1bb260f-f11d-456c-8bfc-75d85af29ea0)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + b652e55e-4196-4fe0-af5c-a02b039fe830)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a80caa08-c6d5-409c-9047-32909e2a96c8)(content(Whitespace\" \ + 039713be-46e4-4570-822c-442f4521be75)(content(Whitespace\" \ \")))))((Secondary((id \ - 10e0b8c8-f01c-4ea6-9a00-1da27c35bc5d)(content(Whitespace\" \ + cbc3ba57-f2d2-493f-9db2-dbb547f5c2dc)(content(Whitespace\" \ \"))))(Tile((id \ - d4b9fb5f-a627-4acd-99da-4ff3a79d4782)(label(Yo))(mold((out \ + fd05f3ed-e8a4-4091-93ad-2f1e37bee930)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 58f18f4d-3c5c-4dc8-9cf7-eb7aca80bcfc)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f93bf4cf-e0be-4b6c-8fc0-b1e46b969b12)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0e6f2c44-e90d-4caf-9e77-11d74a519530)(label(\"\\\"lol\\\"\"))(mold((out \ + f29c94fb-3cef-4acb-be79-8cedb7442523)(label(\"\\\"lol\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 49e4c7bf-e9e2-41bb-8f89-52a403aabc6a)(content(Whitespace\" \ + d1034959-113e-4e5d-ac46-0d02a4e7d195)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d8476ff7-c2bf-441a-8010-64bc558158dd)(content(Whitespace\" \ + 09d73544-91ce-4e6a-92fb-ef894fc7f31e)(content(Whitespace\" \ \"))))(Secondary((id \ - e0afd264-4a2a-4076-a01d-578a8ec5cf5b)(content(Comment\"#err: \ + ccf78a45-9c87-41f7-8d53-e38a4d669e1a)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 7f48028e-59f6-4128-ac3a-07f1fc61b14a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 76de4e86-0d10-4065-938f-690716ff4bff)(label(let = \ + 6227c574-7420-4444-85e1-d1627599455d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f449735d-c022-4173-9f72-3b8c6b301eaf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6a975e3b-202a-47e0-84d8-ab9d28b36ccc)(content(Whitespace\" \ + add4a75e-33da-4672-88a5-539267f2f3b6)(content(Whitespace\" \ \"))))(Tile((id \ - 775aba62-6b92-4402-a930-1a8b15b99f76)(label(_))(mold((out \ + 11a59868-675b-452d-9a69-e38c48ccc80d)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 43f8939b-a9a3-47c2-919b-c24b285fd642)(content(Whitespace\" \ + 48cce1e0-118e-462e-9d12-01300427cf7c)(content(Whitespace\" \ \"))))(Tile((id \ - 9c4ae5b8-87ef-4f46-9482-cae3eb81109c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 6d90f462-6d89-4159-a6bb-28e637ca71a9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 316d061f-b6d3-4f58-812e-b7e4e2e1b221)(content(Whitespace\" \ + 2f28735c-9b1a-49c6-89bf-57f3339fda0b)(content(Whitespace\" \ \"))))(Tile((id \ - 07bd9186-3e71-43d9-beb6-397adeb4ed79)(label(+))(mold((out \ + 9412e131-4c48-455b-aee5-424450318fd2)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 982bbf83-da17-4f60-a07a-69b6caca0038)(label(One))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + 259c796e-446f-4fa1-9606-674d10bddce6)(label(One))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a61b9df0-6312-4630-b350-b179a7a9a30f)(content(Whitespace\" \ + ab034185-54ad-428f-aeab-e20939c35568)(content(Whitespace\" \ \")))))((Secondary((id \ - f6598e2d-13a0-48aa-98ad-3bba23c0d16c)(content(Whitespace\" \ + 8346ff39-0b2f-49c7-99f8-a54c20d0600e)(content(Whitespace\" \ \"))))(Tile((id \ - 030259ed-1473-41ff-a554-df49181075a9)(label(Yo))(mold((out \ + cac79c7b-370f-47f8-9b4c-2b7cbd6110bc)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6015f8df-0de0-4ab4-a83e-5846c4f017b5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + d399c60c-d9b2-4155-9b28-ffacb4022b9a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84f01a2b-fcb7-47fb-a22f-d967376f38e1)(label(1))(mold((out \ + 7e529b95-a600-4d11-a3f9-49528af17566)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 83aeee2b-8f73-42cc-8897-cca9982f73a1)(content(Whitespace\" \ + 7c3d00de-44a8-4c21-9817-2d03ecefa122)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 81bcef3f-ffc3-415a-8b6c-a91f427a7934)(content(Whitespace\" \ + 1c8d61bc-7ee0-4716-8112-02339c97afaa)(content(Whitespace\" \ \"))))(Secondary((id \ - 3ae4dd0c-cdda-4e6f-9ddc-7b71bf749d81)(content(Comment\"#err: \ + 126baa56-0ac4-455c-ae7c-3ec266f72399)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 5b4942b1-ead9-41cf-83e9-330b23a2c28d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7a0bde0e-fe2e-4c7a-8fa9-7c59d491a73d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - facdf460-efbd-4a8f-bda7-5328fbb74d3f)(content(Comment\"#pat \ + abf3797f-a609-422f-b5ec-649c197df2e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5e62f07d-4a34-42b6-b825-f96478c35066)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 27552146-6403-4323-a816-b61e7d1df912)(content(Comment\"#pat \ tests: happy (but refutable patterns so \ weird)#\"))))(Secondary((id \ - 9672874a-6ef2-4808-9a41-030964442d7c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 87478aa3-bc82-40d0-a792-6c51cf93c3d8)(label(let = \ + e43e36d1-efeb-411c-9403-a535e63af514)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 286ed621-bfbd-413d-86c6-29c076254777)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 19b5021a-5029-4545-a177-18d27abb34f6)(content(Whitespace\" \ + ec07d26e-f3cd-481d-8bdb-b4db1a9e8f61)(content(Whitespace\" \ \"))))(Tile((id \ - ebea4bf6-feaf-4db6-a7fa-3147fdb83b21)(label(Yo))(mold((out \ + ed4188ff-4429-4de9-b2bb-e067ac553829)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3ab932af-9e52-4585-bb64-81ed59f509c1)(content(Whitespace\" \ + c2643a0b-4ade-40fa-948e-5675bc660f60)(content(Whitespace\" \ \")))))((Secondary((id \ - 6e6d5123-a846-4667-8ec0-1b27e6e2ec6b)(content(Whitespace\" \ + 9fcd9e91-5ef3-480f-9fdc-c7cb6edfb5b0)(content(Whitespace\" \ \"))))(Tile((id \ - 028c9ff6-4c62-4be3-ba26-494728ae1efe)(label(Bo))(mold((out \ + 9cb9f9b6-2b0b-4966-9b31-a1d83de65352)(label(Bo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 61354972-9371-4232-86a2-e92f1d27a98f)(content(Whitespace\" \ + 45f855b0-55c3-431b-be9c-a72f1f8fff2f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e83fe24d-38d2-44d1-aa05-3817739b773d)(content(Whitespace\" \ + 3c8d229b-e0f1-4960-8cca-cf9934ecbaea)(content(Whitespace\" \ \"))))(Secondary((id \ - 2b7f6a39-b9e4-4cb2-99cc-d42e1e4b4aaf)(content(Comment\"#kind \ + 2ebb951f-45ab-4b4d-b51a-3a9ee86cc02f)(content(Comment\"#kind \ of a weird edge#\"))))(Secondary((id \ - b56d91c3-10bd-449c-871d-be476400ea3f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9da4f6bf-678f-4b02-9ac2-4925236ac534)(label(let = \ + 93d6e291-4037-4241-8994-b2a92d3a88bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a4946f2d-e73f-416d-9f28-f4d536fd2d0b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8a332dfe-bd12-4417-8093-292b405b2b78)(content(Whitespace\" \ + 25c38ad9-bea0-479b-af6c-12d21eaf9f96)(content(Whitespace\" \ \"))))(Tile((id \ - 4934e3fa-894a-4c64-b751-47e621d2a0bc)(label(Yo))(mold((out \ + 43a5b08b-4e98-4a21-b5cb-6d329f3ce9ee)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 32edf020-9d2c-424a-b69e-2bffa87a176d)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 9a53d335-0fe6-4e6a-bfbe-46d977f91e33)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ac0a556b-6a81-4ca3-9d80-1110548c7c60)(label(1))(mold((out \ + efd01f23-6612-48a6-b6a3-f731c35864ee)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - ddbf95e4-acdf-4db1-8a31-a52f98d75fb8)(content(Whitespace\" \ + 9681ebc6-4cca-445c-bab6-111649986dd3)(content(Whitespace\" \ \")))))((Secondary((id \ - a4ca8e82-2d64-46dd-ae43-dfd45f37faaf)(content(Whitespace\" \ + 01c7333a-4b21-4d69-8f74-90d3c71d375a)(content(Whitespace\" \ \"))))(Tile((id \ - 285005da-5608-4b20-ad60-34aa36ded1a5)(label(Dawg))(mold((out \ + a791c9be-c53c-47b9-ba76-19519839cc5f)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 89b853be-6ea8-4173-8737-247ec8f3dd37)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 9fcacf8d-73f0-4deb-acad-f4b4b33d28b1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cf4b208d-9082-4bb6-9f2f-3868800212d4)(label(true))(mold((out \ + 419c723e-9b95-4beb-bc60-67df1c91901a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 9b875fb6-0c4c-468d-aa82-18749ecbe1a9)(content(Whitespace\" \ + 8c185b7b-55b2-43f5-9f7c-890481f4f179)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bb1cdf42-36d6-4749-8f12-26f768697db7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f2f1e474-be18-47e5-a81f-ede837a58503)(label(let = \ + 08fcf341-63a7-4659-b912-7f826b167266)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0c8e9154-0b3b-49e1-a066-dd4ddc301a0f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 37471869-cff9-4e2c-99c0-cbbe41031313)(content(Whitespace\" \ + c314182e-c342-4b21-bb6a-652d877a9ed5)(content(Whitespace\" \ \"))))(Tile((id \ - 17306267-01f4-422b-86f6-e90290fc8340)(label(Yo))(mold((out \ + 061fd5dd-1e0a-4814-bb2a-ed5edd305ba6)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5a398483-25d9-4d05-af57-c3add5818c4e)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + f78306d0-f898-48e1-9b1f-78a346317a5b)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 743a1786-64d1-4319-a7db-e5def2b888e5)(label(1))(mold((out \ + 36c46e4e-ec58-417f-868a-38b2dc1a0338)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - f4913a6b-385a-4d2e-bdb5-902204fc96bd)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + cfceb66f-dc26-4745-873e-0c41d9c2fff7)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0e0c4ecc-2cd0-4d3c-afd4-479780fdf901)(content(Whitespace\" \ + c3806326-5586-496a-a7a7-8f0b4a0e6493)(content(Whitespace\" \ \"))))(Tile((id \ - bfca73b7-2533-4426-8b6d-967344d52775)(label(YoDawg))(mold((out \ + 5a607d01-b15d-41f5-badf-98caab97b27f)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ae231901-3e7e-4334-954e-be65ef71da82)(content(Whitespace\" \ + 53cb7dd5-145c-416c-89a3-b4eb3fce3b76)(content(Whitespace\" \ \")))))((Secondary((id \ - 048dc25c-8c5d-4fc6-8674-b2b85230ef7c)(content(Whitespace\" \ + 4c81c04f-ce90-427a-a70a-c1e5aa0979cc)(content(Whitespace\" \ \"))))(Tile((id \ - 04b01334-7bd7-44ae-875e-f4d004293df4)(label(Yo))(mold((out \ + 0e43c79b-c4e0-47d9-b4b0-2bedcab177f9)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 470e3d11-7f3b-40ba-8882-9ecbef346aa3)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + e22268bf-34cc-47ee-abd0-ecc5bf6857a7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1120437b-69c0-4271-b846-5560a4c64ce2)(label(1))(mold((out \ + a6cf5782-b832-464a-9f6e-cc1cdad22795)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c00fd96f-d9b4-4d7d-946a-794a850b31f5)(content(Whitespace\" \ + 5401db8e-4ed1-4114-af47-dbed4fcfe7b0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 603225be-d862-42fa-bca2-d3d5898f15d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8d653abc-56e0-4e76-976a-e8abc021d345)(label(let = \ + 17c26113-fbbe-4ce6-87f0-f37131595211)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 00e39952-c5cd-47ac-bdf8-5541531eca5e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ba4a7022-18d2-48fb-a0b5-8624b0252a05)(content(Whitespace\" \ + 0c3f9a51-e471-48ce-8641-2d130f77a87e)(content(Whitespace\" \ \"))))(Tile((id \ - 87220d72-4069-495a-a94c-a2a1e6c3f80e)(label(Yo))(mold((out \ + 3e314284-937f-4e84-a9d8-e7483d6607a1)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ea68f412-bb42-4e52-8533-e2b2876392fe)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 32219535-a8e5-4f27-8a58-f934f9f92b18)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 7d1323f8-b578-4b93-91ec-2273541b966d)(label(1))(mold((out \ + 05482c7a-5914-4d83-a12a-1bb3f288b699)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - a7042e19-faef-466b-949d-be90992ec96e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5d0e6017-b1b7-4b54-b733-6ce43c2cd42f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dcd5a0ab-43fa-4aed-96b0-4a704f143233)(content(Whitespace\" \ + 30afcf98-bf9a-4060-b70d-8b5233befa27)(content(Whitespace\" \ \"))))(Tile((id \ - 6829f579-c85b-430c-9d47-307edf992813)(label(+))(mold((out \ + 28b321a1-669b-428d-adf5-294a805be905)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - d9f466fe-3676-4684-aee6-870eb758fee7)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + 6b9bab33-0d94-437b-91b2-5827cd3c9864)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c9302141-725b-4f6d-bf9d-b3fb3f237e0a)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + cc42afde-944e-4ef6-bf39-c5e534fadda8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d2b79cb8-a093-4f5f-b1cd-e8a4e3f5e3ac)(label(Int))(mold((out \ + 9cfd50f0-d05a-4a1c-875b-a222ea97a8fb)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6fc2c1ef-de22-4fa2-a5ca-eaae9a0dbd60)(content(Whitespace\" \ + 677d7866-5aaa-48af-b880-3ae6867b3103)(content(Whitespace\" \ \")))))((Secondary((id \ - 8956dc3f-1f16-415a-9565-91cf792b6a31)(content(Whitespace\" \ + fd318dc2-d93d-45c5-8d3e-12e7269c4c29)(content(Whitespace\" \ \"))))(Tile((id \ - 34979d88-fd64-447c-ba5f-c90d9e1be29a)(label(Yo))(mold((out \ + 7179786b-d902-4cf0-a265-a78620276f68)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d6145fb8-ec69-414e-99b4-d1bb527f22d1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6f27ec08-de95-4954-b60d-1d45eacda71c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b3bb92a7-8f3c-49c7-955f-adbac8cd5a34)(label(1))(mold((out \ + f34bb5ad-f935-47c0-8583-2d0546bba7b5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 74397f51-da57-40e2-bb99-f9e9c241666a)(content(Whitespace\" \ + 8a6661e2-cf17-498a-9cc1-fe21ed50343e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 99ee253c-d3d3-4ac9-b37f-a5ccceb64cd7)(content(Whitespace\" \ + c7f2d89a-6a2e-4087-90f6-0daad066aab4)(content(Whitespace\" \ \"))))(Secondary((id \ - 69ee0c5a-b23f-44d0-8bfb-62b8267da47f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0d21753e-2df4-473a-bbc9-12b716724f3f)(label(let = \ + f3b7b39e-cf18-4aef-b685-ccca2c7d4332)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f25f3d0-3dc4-4e42-b3cf-4f5f45363435)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0ef0fe1f-8d88-474a-b172-3b5ec3cb2473)(content(Whitespace\" \ + a6b3328a-93b2-462d-8ce0-b5c442a28f18)(content(Whitespace\" \ \"))))(Tile((id \ - 38ca55d1-d269-487a-a9f5-8e7a0b7e5446)(label(Yo))(mold((out \ + 4d72ce34-a3fb-4d58-885c-c1da843e2f6a)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f1d45f10-46ee-4276-96e5-903c3d4b6b3f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 277c512e-4b5b-4327-a58f-135603ce644f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 59227245-38f5-43b2-b1b9-29434daf00f9)(content(Whitespace\" \ + 71299352-17c9-4e52-97a9-4715adba76db)(content(Whitespace\" \ \"))))(Tile((id \ - b59a80b2-6ed7-4ba5-bb10-8dce157ceeca)(label(+))(mold((out \ + b11972b2-5cd6-4356-8f8a-e30d765cd092)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 99f4dc6e-ecf1-4532-8203-078a97d19f10)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + 60b5da56-246c-42ce-8964-473c64b46825)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 27761368-5a50-4e8e-b8f0-41259759a1a2)(content(Whitespace\" \ + a1107073-8d01-43cc-bd65-739e3de33f2a)(content(Whitespace\" \ \")))))((Secondary((id \ - e5fe4f26-2152-4c3f-846c-711489198670)(content(Whitespace\" \ + 89cb08a6-276b-4a38-8818-a5a9ca5f0e2d)(content(Whitespace\" \ \"))))(Tile((id \ - 2f85b493-700c-459d-8626-bc8f043093a8)(label(Yo))(mold((out \ + b73a9708-2b53-4bd4-8ecc-96a071f93213)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 42b17dfc-8cb7-4156-94e6-ef3f49b5388f)(content(Whitespace\" \ + 232dc3ab-ffee-4b00-9e27-0b7893b90148)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0005e1fb-699c-4d2d-ac84-3967e4c3b4c9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 99be389b-359b-4e3a-b5f1-434da0700342)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dcd15daf-e021-4d15-af44-137ce8d9bdf3)(content(Comment\"#pat \ + 03db08a9-36b7-4e76-81bf-31b9133a38d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f50c7c21-acf1-428a-8f24-5136be951281)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fdee04ec-f81d-4a5d-a9bb-0faa7b4ddd2b)(content(Comment\"#pat \ tests: errors#\"))))(Secondary((id \ - c1d20c23-9d73-428f-9de4-d2ce26b62ad3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7043c28-61f8-4276-a523-22734fe2ccf0)(label(let = \ + 5f0d006d-ad4f-40a2-9d0a-377032482041)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 36806677-d90c-4a00-bc97-5113e7c857cb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 16ce1daa-556e-492a-a19d-6a7d6c4f2e40)(content(Whitespace\" \ + d283b3af-6931-4df1-a08c-ce23653f2f56)(content(Whitespace\" \ \"))))(Tile((id \ - 3e134eb5-90ed-4db7-8884-b94ec7e43566)(label(2))(mold((out \ + a31e4f9f-a90b-420e-8037-936e643a7ea7)(label(2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d0b3234b-c864-461a-9860-dcf461d1b332)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 4736c31a-a395-4f3e-baa5-cb6645ddd943)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 0ba9f9c2-a06f-4d45-9fa9-52f59e56e3cf)(label(1))(mold((out \ + a970820e-d826-4cf1-94f1-37e9ab074928)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 5ccb3070-1bff-480b-83b5-976c5b0ddebb)(content(Whitespace\" \ + 5178f1e6-a83b-427c-9644-5f232804fdd7)(content(Whitespace\" \ \")))))((Secondary((id \ - 627509dd-1b5b-4b67-b157-8ff4a6c7bd79)(content(Whitespace\" \ + 70da4bbb-4b4f-42bc-93b5-f7269af30bc7)(content(Whitespace\" \ \"))))(Tile((id \ - 2c8b196b-845e-4d71-98fc-c11abb4fe871)(label(3))(mold((out \ + 3e3d7ebd-3fca-4442-9a6d-48e1461f2911)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 232ebf71-0266-4aae-b171-c3d7291da09f)(content(Whitespace\" \ + bb5a0e4d-6ac8-424a-9f16-ad673c1890df)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0db41a09-1502-49f5-9212-3418316cddf3)(content(Whitespace\" \ + 2fc102cf-f09a-4db8-8127-e086fe481232)(content(Whitespace\" \ \"))))(Secondary((id \ - 6e676ae9-c84d-4607-ac2d-b39dce08c6a0)(content(Comment\"#err: \ + 73c066fb-c19d-4685-915c-86ff33f63b45)(content(Comment\"#err: \ incons with arrow#\"))))(Secondary((id \ - a5d07dd2-c839-4a86-a27e-ac069da4196b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2261eb15-0137-4a31-a46d-5043f25d2af4)(label(let = \ + 7189e975-5560-48d4-ae9e-109081371422)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 58c44e93-40a8-4a3d-9636-8cef9820ab25)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e85ffc30-fd07-4215-97f6-cff1b2ecadd9)(content(Whitespace\" \ + 846916bf-6809-451b-ae1e-a1aae9d816e1)(content(Whitespace\" \ \"))))(Tile((id \ - 0f625d9f-3a8c-4801-b7f8-02f3bc063e60)(label(NotDefined))(mold((out \ + f8fa3bbc-53e5-4b4d-be73-42798319a00f)(label(NotDefined))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e273c063-be34-4fd4-9a35-b903acc3a802)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + e0a502a3-5ffb-40c5-935f-433b24d7be58)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1a6295b6-34f2-4fb9-bef6-651891713eef)(label(1))(mold((out \ + 2c614426-c4ad-48b5-9557-41575cdc5242)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 0f61bbef-58f7-4b51-a327-0bcc1a98908d)(content(Whitespace\" \ + 82d3acd5-1c89-43bc-878e-45e6746644e5)(content(Whitespace\" \ \")))))((Secondary((id \ - 9cb5a580-8a59-48ff-9d23-87f89f52c545)(content(Whitespace\" \ + 11c851e9-47bc-459d-bda9-dae01fd4eb65)(content(Whitespace\" \ \"))))(Tile((id \ - c2dd289b-773f-4558-89d3-c71533b1918e)(label(3))(mold((out \ + e44efa44-7ac1-4ee9-9e8c-bfc0d5995650)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8711ef21-fb8f-4896-ac90-d8e807c603d6)(content(Whitespace\" \ + 404c5f67-fb3c-4c4b-9d75-e3ecfad5c672)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9ddcfd63-e8f9-4897-906a-ce1835a858b5)(content(Whitespace\" \ + bed1206f-b9b1-467f-ba3c-269ee8decd67)(content(Whitespace\" \ \"))))(Secondary((id \ - 225f955d-f886-449c-9169-21343059976d)(content(Comment\"#err: \ + 19481669-3462-4db3-a065-600f510ff835)(content(Comment\"#err: \ cons undefined#\"))))(Secondary((id \ - a0f66cdc-ced3-42af-bc8b-95ded65e92cb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fc859cc5-5a32-4e42-82be-7ffba942d78a)(label(let = \ + 06667d7e-932a-4ca7-b85b-b15a08d1d48b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 890e0665-be23-497e-9417-d4510f79f3c1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6ee1493e-7726-4647-96d9-e324c567637f)(content(Whitespace\" \ + d8ee3164-5de6-4b59-aa08-767d5406473e)(content(Whitespace\" \ \"))))(Tile((id \ - dd9d06db-d1b0-4ff4-be65-eb761215eeba)(label(Yo))(mold((out \ + 1eaa23ba-dc85-46df-993a-ff808fbc8f1f)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9dd81776-5dcc-4238-b329-d0e580eb7fd4)(content(Whitespace\" \ + abfa7933-d7a9-4cc4-a1b8-a2c3af57f820)(content(Whitespace\" \ \")))))((Secondary((id \ - 919d5599-af66-4117-9e83-75d41dcfd62b)(content(Whitespace\" \ + 15d00b9a-f864-4dd8-a363-af9a660f68f1)(content(Whitespace\" \ \"))))(Tile((id \ - 6da4a8d0-c40a-433d-9cde-44badc3f8c39)(label(Dawg))(mold((out \ + 42b505a3-88e0-4417-943d-0c44be3dbe00)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a9d80421-dfb3-4924-b95f-f6a7ee7088cb)(content(Whitespace\" \ + 07dae790-8371-484c-9b39-7a5c6e6a1d62)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 40ef07ac-93a1-4395-9330-c4e072117398)(content(Whitespace\" \ + 9fda8f33-009e-4131-bccd-d1beca4a07c2)(content(Whitespace\" \ \"))))(Secondary((id \ - 309c082b-63a8-4b11-8aba-2285ab9d193f)(content(Comment\"#err: \ + 2e973e44-e68d-4474-a1ba-30ec6d43aaba)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 0ae6873f-533a-40ff-a569-7ce95ca44dd2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - faaa3700-62e3-48e8-a99e-e02391eb2d1b)(label(let = \ + 6586033c-0d47-44c1-847c-cc50cb03323c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3c3ef3e6-5058-40af-879a-76ca4ff7c87a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 04510299-1775-44ea-a1cc-92023d978c25)(content(Whitespace\" \ + dd10e9a4-4afc-42d9-802b-202edb5b2f96)(content(Whitespace\" \ \"))))(Tile((id \ - 31056011-4c43-4c4e-9e3b-fd949414c4ba)(label(Yo))(mold((out \ + 90ca2db9-64d1-40c8-ab7b-222159dcc540)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c47761a7-9949-48f4-8e22-1815b341ef77)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 94037630-4f2b-4422-a846-5794c2883d9e)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - cb6a6a22-b518-40ad-9e76-8cda4bad6e5a)(label(true))(mold((out \ + f4da0018-621e-447a-985b-5621e99b31bb)(label(true))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - f47230bf-0ec9-465d-acb3-436f7d3ac327)(content(Whitespace\" \ + 50358657-b05b-4982-9624-ce0a6d6c7fc8)(content(Whitespace\" \ \")))))((Secondary((id \ - d44997ac-687e-49bf-9dad-b882ecc68087)(content(Whitespace\" \ + b40a24f9-99ff-455e-8740-d3485f320e4a)(content(Whitespace\" \ \"))))(Tile((id \ - a0377840-0185-4f2c-a48d-864237d3ac9e)(label(Dawg))(mold((out \ + b3cb3792-1e70-44d4-b211-d5d83e42db8c)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 93552a27-48fd-484d-86f8-b30e33acc3eb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 56b06d74-21e5-4704-b08d-234dfad9ae9f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fe0ec8d9-e77e-445c-8535-556c6adf09a2)(label(true))(mold((out \ + c58cce4e-0b85-4a6a-a98e-41fce0652b4a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 44532396-e223-4a97-9bd0-005fc9dd24e5)(content(Whitespace\" \ + 3a979acf-c763-4cc3-aec6-de801425a09f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2a27fa8d-a1fa-40c1-a553-5a6f8b9a530e)(content(Whitespace\" \ + 7d63f50c-e1f0-44b6-942a-295277a64b65)(content(Whitespace\" \ \"))))(Secondary((id \ - 006c55f2-7a22-4df0-9914-a74f44528b25)(content(Comment\"#err: \ + bf9d69eb-2435-4efe-a113-b220aa933342)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - ff7e8d0d-1807-42b3-8e01-33cc58484288)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c5929ebf-a9b9-4639-97d7-d45df8ce563d)(label(let = \ + d0fda05e-b3d2-4e88-b5a9-1933cd4d5e48)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f76ea6c7-9d3d-4ca7-b045-9cd40e17aef1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 14377e51-1ceb-4217-ba71-24186a229e16)(content(Whitespace\" \ + a4b126f0-ac94-4615-be1e-eeefa0ea618b)(content(Whitespace\" \ \"))))(Tile((id \ - b7ca14d5-2c58-4ed1-b454-d77b649a3f72)(label(Yo))(mold((out \ + 63893af2-f61d-4788-86c3-68dd7d18ca07)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 73942125-9603-4035-b063-cc8f9ce8e8b3)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 7f0f5785-9733-4dec-a1eb-42d1d6e11fd5)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bf2e76ca-ac2d-43c0-a4a5-32e199987375)(content(Whitespace\" \ + cde0d851-6dcf-42f1-833d-c1037a04689e)(content(Whitespace\" \ \"))))(Tile((id \ - c1fd18bd-1abc-4a6c-8cfc-957b3167497a)(label(YoDawg))(mold((out \ + 2a080896-fc44-489c-b530-365d8516c7fd)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e1bd4b1c-a5a5-4b76-a8b2-c51089b8635f)(content(Whitespace\" \ + 89d0ba9c-e915-496e-8c8c-1c8cb3a0807e)(content(Whitespace\" \ \")))))((Secondary((id \ - 19c5cc34-ee6d-4ad6-81c8-02a31d41368e)(content(Whitespace\" \ + a6af5494-b27a-4c4d-9152-0e3ecb7636a0)(content(Whitespace\" \ \"))))(Tile((id \ - c6a966cc-66bd-4799-9f6e-16b8efa36237)(label(Yo))(mold((out \ + 28a939d7-e878-4412-83b2-56576eee8413)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b57f4012-d255-4bb8-bc8f-c0ca8ed64c7b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + b915cb87-c3ac-449d-9233-321e57ead21c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 69b99e6b-7806-4f7d-a721-c4aeac388080)(label(1))(mold((out \ + a2b2384b-3675-4e22-be78-a42ee9176dcd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 56b02ec3-8d51-4298-88f0-5572b396b603)(content(Whitespace\" \ + 5a16a59b-a47d-46b4-a1e8-0ff8508944b6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1ba0434f-fdad-40ce-b432-f91c01300a1f)(content(Whitespace\" \ + 88183e73-58f4-4f30-afc9-b3cdd5f52e3e)(content(Whitespace\" \ \"))))(Secondary((id \ - 01433e43-66b8-477b-acfe-f3101dd678b2)(content(Comment\"#err: \ + a6302504-195f-4852-b30c-a6017717cd68)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 43c8e876-a506-476f-a6f7-0e9ce18b22c7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 01a1d3e7-079b-410e-81e4-6c0b19bcecf4)(label(let = \ + 932f6fe0-460a-4cb6-a20a-492994a715db)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d1b74d2e-44dd-4bc5-8f63-3e951aa4b77f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2539a505-366f-4f35-bc49-dd92fa17035a)(content(Whitespace\" \ + f41ebaee-ba4a-4386-9d38-5777ea1de7f6)(content(Whitespace\" \ \"))))(Tile((id \ - 9c8d4db8-d8cb-469d-a818-8f06c6a65576)(label(Yo))(mold((out \ + 0fe37222-1c98-49ec-928f-0d2cf1c52a95)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2e124a6c-1a98-416e-9c2d-a31b456af5c9)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + dd8f587a-42ef-40c5-b748-489d03147537)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 06aa313a-1705-4684-88c3-0959c3456677)(label(1))(mold((out \ + 12a01c95-3ad5-4ea4-82d8-30b53d549392)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - c0eb07fc-ca46-4c7b-bbe1-b437ed8e4f82)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 3a418a99-e243-40cb-ad46-61ae603308ba)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3cbd9746-08e3-461f-8e59-bf1188c06a79)(content(Whitespace\" \ + 84e3e8fb-c743-479b-b2e6-bb468fca0976)(content(Whitespace\" \ \"))))(Tile((id \ - 4295854d-6f35-4530-87ad-d5056108d538)(label(+))(mold((out \ + 9b4ae082-cf26-42b8-a10d-5715bd5b7e1c)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - f83eeec3-4a42-4349-9f82-9a23e4661390)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + cfdf100e-3be2-469a-b83c-23c7d493c93c)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 56ce20b5-fc60-4b53-98af-baa07854f2ae)(content(Whitespace\" \ + 37608aed-af36-4796-9f7e-4aec35aab5ab)(content(Whitespace\" \ \")))))((Secondary((id \ - 5e99023e-fb6b-48ee-afb3-b79638d7fb38)(content(Whitespace\" \ + 25f76661-465f-4193-9859-e46cfce30083)(content(Whitespace\" \ \"))))(Tile((id \ - abdf3b80-2a39-4b01-a168-20c5e1b62e3b)(label(Yo))(mold((out \ + 0ea29f5e-e6b1-4b00-8f49-09c7daf5a5cc)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ec5f0ad6-fe8e-4470-9a18-2aaf51bbfba3)(content(Whitespace\" \ + 5ca72902-4780-43ef-b353-41b5dce6a29c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 89289d11-4938-45b7-93c1-8f10c467ac12)(content(Whitespace\" \ + 907f5ef8-505b-4237-add3-04b717929aa9)(content(Whitespace\" \ \"))))(Secondary((id \ - 7b8f1c99-37f4-4758-95a0-daf1c8f99266)(content(Comment\"#err: \ + 216139ad-7598-47f2-bceb-1707c71da7ec)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 02b2a52a-b5f4-4e41-80b7-a58fe6ea9585)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 500da527-7942-4a58-8238-b0c358ce8b91)(label(let = \ + 366ac2a1-0bcd-44e7-9938-74548976f224)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bcbbd75b-e8c6-41da-9d2a-b480a52f3e86)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7f530aaa-806f-408a-b53e-c4f023e17eb2)(content(Whitespace\" \ + bf9ca39a-ab84-45ce-930f-45b0d6dcae25)(content(Whitespace\" \ \"))))(Tile((id \ - f89111c8-e5bd-42bb-8a23-4692cab1d8df)(label(Yo))(mold((out \ + f377a669-902a-42ce-8a10-4ebbfde8fa0f)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 758ce654-335a-43bf-87e1-4cc3ef54f7a6)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 9174f3eb-5d68-4ccb-bea5-72c5e293ceca)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8b69bf15-b0cf-4810-846a-29593e01dd15)(label(1))(mold((out \ + 5eb4b9de-218b-489c-8ba9-b210a5f5fb95)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 9d1bab07-4373-4f1f-a03c-25097e994811)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + a96ee91a-f91e-4571-889c-a3464b81bfa8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cc5e2c3c-0713-4cfe-9344-a925edd6c853)(content(Whitespace\" \ + 852f49f5-d537-49e5-ad56-b9d26191ab16)(content(Whitespace\" \ \"))))(Tile((id \ - 1084ff97-4032-4a02-be04-a951d295cb8a)(label(+))(mold((out \ + c58d7912-82f5-4cb6-9298-71633fe4cfaa)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 085cf9ea-0a85-4760-a949-dc22490dce25)(label(Yo))(mold((out \ + 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ + ab82becd-7563-4976-b41e-42a259a24f2b)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c8a2b1f6-e183-4841-ae4e-b609d91b7a3c)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 0ff61cdf-91d1-40d9-b74b-ce88b8094753)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 930f5a73-f1c0-476a-ba8c-8a113bc9669a)(label(Bool))(mold((out \ + a77c70cd-2cc1-4400-868f-9819361c921b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a5b78531-9d59-4865-a4f0-23232aaad93d)(content(Whitespace\" \ + 2678451d-ac24-442f-8b3f-cbfe273a2e99)(content(Whitespace\" \ \")))))((Secondary((id \ - ec7248c7-90ca-447f-8192-89917f308bfd)(content(Whitespace\" \ + 0a3730f0-54b5-4a0c-8b07-660d002e8fa4)(content(Whitespace\" \ \"))))(Tile((id \ - 6ea16184-54d7-4ec4-b8c1-0a7146937b23)(label(Yo))(mold((out \ + 81bb9a99-745a-441d-94bb-03521e6da6e3)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 161d2a9b-370b-426a-a206-fbbaf8959b85)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 8a141746-fbc4-442a-a2fb-d9f269e4951a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cc4bb669-3a95-4bd9-bf9f-8290ae158a85)(label(true))(mold((out \ + bbb253a2-74b5-41fb-80e9-1cc7eb388218)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 1a9b1b31-8fc5-4c30-b7a8-f4842dd8e199)(content(Whitespace\" \ + e327db3a-646f-46c3-a620-5ec708ea7804)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eb20e134-9a53-4f56-ae7d-269ee258279c)(content(Whitespace\" \ + 5c8ad2ea-ca4c-4fb8-9756-109b872c9b79)(content(Whitespace\" \ \"))))(Secondary((id \ - c248cce3-ba8f-435d-8a74-cf066d9e31be)(content(Comment\"#err: \ + 66f42fb6-86e8-4f10-a12c-50153ed58f40)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 13e9a30a-2b86-4f35-8b75-a70f09c615d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5a2fdd2d-99ff-4488-9a13-d03a37eb4f65)(label(\"\\\"Thats all, \ + d77ec9a7-2af5-45d9-8702-29aae2820122)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 691d69b5-38fa-4940-89ba-1ca693cee96b)(label(\"\\\"Thats all, \ folks\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 54a6e50e-2bf0-4f4d-a156-5746fe45d59e)(content(Whitespace\"\\226\\143\\142\")))))))(ancestors())))(caret \ - Outer))"; + 2e1afed6-18e2-4976-8197-f9e384a1035f)(content(Whitespace\"\\226\\143\\142\")))))()))(ancestors())))(caret \ + Outer)(projectors()))"; backup_text = "# Internal Regression Tests: ADT Statics #\n\ # All commented lines should show errors as described #\n\ # No other lines should show errors #\n\n\ #type definitions: no errors#\n\ - type = in\n\ + type = in\n\ type SingleNull = +One in\n\ type Single = +F(Int) in\n\ type GoodSum = A + B + C(Int) in\n\ - type Partial = Ok( ) + in\n\ + type Partial = Ok( ) + in\n\ type DoubleAlias = GoodSum in\n\ type VerticalLeading =\n\ + A\n\ + B(GoodSum)\n\ - + C(Bool->Bool) \n\ + + C(Bool->Bool) \n\ in\n\n\ #incorrect or incomplete type definitions#\n\ - type badTypeName = in #err: invalid type name#\n\ - type ( , ) = in #err: invalid type name#\n\ - type = badTypeToken in #err: invalid type token#\n\ + type badTypeName = in #err: invalid type name#\n\ + type ( , ) = in #err: invalid type name#\n\ + type = badTypeToken in #err: invalid type token#\n\ type NotASum = NotInSum(Bool) in #err: cons not in sum#\n\ - type Bool = in #err: shadows base type#\n\ + type Bool = in #err: shadows base type#\n\ type Dupes =\n\ + Guy(Bool) #no err#\n\ + Guy(Int) #err: already used#\n\ @@ -8532,7 +8714,7 @@ let startup : PersistentData.t = + notvalid #err: invalid#\n\ + Bool #err: expected cons found type#\n\ + Int(Int) #err: expected cons found type#\n\ - + ( )(Int) #err: expected cons found type#\n\ + + ( )(Int) #err: expected cons found type#\n\ + A(Bool)(Int) in #err: expected cons found app#\n\n\ #sums in compound aliases dont add ctrs to scope#\n\ #but compound alias types should propagate analytically#\n\ @@ -8589,1885 +8771,1904 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - c02465e1-d580-455a-aa60-b6aeb9216493)(content(Comment\"# \ + f231290a-6791-42a2-b389-1efc22e6604b)(content(Comment\"# \ Hazel Language Quick Reference #\"))))(Secondary((id \ - eac6ad58-e3bb-434f-9db0-2e8fd6072393)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8a5b7f9a-b19d-4d34-9d0c-c880eebb5d39)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 33151d9c-2446-45f8-a398-c06e4328a468)(content(Comment\"# \ + fe748969-6396-4cce-b91d-8498b2ebca57)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 42c2fd3d-9db6-4b6d-ad89-e1d698e236d8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 47a79df4-d8d5-4c7e-8cad-dba20964bc10)(content(Comment\"# \ Empty holes stand for missing expressions, patterns, or types \ #\"))))(Secondary((id \ - c8cc13c9-440e-4c52-a8ef-429a39de48d6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2fffac84-5d83-47ae-b058-6d237944ec5f)(label(let = \ + 26aeef5e-b0fe-4578-8b6d-cb9a10bac9ec)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3eef915f-5272-4cf3-ba9f-b23f47eabda0)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ca102bc0-c98e-4779-a3d0-29482db11528)(content(Whitespace\" \ + db8bc65c-bd73-483f-a9ab-1002f98a0d02)(content(Whitespace\" \ \"))))(Tile((id \ - 23d28c28-f709-48fd-80a2-91a1261c65a9)(label(empty_hole))(mold((out \ + a7b8c93c-81a0-4ab8-83df-a081e985300a)(label(empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a19670da-602a-43b1-98dc-be30daf8027d)(content(Whitespace\" \ - \")))))((Secondary((id \ - 9be33140-aae6-45d2-b3af-d7236ae2fa80)(content(Whitespace\" \ - \"))))(Grout((id 10150851-d9f1-4c1b-88c1-6eb9cc5ef8b3)(shape \ + 88eade96-a225-4232-820d-202bc14ef6e7)(content(Whitespace\" \ + \")))))((Grout((id \ + 3c19122b-6e14-4ded-b2d1-64c4634c10c8)(shape \ Convex)))(Secondary((id \ - 2826cf66-55bb-4b97-8e94-d11a05b82536)(content(Whitespace\" \ + dd9ba5f9-b021-4020-b34f-d7fa09bc09a7)(content(Whitespace\" \ + \"))))(Secondary((id \ + 874c266e-95b1-474d-a128-6980e73de5a0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7bbdb294-cb3c-4ee6-87c9-ff8e569e82a7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f1ca0924-2102-4d29-a917-84ed940bed3a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f8475082-76c2-4eb8-a3fb-647d9045149b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 23d2e2a0-ff71-4ff1-b0a7-97f7ca53bfde)(content(Comment\"# \ + a33d3fd9-82d6-42bd-987b-c3f711c184d7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1d8e44bb-a58e-4e7c-aedb-98ce85bcb6ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 53527745-b868-4936-802a-93308ab9be21)(content(Comment\"# \ Integers #\"))))(Secondary((id \ - c0b7cecc-18fa-4e0b-a69f-1f1fd0f4bc77)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1a5bb703-4fc2-4a12-956f-28017ffd7729)(label(let = \ + 0194a2ec-44c0-4efe-bdc6-b9039e74f30f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b4bb5710-2e33-4c75-9859-9828b8815eff)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6fb983fb-2e59-46ca-968c-ca1e8977e0eb)(content(Whitespace\" \ + d1638384-d3de-4f84-a737-705320fa58e6)(content(Whitespace\" \ \"))))(Tile((id \ - acbb1a16-353e-40fc-b2cd-1e1e5fbf323d)(label(int_lits))(mold((out \ + 7fb361da-38a9-494c-8d3a-e6da79588969)(label(int_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cd520e4a-49ec-4ba0-aefa-29ea494ce3f1)(content(Whitespace\" \ + d9d0ffc8-11ee-4dd7-83a2-3fc70d5cf7dc)(content(Whitespace\" \ \"))))(Tile((id \ - aad44b6d-55b1-4e71-9a3b-0dd9a5398b50)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 765511ea-82ac-41bb-8599-5472eef2cab0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 58477ce1-301d-412b-b1f7-1ac9f7aba4bb)(content(Whitespace\" \ + f0f04947-5816-4fb7-bcff-961978d02648)(content(Whitespace\" \ \"))))(Tile((id \ - ee9010f8-c67e-43e5-965b-e4532e62cbdc)(label(Int))(mold((out \ + 7fbc43ea-f2a0-41d0-8a5e-b4b2867dc0c7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0a73b46a-1d11-402c-b8d0-f9fec6af22ea)(content(Whitespace\" \ + a9b1fb90-691d-49a9-9b9a-eb25ee21c28f)(content(Whitespace\" \ \")))))((Secondary((id \ - 586e8fad-120e-4a52-929e-85b9d8f28b1e)(content(Whitespace\" \ + cfc582a6-1778-43a7-9cb3-e2480b3cbbcf)(content(Whitespace\" \ \"))))(Tile((id \ - 062a379e-884f-422c-aa61-721b97b3e20a)(label(1))(mold((out \ + 90d26eb6-a6d4-44a4-b69d-a51fd201bae2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 425a6af2-5fc0-47ea-96f9-b5f92c2c0957)(content(Whitespace\" \ + ba353675-4b14-4080-b6a5-fceab4a94cd1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d1e0b19c-3d09-4eee-970c-3b50fea7d15f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - aba91b6f-c7b4-4dd4-a962-0954aeb11b3a)(label(let = \ + aa9f7608-5c33-40a2-acc2-1e11baa34ed5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 49293b58-c848-4160-ba3d-8e15d9fbe0de)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5942a084-27cb-41c8-8048-c0c4c6fd2532)(content(Whitespace\" \ + b329b62f-9508-4130-b867-dac4199299d1)(content(Whitespace\" \ \"))))(Tile((id \ - 753c2bc1-4dd7-413d-b35d-754a16eb667e)(label(negation))(mold((out \ + 1199a616-0550-4841-be6e-c5cba43daf48)(label(negation))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1d10b712-3445-44e6-ab94-6502ef325682)(content(Whitespace\" \ + c3f04d6a-eed4-4ab3-b115-5bc78c76126d)(content(Whitespace\" \ \")))))((Secondary((id \ - 7ae5f68d-af34-4e15-8764-257a5a4d685f)(content(Whitespace\" \ + b2ed3853-aa58-43d7-ae67-a279d4630bce)(content(Whitespace\" \ \"))))(Tile((id \ - 91a73ee8-d7c2-4390-af1f-5e8b8f74c4ab)(label(-))(mold((out \ + 2af23c07-13df-472e-90d2-f53e912004cc)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ - 2))(sort Exp))))))(shards(0))(children())))(Tile((id \ - 52032473-7237-4de7-aaef-1572d21778d4)(label(1))(mold((out \ + 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ + 1cb181a3-9bed-4391-9f56-07bf7d82ac3e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9fd2d207-8aef-4b51-985e-6b4b0f85cd50)(content(Whitespace\" \ + 53483f59-1550-4989-bf65-910371d11187)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 35e9fd97-0dfa-4760-94f4-54a56efc7bc6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 994e8699-eae6-4f4a-89e4-e8ad228936d2)(label(let = \ + 30fdf552-2aeb-4fa4-86c5-de74823b999d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4d278c6f-ca6a-400b-8f53-9e6504c30ec7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a90dbe49-f009-4b7b-9c2a-1c67ebfa886f)(content(Whitespace\" \ + 0e54b192-21ee-41a2-b821-7ff7dc627a81)(content(Whitespace\" \ \"))))(Tile((id \ - fe5e28ce-5530-4c62-a241-5d8069f21e4e)(label(arithmetic))(mold((out \ + 0b5b4f81-02e8-482d-9a38-ea62581c8a6d)(label(arithmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d5090a02-9928-482a-948f-1b616daa5209)(content(Whitespace\" \ + 57a2eb14-359c-404f-b173-ac62711a06fd)(content(Whitespace\" \ \")))))((Secondary((id \ - ef75cb3f-3312-4415-92ff-8a8b8cbb4912)(content(Whitespace\" \ + aa4e7030-1bdf-41ca-83bf-f77193b851a7)(content(Whitespace\" \ \"))))(Tile((id \ - 688e886f-8b0d-4a1d-b344-f53a8d213f33)(label(1))(mold((out \ + fa1b23bd-bd21-4749-9155-354a629da49d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 696aa524-06f5-4717-b164-62e42ae4b9bf)(label(*))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 4))(sort \ - Exp))((shape(Concave 4))(sort \ + 2a288629-910d-4a26-ada2-519ed12173c5)(label(*))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 5))(sort \ + Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - fca66189-a9ff-441f-a9ff-b9a343fa1ef5)(label(2))(mold((out \ + f640c32c-7953-4b89-bc02-029d97798c11)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cd9d89ee-03af-481e-8578-4ada75839252)(content(Whitespace\" \ + 290f0277-7a55-403f-acda-f6b586e80874)(content(Whitespace\" \ \"))))(Tile((id \ - 2baadfe4-7246-4cf1-81a9-3185efc1f88a)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + e37bd2f6-7c4e-4da6-a8ef-95cc5b5b2a18)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 34ef2209-3967-4fd8-bdf8-1d1d4ea84fb6)(content(Whitespace\" \ + 409d756b-ab97-415f-87e5-fce2df27bd16)(content(Whitespace\" \ \"))))(Tile((id \ - 772bfc49-b7cc-49de-b663-5c1ad40e7cd7)(label(8))(mold((out \ + 0c05aed4-e872-478b-991f-615c199985b7)(label(8))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f3898cfd-cbc8-45c7-92ad-e5324a4fed11)(label(/))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 4))(sort \ - Exp))((shape(Concave 4))(sort \ + 1c65389b-0b77-43cb-8ca4-b324c7bb10db)(label(/))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 5))(sort \ + Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 37791357-7f10-4c88-a855-cf12f41d6a2e)(label(4))(mold((out \ + cc28133b-615a-4c3a-96b2-7903ce29471f)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79f7ba83-5c4e-4cf1-9a37-730a65fb8efa)(content(Whitespace\" \ + 26db8c33-5fbd-4e21-9231-d4695c4cdf26)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 233fa61a-b3a1-44d1-ac9d-468a4da6bc52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 28c99e4c-2557-4b6a-9148-6dc1ba8ccbbd)(label(let = \ + d9b5c1e3-d0c7-4cee-b16d-ae23baa051f6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3db82ef9-e4c5-4926-9b83-9164789ec502)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3fa533d1-50c5-4996-b74d-deef2a46df2f)(content(Whitespace\" \ + 2a685abc-ac10-443c-bb4f-3fe88d88995a)(content(Whitespace\" \ \"))))(Tile((id \ - 3ad542ed-202c-4fde-aa12-d66033759eac)(label(int_comparison))(mold((out \ + 1c72c155-d2a8-4638-ae24-5046e491bcb8)(label(int_comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a59ad00c-eca6-4f06-bc76-8502bc1f09cd)(content(Whitespace\" \ + 50cf54c7-7d8c-457d-ab56-2a821aa8f795)(content(Whitespace\" \ \")))))((Secondary((id \ - e545925d-3d0d-4ec0-93b5-23ca30e74756)(content(Whitespace\" \ + 4df16b54-deda-4352-95b3-072f0e600bfa)(content(Whitespace\" \ \"))))(Tile((id \ - ca563165-e29e-43f4-9be9-194fa465c401)(label(\"(\"\")\"))(mold((out \ + 472175a0-13a0-4f87-835b-1adf6da7d203)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1305e5ea-5a8d-4d44-8f20-3e61da4b9ce7)(label(10))(mold((out \ + c2c08f22-badf-406c-a08f-39010b254094)(label(10))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b9ef2359-069b-414e-8799-eb98bc569f00)(content(Whitespace\" \ + ffd2e06d-eb6d-41af-94c0-7b018ba2924e)(content(Whitespace\" \ \"))))(Tile((id \ - 0175b8c1-ec18-4b46-9155-bf421c7f2b6d)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + be5a1a07-c116-416a-872c-4c324975caa6)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e71af419-adc4-45be-b7dc-0e7dabc8bb7a)(content(Whitespace\" \ + 5e7e6a36-a531-49c7-a25b-8845349119e5)(content(Whitespace\" \ \"))))(Tile((id \ - ca973cd7-e43d-473a-9d3f-575739c51abc)(label(10))(mold((out \ + 5d5ef570-339b-43a1-b1bd-bb533210ff7d)(label(10))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5497f005-b6a0-41c4-802b-a270309d38bb)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + f76a17ef-509e-4be4-84d9-732f851d552e)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ee4f26c1-cb5f-4576-a06e-777c650fb863)(content(Whitespace\" \ + da74c67f-d43b-4779-a095-6ce1a10959e2)(content(Whitespace\" \ \"))))(Tile((id \ - dfa9b54e-06b1-411c-bb4d-cc17c9c15c42)(label(1))(mold((out \ + 5520822d-ebc0-4b30-80fd-22af61a6d162)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 98a978e5-494a-45d6-a857-9f8a1120cac7)(content(Whitespace\" \ + ca0186c3-8451-4f48-a298-97112903098f)(content(Whitespace\" \ \"))))(Tile((id \ - e47da472-40dc-4850-b65d-c0ecac9b7cbb)(label(<))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 43412eb9-a8a6-4b27-a707-af9c602d8df9)(label(<))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1d349a92-ca96-49eb-9e9a-a69c0776b1df)(content(Whitespace\" \ + 56f39774-c7c4-48bd-8c0c-c640cec6ed95)(content(Whitespace\" \ \"))))(Tile((id \ - 477c7f95-29af-4c05-9c3c-9158c1de4fda)(label(2))(mold((out \ + d44c44a5-a6e4-4f83-9e30-90f6f367098e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c8480c5d-ff1d-43ab-ae22-43754f3a7deb)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 368177a6-3287-4405-8b1b-10b4265ffabf)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 269b997c-d282-41e5-8dab-d322d6d58255)(content(Whitespace\" \ + c35a6dce-d2a6-4ee6-b7aa-9243753f035a)(content(Whitespace\" \ \"))))(Tile((id \ - 0d107bec-b49c-41b9-81ab-e15c5742796b)(label(2))(mold((out \ + fcdd4e56-ad03-48e5-b583-7c82e195566d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16314a7a-c788-43dc-8f24-2bbbbc00aed1)(content(Whitespace\" \ + 52775819-d924-4bf9-ac54-ced224351615)(content(Whitespace\" \ \"))))(Tile((id \ - 289a01fc-7255-4354-b855-42270b1af4d4)(label(<=))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + db3c5aeb-f58b-496d-b2bb-4cf1a38241f6)(label(<=))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 07533539-c3a0-460b-a50a-cfacd93b624d)(content(Whitespace\" \ + 133f5832-bde2-41bb-b536-2e4bdb7407fa)(content(Whitespace\" \ \"))))(Tile((id \ - d451038b-964a-4f8c-8535-2ff829bf5e8f)(label(3))(mold((out \ + ce3364c8-bf7e-4232-818a-daf40b9ddbdc)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dcf1dbdc-44c6-4b1c-a7ca-a3a6fed31a92)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + b01a379a-3a8d-4c67-8d00-ae6b08eb45e0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9a1479e1-d046-42ae-b275-121dcb765884)(content(Whitespace\" \ + 7d04be26-69fa-4284-880a-aec6d501adf4)(content(Whitespace\" \ \"))))(Tile((id \ - 9fc4fae9-20d6-4a61-8da4-5336cb74d4e2)(label(3))(mold((out \ + f64dc9bd-b13b-4a26-90dc-4b07deadbb04)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1afdbff4-96e9-42e7-876d-5051adc8fa27)(content(Whitespace\" \ + e252a191-9743-41e4-971d-2887d9ece5aa)(content(Whitespace\" \ \"))))(Tile((id \ - d57fd5e4-cbdd-47c9-ab11-527b431d5bf3)(label(>))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 23875756-1426-41f6-a029-d08b4ab2b6a8)(label(>))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 39eb1a82-8220-442d-85a8-ffac84f969ad)(content(Whitespace\" \ + cdfe4fe3-91fa-4567-9b4e-02f5ef4f9f15)(content(Whitespace\" \ \"))))(Tile((id \ - 089c2640-84cf-436f-95b9-d54450d8b6d4)(label(2))(mold((out \ + b37980a9-7ad7-47da-ac56-e2da9137b896)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ce10a8eb-da2c-40eb-aeb4-28663f03871f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 01e506fe-e626-4ca8-9e10-71f2a3646f42)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cedc559c-d11a-4f5a-bfa0-bade4341794b)(content(Whitespace\" \ + 0c5f0112-9201-4bf0-89ca-51c06a3a227b)(content(Whitespace\" \ \"))))(Tile((id \ - 8bed2e43-0314-4f22-acc3-acc4d3e8ffb4)(label(2))(mold((out \ + 43097854-3b5e-47ff-839a-d7b45f000f10)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 29d534fa-5a4a-43ae-8f66-3a185856c570)(content(Whitespace\" \ + 000a5d2d-5749-4447-a1d8-08fe649f6519)(content(Whitespace\" \ \"))))(Tile((id \ - 257e50c9-e66c-4246-9e28-3006b1ebc81b)(label(>=))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + f7e808f9-92bb-4d49-9e8b-e09e3cac9761)(label(>=))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 559b5241-a336-4121-823b-1d7dcf167fa5)(content(Whitespace\" \ + 45033abb-720d-487c-a506-0bc12d9b8e26)(content(Whitespace\" \ \"))))(Tile((id \ - 8c70323e-6c0d-4073-a23d-0d3a2d8fdcdc)(label(1))(mold((out \ + c5f2426b-fd52-4366-9654-6cebb2a263e0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8cecb774-93ed-4a93-8c1c-98ce749d0554)(content(Whitespace\" \ + 61d28118-fdaa-47cd-ae07-18401e24b89c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 13fdc7ae-e70e-4da7-b6a2-9666dbaca4d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f73cb689-d184-4dde-9be8-3a0f61d1d46b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7b53cf5e-1184-49ed-9d7c-4726c8e0b117)(content(Comment\"# \ + c458bca5-30bc-4dd5-9a5e-95faf1793710)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6810aee3-f08b-4aa3-8c41-43cee4ba5b16)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e657f55f-08eb-4221-a0c0-4d5c0ef872de)(content(Comment\"# \ Floating Point Numbers #\"))))(Secondary((id \ - e12f8c8d-b356-463e-9d35-3f289845d9d4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 10aa8ea5-d891-4d07-97ae-684f3cc0989e)(label(let = \ + db51ba83-917f-41af-adf1-d528c2725b9c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9419de87-ae06-4866-8b57-f8d8ed331899)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8021f30a-9d89-44ee-8ffd-b1d995c1d518)(content(Whitespace\" \ + 27d636b3-8826-409f-953c-09721ea03b01)(content(Whitespace\" \ \"))))(Tile((id \ - f7b293e6-340a-4681-b019-c5124e45c0ff)(label(float_lits))(mold((out \ + b0e0bc1b-73b1-4a6a-8472-ee59f9a46825)(label(float_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2f6ed6ae-11a1-4e72-839d-12ca19cd93d5)(content(Whitespace\" \ + af048b54-b1a3-4f01-a33a-3889a98ce4c4)(content(Whitespace\" \ \"))))(Tile((id \ - e432a2f9-7792-4f40-9493-eeab3c60da34)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 0fea018f-72a2-4e0c-a826-48836fd6aaed)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3ce58267-880a-4f6f-b440-68864aa1efb8)(content(Whitespace\" \ + a04ba8f0-3b65-4135-b615-829f52d0d491)(content(Whitespace\" \ \"))))(Tile((id \ - 8055bb96-c5a4-421c-bcf2-ccd8c3bd4173)(label(Float))(mold((out \ + 3f7c4714-d10e-4415-8c4c-afbc4b76f50c)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0bec24d1-5e30-478b-bcef-3ae4772e8a8b)(content(Whitespace\" \ + 2492ef2b-024f-4b68-9169-6dc4c40d9725)(content(Whitespace\" \ \")))))((Secondary((id \ - e49338a9-9ae8-41d9-b647-51bcfc609b03)(content(Whitespace\" \ + b1ae2fb5-9aeb-4147-b9b5-25826222673f)(content(Whitespace\" \ \"))))(Tile((id \ - 4c9483f1-3795-4998-aab9-c3511077b5e6)(label(1.5))(mold((out \ + 5032cecc-79c7-4f61-8b6d-29226527969b)(label(1.5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ceefb970-0cda-476b-928a-c7d6cda446b5)(content(Whitespace\" \ + cf015c00-cdde-43fe-a39d-fd4943d48829)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fc5cd16d-6e3c-4a63-97db-b428ae944398)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b8131072-fa39-467c-b055-ec955668d644)(label(let = \ + c624d7a2-ae9e-4799-8eba-fdf7ddc5c7da)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d801b13a-9223-44d6-a897-9b62e811cb6e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7a9ce07b-0aaf-4199-93f1-8e736cc615a9)(content(Whitespace\" \ + db4c0f3e-0554-41d3-8945-2ad38d57e4b8)(content(Whitespace\" \ \"))))(Tile((id \ - ed296500-3bbe-479a-ba87-1e336133d935)(label(float_artih))(mold((out \ + fde2176a-679e-47ad-817f-cbf42c779633)(label(float_artih))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5d42b5fb-391d-4afb-9d9a-9584ab3c05da)(content(Whitespace\" \ + 63ccbb8b-2ea9-4a5a-be52-bbbf65b563cc)(content(Whitespace\" \ \")))))((Secondary((id \ - 3659a1fd-5038-4106-851f-99f679d91e4e)(content(Whitespace\" \ + 1a076fbf-9de4-46ad-ba3c-3559595adb8b)(content(Whitespace\" \ \"))))(Tile((id \ - 3e918251-1956-47e4-b049-5ad8ccc7a2f7)(label(1.))(mold((out \ + f3598549-cfb1-4b67-a531-fa5d2d7d34cf)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 97dfebff-d305-433e-ad00-96a6efc718b8)(content(Whitespace\" \ + 005ed371-0394-4948-a2bb-b7ced8fedc15)(content(Whitespace\" \ \"))))(Tile((id \ - d5b59097-6064-4f40-9a09-f3d44cd5215b)(label(*.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 4))(sort \ - Exp))((shape(Concave 4))(sort \ + e104302c-de2b-4d34-a559-791df942a785)(label(*.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 5))(sort \ + Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ca8d362f-94a6-4df6-a803-5f248e528219)(content(Whitespace\" \ + f3ed1dd3-f4aa-46a9-aacb-4ac893457e09)(content(Whitespace\" \ \"))))(Tile((id \ - 7d99d9a9-d2cf-422b-891d-616f124b2112)(label(2.))(mold((out \ + d13d21a4-cac1-473e-bb6d-f05f25f050a4)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 377e3e95-982f-4470-b6dd-c5e8132e5e5d)(content(Whitespace\" \ + b1f34c5e-d796-4e33-8153-4c8e6f481278)(content(Whitespace\" \ \"))))(Tile((id \ - b3ce0733-8039-4f1a-b19c-b2e643a6f4ef)(label(+.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 7d5f48d3-0965-4a17-84eb-bb80092d1fec)(label(+.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - be550181-cebb-4e2c-88f4-56e9ac3f8d06)(content(Whitespace\" \ + 592cdab7-3f87-4045-a5d0-ac5d0b9bc385)(content(Whitespace\" \ \"))))(Tile((id \ - 9720963b-38c5-44f8-ade5-28d3b93ac28e)(label(8.))(mold((out \ + 27ef9e7b-9e8f-4e5a-9109-6a07f8eff672)(label(8.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79327816-38f3-4b35-9c61-64d67c0dc8d8)(content(Whitespace\" \ + 73be090c-9497-41be-ba89-ddf080dbf12f)(content(Whitespace\" \ \"))))(Tile((id \ - 87e5293d-5940-49d8-b964-46507d81b79f)(label(/.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 4))(sort \ - Exp))((shape(Concave 4))(sort \ + 0d537e1d-575e-4364-8e08-cc6e281e31d9)(label(/.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 5))(sort \ + Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a9072680-b79c-4a15-a3ef-3448e283709d)(content(Whitespace\" \ + 8a0d2a9e-073d-46fb-a6ce-4ffde02c8302)(content(Whitespace\" \ \"))))(Tile((id \ - 2af4956c-32e2-434e-8b23-9ff35fcbb97b)(label(4.))(mold((out \ + 01d1f50e-6393-419d-9603-2eebaf7268de)(label(4.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7741c9e4-a581-44bf-b1f3-196699159b85)(content(Whitespace\" \ + a32d1b09-bb85-45cb-8be1-bcbffab03b45)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b1bcbfbb-4588-45f3-b5c1-6e622a6c22f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 13c0ef1d-f81e-4a02-aa26-e2c91e94ee5a)(label(let = \ + 817b4d3d-47bc-4408-b99c-516cbe28ad0c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 497fed52-1f45-4836-b20d-55bce423d06c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9fc6b971-83c4-4ee5-8432-112dacb86695)(content(Whitespace\" \ + 85850ec7-9ba9-4d85-9ae4-797f47c30f01)(content(Whitespace\" \ \"))))(Tile((id \ - 5bc77122-3aef-4f4e-89d3-01002a1696ed)(label(float_comparison))(mold((out \ + b191997f-26d7-4fa2-a39e-3ace10edbf83)(label(float_comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 06f39d6b-8ef0-4e11-9a45-369cdacf2998)(content(Whitespace\" \ + 1f9047a6-8f33-4781-8aa7-a42d89288cf8)(content(Whitespace\" \ \")))))((Secondary((id \ - 46124981-91e7-4f5e-ae47-7fc33e3e4858)(content(Whitespace\" \ + 620eed3d-dbd3-4052-90ac-eb08625edd90)(content(Whitespace\" \ \"))))(Tile((id \ - 6ea34e57-cb97-4450-9d60-df6a6524e2af)(label(\"(\"\")\"))(mold((out \ + 104118c2-ab45-4fbb-ae0b-8f8f45e758e3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4545c34b-9969-4077-96b2-3898dba2acad)(label(10.))(mold((out \ + f8978ea2-ed62-4c7b-9dc3-00126e347b63)(label(10.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dcf22383-1322-49f0-9596-48309d4bb77b)(content(Whitespace\" \ + 86f43473-d7aa-4fba-a2bc-1c3e144dd0db)(content(Whitespace\" \ \"))))(Tile((id \ - cbbf25af-750f-4abb-b1f6-f521816cb828)(label(==.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + af680faa-1a6e-4c73-9f9d-6d845b6cf09a)(label(==.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 91f1f6e6-c035-4020-a9d2-8c2f419c7338)(label(10.))(mold((out \ + 383a064e-bf6b-48d8-8133-7d315539ad7c)(label(10.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - caeb3fc4-872c-4dcc-83ac-803b54a46463)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 4b4da9f1-ca0d-4da8-ad52-69b0a3af6448)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cfd3c907-699d-48d2-a60f-bad9adebba48)(content(Whitespace\" \ + 01911639-e560-4149-b131-5200002aab2a)(content(Whitespace\" \ \"))))(Tile((id \ - f5bb85ce-27c0-4351-a71c-51a88ece8ca1)(label(1.))(mold((out \ + d8978de5-8afc-4533-a7fe-2c81eae31b43)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 51283b8c-c360-4468-a559-45cbe3454d72)(content(Whitespace\" \ + cfbd18b2-19f9-4c8f-8a3e-17d74f2c319f)(content(Whitespace\" \ \"))))(Tile((id \ - 8da7e8a9-a288-45db-9dd8-aead3ec13f8d)(label(<.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + b286d0d5-a63e-4baf-bec6-39fdf64937df)(label(<.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 10048c15-f857-4c9b-a89c-509462d60f7c)(label(2.))(mold((out \ + 60292549-2fb1-4bf8-ad02-86639d40c0b1)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 525c7176-b079-467c-9aaa-c8dfa4d5fc28)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fc3f3536-2029-42eb-b1a8-c3357fd8b667)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ccb3dbb2-65af-45c6-a35a-dbdb2de55eb0)(content(Whitespace\" \ + a84d40d2-b346-468f-b246-aadbc4f98258)(content(Whitespace\" \ \"))))(Tile((id \ - 882890e3-6922-4f01-adb2-3849a28c6068)(label(2.))(mold((out \ + 94af6a71-1cac-47b2-ae7f-ae8019ee1a5c)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0d952e96-5ece-4b36-bbf0-23fb298da825)(content(Whitespace\" \ + 67d0a537-e9d8-4e42-b80c-e9b479013cd6)(content(Whitespace\" \ \"))))(Tile((id \ - edb705d3-f107-42cb-ab2e-27b45622c9a3)(label(<=.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 25316d21-a1a1-480b-aebd-a4e2da262ed6)(label(<=.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - d845e2bd-f60b-4a23-84cb-d9557b04db16)(label(3.))(mold((out \ + d70ef026-3947-4456-86da-52a2450c1f28)(label(3.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6c24749c-9a0d-46d7-b509-290abf75f7c6)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + eea27e81-345c-41a4-b9d3-b1eea82a455d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9d2432cd-b491-457d-8d3a-ead7face4508)(content(Whitespace\" \ + 7feb6e60-24eb-4b8a-b93d-c766c03a5362)(content(Whitespace\" \ \"))))(Tile((id \ - 68b23073-d57f-4327-bb1e-66a2c4a98c01)(label(3.))(mold((out \ + 2eebc1b7-cc60-4e02-be83-dcfe4d25032d)(label(3.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 944dfcc5-247e-42ee-9a23-be664c184d68)(content(Whitespace\" \ + e27e8be9-266e-418a-bfde-eb5fd6bcc836)(content(Whitespace\" \ \"))))(Tile((id \ - f32aa2cb-9347-4346-ac24-4c432d04de80)(label(>.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + a11dcdc1-1c43-4c6e-899c-7a7f7d3bc852)(label(>.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 4438a2e6-cbcc-435b-ab93-71426659fb2d)(label(2.))(mold((out \ + 651138f7-f706-4e6d-9e29-363e9babc57c)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 915dae41-1a85-4e35-9f83-837aefb453fa)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + c38d430c-398c-440c-a4d1-50b4841fad15)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e5370413-5b1e-4ec5-856a-635c8b100507)(content(Whitespace\" \ + 65051a82-f3e9-44e5-ab67-a56a42bcde37)(content(Whitespace\" \ \"))))(Tile((id \ - a2e396ff-220b-4fad-af54-5f40174f68c8)(label(2.))(mold((out \ + 8a680c2d-28f8-4e11-8abd-7786e8f8fe0c)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1e3874d4-1503-4342-aa07-2c1f6c40798c)(content(Whitespace\" \ + e356820a-0ee3-49ef-853e-aebd2e94d125)(content(Whitespace\" \ \"))))(Tile((id \ - 517b75ee-a1bf-46f7-8c0b-1bb226a37c27)(label(>=.))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 6173f588-96f9-4eba-9eb3-53f2154d1bd1)(label(>=.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - c2729f80-24a7-4f7c-bc80-deccb52dabc0)(label(1.))(mold((out \ + 1248cf85-17d2-4c8c-8d5a-5abc12386ddd)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6c5b7ee8-f5bc-4286-bb44-b2fd976670d7)(content(Whitespace\" \ + c1669512-d37c-4784-9f3f-6026827ca42f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dd1eda4c-8e3f-481e-a7f7-b4df78bd7f0e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 48792ba6-48c5-4e97-a8e7-5ad2456a4012)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4701234f-7f8b-4288-a974-74493d1a47aa)(content(Comment\"# \ + 28bb74eb-2783-440d-8152-54a025759e16)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7c5a04f3-7847-4473-9686-1eaac84bc262)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8e27b39c-a022-42b0-bb61-cc5fd4538e7e)(content(Comment\"# \ Booleans #\"))))(Secondary((id \ - b29f594f-41ca-42bf-beae-4c366fc6db0d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b89ffb32-c3e9-4d29-adeb-3403b1e7c886)(label(let = \ + 481637d4-5f90-43d1-bfdc-97518ea83995)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 85855a03-a1b4-45e1-88e7-ea5d876efa92)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d2218c04-1f82-4248-a3bf-94f5563410f3)(content(Whitespace\" \ + 3cdf6278-3d0b-4ad1-9184-ef1fb02cbe63)(content(Whitespace\" \ \"))))(Tile((id \ - 06ebaa5e-ac57-4ee9-b32d-68006232ac5f)(label(booleans))(mold((out \ + 74880a9a-85be-4cc8-9c85-fae94e261847)(label(booleans))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a9eabb41-480f-4fd8-b5ce-a2b8132102aa)(content(Whitespace\" \ + c53d3229-5b63-44dc-9dfb-db0981a22c6f)(content(Whitespace\" \ \"))))(Tile((id \ - 11525367-baeb-4cb8-b43c-ec0dee35fc86)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 895a685d-ced2-4feb-8777-487f37ce5b02)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bc65dad5-9674-4e00-8b83-5d53c42f3f1d)(content(Whitespace\" \ + 985d9b20-b047-44d7-b79c-2e2746627939)(content(Whitespace\" \ \"))))(Tile((id \ - 0017b84a-a249-4b4b-a9c6-ef0e21976328)(label(\"(\"\")\"))(mold((out \ + 4bc9b6ea-e9fc-48fd-bcf3-18b9298a42e1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - bf457a18-2af1-4715-a4df-7481611d0eb5)(label(Bool))(mold((out \ + f727e47d-a1a7-4372-b3e0-9dea9c556c7e)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 2632699b-a021-4bc3-a548-16d4c315fba7)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + d0df6dd5-f80a-4e74-91ca-a5f074ba7841)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6e417997-cea7-483e-92ed-d3e875bd3c3d)(content(Whitespace\" \ + 5cb57f96-aac8-4ac4-9b40-82a23529fa9e)(content(Whitespace\" \ \"))))(Tile((id \ - 17c1c64a-dccb-4902-bf6a-1a2849ce66df)(label(Bool))(mold((out \ + 5c2dabde-3595-45ff-81f4-61fe6826f42c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 7f2b15c2-2a1d-4cef-9313-60fb2a87cdd1)(content(Whitespace\" \ + 5771bbee-41d4-44ba-a73f-7d4156a6d124)(content(Whitespace\" \ \")))))((Secondary((id \ - f39ac63f-d80e-4669-bf62-fd97661c0065)(content(Whitespace\" \ + 61de3e4a-b322-4bf6-b6e4-ac85b9e1e110)(content(Whitespace\" \ \"))))(Tile((id \ - 5389dc89-11fe-4bd4-bfce-50920c3c0310)(label(\"(\"\")\"))(mold((out \ + 11ca9598-cf73-40dd-846d-585b50466dc8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c8ab23c2-f2ad-43c0-ba6b-2ca69043a1f0)(label(true))(mold((out \ + 6d73e8fb-d3fe-4a44-acf9-bbb76c4be789)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 78255f29-5055-4f97-9433-0c7b0a4c6d2e)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + a56dddc5-e0bf-4a41-96c2-7001f2bd900d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3a58111e-8c4f-4516-90b0-999ba0db4cfa)(content(Whitespace\" \ + 9666c9df-314e-4992-8660-580c6fc10601)(content(Whitespace\" \ \"))))(Tile((id \ - b9dcd9c2-f7fe-48c3-a94e-1849355867e5)(label(false))(mold((out \ + c76252ac-199d-4503-b129-7471332afead)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 13ddd06c-da67-4e37-8486-85ddeeb8a98b)(content(Whitespace\" \ + bf3dcae0-cf93-41e8-8cfa-682a232ab8d5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a09e6f3d-bd02-416b-9948-6ab04eb17da1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 06ae542d-6ca1-4225-9e6c-d8cd47fea13d)(label(let = \ + fd403dd2-df5b-4859-9678-a11fda9de276)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7b43def7-5f40-43e4-aaca-02f8550783d1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5ff510c7-a2e9-4b2d-aea8-4bbdd5622502)(content(Whitespace\" \ + ec703be5-5526-46ab-ab8b-8cad08d46f7f)(content(Whitespace\" \ \"))))(Tile((id \ - 25019522-ee88-47bb-98dc-21be74263f85)(label(conditionals))(mold((out \ + 7ee22584-8d59-4976-853c-0b25e78ee130)(label(conditionals))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d186c457-dfa8-49bd-a338-7cd988da6112)(content(Whitespace\" \ + e9256147-0e0e-4c7e-a1d4-d04a6c60b649)(content(Whitespace\" \ \")))))((Secondary((id \ - a39c092f-c169-43a0-b94d-7fe57db457da)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ba62a4d9-9cd3-46f4-8add-960015a5b252)(label(let = \ + b7db5681-2df6-4c14-a9bb-0d46886d4cde)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 482bfd61-8e63-476f-89a0-de41c727debd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bb015ac9-1e95-47e1-b42c-dbf3babd1fb2)(content(Whitespace\" \ + db82f295-630b-408a-ab16-41af97d5c834)(content(Whitespace\" \ \"))))(Tile((id \ - 75aa8a68-196d-4751-a3f3-28526299fad2)(label(\"(\"\")\"))(mold((out \ + 2220dac3-9dc3-4da1-9f16-e784bc6f057c)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - e92cd801-e46f-491c-90f9-61aa20887bdb)(label(x))(mold((out \ + 731283b8-6023-4135-97ea-ad51ea18c47e)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b220a3ab-eda0-4504-bd78-c8aa5a72c2da)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + c4d970a2-f485-4461-b767-8b05489a82a0)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - de75ac47-32b5-466a-a94f-73665f45f35f)(content(Whitespace\" \ + 47c6fce5-d22a-4ad4-9269-e1c5325162c5)(content(Whitespace\" \ \"))))(Tile((id \ - 55c42244-25d6-4091-9a4b-5f964b6f7f7f)(label(y))(mold((out \ + 98f7fb0b-860f-413a-873e-a989df0ae3fd)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - a8c611d6-6b7e-4741-9aff-c6f4966ef5d7)(content(Whitespace\" \ + 66a71a3c-ce83-447a-9a46-63e13fe3d4ed)(content(Whitespace\" \ \")))))((Secondary((id \ - 1115e119-2ff6-4b0f-b5f4-a6489526c495)(content(Whitespace\" \ + 22673622-12f3-44e6-a356-fc440b8ce338)(content(Whitespace\" \ \"))))(Tile((id \ - d5b01572-55be-4c94-af8a-59e2cc585251)(label(\"(\"\")\"))(mold((out \ + 8f551008-062f-4794-8952-6da4b7f10795)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e1e9c08a-7fc0-4039-ad1f-f70055edf2f1)(label(2))(mold((out \ + d9a1b9c7-3acf-4390-b866-fcfa61599a81)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1350068b-2330-4bdc-bcee-27854fc5b571)(content(Whitespace\" \ + ceec6251-cea0-415c-bf72-310b02d3e35c)(content(Whitespace\" \ \"))))(Tile((id \ - 38855989-1b25-413c-b04e-dc83ab9f7412)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + eb192237-d7e1-435b-ba4f-a46ebe3791d1)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a7c39806-2f69-4b06-bd77-743bdd88df3d)(content(Whitespace\" \ + 4aa0cac9-d665-4f26-97ee-43a0bef46fdd)(content(Whitespace\" \ \"))))(Tile((id \ - a604aac2-13bf-4599-94ee-f03612813c7a)(label(2))(mold((out \ + c3bc7bf1-708a-4f33-98cc-fc3f17e776f5)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a9b89e7c-7281-4b13-b482-479e2e604067)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 0e16185d-5e41-4813-a9f3-a4704bdbab88)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - dfee5ecb-7620-42dc-9521-7db3a7e87a90)(content(Whitespace\" \ + b553f185-2ee7-4246-9b18-fab7fca0b1c1)(content(Whitespace\" \ \"))))(Tile((id \ - dfe1ed00-63ff-49a9-9768-5e484279aee4)(label(3))(mold((out \ + a2c7394a-e58d-4007-8721-033793c8eb19)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 165809d9-9678-486d-a22e-b11f342f3ef3)(content(Whitespace\" \ + 5fb50171-7d5e-43b4-8900-4ddba05864a7)(content(Whitespace\" \ \"))))(Tile((id \ - db753586-baa7-4352-9397-9e5da9231c8d)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + 646b9ca2-cb31-4a53-ab33-a80499999cfc)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 481882af-2b8c-4841-b809-5f2b37790bea)(content(Whitespace\" \ + 27047983-648e-4edb-847b-4248b293d8a3)(content(Whitespace\" \ \"))))(Tile((id \ - d9d12b04-5369-4361-94e2-6bee82e2a455)(label(3))(mold((out \ + f718f5c0-e986-4e0b-b2e1-fabd91d5e188)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 37ddd62d-1e25-4f9b-9295-4546f4c6e3d1)(content(Whitespace\" \ + 6ec26c37-9ae1-42e0-b9e5-aebb02555cd9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f08346b3-1795-4f8d-85b1-2d956b4780ae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 859845dc-92ed-4678-b675-6eb12df4fb73)(label(if then \ + 1d452cac-92ed-408f-a5f2-ce0ca6dab0d9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9d1d77d9-6c62-4842-a3d4-1a734971e067)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 229d1f1b-c9ba-4442-9d3a-de760c44278b)(content(Whitespace\" \ + 3b4d5cc2-56fc-4c23-b5ab-af32ff6aa155)(content(Whitespace\" \ \"))))(Tile((id \ - 970099b8-4c8b-4899-8116-1650ef88e17f)(label(y))(mold((out \ + a04a8697-3d7e-454b-8dd6-a0d83b567360)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 712518bb-722d-4c72-ad7f-d5fc8f25d36f)(content(Whitespace\" \ + 27d6e784-b802-486d-9505-07f9cdc7528c)(content(Whitespace\" \ \"))))(Tile((id \ - e762e87d-b774-4252-a1ab-c34bea3b6b15)(label(>))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 81665c7d-5d84-49ca-82d6-f0855e6b5351)(label(>))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f3bb6def-0e7b-4c50-8b25-69bcb18bf3c6)(content(Whitespace\" \ + 03bafdd7-db80-4e05-8076-554a34505935)(content(Whitespace\" \ \"))))(Tile((id \ - 19dbccf6-f10a-4ab5-a593-ae02caead949)(label(x))(mold((out \ + 236da41e-900f-4a54-9074-8591b493af06)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c33a7b6-45c7-4c06-b2ba-2b911215afb9)(content(Whitespace\" \ + 2c452a75-7d0e-49ca-b3ad-fd7cc39a9fa9)(content(Whitespace\" \ \")))))((Secondary((id \ - b09f12cc-5e07-4817-9453-eda2f17d0de8)(content(Whitespace\" \ + eff3d82a-c493-409f-81f7-846f9dafc907)(content(Whitespace\" \ \"))))(Tile((id \ - e34a2a9e-3a4b-493e-842b-6660b9f9660f)(label(1))(mold((out \ + 87432165-67a2-43ca-9da9-88133375187d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4698ffa7-5be7-4a30-bafc-9173a684345d)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - fa20e15d-c1c7-4a2a-b289-4e2e63224c51)(content(Whitespace\" \ + 96d6d960-57fc-4604-ac5c-c08559d0b329)(content(Whitespace\" \ + \"))))(Secondary((id \ + df6f35ba-c8f3-47f7-90c2-6061f51fa8ea)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 88f9c66e-e1b6-44b4-8813-39ae82d019dd)(content(Whitespace\" \ \"))))(Tile((id \ - 769479d5-4a41-4fb3-b311-9694b67ecdac)(label(2))(mold((out \ + dcbb89b7-49b8-4d03-a693-c98b46ff1c67)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e5771d07-cff9-438b-b15a-bfac4e7fb62a)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 6bebf9b7-d402-42d1-832e-d9655757744e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c81e9cc0-f7ee-4f8a-a423-ccb229c01d90)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 994e1938-e562-4bfe-ac53-ee9870827b80)(content(Comment\"# \ + 9a9401e3-4024-4252-ac10-2303a54e8ac8)(content(Whitespace\" \ + \"))))(Secondary((id \ + 51012439-28bb-4687-bd4e-efea9b927bb3)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 4231b28a-4013-4150-9347-94493051178f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9125ffd0-646f-43a8-8143-c12225272ca6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9c9372ab-f8f9-429c-942c-53609a073488)(content(Comment\"# \ Tuples #\"))))(Secondary((id \ - bd4094ad-28ee-45ac-b9a6-f41706a255b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5d821910-ebb1-42da-a79c-eee1368d6e03)(label(let = \ + 9575233b-d3aa-4960-8502-fe2cbf553c09)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e10f63ab-2117-4736-8ccf-876b5cdd9508)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 82843ab0-2415-4a11-bc88-1b633c52f922)(content(Whitespace\" \ + ece63575-6012-4c16-a74d-925420a1e75f)(content(Whitespace\" \ \"))))(Tile((id \ - c93c847c-7ab8-494c-a6e9-422662c7e8d4)(label(tuples))(mold((out \ + 9ea7dc8e-aa5a-4979-9242-c6fb30a9a0cf)(label(tuples))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9eaf76ed-8964-409d-b6af-3b95c6e5dfe1)(content(Whitespace\" \ + ec2791ac-7234-4098-a276-31dd26dedfae)(content(Whitespace\" \ \"))))(Tile((id \ - cd39681a-c09e-482d-8097-b460aba0d9b6)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 02f43eb2-6471-406e-8dee-6f149f50743a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5be55fff-5bcb-4702-a9f4-b7268e24df06)(content(Whitespace\" \ + 1f0cb445-1027-4e9e-ba8e-c96543e253c9)(content(Whitespace\" \ \"))))(Tile((id \ - d321c385-1d0a-4b0c-aaa3-08219a0f753e)(label(\"(\"\")\"))(mold((out \ + 92abac05-4725-4805-bab0-9b8932b3f9d5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - b3335759-3082-40c4-96a7-0bb91ec4b5a5)(label(Int))(mold((out \ + d19bb26a-213f-432f-bc6d-1b22c88d1583)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 078e0901-8966-4b75-8c49-a4b7538e3c52)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 9cbf36bf-da61-4136-8f8b-a0e7a14ee336)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2f09e9ed-8d04-4886-9132-62f7016141ee)(content(Whitespace\" \ + b9362da9-4d28-43b3-b90b-d87d3a10e4e5)(content(Whitespace\" \ \"))))(Tile((id \ - e840f2c5-8cf7-4c2a-8205-6721b3fdcaf8)(label(Bool))(mold((out \ + 7ca5fe6b-a009-4273-9cff-e85a216f588a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9a0d92f9-ce88-4739-9542-96da69513ed4)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 3b94a9b0-3c05-4d64-ba20-ead5a0d4c2d4)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 84d5437c-c902-4e56-a124-15eb74f4186a)(content(Whitespace\" \ + 176fec37-49e6-49fb-aaba-26faffd609d3)(content(Whitespace\" \ \"))))(Tile((id \ - 0af23744-9cab-4df9-81d9-6215876eedc3)(label(\"(\"\")\"))(mold((out \ + 983adb80-cd0e-4b56-adb2-4c6db399f08f)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f0ead96e-cb4c-4764-99fa-796245a2abca)(label(Bool))(mold((out \ + c9715cf5-2100-4f02-ab51-58336a4143e1)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - efd7ba45-af47-47e7-880e-3a64aeb9eb04)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 4dd1cfa5-fef5-4337-a717-5eb942170c2c)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b01501a6-df97-4345-bc78-4f0315501c31)(content(Whitespace\" \ + ee03b8d3-bdbf-4e7e-bbee-a934465c1e9c)(content(Whitespace\" \ \"))))(Tile((id \ - b9b464cd-b0e1-476c-8b2c-6c633e1e483a)(label(Int))(mold((out \ + fb2cb0d9-00ea-462d-8fde-3cd06e76d079)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 8ac7fc3f-a8b1-43fc-824c-4b6c18070fee)(content(Whitespace\" \ + 02564d9b-066e-489a-b1e3-bd535c8ce83e)(content(Whitespace\" \ \")))))((Secondary((id \ - a575cd4e-ecea-4688-b661-02d63708740c)(content(Whitespace\" \ + 36a6957e-e251-402d-b60d-9ae404020496)(content(Whitespace\" \ \"))))(Tile((id \ - c7f190a0-f72b-4072-8eb1-8b5c77540988)(label(\"(\"\")\"))(mold((out \ + ccee5beb-7c84-4eae-9da4-1a28684b6913)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9142de4e-e8df-44a9-8fca-6d04fc13158c)(label(1))(mold((out \ + 29c9df14-25d8-4218-a394-284331b0a069)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 166ef475-8dff-4bb3-b595-1e84944625ab)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 114a8684-c9be-42eb-afad-473f9ed5ceb0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fe4aeee1-32e1-4274-bf64-103e3491570c)(content(Whitespace\" \ + 294e960f-af89-4f9d-80bc-ddd7f7ee1305)(content(Whitespace\" \ \"))))(Tile((id \ - 5b8af094-0994-4401-ae76-a1332b3af9e3)(label(true))(mold((out \ + 217c6730-9728-4713-bf92-3d40e49cd9ba)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a09e402e-92a6-4f6b-b855-cd8d34161442)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 1473e383-3324-471a-a1b7-9228b61d9e1d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eea23743-15f8-4d76-8892-b00491dd662e)(content(Whitespace\" \ + 662233d2-5cac-4569-b559-088783251da2)(content(Whitespace\" \ \"))))(Tile((id \ - e6659b71-12a7-46bd-bf69-a700d2abc4cb)(label(\"(\"\")\"))(mold((out \ + 6d5050c4-caee-4f96-852d-4e9d116b126a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 11784350-3981-454d-b66c-1232d578b152)(label(false))(mold((out \ + e1acbd80-a085-47c5-91b0-5da7c20b30ec)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 578571ed-ad92-4f0f-af8f-99bb5511beed)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fe5c1a04-7012-4ca7-a99b-fc6d9bc08f87)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1043854d-79a4-4a87-b984-1a51ba60810d)(content(Whitespace\" \ + 35525b61-5225-488a-a9be-66c287923bb4)(content(Whitespace\" \ \"))))(Tile((id \ - e380669f-f318-4d4d-aab5-661105700301)(label(3))(mold((out \ + 5603ff93-a391-41d9-81a6-c945acbe498e)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - b1beeeac-1210-4341-bcb7-e5ecea396dc6)(content(Whitespace\" \ + e613e63f-9190-4613-9561-100adfe3c8cc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1394f1e7-0251-4c39-a51f-8d7151035854)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0a24e707-5aeb-48d5-bea0-c72c22a1feff)(label(let = \ + 06d48783-166f-466b-9ad0-924970e0af7a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f6f09cba-0936-4068-ba58-d10d740b6b73)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 730775b2-ed6e-4cda-9058-2ab2e381ce55)(content(Whitespace\" \ + 6710be14-30c9-4440-9338-24f8213c4015)(content(Whitespace\" \ \"))))(Tile((id \ - 8c838d69-2f5f-4144-bc7e-d386d25d4f35)(label(\"(\"\")\"))(mold((out \ + d9d17a55-5efc-45d8-a57a-e69da4756b16)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - d587513e-d54c-4c85-98ba-e861d28f5bd9)(label(a))(mold((out \ + e7bc9736-78b5-4e8b-b715-b67e4e09940d)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ee1e68b8-37dc-4ddb-ae70-11fcf5d15929)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + c5730c0f-8e9e-47fe-ae0c-956f5b290f9e)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0f0080da-d789-478e-8e4a-6628b9f1bf9e)(content(Whitespace\" \ + a555aa35-8888-476b-829a-98ccbfc3a146)(content(Whitespace\" \ \"))))(Tile((id \ - 554496e6-8ef3-4843-a4c9-8e2def5c7244)(label(b))(mold((out \ + 6e14a452-43bd-47b2-bfdc-86eb54edd531)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bd865f8f-6aa7-4c07-a96f-1bf7a35d2f87)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 5267119b-4df7-46f9-a1dc-d8c0e5f9ee29)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 91807c7d-746d-4d3b-887b-11e3d0ab95c8)(content(Whitespace\" \ + 9893fa12-1e36-433a-9ab8-cf73183a4893)(content(Whitespace\" \ \"))))(Tile((id \ - 3300f21b-c939-418d-80e0-c2258d21bc03)(label(\"(\"\")\"))(mold((out \ + 57981aa8-b47e-44c3-9530-f281b0d083a9)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 0c7ee6f1-5cc8-439b-b6b9-42c27efa173a)(label(c))(mold((out \ + 32d562ec-2f1c-403a-bb41-df1e55af79bf)(label(c))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2e8d812b-b09d-4791-89cd-0254d2ad937e)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 3cababd3-92dc-4614-80ab-e0bda171742e)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a3651e80-e491-4606-a7a8-3f61793c7f50)(content(Whitespace\" \ + 940bb9d0-a482-4168-9f85-fe22d431ded8)(content(Whitespace\" \ \"))))(Tile((id \ - e16ad8c4-62ec-472f-99ee-e63f1f5eb4d2)(label(d))(mold((out \ + e0b69f45-51ad-408f-a3c7-51dcfaa7a380)(label(d))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children())))))))))))))(Secondary((id \ - 25012974-8c3e-48a9-9788-c95fa9403027)(content(Whitespace\" \ + f1de2ce2-ae71-42fb-801e-ed1636e8f811)(content(Whitespace\" \ \")))))((Secondary((id \ - 400972a1-6061-49cd-8081-fb56d05fec71)(content(Whitespace\" \ + c095708c-dc18-4bc6-b002-73efed97daa8)(content(Whitespace\" \ \"))))(Tile((id \ - 16396d07-b06f-42a8-81f2-d6492bd1f4a1)(label(tuples))(mold((out \ + 2db5444c-05c0-4d9b-b976-97d61cea3faa)(label(tuples))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - df60af23-f967-4ff9-bdc4-860afaa2d598)(content(Whitespace\" \ + 7c484c01-8d83-46b6-a1d9-5ca7cca3d9f2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 89e15fb4-911c-45d4-82b2-69b6c5f841d0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 25dc978f-32eb-4bd5-98bb-9f285f419bbe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - aaba7119-46ab-4f2d-a84f-7592bef45bc6)(content(Comment\"# \ + 733c789b-ed85-4be5-bde3-7962525cb5f3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c5a0521b-1a4a-464a-b485-e670435aa595)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e2798af7-8015-4711-ae57-67bd96efe1bd)(content(Comment\"# \ Functions #\"))))(Secondary((id \ - f44d3b93-1361-4bf0-b905-8a299258389c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 78d576a7-23ef-4ec3-bc22-fc278b11000d)(label(let = \ + 05ce00dc-dce6-4955-ad48-217d33c5d42f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d07a3681-bfac-4673-92bf-380e6e11ca1f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e1855ef-e374-47ec-97d4-ccfd78d8ac2a)(content(Whitespace\" \ + 117b22f8-1494-464e-b64e-c94d46561007)(content(Whitespace\" \ \"))))(Tile((id \ - 018babaa-c3ed-4ec9-98fc-465dcafb8798)(label(y))(mold((out \ + daa7e10f-7e3a-4aa3-9527-b21036bfbcdd)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e11491b9-4080-4101-bfb4-e494f2143143)(content(Whitespace\" \ + 9e7d2e6c-6feb-4c16-b9d5-ba44e81abf6c)(content(Whitespace\" \ \"))))(Tile((id \ - f78cd590-2607-4e10-b542-d8146cde96d1)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + d7f7be3c-0472-435a-88a5-382ae82fe732)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0173a2d5-2e2f-41f8-bfd6-a073f7748090)(content(Whitespace\" \ + a0a975ea-ee9e-47c8-b2e5-8c9fe02c7c41)(content(Whitespace\" \ \"))))(Tile((id \ - 19468059-8f7d-4c76-8c90-85749aa5d436)(label(\"(\"\")\"))(mold((out \ + 3f905041-26ab-433f-a53a-deb7f8b873fc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f1a3b0cf-b00f-4c14-96a7-8938cb74a2e7)(label(Int))(mold((out \ + 6bef562a-87e4-4285-9d2e-c5a14e5cc67b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ec2c7da3-499d-46eb-98b1-acd76e907036)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 575517ff-0f13-4b41-8f0e-fa4717f65bc8)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2d50fd9a-ce13-41f3-876e-8d02f1f38930)(content(Whitespace\" \ + 45a772ad-ce8a-4f8d-936a-be44e630dd3b)(content(Whitespace\" \ \"))))(Tile((id \ - 64af5514-8356-4031-a08e-cc595e5dadeb)(label(Int))(mold((out \ + db8089ef-c462-4b80-bf73-881abb3c27a8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 7b4a7722-e9d5-4003-b838-4bdefa5caedf)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 8058b70e-2329-4d4c-95a4-dab3e1ec9f11)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 34751550-07ce-4ec8-90af-554af3376aea)(content(Whitespace\" \ + 2242c875-a0f2-47c5-a9c6-9819621d27ae)(content(Whitespace\" \ \"))))(Tile((id \ - 2f20e50f-8b20-4330-9bb9-b19e8ca65a2c)(label(Int))(mold((out \ + 6eef4522-7722-4068-aa7e-e2918047a1b2)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 85852b82-d059-4b20-842c-4901f989b8d3)(content(Whitespace\" \ + a91ab637-4e53-4d16-90b5-2fc587732bd6)(content(Whitespace\" \ \"))))(Tile((id \ - 84eda9d6-e032-4d41-be2d-d60a116697c2)(label(->))(mold((out \ + 1894c8f6-f702-43cb-a5b9-6a439aa1d850)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e812ed1e-cde2-4588-b818-e214db723b0b)(content(Whitespace\" \ + 2436c8b6-c269-4a24-9022-9038ee64212b)(content(Whitespace\" \ \"))))(Tile((id \ - 14d6d02c-a6e5-4151-a161-01f262720c99)(label(Int))(mold((out \ + ffb1e5cd-4985-454a-9036-54d925c93abb)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6d90b837-9847-4018-9cf0-788ea8b1e643)(content(Whitespace\" \ + 9852293d-8e96-4d66-9e9b-f9bf7cad5d2f)(content(Whitespace\" \ \")))))((Secondary((id \ - 7ac2f5e0-a88f-4974-9438-3b26b3637730)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ed89344a-b7bb-4ec3-83b8-3ef8d8348fc9)(label(fun \ + ca09aa8f-8220-4108-861e-049cb43fa948)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1d5cd92f-498c-4050-964e-356ea73b4eb0)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2ec9cd63-1606-4c15-9d51-c385430e1aab)(content(Whitespace\" \ + 468b90e7-ad96-484d-9918-bbfbf345c40a)(content(Whitespace\" \ \"))))(Tile((id \ - b19e4e41-705f-4abb-a2fd-9478598ccf65)(label(\"(\"\")\"))(mold((out \ + 1d493ab3-e546-4ec6-bc92-2466422073bf)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - c97b3392-0c6f-4392-9dca-37e9bfedf333)(label(m))(mold((out \ + ec80596e-a77a-4ed9-b241-5ec5f59582b7)(label(m))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 12a742d5-f2ab-4986-ab82-2f77bce7b302)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 8eeb9d21-f9de-4a7a-8b1e-f636da6a90c4)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 28403564-8d15-4a83-8372-bcba2aef2b62)(content(Whitespace\" \ + bf5dfdb3-1469-4a17-9ac7-142671ac6c52)(content(Whitespace\" \ \"))))(Tile((id \ - 2c37665c-5b98-4ebf-bdbc-04754f00ede7)(label(x))(mold((out \ + 6146fa61-54f7-4d2a-8da7-779c8b0c8406)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bfb06ed6-3467-4b99-81ca-47c3bc03479b)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + f4afbca7-ef26-41e5-8bcf-9a4c0eb0305d)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9b2fe42c-e350-48ac-9916-7ce10c6a18f3)(content(Whitespace\" \ + 13dca0a5-6258-444a-b19e-82c1916e84b7)(content(Whitespace\" \ \"))))(Tile((id \ - 8df94600-730b-4e93-8c03-3023049b1d62)(label(b))(mold((out \ + dd0a09cf-2b56-49b5-bc99-95ec1c01bf52)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 21a86c61-9700-47ca-b83a-6988d5fbb78b)(content(Whitespace\" \ + 09a92871-e088-4b0c-8a4f-c347875c52f6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8891190b-2c30-4763-9b83-da5a512f0497)(content(Whitespace\" \ + 6f749e1a-a04a-46d0-a1db-96e9743d1eeb)(content(Whitespace\" \ \"))))(Tile((id \ - ab616f81-d96b-48e2-8413-d5de88522b8d)(label(m))(mold((out \ + 5905c087-37f0-40a7-bb30-d31540e02505)(label(m))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c095f11-6a61-4769-87b2-7296227ab352)(content(Whitespace\" \ + dfdb7cbd-f02d-435b-95e8-61cac97d87ae)(content(Whitespace\" \ \"))))(Tile((id \ - d1527394-e012-41b5-b514-99e3b2f442be)(label(*))(mold((out \ + dbbffc7a-f4dc-4fcd-b374-a4934d7af6f0)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e17038d2-e745-4544-82f9-edd70afbe263)(content(Whitespace\" \ + d33905f7-7204-47b8-b0d2-9afc32b575c4)(content(Whitespace\" \ \"))))(Tile((id \ - bd895bb2-9b48-436f-80df-69d110ca0e59)(label(x))(mold((out \ + bf3e548b-af8e-4742-a677-1e24f3b0a4ce)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3cf62237-e7a6-4a53-bb9e-136fa5da1a41)(content(Whitespace\" \ + 9e112c99-ccd6-4dc8-a660-7defb93046c7)(content(Whitespace\" \ \"))))(Tile((id \ - b79be3d6-b663-471a-86ab-afa3d5b6106c)(label(+))(mold((out \ + 1e75d2da-0535-484c-a0fd-6a961a87d6e4)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6d877ae4-a7c6-4a3e-ab2b-9a0aa7c1541f)(content(Whitespace\" \ + 8686fb8a-0af9-4feb-b808-e25d9a529e50)(content(Whitespace\" \ \"))))(Tile((id \ - 93c6ff12-7ff0-4130-9f29-5a4aa4e48a60)(label(b))(mold((out \ + 9a94c082-3f4e-466c-9468-93851185bcdf)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 77c5849e-5dd2-49d3-a2de-64f3110d7d62)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 65cb9542-9565-465f-90bf-d34da80fefb5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5008fbd3-bdd1-4c2a-a1a2-93157ae9ea18)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - eb863a3e-f0e7-4ec4-8532-4372ac9aea38)(content(Comment\"# \ + dfe4b36b-fd6e-4b1f-834b-056df8b0ce1e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3925c0ef-40ec-420c-bb5b-484e92b8b5f6)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + ccd500fd-2e4a-4e63-ab83-314dc8d10f42)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6ee7b183-208b-41aa-abfe-04357d3096ea)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b0400789-78b6-46b8-9ce7-9d1fbfaaf3dc)(content(Comment\"# \ Recursive Functions (arrow type annotation required) \ #\"))))(Secondary((id \ - fe6f4241-8508-4c6a-809f-09e529aeb12c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6021d47f-f9c3-456b-af3f-21beb230e9e5)(label(let = \ + 4b0d4dcc-b030-47b7-81fd-6661060f3ff2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f5331f50-4b90-4e7a-814c-1c9754205ee7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 71af5914-9062-4019-a727-cf8107020c6f)(content(Whitespace\" \ + 547e5308-c4da-4858-b73f-5de4a9a6d8a2)(content(Whitespace\" \ \"))))(Tile((id \ - 1e80ee10-eac1-47f4-ad70-3607d85a55ee)(label(double_recursively))(mold((out \ + 0d1a56de-4fac-496f-a331-b85b26f09aee)(label(double_recursively))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2c8f5d4d-3967-43a6-8188-9bf00878a5d6)(content(Whitespace\" \ + 7ca1a658-c1fe-427a-982a-ab535fcb37fc)(content(Whitespace\" \ \"))))(Tile((id \ - ba2859cc-929a-43ef-a37f-8d5a4abbffb7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + cc26207a-2d22-46f5-a752-9f37ddd83cf1)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 77c87eca-53b2-423e-a8a5-f15b6a9cc983)(content(Whitespace\" \ + 349108ce-0f86-49ad-83e7-c772a44568b5)(content(Whitespace\" \ \"))))(Tile((id \ - 35b83201-eeca-4c96-a14d-054a17a6c158)(label(Int))(mold((out \ + ec09c2e4-ef46-4b00-8416-aefe17b27d7a)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 30326705-2cc8-40b0-a555-ae8fd88f3c33)(content(Whitespace\" \ + 41d26070-d662-4383-9736-c76022803991)(content(Whitespace\" \ \"))))(Tile((id \ - 3471cacc-1f76-4cb7-ad52-c7ebf4b898c2)(label(->))(mold((out \ + a5eec47a-ee01-4899-9342-311805b58498)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d3d4d1ac-3d65-495d-bedd-8da3b3959647)(content(Whitespace\" \ + f3c054d8-91fe-4a69-9686-edebfffe96fa)(content(Whitespace\" \ \"))))(Tile((id \ - 5a5068f9-6f81-4922-98bf-d341ae555940)(label(Int))(mold((out \ + e209560b-452d-4961-871d-511c49aedd3f)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7e9e7b9a-3565-4ab3-a609-d03ea47e1b09)(content(Whitespace\" \ + be5bacc9-ce1c-45ea-aeb9-b9d2440877ec)(content(Whitespace\" \ \")))))((Secondary((id \ - a7a33cba-40ab-4ad7-9f7a-fcde3444a5bb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d6bda773-e64c-4bc6-bda6-e5052186143a)(label(fun \ + 54de0b97-adb1-42e6-81fb-59df00bd4623)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + aed0955b-8767-4cca-bff9-2f835c23addf)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c00e394a-ec9a-4b6d-83ef-402c2249f362)(content(Whitespace\" \ + bef871cd-16f6-4e90-9f46-ff34688acf69)(content(Whitespace\" \ \"))))(Tile((id \ - a0306582-db7b-4c38-898e-bce7b292eddb)(label(n))(mold((out \ + 8d908483-6535-4ecb-83ae-a42d02aa5c2b)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1fc1b0df-dce7-417f-a5f4-d5ea3f46583c)(content(Whitespace\" \ + 86a5cfff-ff42-41bc-b737-9ea06830a9d3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c93de8ec-faad-4636-a415-eeaf61a0ab8d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ff02cd1d-7545-495c-80c6-042df0a797e4)(label(if then \ + 9bd047a9-a8db-4d4b-a3c9-1c7127d4da36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1718f616-6cac-40a3-a1c0-c43a14db66f2)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9eb7bd90-5172-47a7-bbe9-195f35ed72c5)(content(Whitespace\" \ + a6708eb6-a054-4fec-b18a-d481e38d5354)(content(Whitespace\" \ \"))))(Tile((id \ - f2054b2c-e699-41a9-9fb3-0ee0fdeff49b)(label(n))(mold((out \ + f9daa273-d646-4214-a680-db2f173a6829)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cbc67dc2-bb04-4f84-8461-14c0629fbbdc)(content(Whitespace\" \ + 1e215476-d312-414a-b44c-eaa8fc260414)(content(Whitespace\" \ \"))))(Tile((id \ - b6785035-f1fb-4420-bb00-3ef83c5d893d)(label(==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + 4700eaf1-809e-489d-9b21-030e769c8135)(label(==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 10646012-b57b-4e19-8c89-a668b16c98f0)(content(Whitespace\" \ + 5ac9e4aa-5260-404c-92da-9c2d2bbfde5a)(content(Whitespace\" \ \"))))(Tile((id \ - 397b06df-1410-467c-88f2-e6cb0c6160b6)(label(0))(mold((out \ + 8badb4d5-e8de-4a64-810c-a6e49e1625ca)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b65c10ff-2e33-4490-bb73-66a08244d442)(content(Whitespace\" \ + d792587b-3464-429f-a19a-be6ffb393dfe)(content(Whitespace\" \ \")))))((Secondary((id \ - b519ba78-08c5-4912-9d83-0c0ca0723291)(content(Whitespace\" \ + 83b4e5cd-6413-4784-9edf-37507a684b77)(content(Whitespace\" \ \"))))(Tile((id \ - 587a6001-8bb6-4534-a871-85fa11ba1f88)(label(0))(mold((out \ + 7b708090-54bb-47a7-9f62-302ec1912537)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 782d7a46-80b6-4ad1-be96-4f3150fadb1c)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 66237ba5-bceb-48e5-8397-3344adb5931c)(content(Whitespace\" \ + f13033a9-2f21-41ba-8296-14d1677e0de3)(content(Whitespace\" \ + \"))))(Secondary((id \ + a947f908-8294-4e87-b576-0631caecf91f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 347c4072-3472-46c9-816f-973f77e956fd)(content(Whitespace\" \ \"))))(Tile((id \ - 4eb3b54a-f436-4d6d-9b9f-bf2a67de99d2)(label(double_recursively))(mold((out \ + f3ce4261-da96-450e-a917-0dd9ab748a0e)(label(double_recursively))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cd795135-261a-4008-bbe8-5c6e68da52ed)(label(\"(\"\")\"))(mold((out \ + 1422823d-0787-411a-8676-4ac0445375ff)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 79419365-8519-415b-b6dc-1adad6e01c38)(label(n))(mold((out \ + 4b055872-d7c7-4f44-952e-0cf1751abf45)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c3cfc0aa-8f1a-4bc8-83ee-3b56b065912f)(content(Whitespace\" \ + 12fe8b6a-2d79-4b6f-8319-9c782368e38a)(content(Whitespace\" \ \"))))(Tile((id \ - a3bee0aa-8e39-41c0-868b-2c65354a9477)(label(-))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + e0a1601f-a34f-4fd9-99c3-a702a6f8a6ff)(label(-))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 02f993e6-62c6-4ca2-a70d-94da454ef05b)(content(Whitespace\" \ + ccb2426f-8b6a-416b-97b5-c202b9be9c26)(content(Whitespace\" \ \"))))(Tile((id \ - 5f2b5629-2925-4b3c-992e-b597a799436f)(label(1))(mold((out \ + a0d0a826-5821-4a31-b1ff-b349ec967e4d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 76a93d87-c2e4-4b20-b682-29d9c26874f0)(content(Whitespace\" \ + 49f6d06c-d054-43cd-88ff-3a74d1034448)(content(Whitespace\" \ \"))))(Tile((id \ - 3e684fb6-d094-4b83-a1f6-cf691595c0e8)(label(+))(mold((out \ + a6390533-f343-46c5-97a3-309f51e2941c)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d5a052ff-f03b-4776-86c7-0e467b007971)(content(Whitespace\" \ + 18528958-2df0-4741-a239-60072a5dd05d)(content(Whitespace\" \ \"))))(Tile((id \ - 8d7620cd-9920-4a3e-8866-49a03e1897a9)(label(2))(mold((out \ + 4b2c7c3c-149b-45ea-8a2c-608c3dd2f8c0)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 209e7f6a-02eb-46a9-ad71-0d1ff589ea18)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 744d9375-ec77-44e7-8abf-e55daef79b5b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f57276cd-1b21-47f9-b0de-79c8a5ccc729)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 21682988-ab76-42e8-8145-cbec7f79d25e)(content(Comment\"# \ + 9526ffb5-d890-4e5f-b15a-072fd724da1b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 32761cff-51ff-433a-b4ae-bb1121b74fb4)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 224d93ca-05f0-44f0-94a8-f2807ff4509e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8adafaa6-74a9-4af8-8d50-8055706173a0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9bde9342-ccaa-411c-b9ae-251be152b8e0)(content(Comment\"# \ Mutual Recursion (bind tuples of functions) \ #\"))))(Secondary((id \ - 2fdd235d-bc05-4c17-afe4-debffdaa0550)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 795b707e-7109-4d20-ad0d-ed71a5fd5320)(label(let = \ + 09601949-0283-4c98-af3a-65a748a82925)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4e32dd6f-5694-4f44-840e-e471b7932c43)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 34636584-d529-4f9a-9899-eee7fc4254e0)(content(Whitespace\" \ + b4b381d2-7c0d-4eae-917a-bcee0523c902)(content(Whitespace\" \ \"))))(Tile((id \ - 468c8a03-14ec-493b-8fad-738ea20890b7)(label(\"(\"\")\"))(mold((out \ + 508bebf6-2814-4cc5-afae-2ca1aa22bd05)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 24ed2e0c-084c-4768-81dd-18f8a7c0e21f)(label(even))(mold((out \ + 2dc2d5d8-2fba-4e88-b618-679a48a29164)(label(even))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 33b889e9-edcc-4a96-81c6-2e26ce57c835)(content(Whitespace\" \ + ada6f08a-326a-4055-a680-12784db29f89)(content(Whitespace\" \ \"))))(Tile((id \ - f329bd36-e7b2-4fa2-bf7d-8af168d6142a)(label(:))(mold((out \ + 74df90ab-47f5-4ee7-9c01-490056796489)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1ad6b08a-539f-4057-a7f2-bc17ac6fb0c0)(content(Whitespace\" \ + 4f854cd9-8489-4f99-9f86-1b1b69c438c6)(content(Whitespace\" \ \"))))(Tile((id \ - ff09f6cd-85b8-4699-804b-68b65b757b01)(label(Int))(mold((out \ + 29b29d14-4ac1-4c7f-af05-0846833820a9)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 19b2af46-e3a2-4e79-8ff7-14fd27397317)(content(Whitespace\" \ + fb7f343f-ba09-4cbc-b216-18a090de1f82)(content(Whitespace\" \ \"))))(Tile((id \ - 092849e2-d4e0-4824-9834-f4d102b9fd8d)(label(->))(mold((out \ + 76015bb0-58fc-4a34-9664-11f034acee06)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f6bae77d-566b-4d0e-a72f-37807ea8baef)(content(Whitespace\" \ + ba362be7-cb2d-4265-bbce-03db81ca5180)(content(Whitespace\" \ \"))))(Tile((id \ - cb642ef8-23b8-4497-bb6c-5e7e19b14124)(label(Bool))(mold((out \ + 7b34f4e9-ddb8-4202-9b44-7b211db042b0)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3a249574-39dd-4fbb-b458-d47e0955d0b1)(label(,))(mold((out \ + fa18d94b-2c5a-4c40-8964-2401ec1ae703)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 01a3ebbd-88e1-49eb-9f85-67382e210d00)(content(Whitespace\" \ + 1d87c9ec-428e-4f60-97ab-11fc5153165d)(content(Whitespace\" \ \"))))(Tile((id \ - 6d96c4d1-e4b5-490f-b0b3-b90f4a27664b)(label(odd))(mold((out \ + 64a31f23-4b47-4845-9856-4166958538d3)(label(odd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5b5481b5-764d-499a-8b1b-88b3a304f6aa)(content(Whitespace\" \ + fd7d1f5b-1f7e-4f16-87f5-58adf493d9db)(content(Whitespace\" \ \"))))(Tile((id \ - d3390775-46a2-465c-890f-044b8941b460)(label(:))(mold((out \ + 364b7ad3-81d8-402e-ada7-f973d9023e5e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 07c9b3f6-903a-4a28-aeb0-6facbfea6a81)(content(Whitespace\" \ + a30fa194-60ce-419e-ab9f-39bb45e096d7)(content(Whitespace\" \ \"))))(Tile((id \ - 92e70a3d-5e6a-4eea-8c6d-545265822f0d)(label(Int))(mold((out \ + c8c9dbca-2a04-4802-8d17-15ad7a3009bc)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b0ece690-3230-445b-9c69-389d7ed404da)(content(Whitespace\" \ + b3ff6f59-89a1-4e95-8aa2-ee881203642d)(content(Whitespace\" \ \"))))(Tile((id \ - c6e392cc-d53b-423b-9ac0-4acb9d920787)(label(->))(mold((out \ + a72e9520-186e-4f3c-a6d5-3595d97d6291)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 60350d4d-f9f6-4cb1-b2bf-eabd28761d11)(content(Whitespace\" \ + 57eb39cc-2447-4a66-ba0b-a18c7fee04b2)(content(Whitespace\" \ \"))))(Tile((id \ - e78084d1-75d0-4ecd-9c09-82c18a68457d)(label(Bool))(mold((out \ + f5d78d47-2710-4037-b9b0-30fa6215986c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 22ef9500-6a1a-4ffb-ad2b-ddf6b3dd7621)(content(Whitespace\" \ + 8f12fec6-f7e3-4215-8898-6c212be7566d)(content(Whitespace\" \ \")))))((Secondary((id \ - bfcb4fae-e7be-4d95-8063-ee6939d9b08a)(content(Whitespace\" \ + b7b42382-934f-471e-852f-545f573c7834)(content(Whitespace\" \ \"))))(Secondary((id \ - 42c2c64d-fa66-4ffb-a9ce-565af4f949b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 27ca6a6c-4baa-4e06-8166-e8a7faedb9bc)(label(\"(\"\")\"))(mold((out \ + 3a82c056-5343-4f49-ad11-a77839030e27)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8378f44d-cc08-4d00-8b8d-c4005a59ace0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c79048e4-07ce-4712-bb16-b9c6a9b29629)(label(fun \ + 318fe638-d3d6-4644-bdef-8b5380cab84c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 83c79eca-ce78-46b8-8c99-adb12bca13b9)(content(Whitespace\" \ + a5885b4e-b82d-4e3d-835d-bbf263b15701)(content(Whitespace\" \ \"))))(Tile((id \ - 26ab53ad-5803-4cbd-a25a-b88f44d7093b)(label(n))(mold((out \ + 6e6b6425-da14-49c3-b481-ce070ffbcf93)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ff69bf4a-d901-4a82-ad50-42ef7511dc46)(content(Whitespace\" \ + 3e1dac77-6e1e-42ff-a2c7-15c12c9a974a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0e935a25-d455-4bf1-8bb4-ed3b6e4fdee9)(content(Whitespace\" \ + 72095bcb-e0f9-492f-9af3-3535ec4c3463)(content(Whitespace\" \ \"))))(Tile((id \ - 7fbdde16-29a3-431e-961a-62596700943d)(label(if then \ + 06f43aa6-aacd-4e86-bce1-c5b6f2a4382d)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c57d61ae-49de-48fb-9338-eba7699b46ce)(content(Whitespace\" \ + 8c07cc62-285a-4626-8e71-05a38a4a7341)(content(Whitespace\" \ \"))))(Tile((id \ - b619f444-4657-47f6-93ad-3762a6472d53)(label(n))(mold((out \ + a001740c-6a9e-46c1-89c8-3b365fd17781)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7d9c7b39-b911-4228-b18f-3c95c6712629)(content(Whitespace\" \ + a141a8ec-f427-4c10-a9b8-9d83e20b0f25)(content(Whitespace\" \ \"))))(Tile((id \ - b475efbf-ea64-4aa0-bba3-05a343505bfb)(label(==))(mold((out \ + c3dc3f99-9ef3-4584-bb55-907ebf2e322c)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 76175f11-f532-4bdf-b4b0-04da417feaff)(content(Whitespace\" \ + 6eed63f6-3e97-41ef-ba22-2e98c218aa31)(content(Whitespace\" \ \"))))(Tile((id \ - 29980061-05a6-46c7-ae51-fadb5e0e52cb)(label(0))(mold((out \ + 4c6f8a5e-22e5-40b1-bcbc-11997c5fab1a)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3bda6593-11de-4ebb-a3f2-04fe1273c5f1)(content(Whitespace\" \ + 7b302669-ea1c-476b-a082-0b4edef8c0a2)(content(Whitespace\" \ \")))))((Secondary((id \ - 798f751a-5397-43c4-a328-55dea819e2a3)(content(Whitespace\" \ + 0d556ffc-d87d-4919-afc8-d9b2f16d6ec9)(content(Whitespace\" \ \"))))(Tile((id \ - a2ad2dcf-9529-4e49-8948-63d35cb3fb06)(label(true))(mold((out \ + 98378c6f-bd0f-4643-9db8-967547240799)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a69273a2-2dcf-47af-8e96-42d81bfc4ad0)(content(Whitespace\" \ + 7f2b1195-708c-4f30-9e89-95f7555bf0a0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6986d4f4-4191-4b9c-b2ff-6ee2e84a7b2b)(content(Whitespace\" \ + 20edf059-ddb8-4934-ae0a-8e7dfc138027)(content(Whitespace\" \ \"))))(Tile((id \ - 558b5c64-370b-4bc4-bd0e-fb45d281ecd3)(label(odd))(mold((out \ + 11fcc85d-d0d4-422f-87dd-e055881dfb1f)(label(odd))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 37bc5a6d-6d3a-40fd-9f52-fdaf023a3905)(label(\"(\"\")\"))(mold((out \ + 3e40c571-754f-4d2f-a98f-acb1ea58ac2c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 76a1384c-3190-4081-a831-ef9e6f55920d)(label(n))(mold((out \ + cf121564-49ad-472b-a5eb-893b624a790f)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8b855248-7315-463f-b88e-b452d84d5991)(content(Whitespace\" \ + 2f659831-5c2e-46c1-a115-70a11abb36b1)(content(Whitespace\" \ \"))))(Tile((id \ - 4694a35c-fe55-453a-b0c0-1e105485a95d)(label(-))(mold((out \ + ff5bdd5a-2df7-4077-97bd-29c7c21cdcee)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 54bbe267-63c6-4af2-936c-85b0d968d381)(content(Whitespace\" \ + 56bfef05-192d-43bd-bb05-5c396330e9d7)(content(Whitespace\" \ \"))))(Tile((id \ - d12a0549-7471-47b2-9a98-3315039b9083)(label(1))(mold((out \ + 30569071-63d5-40db-b33e-b4285c6e9b32)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 019aaa02-080d-48d4-98a0-964ba9dba11c)(label(,))(mold((out \ + 5b6dffa1-8092-494e-bce7-5de14e416e1c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ba9dddac-48ea-452a-b8ca-2733098100b3)(content(Whitespace\" \ + d646b385-9cd2-4ab7-b021-3f9ef665ce05)(content(Whitespace\" \ \"))))(Secondary((id \ - a92df521-eb76-47a3-8b62-bd83cb10f6ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5be4b2e1-4fbc-4a85-b08e-ef0caa32843e)(label(fun \ + 0c107353-68a9-4be0-a998-4a804697edf3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2b08ac27-183c-4e16-8775-00a0bd4d4659)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 660939be-3d19-4c1c-825d-a74818cb155b)(content(Whitespace\" \ + 560e4122-7f0c-4b55-a685-08bda9eac43f)(content(Whitespace\" \ \"))))(Tile((id \ - 1c286633-1343-4436-a515-8ca3a26ff114)(label(n))(mold((out \ + 7fa312ca-bdeb-4d6e-bacc-721ee31c279d)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5a8d6d17-75c0-4b32-b0e0-6a5d5097d5d1)(content(Whitespace\" \ + df9d860a-426c-4c88-9ca6-ff2106339300)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ae62b299-dba7-4fc8-a19f-fddbef3c8953)(content(Whitespace\" \ + ed8cc895-a7cf-428c-a717-28b84bcde830)(content(Whitespace\" \ \"))))(Tile((id \ - 57795e6b-d0b7-415e-b723-5afe6a52fb1d)(label(if then \ + 251bb6c6-eebe-482b-bda8-35b73a6c4734)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b181684d-e011-4e72-bba3-bfeca88dc33f)(content(Whitespace\" \ + be08d999-6bb1-4eab-9618-715b4895d847)(content(Whitespace\" \ \"))))(Tile((id \ - 3ee3433c-9ddd-41f1-8ac2-dd20d29a9579)(label(n))(mold((out \ + 586c7193-742f-4344-8ebb-19c19fd5c7cc)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 713c9b7e-dda9-4d77-bb51-f5f0bbd727eb)(content(Whitespace\" \ + 6fb59f3d-6e49-42da-80d4-8f04889d51db)(content(Whitespace\" \ \"))))(Tile((id \ - 609c9c74-2d7f-4447-bee5-6caba6cc48f1)(label(==))(mold((out \ + 52faabf8-511d-48e6-8770-7b27a12cbe9d)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5054788f-0281-4c45-8f2b-646024f29573)(content(Whitespace\" \ + 724e70b1-1129-4f8f-af13-8269a1e6ea1c)(content(Whitespace\" \ \"))))(Tile((id \ - fe22b068-0daa-483e-bcdc-e0333558634a)(label(0))(mold((out \ + 1337abcb-0ae4-4387-a20c-0b584b5662f5)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 191cde3d-c5b5-478a-934e-3ef751ed8a92)(content(Whitespace\" \ + dc1db274-39dd-49e7-97bd-51f4c29be8e1)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c42c9f8-8e84-41b8-b3f1-f8de8693b9fc)(content(Whitespace\" \ + 39320304-c758-46eb-85c7-3ace6ddc8dcb)(content(Whitespace\" \ \"))))(Tile((id \ - 46d23158-db60-4773-9924-92108214770e)(label(false))(mold((out \ + c3945a99-5bdc-4ef0-8b4f-c7ac6fdd078f)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8d993695-ea95-442a-a012-1bba3d32022e)(content(Whitespace\" \ + f46b74d3-6f89-48ea-8393-9042ff1f9534)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c5777d7c-d156-48a8-bcc8-8c11cec85d7c)(content(Whitespace\" \ + 6766e1f8-6d08-4fe2-b490-264f5c4b735c)(content(Whitespace\" \ \"))))(Tile((id \ - 4fb367c2-05c2-44ff-bdeb-a7b608115fef)(label(even))(mold((out \ + 1ef522c0-05d3-4c2a-a031-3761b138a106)(label(even))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 85025033-6ce3-46b8-be42-843aabf8c1e0)(label(\"(\"\")\"))(mold((out \ + 51617143-17ac-42d1-b862-c221301565ff)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 30d0945d-c20a-431a-a654-00138c1d3f8f)(label(n))(mold((out \ + 1a1adc10-ff9e-4333-b7a0-b6a34e59e799)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1da0e433-1d84-4595-965e-704d73693902)(content(Whitespace\" \ + 93fa3187-1d10-446a-9cdf-a9109f5bb65e)(content(Whitespace\" \ \"))))(Tile((id \ - ead48485-51fd-4578-981f-26216e9377f3)(label(-))(mold((out \ + d1477f94-470e-4321-b9c6-eee7b62476b9)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6445a5ab-30e7-4191-b378-3d9f83dca28b)(content(Whitespace\" \ + 270757ce-4901-4d18-8398-1a6fac6b0b4a)(content(Whitespace\" \ \"))))(Tile((id \ - 5c2fb766-8513-4caa-a416-173cf3f1ee3b)(label(1))(mold((out \ + e9274ceb-f654-4ba8-904c-f4fc4d2c9190)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 3644fce1-3634-44e1-8c2b-6c80621ae068)(content(Whitespace\" \ + ed5f07bb-c295-4e14-a6e3-536ec107cb38)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c1e2d794-fb97-4e09-ab64-e339bd2b61a3)(content(Whitespace\" \ + 48645f54-e53b-4acc-ab85-c2b7ad8ac6e7)(content(Whitespace\" \ \"))))(Secondary((id \ - bac0da86-7b99-4039-a855-e71423c4e243)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 961a93f1-32c1-495b-b2b2-2ace1f642b17)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 78e100cd-53af-4229-ba9e-3ee7e6d32bf2)(content(Comment\"# \ + 4c2860e4-4479-4a0c-9ffb-893dc07fc13b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2b4e3b76-9673-44dd-8480-27c71ecef637)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c1186b1b-c547-4f9e-b5bd-0ec90d06a5d9)(content(Comment\"# \ Lists #\"))))(Secondary((id \ - 35c19804-5897-4218-ad2e-faf7f4b6eb3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b4ee3364-3899-4aac-a842-68fbcd05b78f)(label(let = \ + d2c54a6f-d674-4ce8-83be-8a2e1563b658)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 40933f65-b1eb-4e3c-a57f-6bba9afa66ec)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e96e6634-c77a-4fa5-8d7f-a15284bcda36)(content(Whitespace\" \ + 0a61381e-ebbe-470f-83f5-66927d10532c)(content(Whitespace\" \ \"))))(Tile((id \ - 17c3ca0b-431f-431d-9995-32b54a17970f)(label(empty_list))(mold((out \ + 8e24b20e-fd3e-4031-b8a0-9d9efe8f24ec)(label(empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 79d3a3df-8b56-4076-ace5-4126ded2d025)(content(Whitespace\" \ + f98f6cc6-c49e-43d5-91ca-aa7ff4f6121e)(content(Whitespace\" \ \"))))(Tile((id \ - bd6cf356-7705-4477-af1b-2a93bc4c00e8)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 95f69c3c-c10b-4fde-a7a0-a4bce8bd3033)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7a6009a2-c76e-49ec-9c69-5885da3b52c5)(content(Whitespace\" \ - \"))))(Tile((id 60c043b0-a18c-4078-9ab4-61163d201924)(label([ \ + 0ed1f80f-b02b-45cb-9c86-11a268b9082f)(content(Whitespace\" \ + \"))))(Tile((id 3db721b6-e7fe-4fe3-911d-8a142eac27f6)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - fc97d9f0-c37a-4edf-b433-1965717eb972)(label(Int))(mold((out \ + 754da47f-eac1-457b-8137-6f94474f0d49)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 5470966b-c43d-4f14-88f8-742ff48e9cbe)(content(Whitespace\" \ + cc7fd619-173a-4bf7-8e3c-029e82d850da)(content(Whitespace\" \ \")))))((Secondary((id \ - 9795d258-7fa5-4deb-ab7c-ab4ba14eceae)(content(Whitespace\" \ + d8bfc838-6209-40b2-b393-f2bb0888694d)(content(Whitespace\" \ \"))))(Tile((id \ - 047d638a-8dc9-49ff-be48-26179ed85615)(label([]))(mold((out \ + 35de2318-5ced-46d8-a80a-c09c67c9f720)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5b8cc8bf-7895-49f0-ba87-36395960d433)(content(Whitespace\" \ + b9f4c0ed-5d25-498d-8375-ba542e1c24df)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d6c76a6f-5bc3-44cd-b72a-e8d8d6055d77)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0cfaa336-d277-4057-b392-b932d0590ff3)(label(let = \ + a3ddbf33-6c19-4d46-a73d-004f5f63f21e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 30f91511-bef4-49e4-82ca-c830ed263384)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c7fe2de7-957c-4f58-ace2-e05f7e40b246)(content(Whitespace\" \ + ea2a9979-3c5d-4692-abfa-af3d37d4abbc)(content(Whitespace\" \ \"))))(Tile((id \ - 9c9971c6-9ce6-4ff0-bd8d-6d9964896089)(label(non_empty_list))(mold((out \ + 9b779dda-3ccd-4b60-b3d4-d1652d8b689c)(label(non_empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 56c6a900-7672-4584-b42a-8420648405e4)(content(Whitespace\" \ + 94753717-888b-4fdf-ad90-5fb633215b9d)(content(Whitespace\" \ \"))))(Tile((id \ - c4331229-6241-4bc7-87c6-b6023d075304)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 63cd6a5c-ddb1-4cde-af5d-c70bd09a1bb5)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9c7fd3be-8e4a-4293-8ac3-ab7fd54268b0)(content(Whitespace\" \ - \"))))(Tile((id 6aba9166-b530-4f2f-9765-dd9d7396454d)(label([ \ + 949835a3-138b-44be-a572-93a2d91a815f)(content(Whitespace\" \ + \"))))(Tile((id c494f0c7-5e8e-4e0a-9a95-d6138471218b)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - b4bc8dab-fcf3-4a45-acc9-e8ebaa90ef54)(label(Int))(mold((out \ + 78c5192e-51bc-4416-b1d9-ae225fce8b44)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 91d78a6c-d6bb-4ae2-93cb-3872465754a7)(content(Whitespace\" \ + 0acd9d2a-9493-4584-9a08-f02078be64cf)(content(Whitespace\" \ \")))))((Secondary((id \ - f01f5411-0591-44bd-8710-d2911c719d57)(content(Whitespace\" \ + 2a67973c-69e7-47cd-90ab-0ab0a48f85b8)(content(Whitespace\" \ \"))))(Tile((id \ - de00ac61-5f29-4b64-a60b-07be2fbe3180)(label(1))(mold((out \ + 94aba8fe-6e5c-4b17-bf8e-bfffc4c51489)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c447dd9f-57cd-47a1-8983-57ba22b3c16b)(label(::))(mold((out \ + 3ad90e6c-538e-4b02-ab35-af12566da834)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - ed93c8a1-82c2-48fe-85a3-7a86bdca69e2)(label(2))(mold((out \ + 1c1df4bd-a1f3-4f06-9d8a-32578b05674e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 032bea77-674f-4dea-8ac1-559fe947f6bf)(label(::))(mold((out \ + 69c4929a-2e93-4bd4-a5da-f4ef25a66968)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - b2942d52-aa7b-4f8b-b705-6a3c57a67cdc)(label(3))(mold((out \ + e38e21bf-3bde-4381-8add-0874fa478135)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d19ebc20-bfff-48db-ae95-185f3efdd46b)(label(::))(mold((out \ + 03b6a487-9b02-4acd-96e4-970737601c31)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 9c33b3af-b95e-45ac-b165-77038efb602a)(label([]))(mold((out \ + 60f7ba39-a888-4402-839c-31c376b2e5cd)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ded4f5c7-72ae-4476-98d7-6906325de4e1)(content(Whitespace\" \ + 3ad8b8f5-e2f5-4846-b5fb-fc09bff27d54)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 715a03d5-5d58-4eaa-9ab5-5b33da845f14)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cf2e40c8-e04b-4711-bcdd-38513d108052)(label(let = \ + d4904eb3-614e-437d-8b4a-568d19e7dda0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 084a3bd4-704d-44dc-88b1-a07a8097733a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 11b3cdb3-3362-4f2b-93c8-593710a60c2c)(content(Whitespace\" \ + 662aa8a2-d642-4145-8db0-45a63ea5ec92)(content(Whitespace\" \ \"))))(Tile((id \ - 2cae279a-a22d-4cea-990b-dee583b7b675)(label(list_literals))(mold((out \ + 456cc039-a923-49f9-9f7a-f6db16a78876)(label(list_literals))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 04b8fa4d-70eb-4ce5-b35f-c33276ff9a91)(content(Whitespace\" \ + cf9d2eaf-3cd5-47f7-b2f8-a8e8b4d0f899)(content(Whitespace\" \ \"))))(Tile((id \ - a23c17e2-0be0-45c5-afc0-45ad662c2367)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + ccba0bdb-78de-43c3-9860-9ebdbd752dd8)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3ea34ae2-086e-4424-9508-3498891ff06a)(content(Whitespace\" \ - \"))))(Tile((id 2007e421-be10-45e2-ada6-742bc2819b21)(label([ \ + 1dbd9814-8814-4177-99b7-0aed0b06a9fc)(content(Whitespace\" \ + \"))))(Tile((id 82a83c92-0d77-4d3e-ac82-a401ee53b2e3)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - b53a9bf8-7a7a-4fbd-abff-e14d83c48701)(label(Int))(mold((out \ + 951d66d3-63e4-4691-829b-254d0c8b6378)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1d386def-e315-447e-b24f-4b86314e0c08)(content(Whitespace\" \ + 15d1d9bc-7c31-4fff-b8ce-fb5746e79779)(content(Whitespace\" \ \")))))((Secondary((id \ - 57a10c26-224b-4820-b1fe-fe61df094fda)(content(Whitespace\" \ - \"))))(Tile((id 54d0e0b2-3c9b-439c-8b7f-d8b524bc69e5)(label([ \ + b1b98141-7ebc-4d47-9c3a-32d17e401d21)(content(Whitespace\" \ + \"))))(Tile((id 0829f51f-2c11-4c65-970f-8010821eac97)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 920d4b0f-1b4d-4f04-88e6-3fe87e7a65a2)(label(1))(mold((out \ + d74dd234-f1ad-4284-8e0f-1531629b3448)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5f69d188-7d03-473c-9140-a15f2499c561)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 6b75c9be-c682-46c7-8fa8-d3f567f3ce21)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eec2c6b0-f47b-429a-aaec-d1ef320ee675)(content(Whitespace\" \ + 4c6f117e-e00d-4efb-9644-978616323055)(content(Whitespace\" \ \"))))(Tile((id \ - 1dfd11d6-3b87-4c62-b2a3-96c4b524bffc)(label(2))(mold((out \ + 7ec7c390-98a5-437e-9034-a93c443e0ac1)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4ffefd84-9e8e-41fc-80da-263bcf450a35)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + cf15aa67-dafd-4aea-a946-40de56af76a7)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 967333b4-fff6-44d1-938e-f7de598266ad)(content(Whitespace\" \ + e5211bee-ccd8-4df9-8c58-1ecbb480432a)(content(Whitespace\" \ \"))))(Tile((id \ - db5d965d-a45f-4e3d-977d-56ae69bf0ff6)(label(3))(mold((out \ + 4026b43d-a780-4f35-b566-efe04de44f00)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c5d264bf-7f1b-472a-ab12-33b1e9c1651e)(content(Whitespace\" \ + da854af8-d46a-42ff-acc4-0efe7f845976)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 15882211-ecd0-4ab8-ab58-6579fc6dfefb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4d1c6d2c-5fda-40ec-a1ef-6cccf71fb769)(label(let = \ + 96c61d37-1324-4a0a-80bf-027ca423f869)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9582a90f-88e7-4844-93bb-285329c28c97)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 99522f41-83e8-445f-9c64-5888fcd99a41)(content(Whitespace\" \ + bf24d665-ac1e-4869-9dd6-cade35916b3c)(content(Whitespace\" \ \"))))(Tile((id \ - 3b19f467-00f9-4ec9-a59b-b3783d9c480b)(label(length))(mold((out \ + 6673bcb5-0469-4f74-9e97-3015a93e0100)(label(length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 438c2f11-7687-40f1-ac6c-77b52b5ae19a)(content(Whitespace\" \ + 39c45d9e-06c1-4bf7-8716-c51e6da98e83)(content(Whitespace\" \ \"))))(Tile((id \ - 0a57c206-20f1-4e10-b9f3-bbb7d7586800)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 0e7c2f8b-dba4-4331-b59e-f8484947ae58)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4ece4618-8d70-48be-9c3f-9da04343855b)(content(Whitespace\" \ - \"))))(Tile((id 06de5f69-5c47-4c4b-a8e9-e412a85b5490)(label([ \ + c65a24c1-0855-4a71-afb5-a61769e7ff02)(content(Whitespace\" \ + \"))))(Tile((id 1706b443-63fe-4096-a9c7-4aac3e952e08)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 7ca778cc-b87e-48e8-911c-958b79e1cf92)(label(Int))(mold((out \ + 8df25367-f1a1-4719-865e-3ae2ed7526d3)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 4e580f3c-fb6c-4eff-ab45-b6d665f917b4)(content(Whitespace\" \ + be28c5d7-e78f-4088-8348-8324ad004918)(content(Whitespace\" \ \"))))(Tile((id \ - a4e7f377-5905-4d1d-854a-81a7a8dedaaa)(label(->))(mold((out \ + 1a846f41-cf05-4d2b-a7b7-42d6c5a8e394)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6dc204ae-c92d-465e-b046-db7ad394938e)(content(Whitespace\" \ + fb89ffb8-22db-44c7-80ff-602dab6f30b0)(content(Whitespace\" \ \"))))(Tile((id \ - d2f90cec-a6b8-41c5-83d3-2f145cc05f99)(label(Int))(mold((out \ + 68665a91-67a0-47a2-a23b-9178e9226a39)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6058204c-92a8-4b46-b823-4ebd9aeabd24)(content(Whitespace\" \ + 10a5cf75-3f2f-4474-874b-21c5fc2d2cc2)(content(Whitespace\" \ \")))))((Secondary((id \ - 164bd788-aaf3-437a-8206-647a2bc132eb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 18c66069-7229-4d7b-a013-74ec2d67d237)(label(fun \ + d4fe4f0d-a9c6-46ce-ae36-ace9c3179395)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2090d80d-a52c-4a68-8548-ec1d685a4fd9)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1946d033-a508-4a4c-9b22-6233aec311ea)(content(Whitespace\" \ + 06673b19-d476-48e9-a13c-6acca7462def)(content(Whitespace\" \ \"))))(Tile((id \ - 644d0e44-e2fc-4fd7-a6bb-eb3306f49eeb)(label(xs))(mold((out \ + f094b0f3-884f-4195-9e4c-d7416ffb5587)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3710885e-498b-4047-a332-fb855a982b84)(content(Whitespace\" \ + bcbf0f1d-a74b-4181-bf21-5a85a1fd6b13)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5e52c8bc-9c27-4755-9107-de2867a85244)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 486ec00c-6ff6-4523-9def-90ab86bf90c3)(label(case \ + 9bf10a00-7326-47b9-ba02-9f58d4c93c1e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d4ceba32-40b2-47c2-8727-65e61c4d682e)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e5fdbc48-7e48-4c89-8909-31cf2b62cdc0)(content(Whitespace\" \ + f2040ebb-a83a-409c-97a8-90e99d9fefe9)(content(Whitespace\" \ \"))))(Tile((id \ - 7f1d7ec1-01a6-4fa4-ba9d-85db637c553f)(label(xs))(mold((out \ + 4f261706-90b2-49a0-9f59-2e0e98676534)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ce6cdbcb-93c7-43d5-9714-092ea2630cd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - efe768d5-5682-4768-bf10-c756fad7a038)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 287a36af-783b-480e-aba1-7f708d0732ea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6804d604-3f4c-406c-85e5-362128cb7f68)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e132ee92-6f29-44f3-bcd2-0a21689ea8bf)(content(Whitespace\" \ + 57ec26ac-c439-441f-8458-bd3957bc7fd1)(content(Whitespace\" \ \"))))(Tile((id \ - 017ead53-406a-412d-a23d-d21c6313a0a6)(label([]))(mold((out \ + a544f86d-eda6-487d-ae99-b07f1581c97e)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d229c1dc-26a2-468a-b36a-d5eb92d7535d)(content(Whitespace\" \ + 744d0543-aede-4073-a621-896deb9e7759)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 36244853-42a8-4b21-8fab-6447580622f5)(content(Whitespace\" \ + 010e178b-3ee3-4bc7-ad32-b8f83d360b78)(content(Whitespace\" \ \"))))(Tile((id \ - 1919b6f6-63b4-4a2f-8411-a49d2b0de0e9)(label(0))(mold((out \ + e37b056d-ddff-49c5-8539-b3ed27da5699)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 117345cb-4180-49d8-81cf-5720bc09a76c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0b0c160b-a1ee-45e1-b330-44150a7f263b)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + b6730c76-69c0-43a6-9870-fc67fe097d06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 13fe160e-3960-4e18-9ecd-66e9730c6939)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 61f79bfd-9396-40f4-ba0f-cce78ebb2ca4)(content(Whitespace\" \ + fef7d59a-009f-42fa-9f7e-78549408bc43)(content(Whitespace\" \ \"))))(Tile((id \ - e59f2cf1-4e84-449f-9cb6-b003d07605cd)(label(hd))(mold((out \ + 5730fd5b-1c90-4d2e-b94f-ab9a5eb9a152)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 80c95d1a-b038-48d5-8413-249df02caf5c)(label(::))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 6))(sort \ - Pat))((shape(Concave 6))(sort \ + 9c12d045-2e4c-4de9-8625-0de17ddd9dfe)(label(::))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 7))(sort \ + Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 4ffa0ea7-c3d0-48f4-89e1-d508d974d9a6)(label(tl))(mold((out \ + 10ed78ad-cdae-45e5-a4e1-e322ed4590f7)(label(tl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c086568f-d41a-4696-ac05-f33a13a3d612)(content(Whitespace\" \ + d6a17002-c44c-4b0f-bfd5-ee6dcd67cb30)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 28b2008b-39bd-48ab-803d-e3e00d69f67e)(content(Whitespace\" \ + ee0c2109-f415-4004-b0bc-72c154b164ee)(content(Whitespace\" \ \"))))(Tile((id \ - 7df6c8b5-9636-42a4-9bc0-42d61b5f4631)(label(1))(mold((out \ + 9f30fe0c-779e-495f-806c-95b434bf4959)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 56c79884-7a1e-49d6-a659-ef07c7383eba)(content(Whitespace\" \ + 88d3e8d5-93f1-4076-a077-cb9c0c85ac42)(content(Whitespace\" \ \"))))(Tile((id \ - d293b8a7-037d-406a-be45-fd9ef543e423)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 5))(sort \ - Exp))((shape(Concave 5))(sort \ + da9fd38a-264e-4a09-840a-70414ba43859)(label(+))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2fcc2671-4432-40ab-bc0c-085df34a1034)(content(Whitespace\" \ + b2fe3474-8d1f-4fd1-afd7-5791104076f8)(content(Whitespace\" \ \"))))(Tile((id \ - 3cbc29ae-1f9f-49cd-ad81-21cdd6154572)(label(length))(mold((out \ + 69c15bf8-8f17-4d3a-99e4-1f8aecb35283)(label(length))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ca76747e-a814-428b-ba6a-d6e88d0b3a94)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f3f49731-b707-4748-bf56-be8291e6ec0c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 483daf30-152e-4a61-960b-ea2e34e399d8)(label(tl))(mold((out \ + 561b43eb-a662-467d-879e-5a099f61f404)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a191cf7b-f477-4064-9c81-eeed31cdb12e)(content(Whitespace\" \ + 4aa62bf5-534e-423c-8dc2-aca974896e79)(content(Whitespace\" \ + \"))))(Secondary((id \ + fc75f1d8-e466-46f7-b17a-2a72ab74999d)(content(Whitespace\" \ \"))))(Secondary((id \ - d95e09c9-f6ba-45f6-a42a-07039d5780f4)(content(Whitespace\" \ + 016b3de2-5961-4404-9d0d-103979c3167d)(content(Whitespace\" \ \"))))(Secondary((id \ - 0b868e0b-e1e4-4ff7-bf91-0fdd16adf9a5)(content(Whitespace\" \ + 36f4502e-5e4f-4231-92f3-f3205ba467a6)(content(Whitespace\" \ \"))))(Secondary((id \ - d5824218-661d-4526-99fa-1b195dbd0a7b)(content(Whitespace\" \ + 94813823-fbe2-441a-a979-e57207b43610)(content(Whitespace\" \ \"))))(Secondary((id \ - fccf51d0-1ab5-4f82-a218-e924c212937a)(content(Whitespace\" \ + 16fe25fe-36c1-475a-bc22-fe177957753d)(content(Whitespace\" \ \"))))(Secondary((id \ - 947e47dd-107c-436b-8f20-6fc2f7fad6c2)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - f210e7bc-619c-4848-847b-8cd228c43340)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - e8ccaf1d-bb31-4062-b2df-cce7f5a3b7dc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 75d95dc0-f522-4943-ae54-90856201704f)(label(let = \ + 7410bdae-461f-4eaf-9b60-8b517c46f8de)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 59ed34fd-6518-439f-a0e3-f26a7c7c0770)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4ed80730-9b89-4eaa-aaa8-866b412d1d42)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 701ac984-f23a-426c-8ee8-fc9849ff14c6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8e77d396-7c42-42b1-b5e9-df50fc784c2f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 78c38d95-74fa-4054-93ba-118df77e2a80)(content(Whitespace\" \ + ad66816f-f0dd-41fd-bdeb-a409c5014b73)(content(Whitespace\" \ \"))))(Tile((id \ - 68dc4a80-94b7-45d3-b317-3ce1931ee52d)(label(has_at_least_two_elements))(mold((out \ + 01b0ca90-434b-4de4-b319-334fb1fb7260)(label(has_at_least_two_elements))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 42441ccd-6ea2-4579-bf36-6eb359bbd275)(content(Whitespace\" \ + 79458443-d424-4535-8e86-55b156310bb1)(content(Whitespace\" \ \"))))(Tile((id \ - 1ef2f1b0-58cf-434d-ba60-e84b082c7bf7)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + ec5588f9-94e2-40c3-9252-d435909a1203)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e5c0d335-dbd4-47bd-af72-43b9c782cc1e)(content(Whitespace\" \ - \"))))(Tile((id 4721add5-b41c-46d4-9ff3-b44b1bd24770)(label([ \ + 35823a2e-b71e-4396-bc79-7d45eff6387b)(content(Whitespace\" \ + \"))))(Tile((id ecf944a6-1c1b-4674-906b-82e49a0e62a9)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - fdb7d4f9-dd01-4919-b227-f0d3fffc1cd7)(label(Int))(mold((out \ + 8f4a42a8-8e25-4fc2-a47c-088f7d148577)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - e14c1521-9da3-4cf3-95d8-59b32257b662)(content(Whitespace\" \ + 600eaa63-f5df-4081-9cdd-4e7b01f21720)(content(Whitespace\" \ \"))))(Tile((id \ - 08920087-d272-4ba6-bdf3-93edaeb021bb)(label(->))(mold((out \ + d1ad4d18-5a26-4a6c-8d2e-481e9ccd4f69)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0c620183-6b6e-4605-8c7d-a07c526a86be)(content(Whitespace\" \ + 578a67c1-f20f-4a3f-a045-8629a7bb52b8)(content(Whitespace\" \ \"))))(Tile((id \ - 16612644-16a2-4fa7-b22d-b74db2ad9333)(label(Bool))(mold((out \ + c85c8ef8-6fc1-430c-b935-2ae36e8dd905)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 74a3ee2d-ac2f-4712-9110-ce522f9851ec)(content(Whitespace\" \ + 9464f58e-4871-4126-91ba-5d53dfb5051b)(content(Whitespace\" \ \")))))((Secondary((id \ - a44e9372-c563-470b-a735-1109ac1dd743)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 961459a6-7b3b-4efd-ae2d-f0e7b724fb6c)(label(fun \ + 4e6bf012-c107-4ba0-b4fc-7fcc0e039e23)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ea8cf11f-edc8-467e-964a-e2fa5d6fbcd7)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9ee89b19-5be4-41b8-b870-75d5903eee7f)(content(Whitespace\" \ + d65e357e-bceb-4ab3-91ba-12c108b4821f)(content(Whitespace\" \ \"))))(Tile((id \ - e2b8680f-34ae-41d7-9885-125463b8ccb6)(label(xs))(mold((out \ + 2ba9dc3f-c2aa-4867-8a10-2aa51bf21553)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 81ee8032-53c6-4792-a186-53e68c504c80)(content(Whitespace\" \ + 80b6be28-f7a6-421d-966b-2866105c1b62)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 81159f4d-fcb2-4c97-bd22-9696c01c3e9c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d183c63d-aa0c-486a-9b47-82d275f02ae2)(label(case \ + bf6538c9-0a59-4149-a6a1-7aab9f1037ea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b2198543-22a9-4e32-8be9-10ec5c5412a0)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6526e4c6-356b-4e5b-82f0-d2f9534c1f1b)(content(Whitespace\" \ + ab6896bb-2497-446d-b78f-93715ac3ece3)(content(Whitespace\" \ \"))))(Tile((id \ - 0389bee6-2ab8-4792-a69a-821b4f610819)(label(xs))(mold((out \ + 61114584-396d-47e1-a8ea-6e2a07c339b1)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 200c3e5d-86cd-4317-983e-fa56aaab1870)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e44bb1a9-af82-438c-bd25-08eb88f89a2d)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 8c491cf7-cfe0-473b-b5cb-80449f7a5f8a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ee94962a-3ee1-469d-9e60-52701767b73e)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 28c01c20-ac76-400e-ac3f-327a19705d0e)(content(Whitespace\" \ + e715caf4-6f62-43e5-b0d4-45f1dec0bd3a)(content(Whitespace\" \ \"))))(Tile((id \ - 470c6bd2-f5fc-4523-8a8a-3e77d2ae7466)(label([]))(mold((out \ + 172e8228-5f1f-4015-bdbf-7d144688d4d3)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1dd29e31-4b83-47aa-a6e0-0e5629837f2e)(content(Whitespace\" \ + 10112e67-fab2-4869-beae-eb775838ad96)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a2b392fb-58d6-4ae9-850f-7278730f70d1)(content(Whitespace\" \ + c06b70fb-c52b-409e-9d5e-b09bc9061957)(content(Whitespace\" \ \"))))(Tile((id \ - d77b6106-b354-4c67-bccb-4e91e2f4a9df)(label(false))(mold((out \ + a297852c-8da5-4a68-b33d-3ebb4e711b32)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6532c791-0e40-41c6-8bb3-5816c36a1919)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1cc4d6e3-777a-44c3-bde5-35748d34caad)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 1e7df1ac-e4bf-4ea5-880d-a1fc91fb3df9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0381d58e-e1be-41c0-afc4-c646ba4cea13)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f2709538-ddb1-4c95-a2d4-04f93bcd8825)(content(Whitespace\" \ + ae39b155-4b25-4753-9679-a2f8dd92dd4e)(content(Whitespace\" \ \"))))(Tile((id \ - c3dda5a5-bf3c-4312-921b-2c15dfd824db)(label(hd))(mold((out \ + fef72379-1891-4ed5-98ac-8870f3d5672e)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e14d689e-6556-4bbc-a7a9-7e57e71e4f6a)(label(::))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 6))(sort \ - Pat))((shape(Concave 6))(sort \ + 82e1bde5-1844-43b1-817d-6da622b491ef)(label(::))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 7))(sort \ + Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - aae8d9a7-16f3-4a05-b3c9-2cf987bce74f)(label([]))(mold((out \ + b6b62a20-19d2-4c0c-beda-6f3630e19aef)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 894e780d-dffe-46bc-9d20-1f46b3d20f22)(content(Whitespace\" \ + 7a2f3d55-f1a1-4e15-a4ad-2c3f878ea5bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 22c0fd84-c1e7-4c44-8d24-32d783b04658)(content(Whitespace\" \ + 1fdc766e-bfd4-4b86-9d17-a5320393c483)(content(Whitespace\" \ \"))))(Tile((id \ - aa21c0b5-6f37-4332-bea8-ce5f16b8b1b0)(label(false))(mold((out \ + d48b1b6b-49b2-4dc6-bd7c-c68558c31f39)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - eab907d2-1671-47b7-a390-850ad7261f77)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3e3d0450-5fa6-457a-9ec0-0a3673c9edfb)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 4bb80334-d4d6-4144-a1e9-c5d01f79992c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fcb2b6a4-b42c-41cf-abc1-e2f591127a5e)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 930b7c09-b500-482f-a897-2046cc8df242)(content(Whitespace\" \ + c1b4b792-3320-40a7-a344-c36e4ece5547)(content(Whitespace\" \ \"))))(Tile((id \ - 7001fdd3-9677-4c8e-8aee-8584ad908830)(label(a))(mold((out \ + 0dffed9e-8c5a-4f20-9593-5ed2b3b6e098)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d26ed733-a684-4163-9df2-13070819d911)(label(::))(mold((out \ + 76d09798-95e3-4eb1-bce0-0893c20affc9)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - b38f41fa-3940-4c03-91ad-6835f8b61c55)(label(b))(mold((out \ + 096fc5ea-8edb-4477-acef-94494547572c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 01869da0-f0c2-4280-92cf-9006f82beaf7)(label(::))(mold((out \ + 84a9903c-85da-4189-92c3-d197e2f8c129)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - acfc3a3a-6e41-498a-8c13-ea99fc347d7e)(label([]))(mold((out \ + 6591af55-627f-472c-8084-7ac8e907bfbd)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0dab81fa-5f4e-402b-a32f-f536b7919b90)(content(Whitespace\" \ + f87c5a19-6b79-4ee5-ace8-4d4e93c15434)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0e6808c3-004e-4a9c-8de2-dfa7d8cc2983)(content(Whitespace\" \ + 0e43ca25-27b0-4e36-8452-1fd8b0d6ccfd)(content(Whitespace\" \ \"))))(Tile((id \ - 5f515da4-5076-436a-bcc6-3f7eafb1ec57)(label(true))(mold((out \ + 72eae270-a56d-4317-bde9-a5b239847fa4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e9889fed-8b2a-4c88-ab41-a5090959af3a)(content(Whitespace\" \ + 1b4a0627-0dfb-4250-875d-5e2ea4c76d93)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0a9ebdff-d44d-4119-862f-c091c6b53021)(content(Whitespace\" \ \"))))(Secondary((id \ - e26de303-8012-41b2-b4ea-220f9af7ea76)(content(Whitespace\" \ + ad86bbb7-a01c-4f11-b5ab-850b7443478f)(content(Whitespace\" \ \"))))(Secondary((id \ - 91c4cba3-5758-4231-8a47-289da8a1df17)(content(Whitespace\" \ + 728bd775-a04a-4996-82db-14d0063e5484)(content(Whitespace\" \ \"))))(Secondary((id \ - 8cade609-6be5-4ee9-9b21-4447c6ef69c4)(content(Whitespace\" \ + f00c237d-e252-4bf8-acbf-81597ebb43ee)(content(Whitespace\" \ \"))))(Secondary((id \ - 9c89af83-7b53-4adb-8cb7-0907b7734acd)(content(Whitespace\" \ + d396619d-b0f3-4658-aabb-20eff2711b1c)(content(Whitespace\" \ \"))))(Secondary((id \ - ba102ddc-ef92-487c-b01f-3e1dc2efa6c2)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 33dd8e04-138e-4c10-a0d3-21170aac493f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - d74ffc8b-d059-4d7a-9e68-c03ea87db97d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 325d816c-fcaf-4734-a327-3c7e241b7d9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 272ef5a0-043b-451d-a6e4-3f18571d2c60)(content(Comment\"# \ + c7061897-d719-4324-aed0-d346375208e4)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + aa81fa04-be69-489f-8cc9-5e24de0a2b37)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7b8c6501-061a-45ca-b5e8-567ba1f05a46)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 403ac47b-6c44-4358-b411-8262cd8c0802)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e65d812b-0af1-4304-b8fa-82dfe3a3262d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7bee704a-13a2-4a15-a660-af528b4be341)(content(Comment\"# \ Strings #\"))))(Secondary((id \ - 4d0dd9cb-c943-4384-a682-8884ac792b31)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 26109999-748a-492d-8991-dedcf22f3c8f)(label(let = \ + a5e32a63-6771-4f71-994e-e869976f67e3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8c0263d8-b54a-47b1-afdb-0a817f138eef)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4b4ec423-bdf0-4f77-9cff-633eca5eb8f6)(content(Whitespace\" \ + 0c1ee814-3742-447e-892d-4b1645a65393)(content(Whitespace\" \ \"))))(Tile((id \ - 8f2bf699-8a6e-4a4a-acce-4a801b081fc5)(label(string_lits))(mold((out \ + 8925003e-2211-4717-a1bf-bcbdfe10a58a)(label(string_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 76fa4320-9686-418b-bae1-2e16981ef6df)(content(Whitespace\" \ + 48bf7fd9-bd44-49b4-8da6-2ad93dcf151d)(content(Whitespace\" \ \")))))((Secondary((id \ - dc5fbac0-a612-4966-b776-a5b222ee2837)(content(Whitespace\" \ + 8772d654-da64-4733-b8a9-0730f34e712b)(content(Whitespace\" \ \"))))(Tile((id \ - eb0ff38c-7c16-49f9-9547-019753f2f677)(label(\"\\\"Hello, \ + fc91326c-d05a-465a-bcfd-d7b00e5afde4)(label(\"\\\"Hello, \ world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4561c14d-dc9c-4e62-9c83-2258ba03da27)(content(Whitespace\" \ + b66027f1-da3d-4608-8631-6752bd979e55)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8387e074-4d46-46a6-a37c-d10aab222c02)(content(Whitespace\" \ + c0a24264-58ce-4225-87ef-1425dfdf93bb)(content(Whitespace\" \ \"))))(Secondary((id \ - a6f7d9a5-1f93-42a7-9365-fb6f3beb8c74)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d573bc1e-fc6e-4c9b-bd47-b21d74a42b50)(label(let = \ + c8160c97-0a5f-49da-ad8d-f0e415edd667)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + acc3caab-535c-43b5-aea1-267854239d04)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0a7aab63-f372-4baf-863a-99f536c5764c)(content(Whitespace\" \ + b2aaedd0-8b43-4df0-a7fd-0281de61f5ac)(content(Whitespace\" \ \"))))(Tile((id \ - 41148c0d-9e2b-49b5-be97-c798c36ec89a)(label(string_equality))(mold((out \ + 41e4d6f2-1feb-4d75-985e-4364edb393da)(label(string_equality))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fdbb6a30-47a8-4665-bd2b-709aad04126a)(content(Whitespace\" \ + 5a4df080-cec7-466a-b92c-17461e09537d)(content(Whitespace\" \ \")))))((Secondary((id \ - bfb84ac4-7973-473c-b655-71b846366ae4)(content(Whitespace\" \ + e41377be-5871-495c-8320-44100227eb79)(content(Whitespace\" \ \"))))(Tile((id \ - d2e0ac51-b1d5-47c5-9d9e-28671583db5c)(label(string_lits))(mold((out \ + aa95e8fa-3522-40a4-b538-d220ed12a43b)(label(string_lits))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c14d9212-5436-4359-aed1-4c12bc651145)(content(Whitespace\" \ - \"))))(Tile((id \ - 479deac9-99cd-44c2-afd7-83aa87dc31c3)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 47d00621-8d14-4414-b27f-fd4f2025a730)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 92d22bfe-5056-482f-ad46-5ed1c4787fa1)(content(Whitespace\" \ + 3f96f271-c56c-4dd0-b88e-b8852ce1e87a)(content(Whitespace\" \ \"))))(Tile((id \ - dec5173c-0001-412c-acec-9d1dc2ca4424)(label(\"\\\"Hello, \ + d8d20dea-af08-4563-830f-49987bf06341)(label(\"\\\"Hello, \ world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 242b38cc-9ec3-496b-a61b-180d2dab6eee)(content(Whitespace\" \ + a898f91d-02f6-48af-a9e1-e039d5869012)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2fcdc646-7a16-44a7-bdbd-2db157c25c29)(content(Whitespace\" \ + b9973688-4124-4673-8c5e-a3ef91544eec)(content(Whitespace\" \ \"))))(Secondary((id \ - 0916a810-eeaa-4b3b-a5d3-3750e01e4ec9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3f1d1253-4e0e-4331-bf9c-180e141079b2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 29d208e1-0c45-44d2-9d94-99224e7b7bae)(content(Comment\"# \ + 15ebb15c-fd8e-4624-8164-c7d0d89d3bd2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ef774049-6ec6-4834-ae4e-08832df4f545)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dbfb25e8-3c71-49c0-a59d-3b398867b991)(content(Comment\"# \ Non-empty holes are the red dotted boxes around errors \ #\"))))(Secondary((id \ - 394efbca-78fe-4391-aed8-7cf3e9954cff)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5501da01-0362-43bd-90d2-2f73051ebd5d)(content(Comment\"# (you \ + 1150289f-f572-4e0b-b3cd-01ebfac3a275)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d2572e03-8fc5-4f7c-b7f7-49fed01c97d8)(content(Comment\"# (you \ can still run programs with non-empty holes) \ #\"))))(Secondary((id \ - 83366e95-3f7a-43c0-b6dd-b8b856c15bff)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8ff64362-463c-4a28-b9fb-c5874d923bb7)(label(let = \ + 5aadfc73-f992-4bea-b355-9126214ac989)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8219d8c4-5f37-4ef0-960d-fa75c3d2ec87)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 907bcaba-6a39-4298-be9c-a9933d6bb965)(content(Whitespace\" \ + a98b03ec-1538-4e75-b8cc-207487161e7c)(content(Whitespace\" \ \"))))(Tile((id \ - e3cc5308-0a4a-486b-8505-50d4759fadea)(label(non_empty_hole))(mold((out \ + d858df75-3a34-486e-b72a-d08ad7392747)(label(non_empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3869b181-7c6a-4947-8188-34ac4be2e935)(content(Whitespace\" \ + 71b0606d-ef0a-4b4f-b684-b8f80a3c4008)(content(Whitespace\" \ \"))))(Tile((id \ - 6116797d-7f61-4299-8d03-b3b55489807f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 37b4333f-2f66-437b-b361-3103638ec779)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2c2c4658-b792-43a5-8414-1cb5aae4c7c1)(content(Whitespace\" \ + 3e2f5f44-7280-4b4f-a672-6ad218a0b3ea)(content(Whitespace\" \ \"))))(Tile((id \ - 3778ca66-6e86-4b5a-984e-de82e05a54e1)(label(Int))(mold((out \ + e891c29c-82a1-45ae-a46f-56722181b9f5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7406cf71-6145-4be2-80b9-c2a2a292175b)(content(Whitespace\" \ + 3667e4b9-a3fc-4bc2-91f0-b18344dcc416)(content(Whitespace\" \ \")))))((Secondary((id \ - 3d632ecf-da09-4334-8577-c8b9ede604d0)(content(Whitespace\" \ + 5f9c084f-3b60-4349-9c0c-6717e55196a2)(content(Whitespace\" \ \"))))(Tile((id \ - f5fb9f60-65fd-4b86-ac03-f79a42e79876)(label(true))(mold((out \ + 3719e033-5a92-49af-af58-00db95a5f9b4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d9032067-95b2-4bc6-8813-402fb0516108)(content(Whitespace\" \ + 8d2a6018-b8c7-4467-b795-f56887d12a72)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1add6c79-d411-4ab9-b51d-581ef672ed1d)(content(Whitespace\" \ + 6263312c-d39d-42ac-8d07-a2006f2fb796)(content(Whitespace\" \ \"))))(Secondary((id \ - efe99dcd-cd32-4bd1-ba0a-32508d520ddf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 96260b30-8ae6-454d-8da1-c532a1efa904)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 376a24fd-5524-4558-902c-6fc859f4e3b0)(content(Comment\"# \ + 7baf7185-1ab2-4629-8007-a5f18a37987e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ffe73154-cb0c-4831-8ded-40f751b90f46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2f56fc27-0454-4deb-8b46-4e88da142228)(content(Comment\"# \ Tests, separated by semicolons #\"))))(Secondary((id \ - aa070fd5-bc99-4e35-bf85-988cf2e6f881)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25740099-dda9-4234-9886-803c1d4d51af)(label(test \ + 06a90f0a-b270-4129-8034-15f6232aa6b3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 904e69db-9c25-4b3b-9eb7-493a02c43833)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e86c5199-a0ce-4e44-9ad3-692c435fe93d)(content(Whitespace\" \ + 92b8b6a9-d85e-462f-83fd-3b7b99f47759)(content(Whitespace\" \ \"))))(Tile((id \ - d6db200b-52b4-4ed8-925f-579fdf8b2c6d)(label(2))(mold((out \ + 6ba10739-7b1f-42a6-a59c-e26baf8dd72d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5f310898-295b-4f16-9d11-b01123b2ea2c)(content(Whitespace\" \ + 92b10a5f-10dd-4fb9-b331-3093648a21b6)(content(Whitespace\" \ \"))))(Tile((id \ - 1e38b972-1809-4feb-8c1c-4f67d652d375)(label(+))(mold((out \ + f2c3a472-7375-4132-ac6a-c324581769fa)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8ed6c237-4bd0-412a-971c-dcf07e161f93)(content(Whitespace\" \ + 9cb28d14-40a7-4e81-855a-7b529eb625a0)(content(Whitespace\" \ \"))))(Tile((id \ - 3ac3b7c8-a4ff-4f33-bfa2-d218822fcd19)(label(2))(mold((out \ + ea409a95-eea5-4910-8324-ed5714f75b2d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f572a698-4a16-4dbf-a54d-6e6945297665)(content(Whitespace\" \ + 2484c636-67fe-4456-bb6d-282501e749a8)(content(Whitespace\" \ \"))))(Tile((id \ - 132cb08f-c280-42b5-b6fd-c1e85d17ec5c)(label(==))(mold((out \ + bbf3d68c-33f3-41cc-b052-0b48546901a7)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 709f0d1f-d997-42e8-bb16-23abf054df5f)(content(Whitespace\" \ + 9f0c0f3f-4ed7-464a-b7ec-aa8ead9ac23e)(content(Whitespace\" \ \"))))(Tile((id \ - bafddf28-368f-4c9b-9759-a5e16424a41d)(label(4))(mold((out \ + e79abd45-bb9f-46df-816d-3b7ed16dff05)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - eba3a299-0151-4d0e-b13d-0d61577a6733)(content(Whitespace\" \ + 67dc90fe-a61f-4cb4-93f9-700a7a27bc65)(content(Whitespace\" \ \")))))))))(Tile((id \ - 607a9a2f-36fd-416b-8f2a-0dcd654a3f56)(label(\";\"))(mold((out \ + 662a1c6a-1d31-4e78-9fd6-38b5b1a3c0f7)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3a0443fb-e5e5-4675-a280-c675d359ed87)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cb3e52f3-b846-49c6-813f-2066ca14e149)(label(test \ + 0fe5c6ce-e1c8-4d6e-a560-3cbe559456df)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 85274d61-ed44-4983-abe5-d0a03b47ed5f)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a51bf06d-4934-4799-ac2e-a4652aaaafe7)(content(Whitespace\" \ + 86daf904-3cc3-4971-b5a8-66eec2914529)(content(Whitespace\" \ \"))))(Tile((id \ - f2c74fe8-2500-4886-a23e-5a5d5155ae8b)(label(3))(mold((out \ + a0999ad1-b867-4ce1-8a66-08da484da2da)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 09d392c0-e2cc-4307-89d7-0483627378b7)(content(Whitespace\" \ + da29b816-718e-48cb-88f9-752c2c81b76a)(content(Whitespace\" \ \"))))(Tile((id \ - b85776e4-f63f-49a1-9b09-77c013375af7)(label(+))(mold((out \ + 6a8b5ee0-9ab5-4e89-8685-81530747737b)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a4c131e0-fc31-4fcb-aa84-b16c046436ee)(content(Whitespace\" \ + 0f9aaf29-b47f-4bc9-b270-ef715d958cca)(content(Whitespace\" \ \"))))(Tile((id \ - 18d3169f-ed3f-4138-b5b9-9610e304c013)(label(3))(mold((out \ + 04b8673e-684b-4185-aa7f-afbbb75dddca)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0b7c6984-8436-4b21-8258-c37dd6be30f2)(content(Whitespace\" \ + 7175f62f-3350-41a3-a0a6-3d0ddff8303a)(content(Whitespace\" \ \"))))(Tile((id \ - c63b9193-5ad3-4d09-8187-b9b13b9a5210)(label(==))(mold((out \ + 771a1d48-bfb8-4f29-bf8d-7fddec05c082)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - be000067-f14a-4cf6-a64a-384a94fa32ac)(content(Whitespace\" \ + 403be677-9607-4b23-be90-744b0596f92e)(content(Whitespace\" \ \"))))(Tile((id \ - 005342e2-5425-4530-b074-13babb8f58df)(label(6))(mold((out \ + 35b18d42-659a-4bce-be59-3dbda20af1ff)(label(6))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 12cf1b4d-dcf5-4070-a839-a70b836df238)(content(Whitespace\" \ + 2fc92cf8-325d-4fe9-ad50-9c6904cb68a7)(content(Whitespace\" \ \")))))))))(Tile((id \ - 6dce00b6-58ad-4711-922d-182cb8ae2b7c)(label(\";\"))(mold((out \ + 63dde1c8-8ac9-4e57-ab67-5e7143951467)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3f85c74f-7e59-4d18-ab32-2fc003551cae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 69c51fcc-36be-4bc1-a336-cfea114e8780)(label(test \ + cdd24170-c018-40c0-8568-7c3ea363d891)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e0fc80a7-0bd6-4a03-acea-796b58bf874d)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 45576ba4-4586-4df3-888d-3bfef94972be)(content(Whitespace\" \ + 28a3eb3c-dd85-4023-9a7c-8d11f6893206)(content(Whitespace\" \ \"))))(Tile((id \ - ea9e7253-a352-4836-881f-0127b1c871b8)(label(2))(mold((out \ + 91e3bec3-5ee3-4956-84ed-113192c30864)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f3e14f9e-507a-4d26-a2df-78c11523af0a)(content(Whitespace\" \ + d5751869-55ed-4c28-a36f-9461ff0554c6)(content(Whitespace\" \ \"))))(Tile((id \ - becaa096-cb19-4568-9e9a-5863d1ae1c96)(label(+))(mold((out \ + f225e347-5438-4ab0-a58f-bd00b59f679f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c450606e-1ef4-4fbb-9773-d9566f54d260)(content(Whitespace\" \ + b5a4975d-2fff-4057-a9a2-2592a7ec5b6b)(content(Whitespace\" \ \"))))(Tile((id \ - 60e938aa-3416-4c33-81a8-25f37ef306d9)(label(2))(mold((out \ + 809ec60c-009e-44d6-a948-3aea61af107b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cd32360c-d3f4-430d-8ad2-5dbd660e8158)(content(Whitespace\" \ + 59f403bd-7a53-437a-a9d6-598bb0461f34)(content(Whitespace\" \ \"))))(Tile((id \ - ac66d29d-6f93-47a8-872c-b26ae92463a4)(label(==))(mold((out \ + d64d7e3b-93a8-4cfe-b86c-07fc48bae361)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f58eeaed-a321-4813-a71a-d99e1684c500)(content(Whitespace\" \ + 978896ef-6144-47ab-9906-462dae60f3b9)(content(Whitespace\" \ \"))))(Tile((id \ - ee4b755a-2962-4a97-9b71-1fa874175270)(label(5))(mold((out \ + 07622747-4cb2-4b9f-889c-814bdda0324a)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0efd8178-50ee-47dc-9f5d-f6f503733d3e)(content(Whitespace\" \ + f0dead5f-559a-4fce-8e99-8a7bd3ff0a15)(content(Whitespace\" \ \")))))))))(Tile((id \ - 01eef806-3025-4681-841a-138b95f6f827)(label(\";\"))(mold((out \ + 41fe7536-0558-4e31-ae89-99912d8c0e35)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f59bc277-d399-48e3-8d1b-72164b9e13bb)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 446ce379-8fef-47e5-85d4-f7d3fc16dd6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 31a81066-ecfa-49ce-a762-34904947da99)(label(2))(mold((out \ + 34cee36a-1440-48b8-ad17-0345717c2ccf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 531c1852-0a55-4040-9dc5-e6fc066f9bd6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2a5b322d-af8f-46da-88df-83982679ca2a)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 77d8a251-42c9-4631-a941-094827a503c4)(content(Whitespace\" \ + 730a459b-583a-4df8-a18f-638f9640ee02)(content(Whitespace\" \ \"))))(Tile((id \ - 546b42b3-2f6a-4f08-9e69-854b8e88b1be)(label(+))(mold((out \ + ff46a198-f107-4600-b4cd-c496a9402d4a)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 28d8c0a0-4515-4637-98ca-22e78630cf20)(content(Whitespace\" \ + 7e9267be-355d-44b1-b1ae-b070d4a8d311)(content(Whitespace\" \ \"))))(Tile((id \ - 09d04b4d-2f29-4aef-a73b-badd00299b3b)(label(2))(mold((out \ + e0c3e704-14d6-4ef3-93d6-c8b49b9ce406)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer))"; + Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Outer)(projectors()))"; backup_text = "# Hazel Language Quick Reference #\n\n\ # Empty holes stand for missing expressions, patterns, or \ types #\n\ - let empty_hole = in\n\n\ + let empty_hole = in\n\n\ # Integers #\n\ let int_lits : Int = 1 in\n\ let negation = -1 in\n\ @@ -10483,8 +10684,8 @@ let startup : PersistentData.t = let booleans : (Bool, Bool) = (true, false) in\n\ let conditionals =\n\ let (x, y) = (2 + 2, 3 + 3) in\n\ - if y > x then 1\n\ - else 2\n\ + if y > x then 1 \n\ + else 2 \n\ in\n\n\ # Tuples #\n\ let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, 3)) \ @@ -10492,13 +10693,13 @@ let startup : PersistentData.t = let (a, b, (c, d)) = tuples in\n\n\ # Functions #\n\ let y : (Int, Int, Int) -> Int =\n\ - fun (m, x, b) -> m * x + b\n\ + fun (m, x, b) -> m * x + b \n\ in\n\n\ # Recursive Functions (arrow type annotation required) #\n\ let double_recursively : Int -> Int =\n\ fun n ->\n\ - if n == 0 then 0\n\ - else double_recursively(n - 1) + 2\n\ + if n == 0 then 0 \n\ + else double_recursively(n - 1) + 2 \n\ in\n\n\ # Mutual Recursion (bind tuples of functions) #\n\ let (even : Int -> Bool, odd : Int -> Bool) = \n\ @@ -10512,20 +10713,20 @@ let startup : PersistentData.t = fun xs ->\n\ case xs\n\ | [] => 0\n\ - | hd::tl => 1 + length(tl) \n\ - end\n\ + | hd::tl => 1 + length(tl) \n\ + end \n\ in\n\ let has_at_least_two_elements : [Int] -> Bool =\n\ fun xs ->\n\ case xs\n\ | [] => false\n\ | hd::[] => false\n\ - | a::b::[] => true \n\ - end\n\ + | a::b::[] => true \n\ + end \n\ in\n\n\ # Strings #\n\ let string_lits = \"Hello, world!\" in \n\ - let string_equality = string_lits $== \"Hello, world!\" in \n\n\ + let string_equality = string_lits$== \"Hello, world!\" in \n\n\ # Non-empty holes are the red dotted boxes around errors #\n\ # (you can still run programs with non-empty holes) #\n\ let non_empty_hole : Int = true in \n\n\ @@ -10539,1856 +10740,1904 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - c2890a35-b3f1-4653-9767-8d5f9752ead5)(content(Comment\"# \ + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 5712047c-e3e9-423a-8beb-0aebc3fe726b)(content(Comment\"# \ Internal Regression Tests: Type errors #\"))))(Secondary((id \ - 090c5ddf-5c26-4a14-a1b9-eab92cb073c4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5a4d6644-ce5b-4818-a4c6-2905ca7b9d43)(content(Comment\"# Each \ + 25719d37-0273-4700-881d-7c4acd6022d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3f46cd29-760e-4905-94fe-4506288eddc3)(content(Comment\"# Each \ line should show errors or not as indicated \ #\"))))(Secondary((id \ - 49670809-d955-4be4-8de7-a13e0c26ec98)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8b8ae6b5-2df0-42a9-a2e7-d53e2e0517fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d69298b9-16ce-48c6-a813-04d4c6acbb6f)(label(let = \ + 32c06278-527f-401c-a578-2716aa5fceaf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4ce27d7e-c0b7-4fb6-877c-7292df539be7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f0e2ffd2-da15-4b6b-abe6-ec495dab317d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 87784971-c398-4a3f-9537-9a2eba847372)(content(Whitespace\" \ + aa13ed8d-bea8-43ee-a690-aa94ce388682)(content(Whitespace\" \ \"))))(Tile((id \ - 9cc5b09c-65a4-4a8e-853d-62d8f15d4e24)(label(_))(mold((out \ + 1d0b122b-b380-480b-9330-64f5325fd001)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1e775429-5e8e-4b11-b66c-9cc3c1324739)(content(Whitespace\" \ + 405e2e5b-a21b-41ca-bb59-346149d30734)(content(Whitespace\" \ \")))))((Secondary((id \ - 04d76c28-7577-41c5-964a-fc54eeae9062)(content(Whitespace\" \ + 4275838b-3c79-4354-95a6-2fcadad57470)(content(Whitespace\" \ \"))))(Tile((id \ - 51f991bb-2c1f-435a-920a-a20148cbc2dd)(label(unbound))(mold((out \ + 27b78966-64bc-4811-a6f9-526911238d99)(label(unbound))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bf68d8ff-145a-4e77-a735-120746818a4b)(content(Whitespace\" \ + 06b267af-ec90-430c-a3b4-ee1cc6794d10)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4491f5f7-9ada-4420-acb7-fa9e6ec73fe9)(content(Whitespace\" \ + 8c6c8c81-5e58-4ef1-a605-adbb9407a432)(content(Whitespace\" \ \"))))(Secondary((id \ - 474b7d65-a3a0-4c3e-b0f8-cf2a0ad43887)(content(Comment \ + d6a91700-d69d-4e2d-a68e-700ed6f3fa65)(content(Comment \ #err#))))(Secondary((id \ - ffe1df31-0a25-4513-97c2-c36fc135468b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ff782a2c-aef7-4a7d-9ae0-848429b11fbd)(label(let = \ + 2da41d52-07bc-4009-a722-a3500331fac5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 68ad8ccb-bc82-4d52-af0b-5757c4c262f3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e2eca969-e0a4-4a91-a89e-878e09aec2f6)(content(Whitespace\" \ + 5ffdba6c-5cba-4a1b-8f4c-1d3020d92903)(content(Whitespace\" \ \"))))(Tile((id \ - 3c035ee1-6d4f-47fc-a76f-94f51898e718)(label(Undefined))(mold((out \ + 0cdca946-8d67-482c-b6fa-7acadb320fb3)(label(Undefined))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dc02b1d3-06fa-4b3e-aa76-9766d01c3bc2)(content(Whitespace\" \ + dc3a8db5-2218-4195-afc8-00aa9528f12e)(content(Whitespace\" \ \")))))((Secondary((id \ - 1d42290f-3641-4c65-a280-94551377a573)(content(Whitespace\" \ + 672b8800-98dc-43e8-bfdc-6f64df812aae)(content(Whitespace\" \ \"))))(Tile((id \ - 0b3c4696-05af-4c34-8ab1-515fbae5550f)(label(Undefined))(mold((out \ + bcaacef9-88fd-42f5-bdf8-1a43d8a643ac)(label(Undefined))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b56b3924-e775-41ca-9e61-ac4112c6d40b)(content(Whitespace\" \ + 800f279c-c746-451a-90c9-23ba68c220c1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c2c7deac-19e5-41d8-9cc2-fe9e73a29960)(content(Whitespace\" \ + 24478bb1-1b05-4dc9-8c09-4f616970d524)(content(Whitespace\" \ \"))))(Secondary((id \ - fec4e3ce-5421-40fb-96fa-8474e5a9fab3)(content(Comment\"# 2x \ + 83368d83-fc88-4e9d-a9bc-708a98365791)(content(Comment\"# 2x \ err#\"))))(Secondary((id \ - 02f65251-ccbd-4e70-b60e-cbe1e13adc6c)(content(Whitespace\" \ + e6117b93-e112-4bfc-ad2a-e33e79d434f2)(content(Whitespace\" \ \"))))(Secondary((id \ - cadfcea7-7c09-433f-8e03-df9e89dfd9e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c52236e-4a4a-4b7e-b318-84bd95c543ed)(label(let = \ + f39c5ab6-4780-4d5b-b3f4-8ff33e020ce9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3f73c81c-66e0-4afe-9e22-fdfc4f6f5c59)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 557dc615-9e1c-4a9e-a00f-15234e53a953)(content(Whitespace\" \ + 7cba5e83-2e6e-48bc-85be-c53200abe117)(content(Whitespace\" \ \"))))(Tile((id \ - 13897887-613e-408c-b120-59b8666fc0b6)(label(true))(mold((out \ + 8c9d41ee-131c-406f-a65b-9158f2ff5704)(label(true))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 34fd4c5a-2433-40a8-9ded-9c6500142356)(content(Whitespace\" \ + ba9bd158-5bb2-48a7-8596-d4c4a1e9062a)(content(Whitespace\" \ \")))))((Secondary((id \ - 83207004-3161-4071-a526-cf9459533d67)(content(Whitespace\" \ + b4cc383a-2331-4045-8eba-57de9423ca68)(content(Whitespace\" \ \"))))(Tile((id \ - 2f5a444b-0006-47ac-bd94-14c9ffd80548)(label(2))(mold((out \ + e3572e3b-2096-43ca-8ef6-1170c0401778)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 503d2940-fcd4-4a54-879d-81d129596ad1)(content(Whitespace\" \ + 48d5f6ee-ebf0-4b3f-8571-26259982c05f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e425406e-6252-47b9-8a4c-c8870d3c1376)(content(Whitespace\" \ + 34b71af6-4d47-42a1-a334-26143b01ce4d)(content(Whitespace\" \ \"))))(Secondary((id \ - 13255468-04e2-4816-9461-74dce40c9b27)(content(Comment \ + b37eaa85-ad06-4b39-9219-2f5d38f8bbef)(content(Comment \ #err#))))(Secondary((id \ - 9d763cf1-1e07-4c47-b8ef-2b6435de5a49)(content(Whitespace\" \ + 4b3a8054-ec88-40f2-938b-585ad4dc7ef9)(content(Whitespace\" \ \"))))(Secondary((id \ - d2541b33-1f10-4474-9939-cd2e164493c2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 26b81a4e-e0a8-4a8b-8b59-e0278cb81758)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f412044b-ae99-40e1-ac43-a8785e7a2ce1)(label(let = \ + a0e8ad90-fa46-4d6d-a834-8cbed02e24e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 56dc81bb-3a37-434d-a488-408d8a90480c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4139997f-e29b-470f-ad5c-8192ada59d2c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 96732395-1218-4909-b454-484f2dc33583)(content(Whitespace\" \ - \"))))(Grout((id fdd65dce-3851-4173-8c0d-a8ac07ced2b6)(shape \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Grout((id \ + 81e178c8-13fe-4b3d-bb5f-ef85dc332141)(shape \ Convex)))(Secondary((id \ - 3dae5dc2-012e-4f8a-b54a-3562c4f88afc)(content(Whitespace\" \ + 787f1759-c418-496d-87a7-d34b2538e547)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4be76a6c-6c31-4491-9c61-9193e50c76cd)(content(Whitespace\" \ + \"))))(Secondary((id \ + 18c743c2-9e88-4d16-b9dd-451738c94506)(content(Whitespace\" \ \")))))((Secondary((id \ - ba4613e8-5288-4f23-a6d1-7e3206f398d6)(content(Whitespace\" \ + b6b53f3c-8d88-41f2-b691-81356e9caf10)(content(Whitespace\" \ \"))))(Tile((id \ - c873fdfc-ead5-4cab-bbf9-f319e65eb545)(label(if then \ + ea3377fe-5dff-4099-8941-a0c3e9a42302)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4fc68723-e8b9-4d8e-ac28-3066739c26f9)(content(Whitespace\" \ + eb847401-b2b9-4f71-a1f2-751c8f108c05)(content(Whitespace\" \ \"))))(Tile((id \ - f36c50b4-776a-44c5-b033-a70e463f1813)(label(true))(mold((out \ + 25f30b02-01ae-47ba-b6e8-02b911fdecde)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 537690ac-06c0-4b1d-84c1-6d4acc73e474)(content(Whitespace\" \ + de7806f1-0b43-45aa-8951-e45375fecad2)(content(Whitespace\" \ \")))))((Secondary((id \ - a1d0648d-8c62-4713-b170-bc7db0c20504)(content(Whitespace\" \ + f3b59ecd-35b3-4274-a7df-79b156faaa6a)(content(Whitespace\" \ \"))))(Tile((id \ - 5247456c-6550-4072-8cc9-980f61c699d1)(label(1))(mold((out \ + c27ec555-e326-4bde-ab25-3dd3355dedbe)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2acd1b5f-7510-4a74-a56f-36267b0a512b)(content(Whitespace\" \ + 2e2197b6-53f6-42d8-a3ae-7011bc6b2abf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7616aa0a-4eeb-4db8-865f-5b61dc1263b8)(content(Whitespace\" \ + 35152296-da76-43e0-94c3-20a06ab1b3dd)(content(Whitespace\" \ \"))))(Tile((id \ - 81bfcb19-79c1-4bf5-b34c-3dcc7cfd192c)(label(1.))(mold((out \ + 582810a0-0e74-4d0c-a1cf-bb10faa58767)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4b260629-7c2f-4a27-9081-844c47be8ff3)(content(Whitespace\" \ + 0d18a455-f393-4745-b53a-a6d2e6331123)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c71f0361-b8aa-41a1-8b35-ac1d81df2bda)(content(Whitespace\" \ + e8ed879d-e20a-4c70-906a-c45add361d52)(content(Whitespace\" \ \"))))(Secondary((id \ - abe0800b-ccae-4935-b9f1-0db885b79a53)(content(Comment \ + 71e51842-f9e5-4994-a4b6-0eb98a8ce5ca)(content(Comment \ #err#))))(Secondary((id \ - a6632e31-7765-49e2-8b18-3359f88183b2)(content(Whitespace\" \ + f572c713-8320-4f17-b6c6-44195ad110c0)(content(Whitespace\" \ \"))))(Secondary((id \ - 890064f6-db5c-48da-b11e-79a014c051cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9c0e9437-19f4-4071-aada-9b464e0479f2)(label(let = \ + eb088086-86cf-403b-8762-8815af11720f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 95eaaf07-fe37-4d7b-bb74-e42351200292)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d821f513-71c8-47e0-91f0-012fd7269dd2)(content(Whitespace\" \ + 0cbd0477-9715-4108-a4a0-b2ca392619c2)(content(Whitespace\" \ \"))))(Tile((id \ - 81c8a5e4-c8b9-444b-b66b-29dd2bd98f39)(label(_))(mold((out \ + a141468e-25dc-4477-9423-dfb4088d86a6)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 955b5d47-5dfe-4140-8ebe-f1cdb5d166df)(content(Whitespace\" \ + e4b56ad4-fa72-4093-b3ac-7fad3c8c9582)(content(Whitespace\" \ \")))))((Secondary((id \ - 60ba9fd8-2ae1-4031-aab1-0d31582db521)(content(Whitespace\" \ + 4b1f62f8-c221-4910-8bdb-a098bd445b5a)(content(Whitespace\" \ \"))))(Tile((id \ - 09d1e608-b3e5-43c8-b5bd-f3986790dd19)(label(if then \ + 48ce6f57-43d1-4b0e-b07c-65b697616db7)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d0d97c16-df70-43e7-8c19-4b2618e3df63)(content(Whitespace\" \ + f1b65c28-8fa1-437b-ac2c-684e419aff56)(content(Whitespace\" \ \"))))(Tile((id \ - 67304d61-8d7a-4779-84f0-e4d60a495118)(label(true))(mold((out \ + ad360c56-4354-4e12-bb94-28f601754f49)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - da91c6a5-b71d-4e9b-8206-f9b83d98dd89)(content(Whitespace\" \ + 9618d989-7980-4b42-bc3f-e16002120eaa)(content(Whitespace\" \ \")))))((Secondary((id \ - 979e7fce-a579-46b9-995b-464e1d6d5210)(content(Whitespace\" \ + e8f6bb51-d59f-46b1-9dad-4fa37149115a)(content(Whitespace\" \ \"))))(Tile((id \ - 4728443e-07bd-46eb-a07a-876ab64a9b5f)(label(1))(mold((out \ + 38aa63e0-0ae9-4541-99bd-f041cdc6c339)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 317643ae-3383-413d-9708-f183ee4971f1)(content(Whitespace\" \ + 8c493809-9781-4988-bd1b-55a58d82dcbf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0dac4f18-67d7-4bca-acf1-50183a763e9d)(content(Whitespace\" \ + 72aba1da-8a3d-4f66-85e5-5f13f58a30ce)(content(Whitespace\" \ \"))))(Tile((id \ - 6e4f414a-719a-4eda-93c0-baab66a8296e)(label(1.))(mold((out \ + 94ffee3f-75cf-4f90-8b15-4b697df7c1f3)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2f303db8-f575-4235-8ccd-dca273aae20c)(content(Whitespace\" \ + 60912364-0046-42a6-95d7-fab576f1d771)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 526338c8-55fc-432a-9c0a-b9b6f877b413)(content(Whitespace\" \ + 7413cf5d-fc01-4c68-b44c-9d4d12a9268f)(content(Whitespace\" \ \"))))(Secondary((id \ - a9d1100b-abd6-4d20-be7d-a58c5ed507b5)(content(Comment \ + bcd6c603-a73d-4507-abd8-e948e64ce91d)(content(Comment \ #err#))))(Secondary((id \ - a3580f56-6d80-4396-9869-c50ee7735d62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 50e8b8e5-6ce5-4536-bda6-3ddf728ea643)(label(let = \ + 895c28e6-d5f8-4c85-9e1c-d5245e8680b4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bdeff1bb-a57e-4c8e-b99b-392c49d76796)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a5e847c7-5a2d-400b-8328-943165b1db2b)(content(Whitespace\" \ + 31f83bec-123f-466f-a9f6-5dca6f2439a9)(content(Whitespace\" \ \"))))(Tile((id \ - a4e3d9e1-8d16-4e74-b645-9e9c10b71d13)(label(_))(mold((out \ + bd32f355-a68a-496d-867a-25a2c90a19a2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fa1d3aa3-edea-4d2d-afed-e613ec30dab2)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2206d924-81b9-44b6-b725-f4a8e4aaa9e3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - a2bb9040-1c54-4168-9f49-8716cbc12dfd)(shape \ + b2b029ca-235d-4c68-9f5c-551c00c15263)(shape \ Convex)))(Secondary((id \ - ded9718d-58e0-44cf-83fd-1b6c5a46562d)(content(Whitespace\" \ + b4703344-736d-4172-9401-47bf1ee8ebd0)(content(Whitespace\" \ \"))))(Secondary((id \ - 5acbe062-4da5-47a8-a6c0-4f2ead2bbdb6)(content(Whitespace\" \ + 7d049859-f11a-4d7d-91bd-a7adef84d287)(content(Whitespace\" \ \"))))(Secondary((id \ - 36a49252-eb7f-4210-b283-24e08b053000)(content(Whitespace\" \ + cd86e243-ae10-470a-9eaa-1b83c6b55872)(content(Whitespace\" \ + \"))))(Secondary((id \ + f84fb626-3a33-4922-b065-e08a8a37117d)(content(Whitespace\" \ \")))))((Secondary((id \ - e648f5f6-a693-42fa-8995-b4a20961ba07)(content(Whitespace\" \ + 0d34a4c5-a931-4279-838b-482019c0e874)(content(Whitespace\" \ \"))))(Tile((id \ - 46b21c79-7191-46bf-94e9-4fb884c21526)(label(if then \ + 8617302f-39ee-4919-acd3-bf2922d3c93c)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7d306a94-ff74-4f62-be10-af0f06529c21)(content(Whitespace\" \ + e150d31d-c268-4ddf-aca3-138d0e4bd747)(content(Whitespace\" \ \"))))(Tile((id \ - 7276eb67-791c-48e7-94b2-240b9d7e3fe6)(label(true))(mold((out \ + fff3a735-69ab-4bbc-8632-b0ed3db5c9ff)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8ad575d3-bede-46e4-a4d7-f942c2aa8640)(content(Whitespace\" \ + 6721b83a-b411-4e09-a8c5-8646237ada59)(content(Whitespace\" \ \")))))((Secondary((id \ - b32b622a-da19-48f3-af59-95accf570e1f)(content(Whitespace\" \ + c8ed8259-036b-4e73-b652-9ba804395c7f)(content(Whitespace\" \ \"))))(Tile((id \ - 275151f6-414f-46ff-8927-653979248dc5)(label(1))(mold((out \ + 41e14ccc-3394-4f9b-a61b-01b07b437a36)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9ba58510-58c1-479a-a9f6-6a70a07df983)(content(Whitespace\" \ + fc429e49-6880-422d-8f71-d995e0461e89)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 78eed0fa-3bcb-41a4-b6e7-fa15bbf05d29)(content(Whitespace\" \ + 27f9cbfd-b512-44d3-9598-b62bd655bf80)(content(Whitespace\" \ \"))))(Tile((id \ - 5513e260-636a-402a-94c7-c2a8cce3d454)(label(1.))(mold((out \ + 9bc45941-5ba3-44c6-b58b-2fee074ab78f)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0ed17b54-7b3a-45d8-bd6e-1604f8af3da3)(content(Whitespace\" \ + aa7e6623-8871-4b3f-80c3-579518a6a719)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 72fe8d09-0a4c-4c0d-8ca0-50d5057a9eeb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d95a7a94-7e7d-4841-b9d1-fd772e2d80dd)(label(let = \ + 4798a663-83fb-48ae-97f3-d70b48cad698)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f23b9fa7-3c5f-4cb8-ba5c-b79394014ce5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d8e95474-b6f1-44e0-85a7-ed0cc7dbde42)(content(Whitespace\" \ + 646115c6-89a4-4d14-ae66-1ef90b802767)(content(Whitespace\" \ \"))))(Tile((id \ - 73906d81-9d17-41e3-9632-7bf31280bc99)(label(_))(mold((out \ + 28e7b10a-c889-43d6-91f1-6ac34348db13)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c556f619-c3cd-4aed-8ee2-92848aece57c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1a3d0d2f-4e56-4487-be1f-fd4c6c63bbc2)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 260c4a39-fa49-4a42-8ca5-f6bfd86d705c)(content(Whitespace\" \ + 52505bd0-bc21-40ea-ba59-00addb6b7ecf)(content(Whitespace\" \ \"))))(Tile((id \ - c3e638a7-2c00-4098-94cd-05563acab569)(label(Int))(mold((out \ + d12fe57b-d01b-4086-817a-17b19a60dac8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - cd497267-e360-4eb6-8b8e-7384fc549dbd)(content(Whitespace\" \ + 61b4003f-a837-439e-bed6-6c39295ee29f)(content(Whitespace\" \ \")))))((Secondary((id \ - d696e851-3001-4a34-ac58-cc213ab1f833)(content(Whitespace\" \ + 842cdbd7-8bfa-4218-850f-586fdf6af823)(content(Whitespace\" \ \"))))(Tile((id \ - b5f73e45-81d0-44c7-b1b5-39f0ed28d790)(label(if then \ + 06d23843-8fe3-444e-8a87-eb0aa4490cc6)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 895d56e8-04dc-4c2a-8edb-aa307da44814)(content(Whitespace\" \ + affe2168-684c-4d67-bec5-8228b05937b0)(content(Whitespace\" \ \"))))(Tile((id \ - 7bdc158c-09c4-4303-98a2-95ac217c0d7b)(label(true))(mold((out \ + 18ffdc70-0a5e-4192-8795-cd4c95035705)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7f09b95b-c5ab-4274-8803-eece59459312)(content(Whitespace\" \ + 21e6c452-a400-45a2-a721-10714c0f4346)(content(Whitespace\" \ \")))))((Secondary((id \ - bc2998b3-bf64-4a57-aa06-33d6e3f57b29)(content(Whitespace\" \ + 8d733b17-4f6f-4a44-8799-00d93c079077)(content(Whitespace\" \ \"))))(Tile((id \ - 503aa496-5d44-4876-b72c-22f53e38841e)(label(1))(mold((out \ + f800a7ca-7554-48cd-8f42-4dba03d9a8cf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0c5a8275-a28a-4f93-817b-4dad704c3671)(content(Whitespace\" \ + fc7339de-2afd-4b49-acf6-d1ed91ded9f2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bee57263-7e8b-4736-bc4b-177652f48018)(content(Whitespace\" \ + ec12599b-4c0e-4e46-a376-b6ae40142d05)(content(Whitespace\" \ \"))))(Tile((id \ - 24bd3d9e-ef99-4acf-b267-51739222ba13)(label(1.))(mold((out \ + dd4e1463-ceb4-4355-a51f-49dd4fa24225)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c7038c0-6b3f-4f97-905f-2ac8a826a9a1)(content(Whitespace\" \ + e748c816-cfe2-4d54-8212-08f49c707909)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 79209500-88d2-4efb-ae12-36961422af5f)(content(Whitespace\" \ + ca8de082-63b7-49ef-97e5-619ed4b0b05f)(content(Whitespace\" \ \"))))(Secondary((id \ - c15476f2-b945-4bd3-9d0d-b56187d74ac0)(content(Comment \ + c48c4f78-6b82-4236-a7cc-e0dced213ae8)(content(Comment \ #err#))))(Secondary((id \ - 9d3164ad-7956-48c7-9060-1585f2263536)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8f8e5371-c0a9-4882-abab-4793d534ae95)(label(let = \ + 1c1a964b-411c-4f94-9476-09115d88d190)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cdcf5ede-13da-454b-9d5d-99fd246b2874)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5171b496-42b3-4ad6-afbd-734e7dfab18a)(content(Whitespace\" \ + 635ab09a-8ad0-4de7-b0fe-8cdd984882b4)(content(Whitespace\" \ \"))))(Tile((id \ - 597937bb-e437-4f79-8336-62f0bfe633b7)(label(_))(mold((out \ + d9f87dbe-c4ed-4be0-9841-7d85aea57072)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 93961230-3aeb-4fe0-aa51-724650152a86)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 1bf5502f-4aa9-4e84-b8b6-ad3f47643044)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bad1b945-64ed-46ba-b27f-6e6ec46b3207)(content(Whitespace\" \ + 509f607f-02b6-4ebb-b972-b9507a4e8763)(content(Whitespace\" \ \"))))(Tile((id \ - 936b28c1-68b5-4e53-88b7-838ee7cbbcd5)(label(Fake))(mold((out \ + bab9d19b-9401-464c-b272-88f447e448f2)(label(Fake))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f1a2e20b-212c-4dae-88d4-fd0e86aa2998)(content(Whitespace\" \ + bd9ea560-a265-416e-9d51-3a76856174d2)(content(Whitespace\" \ \")))))((Secondary((id \ - 660312dd-2c63-4eb7-a6c0-ab34eae4ae85)(content(Whitespace\" \ + a02666f2-6cab-4928-8385-b46f31fea725)(content(Whitespace\" \ \"))))(Tile((id \ - 8520a1ed-7cc4-43e2-8a2b-66821f37871f)(label(if then \ + 778e7cdd-96f4-4caa-90ea-62db4df40157)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c65d4f9e-96fe-4c50-af8a-0acd2f008513)(content(Whitespace\" \ + daf56b49-9558-4d51-a2de-c1913007233f)(content(Whitespace\" \ \"))))(Tile((id \ - 1f09612d-cdf3-4a5a-8634-b7e7f4edd704)(label(true))(mold((out \ + 2cc5115c-c074-4162-8ee3-2a23922c5f8e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fc30bcc8-3a0a-4801-bbe4-54e44fef77e5)(content(Whitespace\" \ + 415984f7-6e45-427d-9600-481f16d727ec)(content(Whitespace\" \ \")))))((Secondary((id \ - 19280f06-f9c1-4ecd-a813-9783f1377a5d)(content(Whitespace\" \ + 37518ac9-c345-400d-aa46-49c4a23d490e)(content(Whitespace\" \ \"))))(Tile((id \ - ed3868a2-eeb4-4028-b399-7170800c18dd)(label(1))(mold((out \ + d0ed9384-93d9-430f-9c33-604e316f9183)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e180c714-6f53-42f0-a7bc-c014691ea0a7)(content(Whitespace\" \ + f529db5a-86ab-4f69-ac98-5db6afcb2882)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 862e99a5-2143-4e3f-bfa7-fec564a23095)(content(Whitespace\" \ + ee0e1431-7744-4ef1-8352-7a0a053215a1)(content(Whitespace\" \ \"))))(Tile((id \ - 5f88e61d-db92-494f-8b44-fa1fe0518da0)(label(true))(mold((out \ + a94dd962-07c6-4cd5-8f74-d7a53b53eb12)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 412a6380-f0a9-495b-a742-f8c4600f6638)(content(Whitespace\" \ + f89e966f-6e46-49af-b97e-2e83a64077b7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d030eb4f-0f88-41d1-a12e-1a8aa9d7c4c6)(content(Whitespace\" \ + ea3c38db-1a45-420d-a0b4-a3b7ccb869b6)(content(Whitespace\" \ \"))))(Secondary((id \ - 472d7373-2de2-4699-ab83-06dbf689e446)(content(Comment \ + 4e062afa-0b64-4408-bd38-4d69b9ffef79)(content(Comment \ #err#))))(Secondary((id \ - 5946e251-b954-444b-8571-73a07f028d0f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7c9b44aa-0b0c-4493-b4d1-b596ccfb5860)(label(let = \ + 56caa885-0a84-4bc2-b108-87b94ab68c1c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 342572c7-0105-4ac7-817b-cb6d580d1ea4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3d187f37-a8db-44b9-b5eb-79988c3e2c5a)(content(Whitespace\" \ + daa9a999-8d84-4296-a2b0-5b06bfbcd239)(content(Whitespace\" \ \"))))(Tile((id \ - 5f4e0850-7a82-4784-a8c1-e0cdb072b720)(label(_))(mold((out \ + d4f9b1b8-3f3a-4178-b0c0-f8a0d02af8f5)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 37ec8304-8678-40ac-a78c-e1564cf1096a)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 33f30d39-2218-4ac4-ba70-df655f93d4ae)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 5e98976c-354d-4f26-86f2-cefb7a80ee5c)(content(Whitespace\" \ + 065b19a9-e7a6-4910-ae05-04918e4d163a)(content(Whitespace\" \ \"))))(Tile((id \ - 79281c40-1b91-4475-8293-ffdb3420f211)(label(_))(mold((out \ + 1f58b747-1208-47e2-bd71-c80c3155ce3a)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3dc98b9e-8880-4035-a61f-346a23cb05e8)(content(Whitespace\" \ + 4842f067-1d31-471a-b094-234c8b4cc8fe)(content(Whitespace\" \ \")))))((Secondary((id \ - 4cfd5f82-9500-4f00-9fbf-de9d15dcb2c5)(content(Whitespace\" \ + 05cf8cba-cad7-40d6-980c-582c3b2c5ac2)(content(Whitespace\" \ \"))))(Tile((id \ - 78fe5eeb-03df-4ff0-b565-41e9c49c239f)(label(if then \ + fa321989-1769-4d22-8750-b75cdd6bf164)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ede7a6c1-c15f-4648-9310-48732cd24e51)(content(Whitespace\" \ + 22918879-d6ef-478a-8e7d-2cb5ae4a24a0)(content(Whitespace\" \ \"))))(Tile((id \ - 0db9775e-926b-43b2-b3f5-d078c14cf73a)(label(true))(mold((out \ + d01bb430-1cc8-4e03-9b44-f8d9d952d3c2)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b03a6005-6308-475e-8f5e-4eff52656710)(content(Whitespace\" \ + 396b6b7c-f2e5-4b99-b39d-9c8dd5bf1db9)(content(Whitespace\" \ \")))))((Secondary((id \ - 9a9b8d8b-d056-4aab-9156-470737187412)(content(Whitespace\" \ + 23a778a1-585e-4c33-8214-5f0654f864a8)(content(Whitespace\" \ \"))))(Tile((id \ - cb245d33-d282-4db3-a227-b645e9b75790)(label(1))(mold((out \ + 59275e06-b264-4739-a072-ab1ec0148f13)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2cd250fd-dc35-4a9a-bc4f-9426959354e8)(content(Whitespace\" \ + 941285bb-8e2c-4144-a623-5b9d02a44c42)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 787ba6f3-84b1-4f93-b5dc-a8b870e9ba4c)(content(Whitespace\" \ + 6d03507f-06d2-4883-9ee5-12bca1353165)(content(Whitespace\" \ \"))))(Tile((id \ - 9a45395d-bcf2-41c3-b21b-cedec3e6a113)(label(1.))(mold((out \ + 95011bbc-b903-42d9-8671-2145be041c3b)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3105b687-fd5e-473d-b967-9da7c0647341)(content(Whitespace\" \ + 1c1a80bc-62d3-426f-b447-528833b178a4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - db3f8bb1-72d2-4aca-a6c4-c7c554a879ef)(content(Whitespace\" \ + 42bea2eb-3e14-413c-b555-4b552a780f94)(content(Whitespace\" \ \"))))(Secondary((id \ - f0d098d6-5609-4f15-a04e-0ede743aeb94)(content(Comment\"#2x \ + b628fa13-f01e-4b3a-9221-f2898b4d3d94)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - 4d693f72-81cb-4c75-bde0-23592716a92f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d8b04ba0-8b64-4a94-9a97-70c2920e2530)(label(let = \ + 044e6d9e-0df3-4384-b375-5ec7fc16219c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 66efa0c7-f05f-4c62-bc61-4cc0e19227c2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2a8bf909-8ac9-434a-956d-cf4efbcc8af8)(content(Whitespace\" \ + ea34e271-aecf-4040-a436-2d4ea169e4ac)(content(Whitespace\" \ \"))))(Tile((id \ - f6d6e84d-8550-473e-853d-b77f12bbefae)(label(_))(mold((out \ + de2ba13d-3598-48ed-9601-22a40a08484a)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 02f88e70-2821-4de0-b7a6-73287b575c61)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 154a4776-c72c-4604-9136-6525df3e8de8)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a1648162-6ae8-4d24-8b93-6c537e8aabcf)(content(Whitespace\" \ + 95199192-bcec-400f-ba66-36cc9e6c658d)(content(Whitespace\" \ \"))))(Tile((id \ - 253ac0e4-fd26-4abc-aa21-1149fad7d43b)(label(_))(mold((out \ + 9e5e1496-0d46-4439-a1fe-ba1373a26654)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0ba56612-4438-4f63-9617-78d3c4ffa5bc)(content(Whitespace\" \ + 6a10cf63-3b4f-4bf4-8bf0-1aa1b0257676)(content(Whitespace\" \ \")))))((Secondary((id \ - ad6af5c1-5817-4b0c-ba82-321f042705f2)(content(Whitespace\" \ + 8d1256cd-3e8b-4447-89a9-1dc6ff9e7e82)(content(Whitespace\" \ \"))))(Tile((id \ - 0ba4458d-bee8-48e6-933a-18d06c343a42)(label(\"(\"\")\"))(mold((out \ + 859c7bde-0c13-4e42-b718-489cd1284841)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 608bb807-8d6c-4844-8d59-d3efe58d3843)(label(if then \ + 38066c1d-75f9-4090-8f21-d570fba67ea6)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 77d36a72-5ba6-4ed4-aa9a-12b37970424c)(content(Whitespace\" \ + 60410b2d-24d1-4289-b7d0-e4f962aceb07)(content(Whitespace\" \ \"))))(Tile((id \ - 5af082f1-4d3e-4854-8ff1-1ffdaad55851)(label(true))(mold((out \ + d776be4e-4ce3-4bc6-a1ee-f2fba8baea50)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d48e22a5-f65a-4767-a9d0-1a40cc32b3d9)(content(Whitespace\" \ + ffe877ae-5158-454e-8951-1b5a8cf33acc)(content(Whitespace\" \ \")))))((Secondary((id \ - 9609e0a9-f5f0-4fa6-b677-3a82f5b3c887)(content(Whitespace\" \ + 5cca4443-2101-4b76-a636-82283c007c31)(content(Whitespace\" \ \"))))(Tile((id \ - ff4f682c-091a-45ea-ac96-feb28081efc3)(label(1))(mold((out \ + a37aad0e-b396-4769-bec6-451cde6e6688)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2cce8860-ee1b-4ec9-a66d-c8a748a30290)(content(Whitespace\" \ + fca6cce7-3124-4fef-89ac-76a969e6dc0f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 324ceb15-0215-4d88-8cf2-060903955c6f)(content(Whitespace\" \ + ca9740a9-f9e7-4c52-8619-e530dd207c03)(content(Whitespace\" \ \"))))(Tile((id \ - e9a7860c-6db8-4a81-8ae4-bfdd79d70282)(label(1.))(mold((out \ + 1db0d5de-13ba-4537-b327-a971fed29ad5)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 275a0228-3bff-48ff-a304-8f6edc108009)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + bf3901f7-d8c2-4b87-b353-d348f4de685c)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Grout((id \ - 17047b05-1174-4151-937d-b4833dfd6d1a)(shape \ + 09e1cd05-28f6-4e0b-a3d0-8071f1d28c5b)(shape \ Convex)))(Secondary((id \ - 13edcba8-486c-44b4-93d8-c1bf41f98fc5)(content(Whitespace\" \ + f41c6f36-0d79-4928-a9d2-a9a5f9a02a69)(content(Whitespace\" \ \"))))(Secondary((id \ - 1bdbf758-cf85-4d57-9d74-41588be677bf)(content(Whitespace\" \ + b5f23e7f-7b34-46b9-a81c-8d7bf46e7e51)(content(Whitespace\" \ \"))))(Secondary((id \ - 3a70753f-0da6-4a2a-bd04-12907709acb1)(content(Whitespace\" \ + 78bd4530-1249-440b-9f14-df6f13159d05)(content(Whitespace\" \ + \"))))(Secondary((id \ + e70a5c62-5f9f-4196-848b-0b83b5e61901)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aa17c661-b339-4613-87f5-9cc5ab23d5cf)(content(Whitespace\" \ + c5636dc5-714c-41cf-8f4f-b4964fe82a88)(content(Whitespace\" \ \"))))(Secondary((id \ - 80b2cb6c-da1b-4a39-8396-bbcb94900dbc)(content(Comment \ + d79b4c14-ed1a-457d-8b7a-58b9a7b5f6d9)(content(Comment \ #err#))))(Secondary((id \ - d1468a7b-ca13-4ee5-be11-c9d8ee744a90)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 11a94a5f-356a-4c36-855d-dbb81005f92d)(label(let = \ + e98a9d72-009c-4f62-9bcc-92cadbab50c1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 53c1641e-a300-4f92-ba6a-b3c1e055a88b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd717dc5-9699-42e4-819e-a605ae33c705)(content(Whitespace\" \ + 1c223fbc-bcf7-45f1-bfac-3ce12530aa8e)(content(Whitespace\" \ \"))))(Tile((id \ - 90b78761-c7bf-40e4-a659-a899afa81b5c)(label(_))(mold((out \ + 7a3d0f54-25c3-4ac8-a53a-7383dd2e3ffe)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1c9d9db0-dd3d-42eb-b038-aaf42bd3b7d6)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 4ec05fa2-3b05-4caa-8cc8-534fce5a0f4c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9fca87f4-9b31-4e5c-8982-03f73b8d1b00)(content(Whitespace\" \ - \"))))(Grout((id 29f35a2c-4d0e-46f3-a17d-cdb6f0b58159)(shape \ + af4973ef-fbaf-4523-b060-cce75af9dc1c)(content(Whitespace\" \ + \"))))(Grout((id d10d135a-77a8-4f41-8ec8-9ed95917f5e8)(shape \ Convex)))(Tile((id \ - 3d63fe1d-8723-4fc2-96a7-579952450f50)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + a72e263e-70bd-4291-b890-64c0fd8f105e)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 8cff05d8-1ceb-4dc5-abd5-601a0737609e)(content(Whitespace\" \ + ce4dd625-dcbc-4d2c-bd21-ffbdfca0a06c)(content(Whitespace\" \ \"))))(Tile((id \ - ae9cbd45-3c84-4a8e-8580-4fae57ee8c20)(label(_))(mold((out \ + 7d047d67-cf48-47a4-8ebd-00feb7210bab)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 25aaeff6-8269-4919-a321-5ae18d116be9)(content(Whitespace\" \ + 24f52c42-dcf6-4438-88ff-fb9499394963)(content(Whitespace\" \ \")))))((Secondary((id \ - eaacbf10-9ca6-47d5-8f8f-e286b53ce6ce)(content(Whitespace\" \ + ea3fa448-0450-4b26-a9c6-7295a1953844)(content(Whitespace\" \ \"))))(Tile((id \ - 1c286055-6c42-4648-b43e-330a792f075b)(label(\"(\"\")\"))(mold((out \ + 014476a8-5a81-4b6c-ae41-f99f9fc09ecb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4db679dd-6f17-4ff2-b8f1-2a08acc594a6)(label(if then \ + 864d4833-1428-4de0-bf99-98ba828d05a0)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d22f9463-63f4-451c-9850-be72b1d06b56)(content(Whitespace\" \ + 3526f94c-f18d-4a8d-9434-3c2954f92bce)(content(Whitespace\" \ \"))))(Tile((id \ - c5d62b24-fd05-404d-a7c0-21cdfeacd1f4)(label(true))(mold((out \ + 271262c8-bc47-4286-b2c9-d1fd9862e086)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2336603c-c334-408f-a1e6-5f61132d0687)(content(Whitespace\" \ + 3236f6e9-077b-46fd-9008-60c60961d71e)(content(Whitespace\" \ \")))))((Secondary((id \ - bed23ec7-8aa3-4470-8236-81e76586c7a4)(content(Whitespace\" \ + 5ecc2776-144b-424d-bada-226e6613294c)(content(Whitespace\" \ \"))))(Tile((id \ - 6fc53068-7615-432a-a026-eb54d842336f)(label(1))(mold((out \ + 6f121f33-4864-4cc9-9e77-4b016ba16a68)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffd73edf-b438-446a-990e-1b05534f81c4)(content(Whitespace\" \ + eacb4f8e-72fb-44c0-be02-5680c9dd4ed4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee921cb7-b3fb-4dd1-a280-c91d2d9223d6)(content(Whitespace\" \ + 8ec75ca8-8806-459c-940d-da7962898c98)(content(Whitespace\" \ \"))))(Tile((id \ - 3d27f98b-ba04-4145-98ff-501bc97c9b23)(label(1.))(mold((out \ + 2ed80e37-34ef-4062-9ff5-f191beeae17f)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a9ae7e4e-dcaa-45cc-823f-edcb1cbdf947)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 421bf5ab-64da-4005-bb31-4cf97fd66cea)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Grout((id \ - 4e543e67-9133-4e9d-b1ff-b835632a681a)(shape \ + 8ff1d0ba-dbab-4964-9dfe-3eaea376500d)(shape \ Convex)))(Secondary((id \ - c39d6789-d1f4-4a6b-a29c-c8c25b5a0838)(content(Whitespace\" \ + 683cc5f3-68a0-4073-8d8e-77f04849b9be)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7caa205d-f9f9-4385-9f91-4451279baf4a)(content(Whitespace\" \ \"))))(Secondary((id \ - 92e67be4-ea93-497b-a2ea-45c9966fea4e)(content(Whitespace\" \ + 63984ab9-75b4-4834-838b-7830296acc20)(content(Whitespace\" \ \"))))(Secondary((id \ - 110afdaf-1fde-4e5c-ac9b-6e0bbb6d1d30)(content(Whitespace\" \ + 2aa2a312-7043-4122-b5bf-aa7737e635e4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5189f641-bafa-420d-b91a-204be24e470a)(content(Whitespace\" \ + 4452c438-712b-47d0-97e3-6ad0c66a851e)(content(Whitespace\" \ \"))))(Secondary((id \ - c3c3b2ea-b824-40df-a919-9a4e441d8759)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f9090b6a-5094-4660-a053-22404727e172)(label(let = \ + eb500109-807c-482b-a1de-1bf415ea6553)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1b331c1c-2ea1-43d4-9100-e1ebcbf74961)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 12e87a6a-048e-48da-82ea-382dc457ceac)(content(Whitespace\" \ - \"))))(Tile((id 8e8628df-8459-456b-84d6-2cb36af4b9e7)(label([ \ + c7e31acd-ac68-4dab-b83d-958614ab53f8)(content(Whitespace\" \ + \"))))(Tile((id 9fd92291-69a1-48b3-988d-02c5ff1eb454)(label([ \ ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ Pat))((shape Convex)(sort Pat))))))(shards(0 \ 1))(children(((Tile((id \ - cf25941f-eaa9-4a1a-b357-8c5b117c95ee)(label(_))(mold((out \ + cfd14ca3-c72c-4d42-8a76-504c0d64cba2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 3a1a98da-cf5a-4fcf-aa2c-548aef9e0b9e)(content(Whitespace\" \ + a7ffc4e2-df54-419d-9a84-dc6bc3fe7287)(content(Whitespace\" \ \")))))((Secondary((id \ - 67cc35c8-7838-4a4e-ad76-367c9369ab0e)(content(Whitespace\" \ - \"))))(Tile((id e262c9fa-ae87-4fc8-9057-a9461bfd9bd5)(label([ \ + 27491b7d-700d-4c22-9b8e-dde3fb7c69d1)(content(Whitespace\" \ + \"))))(Tile((id 54da9a9f-372d-426f-b716-d9b5e413a05f)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - a7254a23-019e-4314-af62-6d9c7bfb672b)(label(\"(\"\")\"))(mold((out \ + d79f6459-df17-47a7-854b-6ac9e5e6d4c7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 10ec1999-7398-48f7-863d-d1d5e36f3d2f)(label(if then \ + ec84e09f-1bbb-4046-a4d1-18e35096b5bc)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c7ac74b1-6e15-4e71-a746-39bc1efc8c27)(content(Whitespace\" \ + 023011eb-07fc-4fc4-acb7-afc08d167889)(content(Whitespace\" \ \"))))(Tile((id \ - ba2f5cb7-3230-4ec9-a771-b691c357108a)(label(true))(mold((out \ + badc47f6-597d-4f34-8d15-dadd4d102ba1)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b7fc917b-738e-423c-904d-05a96059bced)(content(Whitespace\" \ + 1e7e73c3-0185-4732-afec-c65841f85447)(content(Whitespace\" \ \")))))((Secondary((id \ - dd935528-15f2-4c7d-8804-a4d472b14489)(content(Whitespace\" \ + 2c4afb03-65e2-4f7f-8a45-b4cd95340022)(content(Whitespace\" \ \"))))(Tile((id \ - ff4d570b-28f6-4b30-a316-3a409235447b)(label(1))(mold((out \ + 88d930fc-4396-4c85-b193-6231e4ab6903)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1fb75734-2d7a-4769-9753-b17b1592087b)(content(Whitespace\" \ + b7cc9a31-16e0-4646-bacf-b2cf5fb1ad56)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eed1455f-cad2-4bae-8f40-ea91ebc25208)(content(Whitespace\" \ + 16723970-ca28-41a1-962f-f1d6bb3e08ad)(content(Whitespace\" \ \"))))(Tile((id \ - 2371b8a3-f2d4-46ec-bbc4-a60cbf89ef6d)(label(1.))(mold((out \ + c8d0507c-498e-4a17-8534-2f9017262ae6)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - f1e569ab-92b8-47e3-a64f-35fdc0407aa3)(content(Whitespace\" \ + 17a71b04-56ef-4951-9f94-071b1798029c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 342903af-c89d-49a7-bc25-5de96ac97281)(content(Whitespace\" \ + 4a78edd8-7cc5-43e7-a5a2-06fd22e09992)(content(Whitespace\" \ \"))))(Secondary((id \ - 2836626f-426e-4d0f-abb8-e947f32132f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3d735aba-e54e-400b-8573-7e839a3b9594)(label(let = \ + d6536aaf-a29f-4dd1-b71d-319a5018d79f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f0ae930d-5ce5-4bc7-90fc-a1766418be73)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1855f1ad-a3ba-4224-99f2-d575807cf9f4)(content(Whitespace\" \ - \"))))(Tile((id 9e393b21-55dc-4ce9-ad66-de202a408331)(label([ \ + e65e480e-afca-45fc-892d-842987fb2412)(content(Whitespace\" \ + \"))))(Tile((id 00ff9c0d-2efe-463f-a4ed-df9ab031972b)(label([ \ ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ Pat))((shape Convex)(sort Pat))))))(shards(0 \ 1))(children(((Tile((id \ - ea98ca45-1496-4863-93f8-3c2332b1b479)(label(_))(mold((out \ + d5493e59-7583-432e-9bb5-d4bbb87ccab2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - f2df6024-92a9-49a5-88aa-39ffdfe6dd94)(content(Whitespace\" \ + 5fa3f577-12d3-4b1b-afff-231e2afc3aa6)(content(Whitespace\" \ \")))))((Secondary((id \ - 62c5a63b-cd57-4076-9551-1ae18d2b5025)(content(Whitespace\" \ + 07256fa2-325d-4255-9e4c-55441b4054d0)(content(Whitespace\" \ \"))))(Tile((id \ - e6e249a9-c461-4c0f-acce-c5fb18660415)(label(\"(\"\")\"))(mold((out \ + 4ad42883-e2b9-410b-9764-466f91a51239)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28e5f8e2-b712-4c28-98f0-be264ed0d9d9)(label(if then \ + 61d1e0c9-09a2-4ad4-bc19-e7f0e4729f5f)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e243b1c2-c613-4578-be3c-c3a352c1b602)(content(Whitespace\" \ + b2615842-5e17-44ca-8c65-ec219c8fe771)(content(Whitespace\" \ \"))))(Tile((id \ - e155439a-5123-4b48-891e-d66bd6c15636)(label(true))(mold((out \ + 7bbebde4-ca9e-4820-9be0-d038e58ec25d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2fbc7089-202c-447c-ae1f-0befd34a6f25)(content(Whitespace\" \ + e62b6d09-a35a-4d6b-914b-3651a8d5f9a7)(content(Whitespace\" \ \")))))((Secondary((id \ - 457ce868-2756-43d6-85fd-3dbd77b0bf43)(content(Whitespace\" \ + 42509d8d-034a-4b96-9d22-7cbaa9234158)(content(Whitespace\" \ \"))))(Tile((id \ - aa2b1a04-2234-4c8d-bf1f-dde6283f8c6e)(label(1))(mold((out \ + cdced581-b02c-4a67-8027-e4c26d422264)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4cb364cd-2ae7-44b0-9e42-20c673269007)(content(Whitespace\" \ + f888117e-eedb-460c-b572-ace5f8daba54)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 84e6798d-a1d4-4688-83bc-941ceb1f1eca)(content(Whitespace\" \ + 008527e5-192b-4003-8db4-2a59e97b4387)(content(Whitespace\" \ \"))))(Tile((id \ - 9e910694-b45d-4b2e-9f3b-6f3e92f40280)(label(1.))(mold((out \ + 19eb7fea-2694-4d26-ba41-8d20d21823f3)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6e1b78c6-08fb-4eea-ad24-8a25bb546292)(content(Whitespace\" \ + f7210ca8-5362-43f7-8d94-25e0021b58ad)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 60c6c426-b0f5-4c23-b7ad-2d2599c327bf)(content(Whitespace\" \ + 6ea51883-d3e4-4ce0-9426-3084aa0b135c)(content(Whitespace\" \ \"))))(Secondary((id \ - e0a7fd21-7379-4620-be7d-9fc89c0748c5)(content(Comment\"#2x \ + b9c5b7d9-5b68-43d1-82de-93fc01844f74)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - f50e71ce-8170-4aba-ad79-d299d2f91a57)(content(Whitespace\" \ + 312d8673-95fb-4923-b89f-12d832987894)(content(Whitespace\" \ \"))))(Secondary((id \ - 4dd92573-6d7c-4296-9208-937e7a2aa82a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d77b580d-b094-478f-9565-14ce2c48c3cd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f042fe33-b554-4f20-b618-2fa3c8e72461)(label(\"(\"\")\"))(mold((out \ + ce427b79-7db2-401b-ad95-ed8aa725d295)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a1078844-f689-4645-9517-343fe975b9e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0568fdd2-33e5-44eb-8b5e-282f38520a49)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - da5f7a94-d56f-419d-81a4-e90f5e4ad103)(shape \ - Convex))))))))(Tile((id \ - c005aa0c-43a6-4084-8b73-db752bd727db)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f875cc06-fde5-4cb2-9fca-99f04ef52207)(shape \ + Convex)))(Secondary((id \ + 7631a5db-de3e-43f4-966f-60d53fcca9a5)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 4eba0c65-acc4-48a6-89a5-b0d9b7be2a00)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 597ecf17-421a-4853-9600-eb6e87ad1fc1)(label(if then \ + c6d233fa-f2a0-4a8b-9ea7-4c4beeb049b9)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c6d281a5-7366-4fc6-b93f-a5b506a71e24)(content(Whitespace\" \ + d16c94e8-8bbb-48e8-b17d-0ba8f473b850)(content(Whitespace\" \ \"))))(Tile((id \ - 565daa13-0e6f-484d-9db2-c2c4412a54a7)(label(true))(mold((out \ + f70a22f9-5654-4681-a7db-c22aff0c899a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0606bb3b-03a8-4d74-beb9-0d8fc732f979)(content(Whitespace\" \ + cc82a687-0ffe-4c50-bb5b-7fae7880988b)(content(Whitespace\" \ \")))))((Secondary((id \ - cf5c6a9f-abe1-4fb9-b6dc-a9dbd6d7dba8)(content(Whitespace\" \ + 907d5571-3099-4f85-a0a7-8de5c3c0163f)(content(Whitespace\" \ \"))))(Tile((id \ - 1998792d-d014-4ac8-9359-2a97c35a8f4d)(label(1))(mold((out \ + 70cb1a6d-4331-4b23-a116-000d34c847ee)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d55d2bae-a087-4fd1-8d06-bc046516f54f)(content(Whitespace\" \ + 5550f2e0-af76-4461-a80d-3e96e5ba8acd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bce25bdc-97f5-4167-b0a5-28a7838bebdf)(content(Whitespace\" \ + 801cd3b1-428b-4700-ac23-eab47576e4cd)(content(Whitespace\" \ \"))))(Tile((id \ - a37487be-086a-4d06-9e37-f4a6e0c74f15)(label(1.))(mold((out \ + 6db6ceac-823f-4e69-b176-7db9892ae457)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0dd1749c-08c8-463b-8c08-d7540b7fd5f1)(label(\";\"))(mold((out \ + 883b5469-1df0-4c5b-acbc-48463a056191)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 570a141b-ab07-4691-840a-ea9e46b4aa3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 387cc421-9cee-4b2e-b8c9-64420e4e3e0c)(label(1))(mold((out \ + c2af471c-ae0f-4633-a0e9-960db0dd4ac4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1de8ab2b-4d3e-429f-a223-ea2b0609949f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8000090f-6960-4cc4-8972-4b3b4934bbdf)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a4cd9904-d73c-46a6-8b08-20ee36507447)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 21e644ea-f7ec-4444-be5f-6a628e76b1a5)(label(if then \ + 77ba6448-fb1e-4cd1-a480-1a8dd8e498b6)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9dd67d89-f568-45ca-a855-b39658cf456c)(content(Whitespace\" \ + db25eb1f-525c-4760-a31d-5f45805a1e5e)(content(Whitespace\" \ \"))))(Tile((id \ - 87fdc732-9c35-45c0-b05d-841c3f76fcb7)(label(true))(mold((out \ + c78c8812-76c2-4ec2-9e56-2d2f5b931b40)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e426f078-9c62-4ab7-b8e5-f3846f02e372)(content(Whitespace\" \ + 86011fbd-9fd9-4e51-ad9f-ad5274e4075e)(content(Whitespace\" \ \")))))((Secondary((id \ - 9eaced5b-63a5-43e5-9f9b-65877c1e2646)(content(Whitespace\" \ + 82056694-4008-4d4d-b2e9-5ff2a4368793)(content(Whitespace\" \ \"))))(Tile((id \ - 93aea0bc-7454-4307-bddc-19b83469ac2f)(label(1))(mold((out \ + 794e45f1-5540-4c08-a3da-891b6b39177d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 00645620-caec-4675-8b29-deddb545f394)(content(Whitespace\" \ + a6f3062a-386e-439d-9356-4a5f9ea52e6b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f38ed27d-79ac-4416-893c-56aa5b086d7d)(content(Whitespace\" \ + 6ad8e8b5-b7ba-43a1-83ee-344506710016)(content(Whitespace\" \ \"))))(Tile((id \ - 56d55ff8-a6c7-499a-9c41-e7249a9f2789)(label(1.))(mold((out \ + 221c428a-ff1c-474e-93ff-87dee5369bbd)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 92403899-717e-4808-ac3e-3767e0eac20d)(label(\";\"))(mold((out \ + b16113b7-d24a-4bcf-882a-a4029176f4e3)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0f4bf478-ad4e-4543-867d-48080fbacb3c)(content(Whitespace\" \ + 670baa54-2b65-4166-8fdb-43ec1d775096)(content(Whitespace\" \ \"))))(Secondary((id \ - 634ebd5a-061f-426d-8278-caf13efe2fcf)(content(Comment \ + a29755d5-c34a-42d2-8021-70a9cba51dde)(content(Comment \ #err#))))(Secondary((id \ - 6341373a-1b18-4f9e-a516-25b97197b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 91b8fd2b-50d5-46f3-9e2a-f4114ad5d08e)(label(\"(\"\")\"))(mold((out \ + eeb2f985-8055-4827-8305-e8676c0dbe3b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 415d7ed2-5f51-4dfd-8ef9-30dd674627d1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 35bef15d-fb86-4914-aea9-f26da914d8b5)(label(1))(mold((out \ + e06f2f6c-a0c0-4f72-ad0e-bafdfecc34f1)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 55037480-08df-43b7-885d-c02860217f6d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 0f2d15c2-ed4b-487a-8c3f-aacacfe02675)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 66791c1d-5fd9-4219-96fb-4bd8ba9165e6)(label(if then \ + 71dff8c6-54db-4466-aa7f-fcba27ed7846)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4534c71d-fbf2-49b3-8733-70c5c53f9fb6)(content(Whitespace\" \ + df4a2236-b516-4871-89a4-0724dcbd1de5)(content(Whitespace\" \ \"))))(Tile((id \ - 5936b2bb-c495-41ac-915b-84720407aa82)(label(true))(mold((out \ + 4e296c65-39a1-4e2d-b8e9-65adfd26c3f6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dd27ba1f-0e47-47dc-8a19-b1ab49ddc6ae)(content(Whitespace\" \ + 2336abf0-54aa-4ab8-9be7-f49f1098f909)(content(Whitespace\" \ \")))))((Secondary((id \ - a8d6513a-d522-478e-a64e-ed20e95ced90)(content(Whitespace\" \ + 93c4ec57-a944-49d3-bede-b8e96d2d2f33)(content(Whitespace\" \ \"))))(Tile((id \ - 6b75f592-c667-4990-b872-45254ae84f58)(label(1))(mold((out \ + 3a82f26b-2c70-432e-83aa-ecb81991160b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7d563839-85f2-4636-99f5-0e0eab764be6)(content(Whitespace\" \ + e34df7de-03e6-427e-b694-c37191ab79bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bb0e52cd-b00d-42d8-9697-52cda117a7be)(content(Whitespace\" \ + f4c5eca9-6b92-4d3f-8a84-cdd432b5eed9)(content(Whitespace\" \ \"))))(Tile((id \ - 11b0bba6-2add-46c0-80ea-eaae5fe2a612)(label(1.))(mold((out \ + 0a86ed00-1fe2-4d45-ba9c-81dcb1ae36b1)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d4989258-1177-43cc-85c8-0dece96af223)(label(\";\"))(mold((out \ + 85311ccc-4cdc-42b8-8962-839689f8eac2)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bde6f2f6-7dee-41fb-8ec8-7ce0a8d5de20)(content(Whitespace\" \ + 66d48ce9-3d10-4097-8be8-230d2c985981)(content(Whitespace\" \ \"))))(Secondary((id \ - 1da33e8c-40ca-40fe-8e25-c58069bda77c)(content(Comment \ + 324f8369-f19f-497a-bcdf-bf495a5e8f6a)(content(Comment \ #err#))))(Secondary((id \ - f7d18d01-968b-40cf-a368-ecc331878420)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c84b88f4-3ab1-449c-bac0-1788f3910edd)(label(\"(\"\")\"))(mold((out \ + 768806fc-c624-4f91-bfe3-b80df7116074)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8f1d7eb1-71b7-4e7a-869d-9f7379862283)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fd353163-012c-4c4d-a5c5-e394ecd16ae2)(label(fun \ + a4bbbc61-ebf3-49a2-9edb-15d0f609eb63)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 048898ab-996f-4b90-b66c-bff87aa60b61)(content(Whitespace\" \ - \"))))(Grout((id 859388a0-5d8a-48a1-b60d-d1a89e219d08)(shape \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Grout((id \ + f8c3c2c8-9c73-435f-b109-0736b22bc9fe)(shape \ Convex)))(Secondary((id \ - 10d220ad-0935-4d34-a650-a3cd9d04f606)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 9e5262aa-2218-4b3c-a2ae-81123cf669d7)(content(Whitespace\" \ - \"))))(Grout((id 64517fe7-e255-4bc2-8834-b72704af952f)(shape \ - Convex))))))))(Tile((id \ - 783434d2-9a4d-4a4f-879d-214deb152945)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33189c28-075e-45a0-b322-bf95b999fe4a)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - a56657fc-4b1f-46f8-882c-ddfa6b681f37)(content(Whitespace\" \ - \"))))(Tile((id \ - 7c2df4aa-19e5-4677-bacd-5b7a724798a5)(label(true))(mold((out \ + ea1a354e-a8be-4e20-a96e-1df9fbccb3cd)(content(Whitespace\" \ + \"))))(Secondary((id \ + f89423dd-31dd-40f2-8a8a-74575d7dd4d5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 28466780-871e-4c41-aa99-93a0575d10c6)(content(Whitespace\" \ + \")))))))))(Grout((id \ + 729899f1-6cd9-4ef6-9439-d629666e7dc5)(shape \ + Convex)))(Secondary((id \ + 23bc685b-79cd-4e18-9571-f8642bf6e477)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6eb0a2f1-7e6d-4e7b-b88f-b9f68080a2a1)(content(Whitespace\" \ + \")))))))))(Tile((id \ + cc355deb-6f6d-409c-943e-8ae6d9c2e6dc)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + d3a02cbd-41e3-4796-ad93-415f9c9db47c)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 853b1c59-2bd5-4fc4-a55b-71f530830220)(content(Whitespace\" \ + \"))))(Tile((id \ + 5748a33b-baa2-4480-9685-9da0ed213277)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a336b9e2-f9a1-416a-982f-96e525d7a097)(content(Whitespace\" \ + 4a94b739-f449-450c-99cf-c0dc4574a6b9)(content(Whitespace\" \ \")))))((Secondary((id \ - fa4494a5-f20c-4f3c-bdac-93367e9f675d)(content(Whitespace\" \ + 9deba127-0dd8-440e-9e76-62e41cfe8086)(content(Whitespace\" \ \"))))(Tile((id \ - becfa6ad-81a4-4043-b34f-f9cd6968bdd4)(label(1))(mold((out \ + f8d7dc8c-4493-4ee9-aec8-666d856b79c2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e636ba9d-f4f0-4b6a-a857-f72272703edd)(content(Whitespace\" \ + d99382e1-7e7b-4ce5-a939-611f6948bade)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4907dc5-0d6b-4f19-876e-2a7d837d2526)(content(Whitespace\" \ + ad4f2e6a-f2b0-4ceb-a279-4fe7efed1a7a)(content(Whitespace\" \ \"))))(Tile((id \ - afea6b91-26f2-4c46-b1ea-15e893de8d44)(label(1.))(mold((out \ + 9cae6d4d-bb44-4abf-aa51-352efb1603e2)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a4226d0f-0630-440b-b925-355c4323e26d)(label(\";\"))(mold((out \ + 2c246f08-5268-4e1f-a17d-aa2257d0e2d9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 01ff0dc7-27f6-4bb5-a4fa-018d7296f307)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 953c3984-84f7-4724-b92a-a9a829788351)(label(\"(\"\")\"))(mold((out \ + 3d0da29b-2595-45d9-95a8-309a5e794933)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3bae623a-2b92-48f9-b5a5-44c98d32838c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 38407f72-07a5-493b-af4a-23ddcba9b306)(label(fun \ + 34bd00fb-4803-403d-9d3c-6f1d850ff083)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 808ba58b-c96b-4222-996e-d20bc439b39d)(content(Whitespace\" \ + fc80d587-03e6-4cb1-a620-41e1f52d022b)(content(Whitespace\" \ \"))))(Tile((id \ - 71431cc7-a1ba-42a6-9e18-048bf7ed09ca)(label(_))(mold((out \ + 56c2c88c-c604-4f55-8c31-a1575d6d0b87)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2b68db99-6d3c-4256-bc00-252ced2dd688)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a0235b54-2e45-4d56-b677-baf460eeb39d)(content(Whitespace\" \ - \"))))(Grout((id 30ecd689-7fdd-4a7e-b180-65fd090457c9)(shape \ - Convex))))))))(Tile((id \ - c57eb10b-f7b5-47af-8678-f6ea4067c6f7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6c5fe730-0978-4a61-839c-bbff0fcf0dac)(content(Whitespace\" \ + \")))))))))(Grout((id \ + bd8224a1-6098-4410-8558-2c26616ce875)(shape \ + Convex)))(Secondary((id \ + e06d82ca-8151-4542-8139-c6db4194b714)(content(Whitespace\" \ + \"))))(Secondary((id \ + 180923a8-ecf8-4fe5-a277-18ac7043d8ea)(content(Whitespace\" \ + \")))))))))(Tile((id \ + b332e54b-ed33-4501-abf5-006cb0be58dd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3ddcb139-95a9-4888-ba0f-5442df48f9a7)(label(if then \ + 078e7969-a0c2-47f9-955d-2cfd83231d80)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e695ba82-cf68-46ce-925e-31249261cd8c)(content(Whitespace\" \ + a35fe9e0-f500-4a83-a309-04f02ee1dc83)(content(Whitespace\" \ \"))))(Tile((id \ - 0486935e-9996-4670-9f7d-c454f07554a0)(label(true))(mold((out \ + 3e1fbd94-2f14-4330-a703-08c5b1fde079)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 528c71f4-4aa9-4397-b56a-b3fa05d26e80)(content(Whitespace\" \ + 700ce00b-a0d0-4972-ab6d-130538b5103a)(content(Whitespace\" \ \")))))((Secondary((id \ - fd2ee037-5c94-450e-9bb0-00783b2adda9)(content(Whitespace\" \ + 379d6052-5c6d-4ddd-aa0f-2a3ab20101db)(content(Whitespace\" \ \"))))(Tile((id \ - fc17fe9b-be91-40f4-b6d8-334ae02cf696)(label(1))(mold((out \ + 78c6574f-c3da-4501-bbe0-3cb7cebe0ee1)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 28ac697b-72c1-4380-a4ac-77a6d620ce07)(content(Whitespace\" \ + 7bb2fec6-5d60-4319-8d3e-535c9d4d9a55)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5d6063b7-7b37-4a0a-b94e-2d416668609e)(content(Whitespace\" \ + d474681d-7f40-4fa7-9bab-45fb33f0ceb7)(content(Whitespace\" \ \"))))(Tile((id \ - 62e9e671-3419-4b81-ab5d-370a5a394aa9)(label(1.))(mold((out \ + ba66bb22-2d32-4858-a693-16f887bdc543)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 055bba99-c1db-48af-9aa6-4ba45f916bd5)(label(\";\"))(mold((out \ + aa1c578e-9ed1-4bba-bd84-59f06287c134)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 12c3e8d4-f091-46c0-9755-5635c4f2b5b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a331d7b3-e0e5-4503-8eda-98fb4017d7b8)(label(\"(\"\")\"))(mold((out \ + 3ec7f331-aca9-4646-a99e-5b72e7f372a4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a994996a-dc9c-448a-8fa4-2201962ba545)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 93dd678e-5279-495a-aa88-2fa862389909)(label(fun \ + 6800d18a-5c5c-4ab0-b223-ff471d9704d3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4597f735-731c-4066-9851-cd52d6542cee)(content(Whitespace\" \ + e712730c-895c-4261-9449-e8521e5e910c)(content(Whitespace\" \ \"))))(Tile((id \ - 87294766-b061-4b33-84e7-b820bc4fb3cf)(label(_))(mold((out \ + e83af0e4-a6ff-4c06-8cc3-f6a49f90625d)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 394ec58a-fb30-407f-b376-432f454bc179)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 41c4021b-e111-4501-8940-762c147bfc82)(content(Whitespace\" \ - \"))))(Grout((id c347ce4a-b918-4de4-8400-cf7174b04eec)(shape \ + bae24720-e50f-4d92-8658-fbfb6e71a68a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Grout((id \ + 00b3ddce-e18f-4efd-b984-ac788c9e89e3)(shape \ Convex)))(Secondary((id \ - 092d4568-73e7-4dab-aeb2-a96ba06aad7c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 89f8d64f-4dca-452f-a5e5-405b0dd06197)(content(Whitespace\" \ - \"))))(Grout((id 3fcdc9aa-d3ea-48dc-aa4e-50d47fe5def0)(shape \ - Convex))))))))(Tile((id \ - 0affb0e4-3f8f-4a78-b155-9cf118ca8eb7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 4c1708a5-fd9b-4a7a-9733-575020d28d74)(content(Whitespace\" \ + \"))))(Secondary((id \ + b879a426-b238-4c6d-a4a6-9855abeeea56)(content(Whitespace\" \ + \"))))(Secondary((id \ + fbc5bd8d-fce5-4ec0-8eab-40748b0b38de)(content(Whitespace\" \ + \")))))))))(Grout((id \ + 567e2173-0949-4e39-9ba2-4bb179b5c90a)(shape \ + Convex)))(Secondary((id \ + a6d8e3cc-08ba-419e-bd98-07aff49595ac)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1a8dd4f4-a29f-46b7-800a-4c65ddb53a45)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 56e51ba2-0b94-4e23-a2d5-700863a7cba7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bffb5f4a-a206-4568-b182-a633e4b7d67e)(label(if then \ + be943a77-c63a-4670-9916-115215e45433)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7da6ae55-bd62-4139-8b5c-b3467b28d15e)(content(Whitespace\" \ + 4df443a8-79d1-4a11-b728-482e6a8bee3c)(content(Whitespace\" \ \"))))(Tile((id \ - a38e5299-1158-4600-a4db-05d26b529068)(label(true))(mold((out \ + 5863529f-b0c7-4715-8f0c-b9a6c34feb88)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 56db0b7d-70ce-482f-8bdd-f261e4bb033a)(content(Whitespace\" \ + 612137d9-651c-4f55-8c1b-173849ec3fdd)(content(Whitespace\" \ \")))))((Secondary((id \ - 366cc558-76f6-4454-ac7d-a42dd3da2584)(content(Whitespace\" \ + 7312e418-8f38-47d2-ab9f-2704ef483cab)(content(Whitespace\" \ \"))))(Tile((id \ - 9d875eaf-40a4-4826-95ea-ba72c0cd2c81)(label(1))(mold((out \ + d26afec8-f3d2-4fe5-921a-61ef48756ec5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5d888c4a-19d5-4e34-9401-04e577bc1c48)(content(Whitespace\" \ + c8bfa3db-f2ba-4c23-911a-9958295e566a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 85c80d5f-538f-40d0-b5d6-e235a7f5141f)(content(Whitespace\" \ + 6baca28e-b0b4-4065-8d05-203ffa2b6f19)(content(Whitespace\" \ \"))))(Tile((id \ - 74612f3f-3d30-472f-86a4-fbc1857c058a)(label(1.))(mold((out \ + e51f5715-45c6-4060-a9d3-55a7f75e7bbc)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 470469dc-d8c3-469b-9c18-3d8e008b193b)(label(\";\"))(mold((out \ + d208e846-b8b9-438d-a1b3-0b37cc102921)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d1dc00cb-ccae-41d1-bddb-107de0e308be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c61507f-9013-45f0-aa48-1a3d015573cd)(label(\"(\"\")\"))(mold((out \ + 928db160-6df2-4510-9cee-1f80fdbc0a54)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cdc9a8aa-9d3b-47b5-a840-7e3f6ee8470f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84bef4da-1203-478f-85ca-9ee88c6f3beb)(label(fun \ + e10b67e1-6dd7-4aa1-943c-6572ca5f68dd)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6a9d6562-d5e6-4b2b-a031-11739b0c2c3e)(content(Whitespace\" \ + f51c138d-2db2-4869-99ac-4b8519bb1f0f)(content(Whitespace\" \ \"))))(Tile((id \ - 33442197-55d4-4dbd-9138-5e50ff98d573)(label(_))(mold((out \ + 30aca6df-6381-44b2-ad8c-35ac0eccc3b5)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8cb1eae4-c597-4b00-a2eb-5b57a125a194)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + be8f4180-4a09-4a4f-95ec-c4fe7752a639)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6465c91e-5f51-4910-918f-9d204e1bcbd3)(content(Whitespace\" \ + e66dca7c-fbc0-46e4-8dbb-cfb299d8b58a)(content(Whitespace\" \ \"))))(Tile((id \ - 55757bfd-ff22-42bb-9cd6-5608f5f015ff)(label(Int))(mold((out \ + 5179b21d-6180-4ed6-a37a-f4a76b67e031)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f99eed79-6ba7-4182-ac8a-299afd43bbe9)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 420ac88a-4caa-46b4-9d0a-0bb5b1b14db6)(content(Whitespace\" \ - \"))))(Grout((id bc42c4d1-dd82-433f-b065-ac7de6dde15b)(shape \ - Convex))))))))(Tile((id \ - d9dfdd76-ecde-417a-ba68-8cfb016ab80f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 11719b57-87e8-47b8-b9ba-2101b70dc410)(content(Whitespace\" \ + \")))))))))(Grout((id \ + 1b56cddd-338c-4229-8f47-87f282c8cd4a)(shape \ + Convex)))(Secondary((id \ + 8860fd0a-0333-4146-ab70-15801fcfd7f9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 05288be9-b62e-4392-ab23-53b9f85a6285)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 0261001a-22a6-4579-941e-fa697e608d18)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ea8ee01c-941d-4c66-a647-7918eefbb221)(label(if then \ + 2d1c40e7-7013-45bc-b5ab-370afe0a2618)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - eb92a4a6-8137-46ff-8763-0f1c1cce4e0f)(content(Whitespace\" \ + b094cfab-c5e3-4898-8ebf-d6c998071d39)(content(Whitespace\" \ \"))))(Tile((id \ - 3d6f8955-5d58-4093-9901-4cb799e4da68)(label(true))(mold((out \ + 5a61658b-c49a-4046-8353-cb5de1c9521e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5c39d9d8-1353-4c82-95aa-cfd3c710d2ef)(content(Whitespace\" \ + ec3520a3-80d9-40ca-bd65-3dafccceb344)(content(Whitespace\" \ \")))))((Secondary((id \ - dbd5746c-73d2-4bfd-b1d4-9bb4ddee1844)(content(Whitespace\" \ + 6a293a1a-5b68-4c50-a8d4-6d34f330c518)(content(Whitespace\" \ \"))))(Tile((id \ - c3b3c0c4-46c1-4190-9173-0ba09eb387a3)(label(1))(mold((out \ + 5877798d-d601-4f52-8b44-b62398089c90)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e8ee62da-8d62-4ef9-97b9-159f1b4a212a)(content(Whitespace\" \ + 7b7e4b79-0113-494f-bf6c-1203f8124405)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 50dac4a7-2903-4ad4-a0ba-647854776727)(content(Whitespace\" \ + b578d4cf-28a6-4b85-9569-8e83a32b06fc)(content(Whitespace\" \ \"))))(Tile((id \ - 6c624d4a-3555-428a-954b-a312f3029cab)(label(1.))(mold((out \ + 49904658-552f-4d26-830a-6d58c5fdeba5)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a73dcc1e-7ade-4348-a466-c52a96e93884)(label(\";\"))(mold((out \ + 0165301e-301e-406d-bd19-11ca5b5d75d0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9f00a5ef-4f7a-40d8-befd-c7c0d3c8a9ea)(content(Whitespace\" \ + 45eb8f1c-44a1-49e5-84a8-3505e96dc2d8)(content(Whitespace\" \ \"))))(Secondary((id \ - e8ad89fd-898f-4e2b-a3eb-f1220739d5ee)(content(Comment \ + a186e72b-6987-479a-b8a2-0c7c322c365d)(content(Comment \ #err#))))(Secondary((id \ - 0d081213-9d46-42ee-b251-c3833afa9268)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d38dbc1a-10d5-43bf-9b21-c0fb792ff103)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 35f80ac8-05d2-47c0-96b0-fe39ffa828ba)(label(let = \ + eac10d79-5ba8-42f6-bf71-8115a62f0736)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 75d6700d-99ac-416a-9c2d-bb6845361491)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 630682cc-e90f-4e0f-ae34-f0bc850cc6e0)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3ff96410-6cde-468e-b92e-60c5dbcdbb1a)(content(Whitespace\" \ + 02d305e3-620d-4bd8-b7c3-19e38c9745b9)(content(Whitespace\" \ \"))))(Tile((id \ - cd0d9dc1-2890-40ad-bb56-9bff2cd214d9)(label(_))(mold((out \ + 4408665d-1b22-4c98-a119-329067a383c8)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 09519fa6-8a8d-49a7-b97b-9446691ac068)(content(Whitespace\" \ + e3b688aa-cb8c-4d09-9c60-a73c45570fee)(content(Whitespace\" \ \")))))((Secondary((id \ - 7d48115d-4ed4-49d3-9026-f7ad7b3258dc)(content(Whitespace\" \ + e7e30f48-feff-4e09-8e1f-ce2dd9411c9b)(content(Whitespace\" \ \"))))(Tile((id \ - 8438b733-c653-40e7-bbff-5d4b99a40808)(label(fun \ + ee9ea4b8-5e3d-4961-8b86-ff90665bfe97)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 103b9289-b28a-4c91-b38b-16ddba0518b5)(content(Whitespace\" \ + 73362696-3c15-4fe8-9d77-290884f55e9b)(content(Whitespace\" \ \"))))(Tile((id \ - 673dd059-8cdc-4b7e-a624-2f4006e16b66)(label(x))(mold((out \ + c6d38bfa-0d23-4423-bb02-23f8cc81c258)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4d32ab0e-aa4c-4440-a471-858d48f0649e)(content(Whitespace\" \ + e22486db-cb65-4b8a-8477-9842dd9390f2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 76eb013f-ee4d-4f01-958d-945f5cdc1b0a)(content(Whitespace\" \ + c2d4d3dc-3bcf-4eea-8604-d9eb6754c1b5)(content(Whitespace\" \ \"))))(Tile((id \ - f2867227-a84e-48c0-aefd-0a6d27dffd3f)(label(if then \ + 4c375bef-8b67-4eb2-905e-d14fd854cd0a)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 536f6d84-2485-4700-856a-629a00f30c51)(content(Whitespace\" \ + a0a56ede-08f3-4ea0-a0d8-bc5314b6c41d)(content(Whitespace\" \ \"))))(Tile((id \ - fb05cdc7-856b-413c-9130-26a7b33fb7a6)(label(true))(mold((out \ + 6872022a-3300-4e9e-ae6a-49daf0b97790)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d3cb1bb1-3557-4483-b9ef-8df266b162c2)(content(Whitespace\" \ + 2d7c6e87-5b3e-4ff4-8514-d682ec7a05de)(content(Whitespace\" \ \")))))((Secondary((id \ - 277e68f0-754d-4e80-8a7b-d56b9b9aa9f4)(content(Whitespace\" \ + 7a69429a-591c-4f9f-a5d9-439ec1f120cd)(content(Whitespace\" \ \"))))(Tile((id \ - a9256755-3fd2-4341-8307-7806781ac7ac)(label(1))(mold((out \ + 14b24f72-ec2b-4589-beb8-4b3314e41498)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dce7ceae-84ee-4d61-8c22-b695f164af14)(content(Whitespace\" \ + 91020521-c6dc-4bd8-badd-f3416f3fe93a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fb80563f-83de-49db-8e2a-a9211d8c0b0a)(content(Whitespace\" \ + e7a09ea1-510b-462e-a929-d9bd655b7259)(content(Whitespace\" \ \"))))(Tile((id \ - ce8523a7-3bf0-46ed-9e10-c06b9cbb72a7)(label(1.))(mold((out \ + 8387c731-0159-402a-972a-1a8ed7eaecd1)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ff99f97c-f2ff-400a-bfc8-0c9a6bcff924)(content(Whitespace\" \ + 6fcf4db7-1323-4584-9915-05dbae661428)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 695a14e2-4ca6-46fd-99eb-862ef7629ffe)(content(Whitespace\" \ + c6870c5d-4d41-47d1-8db2-61e108e340ec)(content(Whitespace\" \ \"))))(Secondary((id \ - 592c2ffd-79a2-45c3-bc3d-283cb6aa7a76)(content(Comment \ + 6ca1c678-8486-452e-8f06-a5e95d454eec)(content(Comment \ #err#))))(Secondary((id \ - bcb2d205-cf7c-43ef-acc3-978957fecbe9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25ed166a-87e0-4172-818b-2b62a8bda24c)(label(let = \ + de49e5f0-5a9a-420a-945d-3d5ca433f4c4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cf899405-b2ba-4437-b2ea-e6b1b3eafc4f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9868c377-1e5e-4a84-a575-cc38ab948866)(content(Whitespace\" \ + 3040f666-4ca1-4ec6-9289-cefe043e6ca4)(content(Whitespace\" \ \"))))(Tile((id \ - 4918c91e-8e50-4735-883b-a356720ea9d2)(label(_))(mold((out \ + deed784d-18f6-45e1-b458-4912a2376db5)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a52427c4-8fad-4952-9ce2-071dbbab89d9)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 8fe334cd-5fa8-4d94-84d3-34385126ca98)(content(Whitespace\" \ - \"))))(Grout((id 653091cf-f907-4593-90a5-0f8c07a68006)(shape \ + 117e1a3b-efda-49fa-a2b5-3fda0fccb60f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Grout((id \ + 43c44d38-10ee-4fac-9bba-4b1e54a5cad7)(shape \ Convex)))(Secondary((id \ - 991a094b-7379-4445-a8ee-87b39301f44b)(content(Whitespace\" \ + 179abc48-6e04-4009-91e9-eb8866ef9bb1)(content(Whitespace\" \ + \"))))(Secondary((id \ + ae4287a5-b463-4d8a-afde-d9bec66496bc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8f269907-6535-4e08-b51b-9091c5d9d441)(content(Whitespace\" \ \")))))((Secondary((id \ - c7ba46b9-2795-4e23-9257-c980fa33f40a)(content(Whitespace\" \ + d555a4a0-0b6e-454d-9762-c119366591de)(content(Whitespace\" \ \"))))(Tile((id \ - 4839dfee-a097-40eb-b968-4762751a00cf)(label(fun \ + f13b0f2a-6321-4dc6-a269-1b807dcd2664)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fb185c7a-882a-4d4d-a696-b835827a067e)(content(Whitespace\" \ + 04cdbba4-b492-480e-bdb3-3760ee05e70a)(content(Whitespace\" \ \"))))(Tile((id \ - 3386719d-5ae9-466e-bcbb-76c10b1a7cd9)(label(x))(mold((out \ + 62579b9f-9951-495e-b4f1-3af16e705817)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cf81b859-0f34-44cb-84c4-ee0a294618b3)(content(Whitespace\" \ + 1847fab9-d0fa-4ab1-828a-e2e85ea677d6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f0a26556-e334-473c-8cf8-c57092e4f36a)(content(Whitespace\" \ + 1ae7f126-9ade-4bcb-857f-28a5921774ac)(content(Whitespace\" \ \"))))(Tile((id \ - d5d5e598-a807-4bf5-bfec-fe007c7b3a22)(label(if then \ + 96071fa4-fe6c-452c-86fa-11fda0fcc1ba)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c8e619cc-2d91-4991-85d5-546da420b09d)(content(Whitespace\" \ + 3e5e2802-1bee-492c-bd05-f7a7a99f4f69)(content(Whitespace\" \ \"))))(Tile((id \ - 3a199739-00ab-427d-868a-d401e27d83fe)(label(true))(mold((out \ + d270ef9d-534f-40b5-af9a-1ca1230ccde6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ac76f6fa-c89a-483b-bf41-4593f9f1b21f)(content(Whitespace\" \ + b0cbc5dd-341f-45b1-b5f2-d89a443dbded)(content(Whitespace\" \ \")))))((Secondary((id \ - be7ef864-67a0-4fe0-9bf6-4f882754dc82)(content(Whitespace\" \ + c38099ff-4da1-421f-ba6e-066cdbf14b83)(content(Whitespace\" \ \"))))(Tile((id \ - dfa24cb1-5893-41e9-a062-bd4ec11e605e)(label(1))(mold((out \ + d8506edc-e8df-485f-9c7a-104fa61efe06)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 50514c7a-0b13-4c44-80d5-a3357fcc0012)(content(Whitespace\" \ + 0a082205-0eff-41cf-88d5-964cc77b9945)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 490e8e38-b288-4122-bc9f-ec6882b9ff61)(content(Whitespace\" \ + fb8da1ee-7b45-469f-9a30-214b0fec876c)(content(Whitespace\" \ \"))))(Tile((id \ - af9ae9a8-74b0-4d58-8107-7dba40c5e153)(label(1.))(mold((out \ + 95cf7299-f2ef-4335-a7a4-4b965715629d)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d8cbf47c-8aa1-4f01-b414-892b1512aa51)(content(Whitespace\" \ + 3a72a887-0549-429b-bdf5-5e4f4d576fa4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0083e628-0325-46bf-a55f-b2d9673a1778)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c7603d2-1f45-46e9-9fc4-477dc7140cca)(label(let = \ + 48ace48a-ed83-472d-a862-73e3455fb2de)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 064f3cff-0441-43c1-a967-adad6d386160)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 37df505f-e3b7-483b-85e1-99d1a420a9b6)(content(Whitespace\" \ + 2ed8f4f4-d6d5-4f2a-87f6-8e6285746d2c)(content(Whitespace\" \ \"))))(Tile((id \ - 35390017-9451-4508-a83b-7524bad86fc4)(label(_))(mold((out \ + 822c6d9a-07c6-4483-8022-d6a17f0bc077)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a3206d48-65ee-4b0e-b65c-addfe0e9c62e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + aee38cbd-3ab4-43b9-a4a0-fa590c53abd9)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b7ecddd6-8846-4963-a461-1f0b9bd84979)(content(Whitespace\" \ - \"))))(Grout((id 4da9fa71-62ee-4931-bcd1-1a33bb41840d)(shape \ - Convex)))(Secondary((id \ - b3f4fb40-e05d-466c-ab85-39d6e23e0767)(content(Whitespace\" \ - \"))))(Tile((id \ - def384f8-b29b-4dfb-a36d-85a809641dbc)(label(->))(mold((out \ + 0d707e62-a533-4dcf-8c58-234a04abede3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 74967d24-9dc1-4351-ab9a-50b96437d5ee)(content(Whitespace\" \ + \"))))(Grout((id 0a083e34-4118-4771-9f7e-4a96bab5e133)(shape \ + Convex)))(Tile((id \ + 85eb2e99-1220-4a46-98a3-5f2b34050242)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 3bf09644-328a-4419-8c85-f02f99efb9d2)(content(Whitespace\" \ - \"))))(Grout((id a95b9978-19ec-48f9-ba13-6d458ca30443)(shape \ + Typ))))))(shards(0))(children())))(Grout((id \ + f2e751fe-876f-4533-8463-abc68f0d53b2)(shape \ Convex)))(Secondary((id \ - ec61c941-3afd-4226-8ffc-fc1b54122412)(content(Whitespace\" \ + aa56d842-4a1e-414f-ac0c-9b7d818689f9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 44f0b9ce-60cb-44ce-a4f9-4321a4acc6e1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8510a26a-8889-4828-9f02-a9a3ba561a04)(content(Whitespace\" \ \")))))((Secondary((id \ - b5fd0857-94d1-45a2-8ac0-41c72af48c00)(content(Whitespace\" \ + 773e1734-2619-4307-a0ca-5b2d37e3d703)(content(Whitespace\" \ \"))))(Tile((id \ - a3677a6f-6aa9-44e8-a44e-f4643498eec4)(label(fun \ + 70715b3a-c763-4384-b3aa-deb432993c03)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 17fcc7ed-aa0e-493b-97a8-aa78cf51b2fe)(content(Whitespace\" \ + d73b3951-2dd5-49e9-868c-15a68e938d6f)(content(Whitespace\" \ \"))))(Tile((id \ - a25707f6-8e51-420a-aa12-05df1b5b9152)(label(x))(mold((out \ + 18a27aec-99fb-4526-b012-ff658d71b74f)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d22d1ad5-68bc-4ff3-ab87-1eadd3a003ec)(content(Whitespace\" \ + 00e9634c-0987-49f7-b0a9-2b7ae1957355)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90fdd949-668d-4977-a390-869262719fab)(content(Whitespace\" \ + 21f70fa5-6916-40c1-87df-2bc094477f44)(content(Whitespace\" \ \"))))(Tile((id \ - 0557157c-33b3-43b4-a046-c7b881d19216)(label(if then \ + fe517fb3-7e2f-413a-9985-5bf7010219ba)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 755a7811-722a-41f6-9b56-80cdfda1b034)(content(Whitespace\" \ + 3d1dfced-c3eb-4c2e-86f8-d7bdf755c8e3)(content(Whitespace\" \ \"))))(Tile((id \ - 7b63343b-a942-4302-9ce3-56ef30b62d39)(label(true))(mold((out \ + 302dd1bd-0039-4920-8229-5d7126519725)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffbc6847-3a7e-4b9e-9514-92e5d8b3e277)(content(Whitespace\" \ + 26b01537-34e4-4857-8046-0e93cbd5bdbe)(content(Whitespace\" \ \")))))((Secondary((id \ - bc4fee4b-bfc4-4d8d-a21c-32ddd20d4115)(content(Whitespace\" \ + 3fd00fed-3bfe-4f3c-a9c5-3e5398415dfc)(content(Whitespace\" \ \"))))(Tile((id \ - 61ef3fd6-dc5e-4173-a46c-21a4e9e903b7)(label(1))(mold((out \ + 56400756-047c-47bd-968c-eb8d8b407a08)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1a42a366-5df3-4b08-b9b8-ddc50e9fa073)(content(Whitespace\" \ + d2ac233f-d857-431f-aacb-7f41e06fc357)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d36add28-c6d6-4d4a-ae6b-3b53f65a813c)(content(Whitespace\" \ + caeb9b1c-c0a9-4a47-ba1c-1d52c41bc5a9)(content(Whitespace\" \ \"))))(Tile((id \ - e6fb11d1-572b-4992-bb6f-c3ce42c31a5b)(label(1.))(mold((out \ + e4dd5f47-4d95-486f-84e3-c8cf91879b5c)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a1564a6d-ddcd-4382-b57e-1852880686af)(content(Whitespace\" \ + 3ce7105b-92e9-4837-b692-e1aa874e790d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4c9de5ed-d3f5-40ab-957a-ab2b7ebacf82)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e9a91bdd-1b8a-4628-805f-0a21e5b22197)(label(let = \ + 98c8d6af-39e8-4af6-9c99-ba35ce4a3a25)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 68fadcc7-d4c3-4222-aaa0-590adaa90209)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2d6fed2a-48c6-4b44-b0c2-ab7d7f51af72)(content(Whitespace\" \ + f79c1c00-935c-4015-9d85-9e0f5d140616)(content(Whitespace\" \ \"))))(Tile((id \ - b2cdc1f9-3351-483c-9638-f771257810d1)(label(_))(mold((out \ + 5e83136a-94aa-4a91-80a3-53e946b862f5)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8e161d9b-fe98-4adb-846d-3183117c15fc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + c9f5e43e-4156-4694-aa8b-bdae5a040092)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7e9e9af-16d9-4be7-b772-47fe800aa248)(content(Whitespace\" \ - \"))))(Grout((id cf9694be-3b9f-4fd3-ad55-858faa4e5f02)(shape \ - Convex)))(Secondary((id \ - de591d6c-a4d8-4591-9c3d-016e28ab0985)(content(Whitespace\" \ - \"))))(Tile((id \ - 57226fd7-6fe7-4284-a58e-3e828da4c10b)(label(->))(mold((out \ + 9abd94ac-c981-477b-b931-bfa8edbb948d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9e6529c3-72a0-4ccd-a40f-6d2abd16f4e4)(content(Whitespace\" \ + \"))))(Grout((id d8a7e43c-e62d-4a68-9392-34c3d520ee76)(shape \ + Convex)))(Tile((id \ + 1329720c-273a-4269-ad71-1a28f3fd2535)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0d276a95-1daa-457d-ab45-dd7874086238)(content(Whitespace\" \ + 868cd88f-7e80-49bb-b3a3-c4a3cb8c9ee0)(content(Whitespace\" \ \"))))(Tile((id \ - 2c187a0a-a6d7-4dbd-bf2f-1254faf967c8)(label(Int))(mold((out \ + 8f6a27cf-2de2-462b-8b77-649f84c6a6c5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c5305727-7034-47c4-9b13-76e2ac8b158f)(content(Whitespace\" \ + 753de3a0-5a42-49db-bb4e-8466f6a5052f)(content(Whitespace\" \ \")))))((Secondary((id \ - 66945bb7-c5c7-4a6a-bb95-9ab4a4096aca)(content(Whitespace\" \ + 305a5579-fabc-4a3b-a564-28f2d999cc52)(content(Whitespace\" \ \"))))(Tile((id \ - dcf922aa-beb1-4e2b-8b31-79696c1ba35e)(label(fun \ + 456377c1-810e-4383-bd2a-b64bc1e5a158)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b86c3ae2-f820-4b20-8f4d-c8cd2d034d4c)(content(Whitespace\" \ + 44ed9cdd-e3a7-4324-a241-ba543cc3a45e)(content(Whitespace\" \ \"))))(Tile((id \ - 78164bbb-a765-4907-a883-0b43f38c8f40)(label(x))(mold((out \ + 8d053487-9623-49b8-91da-c79e50ceb1ac)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7c476086-ecce-47b4-b7e0-6eda1e7f99ce)(content(Whitespace\" \ + 8e8e1846-4348-4b5a-878e-cc2c734c0e2a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bc736e1b-63f4-4e30-b612-8cce38bb2f4f)(content(Whitespace\" \ + 51d1c856-593b-4502-b765-6597df73fec9)(content(Whitespace\" \ \"))))(Tile((id \ - 774faf15-02ca-49db-aa2c-ed9951c7e422)(label(if then \ + 5db724d3-eebc-4037-af82-ae205ab5e6ab)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dec59fd4-6edc-4055-a1e8-db02398bd11e)(content(Whitespace\" \ + d389b6b7-40ef-476a-af68-fccdc0e7e467)(content(Whitespace\" \ \"))))(Tile((id \ - 66dc2eb8-49b8-4770-a380-03ecb1c39654)(label(true))(mold((out \ + dc561af7-7351-4e8c-ad97-8a2fc30b343a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a6da3ecb-cbbf-4467-b699-f33c2e198794)(content(Whitespace\" \ + e48d2cf4-8a1f-4b1f-a39e-e3ddea04c282)(content(Whitespace\" \ \")))))((Secondary((id \ - 97c06b6c-f2fc-4f85-8233-e1e24f55f183)(content(Whitespace\" \ + 8acb9af5-9917-4f3f-a6e5-1502ff6b759b)(content(Whitespace\" \ \"))))(Tile((id \ - 49f69120-67f3-4f12-8473-25854331d0a7)(label(1))(mold((out \ + 82c3ee4d-7220-4614-9549-506547c5acaf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e7adea10-9083-4988-afcf-d748d5c83dc0)(content(Whitespace\" \ + bd36ce97-fde8-4c8d-8b72-d5984f2871f9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4bf9155-bdf3-4583-810d-7fbc5963d1a4)(content(Whitespace\" \ + 53d00df7-b40a-4378-b3c8-d5d73e9877f6)(content(Whitespace\" \ \"))))(Tile((id \ - 736d66cf-946f-4560-89b4-3fc126888dc1)(label(1.))(mold((out \ + 3425209d-3591-4e23-b4c9-faa1a2a22ea0)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4492e518-d63e-4b85-91c2-26cb60446eb3)(content(Whitespace\" \ + d6d6bc35-54ad-4b9c-9027-1d46fa0107d4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1e2692c3-306c-409d-b336-cef082edcd8c)(content(Whitespace\" \ + eb62436d-b80b-40b3-af6e-e96565c2eb37)(content(Whitespace\" \ \"))))(Secondary((id \ - ae09d83c-ae42-4b0e-8765-8aee441f0616)(content(Comment \ + f335a09b-ce6d-4f17-9fb2-652c203d3d20)(content(Comment \ #err#))))(Secondary((id \ - 03b03c43-459d-491b-ad03-a72757614270)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 092b9051-f708-4479-9166-d6161e6b254f)(label(let = \ + 34846444-6996-48d6-9abd-8fd89b065e08)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc034f74-64e1-4075-9a5c-e50fc037e444)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd68afd2-4abd-43b7-b370-539fc05fc7f5)(content(Whitespace\" \ + a5bfed1c-eb59-4922-98d9-b1de5e57c07d)(content(Whitespace\" \ \"))))(Tile((id \ - b4ed8e27-adb1-4436-b2d2-fe1faf8d36f1)(label(_))(mold((out \ + 12565b03-ae6a-4c95-8bbb-8906e752943b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c21f3089-a8fa-414a-b6f4-d07fc101fccc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 9d24149e-0058-4a88-8509-795db2931cfd)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 583749a3-eba6-4e91-9cfe-36ff52355aca)(content(Whitespace\" \ - \"))))(Grout((id 4e5cdbcf-6fc5-48e0-abf0-2fc5054d3574)(shape \ - Convex)))(Secondary((id \ - 5a84df8d-23ef-4dac-8388-201f94248eb4)(content(Whitespace\" \ - \"))))(Tile((id \ - edb29728-1267-4abc-9081-195f6663856f)(label(->))(mold((out \ + 0cc42648-ef8c-4e16-b848-703d20f09d88)(content(Whitespace\" \ + \"))))(Secondary((id \ + c0ce46b9-d2a5-4119-908c-0d75dc673224)(content(Whitespace\" \ + \"))))(Grout((id 0aabbfea-3979-4116-aa53-0e38d5e3ab9a)(shape \ + Convex)))(Tile((id \ + 12685639-fb4d-4ae1-aacb-f7ee76b44e48)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a308706-b82c-4215-a4bd-c8cf8fbd1a8d)(content(Whitespace\" \ - \"))))(Tile((id 6bfd0ba4-08a4-4f77-8b64-126378c1907e)(label([ \ + c8202885-1ee0-4736-bc12-5ba937e73829)(content(Whitespace\" \ + \"))))(Tile((id a3dabe24-7c0d-4ab0-b0a6-d202082db47d)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Grout((id \ - e89b84de-7ab4-46de-a7d5-94abf6588ec0)(shape \ - Convex))))))))(Secondary((id \ - f7dde1a7-74ac-4b68-bf6a-812a666fd963)(content(Whitespace\" \ + 667ef115-6b63-46b3-9da6-106b1225816b)(shape \ + Convex)))(Secondary((id \ + a1b161b3-425d-4994-b63a-8126ea823754)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cc1b0d4d-3f7e-4f21-9a74-1e3431932d2f)(content(Whitespace\" \ \")))))((Secondary((id \ - 4ee83851-34f6-4867-a055-ca51562dfb48)(content(Whitespace\" \ + c606ecb7-008e-4af1-992c-c592e1933ebf)(content(Whitespace\" \ \"))))(Tile((id \ - bba577e3-68f9-4353-ae2d-e24914773aa9)(label(fun \ + bda9cb2d-1e25-4d02-bdd2-ee2a31c5c746)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 342ca27b-4acf-4a91-aef6-2426ae0200a6)(content(Whitespace\" \ + a25b25c1-74cd-4e58-9ea0-195c88ab7d6a)(content(Whitespace\" \ \"))))(Tile((id \ - 6271d837-e1af-407a-8f42-902f46019fdb)(label(x))(mold((out \ + b17b75ae-abed-4317-a7e6-02aa78a53a78)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3857a916-2ca2-4b91-9ce3-08bdcea49694)(content(Whitespace\" \ + 73b73463-0a74-4475-ae33-3cef3812dda5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 830c1a4e-d2eb-4d27-b5af-9edfe71db503)(content(Whitespace\" \ + d69e4e3d-e936-4a55-ba6b-bd134db58d6d)(content(Whitespace\" \ \"))))(Tile((id \ - 5c18044e-489b-458e-ab15-649911a03030)(label(if then \ + b6104806-53f3-4022-8f61-96a1d49d9632)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 389ce73f-f26f-4be2-a221-dc4713f67f29)(content(Whitespace\" \ + 8035953a-0f49-433d-90f0-4bfc3dca5ca8)(content(Whitespace\" \ \"))))(Tile((id \ - 1c4d1edf-c38e-4a8b-a654-eda7ac54fbfc)(label(true))(mold((out \ + d26deb3a-0abf-4794-ba43-64728e5450a1)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5e8c1968-ee4f-426a-a161-a578efb13975)(content(Whitespace\" \ + 8ffbbf78-bcd6-41b9-9d50-2932a7d4c256)(content(Whitespace\" \ \")))))((Secondary((id \ - 802b0b26-b087-4fc5-b422-fd7727778899)(content(Whitespace\" \ + db7c9da9-3cce-497c-93a1-87e3fbfb40d8)(content(Whitespace\" \ \"))))(Tile((id \ - db1691b5-be53-42ea-a42b-48615ce08542)(label(1))(mold((out \ + 27bac803-81dd-4799-b303-7248ed2d209a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3815c49c-0867-467f-9881-1ebb7e272bbc)(content(Whitespace\" \ + e02d8b52-0a2d-41f6-98f2-b20d9021d1cf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90d59c52-5f6a-4dd5-a008-08a674362dd2)(content(Whitespace\" \ + b60cc93e-b16b-42e7-933d-63f0e98e73bd)(content(Whitespace\" \ \"))))(Tile((id \ - 77a1c18c-e388-464c-8a96-99d509f09a60)(label(1.))(mold((out \ + 0bd672d0-164e-4012-bfd7-2e74221b3649)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c4b13785-8b02-4432-98b3-734f7f00dee5)(content(Whitespace\" \ + d471b5e1-e2ff-4e62-b9bb-2dbcd3188731)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c4f76c84-7f32-4d47-b5f1-81bf03e05f9d)(content(Whitespace\" \ + 2b8a9180-605f-42bc-bcbe-cfc18a05b40b)(content(Whitespace\" \ \"))))(Secondary((id \ - f791a637-6547-4952-b2af-2df75636a400)(content(Comment\"#2x \ + 71d414e8-1708-46aa-8905-95e07acf1b1a)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - b280e9ea-b425-4fed-a57a-3299273288d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 12f499da-76c3-4ae2-93d0-5ca9e69753b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 232006c7-a8ef-48b8-9a78-3cf60d23ceaf)(label(\"(\"\")\"))(mold((out \ + c614d0f8-21c9-4d85-a949-6e4e87f46f48)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 54c730c3-7faf-40ea-be28-3388ce87163c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 636162a6-c7da-4066-8f6f-2d412def30c0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - c4738729-fba4-45b6-8020-a79d3a26c31f)(shape \ - Convex))))))))(Tile((id \ - cffc0f76-df2f-4dae-a3ce-3d509789faf9)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 3841372b-09b8-4d63-898e-875a34b3214b)(shape \ + Convex)))(Secondary((id \ + 5cd847c6-0ce3-4aae-9087-708fd1d0879a)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 4abfdc18-3c1a-41aa-aa78-0d6377a2a70f)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - f6e93383-434a-48e3-a0b9-9186037e3047)(label([ ]))(mold((out \ + a3bafedc-1548-4893-9f8e-b25d0cc55a8d)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a9cda473-0dbe-410f-b9ad-521eb61cf321)(label(\"(\"\")\"))(mold((out \ + 60f0560b-3ba1-4660-886c-b7dba36edeff)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cb5da907-a7ee-4650-9c61-27b4e3d65121)(label(if then \ + bf9c7ad8-3b88-454c-8cfb-d288b7dccec9)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b6fc370c-918a-434d-b3b6-cdd8eabff95e)(content(Whitespace\" \ + 3aa5738b-5699-42a8-950a-21b482350f1c)(content(Whitespace\" \ \"))))(Tile((id \ - ed44da3d-79ac-4881-98a4-e782ba366300)(label(true))(mold((out \ + 2302cecd-02cc-444d-a264-47d5c302e937)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fba985da-7e06-4f50-a970-38d7c6ae21a7)(content(Whitespace\" \ + f4629cc0-f6bf-491e-9183-307029a65d83)(content(Whitespace\" \ \")))))((Secondary((id \ - 651eb65f-6715-43ac-812c-f1f48bd31f4f)(content(Whitespace\" \ + 261ae6a5-7bfc-4533-8c35-c2e402da95bb)(content(Whitespace\" \ \"))))(Tile((id \ - 5866ac7e-9854-4845-86a3-02fb42bb4d6e)(label(1))(mold((out \ + 0fcaed94-de86-4486-9587-989012c9eb55)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 955402bf-b94d-4e9a-b95f-440e8a942c04)(content(Whitespace\" \ + 1182ff09-84fc-42ab-a622-4def1281e1ac)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d4fe1496-194e-4abb-b7ab-7f0aab65d877)(content(Whitespace\" \ + 41f37e87-03a4-470d-9ce1-4eff1401c050)(content(Whitespace\" \ \"))))(Tile((id \ - a3157ede-51e6-4eb4-a998-15ec007ca8fe)(label(1.))(mold((out \ + 3aab3daf-8cc8-4c82-bcd9-5ec2314274d8)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - d5ae6ad5-5f2a-4934-9fa7-ffb96b15e9ce)(label(\";\"))(mold((out \ + 5f3d079d-fe76-4ecd-b8f4-0c46093a6c9a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2e1b0250-b0cb-438a-addf-8604f846c3af)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a3a9866e-fb72-4fc0-aa55-e54dc312fd45)(label(1))(mold((out \ + a8b5a329-de3a-4841-ac8f-82bd2140ffab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 49e39b6a-2f60-4c51-976a-cb615ea58c2d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6367200c-4fd9-412c-be16-02b8bebead75)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 94e615d4-8848-475d-9045-c1f37544edc0)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - a56c9c39-7aea-4e94-ad02-25c9017c06ee)(label([ ]))(mold((out \ + c9949ca3-6d3b-408c-bc28-d2fcf6bcd2b7)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - aaa9b7f2-0032-48e3-8658-07f826c0a19c)(label(\"(\"\")\"))(mold((out \ + 8682fab8-c999-4af5-b82e-f4ee7893f25d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - accb22c4-cf7b-4bc2-a1f1-4d0c80a4635d)(label(if then \ + 66d11400-7cbd-413f-a6b5-85a2fa0e987d)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e1b1486e-f426-4623-869f-be7d4b147b6c)(content(Whitespace\" \ + 6854cb07-e353-4b9e-8170-065592f7f659)(content(Whitespace\" \ \"))))(Tile((id \ - 9a4bed25-55cc-4951-9efa-027aa0216064)(label(true))(mold((out \ + 97df045d-668e-4e18-a357-b5eccaf7fb19)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 63eebaad-cc2d-4899-bc2b-22fbf548c4dc)(content(Whitespace\" \ + 50295be2-19cf-41a4-9cdf-8a2cd827de1f)(content(Whitespace\" \ \")))))((Secondary((id \ - 4f914036-bad1-4d1b-b8cd-01000178c611)(content(Whitespace\" \ + 95567b53-0ef9-404d-bcbf-02ff2f835b2e)(content(Whitespace\" \ \"))))(Tile((id \ - a07cee91-fc9a-4f3c-aae3-5e82cca71f06)(label(1))(mold((out \ + ff0591cc-58e3-4c60-b040-279a4e7aee46)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 33c9f869-287f-4ebe-8bdf-f8e1e03558a2)(content(Whitespace\" \ + 39b24655-432e-4780-b720-53728762e0df)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e5ef7784-cd98-410c-b653-22ab8af2b11a)(content(Whitespace\" \ + 180e3b91-e051-4ab0-88db-0896c48528cc)(content(Whitespace\" \ \"))))(Tile((id \ - 3ab4da6a-7aed-487d-b0fb-3113913c693a)(label(1.))(mold((out \ + 4f0129e4-da68-44b5-a71c-29a655da84d2)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 09efe17e-bc3a-44ac-99a7-a868e3452897)(label(\";\"))(mold((out \ + 87d70ccc-8c82-4f85-96eb-ae0ab9da8b9b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - af722baf-632d-4d28-92d3-c2f914bd31cc)(content(Whitespace\" \ + ea5488f1-6629-4cf9-afd2-cab2de7964f6)(content(Whitespace\" \ \"))))(Secondary((id \ - f2e03598-6017-43f2-be61-b8442de25fce)(content(Comment \ + 901c15eb-34f2-4a1d-ab7a-19ef62c6d980)(content(Comment \ #err#))))(Secondary((id \ - 88af9827-b2be-471c-add1-70a096838b49)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e01b6ac4-8715-4662-9fc1-87aeb2060bf9)(label(\"(\"\")\"))(mold((out \ + 19d8602a-bf4a-4218-a64f-c26b14657c01)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6c89313a-3e00-4ad4-b477-10d05153db22)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ada54c0-de79-4600-bdd5-f42f2f4744f8)(label(1))(mold((out \ + 69a79e4e-6e3b-4846-b1cf-bf0847154b1e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 54ec4955-7647-4737-87d4-8e21a18943b9)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + b3de2317-c5a5-497e-a39e-7bdfd15cf1bf)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5c6fe323-e200-4fe9-8e5e-3a890b129f68)(content(Whitespace\" \ + 2c7de733-826c-4b17-b7df-07902020a47d)(content(Whitespace\" \ \"))))(Tile((id \ - 3157b120-93b8-4d06-bc3e-cfde87fe9690)(label(1))(mold((out \ + 4548b419-89af-4f32-a37f-82f321a6d64e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d4a9bddb-e237-4100-b2ed-305e25afd150)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 6750d64f-a8a3-4106-a203-89382a98db38)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 065b6501-e20b-48af-94f3-9265d968d3c3)(label([ ]))(mold((out \ + 672d67af-99ee-4ac1-82cb-2b2fb08a36f8)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5e4eb96a-5665-41e1-8b9c-b4cc34bf0c0c)(label(\"(\"\")\"))(mold((out \ + d121cfed-4a09-44e6-b9f7-ba0cec477419)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a56978d8-b5e0-491b-8a2b-7648e836e8fd)(label(if then \ + 1549aea3-e34a-4df4-ba28-56dac1da800b)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f9c291e7-47a6-4d4a-8554-85853d267d7a)(content(Whitespace\" \ + a9e18854-872a-4510-a927-73f90a9a9f25)(content(Whitespace\" \ \"))))(Tile((id \ - 230c9d16-397a-415e-863d-3da8904b8bdf)(label(true))(mold((out \ + d2757960-b19b-4e09-8432-79840ef0b383)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 23eee358-279b-4887-acd9-be029dc2a7d2)(content(Whitespace\" \ + 0a518437-9a15-4dc8-8ddb-4ab6f2e846ca)(content(Whitespace\" \ \")))))((Secondary((id \ - 388b2fee-7809-4967-9e99-ad49f557a9f4)(content(Whitespace\" \ + 16b7e52e-b50b-4b36-b5de-046bf60b4ea8)(content(Whitespace\" \ \"))))(Tile((id \ - ec0c9439-18fa-47c6-89f4-68e8bfd33cb3)(label(1))(mold((out \ + a005d2ac-4737-4657-a169-faec12ff88ba)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d15453c9-318b-447a-a077-6c85578cde91)(content(Whitespace\" \ + e89d0641-77cc-41f0-a545-554c6712acb3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b3fd18c7-e008-4eea-8532-ac140f0fe666)(content(Whitespace\" \ + 38925408-d6a4-4a66-8f4c-e9196da15cb1)(content(Whitespace\" \ \"))))(Tile((id \ - b89d7d7f-95fe-42a5-8136-dbcfdaffe43b)(label(1.))(mold((out \ + b3e06a0b-1391-4d3f-b9c3-00de8b2dff7f)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - adff873a-7d51-4403-aa11-d637d7c536b5)(label(\";\"))(mold((out \ + 386614e0-40df-43a8-be72-9b53e345e123)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 692d2d7a-9aab-4a1e-8ea0-024c787bd0f2)(content(Whitespace\" \ + 6f527cf8-c425-4167-bb7e-9d189a776e38)(content(Whitespace\" \ \"))))(Secondary((id \ - b2bb1ffd-3dbe-4c43-83ee-d0e2f9cbbdab)(content(Comment\"#2x \ + 63030444-f03c-4b62-89ab-6fa5e5a12d9c)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - 47be2cd3-b03b-45a8-b26f-f92060bc3004)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5d198806-3a30-42ac-95c0-1df2acdffadb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 82dc0544-9ae9-488a-a338-819aed1a7c66)(label(let = \ + 82ecaeb6-25ea-44dd-9b48-1d118e2e008d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8736a384-0bc8-4ae5-8681-af82deeb09d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 25e07714-af67-45f2-8ddb-4ad8108248b2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - a1005730-3689-4276-af36-eed9216be5cb)(content(Whitespace\" \ - \"))))(Grout((id 700bdac9-76cf-4be6-98b1-c032587de447)(shape \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Grout((id \ + e1829670-10d4-43b0-ba59-73377143bbc0)(shape \ Convex)))(Secondary((id \ - c5844890-0517-4035-9bf9-160b2dd905c6)(content(Whitespace\" \ + c035c830-c090-4d8c-9b5a-b81ddcf483e2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7fe0ec74-af5f-4739-818e-d41629c99d06)(content(Whitespace\" \ + \"))))(Secondary((id \ + c95d445d-4d5a-4f7f-99aa-d0dfb2878255)(content(Whitespace\" \ \")))))((Secondary((id \ - 4d4ba1e9-1383-4ca6-b828-421d145b1214)(content(Whitespace\" \ - \"))))(Tile((id bf7c57c8-0bc0-447a-86fd-455f1f8de839)(label([ \ + ad38a685-38f4-48ec-b1be-08dbf34962c0)(content(Whitespace\" \ + \"))))(Tile((id 1235b1a2-6c74-4117-ba60-632df4438912)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - e47fffd1-3404-4eec-8a0c-bb44253a8a3f)(label(1))(mold((out \ + 87795542-aa3a-449f-8386-03804e15a7fe)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9dd9e624-583a-441c-8649-338da0a92678)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + d4081474-89a4-4b8c-8443-dbb20adc97c0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a2b0087b-2c53-4d62-b2b3-e1222c73f72c)(content(Whitespace\" \ + 2f4bba19-94b6-4454-847a-6639fdc4a411)(content(Whitespace\" \ \"))))(Tile((id \ - db8f24f1-e424-4ecf-819a-384144315f5d)(label(1.))(mold((out \ + ff1bd8e8-a1ad-4533-8246-ab506e878935)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94ff5cbb-c5ba-4d24-8db0-06a3ac347599)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + c3da2737-cd9c-4e71-83d0-2563c154cb3e)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c0f8eeaf-068f-4d16-bb5d-b7453ed807a9)(content(Whitespace\" \ + be0b228f-e3e3-4e09-8d79-84e9eb758d5d)(content(Whitespace\" \ \"))))(Tile((id \ - 1ce9a10c-7085-4b41-9ce1-c17cf835b689)(label(true))(mold((out \ + ec5c751b-b74c-4bf6-97d6-43098211a260)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 3f19f742-2f54-4c88-9157-76e4fde5317e)(content(Whitespace\" \ + f7a6a130-7d47-4b75-9ee8-41d3e0e0562d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a9ca07b3-0f93-4e17-aae0-418f77d6cf01)(content(Whitespace\" \ + 8610d248-d7f6-4b5e-8d91-1e7d9744c95a)(content(Whitespace\" \ \"))))(Secondary((id \ - 029b56d4-87bc-422d-9b26-05af5d126a65)(content(Comment\"#err: \ + 3b3b341f-57c1-44e1-abdf-9b9f5cde7af1)(content(Comment\"#err: \ inconsistent#\"))))(Secondary((id \ - 09dd70d6-502d-48b2-846e-c5f8efd647fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52f2c094-8b57-407b-80cb-925fe808963a)(label(let = \ + e65afff4-4845-4eb0-a639-e9a8b8a753e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c8149f7b-465f-4dae-99b7-b0626199840c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f57dce69-2cf4-4a2d-ad9d-7d40490ba01d)(content(Whitespace\" \ + 3c74242f-419b-45f6-b919-4f740697adf4)(content(Whitespace\" \ \"))))(Tile((id \ - 73fab713-03ee-4900-93aa-2c247ab1693b)(label(_))(mold((out \ + e92d4176-b2b2-40da-b251-25908c36aeda)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f0653d97-c095-44b2-8384-aa7ce7488e3f)(content(Whitespace\" \ + b5932dda-aeec-4a52-98d5-75e9ae8c3fe1)(content(Whitespace\" \ \")))))((Secondary((id \ - 47df5f2e-3a90-4ccf-b553-316fddb81a57)(content(Whitespace\" \ - \"))))(Tile((id fc2dc4d9-a9e5-45bd-a9d1-6507d203d663)(label([ \ + de1d871e-ae6d-4cc9-9a5a-e0bb71b4f716)(content(Whitespace\" \ + \"))))(Tile((id f4ea1612-4d0b-4c6a-8b8b-51ee6c9148bd)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 0b59e204-0333-401e-8afc-d6b4c63394c5)(label(1))(mold((out \ + 879c0a44-3772-4ba9-9701-f2254c1101ff)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 034534be-8504-4e02-918d-d368e0fddce7)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 6f168751-d079-4937-aa50-58a6d31f435c)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2b1f1e0e-b99e-4c62-a294-ff9dcf4b5520)(content(Whitespace\" \ + 29c607c1-7d5f-4e1e-bdc6-d8eaaa314b2d)(content(Whitespace\" \ \"))))(Tile((id \ - 1ea91616-8aec-412d-82f9-4e9351bbd291)(label(1.))(mold((out \ + bddf7cb4-ae4b-41ac-859d-7477ca11229f)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fbe8cbf8-4245-4ba8-a68a-b03eb53c3399)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 1346ef22-efac-4705-a792-44c5ddcbf6d9)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 007fb3dc-eaa2-4910-b467-287968ed26d3)(content(Whitespace\" \ + 3bbb7438-8ce7-450a-a005-e70b3d71690c)(content(Whitespace\" \ \"))))(Tile((id \ - e77e5eff-3894-43f6-96e4-13961e664183)(label(true))(mold((out \ + 1dea7062-64ac-40b5-8e4c-0df2a54db945)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d4ed2f71-1740-4928-81d2-b0c0151b5a7d)(content(Whitespace\" \ + 387c6d69-cc10-484e-bc21-243685620535)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1943c974-3ce2-4578-940a-728197ec1ec3)(content(Whitespace\" \ + 4f88f168-fd38-4905-ba22-10adb1c4b536)(content(Whitespace\" \ \"))))(Secondary((id \ - 48c7f1ad-35cc-4f97-95e7-c68ffe8023f7)(content(Comment\"#err: \ + 0ca424fd-6276-47d3-a467-d01ba7511f97)(content(Comment\"#err: \ inconsistent#\"))))(Secondary((id \ - 0f0be7c3-2c77-4e05-aba3-ae8405f61d16)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 03a920d7-95a2-4754-8416-1123bd6f2f11)(label(let = \ + 976a7b6d-0bb2-4d6a-9d73-c907f790d8f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f53ced4b-b4e3-4e3a-9828-80f2a5db49be)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 826ad200-168b-4a5f-af94-df033e42e4b7)(content(Whitespace\" \ + 37595043-73b9-4881-baae-19330a790b17)(content(Whitespace\" \ \"))))(Tile((id \ - ca9ddb7f-5f91-4956-ba30-44aa1648f245)(label(_))(mold((out \ + be03a8d6-b212-4ed8-8739-dae0d4f4ff34)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6dc24ff9-bf61-4a92-8f2f-b7c3f67217c2)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 1499fbd3-ca66-47ba-8411-7500ca3fe394)(content(Whitespace\" \ - \"))))(Grout((id e6ddec97-cd3c-422a-b214-ca8fd61c2331)(shape \ + 85827f59-8fa2-42b3-b16e-85b16115a71a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Grout((id \ + 4f805da3-bb11-4abd-80de-3f32590bba4e)(shape \ Convex)))(Secondary((id \ - 8d2a046f-1546-4749-858d-626905d77eff)(content(Whitespace\" \ + 9bd7ec55-b904-47b7-b5e8-7071ac0fcffc)(content(Whitespace\" \ + \"))))(Secondary((id \ + d8e5852b-4b88-4577-9547-80ae37bdc695)(content(Whitespace\" \ + \"))))(Secondary((id \ + f9850a4d-5e37-4942-a052-41cee4edb1ac)(content(Whitespace\" \ \")))))((Secondary((id \ - ae4808bb-0f13-4a47-8d93-7dc155ad32bb)(content(Whitespace\" \ - \"))))(Tile((id 32ae3fb5-4544-4cd4-a792-f9256875488c)(label([ \ + cc52ebf6-8415-40fe-aff1-c0f76074243d)(content(Whitespace\" \ + \"))))(Tile((id 7f4f0b94-04e7-40e4-9b50-187c48f41466)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - ff441609-be5e-4d1b-b544-9799d7a3011b)(label(1))(mold((out \ + 6bcd0145-dd52-4423-8db8-cd16d645dee0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b6463e8d-e7b5-4545-9fc7-4924aa2693a6)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + f6981a38-f10e-4af0-89d6-9d4beee1b089)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cd358f94-2daf-4f24-8548-3d5bce3213c0)(content(Whitespace\" \ + e1a96205-2433-437c-9f43-8c0dcb2d7270)(content(Whitespace\" \ \"))))(Tile((id \ - c5e0a263-a161-49ed-91c8-598982eab8ce)(label(1.))(mold((out \ + a1d84ce8-9aed-424e-b880-4f395fc09505)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1f911b96-1c72-4e92-92a6-7f2d5a352c90)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 9daf1c7b-1c6b-4143-877f-1cf0e1891459)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5b6d3a14-25dc-405b-8f4a-c0577ded0d7c)(content(Whitespace\" \ + 3786c8dc-be10-4a5a-baa5-cf803d79a6d1)(content(Whitespace\" \ \"))))(Tile((id \ - 433e239a-9d57-4e8d-88d4-3d051553fc95)(label(true))(mold((out \ + 0f470f1a-a504-49e3-b7ad-a479058d2f3b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b8f71dee-301b-4173-8fd6-f5daf5c8c00d)(content(Whitespace\" \ + 02f3fe02-2ae0-4bee-ad4d-e93be14f7f93)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 534a6cef-6e24-4f16-a7ba-2edbd118aab9)(content(Whitespace\" \ + c9dae562-af8f-4cb7-80b6-833723e10fbb)(content(Whitespace\" \ \"))))(Secondary((id \ - 0051a088-619a-4934-8f53-0219031c1bb2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3df4acfd-98e9-4fce-9853-95fb92574871)(label(let = \ + 4e3f449c-c053-4442-b560-e8ec3d77db20)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6649de5f-2a55-445a-9775-da3957a88578)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1cfe8911-f9b5-4422-95bb-443dae0d0105)(content(Whitespace\" \ + e964dd37-4a98-4fa1-88c0-fb948b0f0c49)(content(Whitespace\" \ \"))))(Tile((id \ - 25d47a4e-06ae-48dc-99d6-32a41983492b)(label(_))(mold((out \ + 36d9ba31-b1e4-418f-b940-d2d0ec7a1d07)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3959b315-bd21-4c0d-8385-3dc34326cdb5)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5e47205d-0076-4548-ba48-1a64b99e55fd)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 41cd46f9-c78b-483e-bc9d-5ba5248ce0c8)(content(Whitespace\" \ - \"))))(Tile((id 33511225-301f-493f-9ac5-0c48a3b2301e)(label([ \ + 634e5209-14b5-43cf-91f9-f14ed847a1e9)(content(Whitespace\" \ + \"))))(Tile((id 4037afeb-e36e-4302-85e7-acf5d9d94468)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Grout((id \ - a7219f30-6814-4af1-9fb1-560e9131e0d9)(shape \ - Convex))))))))(Secondary((id \ - 09487b14-597f-48f5-bf3a-5f01ce9e2bed)(content(Whitespace\" \ + 6adf8caf-e8c9-4693-b6f5-e3ce2ec3f28a)(shape \ + Convex)))(Secondary((id \ + 57f44fe2-18cb-401f-a3ad-d0ad42c667ea)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 34e5d96f-59dc-4c14-9bba-f0168d0cffd4)(content(Whitespace\" \ \")))))((Secondary((id \ - 5370e5d1-290d-4e66-9ba7-4c03e6723ff9)(content(Whitespace\" \ - \"))))(Tile((id 6b62996f-8ade-4ed9-817a-6b538a6918eb)(label([ \ + 29a44afb-3ecc-4b0c-9fe7-fcd55d232c0e)(content(Whitespace\" \ + \"))))(Tile((id 6d08adaf-f1db-4c8d-b60d-95e50086a9d5)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 9a080685-90e3-41d1-8f92-e7d253dc7245)(label(1))(mold((out \ + d38f39c9-cd02-4eef-a969-312735a9f93b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 369a1435-3a95-444a-9322-4055172d6863)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + f2e8fe38-23aa-4416-a2a6-dc0ce67a8cff)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d6a5c2d1-aed3-4c53-a454-2d3922735b2f)(content(Whitespace\" \ + 4f4fef1a-3da1-4ffc-b2bb-34b32a42c9af)(content(Whitespace\" \ \"))))(Tile((id \ - d58190ee-5471-4175-8fef-aceb5596ec09)(label(1.))(mold((out \ + e28e8421-7528-46be-bfc4-09e408b07328)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d8eac610-d479-4c9e-9577-cb9989ee9e8c)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 896819e3-8d36-4785-99b9-5d6410bfc56f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 03e22831-29ab-4096-8d75-455d5c164e84)(content(Whitespace\" \ + 259ec907-ea9d-40c2-8c89-79f929ca9b4e)(content(Whitespace\" \ \"))))(Tile((id \ - 782f78ca-f815-4a62-a570-fcaf036f954d)(label(true))(mold((out \ + 89472fd7-994d-4d2f-88ce-c9fc76501ebb)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2797e94b-90e6-4c45-8cb7-e069a6e5c16b)(content(Whitespace\" \ + edfaddc8-18f9-4740-a0dc-ffbd73cf02b9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 72fe75f0-3e31-4113-8f25-fce1dfafcf1e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fc4a0da5-2b7f-467b-9d51-c79d28bbd2ce)(label(let = \ + 910ce4eb-9ee6-41e5-93b8-88056d4f0a15)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ff9ec9a5-b43e-4997-a182-7ed5af4dc8a7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 663ff7ee-c38f-43fe-9615-7c4489dfa541)(content(Whitespace\" \ + 1872aef7-6646-4341-8f28-bd2be80aead1)(content(Whitespace\" \ \"))))(Tile((id \ - 66a49fc3-2189-451d-8f5b-87a4e7a4a1fd)(label(_))(mold((out \ + c6ae5077-2701-4fc4-9276-3d9573e207bb)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4ede6a03-d0d7-4332-8382-c88b3e0c2d11)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 962cd543-cc61-40bc-981f-016106c5feff)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2bf08639-ade9-4636-bb33-b789e670937e)(content(Whitespace\" \ - \"))))(Tile((id 971f3ba1-d70d-47d7-a9a1-dc52bc83fd36)(label([ \ + e3cd3dea-e503-4cac-be45-4f0c496eae08)(content(Whitespace\" \ + \"))))(Tile((id 50d17fe0-ddeb-4dc7-b80f-44c8f0d9b4f5)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 5632be0d-1afc-4c45-9fba-7b815246c884)(label(Int))(mold((out \ + 03711217-bb84-4d62-877d-c0e0260eb5f1)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - e016ef9f-b73f-4ca5-87c0-6e1b9d52fb73)(content(Whitespace\" \ + b0a3d9fe-e02d-47c6-a664-371feb82886b)(content(Whitespace\" \ \")))))((Secondary((id \ - 40558f24-ca8d-4dda-a0b3-13a39b1927f3)(content(Whitespace\" \ - \"))))(Tile((id a949b592-988a-46d0-ac9f-176609db6dde)(label([ \ + 233e147d-69ff-4e5a-ba14-4ed62da9f7ff)(content(Whitespace\" \ + \"))))(Tile((id cb7ea76f-9262-4c3e-8ac9-c53322121ecb)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 06fa3969-d9ca-442b-825e-dc407e6f6723)(label(1))(mold((out \ + 196648d3-e5a9-4947-8360-9f9a9da4654a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2bb73b05-ca08-4c0a-a04c-dadb433de26a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 12811791-9baf-4419-9595-cb4fb10cd330)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0f424bab-a2f3-4fe0-8a09-8f2cd90c3a07)(content(Whitespace\" \ + d5e8f98c-d849-43e4-8b37-0c292b1f3fb9)(content(Whitespace\" \ \"))))(Tile((id \ - 5a87620b-a433-4fb9-9d1a-09c9b3beab6a)(label(1.))(mold((out \ + 047516de-584a-4dac-9421-5977a1797f1b)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 512129f6-6a3c-49fa-bf77-83e9e10f4705)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 8d9a3e7d-5b22-467c-8d08-dbab65b27f0a)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ce93584-77cc-4b97-a406-c4462d511dcf)(content(Whitespace\" \ + f9f5fb80-80bb-49bd-87e4-3839751bdada)(content(Whitespace\" \ \"))))(Tile((id \ - 37022cb4-317b-4348-a086-5283db30d7b9)(label(true))(mold((out \ + 7263eb30-a357-4bc0-a921-be521a568292)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 67645fa7-6a97-4584-8064-fa31c7466741)(content(Whitespace\" \ + 2f193650-a183-450a-85fb-ff921d066e6d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8ae0eb5-666a-43ff-a24c-b8f82ebd4e9c)(content(Whitespace\" \ + 575fdc65-0333-406c-bec3-7182d02b24c9)(content(Whitespace\" \ \"))))(Secondary((id \ - c1852265-6f47-40cd-83ef-8fe57cae7e70)(content(Comment\"#2x \ + a6be38f2-b375-4cb9-a423-8a8a65a63a12)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - ce5d18a4-9cc3-4438-a7f3-431f8d3a2461)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dac99d0f-a7ce-4629-9f71-f49bd6a718c6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 440becc1-96de-4739-b860-ca47255d3d93)(label(let = \ + fffe9321-e2b4-4d5e-bb2e-ad18dc3c1a5e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 606b85c1-8648-4240-ab55-04fc9dc8dfe6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 209259a6-47ba-4793-ae04-7a8f06ee093b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d4ab6143-0bfc-4c9e-9bfb-b9ee50bd5289)(content(Whitespace\" \ + f9ea7ac5-4b30-4c56-b41d-5a38f76829ff)(content(Whitespace\" \ \"))))(Tile((id \ - 620340ff-4a97-4b5f-b39b-76f560bf58db)(label(_))(mold((out \ + 6e671de9-1f9b-448b-9e15-a84a28c2d184)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e7ff297f-b0a7-4c0d-9772-47acfe9a6d9c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + d0f6c712-29a5-458a-849d-f5177ae0e99a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6f00d686-a3ff-4431-b4c2-b70d3b4eca14)(content(Whitespace\" \ - \"))))(Tile((id 00df244e-2507-40cf-a767-3a29432ad8fe)(label([ \ + 1eafacf8-ee21-4ed0-9406-d98be777cee2)(content(Whitespace\" \ + \"))))(Tile((id 35376f6d-1bdf-4267-b6d8-20b0b438896a)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 130f2a32-39da-49cf-a550-754622dc404a)(label(Int))(mold((out \ + 86903098-1546-4347-bc11-360aa9098c76)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1eab60a0-5c07-4a92-82db-5971b1db666a)(content(Whitespace\" \ + dcc2b675-ad98-42e8-a243-f53e86576658)(content(Whitespace\" \ \")))))((Secondary((id \ - f10579e0-e416-410d-8ae3-12925c91671a)(content(Whitespace\" \ + 969762ed-babb-40fe-9f1a-9552903cfd8a)(content(Whitespace\" \ \"))))(Tile((id \ - 16944a0f-57f1-4e24-a573-1d9231d16e57)(label(1))(mold((out \ + 650b8d11-dcdd-4614-8611-6859baf55a66)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 317f017d-a9c9-467d-8cb9-e56c0495a060)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + b3bb6263-8c54-4ec5-bb41-d6fc9f97fc64)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 6aa18463-de32-445c-8338-c11780d4d4d0)(label([ ]))(mold((out \ + e985fe27-f75d-4faf-86ea-ca7e1c996ff8)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4a870256-b389-4bbb-95bd-47834fae994b)(label(2))(mold((out \ + 9374efc6-637b-4fc2-9de3-f07405bbb3d8)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 369ea7b7-0d09-42c6-8b54-6cb084d8270f)(content(Whitespace\" \ + a1610521-dbc3-4985-8f4e-a906256ac93a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5c3c92c6-a066-49fb-ba63-589c5b309625)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6dbcf6a1-4176-46e9-802a-b16c71d040ab)(label(let = \ + 5306ebd8-bb3f-4fb7-a852-095e09762309)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d3f479a0-cd47-480b-9805-094e92591f81)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9ef098ad-fe36-44f2-9487-6d9ff6656d48)(content(Whitespace\" \ + afd01019-a633-4e16-a005-0d68721528f5)(content(Whitespace\" \ \"))))(Tile((id \ - 1d8fcf7b-fa79-4de7-a9f4-55fff3ada3bc)(label(_))(mold((out \ + 2d291ec6-4d51-43af-8afd-f687621533e9)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cca7629b-c4d5-4045-a00e-197b16dffc60)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 7b11b2f2-73f8-4ebc-a307-b7fa6a911a0a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7eaffe3b-5b20-4937-a693-400f5a3d7987)(content(Whitespace\" \ - \"))))(Tile((id d1ce8a09-d6e6-443e-8fb6-77904043ba41)(label([ \ + 22f40e32-3b63-4aa1-af0c-0fa15beca6ff)(content(Whitespace\" \ + \"))))(Tile((id 8fc3fbe2-c648-4fb2-8959-5bcb25de2485)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - f2827f6e-aef6-40eb-9e99-959cbeb8f626)(label(Int))(mold((out \ + 85f9f8bf-bc3a-476f-a796-e53b510e5fc9)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a5a96d03-071f-4595-bb82-1f287d604bb3)(content(Whitespace\" \ + c9686799-83b6-4425-9636-ed16b688a3ea)(content(Whitespace\" \ \")))))((Secondary((id \ - aa9f6dd4-afc8-432f-9060-c140c31c2b5b)(content(Whitespace\" \ + 308d2aee-fbf0-4fbd-af60-21be975cec10)(content(Whitespace\" \ \"))))(Tile((id \ - 9c1620d9-ae11-41e1-ad5e-663b10aa1c56)(label(1.0))(mold((out \ + 62ffe449-0402-42f5-bdc4-a3d3cb9e0f55)(label(1.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4c545fe6-4860-489f-aaed-de76ee3722c2)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 9fc0cc53-1049-4bc3-9d39-40b42737c72f)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 90f05b86-6ed6-4da8-a1da-5bc842610088)(label([ ]))(mold((out \ + 9a2ec1a5-8eef-448d-b2d8-64b2360fee8a)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 357ac56b-6008-46c3-823c-f71e965f9072)(label(2))(mold((out \ + e63b5de9-b0c8-404b-b2fe-08d050f37171)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ef444fb8-d541-400d-9576-a500ff7bea51)(content(Whitespace\" \ + afec12f2-fa36-4cf2-92a2-400301ab58cf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 125ff66a-6b89-4566-98fd-2a802fd970b5)(content(Whitespace\" \ + f2f7a1a3-ca7d-468f-983c-9409eb28250f)(content(Whitespace\" \ \"))))(Secondary((id \ - 5939a641-eb88-4f4f-a322-69b1571271b5)(content(Comment \ + 10b89dca-d397-4e68-8b4d-508f49e4aaed)(content(Comment \ #err#))))(Secondary((id \ - 7baecabf-72e3-4455-9cfb-16777b0057ac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bd06e95c-6b0f-4708-b642-e09aec6b32ef)(label(let = \ + 19d8fd34-be37-4bf2-bb60-368822847164)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 97687bb1-54b0-42b2-8717-ed12f0fd022f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bff70791-8893-4e8b-9f92-e0ac69a6e939)(content(Whitespace\" \ + d2b796b9-1f73-49f9-a1e5-b9021787a084)(content(Whitespace\" \ \"))))(Tile((id \ - 34216c66-e05e-4f03-91a9-61f892a850f8)(label(_))(mold((out \ + a575f95d-135a-4915-9f8b-76eb3ecba427)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f7733b0c-dd77-44b7-b56e-d0c1a6636b6c)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 8a3492e6-684d-4cb3-ab42-48d03d9cdb1e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8f04892c-18d2-404b-9894-3e9aecc981e2)(content(Whitespace\" \ - \"))))(Tile((id b48afdf7-f131-4d9f-b829-0bb01434f348)(label([ \ + b949ac5a-f020-411a-bb2b-b2f97258c456)(content(Whitespace\" \ + \"))))(Tile((id 7ac83a5f-90c3-47b9-b6ac-5b0e3dd9619c)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 2546b193-bb89-4e2c-a1e1-c0c3aa775d8a)(label(Int))(mold((out \ + f8d85fc0-3ef4-4595-a3a0-d20bfa7f4411)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 925587ff-8973-457c-853a-0f6c71cd9c4a)(content(Whitespace\" \ + f184710f-0527-4bdd-809b-4ef02b2486a3)(content(Whitespace\" \ \")))))((Secondary((id \ - 5ca988e2-330d-4e80-91b9-e9031eba4cef)(content(Whitespace\" \ + a089176e-afcf-48a3-8a4e-0938a110f3e7)(content(Whitespace\" \ \"))))(Tile((id \ - ed424387-c3f5-4d4e-a276-ae526e114f39)(label(1))(mold((out \ + 24b9cfb9-95aa-4a5e-9a3f-b725d704e8f6)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 41bdc089-5d46-461e-91f0-3c4d5c8c975c)(label(::))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + e01f1339-3449-42f3-9b06-4b0cbff8632d)(label(::))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 7))(sort \ + Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 75eaeaea-6d82-4f4f-8ff2-c3d0163c6017)(label([ ]))(mold((out \ + f6f405c8-481e-44a0-b4a4-6e164add4bef)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4516c234-075e-4464-965c-666a0de1e8cd)(label(2.0))(mold((out \ + 9d9f1bab-a60a-44db-a8ed-a22f022ede3e)(label(2.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - cb0e4361-9db0-45cf-9b66-9f1812a87332)(content(Whitespace\" \ + 01d617f9-da2e-48f3-8902-e101d8213b42)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1be9f5d9-ceb5-4b89-811d-6975be2757f4)(content(Whitespace\" \ + 83b2a78b-d0b2-4163-a0d4-edf81a25ace3)(content(Whitespace\" \ \"))))(Secondary((id \ - 8cd1685f-b46f-4d3e-81e3-632df69a6af7)(content(Comment \ + 762aabcc-7a53-401b-bc1e-4915309e5dce)(content(Comment \ #err#))))(Secondary((id \ - 0193a545-1ce2-4a17-94b8-be94999b8a06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b5361ea7-4e12-48c1-8444-5e38cbb19a59)(label(\"\\\"BYE\\\"\"))(mold((out \ + 47755866-0bf9-45ed-b727-45fbf52eaad1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bbd01a32-cb8d-47b3-8c84-e077c869a585)(label(\"\\\"BYE\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer))"; + Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Outer)(projectors()))"; backup_text = "# Internal Regression Tests: Type errors #\n\ # Each line should show errors or not as indicated #\n\n\ let _ = unbound in #err#\n\ let Undefined = Undefined in # 2x err# \n\ let true = 2 in #err# \n\n\ - let = if true then 1 else 1. in #err# \n\ + let = if true then 1 else 1. in #err# \n\ let _ = if true then 1 else 1. in #err#\n\ - let _: = if true then 1 else 1. in\n\ + let _: = if true then 1 else 1. in\n\ let _: Int = if true then 1 else 1. in #err#\n\ let _: Fake = if true then 1 else true in #err#\n\ let _, _ = if true then 1 else 1. in #2x err#\n\ - let _, _ = (if true then 1 else 1.), in #err#\n\ - let _: , _ = (if true then 1 else 1.), in \n\ + let _, _ = (if true then 1 else 1.), in #err#\n\ + let _: , _ = (if true then 1 else 1.), in \n\ let [_] = [(if true then 1 else 1.)] in \n\ let [_] = (if true then 1 else 1.) in #2x err# \n\n\ - ( )(if true then 1 else 1.);\n\ + ( )(if true then 1 else 1.);\n\ 1(if true then 1 else 1.); #err#\n\ (1)(if true then 1 else 1.); #err#\n\ - (fun -> )(if true then 1 else 1.);\n\ - (fun _ -> )(if true then 1 else 1.);\n\ - (fun _: -> )(if true then 1 else 1.);\n\ - (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ + (fun -> )(if true then 1 else 1.);\n\ + (fun _ -> )(if true then 1 else 1.);\n\ + (fun _: -> )(if true then 1 else 1.);\n\ + (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ let _ = fun x -> if true then 1 else 1. in #err#\n\ - let _: = fun x -> if true then 1 else 1. in\n\ - let _: -> = fun x -> if true then 1 else 1. in\n\ + let _: = fun x -> if true then 1 else 1. in\n\ + let _: -> = fun x -> if true then 1 else 1. in\n\ let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ - let _: -> [ ] = fun x -> if true then 1 else 1. in #2x err#\n\n\ - ( )::[(if true then 1 else 1.)];\n\ + let _: -> [ ] = fun x -> if true then 1 else 1. in #2x \ + err#\n\n\ + ( )::[(if true then 1 else 1.)];\n\ 1::[(if true then 1 else 1.)]; #err#\n\ (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ - let = [1, 1., true] in #err: inconsistent#\n\ + let = [1, 1., true] in #err: inconsistent#\n\ let _ = [1, 1., true] in #err: inconsistent#\n\ - let _: = [1, 1., true] in \n\ - let _: [ ] = [1, 1., true] in\n\ + let _: = [1, 1., true] in \n\ + let _: [ ] = [1, 1., true] in\n\ let _: [Int] = [1, 1., true] in #2x err#\n\n\ let _: [Int] = 1::[2] in\n\ let _: [Int] = 1.0::[2] in #err#\n\ @@ -12399,1730 +12648,1885 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 1f7bcab0-da00-4299-b43a-3ca1ef8ca2f5)(content(Comment\"# \ + Normal)))(backpack(((focus Left)(content((Tile((id \ + b88aa814-3348-4d9a-bb7b-87b83a5b89d7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 487d3abf-e70f-4887-8046-f02cac6cb2bb)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + f761ab95-af19-4c2f-91b1-e8b1f96a9c14)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 25c83503-5f8a-45e3-a35c-bb85f2c941cf)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 62ea7b02-8d85-4e7e-b7b0-2ff1b8083b4b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 96080ecb-74e5-4e8e-af68-63ee8aeef5c8)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 44072989-144d-45ea-9ab3-51bccee14678)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 1a1e5183-343b-40f6-a989-49ce75e55a96)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + ce9cf06e-4146-455b-9bcf-d58798d189b1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 137ab8b8-acd4-4669-b8b0-0981cd8e38fb)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + a4330d8f-ce4a-4a77-8b24-56e8dfcf2461)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 24cfe539-f6af-4863-8111-78265a29f465)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + f01fa49c-e3d2-46b2-8d63-14e7224303eb)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + 4ee9e1bb-2b95-4aab-b22a-e14cc7e4a5c9)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 6ec84ba3-dfa5-4209-868d-1e2e0260cb94)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))))(mode \ + Normal))((focus Left)(content((Tile((id \ + c0ca4224-219e-427e-9415-f1f34cd9897c)(label(test \ + end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 04537911-d2b3-4bf5-9d40-5eda36555783)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + c649db7e-abb7-4d29-a4b8-6a917a76c6c6)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 2927f4e8-9b6e-45a0-a750-43e1f57cd52d)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + a77a91f3-be7a-4254-8b0a-30963f3b9c61)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 9b1b141b-5d1d-46b5-8581-f361375e5c31)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 2dea2c00-978f-4220-bdd7-fc268b2a8086)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(1))(children())))))(mode Normal))((focus \ + Left)(content((Tile((id \ + 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(2))(children())))))(mode \ + Normal))))(relatives((siblings(((Secondary((id \ + fdd8583e-681a-479a-b82c-70150ec064e1)(content(Comment\"# \ Lambda Calculus via evaluation by substitution \ #\"))))(Secondary((id \ - a927feba-9938-45cc-88da-4ca88fbace46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 59554d6d-5be9-43cb-a4d6-1edf55e3c098)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 41573bf5-78b0-4f95-b6e2-3c4ce9dbd6d5)(content(Comment\"# An \ + 672d5842-e58a-4612-9844-4269ee7ec11a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 422c29b0-af9d-413b-aa29-4d49c8355499)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 49e56481-afa9-40f7-81ce-6895a7da0e43)(content(Comment\"# An \ Expression is a variable, function, or application \ #\"))))(Secondary((id \ - 5e7af976-9c1e-4841-847a-70c966af0583)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a76c3b61-221f-4e94-b8fd-5b45183df229)(label(type = \ + fbd5a058-1871-45ad-94b6-89b0f9083ea3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d17da4bf-78d0-416e-8038-45b303bcff27)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 40bbb356-6987-428c-a8ed-2a6b99066f39)(content(Whitespace\" \ + 5440ba19-b7d9-47b3-9c6d-d9882a8ab04c)(content(Whitespace\" \ \"))))(Tile((id \ - 5b4a5ae1-4e37-4f29-abcf-0ce0108de2c0)(label(Exp))(mold((out \ + ab03c617-2fa7-4ca7-a14f-79867c5b6e7b)(label(Exp))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1cc38bcf-e0a0-416f-8cc3-1655722f05a4)(content(Whitespace\" \ + 8fe8f05c-03aa-4383-b082-b0fddfbc6534)(content(Whitespace\" \ \")))))((Secondary((id \ - 09d316ec-a283-4c84-a902-cdb1b0d8fcc7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5c00fca1-9f11-4ed9-bb7b-507bdcb1fae8)(label(+))(mold((out \ + 416f926f-55e5-4941-adaf-13964a326bb8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 61827c81-4cc8-4200-9e10-1b9f29ad0978)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f097f93b-c8d3-423f-8301-953e7fa560a6)(content(Whitespace\" \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 8f17dd89-3a5d-4c11-846a-cbb418e5aec1)(content(Whitespace\" \ \"))))(Tile((id \ - f02ccc58-351d-499c-87ed-687857f5aafa)(label(Var))(mold((out \ + 07143b7b-1a51-44cc-8d64-453a930f8c4f)(label(Var))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8096ab83-dd0c-47c0-bb76-b0e811b0c1bf)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + d7508e69-bd9f-4d04-88f8-e410491faaee)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a375c863-da66-4010-a25f-778944a6db48)(label(String))(mold((out \ + 299ce88d-c7dd-4e7c-b3ff-acff6f79cf71)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 8ee1d2e1-06c2-441c-8fc4-138532d469d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bc72ff0d-8a9d-4ee4-ae45-b2c94f67eca9)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 073bb3d0-5742-4e74-aec0-7722a4b4e070)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1a63497e-19dd-404b-99d7-7fc1aadd3a1e)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c7ed4279-1d9d-44bf-af67-23ca84632b04)(content(Whitespace\" \ + 44746e59-ab93-4aad-8f18-0e4997eeea05)(content(Whitespace\" \ \"))))(Tile((id \ - e2c11b78-0c54-448e-9cca-e4c8bfc8bbb2)(label(Lam))(mold((out \ + 14f98ccb-5b30-4bc2-89ad-7aa385523779)(label(Lam))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 4d2df657-924d-4f14-9eec-0ecd7f5c21c9)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + a74092d3-71ab-49a8-84bf-db34d86a78e1)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a64e19fe-5bc6-4139-8b40-96e3583fa4fc)(label(String))(mold((out \ + fb77a9de-4162-4ed1-b98a-8d0d58086761)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - f3daa7e8-f243-4222-8ee4-ddc0f9155c46)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 62f8ada6-cd85-47d9-a868-381e21fdcb1b)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 447e6442-bdde-46f7-8882-6bb1f68d67d7)(content(Whitespace\" \ + f312e16b-4994-4e39-a319-70adedb1446e)(content(Whitespace\" \ \"))))(Tile((id \ - 15875387-e3ed-4473-9c6a-453a68e8b117)(label(Exp))(mold((out \ + 617027c0-7107-4bb5-8075-dc78d7121a61)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0f46618b-71ec-4bf5-88ca-75d3bf0a549e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd1bd397-be90-494c-9ea6-17847e56b805)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 3e95325e-7507-4faf-bb37-1286caa94fa5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f1ffc168-f8b5-4b91-8a89-b3a061454b3e)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 04185bae-3d12-4049-affc-da427e740d6b)(content(Whitespace\" \ + dfdf7175-7c19-4f50-b5fa-2b164533cbeb)(content(Whitespace\" \ \"))))(Tile((id \ - 559ea70c-729f-4295-a48a-c27dd9fad885)(label(Ap))(mold((out \ + 00675cd5-f48e-47d1-b452-afc6068a5023)(label(Ap))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 2e0537e7-5ee1-499d-9edf-c2eae0b53264)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 2b6c9e05-12a7-4343-aaf9-0c34af10446f)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2bbfcd7d-a9a0-41f5-9f2b-65e6f4f0fc50)(label(Exp))(mold((out \ + 73b1a0bc-56f4-467e-bed2-9876c4994866)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 40bda1cf-399a-4368-9a93-1b34120aafac)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + b58fcef0-f7f9-42bb-8445-fba173d1b743)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4f27a6c1-9f31-4f48-9f67-81fb4bdb8815)(content(Whitespace\" \ + efc37e05-8b7c-4233-a549-6c264507f440)(content(Whitespace\" \ \"))))(Tile((id \ - f9b126eb-6ecb-42a4-9b11-255fcea67577)(label(Exp))(mold((out \ + d00b4453-2675-4d36-b92f-48e816e361c1)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 297a96d2-948f-4fdd-9884-8e547ed933a8)(content(Whitespace\" \ + ec0b546c-b58c-4df0-b28b-fb7e2ca0d2a1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 60f3914c-75d8-45b9-91c8-408f8d99eded)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0a6f99c3-1727-45b2-a08f-1194554cea5f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dfed049c-1560-40ad-adef-7de21ec01615)(content(Comment\"# \ + e51bd23b-e7d6-420d-ae5f-96d2383b3d70)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f5a4fa9c-29ab-4f6e-8b8d-58f37326c878)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 17059ed5-6772-466b-a113-a6c34e13d7bf)(content(Comment\"# \ Syntatic Equality of Expressions #\"))))(Secondary((id \ - 02c2cda8-cd30-4c87-8633-79f6279f2923)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d1c59a7b-15de-49ae-aaf5-056c65738d18)(label(let = \ + 9c98c0c6-2a63-421d-adc9-6d19c37938cb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3e8e28a5-0433-4c8a-a4b9-7c31994001fe)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 321c3b7f-71b6-433f-8ba5-3a176f503ee2)(content(Whitespace\" \ + f51bcf44-0c1d-4a72-b70f-0db00618028c)(content(Whitespace\" \ \"))))(Tile((id \ - 20a41284-a854-463e-8f08-880a85b83d3c)(label(exp_equal))(mold((out \ + f6056ad1-996f-4e9f-9856-d1276ea3f8b6)(label(exp_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 78495729-2b1d-4e8e-8f1d-c9d28f6a7a60)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 5455697a-ba89-4b34-836d-374216fc7f58)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dbee2db7-3f10-4979-9024-bc34f7453770)(content(Whitespace\" \ + 60a7568c-b9f0-476a-862a-3cbca4875455)(content(Whitespace\" \ \"))))(Tile((id \ - 72d5e73e-ff5a-4bbc-9d1d-7e6e1581e413)(label(\"(\"\")\"))(mold((out \ + 4ff58b9f-2c02-4138-8c7e-3066ddef752e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - cf35fc7b-7318-4d81-8163-b650fd7de4f0)(label(Exp))(mold((out \ + 0917f481-96ed-41ed-9e8f-e9edc5b0cff1)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3907ffc4-af80-403a-839d-82b1232395f2)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 871ebb1d-9d1d-4efe-8362-a97fe5e31385)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7aca28b-65fd-473a-9fb6-65ea96ef78d6)(content(Whitespace\" \ + 2bbb242b-914f-45b2-85e7-2d3bb485f2d8)(content(Whitespace\" \ \"))))(Tile((id \ - 22f01e9c-afbb-4e08-8acc-d315f402817b)(label(Exp))(mold((out \ + f08f7920-8033-4553-87e0-ea4a3d558213)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 4ab91533-0de3-4d84-b8b2-7fbe33be34a4)(content(Whitespace\" \ + 2dc8ca67-c93e-49ce-b076-a3f193f09180)(content(Whitespace\" \ \"))))(Tile((id \ - c59e6b78-fc5b-47bb-b830-9d4fe67c0b13)(label(->))(mold((out \ + f69a5837-9fd6-4587-a2a9-7fe112955047)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7b30dd6b-c498-4637-ae4a-f6afea955a90)(content(Whitespace\" \ + 8bfeb672-bbcf-4d06-a77a-0c348a34ada8)(content(Whitespace\" \ \"))))(Tile((id \ - d000d521-0821-47e0-b655-52db20eb828a)(label(Bool))(mold((out \ + 315b5478-3c3f-49e8-954e-178695fab404)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - af54a209-ee0b-4c7b-961a-d2565352172e)(content(Whitespace\" \ + bbf80d66-def4-4c91-9f81-b3fcf62e5550)(content(Whitespace\" \ \")))))((Secondary((id \ - 5668d661-45f0-4cfc-bfb1-264fca05b8d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2b529252-636b-410b-8ff5-c917ee8e8b64)(label(fun \ + b84cd083-96f3-4983-922e-c092b17fb028)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f466bc3a-8b6f-4a85-858b-61be4e47e62b)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 64120593-aefa-4317-bd9d-7901b0b718dc)(content(Whitespace\" \ + 6beeed0d-f3ef-4ff1-9b9c-7fa343ef214a)(content(Whitespace\" \ \"))))(Tile((id \ - 24182c8a-50a3-4da8-be1b-25521534c38f)(label(es))(mold((out \ + a101d38a-d880-4637-a78f-f256127958bc)(label(es))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - db377abb-9d27-4f80-aaee-29019fe3fbee)(content(Whitespace\" \ + ca9a7df9-b73e-4eb3-8071-acb2647fe361)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b6e75de0-9f67-4707-b9c0-c1728ae46b3b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 42e957de-23fb-4f1d-b783-5e0467dae1bb)(label(case \ + f068f7f9-a5a5-46d6-8beb-71eb1c18097c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 36ef4244-6c86-4e22-bdb9-aa8a729d1a6c)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 41b2af43-6a43-4d11-a81e-d9d17f4bbfd9)(content(Whitespace\" \ + e5ff56e5-3143-46fd-a6ee-8a8cb2f5a056)(content(Whitespace\" \ \"))))(Tile((id \ - f8796638-2f86-4f8a-b536-31faba9bb8ac)(label(es))(mold((out \ + e7574986-d77b-40ba-a5e3-e386c6db3c39)(label(es))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 31770179-3d0d-4744-81af-ca2b9883eab1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2c2de1f3-9f64-4731-b40b-2ae4c85c9487)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 225a8cd6-60d1-4c61-a5eb-f8621e15ad6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b68ac9d7-a430-4be2-a5f4-1c04ad598795)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e616366b-7709-4c52-9c3e-b4b841ec4de0)(content(Whitespace\" \ + e3768340-9ef3-4649-a14c-7207c6742c0b)(content(Whitespace\" \ \"))))(Tile((id \ - 26d3098a-59f8-4a5c-8b5c-e0fa8621fcbd)(label(Var))(mold((out \ + 190016bb-7f5a-4e72-9a77-1f3bd3d7502c)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ef5324c2-ee25-4eeb-a37b-cfc90fcd42e0)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 9c6733ce-154e-4688-b0c0-9c2a5eea8d72)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 15ec3550-c2c7-4ea0-97c4-367815d9b5b7)(label(x))(mold((out \ + cd49e6ba-c89d-452c-8305-bbfb7dac2381)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - cf5cc86d-6091-4092-99b1-2fe5cf19e552)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + bccb164f-54cd-47e3-b484-7c0cf7d3f56d)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 583b25e8-f45f-40d9-b4c5-cb84f2061a99)(content(Whitespace\" \ + 1ff8775b-ad8f-4ecb-9898-ad245f7ab91a)(content(Whitespace\" \ \"))))(Tile((id \ - ec7b427c-4313-43f3-bf80-c847e66f65b6)(label(Var))(mold((out \ + d5514d67-6f7d-42d4-b896-d25582177d10)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 257f3750-3762-4685-b1a6-6a6fa861007a)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 340f0ace-29d3-4a3d-bd8e-12c61aee3e6f)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8006ee75-37d1-4341-8dcf-5a7bcb32460e)(label(y))(mold((out \ + 47b2c918-cd20-4414-8f82-320bfaebd061)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d57b3841-3010-4604-b2fc-c1f1d0aef0e8)(content(Whitespace\" \ + 94ade3ba-00f3-4dfe-9561-ddc4149a3e56)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 65d17c9e-a107-4192-9068-c0b205c0069a)(content(Whitespace\" \ + ebb99665-2d12-47d9-bae6-977b1ececb43)(content(Whitespace\" \ \"))))(Tile((id \ - 7be050aa-cbc5-42cb-8922-53e6e6b12824)(label(x))(mold((out \ + 300de022-75e4-4203-b018-600080222882)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 318d3c65-2497-491f-96f7-cfe6394a8b79)(content(Whitespace\" \ - \"))))(Tile((id \ - 853da4a6-5aed-44d8-ab43-75333dd82023)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + d68f4335-003f-4680-a5bb-9ae0d3395c95)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cea85df5-b3bd-4017-a952-d64ad8459841)(content(Whitespace\" \ + 56edde47-e4f1-490c-946c-301e235c8112)(content(Whitespace\" \ \"))))(Tile((id \ - e7c511c7-5050-44da-b175-da1e4ff92d52)(label(y))(mold((out \ + acf78d5a-547a-478d-a8a6-e09c69201f49)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4f3a5193-c3ac-4370-9c9e-c8df5a37167d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - eb08f193-8966-4277-bc08-9e79add2cde8)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 79839a3f-5859-41cf-a6e4-9b51af933d3e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 246f4d14-c501-4973-8919-b4de81fda419)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 09f89651-2b39-4c39-b0ca-b69b08429670)(content(Whitespace\" \ + 2056b94b-ca4b-47ea-9794-938b8910b731)(content(Whitespace\" \ \"))))(Tile((id \ - 81672889-56c2-48d7-b53e-bad5b4d1df31)(label(Lam))(mold((out \ + 601f5e03-d97e-4b54-9267-523f4bf14797)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e4c0cf87-1985-4aa9-b4be-8abb8278e176)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 27155d6d-9954-4c1e-b56b-829d8b28bc0c)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ce2d28c7-d1d1-4ad5-909e-6421f2f39739)(label(x1))(mold((out \ + fa8be50a-e163-4554-8bea-2f64631fc090)(label(x1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b279ac2d-53a0-4899-a3e7-29e45637f1d3)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 99102500-9dbb-452e-b577-d0e816c9c67c)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 54c7c5cc-5009-4243-baec-df198852f9e8)(content(Whitespace\" \ + 0f26f4cd-8687-4898-a5c9-5a1d964486a8)(content(Whitespace\" \ \"))))(Tile((id \ - 64075130-f088-457a-82f6-ebe5d0be8451)(label(e1))(mold((out \ + badd3cfa-437b-4c24-b344-d64db5ca6fab)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - e094bdef-fc38-445e-92b7-a730961c8fdf)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 53d052fb-ed5f-4e70-bc43-56f34e34108b)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - e88a31af-6149-4000-b8e2-94f31e45d5fe)(content(Whitespace\" \ + 9ae13cee-7415-4617-90c1-41051572b40a)(content(Whitespace\" \ \"))))(Tile((id \ - f1ce5a32-e138-43d5-8775-e6f75efe37d1)(label(Lam))(mold((out \ + 98a89911-7079-484f-a8fc-fd33bfda515d)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c6bf010d-869d-4271-b2b7-828dd4f1b553)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 12d8a536-43f5-461f-87e9-fdb024bfba72)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - bb0a3fd6-4dff-422b-bdf1-8460c7d43829)(label(x2))(mold((out \ + 80d877e6-1597-4b64-8715-257ceb6c46e3)(label(x2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ea64a246-122f-41e6-8284-a7b00542c4de)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 4d7b2326-17f9-42cf-a815-10cf24c8ae05)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 6a6b2ec6-56a9-4ad4-8497-ae680f9b1118)(content(Whitespace\" \ + dad4dda5-6e73-4c83-a92c-767cf3ebe147)(content(Whitespace\" \ \"))))(Tile((id \ - e17d1a0c-3041-4aae-8312-2164ad00b76a)(label(e2))(mold((out \ + 745be5b1-748d-4354-8839-d5b4641adab5)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d3650922-ea7a-4f27-89d3-b919d15786be)(content(Whitespace\" \ + 410fbca2-0acc-4a55-a0fb-98c8c2cbd324)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cd0e2d13-9e19-4cf8-b896-32cf152976ce)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c948dec9-9f62-48db-a69b-7c4734cb8e9a)(content(Whitespace\" \ + 78e09b69-587d-48fb-b778-a02b38f412b7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 11f7f15a-84e1-4e34-932c-de815d268393)(content(Whitespace\" \ \"))))(Secondary((id \ - 8820244d-86e7-467b-b6ee-412309891bf5)(content(Whitespace\" \ + 13b24012-476a-4a90-a87a-5d2a16d6c8c5)(content(Whitespace\" \ \"))))(Tile((id \ - 6ad0085e-1640-4bcc-966c-63535c4dcb4e)(label(x1))(mold((out \ + c632c226-1d69-4ead-9733-862140256a54)(label(x1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6a3c75e8-867f-43b4-af30-e3c33700b8ca)(content(Whitespace\" \ - \"))))(Tile((id \ - 98252b63-4ae7-4104-81db-be1b271d1b20)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 7e61ca4d-01fa-4b3b-817a-d15fdf27bd12)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e85acee5-ac98-4fdb-9b7e-3da31e9a1cdb)(content(Whitespace\" \ + ba82b66f-bf41-443c-a23c-551ae570dcc6)(content(Whitespace\" \ \"))))(Tile((id \ - 517d59c6-6e8a-48e6-9810-deff80d4837b)(label(x2))(mold((out \ + 01976f6d-75c4-4a23-ab9b-2f6bb43d053e)(label(x2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 64892ab9-5f46-41ec-83ec-830a3771bda2)(content(Whitespace\" \ + 5a6b9c2a-3e90-442e-95fb-8795edce7e9c)(content(Whitespace\" \ \"))))(Tile((id \ - 654196e6-5c40-464b-882e-f000185256ae)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + b7fbb738-cf08-46e2-95f7-9f2d7449da44)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 358e8514-a640-4e35-adc2-89e552b48f63)(content(Whitespace\" \ + cac711c3-2b8f-4240-92e3-6be062f58fda)(content(Whitespace\" \ \"))))(Tile((id \ - e7e712ff-e6a4-4736-a2a9-1051368e4621)(label(exp_equal))(mold((out \ + d4642fb3-d50c-4315-8c6c-a8cfa3eea5f7)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - be1cd4d0-77ec-4b24-806a-d44ab9406dff)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 33b9f05a-00cf-476a-8684-5c5862370385)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2b9171e1-b36a-4b4d-ba94-b1b383e3d876)(label(e1))(mold((out \ + be5b50f3-9ae3-4193-9673-f8c7cfe4a945)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee427415-9cbb-40bb-be41-483d6b055dde)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 78789f46-c6a1-424a-b839-89619f337adc)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c2233df3-e617-438d-a3f3-9764587db421)(content(Whitespace\" \ + 75d018d5-c940-4771-8fb5-441d71c3d5d2)(content(Whitespace\" \ \"))))(Tile((id \ - c9f2177c-7b5b-458f-a2c8-f1e5e4b6e938)(label(e2))(mold((out \ + 4078c96f-6b4b-4183-a5c1-23fecf9e6e83)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 9350c7fe-fcd8-4395-b2a5-51f3b4bc28d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4565265b-2b39-4e9d-b8e5-4eac2118eaf5)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + e7af7359-b810-42f5-9d11-9de186bc71f1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1b58e4f3-cb22-4b18-95d4-976e0773a063)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7982873e-6820-415f-a686-58b3b38f3af7)(content(Whitespace\" \ + b07dc16b-3745-4cb9-9191-2f353ef155b2)(content(Whitespace\" \ \"))))(Tile((id \ - fc624d2e-62e9-42ea-a935-f0e009fffbc6)(label(Ap))(mold((out \ + 22224420-1665-40fe-bc4c-cc6022149537)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 39ebe962-9adf-45d0-8874-8bc30d5d4c9f)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 636c28ac-b603-448e-bcb8-ffd56e0dfaa7)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - c3628f0d-0cb8-4954-a16a-e791d0f9a30f)(label(e1))(mold((out \ + 07578600-2943-46a9-b35d-98dfe74b596e)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4cabbfa5-38b7-45e5-962d-6310e522dc2c)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 82987d7f-d5ad-46d6-a050-11197761382a)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9c108b07-27cd-4d7e-b2e4-6ae975db2eb9)(content(Whitespace\" \ + ceba5512-21e7-40af-b48b-5857a495e416)(content(Whitespace\" \ \"))))(Tile((id \ - 7e8c0903-e399-43b6-ba2c-f014879fc966)(label(e2))(mold((out \ + 7c36d83d-5edd-455e-a67a-bd8983cec466)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - ad3766ab-7abe-4e5a-b44f-9a9cb6badf3b)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + c829d9ad-6344-4b5c-8cb0-5b40ef52fb3e)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 3170e2a0-ebdc-4b38-b2b7-a09434ec3f1c)(content(Whitespace\" \ + bf89abca-6048-4fd5-8b48-0db5dbd15864)(content(Whitespace\" \ \"))))(Tile((id \ - 545a9cc8-240b-4267-adc8-0b2bbfe70a91)(label(Ap))(mold((out \ + 07b2845e-f9c5-4e3a-8235-6a682dd69ab7)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dbc20a7c-0050-4672-bd5b-b298221a315d)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + bc67d021-59a1-4c97-8984-2bbac2c8d4f8)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1a06a7c6-f321-428e-b28c-a4f24b3ab556)(label(e3))(mold((out \ + 38c962c5-be56-493b-a2e5-f0b2d9e6bd68)(label(e3))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ec1e7e19-8acc-4a77-8ef5-0b9907518462)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 81fea876-ca8e-467d-83f0-e24641ce6e16)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - bba30512-7bbc-4930-b198-d12e690a5b93)(content(Whitespace\" \ + de2e8192-66a2-46b0-a6b3-67dd2ec836e5)(content(Whitespace\" \ \"))))(Tile((id \ - 0d36e488-3e41-46f9-a972-23750bcece8f)(label(e4))(mold((out \ + 84e87259-351e-4989-9d08-6887492aa5c0)(label(e4))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 4b4d9e3e-ac05-4a5f-b08f-d5563460b5c7)(content(Whitespace\" \ + c03b801e-425d-4a0f-9e5e-09f3a3724618)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f282b2b5-5c36-472a-8375-d1a36a8649ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f3bd6390-5a54-48a1-9640-ccfa45160df0)(content(Whitespace\" \ + 99e0e359-1813-4dc5-99d7-4e60bcf12b74)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 20702186-5730-46ba-bee2-43084724d324)(content(Whitespace\" \ \"))))(Secondary((id \ - 7df542d2-05f3-4e21-8c5f-64955731be10)(content(Whitespace\" \ + 4a30fcb0-6e37-4ef8-812f-1782bbb6c9f1)(content(Whitespace\" \ \"))))(Tile((id \ - f60edbaa-954f-42fe-b431-b9bcc014a9c6)(label(exp_equal))(mold((out \ + 1f1bab64-3c2c-4eda-8acd-9c090e71f0d3)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b1f04c3d-547f-44e7-8e7a-8a39c04667eb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 178e43fa-f170-4467-9ba4-8becd467b038)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 194d5a82-cc1f-4a18-8b5c-c61c904af17e)(label(e1))(mold((out \ + 17b29792-356f-43df-a878-ae1b07162c7c)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 75f2818f-2f9c-4049-878f-c81085700db4)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 49857faa-9a2e-4411-9bd0-3c8f9bdd7c59)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7b3280d2-d974-4cf6-9bb0-516576217085)(content(Whitespace\" \ + 1e1d0155-3f97-449a-b46a-bf89789692c3)(content(Whitespace\" \ \"))))(Tile((id \ - 4b4990b5-c883-44de-baa5-6298bdcd9c6c)(label(e3))(mold((out \ + 82f3843b-4ce0-4184-9ee6-47df550a1f1c)(label(e3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e67b82f1-96e5-4d33-b100-3bfe9707c8c6)(content(Whitespace\" \ + 4d036eb9-5fd3-40e7-953d-03feb209158d)(content(Whitespace\" \ \"))))(Tile((id \ - bc816646-333d-45c6-87de-126307d9157f)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + a9e80db6-93f0-47da-b48f-3bb99bb2fb62)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cda90ee2-15a7-475b-a7b7-b58f95ac0541)(content(Whitespace\" \ + f5659aaf-ab00-4145-9c3c-e0ca744fdaa9)(content(Whitespace\" \ \"))))(Tile((id \ - c6cca4d7-4919-46de-8ffb-52071913367e)(label(exp_equal))(mold((out \ + 46ba930c-5ce2-4256-91b1-91f5fc90336e)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 46608290-3577-4831-b399-c80d5d767d86)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 9476c40e-8955-4767-ab58-5dbb6591f30e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cea40954-b0f5-4ea0-abdb-8f3a0a210bcd)(label(e2))(mold((out \ + 52e02080-25cb-4536-8754-367e8af3d333)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d251e7a-9910-4012-9c61-96c776587f87)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + dc571ab1-daa7-4876-841f-e8c87050127f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ad817f3f-75bc-46fa-ab0a-86718ad8e04e)(content(Whitespace\" \ + 534a7b32-5205-46b5-b718-55e268cc2a27)(content(Whitespace\" \ \"))))(Tile((id \ - 2c9c3dcc-3d6c-463e-bcd7-fba48da6ecac)(label(e4))(mold((out \ + c8bba4ef-1b1b-4087-be66-68fc2bbd7a4f)(label(e4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a58fe0b7-4a35-4a50-97be-441d4274c616)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e7572e91-07c2-4d65-abca-dd76ec42dbbf)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 7660444d-7a74-4a21-9db5-7b72f351f7fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + da8732c9-313b-4f7f-9ed3-6c2681d9e9c5)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c7d795b0-3d34-4bde-aebd-a6712a065da1)(content(Whitespace\" \ + 7db86218-e36b-417c-9e71-a45fac9d26aa)(content(Whitespace\" \ \"))))(Tile((id \ - 68ab1574-8fff-4c61-b8dd-81e4b42bfad5)(label(_))(mold((out \ + cedbde71-9734-4938-90f3-6d6651c495cf)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6ee1936d-6b0e-4790-b4fa-a3ec667659a9)(content(Whitespace\" \ + 2cb6f431-953e-4be2-bb1f-4c5155f208ab)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 109c64f2-39ac-480c-b33e-96b08c515ffc)(content(Whitespace\" \ + ef30b00a-eb86-4dac-bde7-085db742d500)(content(Whitespace\" \ \"))))(Tile((id \ - 215955f2-8a04-40c6-9f1f-14652d8f2637)(label(false))(mold((out \ + a8da92e2-08bf-4228-8212-40eba7b3e156)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16e0c010-73cd-4dac-ac53-2536fa7068ca)(content(Whitespace\" \ + 26d8b9c4-e470-4283-bfc9-5eb1ed6ab37a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4f239c3f-102e-4227-9388-89983d93b887)(content(Whitespace\" \ + 243c350d-2557-40a0-8dcc-b7fc8f4ed76f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8172db9a-32d5-4ceb-a908-3837509edd80)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d3329425-9616-473c-9f10-82c062d01611)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5ed2278f-50d0-4255-94cb-f201169e5a88)(content(Comment\"# \ + ba37c293-1afc-4401-9e5e-d4eb89f06d71)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dade819a-140a-48cf-8d1e-bb1f45327d9a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c48d9687-6480-416c-8ad0-3a529f8dcf96)(content(Comment\"# \ Substitute Exp v for variable name in Exp e \ #\"))))(Secondary((id \ - fdf34800-63c7-4baa-a41e-ec2517696344)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 980a0de3-6dc8-466c-9fc5-57c0161c32ed)(label(let = \ + 2be5176f-b45a-4a79-9385-6e5a58146952)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ec85c58d-0eb5-4688-8a20-2f3a37470588)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 968f19d7-ca3c-4318-a56c-ddaded903c52)(content(Whitespace\" \ + 405ed07a-343e-4d9e-bb81-173ac6033950)(content(Whitespace\" \ \"))))(Tile((id \ - a5a4093b-3f2f-4543-a9e6-d915edb78d16)(label(subst))(mold((out \ + 09cd98fc-b113-4481-a30f-0bda33d20251)(label(subst))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bf012f47-7904-4b04-b435-261c6898a74f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 08d03f76-6429-4872-991a-2b468ac362aa)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 292ae481-93fe-4e75-b4d1-85a12c13d583)(content(Whitespace\" \ + 7628e6fe-2104-47e7-bd0b-c20227a40f69)(content(Whitespace\" \ \"))))(Tile((id \ - 365f62b2-81b6-4a77-aa1a-c14fafc129f1)(label(\"(\"\")\"))(mold((out \ + 328b9536-3d8b-4f7c-b68a-da0a23be4432)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 54243b79-d02b-4ca1-a5ea-b6136ac1bba8)(label(Exp))(mold((out \ + ed30203f-03ef-449f-adfe-921cd62e7c41)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 15ef7894-18f2-4632-8549-55d65bd68d5e)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + d82e22c7-b580-4303-9bac-4f5d4453533d)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 04d28679-49cd-4169-90ac-3ba15295a145)(content(Whitespace\" \ + bdc127ec-fbf2-4499-a5bf-a666ea2af5e5)(content(Whitespace\" \ \"))))(Tile((id \ - 61e87e55-f097-4946-a07e-9608191e9e8d)(label(String))(mold((out \ + 072de18f-c83a-40e0-a592-bd85daa96fba)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - fbbe13a3-aa6d-4dd8-b425-66d31fa6ab5c)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + 15f5900c-c2e9-4752-9a5f-956e953c145b)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 76d1a094-2cfc-4b1b-8491-faa073126a50)(content(Whitespace\" \ + 32899a13-4f64-440b-b09d-c845e44c6577)(content(Whitespace\" \ \"))))(Tile((id \ - 11012759-a911-472b-92c4-13c296f014dd)(label(Exp))(mold((out \ + f0daa9cf-8daa-4478-afe0-3bd7ce6f9d7b)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 36c53e8b-58b4-4b29-90c7-bcd8283d021a)(content(Whitespace\" \ + ff8e3c6c-56e9-4d9f-8024-b011f15334f0)(content(Whitespace\" \ \"))))(Tile((id \ - 337cc1de-7007-44a8-b7c0-e2d62dfe038d)(label(->))(mold((out \ + f9cbcd0b-8ba9-45b8-b5fe-2c5a8170cbce)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2cbdefda-74b9-4e12-bb77-968981f48d24)(content(Whitespace\" \ + a6ceec37-01b9-438b-86a2-0694a666b49f)(content(Whitespace\" \ \"))))(Tile((id \ - 6669c981-844e-4bdb-80e8-49f63a37c170)(label(Exp))(mold((out \ + 3d0ab2af-5483-4f38-b6fc-22e157924b0e)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))((Secondary((id \ - c9570d59-780b-491a-84f6-f38720034df1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd3956e2-872a-48d0-b61b-49c9627f7da0)(label(fun \ + 9a1dcba1-055c-4fc4-b242-5200a380b0f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fa1615bb-52f4-4b78-99b3-05dbfe25de1c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d889bd03-eae8-466d-8ab2-6a37b228101b)(content(Whitespace\" \ + 839a5cee-8ebb-412c-a231-0cc551bf6c4b)(content(Whitespace\" \ \"))))(Tile((id \ - 6f2f5c27-b0c6-4d64-bec4-f59a3d62907e)(label(v))(mold((out \ + 143a5da1-6980-463c-a863-d94d4c4c60c6)(label(v))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b1a377a9-9f1f-46ea-b9c8-4a735177c681)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 662368dc-0735-472a-86c1-1429ed512726)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 4e8b2929-daa4-4997-a50c-41215cd5dc97)(content(Whitespace\" \ + c4659fb7-f122-4580-9003-360e413c7321)(content(Whitespace\" \ \"))))(Tile((id \ - c6e2f602-5f94-4779-9f7d-6150753e387d)(label(name))(mold((out \ + d5ff774a-5a96-4921-927a-9259927970b3)(label(name))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - aa15bace-4f95-4777-ae5a-86efcb21d80b)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 380a4d3f-6f53-4c3a-9112-f9bea39f6a88)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 13bc3e73-cc08-426f-b842-8f326d5e06fd)(content(Whitespace\" \ + 45d5df4d-3c7c-48a0-8c60-ed5a9c4b0084)(content(Whitespace\" \ \"))))(Tile((id \ - 70cea4ed-3f34-4564-b948-5b37698e0059)(label(e))(mold((out \ + 3f855486-d77e-4432-909b-36f7a94f2be9)(label(e))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6fd33e5b-3792-4bb2-9d66-e7c7cfd82c09)(content(Whitespace\" \ + c88c6844-f612-46b7-95f2-b8226bee9870)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90f64cae-e6b1-4c17-a7e8-f843bc7533d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 419ebed6-b5b2-4540-a431-3096df690104)(label(case \ + c7a50681-ed66-4f3a-847a-1b26a93ac408)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b903c02c-0a26-44e9-9f91-cd9449dfcdf9)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7f57f5da-29d7-4afe-af81-9ba4cdb84290)(content(Whitespace\" \ + 890404a0-7e77-4f23-af77-642cd92b6392)(content(Whitespace\" \ \"))))(Tile((id \ - 84bee910-aedb-4d4c-baff-a4571eabd806)(label(e))(mold((out \ + dfc0c313-ac0c-4946-9436-0604dac935a9)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 75df8104-bdda-4020-aa34-461d8ef9a61c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f680450c-a013-4374-a0d9-3b7395b2d291)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 6a99e493-0f22-402b-bff8-276c0c8ad5d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 26868137-c288-4b7b-bc52-34b7a6c21906)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5ba10a8b-3767-4f49-ad59-b4d685b3e8d1)(content(Whitespace\" \ + 7dcab924-6e49-4c56-9275-dd049573465e)(content(Whitespace\" \ \"))))(Tile((id \ - c85b62c4-519c-4ff6-b53d-084bfc4b3a4a)(label(Var))(mold((out \ + 57abb37f-f39b-4a70-b583-996c4acf6c4b)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cbe676ad-d210-4614-a6f4-f1288961392a)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 5643dffa-f320-4c73-b1d6-bf7e716700a8)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - b3d931dd-62c9-49d1-9c23-57e51491e2fd)(label(n))(mold((out \ + 98ad8ffa-185b-45bb-b290-5daadf8a5744)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 39dcfa1c-d518-4072-925b-5a857363d84a)(content(Whitespace\" \ + 409a7cf0-2264-4eae-8dbe-42b831ef2331)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 28da4de0-f438-42e7-8193-7123c709da52)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - de7081b2-0362-4667-be82-f6b027b192fd)(content(Whitespace\" \ + 33ebfbb6-01a2-4e2c-a342-c8f58e84286b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 871cce29-ba54-4437-b1fc-bef23daf029a)(content(Whitespace\" \ \"))))(Secondary((id \ - 185f0a9a-db51-48ac-9671-7308af2566a6)(content(Whitespace\" \ + eb8f0198-3d20-43a0-83ab-86b86486231a)(content(Whitespace\" \ \"))))(Tile((id \ - 94fb704e-4ce9-42e6-ae34-d1b88af3c424)(label(\"(\"\")\"))(mold((out \ + ae135983-85c5-4852-a8d0-3c8d3c22e008)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9298a278-bffd-4a4c-baf9-1aed6d1562dd)(label(if then \ + 95727d7c-7b5e-48a4-a717-0a0584880d07)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 12))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1b07d13e-1cc4-4476-b7aa-1d947539db97)(content(Whitespace\" \ + 23c549d8-9d67-4640-b7a1-a9aec6baa7c4)(content(Whitespace\" \ \"))))(Tile((id \ - 18e2d5d1-c566-4eb6-85a9-8185ac89e46b)(label(n))(mold((out \ + 0f137ca8-4d4a-408f-857c-6d04255de5d5)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3487f0ad-8f80-41de-905f-5c7681cab87f)(content(Whitespace\" \ - \"))))(Tile((id \ - 53fc5638-04b6-4552-82f6-17a089316a9c)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 032e7f20-5bcc-4c1b-8fee-e96b955a83af)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 955e949d-0d06-4724-bd32-3869a60d1509)(content(Whitespace\" \ + b9d150c2-2139-4a42-907c-537c2fe6fde9)(content(Whitespace\" \ \"))))(Tile((id \ - 714480e4-4cc9-4f0a-bb16-fa5eddae8ba7)(label(name))(mold((out \ + b1609e0e-338f-48a3-a852-ae6c44fc2071)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cff5290a-3b75-4adc-a07f-57162f45e70a)(content(Whitespace\" \ + 83429fda-9b79-4f9d-9184-6f6c975b80dd)(content(Whitespace\" \ \")))))((Secondary((id \ - fd1933b0-7135-44ad-9295-1cdff91a4700)(content(Whitespace\" \ + 9b565b86-9bdc-4381-8a71-3001049f21dd)(content(Whitespace\" \ \"))))(Tile((id \ - f54eda3c-4175-4cdd-a22a-bd44d64754db)(label(v))(mold((out \ + c18b5343-10fa-4653-a9f7-b3ea6ff43bd2)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 80942fdd-f28f-467c-be15-f40257293d0f)(content(Whitespace\" \ + 7c8469c8-9941-4e61-bd09-eaeea42dbde0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 59fe67c4-9e46-41da-80c5-94a08d421127)(content(Whitespace\" \ + 7ea29806-08c1-4771-a33b-bfccf77b348f)(content(Whitespace\" \ \"))))(Tile((id \ - 053268f5-aa5f-47d4-bc35-7dd044c4d016)(label(e))(mold((out \ + 23f4d7fc-0cf1-4a52-abd3-0dfcc4ac67f6)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 48783eb9-b6b0-4995-98f9-9dea00a51ea6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 446ff674-42cd-4716-9ec5-caedd30229e1)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + d1bbad2a-fe98-4428-ba70-7cab54808168)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d533eb92-0771-4ea9-8567-743415f675e1)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 026fbda4-70e7-4982-966e-131e89f8b063)(content(Whitespace\" \ + 7815bd80-0f97-4779-889d-902206b39e25)(content(Whitespace\" \ \"))))(Tile((id \ - 970904cf-54f0-4476-949e-6bff04296230)(label(Lam))(mold((out \ + 4f1643a3-2605-4f68-8c29-21a9805e9feb)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1c58d46b-701f-4fdd-8122-3a8b6b717fd1)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 7369ca30-6aa9-4e4d-81ce-5382fef6a090)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8ee0764c-6ae1-4a7f-a43a-da8e9e2ef1ff)(label(x))(mold((out \ + cbe7bb87-0ee5-484f-98e0-76049f55caec)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 139f7e26-a096-45dc-b86c-b1759995e640)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 5d812a64-c6ff-4462-953e-f44e9e824cab)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 584fe536-95b9-467b-9d45-8ff79f932322)(content(Whitespace\" \ + a5051252-7def-4e6d-8fea-4260df182ede)(content(Whitespace\" \ \"))))(Tile((id \ - 44b651bc-58e2-4d0f-8fe7-f9f4ef2df975)(label(body))(mold((out \ + 05169a5b-7b3a-4c62-9516-404ece134d3c)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d8b7e4b6-2830-4ae4-8765-ad8787599005)(content(Whitespace\" \ + c4778c20-f4c5-4421-ab56-0f75e2a04953)(content(Whitespace\" \ \")))))))))(Secondary((id \ - df1a1724-1680-4c13-86c4-cf1739d1f2f5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b12dc4f1-3584-4d70-9df4-56748637b5d9)(content(Whitespace\" \ + c2783ef1-5aeb-4b81-aeb4-eb3b86094230)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1a443d42-d604-41e2-912e-7b97f5cd36cb)(content(Whitespace\" \ \"))))(Secondary((id \ - 789ee2e2-b17f-46d2-a729-97747b3d3b3c)(content(Whitespace\" \ + 2d3b7e3f-ab14-4f97-b404-68f67e6c65bb)(content(Whitespace\" \ \"))))(Tile((id \ - eb31c313-cfaf-4a04-97be-5d02a39afa8e)(label(Lam))(mold((out \ + 9f78dc9b-136c-46af-864f-b3126d69f238)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ebcd5284-9b96-4e09-9e05-1c856050c226)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 2c4d2669-9b10-4995-8f9c-cfe252685936)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33d26cbb-f822-4b7d-a3a9-a76ae159a0c1)(label(x))(mold((out \ + 4695a498-1053-429c-b9cc-3e4b301f6545)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f688d2b2-b8c9-4203-ac30-acb9b78b218b)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 66cf7e4f-a60d-48a3-a6c4-73bd1b2f6f73)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 47729e37-9963-4286-9683-323f9b87bceb)(content(Whitespace\" \ + 84f3121e-497c-4c92-9adc-469d85da73df)(content(Whitespace\" \ \"))))(Tile((id \ - e5b9286e-a2d4-475c-bbc6-6a0ec96cfa1e)(label(subst))(mold((out \ + 56185002-987f-4a21-a49b-0dd03fa81f7c)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cec07007-77a6-4c7c-9ba7-4d851d46afab)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 7ed99b0c-fccd-4cd5-a58c-fdac6cbf1a84)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cc33ccf8-2ba7-420b-b2c6-21aea451a89e)(label(v))(mold((out \ + c24098a4-0d7c-4138-9973-bd734a66e939)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7d8a5934-f197-4252-a244-ab397fd8f6a5)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 74256627-5c72-452f-922d-f837620ebf6d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - cc112f0c-4bf7-4662-917e-846de267fe34)(label(name))(mold((out \ + ef943db9-ad9c-4bb4-933f-4ab2731ab566)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b02b84ec-218c-452a-bf1e-9617cef8490d)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - ed7443d9-4404-44fd-a4e0-3f6559f33e82)(content(Whitespace\" \ + 4fd12213-505e-48cd-9e2f-ca24d94e6293)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 226cd797-7fb7-4ba6-968e-c8002f5c8225)(content(Whitespace\" \ \"))))(Tile((id \ - ddac8323-ba4e-4d64-b5cc-7e69c920435a)(label(body))(mold((out \ + 6b517e60-11d4-45da-bffd-02d61d96ebf2)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - a26fdd56-19a1-4583-96b1-b2e6f4dce75b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4a409d0b-c2f8-4b1c-b160-ff917085bf6e)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 0bc92aab-2442-4a86-a9cf-98cb6d0f0db7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 724421a6-806a-4da1-bd43-6512303e2d70)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - da613248-93ad-4ad8-8958-3b005c4c4629)(content(Whitespace\" \ + 97584f26-5819-477f-b7a6-6d12ad2a5509)(content(Whitespace\" \ \"))))(Tile((id \ - de5333b3-77bf-44f1-a7b6-64378045d95c)(label(Ap))(mold((out \ + e0e9b1ac-7fd5-4cd3-8a5f-f1c319a27eb6)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b29c0da4-d842-4d39-93ea-68ad05af9261)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 4347b858-4f6b-4123-8cae-b87292b1bb77)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1e386e4c-0118-4aaa-a61b-7c459652561e)(label(e1))(mold((out \ + c1221926-8d31-41c4-b4fb-f796a63fe9fb)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ff5111c7-24e2-441c-ba22-b00b9570b868)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 5da7b1be-6258-4091-9a85-21e8cb745774)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - a5e422b7-f453-4fb9-bf2e-d8fbb0f1fc19)(label(e2))(mold((out \ + ee5f2f10-9a3f-4151-a03d-40a3f8002851)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 2bb31630-3fbf-41d5-a19f-37006e884723)(content(Whitespace\" \ + 10e94ecd-6cc4-443a-b0ef-b9e29425a572)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 334192b2-d1f8-4e50-84a9-f63119f5ea66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5cdcd943-3223-4e31-a4c9-230ddd7cadbc)(content(Whitespace\" \ + 4f1c0b52-0efb-48ba-8900-ffc564668643)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c7e3bd04-bab1-4d31-bc9f-bd7c35dfad82)(content(Whitespace\" \ \"))))(Secondary((id \ - 04ea99ba-c0d4-4f96-8514-512d2679d38b)(content(Whitespace\" \ + 89a32e5d-20a6-4eda-892e-f53a234f3c70)(content(Whitespace\" \ \"))))(Tile((id \ - 6698f873-dfec-429f-aa2e-5b753a0e0b13)(label(Ap))(mold((out \ + 0330a53b-04c5-4430-a646-35a184ec31c7)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fd041cbd-11e7-483f-9894-149d647575df)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5cd39bdd-16bb-4ccd-81e7-ec6c15c360fd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9b6f0264-1a4e-436d-a922-f0325bc2e4db)(label(subst))(mold((out \ + bccf9151-34f8-42e2-a474-88b2dcf31c1a)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7a495fb0-7163-4e39-9013-81f4b1b49d70)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 237d89ec-f4dc-438e-95f5-4ded89739acd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 54fc8758-e83a-451d-bb69-409eb19c6735)(label(v))(mold((out \ + 0a930568-f901-43b2-aef5-2e25509d706d)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c3e19a5a-f9b6-4f24-8f7b-64f099967f9f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + a65ffb04-543d-4489-b748-6f976717e9bb)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 71fca11a-3419-4757-b711-fdd18405d97c)(content(Whitespace\" \ + 4ee82f42-6b89-4ce9-9a3a-3920e2e531a0)(content(Whitespace\" \ \"))))(Tile((id \ - a763abee-d9b7-45b1-8424-3ef1a0a271e5)(label(name))(mold((out \ + 7f7b46f9-558b-4ca5-ac8e-2d11d00e108a)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4faf4138-d473-4173-95a6-eea2542573f7)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 0acaeff7-eee0-4f3b-8316-de316f210220)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9e46b718-8343-46e5-8691-99218fd48457)(content(Whitespace\" \ + b7d11f72-239f-472b-b216-1d54a69d6f30)(content(Whitespace\" \ \"))))(Tile((id \ - 2a42a695-0600-4732-b130-fdb906e39384)(label(e1))(mold((out \ + 1b63becd-5e32-4970-b7da-e06bceb01fc1)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9346f2a0-c777-409b-91ae-ac99409e69dd)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 10fa6c2c-0bb8-4aa5-a4df-fcd6c5346e82)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 175d0889-9c8a-40ce-a0d3-9e16bd3e343a)(content(Whitespace\" \ + 47e30b67-1086-4d31-a7fa-1b27741e097e)(content(Whitespace\" \ \"))))(Tile((id \ - 0c57d2e8-6a01-4794-9165-25cbc0175a5e)(label(subst))(mold((out \ + 410ce6ee-017e-49e1-b5dd-3167baf1b5e7)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 05ee19ae-081d-4fb0-affb-ecad3fc03096)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 9b2c976d-4734-4dd4-aad1-02151b7a95e1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7c14b792-807c-4156-af95-90f4cce11fba)(label(v))(mold((out \ + 11df5403-1a03-4fa5-9028-d10f98bed12c)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3341286f-c3ba-4879-a6f4-24cc00343cee)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 7f9e8f6a-a8d7-482a-98e1-3ebc829718b0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 80da2600-590e-496c-9670-31ea4bc2e302)(content(Whitespace\" \ + 7a1c9718-da71-4a0e-ac46-4cdfbf6c0d1a)(content(Whitespace\" \ \"))))(Tile((id \ - 5a0ea697-f4c2-4fca-879b-a4b7ac213c8e)(label(name))(mold((out \ + 6cc48826-d8d4-43c7-835d-2f261a0c7992)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2d9420c7-44dc-4781-8c4f-fabd96d95ad4)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + b6eab2c5-cc02-42ee-9b57-3002dd0cf090)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7bf8c927-0575-470b-b3c5-a29a553b6830)(content(Whitespace\" \ + e8ac7d39-a4b0-4d0a-a503-eb8a66259d40)(content(Whitespace\" \ \"))))(Tile((id \ - 5739b8d1-04a1-4835-8688-50bb5a0929dc)(label(e2))(mold((out \ + 3e3ddf57-aeca-46c7-8b0f-044792640f03)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - cf9ea30f-5bce-4d8f-bcf1-f47ab170f0a6)(content(Whitespace\" \ + 34534b5b-0113-4667-ad35-8b78215e2a71)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 140b4e40-9a69-4603-a8ff-f54f43833aea)(content(Whitespace\" \ + 755f6441-c1a6-42bd-9a69-4f687ded5923)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 83a2646d-03af-4380-950e-4ffbec2efecc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 60a803a0-45dd-4d26-9e50-9d41b42e060b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 55f117b1-90ee-4043-97a5-eaad60fbf8d8)(content(Comment\"# \ + 3d33bad6-629b-4377-bc84-08eb8e387966)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a8dbecaa-3f47-4dc3-b63b-365fb9261f89)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6654f63d-e0f7-40a5-b587-82d4600f10ea)(content(Comment\"# \ Evaluation can result in either an Exp or an Error \ #\"))))(Secondary((id \ - 75edeef0-b93a-4e52-8eb7-956406120f02)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d9758f2e-b154-4d74-9d8d-ddb629f96371)(label(type = \ + 7f4428f1-78b1-4639-8d6a-5c7eed8589fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3febd2a3-c1b8-44c2-98fa-96a56e811e68)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e0f5968-053b-43c6-8ee7-f9e839b0d176)(content(Whitespace\" \ + 8f57e053-591f-48ae-b326-e24419c03bbd)(content(Whitespace\" \ \"))))(Tile((id \ - 0ee7d546-e23e-4b2c-808e-01af4f749706)(label(Result))(mold((out \ + 6900c395-caf2-4286-8043-71185f7d24ef)(label(Result))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - bd8a61cf-b940-40b0-9fbd-c698a60e9df6)(content(Whitespace\" \ + bcc43ade-ef6f-43a4-b88e-f58e8eb0a2d4)(content(Whitespace\" \ \")))))((Secondary((id \ - 8a5beda5-5224-4e5c-8dc0-79e6db7f1fd3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 91cccf23-4d44-46e7-a81e-a046a2566144)(label(+))(mold((out \ + f68b67a6-c7ce-40d0-bd20-8a4228e45813)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8d164db9-3c9d-4c0d-8ede-a22bd6606e21)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ - 10))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 24bf5ab5-af15-4566-9884-a2061fb39d79)(content(Whitespace\" \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 9aa41cf6-d565-47fd-ac64-bd06dae827b4)(content(Whitespace\" \ \"))))(Tile((id \ - 4d58cbe8-1f96-4129-a6bc-5fa73566b2cf)(label(Error))(mold((out \ + 7a283153-3a56-4dce-8bac-45a44830e08f)(label(Error))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a9b509d2-8f56-48d1-8e5f-3fdafc9415e5)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + cdf2d9f9-a5ab-4cf8-888d-71e0e09c1d6f)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 9f7a0898-680d-4868-a84c-5bb556f1612c)(label(String))(mold((out \ + 64fbff4b-d7ef-48c5-9a60-3987b835a6f8)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 689974ef-89e4-498f-bd4e-34a6720427d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52b2d13f-c806-4877-84fe-6d32ab1182b6)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 10))(sort \ - Typ))((shape(Concave 10))(sort \ + 330f7361-6f52-4ac9-8177-9a3da0547a33)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fe46ca25-436f-44c1-9d13-c36dcf6e1fad)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ecf58e9e-0efb-4e01-ae05-1fe9b21d03b3)(content(Whitespace\" \ + d3a4819b-0519-4054-9f7a-7fd2b49fa742)(content(Whitespace\" \ \"))))(Tile((id \ - afce6860-9293-4f8e-9ef7-dd0c60ca95ab)(label(Ok))(mold((out \ + edae8e1d-89ec-4ee0-af8d-2553cf8b15ad)(label(Ok))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - aea698dd-d63d-4fe2-9fcf-7f224c41a59c)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape(Concave 1))(sort Typ))((shape \ + 5df696c3-1af2-4d42-bc0b-802229064093)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 40472e30-a169-465e-af55-751ecf617aa0)(label(Exp))(mold((out \ + f058a46f-13a3-40d8-ab11-1d0db4ad5038)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 2cf73080-004a-4f90-b789-9221717f6081)(content(Whitespace\" \ + c8ecd3b3-4c52-465f-a9b9-00159993d3b0)(content(Whitespace\" \ \"))))(Secondary((id \ - b27f5376-58b7-4974-beaf-4de3558d93bf)(content(Whitespace\" \ + b4657885-2cbb-418a-a10b-ff948be41b13)(content(Whitespace\" \ \"))))(Secondary((id \ - f43fd6da-318e-4965-a2a5-42ed801cc41f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 82677a8a-59a2-49cb-845a-3c3876b5b300)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4f966c26-0371-4ef8-a075-127d1f0321f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 621fd573-caa6-4583-87f9-b5825e167918)(label(let = \ + 989eee13-d110-48ef-9082-4f27be775ede)(content(Whitespace\" \ + \"))))(Secondary((id \ + d45be707-95fa-46e4-b033-e9f75e669352)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 4bc166bd-7d34-406c-a06d-5a3a4fc3a2f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3ad7d46c-19d8-4d4e-9f98-3ffe919b0143)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3339310b-320f-4f3d-b010-4aa986874d15)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cfd16b5f-c56a-49a9-a7f2-44b0be14f475)(content(Whitespace\" \ + f94284ae-2d88-4057-bc49-351077f07121)(content(Whitespace\" \ \"))))(Tile((id \ - 8581c765-76a3-422c-9479-8eb2cf7c104a)(label(result_equal))(mold((out \ + c8272a8e-f498-4c2e-a487-023fc5789105)(label(result_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 125cc189-7080-41e8-a196-b7ab8ad54f77)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + f5ee90ea-3b4d-490c-bcc2-b56eb1b07e56)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - db9bdbd0-7b2e-478c-bd6e-8f8b5c508ecc)(content(Whitespace\" \ + f6bd80dc-0326-4637-a7b1-4dfc448ce3c6)(content(Whitespace\" \ \"))))(Tile((id \ - 1041388d-9c06-4d8a-a535-05b540bff54d)(label(\"(\"\")\"))(mold((out \ + 980685f2-512a-44a7-a9b5-9ccef9ef09dc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2ed6f843-67da-461a-80ca-5d01c34c12c5)(label(Result))(mold((out \ + c00204a2-d652-4535-bfaf-54c3f5b28e47)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a73ace3b-2a20-43c9-8697-861ce8173c07)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 14))(sort \ - Typ))((shape(Concave 14))(sort \ + b5f7a8fb-30c6-4a88-adaf-146a149ae536)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 320fb96f-b4ff-4d76-a951-a09df19091e0)(content(Whitespace\" \ + fb131e26-549f-418c-a080-64ef774e20b9)(content(Whitespace\" \ \"))))(Tile((id \ - cd4f3152-7c7f-4a71-be23-f9d7c0388c9d)(label(Result))(mold((out \ + 981974af-0bf6-433a-b0e5-ed639e63ba32)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - a92c9445-e047-476f-a541-5edeeeb864ee)(content(Whitespace\" \ + c0d50d1a-2b0c-48d6-839f-1ec13740cf80)(content(Whitespace\" \ \"))))(Tile((id \ - ca0ae608-6978-4d91-a8cf-9103dc0e87c6)(label(->))(mold((out \ + 1360f5e8-5b30-491a-a6a3-d8db39e57bf0)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6b67160f-a805-4eab-a904-5786bc35aa7d)(content(Whitespace\" \ + 0102b6db-945a-437b-80b9-b1b03ba6ddec)(content(Whitespace\" \ \"))))(Tile((id \ - cbd87072-37ba-47ef-b34d-4d2da770afe3)(label(Bool))(mold((out \ + 2a46ed0f-afec-49ce-84fb-2cc8c20e177a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7c817c8f-ce88-4e4b-b96a-e26c7da1c387)(content(Whitespace\" \ + 7d74bc3e-f8db-4f7a-a20d-a0e00ab3947a)(content(Whitespace\" \ \")))))((Secondary((id \ - 64f3bd36-89a3-46b3-bc72-98972d735233)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f64f54c-d03a-4e99-b8e8-cf42d0043c9e)(label(fun \ + 508c74b9-6093-428d-9bc0-86563f1d5516)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8d15a0cf-b489-4dd3-bd6f-21660dd9868e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0286c456-4807-4a6f-91d4-10e73c6aa351)(content(Whitespace\" \ + fef14404-612a-4942-ac68-bed915802d76)(content(Whitespace\" \ \"))))(Tile((id \ - 075698c5-49d1-4818-a2a0-925e47ebb73c)(label(rs))(mold((out \ + c0728287-c057-4fa2-a612-75d3158b7311)(label(rs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 79fb8f75-8463-4067-bc1f-8a01459d9cd4)(content(Whitespace\" \ + fa6fe5ef-bcc0-4ab4-89a7-0202affba998)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 055d2b42-baca-4a18-94a8-2dd4163c3cf9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4666bb19-2d4f-4d4e-acd4-3b375a5d357c)(label(case \ + ff6effbf-26a3-473b-9cea-01f6ea499eb4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 81aec986-15ae-41ce-928a-9beb675cb48e)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 53c9f8b8-bc8b-4251-ba44-04c921e86785)(content(Whitespace\" \ + 61db68d3-320d-4bb8-8195-d667e9c3716c)(content(Whitespace\" \ \"))))(Tile((id \ - a21b674d-34f5-4d6d-9f85-144377e105c3)(label(rs))(mold((out \ + 62d522af-a13e-4a4b-a7b6-ba6dcb04b51f)(label(rs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 36300ef2-f0a3-4e40-99de-9e3d54bfcfe0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7d884095-55c3-4b3c-add1-d24317fc7080)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + cabe162f-cfb5-46e7-a1d4-b751d1b9ba72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9172629d-3b54-4382-8091-3f66c7d88f82)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9a9b1e20-4bc2-496c-8619-b0a889a7aef8)(content(Whitespace\" \ + 66a3dbfd-772c-48a9-912f-634ab479359e)(content(Whitespace\" \ \"))))(Tile((id \ - 262fd22c-29f4-48cc-9b52-e7176e683b94)(label(Ok))(mold((out \ + f0dc8cb2-97a9-4995-953c-da7bbc8d12b2)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f8074977-f93a-463b-98e4-d69bfc55307b)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 707cd6fe-2e8d-4c36-91d2-6607a18f7b5f)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9bb655c2-b54d-4741-a1ab-0addfd13c98f)(label(e1))(mold((out \ + 12180951-3844-4624-b99b-9d6e3c286d9e)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - f9451c6a-d4bd-4b58-b077-397aaa290272)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 0e93ccc4-3167-4aaf-bb3a-96f53e596a53)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 6f3b3236-cdce-41a4-9232-0006322b7b57)(content(Whitespace\" \ + 454a8046-df52-4e23-8184-8d422219d1bc)(content(Whitespace\" \ \"))))(Tile((id \ - e2d471ef-1c46-4a9c-a54a-fe1ef3cbb19b)(label(Ok))(mold((out \ + 24e7084c-5f76-4028-a3be-1435136a7b01)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 60028cb7-d928-4ee8-aa7b-9dc38e3a7e18)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + b256025d-9c61-4091-9bce-fde2b16e7cf4)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3a1ad870-b7bc-43d0-b716-12cb9c23597d)(label(e2))(mold((out \ + 60264c98-c608-4383-8600-e85717410569)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - c50a22f8-4eb0-49cd-8144-2300c10e107a)(content(Whitespace\" \ + 26e14cb7-40ee-4e25-878a-c496aa0f6df7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fbb838b6-e6e9-4dff-a09c-523e350c630d)(content(Whitespace\" \ + 8840d2e6-c983-4c1e-b6c8-013e4063db71)(content(Whitespace\" \ \"))))(Tile((id \ - 00557cb6-1130-4a7d-8368-3412f00d393d)(label(exp_equal))(mold((out \ + c9e591b6-b7be-49cc-9421-8e974ffd15ed)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ba4eb367-ef3f-4525-93f9-bfa92d9d7c97)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5eec7b79-6cc0-4f08-95c0-2f4911c2f681)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2502b290-8870-4d81-8f5d-76609e24860d)(label(e1))(mold((out \ + 66bcc7d4-6c5c-44da-b1de-e3222dfcda30)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f484106b-41ee-4800-9a7a-a6a885e60b45)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 0977bb86-c4b4-42ee-bf56-efa83425a578)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 96e06e4d-be79-4633-a71a-a32b52a6153b)(content(Whitespace\" \ + 668ccab0-e97c-4b43-ba65-c5dc79e93d20)(content(Whitespace\" \ \"))))(Tile((id \ - e4b1e526-e611-443f-b5aa-6be2f7aa6253)(label(e2))(mold((out \ + 8a1020ee-f5c8-422f-8eb2-36f18c31e0d8)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 73ddc6f1-7d14-4b25-9602-96415acda0e6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f5c67e0-4040-410e-92f6-62a141252bd0)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + e31c1ade-e4ce-47df-b15d-64499739f7dd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4681f79b-128c-4c8a-9776-5c169ef35e6a)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ab885d68-e990-49bb-a610-a53b37d77456)(content(Whitespace\" \ + 8818b04b-d0cf-43cc-81c7-fdc8da9073da)(content(Whitespace\" \ \"))))(Tile((id \ - cfa1b087-0510-4b36-ac15-5a61f8aafa38)(label(Error))(mold((out \ + 759aa58b-ae8c-403f-bcc5-5c647212eb70)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 74c5a935-852f-4da5-878c-887bc26c98e9)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 1adc69a0-b02f-45d5-83ae-b9a68f2132a0)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3ff6542d-a8bb-4716-99da-9367ecbd49a9)(label(e1))(mold((out \ + b1364f6f-2547-4da5-9645-7063c58895b8)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 58f2f26d-e37e-41cd-b13f-8d7e74228172)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + ab7fa76b-f257-4bdd-bc16-8b5e824fce1c)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 1e2b816e-7642-4f4e-b95f-adf12abbc8ae)(content(Whitespace\" \ + 9dceec92-e291-4ce8-ae4a-0d6202475e94)(content(Whitespace\" \ \"))))(Tile((id \ - 8416cd9f-2529-4db1-9035-20229b62df28)(label(Error))(mold((out \ + 77269ffd-f5ad-4812-82fd-0bb3ecdde707)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dff4702f-08b6-447d-98c5-0f1fd993e456)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 9369fe6d-ba8d-4c0e-b9f4-c0419feaf5d9)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ace2fdc0-80dc-4300-97ea-843487707e22)(label(e2))(mold((out \ + 8ffd8fae-dd4f-41ed-b39c-5708cbb176e3)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 21a5a76f-b56e-4eab-bc27-4365a8a5c5fe)(content(Whitespace\" \ + 48761ee7-ddb8-4c3b-8eba-f7aa9060c89c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 987928b6-2cd7-4cd8-92c5-dca894fee268)(content(Whitespace\" \ + d4733eac-c638-4227-8159-c1719daace18)(content(Whitespace\" \ \"))))(Tile((id \ - 39426536-b6ae-4d23-b940-c09166c487f3)(label(e1))(mold((out \ + e55aab24-e42d-4fb9-a1f7-73dc14382fa8)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ddc21c27-b545-4704-9b83-73a54e7f97c5)(content(Whitespace\" \ - \"))))(Tile((id \ - b46541b7-7399-43b2-acee-ef0325e8909d)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 8))(sort \ - Exp))((shape(Concave 8))(sort \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + e751d6ca-0528-4e8a-9fd5-1d9f8ea89b4e)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c9a08e3b-dc53-4576-b101-94199ea10081)(content(Whitespace\" \ + bf467fcf-28f3-45f6-8683-de38f77ca1ef)(content(Whitespace\" \ \"))))(Tile((id \ - 4aae0476-095c-4045-843a-f7dd32925cdd)(label(e2))(mold((out \ + ee40864e-70bc-4733-a5c0-da700d1e2d14)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0606e959-ddcf-4d32-b61d-68b1bf791355)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 70cb209e-2fbd-4019-8a9c-f55ae2b12881)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 40b62523-c7a9-412b-bbb9-0d1cc06a16d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 531d21d9-9791-4230-9a92-53caaf0d5a6d)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ea405901-ebf8-4432-9bc9-2ff5ee8500f1)(content(Whitespace\" \ + 31781b90-3d37-4b00-a0a3-351d8748624b)(content(Whitespace\" \ \"))))(Tile((id \ - bbc620b9-6f94-49ea-8ed2-4c7b6bb323ea)(label(_))(mold((out \ + 676f3a88-a751-4852-9145-8cacb526616f)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 460c3b9c-9811-4fe0-a6a3-453ffaf1290e)(content(Whitespace\" \ + 976a20da-df0e-42e6-a10c-503615721197)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e36568cc-f82c-438a-9b67-2098c7bfb269)(content(Whitespace\" \ + 79628056-aa48-42e9-9802-6f2896e85d0e)(content(Whitespace\" \ \"))))(Tile((id \ - 1c3d6b48-108a-431c-817f-138af3f8a50d)(label(false))(mold((out \ + e83564e0-e2b1-4171-a760-d7f491ec6fa2)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a61bcd07-c82b-4dd6-838f-f4d9762a0a2e)(content(Whitespace\" \ + 68f059ca-89de-480f-9ec9-ead418e4c217)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0e699793-d7c9-477d-834f-c62eb4458558)(content(Whitespace\" \ + 44cce680-2db3-4f2a-8624-72470695888b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e06c3270-8e19-4c45-8888-e9301f3629cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 88cd77a5-2e10-4d67-86dc-c0acddaf3a7f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1f1fecf6-bddb-4813-9c11-306183d4da10)(content(Comment\"# \ + 9992acb1-4fba-4ac4-8baa-609036962a28)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 40d86858-c6d5-4f3c-80b2-baf99f974c1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 57e3ef8c-1c35-4297-8089-11f73f032a4b)(content(Comment\"# \ Evaluation by substitution #\"))))(Secondary((id \ - 5ea9e27d-1731-4316-8506-fc45c5e70003)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5fb6f0e7-3581-4553-95f8-a84bd4161861)(label(let = \ + ba1f3bb8-f734-47ff-8b87-05b235e70fc2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 16))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 1af286e3-978a-4ff8-a94f-5f2891068195)(content(Whitespace\" \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + a69460c3-667f-4179-ad87-12a955f3b37b)(content(Whitespace\" \ \"))))(Tile((id \ - e1e44354-cb44-4d2b-8560-e8ad5adb5dd3)(label(eval))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 25a60777-31c2-4b6b-b06d-cf6d67d61e3f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 11))(sort \ - Pat))((shape(Concave 11))(sort \ + 2dea2c00-978f-4220-bdd7-fc268b2a8086)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Grout((id \ + 504d7bb9-20da-4c90-9534-c7e482c803c2)(shape \ + Convex)))(Tile((id \ + fe186128-a343-490d-85d6-a65f00596352)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b3f75514-9770-47c1-9545-9e19f15df048)(content(Whitespace\" \ + 8529a871-5f63-4063-a268-efa4275a3b0e)(content(Whitespace\" \ \"))))(Tile((id \ - 62603e3e-6bba-44d5-bc4a-206542a22f33)(label(Exp))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4f14df0f-7731-4364-9efe-7a353e852f82)(content(Whitespace\" \ + 4c3c23b6-453f-438d-bda9-c54e11eb6acc)(label(Exp))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + cee23988-7c4d-472d-9d03-49193e44c6e8)(content(Whitespace\" \ \"))))(Tile((id \ - 202553fc-31fa-4c18-afc4-2ebca2469d9b)(label(->))(mold((out \ + 08eff29d-3d25-4d39-b2cb-15fa31175737)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 846d17c4-4bc7-44c0-8167-cb7b5f7338a9)(content(Whitespace\" \ + dfe0f84d-ebc0-47ee-9b99-fe69595d7865)(content(Whitespace\" \ \"))))(Tile((id \ - fc4991bd-f326-428d-a8cc-44bd3c40b891)(label(Result))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 90e6f91f-19c9-4e74-9ece-c08e8cfdb26c)(content(Whitespace\" \ - \")))))((Secondary((id \ - 2916646c-3df4-49f6-86de-25e96dfaa42f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 070d68c0-e8a6-4ccc-80df-51fd8782e5e9)(label(fun \ + 991b6b4d-afb8-4080-a4f7-e2391d097a8f)(label(Result))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + cc1ac093-4609-41cf-bcf7-0936b925e527)(content(Whitespace\" \ + \"))))(Tile((id \ + b454082f-310a-43f6-92e8-2023295e5d00)(label(=))(mold((out \ + Any)(in_())(nibs(((shape(Concave 0))(sort \ + Any))((shape(Concave 0))(sort \ + Any))))))(shards(0))(children())))(Secondary((id \ + aed6b7f1-7475-4f11-a0a1-671cdac46688)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a3c447c9-fdf3-4687-a594-d2e08f28dfeb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 10982210-ebae-46dd-8fa5-34a0e418a12a)(content(Whitespace\" \ + e01238f2-d698-494e-bc7e-425ba4bc8f32)(content(Whitespace\" \ \"))))(Tile((id \ - 083a4aba-2a8a-4bd0-a272-ac89effa0f9c)(label(e))(mold((out \ + bbf50d92-7dd1-4b6e-9bb3-d8f6cec230d1)(label(e))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e2da86a1-b62f-4be6-ad50-bf10dfe5e93c)(content(Whitespace\" \ + 12c5fb3d-efc6-42c2-885f-51f61e74819c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f4abddd0-6c1e-4227-beba-dc836f87d938)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dc129b5a-7dc2-4b69-8c7f-28ba0e70a587)(label(case \ + 4b3d7ce6-00a6-46c2-9648-6304789b69d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9b1b141b-5d1d-46b5-8581-f361375e5c31)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 6c3d599d-67f7-4278-ace2-e76739314f6d)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c53a231d-bf30-4e8a-83f1-d3d4a6eb01e1)(content(Whitespace\" \ \"))))(Tile((id \ - fbdd7d29-dde8-4fe5-944f-cb29f3309bf4)(label(e))(mold((out \ + 2e7fe577-93e7-475d-99dd-431445c5e354)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e4b8056b-10eb-4155-a896-24716bd904a9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ac689c9a-3569-4419-8081-5276776f7435)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + d8383b81-13a8-401d-a11c-ebe68c525c58)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c973035c-3ea4-4286-a4f7-e58cdfe9fa95)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4244d236-5133-45aa-8b62-20cca6dc5a77)(content(Whitespace\" \ + 275c43cd-1b36-4553-b8b0-aa8e4fa46fa3)(content(Whitespace\" \ \"))))(Tile((id \ - cef34e10-3604-4ce6-910b-2fa21cd6d2f2)(label(Var))(mold((out \ + a0a6cdcf-b5da-4e9f-973e-84d7b4a08494)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3cb54504-edb9-4812-be0f-bea0fdc875e0)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 093347d4-0dbf-4b8a-b367-41713c84536b)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 3e8b501d-9a2e-4a7d-833d-89a526a5fb8c)(label(n))(mold((out \ + 0daaacae-958d-4dd7-af51-83fd0cb626d8)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 191e6fef-b0be-4e08-a147-64ae2537fdf7)(content(Whitespace\" \ + 0ce81b52-c0d8-4acc-837b-9d32bfd0c0ea)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1de92859-2011-4c76-866f-c882d0c1cc38)(content(Whitespace\" \ + 1d83ca97-016b-499c-84ea-b3a8bb806750)(content(Whitespace\" \ \"))))(Tile((id \ - d00194a9-72cc-45ca-9c73-5d46869f610a)(label(Error))(mold((out \ + c3634472-05cf-4c5c-b913-f14a9e5cc769)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c0a0ce90-81d8-4b09-ba8a-98934dd238bb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f09d1916-fa47-4d9a-8f77-c33ff712ae38)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 17469555-3ef2-4223-81a3-3e09a59f7c61)(label(\"\\\"Free \ + 0d8288cc-c0a9-440f-a889-6a75109d0c3d)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f5ae48cd-7b58-4b89-99d0-ae90a87cfba8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 28d4ec8f-4748-49f2-8af0-aed3a76b2701)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 6c81c8e9-4d9f-44bc-a5a5-4b2d3748f200)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b091ed2d-bf15-4912-b7a1-130d9f070d2e)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 52fc7222-801f-4ff1-9367-4021e1a8cc1f)(content(Whitespace\" \ + b3dba565-ac47-4ce2-9ee9-2d7c09390978)(content(Whitespace\" \ \"))))(Tile((id \ - 82301ff9-b986-49ee-a14d-eed128b05b7b)(label(Lam))(mold((out \ + 96f489ef-143e-4d52-ab91-3ba010381a2f)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 13384c5c-89b2-4e49-9c29-ff28cdb24c5f)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 27f5147f-345f-49b4-80ab-9807e8c36250)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2e67fc4b-20fb-48fd-aec5-5c5e6a3c9cf2)(label(x))(mold((out \ + 4613c115-0949-42d8-8322-08f880acf8c3)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 117717d0-9155-4b0f-8082-a371cc2d3555)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + c89ab053-4c92-48d1-9bce-0c4c6dc7e20f)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9ab8747c-aee4-46b5-855f-07d5c1188b32)(content(Whitespace\" \ + 85f45e4a-9397-447f-8736-90983ea6217d)(content(Whitespace\" \ \"))))(Tile((id \ - ce6325f6-7892-4116-acbf-aa92206a96b0)(label(body))(mold((out \ + 4b46a104-652f-4dce-a534-90cbffea72b2)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 89c70863-8308-4aee-9a98-28d74dd74526)(content(Whitespace\" \ + 57ec8c92-c009-4b6f-accc-0d6f03acf689)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d38b5a87-d86d-4461-8ee3-e4b504aea6ac)(content(Whitespace\" \ + 9749a2c6-6dd6-401f-84b1-cd84e3e77d2e)(content(Whitespace\" \ \"))))(Tile((id \ - c0309d83-842f-4163-ba0c-00274c4c765a)(label(Ok))(mold((out \ + 4df6b9cb-10b3-4354-ab67-43520b015d45)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a168e86f-de75-4996-b05a-b76c84dc9c83)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 69780fac-0d7b-459f-8857-fd08cff36c5a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 37b7507b-be1a-4d12-a966-9ad509579bca)(label(Lam))(mold((out \ + 29c9df7b-81cb-4752-8d28-5f6474ced8bd)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ae281f5e-25e5-4970-86f2-1ddbca9b48d9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 08024dcf-dc8d-450e-a5aa-11e051461ce1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f83349a9-1cb1-445b-9d8b-0cb26cf0b432)(label(x))(mold((out \ + dcf9af0a-a532-4cac-961b-ed4ba53bd66e)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5315a959-83e9-4805-9bc4-dc227d30c63f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 9745a4ea-25ef-4a5b-b317-2e0313ad0013)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7a01c28d-bc24-4523-af0f-a19527a9d15e)(content(Whitespace\" \ + 2bdcbf11-be1a-4def-8af0-23968a1b5200)(content(Whitespace\" \ \"))))(Tile((id \ - c658b71e-92ce-427a-99dd-d14e07d4b579)(label(body))(mold((out \ + 0ac0f6aa-db40-4f22-a3e9-aeb5a53b8d61)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 2ce50808-b44c-435e-87f2-a277c5be92aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1380b225-c096-4d8e-a111-39f805c15707)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + a6305a92-679f-4e04-9efe-58426a5c25ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 32755da2-374b-47c8-a5f6-8ccce5cddf42)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f0c7a241-6ee1-4097-bdd8-d39550de3ad8)(content(Whitespace\" \ + 78eb6d0e-5a8c-4147-912d-a62d610104ed)(content(Whitespace\" \ \"))))(Tile((id \ - d41bc9fb-4280-4c3a-86fe-724f87ca056c)(label(Ap))(mold((out \ + d5ce7da8-8dca-4e12-b288-b7e7184a1b3d)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b63a9734-7644-4072-a5bb-d8b2397a7dd8)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ + 773aeeaa-bfbb-4a13-873b-4e57610ba813)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2aa0a5e0-c746-4ee7-af22-61de73933464)(label(e1))(mold((out \ + 873be169-1ef0-4027-9424-30ed00780a5b)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b1308751-e597-4f83-8bdd-f11a6cd7c646)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ + 94d0e70d-4bfa-404d-bdef-ac9f9aab6fcb)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - df669107-279b-4daa-a84f-0749a93573c7)(label(e2))(mold((out \ + ed5a21e7-4d69-49e6-b28d-0b2d7c99c1e0)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 26880146-1ff6-4797-8c69-313cd096525b)(content(Whitespace\" \ + 29bbc37f-7550-4931-b256-85a1cbf6b1c7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2fcf5303-c991-46fe-92b1-8dc91a89f05e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8067ba50-823f-4583-b983-fe007004442b)(label(case \ + fcdb598b-74cf-467c-8f59-63011fb9953a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a77a91f3-be7a-4254-8b0a-30963f3b9c61)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - c2900d76-5805-4b52-b24f-2f09d3078093)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + b3d0d0af-3261-482e-84a0-16b80a3ab486)(content(Whitespace\" \ \"))))(Tile((id \ - 3b19a74d-4f02-4bb0-a68b-0f2b9459060a)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0443a8d6-3210-49a2-bd1a-43350c73bc6f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 2927f4e8-9b6e-45a0-a750-43e1f57cd52d)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + a5deadac-e478-44a0-8e58-8da72b85e64b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 966493b6-5a35-434e-ae30-f28eaf26ac7a)(label(e1))(mold((out \ + 6e1907b4-0432-4df1-8383-7231e9fa82a0)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 18904f6e-8219-42b7-bc23-a52869c83453)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fb1b10f7-a7aa-4b2a-b1e1-868c9cf6700d)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 69fccc01-7b46-4c35-9d1b-b376e94bc027)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4e6a365e-783e-44df-9604-5ab4fee970c6)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - aef8a32d-571e-4aef-92fe-a133e61561df)(content(Whitespace\" \ + 83d765ac-f574-4bb2-9442-84f08fcd0854)(content(Whitespace\" \ \"))))(Tile((id \ - 1622c6b0-1aa1-4a9f-9ad1-0ee2f44e440c)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 53c740db-a127-4286-bbaa-fc1f6bfd897e)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 86981a7b-1855-493a-bb5b-bd50acbb393b)(label(Lam))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5e484724-9f82-4027-82b8-3b9c2201e4bf)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8b69eb6e-d632-45a7-84b8-c2f552f1cb2e)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 516a2ade-2d02-46f6-b79e-6f262e8774c8)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 14))(sort \ - Pat))((shape(Concave 14))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - 94ecff3b-c7f6-47a8-88d5-26fbb6602902)(content(Whitespace\" \ + 3988da6d-d9cc-45e1-9643-60955da97c5f)(label(Ok))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 6af331fc-d1ce-4479-92cc-273c5d1e6b40)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + a10f18cd-5344-4b39-b61f-5a534909396c)(label(Lam))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + d2bf9eeb-79a8-4eb3-8ec8-d863a8545ff4)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + db272986-8b95-4f77-b59c-2cab82121b3f)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + e61d6d9e-20dc-496a-8beb-0e320b8ef1b4)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + f52b7287-c6c8-4a60-9d7d-72cbdacb854c)(content(Whitespace\" \ \"))))(Tile((id \ - 88490ba8-3f86-411b-a6e9-817f4f662690)(label(body))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + a6230176-d042-4e0c-a0e5-b55650deefe4)(label(body))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ - 6ef6102d-78b5-418d-84e5-9349d627fbfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e35cd324-d16a-4d68-a97a-b6ca15cfe3f3)(label(case \ + Exp))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ + d83384bb-f2f7-4167-83f8-52b37b932274)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c649db7e-abb7-4d29-a4b8-6a917a76c6c6)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 446fdd16-d54b-4be9-9b0c-0d8eeafc0543)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4ee7b4d8-7b0b-4f6b-a94b-dc6df6690f52)(content(Whitespace\" \ \"))))(Tile((id \ - 2cd4a45a-528f-4945-998a-3c0b9cf9c2c6)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3c39677a-03f1-428f-b295-7a33f2fe9466)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 04537911-d2b3-4bf5-9d40-5eda36555783)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 5d1cc75b-f5ac-4a47-bba2-0831c724892d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1aec83cb-0253-4eab-8bfc-73f5c6ddc33b)(label(e2))(mold((out \ + ba7a99d4-6e44-453c-9d4d-2d988ff0a0f2)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b0b29140-8d63-441e-a576-1a3ab3f24521)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c15d05bf-8519-455a-b0be-d1b096b074df)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + b42fae89-17d4-485c-8f41-7f9640b738bb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0d80368b-18b2-44fe-a92e-9408583abc55)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4d0f5b8e-1a10-409e-b434-2bdff88856df)(content(Whitespace\" \ + 96b4517b-6722-42c2-bf70-765c00c616cf)(content(Whitespace\" \ \"))))(Tile((id \ - 136333af-71db-4b8f-bf85-bf623512b58b)(label(Error))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f0793b56-f2cb-4a53-823a-49dd57145a53)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9456aff2-b841-41a0-b360-ba6adf6af864)(label(err))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + 5b0d9ff5-4bd8-4cf3-9e92-aa9cd009cd1b)(label(Error))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 99e762bc-06d2-4964-88b3-2daf6f84e986)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 7d42828d-6570-4184-96eb-3e58f43a6625)(label(err))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - cb066a61-a29e-4636-9e26-a15ca426b0b5)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + a31e06b9-1a1e-44ec-af9e-c0f6d3b19a53)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4ee95925-905e-459a-8bb5-b39ec5767d45)(content(Whitespace\" \ + 8421d32c-3977-4108-b7ba-9d27f806c4f7)(content(Whitespace\" \ \"))))(Tile((id \ - 3c2afa8d-cc20-4d23-a6fc-64fc225fe1c1)(label(Error))(mold((out \ + a7bd323d-f9dc-4163-b6ff-f5a7a0b6fcaf)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9e259835-32b3-4d25-b557-fd1b9308b451)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 95206643-fea8-4656-b431-55189d09a120)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e6c214e7-1c90-4ac4-9d87-82c9c3f5f71e)(label(err))(mold((out \ + 482befdd-a796-4162-9b72-71394e0775af)(label(err))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e2d4aebb-8638-43d4-a0a9-b7dfaf103905)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c79c0790-1bae-4fb9-8d15-28b090a7bc01)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + 6ebf66c0-f868-4171-bc9b-7c8b0e12bd80)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 766eae28-d0e4-402b-a571-5b695e6c901f)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9c30c747-f0e7-4cc7-a456-7dfe67178cf9)(content(Whitespace\" \ + 86f65de1-27b4-4f4b-bf54-0f5b69bf2065)(content(Whitespace\" \ \"))))(Tile((id \ - 1ec5195e-9152-40f7-8116-ccc26b2c8209)(label(Ok))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3ababe4d-2781-429f-98a9-f502d9dded33)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape(Concave 1))(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 49228f0b-a42b-4651-a72b-1517623527be)(label(arg))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + 6714c29b-7a44-4822-adbe-2563584c0f71)(label(Ok))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + cdddf749-a707-43af-8f4a-762da3a449a9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 59797ce4-c51c-435b-9a0a-216844d5d133)(label(arg))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - a42e030d-5e30-45ca-8417-58a64f6ff13c)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + f817396f-09e0-45e7-a4cb-a131291b2d4c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7b39247b-9eb3-4eae-b44f-90edd3df62f1)(content(Whitespace\" \ + 7d98d56b-caab-4c2f-8c2c-04c3378c6c20)(content(Whitespace\" \ \"))))(Tile((id \ - 0595a373-e5e2-4e31-a669-95d86097e70b)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 82a478f5-4725-472b-a5dd-6cfe2e76f11c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ab042364-5fd0-4837-b51d-ed1acad58e46)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 \ + 1))(children(((Tile((id \ + b9eccf11-dd4d-43c6-abd2-e2aabaf892c9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b6be841c-aaf7-4070-a3e5-a726db8865d9)(label(subst))(mold((out \ + 7fa1bed8-4353-42b0-8180-b1b9a03d521b)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 144a7fbf-4378-46bb-89ac-79cb25a98c3f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6d09302e-1eb8-435d-8a4d-47c8ef1f1b90)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e30e8889-ff79-4ebd-8fbb-9402f15aa19b)(label(arg))(mold((out \ + fa33f767-b6ac-4307-9f24-1ecba14ea90d)(label(arg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7d914adc-3684-411e-af89-b4e8071ec029)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + bf74e370-f4cc-49a2-a7ba-4a099a79c84a)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1a41d8cd-22a5-40e7-844a-ab4a97c3bcfe)(content(Whitespace\" \ + e02bd12c-157d-4e7f-a0ec-3ae5cc0a1222)(content(Whitespace\" \ \"))))(Tile((id \ - a5480aef-5c47-4ace-b998-5be13ee9629b)(label(x))(mold((out \ + fe1686bc-0eda-4913-984a-309788d2c60d)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a78fb2be-cb85-4ead-af7f-55cce846673f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + c20f6115-6012-4e8b-8c25-31b573908376)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6bcb096a-7abc-451c-a5a9-ab38b4af844c)(content(Whitespace\" \ + 4e558bda-5486-4e7f-af07-f14a40cfb619)(content(Whitespace\" \ \"))))(Tile((id \ - 079f72b2-aba6-494b-9058-3e20faa9d8e2)(label(body))(mold((out \ + 196d597a-5d3e-4fb2-b471-29e578674fb0)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 13b45363-8f7a-4f40-8523-60c70ae7c46c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 83893eed-46bd-447e-b7bd-83d79a38dbb4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2d63cd2a-1308-4775-a9bf-061a4d2fea11)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 19))(sort \ - Exp))((shape(Concave 19))(sort Exp))))))(shards(0 \ + Exp))))))(shards(0))(children())))))))))))))(Grout((id \ + eb4019c6-b76a-4002-ac16-efff924c7031)(shape \ + Concave)))(Tile((id \ + b52ba3cc-cb19-4772-ab94-b852a30d5846)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c26d297e-1bdc-4d21-9dc7-37c5ffebcc62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 52457af3-876d-42e8-8253-b1e2bd5f3eca)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 401c3082-3f59-414b-be4e-a13645eb647d)(content(Whitespace\" \ + 9fda1185-0e6e-4a5b-b2ca-e049a19c5c92)(content(Whitespace\" \ \"))))(Tile((id \ - cb0c360a-dec4-4a40-a1aa-24869a58fc13)(label(_))(mold((out \ + a6f1dec3-a12c-4398-8912-bb15bb310546)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 898f50b1-2368-4f52-a9c6-cd969565f49a)(content(Whitespace\" \ + 93fde5a2-d440-4c66-8a99-7b9451801410)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9798505e-5af9-4e57-93c7-6f71648ff0c0)(content(Whitespace\" \ + e7d14f23-0824-464b-a4a6-89a8fa2c43a2)(content(Whitespace\" \ \"))))(Tile((id \ - ef2d1259-52ef-4da0-94ec-570086258675)(label(Error))(mold((out \ + f1008fe9-b0ad-4d26-8d77-df2c44cc8ffb)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5aada76e-7e1f-4ca7-b2c6-8dd086becf92)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + de432272-f63d-4ed3-9fcc-d282a868754f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 01634b4c-d027-4844-9f86-dadd64218852)(label(\"\\\"Not a \ + 715f8f3f-cd2c-40fd-a79b-8d55e766a809)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c9b5cbea-1cf6-464c-8cf4-0ed77a1e18f5)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 3d67d23c-c9c3-4c4a-b56f-a16e505ce1a6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - ff921f44-34e5-46e7-993c-6f7dff22bf38)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Grout((id \ + 6d5fe342-943a-4eb2-ba5f-cf1483a14b0f)(shape \ + Concave)))(Tile((id \ + dee51936-8716-43a2-833b-b110a41ce3f3)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Grout((id \ + b8b4f1fe-2904-497e-bba8-d8cbaf0c63c9)(shape \ + Concave)))(Tile((id \ + 347c3d6f-3183-498a-8d95-c90f84f30cd5)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 453fb194-a1e6-4381-b510-3cfc4a3ef12e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3fc86b20-6a2b-43b4-8034-94d052a0df3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 673e832f-5fc1-4af6-bc50-4cd857d08c52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f3613090-1dfd-4946-bbfd-3d652d389e93)(label(test \ + 853929f9-cda6-4d86-a444-fa0002fa7f64)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ee55010c-768e-46d7-9264-d1d1f3b8cde9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c0ca4224-219e-427e-9415-f1f34cd9897c)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 3447e25a-ee47-4222-8bb1-828d0830b231)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 74950d4d-36c0-452f-ad57-14e3145c15af)(content(Whitespace\" \ \"))))(Tile((id \ - a0e96ed0-2f67-4271-904c-07744c73b7c6)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 95ba3fae-6bf1-479a-b63a-6035111e0ebe)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - d846ac6d-a212-4661-a1ed-2bf31f39fd8f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 798271d1-e065-4eb1-8e4d-908ab5f140fe)(label(eval))(mold((out \ + ff7b8d66-07e1-4bd9-82eb-876e95eb5ef9)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - adb0fce9-0053-4a86-8b79-6784f476c68b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6ec84ba3-dfa5-4209-868d-1e2e0260cb94)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + f624a85c-5f2e-46a8-8e45-21635fc640b4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4ee9e1bb-2b95-4aab-b22a-e14cc7e4a5c9)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + fba821f2-2af9-4828-a370-94cfa94be0a3)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ca7069de-be87-454c-9b0c-3d643c480ed4)(label(Var))(mold((out \ + 2276cd49-4002-4b26-9d63-c3852bb89153)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ff999918-31f2-4bfa-b172-5a905e962eba)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a432ca67-f008-4301-a67a-963c5a8a104b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 607cbd1d-522a-40d0-bb3d-b8b45de732df)(label(\"\\\"yo\\\"\"))(mold((out \ + e45299e3-3a7a-458d-aad2-3ba9228cb65f)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 6e383875-6c3a-4f2c-a401-91ec7bc58276)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 66a71ea7-c5aa-409a-8acd-b7b3d9c262e0)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aa7b31b1-3aef-45b3-ad22-0e5d7059a49e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7b206f6-d2a5-480a-abc0-b9cacabb4689)(label(Error))(mold((out \ + 80f7c7f2-ec3f-4fa8-89f1-1968e4212236)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 14a94e6f-e2d4-4476-a5ed-483b916dfe20)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8945a9d0-81eb-4b24-966f-a818217214ef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f389c646-e080-4d39-8c16-84071712f5fc)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8794ac1c-4080-48ff-8840-6e796567dd87)(label(\"\\\"Free \ + 646e668f-be4f-46c6-8eac-fd115e1c90e7)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 70900efe-dc3a-48d5-9f91-c70edcedaa33)(content(Whitespace\" \ - \")))))))))(Tile((id \ - e3c9daf5-57f5-47ef-9b24-a7e6d6936805)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children()))))))))(Tile((id \ + f01fa49c-e3d2-46b2-8d63-14e7224303eb)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ + 3eeaf2e0-00a5-4c28-93af-b512bafda555)(shape \ + Concave)))(Tile((id \ + f8b5db20-eff9-40a5-ad72-c299b0a10578)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + b3e597ae-59cd-443c-a751-7a644809bc54)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bad9600b-50a3-4377-8ac7-da71b362083c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a6e44360-03aa-490d-9e69-7783234649f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 64a486fe-c95c-4d78-862e-b0d2cc480928)(label(test \ + 67c91b70-4934-4233-91ed-ffc100daa927)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7a3020e6-c8b6-4db4-9f25-7ec7d6dbd511)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 24cfe539-f6af-4863-8111-78265a29f465)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 931264d4-b6f4-4c62-92e1-0196ed942eb2)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + f683e1e5-76a1-4e54-82cf-240cc7660748)(content(Whitespace\" \ \"))))(Tile((id \ - 1c9eda3f-b714-4c05-9c74-506bd14f6fb5)(label(result_equal))(mold((out \ + ce3031ac-1d89-4148-803d-d05707462ae9)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4cd76acd-9533-406c-ab10-13cd09fbfe12)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - afdaeff5-0984-4feb-9862-b326d63da2c0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 93745552-a939-4d1a-94a8-0b642e9da80b)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e0aa7d92-c7cf-416d-98c2-737ed6338a36)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a4330d8f-ce4a-4a77-8b24-56e8dfcf2461)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 9675cf30-b73b-4e0d-bf78-6735eac23c1b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 137ab8b8-acd4-4669-b8b0-0981cd8e38fb)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + c572acd7-dccd-4ed5-abb5-f2da9d078542)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab486f19-c1ed-4a4b-9604-4be2afe0b0d4)(label(Ap))(mold((out \ + 537de2c5-0598-4028-a97c-81fedb243caa)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b233e5b7-65d7-4be3-af87-c80e69046876)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 1f20e64c-aa60-43d1-b137-bec3c4cb4234)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f414241f-8fdc-40a3-a775-3d8b903ac358)(label(Var))(mold((out \ + 481ffa47-3479-4fd4-aef0-ec4e05cc3c61)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 395ceecd-3b18-4153-9800-e329c7a5598e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6d5fe24c-1cca-4efd-b6dc-ffc6858aa1f2)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b9ea6977-82ae-4e10-8f43-f3ebe314826e)(label(\"\\\"no\\\"\"))(mold((out \ + 98792c20-dd96-4ce7-8d17-add9541b28d0)(label(\"\\\"no\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - ec9c2830-8c19-4483-8b29-90f246a6067a)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 98b65b81-6539-4b24-9500-855528e16682)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 83f58d35-a260-4168-a7c9-ac3f29f9d5af)(content(Whitespace\" \ + 3724d856-b083-4bec-80d0-6058a7ae455e)(content(Whitespace\" \ \"))))(Tile((id \ - 7e9ce79a-243d-41bb-a607-18a5b570fc7a)(label(Lam))(mold((out \ + ec9b0349-f5e8-4f8e-93a4-a1e0f2db7fcd)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c121d549-80c7-4b6b-aed9-f6652df7d1a9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ddea437e-54ab-40dd-b951-4d946f9c43bf)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7b74c555-9efd-4351-8d0e-d6bd96f522c5)(label(\"\\\"bro\\\"\"))(mold((out \ + d5e303b4-6e50-496f-bea0-af9af0184d07)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ed288520-0baa-4871-b514-49e06f702b9f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + fda258b9-0b99-4c39-9b90-8fe568848e1b)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aa546db0-cfa4-4049-8ade-00c91c2d9a55)(content(Whitespace\" \ + 1ac874fc-c4e2-4438-9006-a3cb9e5ee8f8)(content(Whitespace\" \ \"))))(Tile((id \ - cd5050cd-9f89-440b-a764-46510d8a918d)(label(Var))(mold((out \ + 4174eed5-c0d5-4c61-8e6f-cad8c934a03a)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dd639cdd-c2ab-48d9-b7c1-bf7d1e5359e6)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + a2e177e3-0d65-49d8-8f62-fa60cbdf0fa7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 78ea24ff-db16-4799-941c-563b8f536566)(label(\"\\\"bro\\\"\"))(mold((out \ + c270175c-8fb8-402a-9836-8ab7bd7149af)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 65acf282-5b10-4c18-9d05-ccc5b7a17286)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 4d39626a-14df-44e2-a033-a394a222095e)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bbba711a-f484-4101-9aaf-286054cc8f2e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9fcc45ca-c64f-45d4-9ff7-13acf6aaaf73)(label(Error))(mold((out \ + edd7fc69-dd7b-47db-a1e1-f11973db7a00)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3a369da7-a363-4900-b89f-35aacd302e90)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a361013a-f8c8-4887-9a10-26b954165ab2)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 04a787ed-35e9-498e-9557-d8c3bd6eafdc)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2a3a4f6b-dc4f-47a2-abcd-10af0387e047)(label(\"\\\"Not a \ + bcd0433d-3102-49ee-b628-d265aac1138c)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 8cb6eac9-4e2a-44ea-aa95-e39f67531832)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 9bd804ee-2b9a-432d-a097-988afb9b59c2)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children()))))))))(Tile((id \ + ce9cf06e-4146-455b-9bcf-d58798d189b1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ + 301ffd0d-3c10-4afd-8ea9-bf25fe71c1c9)(shape \ + Concave)))(Tile((id \ + affb46fa-aab9-4bfa-9c81-cc48a2b4db10)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4e753e38-3cda-49ae-8d2f-2bd72ed46121)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 18dcc81d-619c-4b42-af2e-4056040039d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bce6c1d2-113d-40e3-a191-b64c2935564d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6e8df04b-e852-4d0e-8f1d-fbc121575946)(label(test \ + 761fc46f-0804-4b4d-90f0-b086c3a76e72)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bbe28995-9f42-45e7-8043-58aee3af0d9b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1a1e5183-343b-40f6-a989-49ce75e55a96)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - edcaf4e5-eb6e-4180-8a6d-0cc69001dbc3)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + d015a34b-8478-4fdb-97f0-e50554cd44e8)(content(Whitespace\" \ \"))))(Tile((id \ - 27acf41b-ea89-4ff0-899c-8c3d9be0b3ba)(label(result_equal))(mold((out \ + 9faa6b55-ac48-4534-b1d3-cfa0152be78e)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d6debeb0-6fb3-4ab0-86cb-d4bb187c8c63)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 4030662c-5407-4ffc-9c27-e4b3e8d5ccfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0ab33bc9-c61e-474c-bd64-1a4650e90b3d)(label(eval))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - be5d6f5f-2e9e-4c55-82e7-0f2950749625)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 44072989-144d-45ea-9ab3-51bccee14678)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + ef556df3-2bca-466a-811e-25b911c70aaa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 96080ecb-74e5-4e8e-af68-63ee8aeef5c8)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 7b91818e-f335-4f73-b6c4-8c1c7fd0274f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ec85bf2-374e-4ad4-82c9-9394b268f779)(label(Lam))(mold((out \ + 01767806-64eb-4d9a-aadb-8ae55864f787)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b618b7e5-b03e-4014-b091-604e08e9eda0)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 192937aa-d047-4157-9c72-b4e8ba5b5fd5)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f856cd2d-583e-4b89-80e4-77bfe5bafa3b)(label(\"\\\"yo\\\"\"))(mold((out \ + 8b548288-530f-48ef-92fd-e0ad74daf482)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 62e293ef-5518-40f7-8782-404f25940817)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 2a080ccc-406b-481f-b122-67d18412f3f7)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 04647702-4dbf-4851-a845-ef76cea684a8)(content(Whitespace\" \ + 2bddedf8-84e9-40f1-8b5b-bc7dce1b83ed)(content(Whitespace\" \ \"))))(Tile((id \ - b75e01ef-ee6c-421c-8599-991fe24e1e13)(label(Var))(mold((out \ + 61ff61b0-9f58-4599-9deb-34232b93e8d9)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 002b0979-7e4e-4e55-964d-634f97797462)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 6f0bd9aa-a2c4-4db3-a0eb-87693dbbb0f7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7566c730-a883-4559-aafd-36ea07e85266)(label(\"\\\"yo\\\"\"))(mold((out \ + 28d7fbbd-8d0f-4a57-b18f-42c8444c74f7)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - 87489b74-6fea-4bb7-b188-cc0f293f1501)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + ce1d238e-4741-4f4d-bd3d-19965c15cda6)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5f9cb66a-3c69-44fc-98f9-8d33c2242e62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 305c178a-7da5-485c-9212-97518172660b)(label(Ok))(mold((out \ + b1d22a00-684a-4838-af8a-d9b365c97e41)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a6eba58d-9f49-496a-9c1b-6f83fbbaac4d)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b9c49a17-ddb8-4412-ab2d-e84a31674c1e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 98dd541e-c9fe-4fa4-be89-aafb0b7e1a01)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6d928f5a-76ba-432f-84c9-8985bdfbae21)(label(Lam))(mold((out \ + 0830c92a-0af7-46c9-924a-800686724ca6)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dd04ac7f-c000-46e2-9346-68de5ccb2c37)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 0a213faa-3104-4cba-9af2-7f7fcf852ee8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 09183f09-b197-4dab-9712-2ad6ec8053c1)(label(\"\\\"yo\\\"\"))(mold((out \ + ab883086-f48f-4037-927e-00d0345830ce)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2bac98eb-578c-4187-8d5d-0e428872fabe)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + b4a47b75-6412-4046-af36-ca4874288b8b)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2f510267-53e4-441f-8c4e-164a43cb1d76)(content(Whitespace\" \ + 7062d81b-2a80-4de8-9eeb-147f8d3344f7)(content(Whitespace\" \ \"))))(Tile((id \ - 9f53f3e1-50c4-41f6-9e69-d60a4bac4562)(label(Var))(mold((out \ + d4a21313-06f9-4ad3-a13e-81858ec73e41)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 37e690bc-a872-42fb-a204-ac507f930218)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + d486dc82-0a8e-472e-b697-9742883c0eca)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bfa62c97-6b4f-485c-91a5-f28b7d3429dc)(label(\"\\\"yo\\\"\"))(mold((out \ + 10d60f2e-37f7-4785-9554-6967360d6ac9)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - 4c3b2e45-d2b9-42a4-9096-00e583a9d66d)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 2fe2dd64-bbdc-483d-a33c-8607a5a74f99)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ + 62ea7b02-8d85-4e7e-b7b0-2ff1b8083b4b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ + 838edc3f-8fbe-45b0-b03c-4b743031ec06)(shape \ + Concave)))(Tile((id \ + 102f8aec-1598-441f-912b-f6cf46197364)(label(end))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3a6955e8-1fbb-4865-b383-f347e5857bb0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ad91ebe7-fd4d-4455-bd38-c279a70de5d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 461d55f6-6f2e-457a-b986-ba720f4d3dd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ab21e019-9c01-4fa7-a20b-de67b02612f4)(label(test \ + e08e0393-0645-42e1-af75-ab1a4530a02c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 41cc1c6f-2c09-4561-ad70-8d306db08237)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 25c83503-5f8a-45e3-a35c-bb85f2c941cf)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - fed3fa2c-11a4-4564-8eff-e7704b696268)(content(Whitespace\" \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + e6963dad-7c44-42c1-bdb5-bb196e2a4008)(content(Whitespace\" \ \"))))(Tile((id \ - 1fc38e53-5324-4b3b-8a05-04211a30616e)(label(result_equal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e63a04ff-39de-4da8-af96-438a294a9c92)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 22edf468-f96f-4297-bae1-f1db449a5712)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dd1f6a2a-39be-4937-9dca-ea18760871ce)(label(eval))(mold((out \ + 10f1bc9e-3a97-4f90-9f64-a729a73b53ed)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3ce8a7ac-fd0d-48ae-b434-59ee497324c1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + f761ab95-af19-4c2f-91b1-e8b1f96a9c14)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 6ffcf83b-3865-49f8-bd61-a2d13fc7ce8b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 487d3abf-e70f-4887-8046-f02cac6cb2bb)(label(eval \ + in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 96c0c1c9-7a57-4919-88b5-7b39fefd8c1a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 567af97e-40c4-4b66-b5c0-c7dde61131a2)(label(Ap))(mold((out \ + 84123832-a7a7-4c32-8f40-a77d568ab55a)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3a8e1695-9c19-4860-be5a-b2bf92046582)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + eb4e88f2-5041-4c17-8917-f853e35d6188)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5c422f00-d26f-46d5-92b4-849556a6cffd)(label(Lam))(mold((out \ + 0a3c11a9-aff8-48c7-91f2-d6c3e1d38df1)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2eeb6db0-38aa-4479-bcfe-197543180463)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 5e5213ca-a6fc-43bc-b78a-46f2e10eeb56)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84ff238e-dcf0-4449-b9b7-8d1ecd08d65c)(label(\"\\\"yo\\\"\"))(mold((out \ + e6eb80fa-d461-4248-a68f-7121cbae934b)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5eef209e-e9e3-46fd-a7d2-ee1d841fdfd1)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 60d8d65b-72c8-4c0a-95ac-6867f850b386)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 627c15eb-037b-461e-a999-b5c720c0c27b)(content(Whitespace\" \ + db6ea9f1-8bac-48b6-819e-b638e08e7e96)(content(Whitespace\" \ \"))))(Tile((id \ - e329ba5b-ff65-4a54-bd79-11119d2456b3)(label(Var))(mold((out \ + 77624c5d-b604-4801-9e75-c6efa2bd65d1)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e07b3d06-1fec-4d51-9424-4863f3d93d4d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 65e33466-598b-48bb-97a0-9c9465b777d1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f029b961-fcc9-4f8b-899a-0e7fa1cf11d1)(label(\"\\\"yo\\\"\"))(mold((out \ + 5d7bb14d-a762-4966-bd16-2a01c0a9fcde)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 729a33c6-6475-485d-a8ae-d48ac1c2bf6c)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + ea1e82c2-b0a8-424b-8c1d-6dd611b94628)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 87f21d69-952d-449f-84d7-1ee2ab05d40b)(content(Whitespace\" \ + 3ab5e08e-e6a1-4b77-8233-024be9b989e9)(content(Whitespace\" \ \"))))(Tile((id \ - 075b586b-fb78-4d80-8704-b63a67e7cd3b)(label(Lam))(mold((out \ + 32221315-8494-4287-8a8a-2d6d2de3c46e)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94246c4e-444f-4b3e-bf20-fd2a13fc27ef)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 51626a7c-6e12-4fe9-85ad-b70e3afc9f62)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 208a8991-100f-4cef-b433-eca8159ac882)(label(\"\\\"bro\\\"\"))(mold((out \ + f9fda7b8-36c2-48a1-a531-75959821dbbc)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 53653980-ea4f-40b8-9d29-d359d33fa7bf)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 22219302-bb2f-4638-b515-6abaf093bd0b)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ae6269c2-ff33-4f78-83c0-cdf02b2cdc28)(content(Whitespace\" \ + e536b6cf-ba43-4f96-bc89-a8c4d96de268)(content(Whitespace\" \ \"))))(Tile((id \ - 5d26a17d-feb7-4d81-b23c-d80ae50d9dd6)(label(Var))(mold((out \ + a95cf59d-83bb-4fea-83c0-f4aad013ffda)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 71b62601-4be1-4205-8377-9ea8c5bd26c5)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + bcf33ffe-03fe-4654-a35e-1a503dab2339)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ed958ead-78f6-4f5a-bd6c-94d57f8393f7)(label(\"\\\"bro\\\"\"))(mold((out \ + 559e3d55-2efc-4cc4-955d-379ef9f7249a)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 15383e63-cf89-4209-a0bf-6c3d86d862d6)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 3a480eec-68f7-4a27-86f9-7c75295cda21)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd335c92-161b-4e37-988d-acfd90066a8e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0a5045cb-aada-489d-ab45-dbacd4fe44ed)(label(Ok))(mold((out \ + eb279abe-a7a6-4090-8eff-6b1d920eee89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1744cba3-21c2-4614-83a4-265a9cd38966)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - aa0170f4-3445-4a3c-bfd6-9dd4bc5349ff)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 38582671-6318-4aeb-98b2-f059df8f17b9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d68e6fef-70ce-4b20-b210-e41015a4027a)(label(Lam))(mold((out \ + 120e0db4-f3c8-4459-9c36-da9feb92f833)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cda0a2c8-1d02-4e25-ba06-7fb9900cab81)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + ae71201f-8af4-41a7-8018-df01c3fed607)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 36f04861-35cc-4eb9-83d0-01085dcf7656)(label(\"\\\"bro\\\"\"))(mold((out \ + ff427ec3-b6e6-4a94-bab3-4dc20dce41b5)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e502a97c-aa0c-4e34-a1c9-9d86454fe1c5)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 14))(sort \ - Exp))((shape(Concave 14))(sort \ + 746e5359-6dd5-4bcc-8a02-fd4e148ff718)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 62eb476d-c91c-4c67-bd46-be123833cbdf)(content(Whitespace\" \ + f44183a9-3965-4cb7-9365-4ad8609e30ea)(content(Whitespace\" \ \"))))(Tile((id \ - 1ff88e88-1e7c-4117-8cfa-6431b1c60b5e)(label(Var))(mold((out \ + f3567477-6c77-45b1-9d18-1ec90f8f4038)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4e3e4ddd-946c-4afa-ad49-4dc4096d8f9d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 1))(sort Exp))((shape \ + 89817bb1-bfed-4c35-90ad-86abf6188045)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e9180871-be73-4a92-a949-010ae5b1a3f8)(label(\"\\\"bro\\\"\"))(mold((out \ + c33649bc-83a0-4d4e-918a-6f7f1b32ca5e)(label(\"\\\"bro\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ + b88aa814-3348-4d9a-bb7b-87b83a5b89d7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ + 22a799fd-4697-4309-8926-6f1c9767e7e0)(shape \ + Concave)))(Tile((id \ + 72a61fe2-a2ef-4e93-93f8-99f84c85d3cb)(label(end))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - 88a4c943-608e-454a-94ad-7dcc08046493)(content(Whitespace\" \ - \"))))))))))))(ancestors())))(caret Outer))"; + Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Outer)(projectors()))"; backup_text = "# Lambda Calculus via evaluation by substitution #\n\n\ # An Expression is a variable, function, or application #\n\ @@ -14134,9 +14538,9 @@ let startup : PersistentData.t = let exp_equal: (Exp, Exp) -> Bool =\n\ fun es ->\n\ case es\n\ - | Var(x), Var(y) => x $== y\n\ + | Var(x), Var(y) => x$== y\n\ | Lam(x1, e1), Lam(x2, e2) =>\n\ - \ x1 $== x2 && exp_equal(e1, e2)\n\ + \ x1$== x2 && exp_equal(e1, e2)\n\ | Ap(e1, e2), Ap(e3, e4) =>\n\ \ exp_equal(e1, e3) && exp_equal(e2, e4)\n\ | _ => false end in\n\n\ @@ -14145,7 +14549,7 @@ let startup : PersistentData.t = fun v, name, e ->\n\ case e\n\ | Var(n) =>\n\ - \ (if n $== name then v else e)\n\ + \ (if n$== name then v else e)\n\ | Lam(x, body) =>\n\ \ Lam(x, subst(v,name, body))\n\ | Ap(e1,e2) =>\n\ @@ -14153,16 +14557,16 @@ let startup : PersistentData.t = # Evaluation can result in either an Exp or an Error #\n\ type Result =\n\ + Error(String)\n\ - + Ok(Exp) \n\ + + Ok(Exp) \n\ in\n\n\ let result_equal: (Result, Result) -> Bool =\n\ fun rs ->\n\ case rs\n\ | Ok(e1), Ok(e2) => exp_equal(e1, e2)\n\ - | Error(e1), Error(e2) => e1 $== e2\n\ + | Error(e1), Error(e2) => e1$== e2\n\ | _ => false end in\n\n\ # Evaluation by substitution #\n\ - let eval: Exp -> Result =\n\ + let eval : Exp -> Result =\n\ fun e ->\n\ case e\n\ | Var(n) => Error(\"Free Variable\")\n\ @@ -14191,91 +14595,111 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - 73cb2f1d-94b4-42eb-9d77-a832748556b0)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + baa84041-2788-479a-abe3-5cc7ce38f534)(content(Whitespace\" \ + \")))))((Grout((id \ + 5d8d9885-fe4f-408b-93da-f765343a60ae)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Composing Arithmetic Expressions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - 41444a61-1cf6-408b-82c6-464f3ca6750e)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + b2032d38-e001-4f4c-8ad6-8d1d9db9b25e)(content(Whitespace\" \ + \")))))((Grout((id \ + f0c03c06-864c-4f9a-8247-0ae3e4d3d21b)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Computing Equationally", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - c7e3b9bd-efaa-41f2-800d-9986a6e814d6)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + ea22b7c5-89df-45b0-8aa8-040e5aa77dad)(content(Whitespace\" \ + \")))))((Grout((id \ + e4387022-ae32-4ab5-be7a-9dc95557b431)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Variables", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - 92e68905-30cc-415b-b920-6323180c56d1)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 8da71806-cb3e-4e4b-b4b6-281848dd93a5)(content(Whitespace\" \ + \")))))((Grout((id \ + 96e5093a-496d-4ef8-b59d-03f1945f77f7)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Compositionality", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - 661cbe22-ffdc-4fa3-b227-f7b56a1c8ed6)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 31ba0770-e603-4dca-b190-198ca98028b2)(content(Whitespace\" \ + \")))))((Grout((id \ + e45206da-d7ff-4a80-bc10-6604b689b0af)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Scope", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - f213697c-e203-41c4-8888-fc12e3ac46bf)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 5b636cbc-58a9-4a65-a8b8-cf8817807c7f)(content(Whitespace\" \ + \")))))((Grout((id \ + 664d665f-e868-42eb-b505-aaab48bc519b)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Shadowing", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - 3d8e1707-1e20-4160-946e-73cdb9e98ee1)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 60079790-fb8e-4b20-a7e4-8af54a01667f)(content(Whitespace\" \ + \")))))((Grout((id \ + 14e465fe-ef0a-4f55-baba-3b378a08c00d)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Booleans and Types", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - f49430b2-1265-4e87-a6d6-795eb57c37f8)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 4887e553-d2fb-46c7-b710-0d4ee1dae869)(content(Whitespace\" \ + \")))))((Grout((id \ + 4a2fd66b-79e3-4706-a15c-ec1c68f3cfd0)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Conditional Expressions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - e2b7d6b9-5b95-4fad-9278-60097f30375f)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + f4bc4d20-0c27-49cc-bf93-8fb6be86ba05)(content(Whitespace\" \ + \")))))((Grout((id \ + a08352ba-c945-4491-8b57-0796dd316233)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ( "Functions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(()((Grout((id \ - b60e7d0e-e290-4b23-b03c-7fe121fb5dcd)(shape \ - Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + Normal)))(backpack())(relatives((siblings(((Secondary((id \ + 5e372e72-033f-41ec-8c1d-5eb1e078c7a1)(content(Whitespace\" \ + \")))))((Grout((id \ + 5f36a877-e0bd-47cf-a439-41ca8bef21d6)(shape \ + Convex))))))(ancestors())))(caret Outer)(projectors()))"; + backup_text = " "; } ); ], [ diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 18037a2e00..e9f3e3a9f4 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -267,6 +267,7 @@ let should_scroll_to_caret = | TAB => true | PerformAction(a) => switch (a) { + | Project(_) | Move(_) | MoveToNextHole(_) | Jump(_) diff --git a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml index ab0a0b5ee7..92a87c7b16 100644 --- a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml +++ b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml @@ -12,6 +12,7 @@ let exercise : Exercise.spec = { test_validation = 1; mutation_testing = 1; impl_grading = 2 }; prelude = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -258,6 +259,7 @@ let exercise : Exercise.spec = }; correct_impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -800,6 +802,7 @@ let exercise : Exercise.spec = { tests = { + projectors = Projector.Map.empty; selection = { focus = Right; content = []; mode = Normal }; backpack = []; relatives = @@ -1054,6 +1057,7 @@ let exercise : Exercise.spec = }; your_impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1238,6 +1242,7 @@ let exercise : Exercise.spec = { impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1444,6 +1449,7 @@ let exercise : Exercise.spec = { impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1650,6 +1656,7 @@ let exercise : Exercise.spec = { impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -2449,6 +2456,7 @@ let exercise : Exercise.spec = { tests = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml index 1e95c4719d..de12e0ccd9 100644 --- a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml +++ b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml @@ -20,9 +20,11 @@ let exercise : Exercise.spec = ancestors = []; }; caret = Outer; + projectors = Projector.Map.empty; }; correct_impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -479,6 +481,7 @@ let exercise : Exercise.spec = { tests = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -493,6 +496,7 @@ let exercise : Exercise.spec = }; your_impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -680,6 +684,7 @@ let exercise : Exercise.spec = { impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1402,6 +1407,7 @@ let exercise : Exercise.spec = { impl = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1985,6 +1991,7 @@ let exercise : Exercise.spec = { tests = { + projectors = Projector.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/explainthis/Example.re b/src/haz3lweb/explainthis/Example.re index b1b84c7906..dc4fb31597 100644 --- a/src/haz3lweb/explainthis/Example.re +++ b/src/haz3lweb/explainthis/Example.re @@ -58,6 +58,7 @@ let zipper: Zipper.t = { ancestors, }, caret: Outer, + projectors: Projector.Map.empty, }; // TODO Make sure using this for all the forms that should, like wild and nil diff --git a/src/haz3lweb/view/BackpackView.re b/src/haz3lweb/view/BackpackView.re index b2f9424986..6fd5a4ed2a 100644 --- a/src/haz3lweb/view/BackpackView.re +++ b/src/haz3lweb/view/BackpackView.re @@ -32,7 +32,8 @@ let backpack_sel_view = ), ]), // zwsp necessary for containing box to stretch to contain trailing newline - Text.of_segment([], true, Any, content) @ [text(Unicode.zwsp)], + Text.of_segment(Projector.Map.empty, [], true, Any, content) + @ [text(Unicode.zwsp)], ); }; diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index a68fbbe6a8..bfa19e82f7 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -67,7 +67,14 @@ module Text = (M: { }) => { let m = p => Measured.find_p(p, M.map); let rec of_segment = - (buffer_ids, no_sorts, sort, seg: Segment.t): list(Node.t) => { + ( + projectors: Projector.Map.t, + buffer_ids, + no_sorts, + sort, + seg: Segment.t, + ) + : list(Node.t) => { /* note: no_sorts flag is used for backpack view; otherwise Segment.expected_sorts call crashes for some reason */ let expected_sorts = @@ -82,19 +89,22 @@ module Text = (M: { seg |> List.mapi((i, p) => (i, p)) |> List.concat_map(((i, p)) => - of_piece(buffer_ids, sort_of_p_idx(i), p) + of_piece(projectors, buffer_ids, sort_of_p_idx(i), p) ); } and of_piece = - (buffer_ids, expected_sort: Sort.t, p: Piece.t): list(Node.t) => { + (projectors, buffer_ids, expected_sort: Sort.t, p: Piece.t) + : list(Node.t) => { switch (p) { - | Tile(t) => of_tile(buffer_ids, expected_sort, t) + | Tile(t) => of_tile(projectors, buffer_ids, expected_sort, t) | Grout(_) => of_grout | Secondary({content, _}) => of_secondary((content, M.settings.secondary_icons, m(p).last.col)) }; } - and of_tile = (buffer_ids, expected_sort: Sort.t, t: Tile.t): list(Node.t) => { + and of_tile = + (projectors, buffer_ids, expected_sort: Sort.t, t: Tile.t) + : list(Node.t) => { let children_and_sorts = List.mapi( (i, (l, child, r)) => @@ -106,7 +116,7 @@ module Text = (M: { let is_in_buffer = List.mem(t.id, buffer_ids); Aba.mk(t.shards, children_and_sorts) |> Aba.join(of_delim(is_in_buffer, is_consistent, t), ((seg, sort)) => - of_segment(buffer_ids, false, sort, seg) + of_segment(projectors, buffer_ids, false, sort, seg) ) |> List.concat; }; @@ -141,7 +151,10 @@ let simple_view = div( ~attr=Attr.class_("code"), [ - span_c("code-text", Text.of_segment([], false, Sort.Any, unselected)), + span_c( + "code-text", + Text.of_segment(Projector.Map.empty, [], false, Sort.Any, unselected), + ), ...holes, ], ); @@ -162,7 +175,14 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - {state: {meta: {measured, buffer_ids, unselected, holes, _}, _}, _}: Editor.t, + { + state: { + meta: {measured, buffer_ids, unselected, holes, _}, + zipper, + _, + }, + _, + }: Editor.t, ) : Node.t => { module Text = @@ -170,7 +190,8 @@ let view = let map = measured; let settings = settings; }); - let code = Text.of_segment(buffer_ids, false, sort, unselected); + let code = + Text.of_segment(zipper.projectors, buffer_ids, false, sort, unselected); let holes = List.map(of_hole(~measured, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; From 597c983138192c43f9c3ec5336738569e6145345 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 19 Feb 2024 14:39:27 -0500 Subject: [PATCH 002/168] projector notes --- src/haz3lcore/zipper/Projector.re | 86 +++++++++++++++++++++++++++++++ src/haz3lweb/util/JsUtil.re | 64 +++++++++++++++-------- 2 files changed, 129 insertions(+), 21 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 568eac5141..1e5a1c606b 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -19,3 +19,89 @@ module Map = { }; type t = p; + + +/* +projector map has ids of projectors +can use infomap to get ancestors of projectors + +projector map has projector type +but for each projector we also need: + - it's extent (to use for measured) + - clarification: 'range of projector': extent in base syntax + - vs 'domain of projector': extent in view (eg collapsed entirely for fold) + - it's view function (to use for view) + - it's action function (to use for action dispatch + +measured side: +recurse into segment, accumulating ancestor list +i guess this alternatingly comes from enclosing tiles and segment skels +i guess inside a segment, we recurse into the skel, tracking going through ancestors +from the ancestor list until we hit a tile +whose id is the target id +then we subsistute in a token consisting only of spaces/linebreaks which +takes up the space of the projector (which i guess should be a starting +and ending offset in the frame of the parent editor) + + +view side: +recurse into segment, accumulating ancestor list +i guess this alternatingly comes from enclosing tiles and segment skels +i guess inside a segment, we recurse into the skel, tracking going through ancestors +from the ancestor list until we hit a tile +whose id is the target id + +maybe to make things easier: +if for each projector we know its parent segment +and know what range of the segment 0 <= start < end < length(seg) corresponds to the projector + +ok, new plan: +in view_of_segment, we recurse the skel looking for projectors. the first (topmost) one we find, +we find it's range in the segment, and create new segment to render, consisting of the segment +vefore the projector subrange, a placeholder for the projector subrange, and the segment after +the projector subrange. we don't handle any drawing for the projector; that goes through Deco + +for first pass we dont need full recursion, so can just have a deco type that is subeditors +for first pass subeditor will just be stub views, so they can be treated as inline/tokens +(for higher phases will want to be able to insert full editors, so will likely need editors +to have programable starting col, so that we can draw them as if they were just a subsegment +of the parent editor) + + +action side: + +for opaque projectors, we will prohibit movement into them, +and make forming them eject the cursor. as long as we +ensure the cursor cant move into one, we can dont +need to worry about whether we're inside one for action permissions + +so for basic movement actions, we make moving left into an +opaque leaf projector jump to its right, and vice versa + +(phase 1.5 we allow a single cursor state on the projector itself) + +actions: movement + - phase 1.0: move past subview + - phase 1.5: move onto subview + - phase 2: move into subview + +for phase 1.5, we probably need to extend caret position to +model the cursor being on the projector itself. being in this +state will dispatch keyboard input to the projector's handler + +old: + type t = + | Outer + | Inner(int, int); + +new: + type inner = + | Token(int, int) + | SubCell(Id.t); + type t = + | Outer + | Inner(inner); + + + +*/ \ No newline at end of file diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index d9a7efc7fc..acd2b609e1 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -3,13 +3,11 @@ open Virtual_dom.Vdom; let get_elem_by_id = id => { let doc = Dom_html.document; - Js.Opt.get( - doc##getElementById(Js.string(id)), - () => { - print_endline(id); - assert(false); - }, - ); + Js.Opt.get(doc##getElementById(Js.string(id)), () => { + assert + (false) + //print_endline(id); + }); }; let date_now = () => { @@ -123,21 +121,18 @@ let copy = (str: string) => { ); }; -let scroll_cursor_into_view_if_needed = () => - try({ - let caret_elem = get_elem_by_id("caret"); - let main = get_elem_by_id("main"); - let main_rect = main##getBoundingClientRect; - let caret_rect = caret_elem##getBoundingClientRect; - - if (caret_rect##.top < main_rect##.top) { - caret_elem##scrollIntoView(Js._true); - } else if (caret_rect##.bottom > main_rect##.bottom) { - caret_elem##scrollIntoView(Js._false); - }; - }) { - | Assert_failure(_) => () +let scroll_cursor_into_view_if_needed = () => { + let caret_elem = get_elem_by_id("caret"); + let main = get_elem_by_id("main"); + let main_rect = main##getBoundingClientRect; + let caret_rect = caret_elem##getBoundingClientRect; + + if (caret_rect##.top < main_rect##.top) { + caret_elem##scrollIntoView(Js._true); + } else if (caret_rect##.bottom > main_rect##.bottom) { + caret_elem##scrollIntoView(Js._false); }; +}; module Fragment = { let set_current = frag => { @@ -160,3 +155,30 @@ module Fragment = { Url.Current.get() |> Option.map(fragment_of_url); }; }; + +let contains = + (rt: Js.t(Dom_html.element), ct: Js.t(Dom_html.element)): bool => + try( + Js_of_ocaml.Js.Unsafe.meth_call( + ct, + "contains", + [|Js_of_ocaml.Js.Unsafe.coerce(rt)|], + ) + |> Js_of_ocaml.Js.to_bool + ) { + | _ => false + }; + +let is_refocus_on_child = + (evt: Js_of_ocaml.Js.t(Js_of_ocaml.Dom_html.focusEvent)): bool => + try( + contains( + Js.Opt.get( + Js.Optdef.get(evt##.relatedTarget, () => failwith("lol")), () => + failwith("lol") + ), + Js_of_ocaml.Js.Opt.get(evt##.currentTarget, () => failwith("lol")), + ) + ) { + | _ => false + }; From b8ecc4d20cc831f9626e5fc0c491d16d419ea5e0 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 00:25:10 -0500 Subject: [PATCH 003/168] leaf projectors view kind of working... broken caret somehow. temporarily disabled scroll to caret --- src/haz3lcore/Measured.re | 10 +- src/haz3lcore/zipper/Editor.re | 27 ++- src/haz3lcore/zipper/Projector.re | 305 ++++++++++++++++++------- src/haz3lcore/zipper/Zipper.re | 10 + src/haz3lcore/zipper/action/Action.re | 3 +- src/haz3lcore/zipper/action/Perform.re | 21 +- src/haz3lweb/Keyboard.re | 1 + src/haz3lweb/Main.re | 4 +- src/haz3lweb/UpdateAction.re | 2 +- src/haz3lweb/view/Cell.re | 7 +- src/haz3lweb/view/Code.re | 20 +- src/haz3lweb/view/CursorInspector.re | 17 +- src/haz3lweb/view/Deco.re | 1 + src/haz3lweb/view/Icons.re | 9 + src/haz3lweb/view/Page.re | 3 +- 15 files changed, 323 insertions(+), 117 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 747f88e204..e7d84e7928 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -269,8 +269,16 @@ let is_indented_map = (seg: Segment.t) => { go(seg); }; -let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { +let of_segment = + ( + ~projectors=Projector.Map.empty, + ~old: t=empty, + ~touched=Touched.empty, + seg: Segment.t, + ) + : t => { let is_indented = is_indented_map(seg); + let seg = Projector.project_seg(projectors, seg); // recursive across seg's bidelimited containers let rec go_nested = diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 1ee7c9fd3b..b7d5f85e2e 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -19,13 +19,20 @@ module Meta = { let init = (z: Zipper.t) => { let unselected = Zipper.unselect_and_zip(z); let (view_term, terms) = MakeTerm.go(unselected); + let term_ranges = TermRanges.mk(unselected); + let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); + print_endline("AAAAA"); + let unselected = Projector.of_segment(projectors, unselected); + let term_ranges = TermRanges.mk(unselected); + let measured = Measured.of_segment(unselected); + print_endline("BBBBB"); { col_target: 0, touched: Touched.empty, - measured: Measured.of_segment(unselected), + measured, unselected, - term_ranges: TermRanges.mk(unselected), - segment: Zipper.zip(z), + term_ranges, + segment: Projector.of_segment(projectors, Zipper.zip(z)), tiles: TileMap.mk(unselected), view_term, terms, @@ -57,10 +64,12 @@ module Meta = { let next = (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { - let {touched, measured, col_target, _} = meta; + let {touched, measured, col_target, term_ranges, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); let unselected = is_edit ? Zipper.unselect_and_zip(z) : meta.unselected; + let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); + let unselected = Projector.of_segment(projectors, unselected); let measured = is_edit ? Measured.of_segment(~touched, ~old=measured, unselected) : measured; @@ -78,7 +87,7 @@ module Meta = { measured, unselected, term_ranges: is_edit ? TermRanges.mk(unselected) : meta.term_ranges, - segment: Zipper.zip(z), + segment: Projector.of_segment(projectors, Zipper.zip(z)), tiles: is_edit ? TileMap.mk(unselected) : meta.tiles, view_term, terms, @@ -201,3 +210,11 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; }; }; + +let get_projectors = (ed: t) => ed.state.zipper.projectors; + +let get_projector = (id: Id.t, ed: t) => + Projector.Map.find(id, ed.state.zipper.projectors); + +let add_projector = (id: Id.t, p: Projector.t, ed: t) => + update_z(_ => Zipper.add_projector(id, p, ed.state.zipper), ed); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 1e5a1c606b..d42fb1291c 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,8 +1,15 @@ +open Util; + [@deriving (show({with_path: false}), sexp, yojson)] type p = | Normal | Fold; +let to_string: p => string = + fun + | Normal => "" + | Fold => "F"; + let toggle_fold: p => p = fun | Normal => Fold @@ -15,93 +22,225 @@ module Map = { type t = Id.Map.t(p); let empty = empty; let add = add; + let remove = remove; let find = find_opt; + let update = update; + let to_list = x => x |> List.to_seq |> Id.Map.of_seq; + //let mapi = mapi; + let fold = fold; + let cardinal = cardinal; }; type t = p; +type proj = Map.t; +type proj_ty = t; + +type nu_proj_info = { + proj_id: Id.t, //projector id + t, + start_id: Id.t, //first piece id + last_id: Id.t //last piece id +}; +/* map indexed by start_id instead of proj_id */ +type nu_proj_map = Id.Map.t(nu_proj_info); + +let split_seg = + (seg: Segment.t, ps: nu_proj_map) + : option((Segment.t, Segment.t, Segment.t, Id.t, proj_ty)) => { + let res = + List.find_map((p: Piece.t) => Id.Map.find_opt(Piece.id(p), ps), seg); + switch (res) { + | None => None + | Some(pr) => + let (pre, rest) = + ListUtil.take_while( + (p: Piece.t) => + switch (Id.Map.find_opt(Piece.id(p), ps)) { + | Some(_) => false + | None => true + }, + seg, + ); + let (mid, suf) = + rest + |> List.rev + |> ListUtil.take_while((p: Piece.t) => Piece.id(p) != pr.last_id); + Some((pre, suf |> List.rev, mid |> List.rev, pr.proj_id, pr.t)); + }; +}; + +let guy_of = (id, t, (start, last)) => { + proj_id: id, + t, + start_id: Piece.id(start), + last_id: Piece.id(last), +}; + +let proj_info = (term_ranges, id: Id.t, t: proj_ty, acc: nu_proj_map) => { + print_endline("proj_info for id: " ++ Id.to_string(id)); + switch (Id.Map.find_opt(id, term_ranges)) { + | Some(range) => + print_endline("proj_info: found term range for projector"); + let guy = guy_of(id, t, range); + Id.Map.add(guy.start_id, guy, acc); + | _ => + print_endline("ERROR: mk_nu_proj_map: no term range for projector"); + acc; + }; +}; + +let mk_nu_proj_map = + (projectors: Map.t, term_ranges: TermRanges.t): nu_proj_map => + Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); + +let project_mid = (id, p: proj_ty, mid): Segment.t => + //TODO(andrew): prrobably shouldn't just duplicate this id in the general case + switch (p) { + | Fold => [Grout({id, shape: Convex})] + | Normal => mid + }; + +let project_seg = (p: nu_proj_map, seg: Segment.t): Segment.t => { + /* needed input: a map/assoc list of projector first piece ids to projector (and last piece id) (don't even need id here maybe?) */ + /* find first idx in seg where is matches a projector range */ + /* check other side of range exists */ + /* split segment three ways. prefix and suffix left alone */ + /* dispatch on projector type */ + /* Fold will turn middle of suffix into singleton padding token */ + /* stitch seg back together */ + print_endline("project_seg"); + switch (split_seg(seg, p)) { + | Some((pre, mid_og, suf, proj_id, p)) => + print_endline( + "split: segment length: " + ++ string_of_int(List.length(seg)) + ++ " as divided into: " + ++ string_of_int(List.length(pre)) + ++ " " + ++ string_of_int(List.length(mid_og)) + ++ " " + ++ string_of_int(List.length(suf)), + ); + pre @ project_mid(proj_id, p, mid_og) @ suf; + | None => + print_endline("no split"); + seg; + }; +}; + +let rec of_segment = (projectors, seg: Segment.t): Segment.t => { + seg |> project_seg(projectors) |> List.map(of_piece(projectors)); +} +and of_piece = (projectors, p: Piece.t): Piece.t => { + switch (p) { + | Tile(t) => Tile(of_tile(projectors, t)) + | Grout(_) => p + | Secondary(_) => p + }; +} +and of_tile = (projectors, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(projectors), t.children)}; +}; /* -projector map has ids of projectors -can use infomap to get ancestors of projectors - -projector map has projector type -but for each projector we also need: - - it's extent (to use for measured) - - clarification: 'range of projector': extent in base syntax - - vs 'domain of projector': extent in view (eg collapsed entirely for fold) - - it's view function (to use for view) - - it's action function (to use for action dispatch - -measured side: -recurse into segment, accumulating ancestor list -i guess this alternatingly comes from enclosing tiles and segment skels -i guess inside a segment, we recurse into the skel, tracking going through ancestors -from the ancestor list until we hit a tile -whose id is the target id -then we subsistute in a token consisting only of spaces/linebreaks which -takes up the space of the projector (which i guess should be a starting -and ending offset in the frame of the parent editor) - - -view side: -recurse into segment, accumulating ancestor list -i guess this alternatingly comes from enclosing tiles and segment skels -i guess inside a segment, we recurse into the skel, tracking going through ancestors -from the ancestor list until we hit a tile -whose id is the target id - -maybe to make things easier: -if for each projector we know its parent segment -and know what range of the segment 0 <= start < end < length(seg) corresponds to the projector - -ok, new plan: -in view_of_segment, we recurse the skel looking for projectors. the first (topmost) one we find, -we find it's range in the segment, and create new segment to render, consisting of the segment -vefore the projector subrange, a placeholder for the projector subrange, and the segment after -the projector subrange. we don't handle any drawing for the projector; that goes through Deco - -for first pass we dont need full recursion, so can just have a deco type that is subeditors -for first pass subeditor will just be stub views, so they can be treated as inline/tokens -(for higher phases will want to be able to insert full editors, so will likely need editors -to have programable starting col, so that we can draw them as if they were just a subsegment -of the parent editor) - - -action side: - -for opaque projectors, we will prohibit movement into them, -and make forming them eject the cursor. as long as we -ensure the cursor cant move into one, we can dont -need to worry about whether we're inside one for action permissions - -so for basic movement actions, we make moving left into an -opaque leaf projector jump to its right, and vice versa - -(phase 1.5 we allow a single cursor state on the projector itself) - -actions: movement - - phase 1.0: move past subview - - phase 1.5: move onto subview - - phase 2: move into subview - -for phase 1.5, we probably need to extend caret position to -model the cursor being on the projector itself. being in this -state will dispatch keyboard input to the projector's handler - -old: - type t = - | Outer - | Inner(int, int); - -new: - type inner = - | Token(int, int) - | SubCell(Id.t); - type t = - | Outer - | Inner(inner); - - - -*/ \ No newline at end of file + projector map has ids of projectors + can use infomap to get ancestors of projectors + + projector map has projector type + but for each projector we also need: + - it's extent (to use for measured) + - clarification: 'range of projector': extent in base syntax + - vs 'domain of projector': extent in view (eg collapsed entirely for fold) + - it's view function (to use for view) + - it's action function (to use for action dispatch + we might want to pre-derive: + - parent segment + - the range of the projector in the segment + + measured side: + recurse into segment, accumulating ancestor list + i guess this alternatingly comes from enclosing tiles and segment skels + i guess inside a segment, we recurse into the skel, tracking going through ancestors + from the ancestor list until we hit a tile + whose id is the target id + then we subsistute in a token consisting only of spaces/linebreaks which + takes up the space of the projector (which i guess should be a starting + and ending offset in the frame of the parent editor) + + + view side: + recurse into segment, accumulating ancestor list + i guess this alternatingly comes from enclosing tiles and segment skels + i guess inside a segment, we recurse into the skel, tracking going through ancestors + from the ancestor list until we hit a tile + whose id is the target id + + maybe to make things easier: + if for each projector we know its parent segment + and know what range of the segment 0 <= start < end < length(seg) corresponds to the projector + + ok, new plan: + in view_of_segment, we recurse the skel looking for projectors. the first (topmost) one we find, + we find it's range in the segment, and create new segment to render, consisting of the segment + vefore the projector subrange, a placeholder for the projector subrange, and the segment after + the projector subrange. we don't handle any drawing for the projector; that goes through Deco + + for first pass we dont need full recursion, so can just have a deco type that is subeditors + for first pass subeditor will just be stub views, so they can be treated as inline/tokens + (for higher phases will want to be able to insert full editors, so will likely need editors + to have programable starting col, so that we can draw them as if they were just a subsegment + of the parent editor) + + + action side: + + for opaque projectors, we will prohibit movement into them, + and make forming them eject the cursor. as long as we + ensure the cursor cant move into one, we can dont + need to worry about whether we're inside one for action permissions + + so for basic movement actions, we make moving left into an + opaque leaf projector jump to its right, and vice versa + + (phase 1.5 we allow a single cursor state on the projector itself) + + actions: movement + - phase 1.0: move past subview + - phase 1.5: move onto subview + - phase 2: move into subview + + for phase 1.5, we probably need to extend caret position to + model the cursor being on the projector itself. being in this + state will dispatch keyboard input to the projector's handler + + old: + type t = + | Outer + | Inner(int, int); + + v2: + type inner = + | Token(int, int) + | SubCell(Id.t); + type t = + | Outer + | Inner(inner); + + v3: + type base = + | Outer + | Inner(int, int); + type t = + | Base(base) + | SubCell(Id.t, t); // supports nested subcells + + + + primary movement needs to check if the piece we're trying to move into starts/ends + a subcell. if so, we (phase i) skip over it or (phase ii) move into it, ie set caret + position to Subcell(Id.t,og_caret_pos) + + + + */ diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index de60e2780b..a745efeba2 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -30,6 +30,16 @@ type t = { projectors: Projector.Map.t, }; +let get_projectors = (z: t): Projector.Map.t => z.projectors; + +let get_projector = (id: Id.t, z: t): option(Projector.t) => + Projector.Map.find(id, z.projectors); + +let add_projector = (id: Id.t, p: Projector.t, z: t): t => { + ...z, + projectors: Projector.Map.add(id, p, z.projectors), +}; + let init: unit => t = () => { selection: Selection.mk([]), diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index fd28daa28d..539d407c4d 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,7 +45,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | ToggleFold(Id.t); + | ToggleFold; [@deriving (show({with_path: false}), sexp, yojson)] type t = @@ -79,6 +79,7 @@ module Result = { let is_edit: t => bool = fun + | Project(_) //TODO(andrew) | Insert(_) | Destruct(_) | Pick_up diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 7ab09bdcfa..177f0e12f4 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -21,15 +21,22 @@ let is_write_action = (a: Action.t) => { module Project = { let go = (p: Action.project, z: t) => switch (p) { - | ToggleFold(id) => - switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => { - ...z, - projectors: - Projector.Map.add(id, Projector.toggle_fold(p), z.projectors), + | ToggleFold => + print_endline("Project.go: ToggleFold"); + switch (Indicated.index(z)) { + | Some(id) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(_p) => { + ...z, + projectors: Projector.Map.remove(id, z.projectors), + } + | None => { + ...z, + projectors: Projector.Map.add(id, Projector.Fold, z.projectors), + } } | None => z - } + }; }; }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index bad937c531..13b43a64c9 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -73,6 +73,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: Mac, shift: Up, meta: Down, ctrl: Up, alt: Up} => switch (key) { + | "e" => Some(PerformAction(Project(ToggleFold))) | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index e1268431af..e34c1a9ed3 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -123,8 +123,8 @@ module App = { schedule_action(Update.Save); }; if (scroll_to_caret.contents) { - scroll_to_caret := false; - JsUtil.scroll_cursor_into_view_if_needed(); + scroll_to_caret := false; //TODO(andrew): re-enable + //JsUtil.scroll_cursor_into_view_if_needed(); }; }, ); diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index e9f3e3a9f4..da39387f33 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -267,7 +267,6 @@ let should_scroll_to_caret = | TAB => true | PerformAction(a) => switch (a) { - | Project(_) | Move(_) | MoveToNextHole(_) | Jump(_) @@ -278,6 +277,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) => true + | Project(_) //TODO(andrew) | Unselect(_) | Select(All) => false } diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 818e69837b..2ca9e49c4c 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -115,14 +115,13 @@ let deco = ( ~font_metrics, ~show_backpack_targets, - ~selected, + ~selected as _, ~error_ids, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), { state: { - zipper, - meta: {term_ranges, segment, measured, terms, tiles, _}, + meta: {term_ranges, segment: _, measured, terms, tiles, _}, _, }, _, @@ -138,7 +137,7 @@ let deco = let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; }); - let decos = selected ? Deco.all(zipper, segment) : Deco.err_holes(zipper); + let decos = []; //selected ? Deco.all(zipper, segment) : Deco.err_holes(zipper); let decos = switch (test_results) { | None => decos diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index bfa19e82f7..7bdd6116e6 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -67,14 +67,9 @@ module Text = (M: { }) => { let m = p => Measured.find_p(p, M.map); let rec of_segment = - ( - projectors: Projector.Map.t, - buffer_ids, - no_sorts, - sort, - seg: Segment.t, - ) + (projectors, buffer_ids, no_sorts, sort, seg: Segment.t) : list(Node.t) => { + let seg = Projector.project_seg(projectors, seg); /* note: no_sorts flag is used for backpack view; otherwise Segment.expected_sorts call crashes for some reason */ let expected_sorts = @@ -177,7 +172,7 @@ let view = ~settings: Settings.t, { state: { - meta: {measured, buffer_ids, unselected, holes, _}, + meta: {measured, buffer_ids, unselected, holes, term_ranges, _}, zipper, _, }, @@ -190,8 +185,13 @@ let view = let map = measured; let settings = settings; }); - let code = - Text.of_segment(zipper.projectors, buffer_ids, false, sort, unselected); + //TODO(andrew): cleanup + print_endline( + "Code: projectors size:" + ++ string_of_int(Projector.Map.cardinal(zipper.projectors)), + ); + let projectors = Projector.mk_nu_proj_map(zipper.projectors, term_ranges); + let code = Text.of_segment(projectors, buffer_ids, false, sort, unselected); let holes = List.map(of_hole(~measured, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 2e6045b065..3f74abf29c 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -224,7 +224,19 @@ let inspector_view = (~inject, ~settings, ci): Node.t => [view_of_info(~inject, ~settings, ci)], ); -let view = (~inject, ~settings: Settings.t, cursor_info: option(Info.t)) => { +let projectors_view = (~inject as _, editor: Editor.t) => { + open Util.OptUtil.Syntax; + let projectors = Editor.get_projectors(editor); + let* id = Indicated.index(editor.state.zipper); + let+ projector = Projector.Map.find(id, projectors); + div( + ~attr=Attr.classes(["projector-ci"]), + [text(Projector.to_string(projector))], + ); +}; + +let view = + (~inject, ~settings: Settings.t, editor, cursor_info: option(Info.t)) => { let bar_view = div(~attr=Attr.id("bottom-bar")); let err_view = err => bar_view([ @@ -241,7 +253,8 @@ let view = (~inject, ~settings: Settings.t, cursor_info: option(Info.t)) => { inspector_view(~inject, ~settings, ci), div( ~attr=clss(["id"]), - [text(String.sub(Id.to_string(Info.id_of(ci)), 0, 4))], + [text(String.sub(Id.to_string(Info.id_of(ci)), 0, 4))] + @ Option.to_list(projectors_view(~inject, editor)), ), ]) }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index e5cfacc04d..024d7530b9 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -158,6 +158,7 @@ module Deco = }; let rec targets = (~container_shards=?, bp: Backpack.t, seg: Segment.t) => { + let seg = seg; let with_container_shards = ((pre, suf) as sibs) => switch (container_shards) { | None => sibs diff --git a/src/haz3lweb/view/Icons.re b/src/haz3lweb/view/Icons.re index 1067286891..9957445b48 100644 --- a/src/haz3lweb/view/Icons.re +++ b/src/haz3lweb/view/Icons.re @@ -57,6 +57,15 @@ let star = ], ); +let fold = + simple_icon( + ~view="0 0 1200 1200", + [ + "m875 625h-275c-13.805 0-25-11.195-25-25v-267.19h50v206.83l407.32-407.32 35.359 35.352-407.32 407.32h214.64z", + "m125 200c0-13.809 11.191-25 25-25h500v50h-475v800h800v-475h50v500c0 13.805-11.195 25-25 25h-850c-13.809 0-25-11.195-25-25z", + ], + ); + let bomb = simple_icon( ~view="0 0 1200 1200", diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index fe4e1f43ba..3d992f4b06 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -63,7 +63,8 @@ let main_view = @ [div(~attr=Attr.id("title"), [text("hazel")])] @ [EditorModeView.view(~inject, ~settings, ~editors)], ); - let bottom_bar = CursorInspector.view(~inject, ~settings, cursor_info); + let bottom_bar = + CursorInspector.view(~inject, ~settings, editor, cursor_info); let sidebar = settings.explainThis.show && settings.core.statics ? ExplainThis.view( From ab9ce05355817b81c643e02a9ae62bc513f7407a Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 00:28:37 -0500 Subject: [PATCH 004/168] revert jsutil --- src/haz3lweb/util/JsUtil.re | 64 ++++++++++++------------------------- 1 file changed, 21 insertions(+), 43 deletions(-) diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index acd2b609e1..d9a7efc7fc 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -3,11 +3,13 @@ open Virtual_dom.Vdom; let get_elem_by_id = id => { let doc = Dom_html.document; - Js.Opt.get(doc##getElementById(Js.string(id)), () => { - assert - (false) - //print_endline(id); - }); + Js.Opt.get( + doc##getElementById(Js.string(id)), + () => { + print_endline(id); + assert(false); + }, + ); }; let date_now = () => { @@ -121,18 +123,21 @@ let copy = (str: string) => { ); }; -let scroll_cursor_into_view_if_needed = () => { - let caret_elem = get_elem_by_id("caret"); - let main = get_elem_by_id("main"); - let main_rect = main##getBoundingClientRect; - let caret_rect = caret_elem##getBoundingClientRect; - - if (caret_rect##.top < main_rect##.top) { - caret_elem##scrollIntoView(Js._true); - } else if (caret_rect##.bottom > main_rect##.bottom) { - caret_elem##scrollIntoView(Js._false); +let scroll_cursor_into_view_if_needed = () => + try({ + let caret_elem = get_elem_by_id("caret"); + let main = get_elem_by_id("main"); + let main_rect = main##getBoundingClientRect; + let caret_rect = caret_elem##getBoundingClientRect; + + if (caret_rect##.top < main_rect##.top) { + caret_elem##scrollIntoView(Js._true); + } else if (caret_rect##.bottom > main_rect##.bottom) { + caret_elem##scrollIntoView(Js._false); + }; + }) { + | Assert_failure(_) => () }; -}; module Fragment = { let set_current = frag => { @@ -155,30 +160,3 @@ module Fragment = { Url.Current.get() |> Option.map(fragment_of_url); }; }; - -let contains = - (rt: Js.t(Dom_html.element), ct: Js.t(Dom_html.element)): bool => - try( - Js_of_ocaml.Js.Unsafe.meth_call( - ct, - "contains", - [|Js_of_ocaml.Js.Unsafe.coerce(rt)|], - ) - |> Js_of_ocaml.Js.to_bool - ) { - | _ => false - }; - -let is_refocus_on_child = - (evt: Js_of_ocaml.Js.t(Js_of_ocaml.Dom_html.focusEvent)): bool => - try( - contains( - Js.Opt.get( - Js.Optdef.get(evt##.relatedTarget, () => failwith("lol")), () => - failwith("lol") - ), - Js_of_ocaml.Js.Opt.get(evt##.currentTarget, () => failwith("lol")), - ) - ) { - | _ => false - }; From 0e81a225907061e117e4bd979002048edc0c9b1e Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 00:37:18 -0500 Subject: [PATCH 005/168] resolved view layer scroll exn bug. lingering exn for indicated deco; disabled for now --- src/haz3lweb/Main.re | 4 ++-- src/haz3lweb/view/Cell.re | 7 ++++--- src/haz3lweb/view/Deco.re | 3 ++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index e34c1a9ed3..e1268431af 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -123,8 +123,8 @@ module App = { schedule_action(Update.Save); }; if (scroll_to_caret.contents) { - scroll_to_caret := false; //TODO(andrew): re-enable - //JsUtil.scroll_cursor_into_view_if_needed(); + scroll_to_caret := false; + JsUtil.scroll_cursor_into_view_if_needed(); }; }, ); diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 2ca9e49c4c..818e69837b 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -115,13 +115,14 @@ let deco = ( ~font_metrics, ~show_backpack_targets, - ~selected as _, + ~selected, ~error_ids, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), { state: { - meta: {term_ranges, segment: _, measured, terms, tiles, _}, + zipper, + meta: {term_ranges, segment, measured, terms, tiles, _}, _, }, _, @@ -137,7 +138,7 @@ let deco = let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; }); - let decos = []; //selected ? Deco.all(zipper, segment) : Deco.err_holes(zipper); + let decos = selected ? Deco.all(zipper, segment) : Deco.err_holes(zipper); let decos = switch (test_results) { | None => decos diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 024d7530b9..4b17e9e92f 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -284,7 +284,8 @@ module Deco = let all = (zipper, sel_seg) => List.concat([ caret(zipper), - indicated_piece_deco(zipper), + //TODO(andrew): renable; causing Not_found exn + //indicated_piece_deco(zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), From 43e55aa40188ec683aabebe2b2794854749f4d6c Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 00:49:52 -0500 Subject: [PATCH 006/168] consistency of unselected use between init and next --- src/haz3lcore/zipper/Editor.re | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index b7d5f85e2e..03234da077 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -17,12 +17,14 @@ module Meta = { }; let init = (z: Zipper.t) => { - let unselected = Zipper.unselect_and_zip(z); - let (view_term, terms) = MakeTerm.go(unselected); - let term_ranges = TermRanges.mk(unselected); + let unselected' = Zipper.unselect_and_zip(z); + + let term_ranges = TermRanges.mk(unselected'); let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); print_endline("AAAAA"); - let unselected = Projector.of_segment(projectors, unselected); + let unselected = Projector.of_segment(projectors, unselected'); + /*NOTE(andrew): consider using unselected' for view_term (but terms problematic) */ + let (view_term, terms) = MakeTerm.go(unselected); let term_ranges = TermRanges.mk(unselected); let measured = Measured.of_segment(unselected); print_endline("BBBBB"); @@ -67,9 +69,9 @@ module Meta = { let {touched, measured, col_target, term_ranges, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); - let unselected = is_edit ? Zipper.unselect_and_zip(z) : meta.unselected; + let unselected' = is_edit ? Zipper.unselect_and_zip(z) : meta.unselected; let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); - let unselected = Projector.of_segment(projectors, unselected); + let unselected = Projector.of_segment(projectors, unselected'); let measured = is_edit ? Measured.of_segment(~touched, ~old=measured, unselected) : measured; @@ -80,6 +82,7 @@ module Meta = { | _ => Zipper.caret_point(measured, z).col }; let (view_term, terms) = + //NOTE(andrew): could use unprojected version here, might be dangerous is_edit ? MakeTerm.go(unselected) : (meta.view_term, meta.terms); { col_target, From 9eddee06881824d3373dda4a769c20d4bdf8273a Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 00:57:46 -0500 Subject: [PATCH 007/168] can now fold when not at start of term --- src/haz3lcore/zipper/action/Perform.re | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 177f0e12f4..3cb6883480 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -68,7 +68,16 @@ let go_z = }; switch (a) { - | Project(p) => Ok(Project.go(p, z)) + | Project(p) => + switch (Indicated.index(z)) { + | None => Error(Action.Failure.Cant_move) + | Some(id) => + switch (Move.jump_to_id(z, id)) { + | None => Error(Action.Failure.Cant_move) + | Some(z) => Ok(Project.go(p, z)) + } + } + | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => From 9fc2c8c80ca7977603d3ae8a23df41b54cb3a662 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 17:46:46 -0500 Subject: [PATCH 008/168] cleanup --- src/haz3lcore/zipper/Projector.re | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index d42fb1291c..989748fdcf 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -24,8 +24,8 @@ module Map = { let add = add; let remove = remove; let find = find_opt; - let update = update; - let to_list = x => x |> List.to_seq |> Id.Map.of_seq; + //let update = update; + //let to_list = x => x |> List.to_seq |> Id.Map.of_seq; //let mapi = mapi; let fold = fold; let cardinal = cardinal; @@ -54,18 +54,9 @@ let split_seg = | None => None | Some(pr) => let (pre, rest) = - ListUtil.take_while( - (p: Piece.t) => - switch (Id.Map.find_opt(Piece.id(p), ps)) { - | Some(_) => false - | None => true - }, - seg, - ); + ListUtil.take_while(p => !Id.Map.mem(Piece.id(p), ps), seg); let (mid, suf) = - rest - |> List.rev - |> ListUtil.take_while((p: Piece.t) => Piece.id(p) != pr.last_id); + rest |> List.rev |> ListUtil.take_while(p => Piece.id(p) != pr.last_id); Some((pre, suf |> List.rev, mid |> List.rev, pr.proj_id, pr.t)); }; }; @@ -81,7 +72,7 @@ let proj_info = (term_ranges, id: Id.t, t: proj_ty, acc: nu_proj_map) => { print_endline("proj_info for id: " ++ Id.to_string(id)); switch (Id.Map.find_opt(id, term_ranges)) { | Some(range) => - print_endline("proj_info: found term range for projector"); + //print_endline("proj_info: found term range for projector"); let guy = guy_of(id, t, range); Id.Map.add(guy.start_id, guy, acc); | _ => @@ -94,10 +85,19 @@ let mk_nu_proj_map = (projectors: Map.t, term_ranges: TermRanges.t): nu_proj_map => Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); +let placeholder_tile = (s: string, id: Id.t): Tile.t => { + id, + label: [s], + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], +}; + let project_mid = (id, p: proj_ty, mid): Segment.t => - //TODO(andrew): prrobably shouldn't just duplicate this id in the general case + //TODO(andrew): prrobably shouldn't just duplicate this id in the general case? switch (p) { - | Fold => [Grout({id, shape: Convex})] + | Fold => [Tile(placeholder_tile("%", id))] + //[Grout({id, shape: Convex})] | Normal => mid }; From cd37968d962caa2bc723a767531bf8684a4edbe7 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 18:14:44 -0500 Subject: [PATCH 009/168] cleanup. removed previous (selected) segment from editor meta, which was used only by backpark targets. new 'segment' is now what was previously called 'unselected' --- src/haz3lcore/zipper/Editor.re | 42 ++++++++++++++------------------ src/haz3lweb/view/Code.re | 15 ++++-------- src/haz3lweb/view/ExplainThis.re | 7 +----- 3 files changed, 24 insertions(+), 40 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 03234da077..34ccb44a0f 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -7,7 +7,6 @@ module Meta = { touched: Touched.t, measured: Measured.t, term_ranges: TermRanges.t, - unselected: Segment.t, segment: Segment.t, view_term: Term.UExp.t, terms: TermMap.t, @@ -17,28 +16,24 @@ module Meta = { }; let init = (z: Zipper.t) => { - let unselected' = Zipper.unselect_and_zip(z); - - let term_ranges = TermRanges.mk(unselected'); + let segment' = Zipper.unselect_and_zip(z); + let term_ranges = TermRanges.mk(segment'); let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); - print_endline("AAAAA"); - let unselected = Projector.of_segment(projectors, unselected'); - /*NOTE(andrew): consider using unselected' for view_term (but terms problematic) */ - let (view_term, terms) = MakeTerm.go(unselected); - let term_ranges = TermRanges.mk(unselected); - let measured = Measured.of_segment(unselected); - print_endline("BBBBB"); + let segment = Projector.of_segment(projectors, segment'); + /*NOTE(andrew): consider using segment' for view_term (but terms problematic) */ + let (view_term, terms) = MakeTerm.go(segment); + let term_ranges = TermRanges.mk(segment); + let measured = Measured.of_segment(segment); { col_target: 0, touched: Touched.empty, measured, - unselected, + segment, term_ranges, - segment: Projector.of_segment(projectors, Zipper.zip(z)), - tiles: TileMap.mk(unselected), + tiles: TileMap.mk(segment), view_term, terms, - holes: Segment.holes(unselected), + holes: Segment.holes(segment), buffer_ids: Selection.buffer_ids(z.selection), }; }; @@ -69,12 +64,12 @@ module Meta = { let {touched, measured, col_target, term_ranges, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); - let unselected' = is_edit ? Zipper.unselect_and_zip(z) : meta.unselected; + let segment' = is_edit ? Zipper.unselect_and_zip(z) : meta.segment; let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); - let unselected = Projector.of_segment(projectors, unselected'); + let segment = Projector.of_segment(projectors, segment'); let measured = is_edit - ? Measured.of_segment(~touched, ~old=measured, unselected) : measured; + ? Measured.of_segment(~touched, ~old=measured, segment) : measured; let col_target = switch (a) { | Move(Local(Up | Down)) @@ -83,18 +78,17 @@ module Meta = { }; let (view_term, terms) = //NOTE(andrew): could use unprojected version here, might be dangerous - is_edit ? MakeTerm.go(unselected) : (meta.view_term, meta.terms); + is_edit ? MakeTerm.go(segment) : (meta.view_term, meta.terms); { col_target, touched, measured, - unselected, - term_ranges: is_edit ? TermRanges.mk(unselected) : meta.term_ranges, - segment: Projector.of_segment(projectors, Zipper.zip(z)), - tiles: is_edit ? TileMap.mk(unselected) : meta.tiles, + segment, + term_ranges: is_edit ? TermRanges.mk(segment) : meta.term_ranges, + tiles: is_edit ? TileMap.mk(segment) : meta.tiles, view_term, terms, - holes: is_edit ? Segment.holes(unselected) : meta.holes, + holes: is_edit ? Segment.holes(segment) : meta.holes, buffer_ids: Selection.buffer_ids(z.selection), }; }; diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 7bdd6116e6..81f843a0f9 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -136,19 +136,19 @@ let rec holes = ); let simple_view = - (~font_metrics, ~unselected, ~map, ~settings: Settings.t): Node.t => { + (~font_metrics, ~segment, ~map, ~settings: Settings.t): Node.t => { module Text = Text({ let map = map; let settings = settings; }); - let holes = holes(~map, ~font_metrics, unselected); + let holes = holes(~map, ~font_metrics, segment); div( ~attr=Attr.class_("code"), [ span_c( "code-text", - Text.of_segment(Projector.Map.empty, [], false, Sort.Any, unselected), + Text.of_segment(Projector.Map.empty, [], false, Sort.Any, segment), ), ...holes, ], @@ -172,7 +172,7 @@ let view = ~settings: Settings.t, { state: { - meta: {measured, buffer_ids, unselected, holes, term_ranges, _}, + meta: {measured, buffer_ids, segment, holes, term_ranges, _}, zipper, _, }, @@ -185,13 +185,8 @@ let view = let map = measured; let settings = settings; }); - //TODO(andrew): cleanup - print_endline( - "Code: projectors size:" - ++ string_of_int(Projector.Map.cardinal(zipper.projectors)), - ); let projectors = Projector.mk_nu_proj_map(zipper.projectors, term_ranges); - let code = Text.of_segment(projectors, buffer_ids, false, sort, unselected); + let code = Text.of_segment(projectors, buffer_ids, false, sort, segment); let holes = List.map(of_hole(~measured, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index b8a4592847..4908bb82aa 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -263,12 +263,7 @@ let expander_deco = ((id: ExplainThisForm.form_id, segment: Segment.t)): Node.t => { let map = Measured.of_segment(segment); let code_view = - Code.simple_view( - ~font_metrics, - ~unselected=segment, - ~map, - ~settings, - ); + Code.simple_view(~font_metrics, ~segment, ~map, ~settings); let classes = id == doc.id ? ["selected"] @ get_clss(segment) : get_clss(segment); From 6dc7793fa79fb3f42292646f851fb94689b27d37 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 18:18:36 -0500 Subject: [PATCH 010/168] unthread projectors from Code.view --- src/haz3lweb/view/BackpackView.re | 3 +-- src/haz3lweb/view/Code.re | 34 ++++++++----------------------- 2 files changed, 10 insertions(+), 27 deletions(-) diff --git a/src/haz3lweb/view/BackpackView.re b/src/haz3lweb/view/BackpackView.re index 6fd5a4ed2a..b2f9424986 100644 --- a/src/haz3lweb/view/BackpackView.re +++ b/src/haz3lweb/view/BackpackView.re @@ -32,8 +32,7 @@ let backpack_sel_view = ), ]), // zwsp necessary for containing box to stretch to contain trailing newline - Text.of_segment(Projector.Map.empty, [], true, Any, content) - @ [text(Unicode.zwsp)], + Text.of_segment([], true, Any, content) @ [text(Unicode.zwsp)], ); }; diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 81f843a0f9..de728ad66e 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -67,9 +67,7 @@ module Text = (M: { }) => { let m = p => Measured.find_p(p, M.map); let rec of_segment = - (projectors, buffer_ids, no_sorts, sort, seg: Segment.t) - : list(Node.t) => { - let seg = Projector.project_seg(projectors, seg); + (buffer_ids, no_sorts, sort, seg: Segment.t): list(Node.t) => { /* note: no_sorts flag is used for backpack view; otherwise Segment.expected_sorts call crashes for some reason */ let expected_sorts = @@ -84,22 +82,19 @@ module Text = (M: { seg |> List.mapi((i, p) => (i, p)) |> List.concat_map(((i, p)) => - of_piece(projectors, buffer_ids, sort_of_p_idx(i), p) + of_piece(buffer_ids, sort_of_p_idx(i), p) ); } and of_piece = - (projectors, buffer_ids, expected_sort: Sort.t, p: Piece.t) - : list(Node.t) => { + (buffer_ids, expected_sort: Sort.t, p: Piece.t): list(Node.t) => { switch (p) { - | Tile(t) => of_tile(projectors, buffer_ids, expected_sort, t) + | Tile(t) => of_tile(buffer_ids, expected_sort, t) | Grout(_) => of_grout | Secondary({content, _}) => of_secondary((content, M.settings.secondary_icons, m(p).last.col)) }; } - and of_tile = - (projectors, buffer_ids, expected_sort: Sort.t, t: Tile.t) - : list(Node.t) => { + and of_tile = (buffer_ids, expected_sort: Sort.t, t: Tile.t): list(Node.t) => { let children_and_sorts = List.mapi( (i, (l, child, r)) => @@ -111,7 +106,7 @@ module Text = (M: { let is_in_buffer = List.mem(t.id, buffer_ids); Aba.mk(t.shards, children_and_sorts) |> Aba.join(of_delim(is_in_buffer, is_consistent, t), ((seg, sort)) => - of_segment(projectors, buffer_ids, false, sort, seg) + of_segment(buffer_ids, false, sort, seg) ) |> List.concat; }; @@ -146,10 +141,7 @@ let simple_view = div( ~attr=Attr.class_("code"), [ - span_c( - "code-text", - Text.of_segment(Projector.Map.empty, [], false, Sort.Any, segment), - ), + span_c("code-text", Text.of_segment([], false, Sort.Any, segment)), ...holes, ], ); @@ -170,14 +162,7 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - { - state: { - meta: {measured, buffer_ids, segment, holes, term_ranges, _}, - zipper, - _, - }, - _, - }: Editor.t, + {state: {meta: {measured, buffer_ids, segment, holes, _}, _}, _}: Editor.t, ) : Node.t => { module Text = @@ -185,8 +170,7 @@ let view = let map = measured; let settings = settings; }); - let projectors = Projector.mk_nu_proj_map(zipper.projectors, term_ranges); - let code = Text.of_segment(projectors, buffer_ids, false, sort, segment); + let code = Text.of_segment(buffer_ids, false, sort, segment); let holes = List.map(of_hole(~measured, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; From 384f3bd730310d0c75a44fa56a7233c0222c85d1 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 18:21:24 -0500 Subject: [PATCH 011/168] unthread projectors from measured --- src/haz3lcore/Measured.re | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index e7d84e7928..747f88e204 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -269,16 +269,8 @@ let is_indented_map = (seg: Segment.t) => { go(seg); }; -let of_segment = - ( - ~projectors=Projector.Map.empty, - ~old: t=empty, - ~touched=Touched.empty, - seg: Segment.t, - ) - : t => { +let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let is_indented = is_indented_map(seg); - let seg = Projector.project_seg(projectors, seg); // recursive across seg's bidelimited containers let rec go_nested = From 0b0127d30d7863211804cc897493af79275f8504 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 18:24:23 -0500 Subject: [PATCH 012/168] re-enable indicated deco --- src/haz3lweb/view/Deco.re | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 4b17e9e92f..e5cfacc04d 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -158,7 +158,6 @@ module Deco = }; let rec targets = (~container_shards=?, bp: Backpack.t, seg: Segment.t) => { - let seg = seg; let with_container_shards = ((pre, suf) as sibs) => switch (container_shards) { | None => sibs @@ -284,8 +283,7 @@ module Deco = let all = (zipper, sel_seg) => List.concat([ caret(zipper), - //TODO(andrew): renable; causing Not_found exn - //indicated_piece_deco(zipper), + indicated_piece_deco(zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), From c12e18f61e1f02007c8ebcd037327c46f6e0e4bb Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 19:55:36 -0500 Subject: [PATCH 013/168] projector subsegmentation now follows proper parse order --- src/haz3lcore/zipper/Editor.re | 9 +- src/haz3lcore/zipper/Projector.re | 143 +++++++++++++------------ src/haz3lcore/zipper/action/Perform.re | 12 ++- src/haz3lschool/Exercise.re | 1 + src/haz3lschool/Grading.re | 1 + src/haz3lweb/view/Cell.re | 2 +- 6 files changed, 88 insertions(+), 80 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 34ccb44a0f..58e24d73b8 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -17,9 +17,7 @@ module Meta = { let init = (z: Zipper.t) => { let segment' = Zipper.unselect_and_zip(z); - let term_ranges = TermRanges.mk(segment'); - let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); - let segment = Projector.of_segment(projectors, segment'); + let segment = Projector.of_segment(z.projectors, segment'); /*NOTE(andrew): consider using segment' for view_term (but terms problematic) */ let (view_term, terms) = MakeTerm.go(segment); let term_ranges = TermRanges.mk(segment); @@ -61,12 +59,11 @@ module Meta = { let next = (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { - let {touched, measured, col_target, term_ranges, _} = meta; + let {touched, measured, col_target, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); let segment' = is_edit ? Zipper.unselect_and_zip(z) : meta.segment; - let projectors = Projector.mk_nu_proj_map(z.projectors, term_ranges); - let segment = Projector.of_segment(projectors, segment'); + let segment = Projector.of_segment(z.projectors, segment'); let measured = is_edit ? Measured.of_segment(~touched, ~old=measured, segment) : measured; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 989748fdcf..5f55958f5f 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -24,66 +24,75 @@ module Map = { let add = add; let remove = remove; let find = find_opt; - //let update = update; - //let to_list = x => x |> List.to_seq |> Id.Map.of_seq; - //let mapi = mapi; let fold = fold; let cardinal = cardinal; }; type t = p; -type proj = Map.t; -type proj_ty = t; +let rep_id = (seg, r) => r |> Aba.first_a |> List.nth(seg) |> Piece.id; -type nu_proj_info = { - proj_id: Id.t, //projector id - t, - start_id: Id.t, //first piece id - last_id: Id.t //last piece id -}; -/* map indexed by start_id instead of proj_id */ -type nu_proj_map = Id.Map.t(nu_proj_info); +let id_at = (seg: Segment.t, skel: Skel.t) => rep_id(seg, Skel.root(skel)); -let split_seg = - (seg: Segment.t, ps: nu_proj_map) - : option((Segment.t, Segment.t, Segment.t, Id.t, proj_ty)) => { - let res = - List.find_map((p: Piece.t) => Id.Map.find_opt(Piece.id(p), ps), seg); - switch (res) { - | None => None - | Some(pr) => - let (pre, rest) = - ListUtil.take_while(p => !Id.Map.mem(Piece.id(p), ps), seg); - let (mid, suf) = - rest |> List.rev |> ListUtil.take_while(p => Piece.id(p) != pr.last_id); - Some((pre, suf |> List.rev, mid |> List.rev, pr.proj_id, pr.t)); +let rec left_idx = (skel: Skel.t): int => { + switch (skel) { + | Op(r) + | Pre(r, _) => Aba.first_a(r) + | Post(s, _) + | Bin(s, _, _) => left_idx(s) }; }; -let guy_of = (id, t, (start, last)) => { - proj_id: id, - t, - start_id: Piece.id(start), - last_id: Piece.id(last), +let rec right_idx = (skel: Skel.t): int => { + switch (skel) { + | Op(r) + | Post(_, r) => Aba.last_a(r) + | Pre(_, s) + | Bin(_, _, s) => right_idx(s) + }; }; -let proj_info = (term_ranges, id: Id.t, t: proj_ty, acc: nu_proj_map) => { - print_endline("proj_info for id: " ++ Id.to_string(id)); - switch (Id.Map.find_opt(id, term_ranges)) { - | Some(range) => - //print_endline("proj_info: found term range for projector"); - let guy = guy_of(id, t, range); - Id.Map.add(guy.start_id, guy, acc); - | _ => - print_endline("ERROR: mk_nu_proj_map: no term range for projector"); - acc; +let get_extreme_idxs = (skel: Skel.t): (int, int) => ( + left_idx(skel), + right_idx(skel), +); + +let get_range = (seg: Segment.t, ps: Map.t): option((Id.t, (int, int))) => { + let rec go = (skel: Skel.t) => { + let id = id_at(seg, skel); + switch (Id.Map.find_opt(id, ps)) { + | Some(_) => + let (l, r) = get_extreme_idxs(skel); + Some((id, (l, r))); + | None => + switch (skel) { + | Op(_) => None + | Pre(_, r) => go(r) + | Post(l, _) => go(l) + | Bin(l, _, r) => + switch (go(l)) { + | Some(x) => Some(x) + | None => go(r) + } + } + }; }; + go(Segment.skel(seg)); }; -let mk_nu_proj_map = - (projectors: Map.t, term_ranges: TermRanges.t): nu_proj_map => - Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); +let split_seg = + (seg: Segment.t, ps: Map.t) + : option((Segment.t, Segment.t, Segment.t, Id.t)) => { + switch (get_range(seg, ps)) { + | None => None + | Some((id, (start, last))) => + //TODO(andrew): numeric edge cases? + switch (ListUtil.split_sublist_opt(start, last + 1, seg)) { + | Some((pre, mid, suf)) => Some((pre, mid, suf, id)) + | _ => None + } + }; +}; let placeholder_tile = (s: string, id: Id.t): Tile.t => { id, @@ -93,39 +102,33 @@ let placeholder_tile = (s: string, id: Id.t): Tile.t => { children: [], }; -let project_mid = (id, p: proj_ty, mid): Segment.t => +let project_mid = (id, p: option(t), mid): Segment.t => //TODO(andrew): prrobably shouldn't just duplicate this id in the general case? switch (p) { - | Fold => [Tile(placeholder_tile("%", id))] + | Some(Fold) => [Tile(placeholder_tile("%", id))] //[Grout({id, shape: Convex})] - | Normal => mid + | Some(Normal) + | None => mid }; -let project_seg = (p: nu_proj_map, seg: Segment.t): Segment.t => { - /* needed input: a map/assoc list of projector first piece ids to projector (and last piece id) (don't even need id here maybe?) */ - /* find first idx in seg where is matches a projector range */ - /* check other side of range exists */ - /* split segment three ways. prefix and suffix left alone */ - /* dispatch on projector type */ - /* Fold will turn middle of suffix into singleton padding token */ - /* stitch seg back together */ - print_endline("project_seg"); +let project_seg = (p, seg: Segment.t): Segment.t => { + // print_endline("project_seg"); switch (split_seg(seg, p)) { - | Some((pre, mid_og, suf, proj_id, p)) => - print_endline( - "split: segment length: " - ++ string_of_int(List.length(seg)) - ++ " as divided into: " - ++ string_of_int(List.length(pre)) - ++ " " - ++ string_of_int(List.length(mid_og)) - ++ " " - ++ string_of_int(List.length(suf)), - ); - pre @ project_mid(proj_id, p, mid_og) @ suf; + | Some((pre, mid_og, suf, proj_id)) => + // print_endline( + // "split: segment length: " + // ++ string_of_int(List.length(seg)) + // ++ " as divided into: " + // ++ string_of_int(List.length(pre)) + // ++ " " + // ++ string_of_int(List.length(mid_og)) + // ++ " " + // ++ string_of_int(List.length(suf)), + // ); + pre @ project_mid(proj_id, Map.find(proj_id, p), mid_og) @ suf | None => - print_endline("no split"); - seg; + // print_endline("no split"); + seg }; }; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 3cb6883480..51e3498e00 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -72,10 +72,16 @@ let go_z = switch (Indicated.index(z)) { | None => Error(Action.Failure.Cant_move) | Some(id) => - switch (Move.jump_to_id(z, id)) { + let z = Project.go(p, z); + //TODO(andrew): clean up hacky movement + switch (Move.to_start(z)) { | None => Error(Action.Failure.Cant_move) - | Some(z) => Ok(Project.go(p, z)) - } + | Some(z) => + switch (Move.jump_to_id(z, id)) { + | None => Error(Action.Failure.Cant_move) + | Some(z) => Ok(z) + } + }; } | Move(d) => diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 86fdd4ce99..ec5a40c262 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -592,6 +592,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { }; let term_of = (editor: Editor.t): Term.UExp.t => + //TODO(andrew): this is the wrong term editor.state.meta.view_term; let stitch3 = (ed1: Editor.t, ed2: Editor.t, ed3: Editor.t) => diff --git a/src/haz3lschool/Grading.re b/src/haz3lschool/Grading.re index eb94be8aa1..2593f26dc1 100644 --- a/src/haz3lschool/Grading.re +++ b/src/haz3lschool/Grading.re @@ -171,6 +171,7 @@ module F = (ExerciseEnv: Exercise.ExerciseEnv) => { }; let mk = (~your_impl: Editor.t, ~tests: syntax_tests): t => { + //TODO(andrew): this is the wrong term let user_impl_term = your_impl.state.meta.view_term; let predicates = diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 818e69837b..c7e5df9ddd 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -393,7 +393,7 @@ let locked = ? Interface.elaborate( ~settings=settings.core, statics.info_map, - editor.state.meta.view_term, + editor.state.meta.view_term //TODO(andrew): use semantics term ) : DHExp.BoolLit(true); let result: ModelResult.t = From 3f0a332e363f9bb1bfc0e566be5b35e2aaa25410 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 20 Feb 2024 22:52:27 -0500 Subject: [PATCH 014/168] projectors: failed movement experiments --- src/haz3lcore/zipper/Editor.re | 8 ++- src/haz3lcore/zipper/Projector.re | 43 +++++++++++++- src/haz3lcore/zipper/action/Move.re | 92 ++++++++++++++++++++++++++++- 3 files changed, 139 insertions(+), 4 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 58e24d73b8..edfa5f48aa 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -13,6 +13,7 @@ module Meta = { tiles: TileMap.t, holes: list(Grout.t), buffer_ids: list(Id.t), + start_map: Projector.start_map, }; let init = (z: Zipper.t) => { @@ -33,6 +34,7 @@ module Meta = { terms, holes: Segment.holes(segment), buffer_ids: Selection.buffer_ids(z.selection), + start_map: Projector.mk_start_map(z.projectors, term_ranges), }; }; @@ -40,6 +42,7 @@ module Meta = { let touched: Touched.t; let measured: Measured.t; let term_ranges: TermRanges.t; + let start_map: Projector.start_map; let col_target: int; }; let module_of_t = (m: t): (module S) => @@ -49,6 +52,7 @@ module Meta = { let measured = m.measured; let term_ranges = m.term_ranges; let col_target = m.col_target; + let start_map = m.start_map; }); // should not be serializing @@ -76,17 +80,19 @@ module Meta = { let (view_term, terms) = //NOTE(andrew): could use unprojected version here, might be dangerous is_edit ? MakeTerm.go(segment) : (meta.view_term, meta.terms); + let term_ranges = is_edit ? TermRanges.mk(segment) : meta.term_ranges; { col_target, touched, measured, segment, - term_ranges: is_edit ? TermRanges.mk(segment) : meta.term_ranges, + term_ranges, tiles: is_edit ? TileMap.mk(segment) : meta.tiles, view_term, terms, holes: is_edit ? Segment.holes(segment) : meta.holes, buffer_ids: Selection.buffer_ids(z.selection), + start_map: Projector.mk_start_map(z.projectors, term_ranges), }; }; }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 5f55958f5f..f657e435b4 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -24,6 +24,7 @@ module Map = { let add = add; let remove = remove; let find = find_opt; + let mem = mem; let fold = fold; let cardinal = cardinal; }; @@ -46,7 +47,7 @@ let rec left_idx = (skel: Skel.t): int => { let rec right_idx = (skel: Skel.t): int => { switch (skel) { | Op(r) - | Post(_, r) => Aba.last_a(r) + | Post(_, r) => Aba.first_a(r) | Pre(_, s) | Bin(_, _, s) => right_idx(s) }; @@ -146,6 +147,46 @@ and of_tile = (projectors, t: Tile.t): Tile.t => { {...t, children: List.map(of_segment(projectors), t.children)}; }; +type start_entry = { + proj_id: Id.t, + t, + start_id: Id.t, + last_id: Id.t, +}; +/* map indexed by start_id instead of proj_id */ +type start_map = Id.Map.t(start_entry); +let guy_of = (id, t, (start, last)) => { + proj_id: id, + t, + start_id: Piece.id(start), + last_id: Piece.id(last), +}; +let guy_of_rev = (id, t, (start, last)) => { + proj_id: id, + t, + start_id: Piece.id(last), + last_id: Piece.id(start), +}; +let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { + print_endline("proj_info for id: " ++ Id.to_string(id)); + switch (Id.Map.find_opt(id, term_ranges)) { + | Some(range) => + //print_endline("proj_info: found term range for projector"); + let guy = guy_of(id, t, range); + let guy_rev = guy_of_rev(id, t, range); + Id.Map.add( + guy.start_id, + guy, + Id.Map.add(guy_rev.start_id, guy_rev, acc), + ); + | _ => + print_endline("ERROR: mk_nu_proj_map: no term range for projector"); + acc; + }; +}; +let mk_start_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => + Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); + /* projector map has ids of projectors can use infomap to get ancestors of projectors diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 1f19f0441e..0d81ad61e0 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -6,6 +6,7 @@ open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] type movability = | CanEnter(int, int) + | Projected(Id.t) | CanPass | CantEven; @@ -22,7 +23,11 @@ let movability = (chunkiness: chunkiness, label, delim_idx): movability => { }; let neighbor_movability = - (chunkiness: chunkiness, {relatives: {siblings, ancestors}, _}: t) + ( + start_map: Projector.start_map, + chunkiness: chunkiness, + {relatives: {siblings, ancestors}, projectors, _}: t, + ) : (movability, movability) => { let movability = movability(chunkiness); let (supernhbr_l, supernhbr_r) = @@ -36,6 +41,18 @@ let neighbor_movability = let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); let l = switch (l_nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => + let seg = (siblings |> fst |> List.rev) @ (siblings |> snd); + let next_id = + switch (Projector.split_seg(seg, projectors)) { + | Some(([_, ..._] as xs, _, _, _)) => + Piece.id(List.hd(List.rev(xs))) + | _ => Id.invalid //TODO(andrew) + }; + Projected( + next_id, + // (Projector.Map.find(Piece.id(p), start_map) |> Option.get).last_id, + ); | Some(Tile({label, _})) => movability(label, List.length(label) - 1) | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 @@ -49,6 +66,17 @@ let neighbor_movability = }; let r = switch (r_nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => + let seg = (siblings |> fst |> List.rev) @ (siblings |> snd); + let next_id = + switch (Projector.split_seg(seg, projectors)) { + | Some((_, _, [hd, ..._], _)) => Piece.id(hd) + | _ => Id.invalid //TODO(andrew) + }; + Projected( + next_id, + // (Projector.Map.find(Piece.id(p), start_map) |> Option.get).last_id, + ); | Some(Tile({label, _})) => movability(label, 0) | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 @@ -73,17 +101,77 @@ module Make = (M: Editor.Meta.S) => { let inner_end = (d, d_init, c_max, z) => z |> Zipper.set_caret(Inner(d_init, c_max)) |> Zipper.move(d); + /* Do move_action until the indicated piece is such that piece_p is true. + If no such piece is found, don't move. */ + let rec do_until_sib = + ( + ~move_first=true, + move_action: t => option(t), + z_pred: Zipper.t => bool, + z: t, + ) + : option(t) => { + let* z = move_first ? move_action(z) : Some(z); + if (z_pred(z)) { + Some(z); + } else { + let* z = move_first ? Some(z) : move_action(z); + do_until_sib(~move_first, move_action, z_pred, z); + }; + }; + let primary = (chunkiness: chunkiness, d: Direction.t, z: t): option(t) => { - switch (d, z.caret, neighbor_movability(chunkiness, z)) { + switch (d, z.caret, neighbor_movability(M.start_map, chunkiness, z)) { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) + | (Left, Outer, (Projected(last_id), _)) => + print_endline("Left Projected"); + z |> Zipper.show |> print_endline; + do_until_sib( + ~move_first=false, + z => Zipper.move(Left, z), + z => + switch (z.relatives.siblings) { + | ([_, ..._] as ls, _) => + Piece.id(List.hd(List.rev(ls))) == last_id + | _ => false + }, + z, + ); | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) | (Left, Inner(_), _) when chunkiness == ByToken => pop_out(z) | (Left, Inner(_), _) => Some(Zipper.update_caret(Zipper.Caret.decrement, z)) + | (Right, Outer, (_, Projected(last_id))) => + print_endline("Right Projected"); + z |> Zipper.show |> print_endline; + // let z = Zipper.set_caret(Outer, z); + do_until_sib( + ~move_first=false, + z => Zipper.move(Right, z), + z => + switch (z.relatives.siblings) { + | (_, [r, ..._]) => Piece.id(r) == last_id + | _ => false + }, + z, + ); + // |> OptUtil.and_then(z => + // do_until( + // z => Zipper.move(Right, z), + // piece => Piece.id(piece) != last_id, + // z, + // ) + // ) + // |> Option.map(z => { + // print_endline("Right Projected Done"); + // z |> Zipper.show |> print_endline; + // z; + // }); + | (Right, Outer, (_, CanEnter(d_init, _))) => inner_start(d_init, z) | (Right, Outer, _) => Zipper.move(d, z) | (Right, Inner(_, c), (_, CanEnter(_, c_max))) when c == c_max => From d0385abc6eef1ad68401d04d86c0b2afdf818289 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 21 Feb 2024 18:31:52 -0500 Subject: [PATCH 015/168] projectors: movement working for convex terms in middle of segment. kind of nasty though may need an alternate approach --- src/haz3lcore/Measured.re | 47 +++++++++++++++++++-------- src/haz3lcore/zipper/Editor.re | 20 ++++++++---- src/haz3lcore/zipper/Printer.re | 32 ------------------ src/haz3lcore/zipper/Projector.re | 22 ++++++++----- src/haz3lcore/zipper/Zipper.re | 4 +-- src/haz3lcore/zipper/action/Move.re | 50 ++++++++++++++++++----------- src/haz3lweb/view/Code.re | 6 ++-- src/haz3lweb/view/Deco.re | 36 +++++++++++++++------ 8 files changed, 124 insertions(+), 93 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 747f88e204..4c3b513be4 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -169,7 +169,10 @@ let singleton_s = (id, shard, m) => empty |> add_s(id, shard, m); // TODO(d) rename let find_opt_shards = (t: Tile.t, map) => Id.Map.find_opt(t.id, map.tiles); -let find_shards = (t: Tile.t, map) => Id.Map.find(t.id, map.tiles); +let find_shards = (~msg="", t: Tile.t, map) => + try(Id.Map.find(t.id, map.tiles)) { + | _ => failwith("find_shards: " ++ msg) + }; let find_opt_lb = (id, map) => Id.Map.find_opt(id, map.linebreaks); @@ -179,25 +182,43 @@ let find_shards' = (id: Id.t, map) => | Some(ss) => ss }; -let find_w = (w: Secondary.t, map): measurement => - Id.Map.find(w.id, map.secondary); -let find_g = (g: Grout.t, map): measurement => Id.Map.find(g.id, map.grout); +let find_w = (~msg="", w: Secondary.t, map): measurement => + try(Id.Map.find(w.id, map.secondary)) { + | _ => failwith("find_w: " ++ msg) + }; +let find_g = (~msg="", g: Grout.t, map): measurement => + try(Id.Map.find(g.id, map.grout)) { + | _ => failwith("find_g: " ++ msg) + }; // returns the measurement spanning the whole tile let find_t = (t: Tile.t, map): measurement => { let shards = Id.Map.find(t.id, map.tiles); - let first = ListUtil.assoc_err(Tile.l_shard(t), shards, "find_t"); - let last = ListUtil.assoc_err(Tile.r_shard(t), shards, "find_t"); + let (first, last) = + try({ + let first = ListUtil.assoc_err(Tile.l_shard(t), shards, "find_t"); + let last = ListUtil.assoc_err(Tile.r_shard(t), shards, "find_t"); + (first, last); + }) { + | _ => + print_endline("FuCkNASTY hackzz"); + let s = shards |> List.hd; + (s |> snd, s |> snd); + }; {origin: first.origin, last: last.last}; }; // let find_a = ({shards: (l, r), _} as a: Ancestor.t, map) => // List.assoc(l @ r, Id.Map.find(a.id, map.tiles)); -let find_p = (p: Piece.t, map): measurement => - p - |> Piece.get( - w => find_w(w, map), - g => find_g(g, map), - t => find_t(t, map), - ); +let find_p = (~msg="", p: Piece.t, map): measurement => + try( + p + |> Piece.get( + w => find_w(w, map), + g => find_g(g, map), + t => find_t(t, map), + ) + ) { + | _ => failwith("find_p: " ++ msg ++ "id: " ++ Id.to_string(p |> Piece.id)) + }; let find_by_id = (id: Id.t, map: t): option(measurement) => { switch (Id.Map.find_opt(id, map.secondary)) { diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index edfa5f48aa..2567f2b4fd 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -14,6 +14,7 @@ module Meta = { holes: list(Grout.t), buffer_ids: list(Id.t), start_map: Projector.start_map, + last_map: Projector.start_map, }; let init = (z: Zipper.t) => { @@ -35,6 +36,7 @@ module Meta = { holes: Segment.holes(segment), buffer_ids: Selection.buffer_ids(z.selection), start_map: Projector.mk_start_map(z.projectors, term_ranges), + last_map: Projector.mk_last_map(z.projectors, term_ranges), }; }; @@ -43,6 +45,7 @@ module Meta = { let measured: Measured.t; let term_ranges: TermRanges.t; let start_map: Projector.start_map; + let last_map: Projector.start_map; let col_target: int; }; let module_of_t = (m: t): (module S) => @@ -53,6 +56,7 @@ module Meta = { let term_ranges = m.term_ranges; let col_target = m.col_target; let start_map = m.start_map; + let last_map = m.last_map; }); // should not be serializing @@ -68,6 +72,8 @@ module Meta = { let is_edit = Action.is_edit(a); let segment' = is_edit ? Zipper.unselect_and_zip(z) : meta.segment; let segment = Projector.of_segment(z.projectors, segment'); + print_endline("projected segment:"); + segment |> Segment.show |> print_endline; let measured = is_edit ? Measured.of_segment(~touched, ~old=measured, segment) : measured; @@ -75,7 +81,13 @@ module Meta = { switch (a) { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => col_target - | _ => Zipper.caret_point(measured, z).col + | _ => + switch (Indicated.index(z)) { + | Some(i) => print_endline("indicated_id:" ++ Id.show(i)) + //let x = Id.Map.find(i, measured.tiles); + | None => print_endline("no indicated_id") + }; + Zipper.caret_point(measured, z).col; }; let (view_term, terms) = //NOTE(andrew): could use unprojected version here, might be dangerous @@ -93,6 +105,7 @@ module Meta = { holes: is_edit ? Segment.holes(segment) : meta.holes, buffer_ids: Selection.buffer_ids(z.selection), start_map: Projector.mk_start_map(z.projectors, term_ranges), + last_map: Projector.mk_last_map(z.projectors, term_ranges), }; }; }; @@ -163,11 +176,6 @@ let new_state = {state, history, read_only: ed.read_only}; }; -let caret_point = (ed: t): Measured.Point.t => { - let State.{zipper, meta} = ed.state; - Zipper.caret_point(meta.measured, zipper); -}; - let undo = (ed: t) => switch (ed.history) { | ([], _) => None diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 70ea237eea..8fe329fb64 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -91,38 +91,6 @@ let to_string_selection = (editor: Editor.t): string => ) |> String.concat("\n"); -let to_log = (~measured: Measured.t, z: Zipper.t): t => { - code: - to_rows( - ~holes=None, - ~measured, - ~caret=Some(Zipper.caret_point(measured, z)), - ~indent=" ", - ~segment=seg_of_zip(z), - ), - selection: z.selection.content |> of_segment(~holes=None) |> lines_to_list, - backpack: - List.map( - (s: Selection.t) => - s.content |> of_segment(~holes=None) |> lines_to_list, - z.backpack, - ), -}; - -let to_log_flat = (~measured, z: Zipper.t): string => { - let {code, selection, backpack} = to_log(~measured, z); - Printf.sprintf( - "CODE:\n%s\nSELECTION:\n%s\n%s\n", - String.concat("\n", code), - String.concat("\n", selection), - backpack - |> List.mapi((i, b) => - Printf.sprintf("BP(%d):\n %s\n", i, String.concat("\n", b)) - ) - |> String.concat(""), - ); -}; - let zipper_of_string = (~zipper_init=Zipper.init(), str: string): option(Zipper.t) => { let insert = (z: option(Zipper.t), c: string): option(Zipper.t) => { diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index f657e435b4..2d67751f5e 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -171,14 +171,19 @@ let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { print_endline("proj_info for id: " ++ Id.to_string(id)); switch (Id.Map.find_opt(id, term_ranges)) { | Some(range) => - //print_endline("proj_info: found term range for projector"); let guy = guy_of(id, t, range); - let guy_rev = guy_of_rev(id, t, range); - Id.Map.add( - guy.start_id, - guy, - Id.Map.add(guy_rev.start_id, guy_rev, acc), - ); + Id.Map.add(guy.start_id, guy, acc); + | _ => + print_endline("ERROR: mk_nu_proj_map: no term range for projector"); + acc; + }; +}; +let proj_info_rev = (term_ranges, id: Id.t, t: t, acc: start_map) => { + print_endline("proj_info for id: " ++ Id.to_string(id)); + switch (Id.Map.find_opt(id, term_ranges)) { + | Some(range) => + let guy = guy_of(id, t, range); + Id.Map.add(guy.last_id, guy, acc); | _ => print_endline("ERROR: mk_nu_proj_map: no term range for projector"); acc; @@ -186,7 +191,8 @@ let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { }; let mk_start_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); - +let mk_last_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => + Map.fold(proj_info_rev(term_ranges), projectors, Id.Map.empty); /* projector map has ids of projectors can use infomap to get ancestors of projectors diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index a745efeba2..dfe4b22edf 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -364,11 +364,11 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { switch (d) { | Left => let p = ListUtil.last(seg); - let m = Measured.find_p(p, measured); + let m = Measured.find_p(~msg="base_point", p, measured); m.last; | Right => let p = List.hd(seg); - let m = Measured.find_p(p, measured); + let m = Measured.find_p(~msg="base_point", p, measured); m.origin; }; | None => {row: 0, col: 0} diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 0d81ad61e0..67152a68a0 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -25,6 +25,7 @@ let movability = (chunkiness: chunkiness, label, delim_idx): movability => { let neighbor_movability = ( start_map: Projector.start_map, + last_map: Projector.start_map, chunkiness: chunkiness, {relatives: {siblings, ancestors}, projectors, _}: t, ) @@ -39,20 +40,25 @@ let neighbor_movability = ) }; let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); + let seg = (siblings |> fst) @ (siblings |> snd); + "seg:" |> print_endline; + seg |> Segment.show |> print_endline; let l = switch (l_nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => - let seg = (siblings |> fst |> List.rev) @ (siblings |> snd); - let next_id = + | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => + let prev_id = switch (Projector.split_seg(seg, projectors)) { - | Some(([_, ..._] as xs, _, _, _)) => - Piece.id(List.hd(List.rev(xs))) - | _ => Id.invalid //TODO(andrew) + | Some(([_, ..._] as xs, _, _, _)) => Piece.id(ListUtil.last(xs)) + | Some(([], _, _, _)) => + print_endline("prev_id: empty pre"); + Id.invalid; //TODO(andrew) + | None => + print_endline("prev_id: None"); + Id.invalid; //TODO(andrew) }; - Projected( - next_id, - // (Projector.Map.find(Piece.id(p), start_map) |> Option.get).last_id, - ); + "prev_id:" |> print_endline; + prev_id |> Id.show |> print_endline; + Projected(prev_id); | Some(Tile({label, _})) => movability(label, List.length(label) - 1) | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 @@ -67,16 +73,12 @@ let neighbor_movability = let r = switch (r_nhbr) { | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => - let seg = (siblings |> fst |> List.rev) @ (siblings |> snd); let next_id = switch (Projector.split_seg(seg, projectors)) { | Some((_, _, [hd, ..._], _)) => Piece.id(hd) | _ => Id.invalid //TODO(andrew) }; - Projected( - next_id, - // (Projector.Map.find(Piece.id(p), start_map) |> Option.get).last_id, - ); + Projected(next_id); | Some(Tile({label, _})) => movability(label, 0) | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 @@ -121,7 +123,11 @@ module Make = (M: Editor.Meta.S) => { }; let primary = (chunkiness: chunkiness, d: Direction.t, z: t): option(t) => { - switch (d, z.caret, neighbor_movability(M.start_map, chunkiness, z)) { + switch ( + d, + z.caret, + neighbor_movability(M.start_map, M.last_map, chunkiness, z), + ) { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) @@ -133,8 +139,7 @@ module Make = (M: Editor.Meta.S) => { z => Zipper.move(Left, z), z => switch (z.relatives.siblings) { - | ([_, ..._] as ls, _) => - Piece.id(List.hd(List.rev(ls))) == last_id + | ([_, ..._] as ls, _) => Piece.id(ListUtil.last(ls)) == last_id | _ => false }, z, @@ -155,10 +160,17 @@ module Make = (M: Editor.Meta.S) => { z => switch (z.relatives.siblings) { | (_, [r, ..._]) => Piece.id(r) == last_id + // | ([_, ..._] as ls, _) => + // Piece.id(List.hd(List.rev(ls))) == last_id | _ => false }, z, - ); + ) + |> Option.map(z => { + print_endline("Right Projected Done"); + z |> Zipper.show |> print_endline; + z; + }); // |> OptUtil.and_then(z => // do_until( // z => Zipper.move(Right, z), diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index de728ad66e..c7af673096 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -65,7 +65,7 @@ module Text = (M: { let map: Measured.t; let settings: Settings.t; }) => { - let m = p => Measured.find_p(p, M.map); + let m = p => Measured.find_p(~msg="Text", p, M.map); let rec of_segment = (buffer_ids, no_sorts, sort, seg: Segment.t): list(Node.t) => { /* note: no_sorts flag is used for backpack view; @@ -123,7 +123,7 @@ let rec holes = EmptyHoleDec.view( ~font_metrics, // TODO(d) fix sort { - measurement: Measured.find_g(g, map), + measurement: Measured.find_g(~msg="Code.holes", g, map), mold: Mold.of_grout(g, Any), }, ), @@ -152,7 +152,7 @@ let of_hole = (~font_metrics, ~measured, g: Grout.t) => EmptyHoleDec.view( ~font_metrics, { - measurement: Measured.find_g(g, measured), + measurement: Measured.find_g(~msg="Code.of_hole", g, measured), mold: Mold.of_grout(g, Any), }, ); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index e5cfacc04d..78e07e51b7 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -45,11 +45,23 @@ module Deco = switch (p) { | Tile(t) => sel_of_tile(~start_shape, t) | Grout(g) => [ - Some(sel_shard_svg(~start_shape, Measured.find_g(g, M.map), p)), + Some( + sel_shard_svg( + ~start_shape, + Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), + p, + ), + ), ] | Secondary(w) when Secondary.is_linebreak(w) => [None] | Secondary(w) => [ - Some(sel_shard_svg(~start_shape, Measured.find_w(w, M.map), p)), + Some( + sel_shard_svg( + ~start_shape, + Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), + p, + ), + ), ] }; let start_shape = @@ -61,7 +73,7 @@ module Deco = } and sel_of_tile = (~start_shape, t: Tile.t): list(option(shard_data)) => { let tile_shards = - Measured.find_shards(t, M.map) + Measured.find_shards(~msg="sel_of_tile", t, M.map) |> List.filter(((i, _)) => List.mem(i, t.shards)) |> List.map(((index, measurement)) => [ @@ -122,8 +134,8 @@ module Deco = switch (TermRanges.find_opt(Piece.id(p), M.term_ranges)) { | None => None | Some((p_l, p_r)) => - let l = Measured.find_p(p_l, M.map).origin; - let r = Measured.find_p(p_r, M.map).last; + let l = Measured.find_p(~msg="Deco.indicated", p_l, M.map).origin; + let r = Measured.find_p(~msg="Deco.indicated", p_r, M.map).last; Some((l, r)); }; }; @@ -144,7 +156,11 @@ module Deco = * |> List.filter(id => id >= 0)*/ |> List.map(id => { let t = tile(id); - (id, t.mold, Measured.find_shards(t, M.map)); + ( + id, + t.mold, + Measured.find_shards(~msg="Deco.indicated", t, M.map), + ); }); PieceDec.indicated( ~font_metrics, @@ -177,10 +193,10 @@ module Deco = switch (Siblings.neighbors((l, r))) { | (None, None) => failwith("impossible") | (_, Some(p)) => - let m = Measured.find_p(p, M.map); + let m = Measured.find_p(~msg="Deco.targets", p, M.map); Measured.{origin: m.origin, last: m.origin}; | (Some(p), _) => - let m = Measured.find_p(p, M.map); + let m = Measured.find_p(~msg="Deco.targets", p, M.map); Measured.{origin: m.last, last: m.last}; }; let profile = @@ -227,8 +243,8 @@ module Deco = ((Measured.Point.t, Measured.Point.t, SvgUtil.Path.t)) => Node.t, ) => { let (p_l, p_r) = TermRanges.find(id, M.term_ranges); - let l = Measured.find_p(p_l, M.map).origin; - let r = Measured.find_p(p_r, M.map).last; + let l = Measured.find_p(~msg="Deco.term", p_l, M.map).origin; + let r = Measured.find_p(~msg="Deco.term", p_r, M.map).last; open SvgUtil.Path; let r_edge = ListUtil.range(~lo=l.row, r.row + 1) From 2997c0232243ef32d4a2c6e117e3120eae0b03c4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 21 Feb 2024 23:24:32 -0500 Subject: [PATCH 016/168] deco for folds --- src/haz3lcore/zipper/Projector.re | 2 +- src/haz3lcore/zipper/action/Move.re | 16 ++++++------ src/haz3lweb/view/Deco.re | 39 ++++++++++++++++++++++++++++- src/haz3lweb/view/FoldView.re | 12 +++++++++ src/haz3lweb/view/dec/DecUtil.re | 24 ++++++++++++------ src/haz3lweb/www/style.css | 22 +++++++++++++--- 6 files changed, 94 insertions(+), 21 deletions(-) create mode 100644 src/haz3lweb/view/FoldView.re diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 2d67751f5e..402c5a6311 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -106,7 +106,7 @@ let placeholder_tile = (s: string, id: Id.t): Tile.t => { let project_mid = (id, p: option(t), mid): Segment.t => //TODO(andrew): prrobably shouldn't just duplicate this id in the general case? switch (p) { - | Some(Fold) => [Tile(placeholder_tile("%", id))] + | Some(Fold) => [Tile(placeholder_tile(" ", id))] //[Grout({id, shape: Convex})] | Some(Normal) | None => mid diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 67152a68a0..5c2a0ebd85 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -41,8 +41,8 @@ let neighbor_movability = }; let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); let seg = (siblings |> fst) @ (siblings |> snd); - "seg:" |> print_endline; - seg |> Segment.show |> print_endline; + // "seg:" |> print_endline; + //seg |> Segment.show |> print_endline; let l = switch (l_nhbr) { | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => @@ -50,14 +50,14 @@ let neighbor_movability = switch (Projector.split_seg(seg, projectors)) { | Some(([_, ..._] as xs, _, _, _)) => Piece.id(ListUtil.last(xs)) | Some(([], _, _, _)) => - print_endline("prev_id: empty pre"); - Id.invalid; //TODO(andrew) + //print_endline("prev_id: empty pre"); + Id.invalid //TODO(andrew) | None => - print_endline("prev_id: None"); - Id.invalid; //TODO(andrew) + //print_endline("prev_id: None"); + Id.invalid //TODO(andrew) }; - "prev_id:" |> print_endline; - prev_id |> Id.show |> print_endline; + //"prev_id:" |> print_endline; + //prev_id |> Id.show |> print_endline; Projected(prev_id); | Some(Tile({label, _})) => movability(label, List.length(label) - 1) | Some(Secondary(w)) when Secondary.is_comment(w) => diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 78e07e51b7..e46b1bc497 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -296,13 +296,50 @@ module Deco = let err_holes = (_z: Zipper.t) => List.map(term_highlight(~clss=["err-hole"]), M.error_ids); + let get = (id, projectors) => + switch (Projector.Map.find(id, projectors)) { + | Some(p) => + switch (Measured.find_by_id(id, M.map)) { + | Some(measurement) => Some((p, measurement)) + | _ => None + } + | None => None + }; + + let projectors = (z: Zipper.t) => + List.filter_map( + ((id, p: Projector.t)) => + switch (p, Measured.find_by_id(id, M.map)) { + | (Fold, Some(measurement)) => + Some(FoldView.base(~font_metrics, measurement)) + | _ => None + }, + Id.Map.bindings(z.projectors), + ); + + let indication_deco = (z: Zipper.t) => + switch (Indicated.index(z)) { + | Some(id) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(p) => + switch (p, Measured.find_by_id(id, M.map)) { + | (Fold, Some(measurement)) => + FoldView.indicated(~font_metrics, measurement) + | _ => indicated_piece_deco(z) + } + | None => indicated_piece_deco(z) + } + | _ => indicated_piece_deco(z) + }; + let all = (zipper, sel_seg) => List.concat([ caret(zipper), - indicated_piece_deco(zipper), + indication_deco(zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), err_holes(zipper), + projectors(zipper), ]); }; diff --git a/src/haz3lweb/view/FoldView.re b/src/haz3lweb/view/FoldView.re new file mode 100644 index 0000000000..7cfb824414 --- /dev/null +++ b/src/haz3lweb/view/FoldView.re @@ -0,0 +1,12 @@ +open Virtual_dom.Vdom; + +let base = (~font_metrics, measurement) => { + let style = + DecUtil.pos_str(~d=DecUtil.abs_style(measurement), font_metrics); + Node.div( + ~attr=Attr.many([Attr.classes(["fold"]), Attr.create("style", style)]), + [Node.text("⋱")], + ); +}; + +let indicated = (~font_metrics as _, _measurement) => []; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index c34c727aef..8138fa62aa 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -59,28 +59,36 @@ let pos_str = (~d: dims, ~fudge: fdims=fzero, font_metrics: FontMetrics.t) => Float.of_int(d.height) *. (font_metrics.row_height +. fudge.height), ); +let abs_style = ({origin, last}: Haz3lcore.Measured.measurement): dims => { + let (left, top) = (origin.col, origin.row); + let (width, height) = ( + abs(last.col - origin.col), + abs(last.row - origin.row + 1), + ); + {left, top, width, height}; +}; + let code_svg_sized = ( ~font_metrics: FontMetrics.t, - ~measurement as {origin, last}: Haz3lcore.Measured.measurement, + ~measurement: Haz3lcore.Measured.measurement, ~base_cls=[], ~path_cls=[], ~fudge: fdims=fzero, paths: list(SvgUtil.Path.cmd), ) => { - let (left, top) = (origin.col, origin.row); - let (width, height) = ( - abs(last.col - origin.col), - abs(last.row - origin.row + 1), - ); - let style = pos_str(~d={left, top, width, height}, ~fudge, font_metrics); + let d = abs_style(measurement); + let style = pos_str(~d, ~fudge, font_metrics); create_svg( "svg", ~attr= Attr.many([ Attr.classes(base_cls), Attr.create("style", style), - Attr.create("viewBox", Printf.sprintf("0 0 %d %d", width, height)), + Attr.create( + "viewBox", + Printf.sprintf("0 0 %d %d", d.width, d.height), + ), Attr.create("preserveAspectRatio", "none"), ]), [SvgUtil.Path.view(~attrs=[Attr.classes(path_cls)], paths)], diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index d988975292..5235fb979e 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -328,12 +328,10 @@ body { display: none; } - #main { grid-row: 2; grid-column: 1 / span 1; overflow: auto; - } #main.Scratch, @@ -678,6 +676,24 @@ select { position: relative; } +.code-container .fold { + position: absolute; + z-index: 4; + display: flex; + justify-content: center; + outline: 0.3px solid #c7b480; + border-radius: 0.2em; + background-color: #f0e7d6; + color: #c7b480; +} +.code-container .fold:hover { + color: rgb(0, 0, 0); + background-color: #c7b480; +} +.code-container .fold svg { + filter: invert(1); +} + .code { /*white-space: nowrap;*/ } @@ -1826,7 +1842,7 @@ svg.expandable path { .cell-item.cell-result .error-msg { padding: 0.25em; color: black; -}; +} .cell-result .icon:hover svg { animation: wobble 0.6s ease 0s 1 normal forwards; From ccbe090e38ea3f99ff1969111322838bbccfcc61 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 21 Feb 2024 23:33:47 -0500 Subject: [PATCH 017/168] fold cleanup --- src/haz3lweb/view/FoldView.re | 16 +++++++++------- src/haz3lweb/view/dec/DecUtil.re | 17 +++++++++-------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/haz3lweb/view/FoldView.re b/src/haz3lweb/view/FoldView.re index 7cfb824414..47cc905525 100644 --- a/src/haz3lweb/view/FoldView.re +++ b/src/haz3lweb/view/FoldView.re @@ -1,12 +1,14 @@ open Virtual_dom.Vdom; +open Node; -let base = (~font_metrics, measurement) => { - let style = - DecUtil.pos_str(~d=DecUtil.abs_style(measurement), font_metrics); - Node.div( - ~attr=Attr.many([Attr.classes(["fold"]), Attr.create("style", style)]), - [Node.text("⋱")], +let base = (~font_metrics, measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["fold"]), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [text("⋱")], ); -}; let indicated = (~font_metrics as _, _measurement) => []; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 8138fa62aa..0451490f0a 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -59,15 +59,16 @@ let pos_str = (~d: dims, ~fudge: fdims=fzero, font_metrics: FontMetrics.t) => Float.of_int(d.height) *. (font_metrics.row_height +. fudge.height), ); -let abs_style = ({origin, last}: Haz3lcore.Measured.measurement): dims => { - let (left, top) = (origin.col, origin.row); - let (width, height) = ( - abs(last.col - origin.col), - abs(last.row - origin.row + 1), - ); - {left, top, width, height}; +let abs_dims = ({origin, last}: Haz3lcore.Measured.measurement): dims => { + left: origin.col, + top: origin.row, + width: abs(last.col - origin.col), + height: abs(last.row - origin.row + 1), }; +let abs_style = (~font_metrics, measurement): Attr.t => + Attr.create("style", pos_str(~d=abs_dims(measurement), font_metrics)); + let code_svg_sized = ( ~font_metrics: FontMetrics.t, @@ -77,7 +78,7 @@ let code_svg_sized = ~fudge: fdims=fzero, paths: list(SvgUtil.Path.cmd), ) => { - let d = abs_style(measurement); + let d = abs_dims(measurement); let style = pos_str(~d, ~fudge, font_metrics); create_svg( "svg", From c5997d169b6b7204cdb2cb9248b297b413252590 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 21 Feb 2024 23:37:40 -0500 Subject: [PATCH 018/168] fold cleanup --- src/haz3lcore/zipper/Projector.re | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 402c5a6311..fd38dd6ec0 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -116,6 +116,8 @@ let project_seg = (p, seg: Segment.t): Segment.t => { // print_endline("project_seg"); switch (split_seg(seg, p)) { | Some((pre, mid_og, suf, proj_id)) => + /*TODO(andrew): need to find a way to handle multiple projectors per segment, + i.e. wasn't thinking about ones in disjoint subtrees */ // print_endline( // "split: segment length: " // ++ string_of_int(List.length(seg)) From b37fcd5f24119e9373e894d8e73c533e8995c399 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 27 Feb 2024 00:08:29 -0500 Subject: [PATCH 019/168] marginally better projection movement behavior --- src/haz3lcore/tiles/Grout.re | 2 + src/haz3lcore/tiles/Piece.re | 7 ++ src/haz3lcore/tiles/Secondary.re | 2 + src/haz3lcore/tiles/Tile.re | 2 + src/haz3lcore/zipper/Editor.re | 23 +++++-- src/haz3lcore/zipper/Projector.re | 90 +++++++++++++++++++++++++- src/haz3lcore/zipper/action/Move.re | 68 +++++++------------ src/haz3lcore/zipper/action/Perform.re | 4 +- src/haz3lweb/util/JsUtil.re | 37 +++++------ src/haz3lweb/view/Deco.re | 43 ++++++------ 10 files changed, 183 insertions(+), 95 deletions(-) diff --git a/src/haz3lcore/tiles/Grout.re b/src/haz3lcore/tiles/Grout.re index 496de68f10..57aa4431fd 100644 --- a/src/haz3lcore/tiles/Grout.re +++ b/src/haz3lcore/tiles/Grout.re @@ -57,3 +57,5 @@ let merge = (gs: list(t)): option(t) => | Some((_, ft)) => hd.shape == ft.shape ? Some(hd) : None } }; + +let update_id = (g: t, id: Id.t): t => {...g, id}; diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index aafeef4a5b..86205585d6 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -145,3 +145,10 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) }; + +let update_id = (p: t, id: Id.t): t => + switch (p) { + | Tile(t) => Tile(Tile.update_id(id, t)) + | Grout(g) => Grout(Grout.update_id(g, id)) + | Secondary(w) => Secondary(Secondary.update_id(w, id)) + }; diff --git a/src/haz3lcore/tiles/Secondary.re b/src/haz3lcore/tiles/Secondary.re index 7ef17b16a1..3f5da66e76 100644 --- a/src/haz3lcore/tiles/Secondary.re +++ b/src/haz3lcore/tiles/Secondary.re @@ -68,3 +68,5 @@ let get_string: secondary_content => string = }; let id = w => w.id; + +let update_id = (w: t, id) => {...w, id}; diff --git a/src/haz3lcore/tiles/Tile.re b/src/haz3lcore/tiles/Tile.re index 10c7c41e42..ae18ee8c90 100644 --- a/src/haz3lcore/tiles/Tile.re +++ b/src/haz3lcore/tiles/Tile.re @@ -156,3 +156,5 @@ let pop_r = (tile: t): (segment, piece) => // }; // }; // }; + +let update_id = (id, t: t) => {...t, id}; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 2567f2b4fd..b6b30f65bc 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -23,7 +23,12 @@ module Meta = { /*NOTE(andrew): consider using segment' for view_term (but terms problematic) */ let (view_term, terms) = MakeTerm.go(segment); let term_ranges = TermRanges.mk(segment); - let measured = Measured.of_segment(segment); + let measured = + Projector.fake_measured( + z.projectors, + Measured.of_segment(segment), + TermRanges.mk(segment') //TODO(andrew): fix perf + ); { col_target: 0, touched: Touched.empty, @@ -72,11 +77,19 @@ module Meta = { let is_edit = Action.is_edit(a); let segment' = is_edit ? Zipper.unselect_and_zip(z) : meta.segment; let segment = Projector.of_segment(z.projectors, segment'); - print_endline("projected segment:"); - segment |> Segment.show |> print_endline; + //print_endline("projected segment:"); + //segment |> Segment.show |> print_endline; + let measured = is_edit - ? Measured.of_segment(~touched, ~old=measured, segment) : measured; + ? Projector.fake_measured( + z.projectors, + Measured.of_segment(~touched, ~old=measured, segment), + //TODO(andrew): needs to be nonprojected segment; fix perf!! + TermRanges.mk(segment'), + ) + : measured; + let term_ranges = is_edit ? TermRanges.mk(segment) : meta.term_ranges; let col_target = switch (a) { | Move(Local(Up | Down)) @@ -87,12 +100,12 @@ module Meta = { //let x = Id.Map.find(i, measured.tiles); | None => print_endline("no indicated_id") }; + print_endline("Editor.next.caret_point"); Zipper.caret_point(measured, z).col; }; let (view_term, terms) = //NOTE(andrew): could use unprojected version here, might be dangerous is_edit ? MakeTerm.go(segment) : (meta.view_term, meta.terms); - let term_ranges = is_edit ? TermRanges.mk(segment) : meta.term_ranges; { col_target, touched, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index fd38dd6ec0..8c1666148f 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -33,8 +33,6 @@ type t = p; let rep_id = (seg, r) => r |> Aba.first_a |> List.nth(seg) |> Piece.id; -let id_at = (seg: Segment.t, skel: Skel.t) => rep_id(seg, Skel.root(skel)); - let rec left_idx = (skel: Skel.t): int => { switch (skel) { | Op(r) @@ -58,9 +56,15 @@ let get_extreme_idxs = (skel: Skel.t): (int, int) => ( right_idx(skel), ); +type projector_range = { + id: Id.t, + start: int, + last: int, +}; + let get_range = (seg: Segment.t, ps: Map.t): option((Id.t, (int, int))) => { let rec go = (skel: Skel.t) => { - let id = id_at(seg, skel); + let id = rep_id(seg, Skel.root(skel)); switch (Id.Map.find_opt(id, ps)) { | Some(_) => let (l, r) = get_extreme_idxs(skel); @@ -191,10 +195,43 @@ let proj_info_rev = (term_ranges, id: Id.t, t: t, acc: start_map) => { acc; }; }; + let mk_start_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); + let mk_last_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => Map.fold(proj_info_rev(term_ranges), projectors, Id.Map.empty); + +let fake_measured = + (p: Map.t, measured: Measured.t, term_ranges: TermRanges.t): Measured.t => + Map.fold( + (id, _p: t, measured: Measured.t) => { + switch ( + Measured.find_by_id(id, measured), + Id.Map.find_opt(id, term_ranges), + ) { + | (Some(m), Some((p_start, p_last))) => + let p_start = Piece.Tile(placeholder_tile(" ", Piece.id(p_start))); + let p_last = Piece.Tile(placeholder_tile(" ", Piece.id(p_last))); + let measured = Measured.add_p(p_start, m, measured); + let measured = Measured.add_p(p_last, m, measured); + print_endline("fake_measured: added placeholder tiles:"); + print_endline("root_id:" ++ Id.to_string(id)); + print_endline("start_id:" ++ Id.to_string(Piece.id(p_start))); + print_endline("last_id:" ++ Id.to_string(Piece.id(p_last))); + measured; + | (Some(_), None) => + print_endline("fake_measured: no term range for projector"); + measured; + | _ => + print_endline("fake_measured: no measurement for projector"); + measured; + } + }, + p, + measured, + ); + /* projector map has ids of projectors can use infomap to get ancestors of projectors @@ -293,6 +330,53 @@ let mk_last_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => a subcell. if so, we (phase i) skip over it or (phase ii) move into it, ie set caret position to Subcell(Id.t,og_caret_pos) + 2024-02-26 + want to add some entries to Measured + right now the placeholder approach is that a monotoken is introduced + with the same id as the projector root term. this seems to work well + in the case where the projector root tile is convex, as this means that + the delims on the left and right of the projected segment are shards of + the same tile. but actually even this creates some issues actually, + see the FuCkNASTY hackzz in Measured. + + in general we are concerned with caret positions to the left and right + of the projected segment. caret_point/base_point is excepting there + because they are looking for ids not found in measured, in the case + of infix operators on both sides so they can't currently be folded. + + not sure if its a good idea, but one approach is to make sure that + the ids in Measured include the left and right delims of the projected + segment instead of the root id. + + but we probably dont want to add multiple tiles to the projection zipper. + but maybe we could add ids after the fact, copying some measurements + by querying the measurements of the placeholder tile. + + collapsed segments: + + [1]: root is 1, L is 1, R is 1 + [(1)]: root is [(,)], L is [(], R is [)] + [1+2] : root is +, L is 1, R is 2 + [let x = 1 in 4] root is [let,=,in], L is [let], R is 4 + (mythical postfix operator:) + [5!] root is [,], L is 5, L is [!] + + ideally the placeholder tile should correspond to the left and right + delims of the projected segment so as to make measured accesses + seamless. so what if: + placeholder tiles uses two shards, one for the left delim and + one for the right delim + then after we run Measured we get the placeholder measurement, + and create (up to) two new entries in the Measured map, one for + the left delim and one for the right delim, + + NOTE: currently the FuCkNASTY occurs on the right delim + of a collapsed "(1+2)" segment, but not a "1" segment + + can fold [fun, ->], but crash (base_point find_p) if we try + to move right when on left side of collapse + + can't fold "1+2" from any side (crash) */ diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 5c2a0ebd85..01b76be637 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -91,7 +91,10 @@ let neighbor_movability = }; module Make = (M: Editor.Meta.S) => { - let caret_point = Zipper.caret_point(M.measured); + let caret_point = t => { + print_endline("Move.caret_point"); + Zipper.caret_point(M.measured, t); + }; let pop_out = z => Some(z |> Zipper.set_caret(Outer)); let pop_move = (d, z) => z |> Zipper.set_caret(Outer) |> Zipper.move(d); @@ -132,18 +135,15 @@ module Make = (M: Editor.Meta.S) => { (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) | (Left, Outer, (Projected(last_id), _)) => - print_endline("Left Projected"); - z |> Zipper.show |> print_endline; - do_until_sib( - ~move_first=false, - z => Zipper.move(Left, z), - z => - switch (z.relatives.siblings) { - | ([_, ..._] as ls, _) => Piece.id(ListUtil.last(ls)) == last_id - | _ => false - }, - z, - ); + //print_endline("Left Projected"); + //z |> Zipper.show |> print_endline; + //TODO: infinite loop stopping condition? + let left_of_proj = z => + switch (z.relatives.siblings) { + | ([_, ..._] as ls, _) => Piece.id(ListUtil.last(ls)) == last_id + | _ => false + }; + do_until_sib(~move_first=false, Zipper.move(Left), left_of_proj, z); | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) @@ -151,39 +151,15 @@ module Make = (M: Editor.Meta.S) => { | (Left, Inner(_), _) => Some(Zipper.update_caret(Zipper.Caret.decrement, z)) | (Right, Outer, (_, Projected(last_id))) => - print_endline("Right Projected"); - z |> Zipper.show |> print_endline; - // let z = Zipper.set_caret(Outer, z); - do_until_sib( - ~move_first=false, - z => Zipper.move(Right, z), - z => - switch (z.relatives.siblings) { - | (_, [r, ..._]) => Piece.id(r) == last_id - // | ([_, ..._] as ls, _) => - // Piece.id(List.hd(List.rev(ls))) == last_id - | _ => false - }, - z, - ) - |> Option.map(z => { - print_endline("Right Projected Done"); - z |> Zipper.show |> print_endline; - z; - }); - // |> OptUtil.and_then(z => - // do_until( - // z => Zipper.move(Right, z), - // piece => Piece.id(piece) != last_id, - // z, - // ) - // ) - // |> Option.map(z => { - // print_endline("Right Projected Done"); - // z |> Zipper.show |> print_endline; - // z; - // }); - + //print_endline("Right Projected"); + //z |> Zipper.show |> print_endline; + //TODO: infinite loop stopping condition? + let right_of_proj = z => + switch (z.relatives.siblings) { + | (_, [r, ..._]) => Piece.id(r) == last_id + | _ => false + }; + do_until_sib(~move_first=false, Zipper.move(Right), right_of_proj, z); | (Right, Outer, (_, CanEnter(d_init, _))) => inner_start(d_init, z) | (Right, Outer, _) => Zipper.move(d, z) | (Right, Inner(_, c), (_, CanEnter(_, c_max))) when c == c_max => diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 51e3498e00..ec8f99691a 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -75,10 +75,10 @@ let go_z = let z = Project.go(p, z); //TODO(andrew): clean up hacky movement switch (Move.to_start(z)) { - | None => Error(Action.Failure.Cant_move) + | None => Ok(z) | Some(z) => switch (Move.jump_to_id(z, id)) { - | None => Error(Action.Failure.Cant_move) + | None => Ok(z) | Some(z) => Ok(z) } }; diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index d9a7efc7fc..1b8685f6b3 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -3,13 +3,11 @@ open Virtual_dom.Vdom; let get_elem_by_id = id => { let doc = Dom_html.document; - Js.Opt.get( - doc##getElementById(Js.string(id)), - () => { - print_endline(id); - assert(false); - }, - ); + Js.Opt.get(doc##getElementById(Js.string(id)), () => { + assert + (false) + //print_endline(id); + }); }; let date_now = () => { @@ -123,21 +121,18 @@ let copy = (str: string) => { ); }; -let scroll_cursor_into_view_if_needed = () => - try({ - let caret_elem = get_elem_by_id("caret"); - let main = get_elem_by_id("main"); - let main_rect = main##getBoundingClientRect; - let caret_rect = caret_elem##getBoundingClientRect; - - if (caret_rect##.top < main_rect##.top) { - caret_elem##scrollIntoView(Js._true); - } else if (caret_rect##.bottom > main_rect##.bottom) { - caret_elem##scrollIntoView(Js._false); - }; - }) { - | Assert_failure(_) => () +let scroll_cursor_into_view_if_needed = () => { + let caret_elem = get_elem_by_id("caret"); + let main = get_elem_by_id("main"); + let main_rect = main##getBoundingClientRect; + let caret_rect = caret_elem##getBoundingClientRect; + + if (caret_rect##.top < main_rect##.top) { + caret_elem##scrollIntoView(Js._true); + } else if (caret_rect##.bottom > main_rect##.bottom) { + caret_elem##scrollIntoView(Js._false); }; +}; module Fragment = { let set_current = frag => { diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index e46b1bc497..e185fb6e59 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -19,6 +19,7 @@ module Deco = let tile = id => Id.Map.find(id, M.tiles); let caret = (z: Zipper.t): list(Node.t) => { + print_endline("Deco.caret_point"); let origin = Zipper.caret_point(M.map, z); let shape = Zipper.caret_direction(z); let side = @@ -223,13 +224,16 @@ module Deco = }; }; - let backpack = (z: Zipper.t): list(Node.t) => [ - BackpackView.view( - ~font_metrics, - ~origin=Zipper.caret_point(M.map, z), - z, - ), - ]; + let backpack = (z: Zipper.t): list(Node.t) => { + print_endline("Deco.backpack.caret_point"); + [ + BackpackView.view( + ~font_metrics, + ~origin=Zipper.caret_point(M.map, z), + z, + ), + ]; + }; let targets' = (backpack, seg) => { M.show_backpack_targets && Backpack.restricted(backpack) @@ -296,7 +300,7 @@ module Deco = let err_holes = (_z: Zipper.t) => List.map(term_highlight(~clss=["err-hole"]), M.error_ids); - let get = (id, projectors) => + let get_proj_measure = (id, projectors) => switch (Projector.Map.find(id, projectors)) { | Some(p) => switch (Measured.find_by_id(id, M.map)) { @@ -308,10 +312,13 @@ module Deco = let projectors = (z: Zipper.t) => List.filter_map( - ((id, p: Projector.t)) => - switch (p, Measured.find_by_id(id, M.map)) { - | (Fold, Some(measurement)) => - Some(FoldView.base(~font_metrics, measurement)) + ((id, _p)) => + switch (get_proj_measure(id, z.projectors)) { + | Some((p, measurement)) => + switch (p) { + | Fold => Some(FoldView.base(~font_metrics, measurement)) + | Normal => None + } | _ => None }, Id.Map.bindings(z.projectors), @@ -320,12 +327,11 @@ module Deco = let indication_deco = (z: Zipper.t) => switch (Indicated.index(z)) { | Some(id) => - switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => - switch (p, Measured.find_by_id(id, M.map)) { - | (Fold, Some(measurement)) => - FoldView.indicated(~font_metrics, measurement) - | _ => indicated_piece_deco(z) + switch (get_proj_measure(id, z.projectors)) { + | Some((p, measurement)) => + switch (p) { + | Fold => FoldView.indicated(~font_metrics, measurement) + | Normal => indicated_piece_deco(z) } | None => indicated_piece_deco(z) } @@ -334,6 +340,7 @@ module Deco = let all = (zipper, sel_seg) => List.concat([ + //[Node.div(~attr=Attr.id("caret"), [])], caret(zipper), indication_deco(zipper), selected_pieces(zipper), From 4be102023c0cc041aa0d89828f7343d8d88e23a5 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 5 Mar 2024 21:32:53 -0500 Subject: [PATCH 020/168] note --- src/haz3lcore/zipper/Projector.re | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 8c1666148f..ed8475706f 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -373,10 +373,11 @@ let fake_measured = NOTE: currently the FuCkNASTY occurs on the right delim of a collapsed "(1+2)" segment, but not a "1" segment - can fold [fun, ->], but crash (base_point find_p) if we try - to move right when on left side of collapse - - can't fold "1+2" from any side (crash) + Current status: + singletons and convex seem to work fine + can fold [fun, ->] and [let, =, in], can unfold (from one side at least), + some movement problems + can fold infix ops if surrounded by parens; movement bugged, cant unfold */ From ee16647b37379690f7b6f485a808860354903c15 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 30 Apr 2024 00:00:29 -0400 Subject: [PATCH 021/168] skipTo logic for movement --- src/haz3lcore/zipper/action/Move.re | 103 ++++-------------- .../zipper/action/ProjectorAction.re | 88 +++++++++++++++ 2 files changed, 108 insertions(+), 83 deletions(-) create mode 100644 src/haz3lcore/zipper/action/ProjectorAction.re diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 1378607ba1..19a8144c9d 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -6,7 +6,7 @@ open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] type movability = | CanEnter(int, int) - | Projected(Id.t) + | SkipTo(Id.t) | CanPass | CantEven; @@ -27,7 +27,7 @@ let neighbor_movability = start_map: Projector.start_map, last_map: Projector.start_map, chunkiness: chunkiness, - {relatives: {siblings, ancestors}, projectors, _}: t, + {relatives: {siblings, ancestors}, _} as z: t, ) : (movability, movability) => { let movability = movability(chunkiness); @@ -40,99 +40,36 @@ let neighbor_movability = ) }; let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); - let seg = (siblings |> fst) @ (siblings |> snd); - // "seg:" |> print_endline; - //seg |> Segment.show |> print_endline; + let (l_proj, r_proj) = ProjectorAction.neighbor_is(start_map, last_map, z); let l = - switch (l_nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => - let prev_id = - switch (Projector.split_seg(seg, projectors)) { - | Some(([_, ..._] as xs, _, _, _)) => Piece.id(ListUtil.last(xs)) - | Some(([], _, _, _)) => - switch (Ancestors.parent(ancestors)) { - | Some(a) => - print_endline("prev_id: empty pre using parent"); - a.id; - | None => - print_endline("prev_id: empty pre no ancestor"); - Id.invalid; //TODO(andrew) - } - | None => - print_endline("prev_id: None"); - Id.invalid; //TODO(andrew) - }; - Projected(prev_id); - | Some(Tile({label, _})) => movability(label, List.length(label) - 1) - | Some(Secondary(w)) when Secondary.is_comment(w) => + switch (l_proj, l_nhbr) { + | (Some(l_proj_id), _) => SkipTo(l_proj_id) + | (None, Some(Tile({label, _}))) => + movability(label, List.length(label) - 1) + | (None, Some(Secondary(w))) when Secondary.is_comment(w) => // Comments are always length >= 2 let content_string = Secondary.get_string(w.content); CanEnter( Unicode.length(content_string) - 1, Unicode.length(content_string) - 2, ); - | Some(_) => CanPass - | _ => supernhbr_l + | (None, Some(Secondary(_) | Grout(_))) => CanPass + | (None, None) => supernhbr_l }; let r = - switch (r_nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => - let next_id = - switch (Projector.split_seg(seg, projectors)) { - | Some((_, _, [hd, ..._], _)) => Piece.id(hd) - | _ => - print_endline("next_id: empty post"); - Id.invalid; //TODO(andrew) - }; - Projected(next_id); - | Some(Tile({label, _})) => movability(label, 0) - | Some(Secondary(w)) when Secondary.is_comment(w) => + switch (r_proj, r_nhbr) { + | (Some(r_proj_id), _) => SkipTo(r_proj_id) + | (None, Some(Tile({label, _}))) => movability(label, 0) + | (None, Some(Secondary(w))) when Secondary.is_comment(w) => // Comments are always length >= 2 let content_string = Secondary.get_string(w.content); CanEnter(0, Unicode.length(content_string) - 2); - | Some(_) => CanPass - | _ => supernhbr_r + | (None, Some(Secondary(_) | Grout(_))) => CanPass + | (None, None) => supernhbr_r }; (l, r); }; -module Projector = { - /* Do move_action until the indicated piece is such that piece_p is true. - If no such piece is found, don't move. */ - let rec do_until_sib = - (move: t => option(t), z_pred: Zipper.t => bool, z: t): option(t) => { - z_pred(z) - ? Some(z) - : { - let* z = move(z); - do_until_sib(move, z_pred, z); - }; - }; - - let is_right_of = (pid: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | ((_, [r, ..._]), _) => Piece.id(r) == pid - | ((_, []), []) => true // end of program - | ((_, []), _) => false - }; - - let is_left_of = (pid: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == pid - | (([], _), []) => true // beginning of program - | (([], _), _) => false - }; - - let is_on = (d: Direction.t, pid: Id.t) => - switch (d) { - | Left => is_left_of(pid) - | Right => is_right_of(pid) - }; - - let move_over = (d: Direction.t, proj_id, z) => - do_until_sib(Zipper.move(d), is_on(d, proj_id), z); -}; - module Make = (M: Editor.Meta.S) => { let caret_point = t => { // print_endline("Move.caret_point"); @@ -158,12 +95,12 @@ module Make = (M: Editor.Meta.S) => { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) - | (Left, Outer, (Projected(pid), _)) => + | (Left, Outer, (SkipTo(pid), _)) => // print_endline("Left Projected"); - Projector.move_over(Left, pid, z) - | (Right, Outer, (_, Projected(pid))) => + ProjectorAction.Move.over(Left, pid, z) + | (Right, Outer, (_, SkipTo(pid))) => // print_endline("Right Projected"); - Projector.move_over(Right, pid, z) + ProjectorAction.Move.over(Right, pid, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re new file mode 100644 index 0000000000..8edb692dfc --- /dev/null +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -0,0 +1,88 @@ +open Zipper; +open Util; +open OptUtil.Syntax; + +let get_id_before = (seg, ancestors, projectors) => + switch (Projector.split_seg(seg, projectors)) { + | Some(([_, ..._] as xs, _, _, _)) => Piece.id(ListUtil.last(xs)) + | Some(([], _, _, _)) => + switch (Ancestors.parent(ancestors)) { + | Some(a) => + print_endline("prev_id: empty pre using parent"); + a.id; + | None => + print_endline("prev_id: empty pre no ancestor"); + Id.invalid; //TODO(andrew) + } + | None => + print_endline("prev_id: None"); + Id.invalid; //TODO(andrew) + }; + +let get_id_after = (seg, projectors) => + switch (Projector.split_seg(seg, projectors)) { + | Some((_, _, [hd, ..._], _)) => Piece.id(hd) + | _ => + print_endline("next_id: empty post"); + Id.invalid; //TODO(andrew) + }; + +let neighbor_is = + ( + start_map: Projector.start_map, + last_map: Projector.start_map, + {relatives: {siblings, ancestors}, projectors, _}: t, + ) + : (option(Id.t), option(Id.t)) => { + let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); + let seg = (siblings |> fst) @ (siblings |> snd); + let l = + switch (l_nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => + Some(get_id_before(seg, ancestors, projectors)) + | _ => None + }; + let r = + switch (r_nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => + Some(get_id_after(seg, projectors)) + | _ => None + }; + (l, r); +}; + +module Move = { + /* Do move_action until the indicated piece is such that piece_p is true. + If no such piece is found, don't move. */ + let rec do_until_sib = + (move: t => option(t), z_pred: Zipper.t => bool, z: t): option(t) => + z_pred(z) + ? Some(z) + : { + let* z = move(z); + do_until_sib(move, z_pred, z); + }; + + let is_right_of = (pid: Id.t, z) => + switch (z.relatives.siblings, z.relatives.ancestors) { + | ((_, [r, ..._]), _) => Piece.id(r) == pid + | ((_, []), []) => true // end of program + | ((_, []), _) => false + }; + + let is_left_of = (pid: Id.t, z) => + switch (z.relatives.siblings, z.relatives.ancestors) { + | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == pid + | (([], _), []) => true // beginning of program + | (([], _), _) => false + }; + + let is_on = (d: Direction.t, pid: Id.t) => + switch (d) { + | Left => is_left_of(pid) + | Right => is_right_of(pid) + }; + + let over = (d: Direction.t, proj_id, z) => + do_until_sib(Zipper.move(d), is_on(d, proj_id), z); +}; From f4d10f123b1ba514e034e69adfbcb35465a3b872 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 30 Apr 2024 00:38:56 -0400 Subject: [PATCH 022/168] basic selectability for leaf projectors --- src/haz3lcore/zipper/action/Move.re | 6 +- .../zipper/action/ProjectorAction.re | 86 ++++++++++++------- src/haz3lcore/zipper/action/Select.re | 14 ++- src/haz3lweb/view/Deco.re | 45 ++++++---- 4 files changed, 97 insertions(+), 54 deletions(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 19a8144c9d..3b75437a8a 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -96,11 +96,9 @@ module Make = (M: Editor.Meta.S) => { (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) | (Left, Outer, (SkipTo(pid), _)) => - // print_endline("Left Projected"); - ProjectorAction.Move.over(Left, pid, z) + ProjectorAction.skip_to(Left, pid, z) | (Right, Outer, (_, SkipTo(pid))) => - // print_endline("Right Projected"); - ProjectorAction.Move.over(Right, pid, z) + ProjectorAction.skip_to(Right, pid, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 8edb692dfc..4227f97f15 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -51,38 +51,64 @@ let neighbor_is = (l, r); }; -module Move = { - /* Do move_action until the indicated piece is such that piece_p is true. - If no such piece is found, don't move. */ - let rec do_until_sib = - (move: t => option(t), z_pred: Zipper.t => bool, z: t): option(t) => - z_pred(z) - ? Some(z) - : { - let* z = move(z); - do_until_sib(move, z_pred, z); - }; - - let is_right_of = (pid: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | ((_, [r, ..._]), _) => Piece.id(r) == pid - | ((_, []), []) => true // end of program - | ((_, []), _) => false +/* Do move_action until the indicated piece is such that piece_p is true. + If no such piece is found, don't move. */ +let rec do_until_sib = + (move: t => option(t), z_pred: Zipper.t => bool, z: t): option(t) => + z_pred(z) + ? Some(z) + : { + let* z = move(z); + do_until_sib(move, z_pred, z); }; - let is_left_of = (pid: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == pid - | (([], _), []) => true // beginning of program - | (([], _), _) => false - }; +let is_right_of = (pid: Id.t, z) => + switch (z.relatives.siblings, z.relatives.ancestors) { + | ((_, [r, ..._]), _) => Piece.id(r) == pid + | ((_, []), []) => true // end of program + | ((_, []), _) => false + }; - let is_on = (d: Direction.t, pid: Id.t) => - switch (d) { - | Left => is_left_of(pid) - | Right => is_right_of(pid) - }; +let is_left_of = (pid: Id.t, z) => + switch (z.relatives.siblings, z.relatives.ancestors) { + | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == pid + | (([], _), []) => true // beginning of program + | (([], _), _) => false + }; + +let is_on = (d: Direction.t, pid: Id.t) => + switch (d) { + | Left => is_left_of(pid) + | Right => is_right_of(pid) + }; + +let skip_to = (d: Direction.t, proj_id, z) => { + // print_endline("ProjectorAction.skip_to"); + do_until_sib( + Zipper.move(d), + is_on(d, proj_id), + z, + ); +}; + +//TODO(andrew): relocalize +let primary' = (d: Direction.t, z: Zipper.t): option(Zipper.t) => + if (z.caret == Outer) { + Zipper.select(d, z); + } else if (d == Left) { + z + |> Zipper.set_caret(Outer) + |> Zipper.move(Right) + |> OptUtil.and_then(Zipper.select(d)); + } else { + z |> Zipper.set_caret(Outer) |> Zipper.select(d); + }; - let over = (d: Direction.t, proj_id, z) => - do_until_sib(Zipper.move(d), is_on(d, proj_id), z); +let skip_select_to = (d: Direction.t, proj_id, z) => { + // print_endline("ProjectorAction.skip_to"); + do_until_sib( + z => z |> primary'(d), + is_on(d, proj_id), + z, + ); }; diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 143ce6a29b..103a4e47b7 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -4,7 +4,7 @@ open OptUtil.Syntax; module Make = (M: Editor.Meta.S) => { module Move = Move.Make(M); - let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => + let primary' = (d: Direction.t, z: Zipper.t): option(Zipper.t) => if (z.caret == Outer) { Zipper.select(d, z); } else if (d == Left) { @@ -16,6 +16,18 @@ module Make = (M: Editor.Meta.S) => { z |> Zipper.set_caret(Outer) |> Zipper.select(d); }; + let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => { + let (l_proj, r_proj) = + ProjectorAction.neighbor_is(M.start_map, M.last_map, z); + switch (d, z.caret, (l_proj, r_proj)) { + | (Left, Outer, (Some(id), _)) => + ProjectorAction.skip_select_to(Left, id, z) + | (Right, Outer, (_, Some(id))) => + ProjectorAction.skip_select_to(Right, id, z) + | _ => primary'(d, z) + }; + }; + let vertical = (d: Direction.t, ed: Zipper.t): option(Zipper.t) => Move.do_vertical(primary, d, ed); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 77625b4bd5..92fc01c3e3 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -43,27 +43,34 @@ module Deco = (start_shape: Nib.Shape.t, p: Piece.t) : (Nib.Shape.t, list(option(shard_data))) => { let shard_data = - switch (p) { - | Tile(t) => sel_of_tile(~start_shape, t) - | Grout(g) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), - p, + try( + switch (p) { + | Tile(t) => sel_of_tile(~start_shape, t) + | Grout(g) => [ + Some( + sel_shard_svg( + ~start_shape, + Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), + p, + ), ), - ), - ] - | Secondary(w) when Secondary.is_linebreak(w) => [None] - | Secondary(w) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), - p, + ] + | Secondary(w) when Secondary.is_linebreak(w) => [None] + | Secondary(w) => [ + Some( + sel_shard_svg( + ~start_shape, + Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), + p, + ), ), - ), - ] + ] + } + ) { + | _ => + //TODO(andrew): relax. this is the case when tiles are missing + //measured info due to being hidden by a projector + [] }; let start_shape = switch (Piece.nibs(p)) { From a08e621d97394dcefcbc1f53e6dc9b3ead73172c Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 30 Apr 2024 01:08:10 -0400 Subject: [PATCH 023/168] cleanup --- src/haz3lcore/zipper/Zipper.re | 19 +++++++ .../zipper/action/ProjectorAction.re | 56 ++++++------------- src/haz3lcore/zipper/action/Select.re | 25 +++------ 3 files changed, 42 insertions(+), 58 deletions(-) diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index dfe4b22edf..f229d4f454 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -230,6 +230,15 @@ let move = (d: Direction.t, z: t): option(t) => let select = (d: Direction.t, z: t): option(t) => d == z.selection.focus ? grow_selection(z) : shrink_selection(z); +let select_caret = (d: Direction.t, z: t): option(t) => + if (z.caret == Outer) { + select(d, z); + } else if (d == Left) { + z |> set_caret(Outer) |> move(Right) |> OptUtil.and_then(select(d)); + } else { + z |> set_caret(Outer) |> select(d); + }; + let pick_up = (z: t): t => { let (selected, z) = update_selection(Selection.empty, z); let selection = @@ -473,3 +482,13 @@ let seg_for_view = smart_seg(~erase_buffer=false, ~dump_backpack=false); let seg_for_sem = smart_seg(~erase_buffer=true, ~dump_backpack=true); let seg_without_buffer = smart_seg(~erase_buffer=true, ~dump_backpack=false); + +/* Loop action until pred is satisfied */ +let rec do_until = + (action: t => option(t), pred: t => bool, z: t): option(t) => + pred(z) + ? Some(z) + : { + let* z = action(z); + do_until(action, pred, z); + }; diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 4227f97f15..0736c7228d 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -1,6 +1,6 @@ open Zipper; open Util; -open OptUtil.Syntax; +//open OptUtil.Syntax; let get_id_before = (seg, ancestors, projectors) => switch (Projector.split_seg(seg, projectors)) { @@ -51,64 +51,40 @@ let neighbor_is = (l, r); }; -/* Do move_action until the indicated piece is such that piece_p is true. - If no such piece is found, don't move. */ -let rec do_until_sib = - (move: t => option(t), z_pred: Zipper.t => bool, z: t): option(t) => - z_pred(z) - ? Some(z) - : { - let* z = move(z); - do_until_sib(move, z_pred, z); - }; - -let is_right_of = (pid: Id.t, z) => +let is_right_of = (id: Id.t, z) => switch (z.relatives.siblings, z.relatives.ancestors) { - | ((_, [r, ..._]), _) => Piece.id(r) == pid + | ((_, [r, ..._]), _) => Piece.id(r) == id | ((_, []), []) => true // end of program | ((_, []), _) => false }; -let is_left_of = (pid: Id.t, z) => +let is_left_of = (id: Id.t, z) => switch (z.relatives.siblings, z.relatives.ancestors) { - | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == pid + | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id | (([], _), []) => true // beginning of program | (([], _), _) => false }; -let is_on = (d: Direction.t, pid: Id.t) => +let is_on = (d: Direction.t, id: Id.t) => switch (d) { - | Left => is_left_of(pid) - | Right => is_right_of(pid) + | Left => is_left_of(id) + | Right => is_right_of(id) }; -let skip_to = (d: Direction.t, proj_id, z) => { +let skip_to = (d: Direction.t, id, z) => { // print_endline("ProjectorAction.skip_to"); - do_until_sib( + Zipper.do_until( Zipper.move(d), - is_on(d, proj_id), + is_on(d, id), z, ); }; -//TODO(andrew): relocalize -let primary' = (d: Direction.t, z: Zipper.t): option(Zipper.t) => - if (z.caret == Outer) { - Zipper.select(d, z); - } else if (d == Left) { - z - |> Zipper.set_caret(Outer) - |> Zipper.move(Right) - |> OptUtil.and_then(Zipper.select(d)); - } else { - z |> Zipper.set_caret(Outer) |> Zipper.select(d); - }; - -let skip_select_to = (d: Direction.t, proj_id, z) => { - // print_endline("ProjectorAction.skip_to"); - do_until_sib( - z => z |> primary'(d), - is_on(d, proj_id), +let skip_select_to = (d: Direction.t, id, z) => { + // print_endline("ProjectorAction.skip_select_to"); + Zipper.do_until( + Zipper.select_caret(d), + is_on(d, id), z, ); }; diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 103a4e47b7..6c86b3c266 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -4,29 +4,18 @@ open OptUtil.Syntax; module Make = (M: Editor.Meta.S) => { module Move = Move.Make(M); - let primary' = (d: Direction.t, z: Zipper.t): option(Zipper.t) => - if (z.caret == Outer) { - Zipper.select(d, z); - } else if (d == Left) { - z - |> Zipper.set_caret(Outer) - |> Zipper.move(Right) - |> OptUtil.and_then(Zipper.select(d)); - } else { - z |> Zipper.set_caret(Outer) |> Zipper.select(d); - }; - - let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => { - let (l_proj, r_proj) = - ProjectorAction.neighbor_is(M.start_map, M.last_map, z); - switch (d, z.caret, (l_proj, r_proj)) { + let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => + switch ( + d, + z.caret, + ProjectorAction.neighbor_is(M.start_map, M.last_map, z), + ) { | (Left, Outer, (Some(id), _)) => ProjectorAction.skip_select_to(Left, id, z) | (Right, Outer, (_, Some(id))) => ProjectorAction.skip_select_to(Right, id, z) - | _ => primary'(d, z) + | _ => Zipper.select_caret(d, z) }; - }; let vertical = (d: Direction.t, ed: Zipper.t): option(Zipper.t) => Move.do_vertical(primary, d, ed); From 1168d1372fa02a89fb7ea872696a63788040bfec Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 2 May 2024 00:21:45 -0400 Subject: [PATCH 024/168] slightly less buggy movement --- src/haz3lcore/zipper/Editor.re | 5 +- src/haz3lcore/zipper/Projector.re | 4 +- src/haz3lcore/zipper/Zipper.re | 10 --- src/haz3lcore/zipper/action/Move.re | 2 +- .../zipper/action/ProjectorAction.re | 72 +++++++++++++------ src/haz3lweb/view/Deco.re | 9 ++- 6 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index b6b30f65bc..4840335ad9 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -238,4 +238,7 @@ let get_projector = (id: Id.t, ed: t) => Projector.Map.find(id, ed.state.zipper.projectors); let add_projector = (id: Id.t, p: Projector.t, ed: t) => - update_z(_ => Zipper.add_projector(id, p, ed.state.zipper), ed); + update_z( + z => {...z, projectors: Projector.Map.add(id, p, z.projectors)}, + ed, + ); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ed8475706f..eaac774a2e 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -174,7 +174,7 @@ let guy_of_rev = (id, t, (start, last)) => { last_id: Piece.id(start), }; let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { - print_endline("proj_info for id: " ++ Id.to_string(id)); + //print_endline("proj_info for id: " ++ Id.to_string(id)); switch (Id.Map.find_opt(id, term_ranges)) { | Some(range) => let guy = guy_of(id, t, range); @@ -185,7 +185,7 @@ let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { }; }; let proj_info_rev = (term_ranges, id: Id.t, t: t, acc: start_map) => { - print_endline("proj_info for id: " ++ Id.to_string(id)); + // print_endline("proj_info for id: " ++ Id.to_string(id)); switch (Id.Map.find_opt(id, term_ranges)) { | Some(range) => let guy = guy_of(id, t, range); diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index f229d4f454..39333be17a 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -30,16 +30,6 @@ type t = { projectors: Projector.Map.t, }; -let get_projectors = (z: t): Projector.Map.t => z.projectors; - -let get_projector = (id: Id.t, z: t): option(Projector.t) => - Projector.Map.find(id, z.projectors); - -let add_projector = (id: Id.t, p: Projector.t, z: t): t => { - ...z, - projectors: Projector.Map.add(id, p, z.projectors), -}; - let init: unit => t = () => { selection: Selection.mk([]), diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 3b75437a8a..441df3a943 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -6,7 +6,7 @@ open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] type movability = | CanEnter(int, int) - | SkipTo(Id.t) + | SkipTo(ProjectorAction.thing) | CanPass | CantEven; diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 0736c7228d..599733b208 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -2,29 +2,53 @@ open Zipper; open Util; //open OptUtil.Syntax; -let get_id_before = (seg, ancestors, projectors) => +[@deriving (show({with_path: false}), sexp, yojson)] +type relation = + | Parent + | Sibling; + +[@deriving (show({with_path: false}), sexp, yojson)] +type thing = { + id: Id.t, + relation, +}; + +let get_id_before = (seg, ancestors, projectors): option(thing) => switch (Projector.split_seg(seg, projectors)) { - | Some(([_, ..._] as xs, _, _, _)) => Piece.id(ListUtil.last(xs)) + | Some(([_, ..._] as xs, _, _, _)) => + Some({id: Piece.id(ListUtil.last(xs)), relation: Sibling}) | Some(([], _, _, _)) => switch (Ancestors.parent(ancestors)) { | Some(a) => print_endline("prev_id: empty pre using parent"); - a.id; + print_endline("parent id: " ++ Id.show(a.id)); + Some({id: a.id, relation: Parent}); | None => print_endline("prev_id: empty pre no ancestor"); - Id.invalid; //TODO(andrew) + None; //TODO(andrew) //Id.invalid; } | None => print_endline("prev_id: None"); - Id.invalid; //TODO(andrew) + None; //TODO(andrew) //Id.invalid; }; -let get_id_after = (seg, projectors) => +let get_id_after = (seg, ancestors, projectors): option(thing) => switch (Projector.split_seg(seg, projectors)) { - | Some((_, _, [hd, ..._], _)) => Piece.id(hd) - | _ => + | Some((_, _, [hd, ..._], _)) => + Some({id: Piece.id(hd), relation: Sibling}) + | Some((_, _, [], _)) => + switch (Ancestors.parent(ancestors)) { + | Some(a) => + print_endline("next_id: empty pre using parent"); + print_endline("parent id: " ++ Id.show(a.id)); + Some({id: a.id, relation: Parent}); + | None => + print_endline("next_id: empty pre no ancestor"); + None; //TODO(andrew) //Id.invalid; + } + | None => print_endline("next_id: empty post"); - Id.invalid; //TODO(andrew) + None; //TODO(andrew) //Id.invalid; }; let neighbor_is = @@ -33,58 +57,64 @@ let neighbor_is = last_map: Projector.start_map, {relatives: {siblings, ancestors}, projectors, _}: t, ) - : (option(Id.t), option(Id.t)) => { + : (option(thing), option(thing)) => { let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); let seg = (siblings |> fst) @ (siblings |> snd); let l = switch (l_nhbr) { | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => - Some(get_id_before(seg, ancestors, projectors)) + get_id_before(seg, ancestors, projectors) | _ => None }; let r = switch (r_nhbr) { | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => - Some(get_id_after(seg, projectors)) + get_id_after(seg, ancestors, projectors) | _ => None }; (l, r); }; -let is_right_of = (id: Id.t, z) => +let id_right_of_z = (id: Id.t, z) => switch (z.relatives.siblings, z.relatives.ancestors) { | ((_, [r, ..._]), _) => Piece.id(r) == id | ((_, []), []) => true // end of program | ((_, []), _) => false }; -let is_left_of = (id: Id.t, z) => +let id_left_of_z = (id: Id.t, z) => switch (z.relatives.siblings, z.relatives.ancestors) { | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id | (([], _), []) => true // beginning of program | (([], _), _) => false }; -let is_on = (d: Direction.t, id: Id.t) => +let id_on = (d: Direction.t, id: Id.t) => switch (d) { - | Left => is_left_of(id) - | Right => is_right_of(id) + | Left => id_left_of_z(id) + | Right => id_right_of_z(id) + }; + +let d2 = (relation, d) => + switch (relation) { + | Sibling => d + | Parent => Direction.toggle(d) }; -let skip_to = (d: Direction.t, id, z) => { +let skip_to = (d: Direction.t, {id, relation}, z) => { // print_endline("ProjectorAction.skip_to"); Zipper.do_until( Zipper.move(d), - is_on(d, id), + id_on(d2(relation, d), id), z, ); }; -let skip_select_to = (d: Direction.t, id, z) => { +let skip_select_to = (d: Direction.t, {id, relation}, z) => { // print_endline("ProjectorAction.skip_select_to"); Zipper.do_until( Zipper.select_caret(d), - is_on(d, id), + id_on(d2(relation, d), id), z, ); }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 92fc01c3e3..86715ad6d8 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -68,9 +68,10 @@ module Deco = } ) { | _ => + print_endline("PROJECTOR CRASH: sel_of_piece"); //TODO(andrew): relax. this is the case when tiles are missing //measured info due to being hidden by a projector - [] + []; }; let start_shape = switch (Piece.nibs(p)) { @@ -350,7 +351,11 @@ module Deco = List.concat([ //[Node.div(~attr=Attr.id("caret"), [])], caret(zipper), - indication_deco(zipper), + try(indication_deco(zipper)) { + | _ => + print_endline("PROJECTOR CRASH: indication_deco"); + []; + }, selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), From 8194591da5c928c22eadf6ec20673eba5a694c73 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 3 May 2024 00:05:00 -0400 Subject: [PATCH 025/168] improved movement for convex projs --- src/haz3lcore/zipper/Editor.re | 10 - src/haz3lcore/zipper/Projector.re | 245 +++++++----------- src/haz3lcore/zipper/action/Move.re | 17 +- src/haz3lcore/zipper/action/Perform.re | 18 +- .../zipper/action/ProjectorAction.re | 123 ++------- src/haz3lcore/zipper/action/Select.re | 14 +- 6 files changed, 150 insertions(+), 277 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 4840335ad9..5a80cc4e0f 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -13,8 +13,6 @@ module Meta = { tiles: TileMap.t, holes: list(Grout.t), buffer_ids: list(Id.t), - start_map: Projector.start_map, - last_map: Projector.start_map, }; let init = (z: Zipper.t) => { @@ -40,8 +38,6 @@ module Meta = { terms, holes: Segment.holes(segment), buffer_ids: Selection.buffer_ids(z.selection), - start_map: Projector.mk_start_map(z.projectors, term_ranges), - last_map: Projector.mk_last_map(z.projectors, term_ranges), }; }; @@ -49,8 +45,6 @@ module Meta = { let touched: Touched.t; let measured: Measured.t; let term_ranges: TermRanges.t; - let start_map: Projector.start_map; - let last_map: Projector.start_map; let col_target: int; }; let module_of_t = (m: t): (module S) => @@ -60,8 +54,6 @@ module Meta = { let measured = m.measured; let term_ranges = m.term_ranges; let col_target = m.col_target; - let start_map = m.start_map; - let last_map = m.last_map; }); // should not be serializing @@ -117,8 +109,6 @@ module Meta = { terms, holes: is_edit ? Segment.holes(segment) : meta.holes, buffer_ids: Selection.buffer_ids(z.selection), - start_map: Projector.mk_start_map(z.projectors, term_ranges), - last_map: Projector.mk_last_map(z.projectors, term_ranges), }; }; }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index eaac774a2e..9f505924b7 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -15,6 +15,11 @@ let toggle_fold: p => p = | Normal => Fold | Fold => Normal; +let placeholder_length: p => int = + fun + | Normal => (-666) + | Fold => 2; + [@deriving (show({with_path: false}), sexp, yojson)] module Map = { open Id.Map; @@ -31,64 +36,83 @@ module Map = { type t = p; -let rep_id = (seg, r) => r |> Aba.first_a |> List.nth(seg) |> Piece.id; - -let rec left_idx = (skel: Skel.t): int => { - switch (skel) { - | Op(r) - | Pre(r, _) => Aba.first_a(r) - | Post(s, _) - | Bin(s, _, _) => left_idx(s) - }; -}; - -let rec right_idx = (skel: Skel.t): int => { - switch (skel) { - | Op(r) - | Post(_, r) => Aba.first_a(r) - | Pre(_, s) - | Bin(_, _, s) => right_idx(s) - }; -}; - -let get_extreme_idxs = (skel: Skel.t): (int, int) => ( - left_idx(skel), - right_idx(skel), -); - -type projector_range = { - id: Id.t, - start: int, - last: int, -}; - -let get_range = (seg: Segment.t, ps: Map.t): option((Id.t, (int, int))) => { - let rec go = (skel: Skel.t) => { - let id = rep_id(seg, Skel.root(skel)); - switch (Id.Map.find_opt(id, ps)) { - | Some(_) => - let (l, r) = get_extreme_idxs(skel); - Some((id, (l, r))); - | None => - switch (skel) { - | Op(_) => None - | Pre(_, r) => go(r) - | Post(l, _) => go(l) - | Bin(l, _, r) => - switch (go(l)) { - | Some(x) => Some(x) - | None => go(r) - } - } - }; - }; - go(Segment.skel(seg)); -}; +// let rep_id = (seg, r) => r |> Aba.first_a |> List.nth(seg) |> Piece.id; + +// let rec left_idx = (skel: Skel.t): int => { +// switch (skel) { +// | Op(r) +// | Pre(r, _) => Aba.first_a(r) +// | Post(s, _) +// | Bin(s, _, _) => left_idx(s) +// }; +// }; + +// let rec right_idx = (skel: Skel.t): int => { +// switch (skel) { +// | Op(r) +// | Post(_, r) => Aba.first_a(r) +// | Pre(_, s) +// | Bin(_, _, s) => right_idx(s) +// }; +// }; + +// let get_extreme_idxs = (skel: Skel.t): (int, int) => ( +// left_idx(skel), +// right_idx(skel), +// ); + +// type projector_range = { +// id: Id.t, +// start: int, +// last: int, +// }; + +// let get_range = (seg: Segment.t, ps: Map.t): option((Id.t, (int, int))) => { +// let rec go = (skel: Skel.t) => { +// let id = rep_id(seg, Skel.root(skel)); +// switch (Id.Map.find_opt(id, ps)) { +// | Some(_) => +// let (l, r) = get_extreme_idxs(skel); +// Some((id, (l, r))); +// | None => +// switch (skel) { +// | Op(_) => None +// | Pre(_, r) => go(r) +// | Post(l, _) => go(l) +// | Bin(l, _, r) => +// switch (go(l)) { +// | Some(x) => Some(x) +// | None => go(r) +// } +// } +// }; +// }; +// go(Segment.skel(seg)); +// }; + +// let get_ranges = (seg: Segment.t, ps: Map.t): list((Id.t, (int, int))) => { +// let rec go = (skel: Skel.t) => { +// let id = rep_id(seg, Skel.root(skel)); +// switch (Id.Map.find_opt(id, ps)) { +// | Some(_) => +// let (l, r) = get_extreme_idxs(skel); +// [(id, (l, r))]; +// | None => +// switch (skel) { +// | Op(_) => [] +// | Pre(_, r) => go(r) +// | Post(l, _) => go(l) +// | Bin(l, _, r) => go(l) @ go(r) +// } +// }; +// }; +// go(Segment.skel(seg)); +// }; let split_seg = - (seg: Segment.t, ps: Map.t) + (seg: Segment.t, range: option((Id.t, (int, int)))) : option((Segment.t, Segment.t, Segment.t, Id.t)) => { - switch (get_range(seg, ps)) { + switch (range) { | None => None | Some((id, (start, last))) => //TODO(andrew): numeric edge cases? @@ -99,48 +123,26 @@ let split_seg = }; }; -let placeholder_tile = (s: string, id: Id.t): Tile.t => { - id, - label: [s], - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], -}; - -let project_mid = (id, p: option(t), mid): Segment.t => - //TODO(andrew): prrobably shouldn't just duplicate this id in the general case? - switch (p) { - | Some(Fold) => [Tile(placeholder_tile(" ", id))] - //[Grout({id, shape: Convex})] - | Some(Normal) - | None => mid - }; - -let project_seg = (p, seg: Segment.t): Segment.t => { - // print_endline("project_seg"); - switch (split_seg(seg, p)) { - | Some((pre, mid_og, suf, proj_id)) => - /*TODO(andrew): need to find a way to handle multiple projectors per segment, - i.e. wasn't thinking about ones in disjoint subtrees */ - // print_endline( - // "split: segment length: " - // ++ string_of_int(List.length(seg)) - // ++ " as divided into: " - // ++ string_of_int(List.length(pre)) - // ++ " " - // ++ string_of_int(List.length(mid_og)) - // ++ " " - // ++ string_of_int(List.length(suf)), - // ); - pre @ project_mid(proj_id, Map.find(proj_id, p), mid_og) @ suf - | None => - // print_endline("no split"); - seg +let placeholder = (pr: t, id: Id.t): Piece.t => + Piece.Tile({ + id, + label: [String.make(placeholder_length(pr), ' ')], + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], + }); + +let placehold = (prjs, p: Piece.t) => + switch (Map.find(Piece.id(p), prjs)) { + | None + | Some(Normal) => p + | Some(pr) => + //TODO(andrew): Maybe shouldn't just duplicate this id in the general case? + placeholder(pr, Piece.id(p)) }; -}; let rec of_segment = (projectors, seg: Segment.t): Segment.t => { - seg |> project_seg(projectors) |> List.map(of_piece(projectors)); + seg |> List.map(placehold(projectors)) |> List.map(of_piece(projectors)); } and of_piece = (projectors, p: Piece.t): Piece.t => { switch (p) { @@ -153,66 +155,17 @@ and of_tile = (projectors, t: Tile.t): Tile.t => { {...t, children: List.map(of_segment(projectors), t.children)}; }; -type start_entry = { - proj_id: Id.t, - t, - start_id: Id.t, - last_id: Id.t, -}; -/* map indexed by start_id instead of proj_id */ -type start_map = Id.Map.t(start_entry); -let guy_of = (id, t, (start, last)) => { - proj_id: id, - t, - start_id: Piece.id(start), - last_id: Piece.id(last), -}; -let guy_of_rev = (id, t, (start, last)) => { - proj_id: id, - t, - start_id: Piece.id(last), - last_id: Piece.id(start), -}; -let proj_info = (term_ranges, id: Id.t, t: t, acc: start_map) => { - //print_endline("proj_info for id: " ++ Id.to_string(id)); - switch (Id.Map.find_opt(id, term_ranges)) { - | Some(range) => - let guy = guy_of(id, t, range); - Id.Map.add(guy.start_id, guy, acc); - | _ => - print_endline("ERROR: mk_nu_proj_map: no term range for projector"); - acc; - }; -}; -let proj_info_rev = (term_ranges, id: Id.t, t: t, acc: start_map) => { - // print_endline("proj_info for id: " ++ Id.to_string(id)); - switch (Id.Map.find_opt(id, term_ranges)) { - | Some(range) => - let guy = guy_of(id, t, range); - Id.Map.add(guy.last_id, guy, acc); - | _ => - print_endline("ERROR: mk_nu_proj_map: no term range for projector"); - acc; - }; -}; - -let mk_start_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => - Map.fold(proj_info(term_ranges), projectors, Id.Map.empty); - -let mk_last_map = (projectors: Map.t, term_ranges: TermRanges.t): start_map => - Map.fold(proj_info_rev(term_ranges), projectors, Id.Map.empty); - let fake_measured = (p: Map.t, measured: Measured.t, term_ranges: TermRanges.t): Measured.t => Map.fold( - (id, _p: t, measured: Measured.t) => { + (id, pr: t, measured: Measured.t) => { switch ( Measured.find_by_id(id, measured), Id.Map.find_opt(id, term_ranges), ) { | (Some(m), Some((p_start, p_last))) => - let p_start = Piece.Tile(placeholder_tile(" ", Piece.id(p_start))); - let p_last = Piece.Tile(placeholder_tile(" ", Piece.id(p_last))); + let p_start = placeholder(pr, Piece.id(p_start)); + let p_last = placeholder(pr, Piece.id(p_last)); let measured = Measured.add_p(p_start, m, measured); let measured = Measured.add_p(p_last, m, measured); print_endline("fake_measured: added placeholder tiles:"); diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 441df3a943..2b318d2bbf 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -6,7 +6,7 @@ open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] type movability = | CanEnter(int, int) - | SkipTo(ProjectorAction.thing) + | SkipTo(Id.t) | CanPass | CantEven; @@ -23,12 +23,7 @@ let movability = (chunkiness: chunkiness, label, delim_idx): movability => { }; let neighbor_movability = - ( - start_map: Projector.start_map, - last_map: Projector.start_map, - chunkiness: chunkiness, - {relatives: {siblings, ancestors}, _} as z: t, - ) + (chunkiness: chunkiness, {relatives: {siblings, ancestors}, _} as z: t) : (movability, movability) => { let movability = movability(chunkiness); let (supernhbr_l, supernhbr_r) = @@ -40,7 +35,7 @@ let neighbor_movability = ) }; let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); - let (l_proj, r_proj) = ProjectorAction.neighbor_is(start_map, last_map, z); + let (l_proj, r_proj) = ProjectorAction.neighbor_is(z); let l = switch (l_proj, l_nhbr) { | (Some(l_proj_id), _) => SkipTo(l_proj_id) @@ -87,11 +82,7 @@ module Make = (M: Editor.Meta.S) => { z |> Zipper.set_caret(Inner(d_init, c_max)) |> Zipper.move(d); let primary = (chunkiness: chunkiness, d: Direction.t, z: t): option(t) => { - switch ( - d, - z.caret, - neighbor_movability(M.start_map, M.last_map, chunkiness, z), - ) { + switch (d, z.caret, neighbor_movability(chunkiness, z)) { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index bf27beeb0a..5c1f6e5ab1 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -59,11 +59,15 @@ let go_z = let select_term_current = z => switch (Indicated.index(z)) { - | None => Error(Action.Failure.Cant_select) + | None => + print_endline("PERFORM.select_term_current: no index"); + Error(Action.Failure.Cant_select); | Some(id) => switch (Select.term(id, z)) { | Some(z) => Ok(z) - | None => Error(Action.Failure.Cant_select) + | None => + print_endline("PERFORM.select_term_current: Select.term failed"); + Error(Action.Failure.Cant_select); } }; @@ -97,15 +101,17 @@ let go_z = Ok(z); | Some(z) => print_endline("PERFORM: jump_to_id succeeded"); - switch (select_term_current(z)) { - | Ok(z) => Ok(directional_unselect(Direction.toggle(d), z)) - | Error(_err) => Ok(z) - }; + Ok(z); + // switch (select_term_current(z)) { + // | Ok(z) => Ok(directional_unselect(Direction.toggle(d), z)) + // | Error(_err) => Ok(z) + // }; }; | Ok(z) => print_endline("PERFORM: select_term_current succeeded"); Ok(directional_unselect(Direction.toggle(d), z)); }; + // Ok(z); } | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 599733b208..03deeca6cf 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -1,120 +1,49 @@ open Zipper; open Util; -//open OptUtil.Syntax; -[@deriving (show({with_path: false}), sexp, yojson)] -type relation = - | Parent - | Sibling; - -[@deriving (show({with_path: false}), sexp, yojson)] -type thing = { - id: Id.t, - relation, -}; - -let get_id_before = (seg, ancestors, projectors): option(thing) => - switch (Projector.split_seg(seg, projectors)) { - | Some(([_, ..._] as xs, _, _, _)) => - Some({id: Piece.id(ListUtil.last(xs)), relation: Sibling}) - | Some(([], _, _, _)) => - switch (Ancestors.parent(ancestors)) { - | Some(a) => - print_endline("prev_id: empty pre using parent"); - print_endline("parent id: " ++ Id.show(a.id)); - Some({id: a.id, relation: Parent}); - | None => - print_endline("prev_id: empty pre no ancestor"); - None; //TODO(andrew) //Id.invalid; - } - | None => - print_endline("prev_id: None"); - None; //TODO(andrew) //Id.invalid; - }; - -let get_id_after = (seg, ancestors, projectors): option(thing) => - switch (Projector.split_seg(seg, projectors)) { - | Some((_, _, [hd, ..._], _)) => - Some({id: Piece.id(hd), relation: Sibling}) - | Some((_, _, [], _)) => - switch (Ancestors.parent(ancestors)) { - | Some(a) => - print_endline("next_id: empty pre using parent"); - print_endline("parent id: " ++ Id.show(a.id)); - Some({id: a.id, relation: Parent}); - | None => - print_endline("next_id: empty pre no ancestor"); - None; //TODO(andrew) //Id.invalid; - } - | None => - print_endline("next_id: empty post"); - None; //TODO(andrew) //Id.invalid; +let piece_is = (projectors, nhbr) => + switch (nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), projectors) => + Projector.Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None + | _ => None }; let neighbor_is = - ( - start_map: Projector.start_map, - last_map: Projector.start_map, - {relatives: {siblings, ancestors}, projectors, _}: t, - ) - : (option(thing), option(thing)) => { - let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); - let seg = (siblings |> fst) @ (siblings |> snd); - let l = - switch (l_nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), last_map) => - get_id_before(seg, ancestors, projectors) - | _ => None - }; - let r = - switch (r_nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), start_map) => - get_id_after(seg, ancestors, projectors) - | _ => None - }; - (l, r); -}; + ({relatives: {siblings, _}, projectors, _}: t) + : (option(Id.t), option(Id.t)) => ( + piece_is(projectors, Siblings.left_neighbor(siblings)), + piece_is(projectors, Siblings.right_neighbor(siblings)), +); -let id_right_of_z = (id: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | ((_, [r, ..._]), _) => Piece.id(r) == id - | ((_, []), []) => true // end of program - | ((_, []), _) => false - }; - -let id_left_of_z = (id: Id.t, z) => - switch (z.relatives.siblings, z.relatives.ancestors) { - | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id - | (([], _), []) => true // beginning of program - | (([], _), _) => false - }; - -let id_on = (d: Direction.t, id: Id.t) => +let id_on = (d: Direction.t, id: Id.t, z: Zipper.t): bool => switch (d) { - | Left => id_left_of_z(id) - | Right => id_right_of_z(id) - }; - -let d2 = (relation, d) => - switch (relation) { - | Sibling => d - | Parent => Direction.toggle(d) + | Left => + switch (z.relatives.siblings, z.relatives.ancestors) { + | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id + | _ => false + } + | Right => + switch (z.relatives.siblings, z.relatives.ancestors) { + | ((_, [r, ..._]), _) => Piece.id(r) == id + | _ => false + } }; -let skip_to = (d: Direction.t, {id, relation}, z) => { +let skip_to = (d: Direction.t, id: Id.t, z: Zipper.t): option(Zipper.t) => { // print_endline("ProjectorAction.skip_to"); Zipper.do_until( Zipper.move(d), - id_on(d2(relation, d), id), + id_on(Direction.toggle(d), id), z, ); }; -let skip_select_to = (d: Direction.t, {id, relation}, z) => { +let skip_select_to = + (d: Direction.t, id: Id.t, z: Zipper.t): option(Zipper.t) => { // print_endline("ProjectorAction.skip_select_to"); Zipper.do_until( Zipper.select_caret(d), - id_on(d2(relation, d), id), + id_on(Direction.toggle(d), id), z, ); }; diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 6c86b3c266..2b67c2939f 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -5,11 +5,7 @@ module Make = (M: Editor.Meta.S) => { module Move = Move.Make(M); let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => - switch ( - d, - z.caret, - ProjectorAction.neighbor_is(M.start_map, M.last_map, z), - ) { + switch (d, z.caret, ProjectorAction.neighbor_is(z)) { | (Left, Outer, (Some(id), _)) => ProjectorAction.skip_select_to(Left, id, z) | (Right, Outer, (_, Some(id))) => @@ -22,13 +18,21 @@ module Make = (M: Editor.Meta.S) => { let range = (l: Id.t, r: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, l); + print_endline("Select.range: first"); let* Measured.{last, _} = Measured.find_by_id(r, M.measured); + print_endline("Select.range: last"); Move.do_towards(primary, last, z); }; let term = (id: Id.t, z: Zipper.t): option(Zipper.t) => { //TODO: check if selection is already a term: no-op in this case let* (l, r) = TermRanges.find_opt(id, M.term_ranges); + print_endline( + "Select.term: l: " + ++ Id.show(Piece.id(l)) + ++ " r: " + ++ Id.show(Piece.id(r)), + ); range(Piece.id(l), Piece.id(r), z); }; From bb100064bbe843519335b7a02a54d091dbd94cae Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 14 May 2024 23:52:25 -0400 Subject: [PATCH 026/168] move responsibility of projector movement to core zipper move --- src/haz3lcore/zipper/Editor.re | 101 +++++++++-------- src/haz3lcore/zipper/Printer.re | 4 +- src/haz3lcore/zipper/Projector.re | 64 ++++++----- src/haz3lcore/zipper/Zipper.re | 60 ++++++++-- src/haz3lcore/zipper/action/Move.re | 43 ++++---- src/haz3lcore/zipper/action/Perform.re | 104 +++++++++--------- .../zipper/action/ProjectorAction.re | 62 ++++++++--- src/haz3lcore/zipper/action/Select.re | 11 +- src/haz3lschool/Exercise.re | 3 +- src/haz3lweb/ScratchSlide.re | 2 +- src/haz3lweb/view/Cell.re | 28 ++++- src/haz3lweb/view/Code.re | 15 ++- src/haz3lweb/view/ExerciseMode.re | 5 +- .../view/assistant/UpdateAssistant.re | 2 +- 14 files changed, 315 insertions(+), 189 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 5a80cc4e0f..fd762d83fa 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -5,9 +5,13 @@ module Meta = { type t = { col_target: int, touched: Touched.t, - measured: Measured.t, - term_ranges: TermRanges.t, - segment: Segment.t, + z_projected: Zipper.t, + measured_real: Measured.t, + measured_projected: Measured.t, + term_ranges_real: TermRanges.t, + term_ranges_projected: TermRanges.t, + segment_real: Segment.t, + segment_projected: Segment.t, view_term: Term.UExp.t, terms: TermMap.t, tiles: TileMap.t, @@ -16,43 +20,43 @@ module Meta = { }; let init = (z: Zipper.t) => { - let segment' = Zipper.unselect_and_zip(z); - let segment = Projector.of_segment(z.projectors, segment'); + let segment_real = Zipper.unselect_and_zip(z); + let segment_projected = Projector.of_segment(z.projectors, segment_real); /*NOTE(andrew): consider using segment' for view_term (but terms problematic) */ - let (view_term, terms) = MakeTerm.go(segment); - let term_ranges = TermRanges.mk(segment); - let measured = - Projector.fake_measured( - z.projectors, - Measured.of_segment(segment), - TermRanges.mk(segment') //TODO(andrew): fix perf - ); + let (view_term, terms) = MakeTerm.go(segment_projected); { col_target: 0, touched: Touched.empty, - measured, - segment, - term_ranges, - tiles: TileMap.mk(segment), + z_projected: ProjectorAction.of_zipper(z), + measured_real: Measured.of_segment(segment_real), + measured_projected: Measured.of_segment(segment_projected), + segment_real, + segment_projected, + term_ranges_real: TermRanges.mk(segment_real), + term_ranges_projected: TermRanges.mk(segment_projected), + tiles: TileMap.mk(segment_projected), view_term, terms, - holes: Segment.holes(segment), + holes: Segment.holes(segment_projected), buffer_ids: Selection.buffer_ids(z.selection), }; }; + //TODO(andrew): what is this module used for? module type S = { let touched: Touched.t; - let measured: Measured.t; - let term_ranges: TermRanges.t; + let measured_projected: Measured.t; + let measured_real: Measured.t; + let term_ranges_projected: TermRanges.t; let col_target: int; }; let module_of_t = (m: t): (module S) => (module { let touched = m.touched; - let measured = m.measured; - let term_ranges = m.term_ranges; + let measured_projected = m.measured_projected; + let measured_real = m.measured_real; + let term_ranges_projected = m.term_ranges_projected; let col_target = m.col_target; }); @@ -64,50 +68,59 @@ module Meta = { let next = (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { - let {touched, measured, col_target, _} = meta; + let {touched, measured_real, measured_projected, col_target, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); - let segment' = is_edit ? Zipper.unselect_and_zip(z) : meta.segment; - let segment = Projector.of_segment(z.projectors, segment'); + let z_projected = ProjectorAction.of_zipper(z); + let segment_real = + is_edit ? Zipper.unselect_and_zip(z) : meta.segment_real; + let segment_projected = Projector.of_segment(z.projectors, segment_real); //print_endline("projected segment:"); //segment |> Segment.show |> print_endline; - - let measured = - is_edit - ? Projector.fake_measured( - z.projectors, - Measured.of_segment(~touched, ~old=measured, segment), - //TODO(andrew): needs to be nonprojected segment; fix perf!! - TermRanges.mk(segment'), - ) - : measured; - let term_ranges = is_edit ? TermRanges.mk(segment) : meta.term_ranges; + let measured_real = + Measured.of_segment(~touched, ~old=measured_real, segment_real); + let measured_projected = + Measured.of_segment( + ~touched, + ~old=measured_projected, + segment_projected, + ); + let term_ranges_real = + is_edit ? TermRanges.mk(segment_real) : meta.term_ranges_real; + let term_ranges_projected = + is_edit ? TermRanges.mk(segment_projected) : meta.term_ranges_projected; let col_target = switch (a) { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => col_target | _ => - switch (Indicated.index(z)) { + switch (Indicated.index(z_projected)) { | Some(i) => print_endline("indicated_id:" ++ Id.show(i)) //let x = Id.Map.find(i, measured.tiles); | None => print_endline("no indicated_id") }; print_endline("Editor.next.caret_point"); - Zipper.caret_point(measured, z).col; + Zipper.caret_point(measured_projected, z_projected).col; }; let (view_term, terms) = //NOTE(andrew): could use unprojected version here, might be dangerous - is_edit ? MakeTerm.go(segment) : (meta.view_term, meta.terms); + is_edit + ? MakeTerm.go(segment_projected) : (meta.view_term, meta.terms); { col_target, touched, - measured, - segment, - term_ranges, - tiles: is_edit ? TileMap.mk(segment) : meta.tiles, + z_projected, + measured_real, + measured_projected, + segment_real, + segment_projected, + term_ranges_real, + term_ranges_projected, + tiles: is_edit ? TileMap.mk(segment_real) : meta.tiles, view_term, terms, - holes: is_edit ? Segment.holes(segment) : meta.holes, + //NOTE(andrew): this is seg_project bc otherwise Code.of_hole crashes + holes: is_edit ? Segment.holes(segment_projected) : meta.holes, buffer_ids: Selection.buffer_ids(z.selection), }; }; diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 8fe329fb64..2a1fea8493 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -74,7 +74,7 @@ let to_string_editor = (~holes: option(string)=Some(""), editor: Editor.t): string => to_rows( ~holes, - ~measured=editor.state.meta.measured, + ~measured=editor.state.meta.measured_real, ~caret=None, ~indent="", ~segment=seg_of_zip(editor.state.zipper), @@ -83,7 +83,7 @@ let to_string_editor = let to_string_selection = (editor: Editor.t): string => to_rows( - ~measured=editor.state.meta.measured, + ~measured=editor.state.meta.measured_real, ~caret=None, ~indent=" ", ~holes=None, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 9f505924b7..1826cc52e0 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -138,7 +138,11 @@ let placehold = (prjs, p: Piece.t) => | Some(Normal) => p | Some(pr) => //TODO(andrew): Maybe shouldn't just duplicate this id in the general case? - placeholder(pr, Piece.id(p)) + placeholder( + pr, + //Id.mk(), + Piece.id(p), + ) }; let rec of_segment = (projectors, seg: Segment.t): Segment.t => { @@ -155,35 +159,35 @@ and of_tile = (projectors, t: Tile.t): Tile.t => { {...t, children: List.map(of_segment(projectors), t.children)}; }; -let fake_measured = - (p: Map.t, measured: Measured.t, term_ranges: TermRanges.t): Measured.t => - Map.fold( - (id, pr: t, measured: Measured.t) => { - switch ( - Measured.find_by_id(id, measured), - Id.Map.find_opt(id, term_ranges), - ) { - | (Some(m), Some((p_start, p_last))) => - let p_start = placeholder(pr, Piece.id(p_start)); - let p_last = placeholder(pr, Piece.id(p_last)); - let measured = Measured.add_p(p_start, m, measured); - let measured = Measured.add_p(p_last, m, measured); - print_endline("fake_measured: added placeholder tiles:"); - print_endline("root_id:" ++ Id.to_string(id)); - print_endline("start_id:" ++ Id.to_string(Piece.id(p_start))); - print_endline("last_id:" ++ Id.to_string(Piece.id(p_last))); - measured; - | (Some(_), None) => - print_endline("fake_measured: no term range for projector"); - measured; - | _ => - print_endline("fake_measured: no measurement for projector"); - measured; - } - }, - p, - measured, - ); +// let fake_measured = +// (p: Map.t, measured: Measured.t, term_ranges: TermRanges.t): Measured.t => +// Map.fold( +// (id, pr: t, measured: Measured.t) => { +// switch ( +// Measured.find_by_id(id, measured), +// Id.Map.find_opt(id, term_ranges), +// ) { +// | (Some(m), Some((p_start, p_last))) => +// let p_start = placeholder(pr, Piece.id(p_start)); +// let p_last = placeholder(pr, Piece.id(p_last)); +// let measured = Measured.add_p(p_start, m, measured); +// let measured = Measured.add_p(p_last, m, measured); +// print_endline("fake_measured: added placeholder tiles:"); +// print_endline("root_id:" ++ Id.to_string(id)); +// print_endline("start_id:" ++ Id.to_string(Piece.id(p_start))); +// print_endline("last_id:" ++ Id.to_string(Piece.id(p_last))); +// measured; +// | (Some(_), None) => +// print_endline("fake_measured: no term range for projector"); +// measured; +// | _ => +// print_endline("fake_measured: no measurement for projector"); +// measured; +// } +// }, +// p, +// measured, +// ); /* projector map has ids of projectors diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 39333be17a..07c68b37ee 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -204,15 +204,61 @@ let directional_unselect = (d: Direction.t, z: t): t => { unselect({...z, selection}); }; +let piece_is = (projectors, nhbr) => + switch (nhbr) { + | Some(p) when Projector.Map.mem(Piece.id(p), projectors) => + Projector.Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None + | _ => None + }; + +let neighbor_is_projector = + ({relatives: {siblings, _}, projectors, _}: t) + : (option(Id.t), option(Id.t)) => ( + piece_is(projectors, Siblings.left_neighbor(siblings)), + piece_is(projectors, Siblings.right_neighbor(siblings)), +); + +let skip_left = (z: t): option(t) => + switch (fst(z.relatives.siblings) |> List.rev, snd(z.relatives.siblings)) { + | ([l_nhbr, ...l_rest], r) => + print_endline("Zipper.skip_left"); + Some({ + ...z, + relatives: { + ...z.relatives, + siblings: (List.rev(l_rest), [l_nhbr, ...r]), + }, + }); + | _ => None + }; + +let skip_right = (z: t): option(t) => + switch (fst(z.relatives.siblings) |> List.rev, snd(z.relatives.siblings)) { + | (l, [r_nhbr, ...r_rest]) => + print_endline("Zipper.skip_right"); + Some({ + ...z, + relatives: { + ...z.relatives, + siblings: ([r_nhbr, ...l] |> List.rev, r_rest), + }, + }); + | _ => None + }; + let move = (d: Direction.t, z: t): option(t) => if (Selection.is_empty(z.selection)) { - // let balanced = !Backpack.is_balanced(z.backpack); - let+ (p, relatives) = Relatives.pop(d, z.relatives); - let relatives = - relatives - |> Relatives.push(Direction.toggle(d), p) - |> Relatives.reassemble; - {...z, relatives}; + switch (d, neighbor_is_projector(z)) { + | (Direction.Left, (Some(_), _)) => skip_left(z) + | (Direction.Right, (_, Some(_))) => skip_right(z) + | _ => + let+ (p, relatives) = Relatives.pop(d, z.relatives); + let relatives = + relatives + |> Relatives.push(Direction.toggle(d), p) + |> Relatives.reassemble; + {...z, relatives}; + }; } else { Some(directional_unselect(d, z)); }; diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 2b318d2bbf..55eae54546 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -6,7 +6,6 @@ open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] type movability = | CanEnter(int, int) - | SkipTo(Id.t) | CanPass | CantEven; @@ -23,7 +22,7 @@ let movability = (chunkiness: chunkiness, label, delim_idx): movability => { }; let neighbor_movability = - (chunkiness: chunkiness, {relatives: {siblings, ancestors}, _} as z: t) + (chunkiness: chunkiness, {relatives: {siblings, ancestors}, _}: t) : (movability, movability) => { let movability = movability(chunkiness); let (supernhbr_l, supernhbr_r) = @@ -35,32 +34,28 @@ let neighbor_movability = ) }; let (l_nhbr, r_nhbr) = Siblings.neighbors(siblings); - let (l_proj, r_proj) = ProjectorAction.neighbor_is(z); let l = - switch (l_proj, l_nhbr) { - | (Some(l_proj_id), _) => SkipTo(l_proj_id) - | (None, Some(Tile({label, _}))) => - movability(label, List.length(label) - 1) - | (None, Some(Secondary(w))) when Secondary.is_comment(w) => + switch (l_nhbr) { + | Some(Tile({label, _})) => movability(label, List.length(label) - 1) + | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 let content_string = Secondary.get_string(w.content); CanEnter( Unicode.length(content_string) - 1, Unicode.length(content_string) - 2, ); - | (None, Some(Secondary(_) | Grout(_))) => CanPass - | (None, None) => supernhbr_l + | Some(Secondary(_) | Grout(_)) => CanPass + | None => supernhbr_l }; let r = - switch (r_proj, r_nhbr) { - | (Some(r_proj_id), _) => SkipTo(r_proj_id) - | (None, Some(Tile({label, _}))) => movability(label, 0) - | (None, Some(Secondary(w))) when Secondary.is_comment(w) => + switch (r_nhbr) { + | Some(Tile({label, _})) => movability(label, 0) + | Some(Secondary(w)) when Secondary.is_comment(w) => // Comments are always length >= 2 let content_string = Secondary.get_string(w.content); CanEnter(0, Unicode.length(content_string) - 2); - | (None, Some(Secondary(_) | Grout(_))) => CanPass - | (None, None) => supernhbr_r + | Some(Secondary(_) | Grout(_)) => CanPass + | None => supernhbr_r }; (l, r); }; @@ -68,7 +63,12 @@ let neighbor_movability = module Make = (M: Editor.Meta.S) => { let caret_point = t => { // print_endline("Move.caret_point"); - Zipper.caret_point(M.measured, t); + Zipper.caret_point( + M.measured_projected, + //TODO(andrew): why real here? if use projected, + // get caret point errs but only for grout not tiles + t, + ); }; let pop_out = z => Some(z |> Zipper.set_caret(Outer)); @@ -82,14 +82,11 @@ module Make = (M: Editor.Meta.S) => { z |> Zipper.set_caret(Inner(d_init, c_max)) |> Zipper.move(d); let primary = (chunkiness: chunkiness, d: Direction.t, z: t): option(t) => { + print_endline("Move.primary"); switch (d, z.caret, neighbor_movability(chunkiness, z)) { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) - | (Left, Outer, (SkipTo(pid), _)) => - ProjectorAction.skip_to(Left, pid, z) - | (Right, Outer, (_, SkipTo(pid))) => - ProjectorAction.skip_to(Right, pid, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) @@ -106,6 +103,7 @@ module Make = (M: Editor.Meta.S) => { }; let is_at_side_of_row = (d: Direction.t, z: Zipper.t) => { + print_endline("Move.is_at_side_of_row"); let Measured.Point.{row, col} = caret_point(z); switch (Zipper.move(d, z)) { | None => true @@ -178,6 +176,7 @@ module Make = (M: Editor.Meta.S) => { /* Here f should be a function which results in strict d-wards movement of the caret. Iterate f until we get to the closet caret position to a target derived from the initial position */ + print_endline("Move.do_vertical"); let cur_p = caret_point(z); let goal = Measured.Point.{ @@ -240,7 +239,7 @@ module Make = (M: Editor.Meta.S) => { }; let jump_to_id = (~init=Direction.Left, z: t, id: Id.t): option(t) => { - let* {origin, _} = Measured.find_by_id(id, M.measured); + let* {origin, _} = Measured.find_by_id(id, M.measured_projected); let z = switch (init == Left ? to_start(z) : to_end(z)) { | None => z diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 5c1f6e5ab1..ea23981c40 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -18,28 +18,6 @@ let is_write_action = (a: Action.t) => { }; }; -module Project = { - let go = (p: Action.project, z: t) => - switch (p) { - | ToggleFold => - print_endline("Project.go: ToggleFold"); - switch (Indicated.index(z)) { - | Some(id) => - switch (Projector.Map.find(id, z.projectors)) { - | Some(_p) => { - ...z, - projectors: Projector.Map.remove(id, z.projectors), - } - | None => { - ...z, - projectors: Projector.Map.add(id, Projector.Fold, z.projectors), - } - } - | None => z - }; - }; -}; - let go_z = ( ~meta: option(Editor.Meta.t)=?, @@ -71,6 +49,56 @@ let go_z = } }; + let selection_dance = (z, d, pid): t => { + //TODO(andrew): clean up hacky movement + print_endline("PERFORM: going to start"); + print_endline("direction: " ++ Direction.show(d)); + //d == Left ? Move.to_end(z) : Move.to_start(z) + switch (select_term_current(z)) { + | Error(_err) => + //TODO(andrew): deal with this properly + //figure out why selection is failing (metrics issue?) + print_endline("PERFORM: ERROR couldn't select, going to start instead"); + switch (Move.jump_to_id(~init=Left, z, Piece.id(pid))) { + | None => + print_endline("PERFORM: jump_to_id failed"); + z; + | Some(z) => + print_endline("PERFORM: jump_to_id succeeded"); + z; + // switch (select_term_current(z)) { + // | Ok(z) => Ok(directional_unselect(Direction.toggle(d), z)) + // | Error(_err) => Ok(z) + // }; + }; + | Ok(z) => + print_endline("PERFORM: select_term_current succeeded"); + directional_unselect(Direction.toggle(d), z); + }; + }; + + let proj_loj = (p: Action.project, z: t, pid, d) => + switch (p) { + | ToggleFold => + print_endline("Project.go: ToggleFold"); + switch (Indicated.index(z)) { + | Some(id) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(_p) => { + ...z, + projectors: Projector.Map.remove(id, z.projectors), + } + | None => + let z = { + ...z, + projectors: Projector.Map.add(id, Projector.Fold, z.projectors), + }; + selection_dance(z, d, pid); + } + | None => z + }; + }; + switch (a) { | Project(p) => switch ( @@ -83,35 +111,9 @@ let go_z = ) { | None => Error(Action.Failure.Cant_move) | Some((pid, d, _)) => - let z = Project.go(p, z); - //TODO(andrew): clean up hacky movement - print_endline("PERFORM: going to start"); - print_endline("direction: " ++ Direction.show(d)); - //d == Left ? Move.to_end(z) : Move.to_start(z) - switch (select_term_current(z)) { - | Error(_err) => - //TODO(andrew): deal with this properly - //figure out why selection is failing (metrics issue?) - print_endline( - "PERFORM: ERROR couldn't select, going to start instead", - ); - switch (Move.jump_to_id(~init=Left, z, Piece.id(pid))) { - | None => - print_endline("PERFORM: jump_to_id failed"); - Ok(z); - | Some(z) => - print_endline("PERFORM: jump_to_id succeeded"); - Ok(z); - // switch (select_term_current(z)) { - // | Ok(z) => Ok(directional_unselect(Direction.toggle(d), z)) - // | Error(_err) => Ok(z) - // }; - }; - | Ok(z) => - print_endline("PERFORM: select_term_current succeeded"); - Ok(directional_unselect(Direction.toggle(d), z)); - }; - // Ok(z); + let z = proj_loj(p, z, pid, d); + //selection_dance(z, d, pid); + Ok(z); } | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 03deeca6cf..2ecb793c3d 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -1,20 +1,6 @@ open Zipper; open Util; -let piece_is = (projectors, nhbr) => - switch (nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), projectors) => - Projector.Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None - | _ => None - }; - -let neighbor_is = - ({relatives: {siblings, _}, projectors, _}: t) - : (option(Id.t), option(Id.t)) => ( - piece_is(projectors, Siblings.left_neighbor(siblings)), - piece_is(projectors, Siblings.right_neighbor(siblings)), -); - let id_on = (d: Direction.t, id: Id.t, z: Zipper.t): bool => switch (d) { | Left => @@ -47,3 +33,51 @@ let skip_select_to = z, ); }; + +let of_siblings = + (projectors: Projector.Map.t, siblings: Siblings.t): Siblings.t => { + let l_sibs = Projector.of_segment(projectors, fst(siblings)); + let r_sibs = Projector.of_segment(projectors, snd(siblings)); + (l_sibs, r_sibs); +}; + +let of_ancestor = + (projectors: Projector.Map.t, ancestor: Ancestor.t): Ancestor.t => { + { + ...ancestor, + children: ( + List.map(Projector.of_segment(projectors), fst(ancestor.children)), + List.map(Projector.of_segment(projectors), snd(ancestor.children)), + ), + }; +}; + +let of_generation = + (projectors: Projector.Map.t, generation: Ancestors.generation) + : Ancestors.generation => ( + of_ancestor(projectors, fst(generation)), + of_siblings(projectors, snd(generation)), +); + +let of_ancestors = + (projectors: Projector.Map.t, ancestors: Ancestors.t): Ancestors.t => + List.map(of_generation(projectors), ancestors); + +let of_selection = + (projectors: Projector.Map.t, selection: Selection.t): Selection.t => { + { + ...selection, + content: Projector.of_segment(projectors, selection.content), + }; +}; + +let of_zipper = (z: Zipper.t): Zipper.t => { + { + ...z, + selection: of_selection(z.projectors, z.selection), + relatives: { + ancestors: of_ancestors(z.projectors, z.relatives.ancestors), + siblings: of_siblings(z.projectors, z.relatives.siblings), + }, + }; +}; diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 2b67c2939f..23e144e68a 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -5,7 +5,7 @@ module Make = (M: Editor.Meta.S) => { module Move = Move.Make(M); let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => - switch (d, z.caret, ProjectorAction.neighbor_is(z)) { + switch (d, z.caret, Zipper.neighbor_is_projector(z)) { | (Left, Outer, (Some(id), _)) => ProjectorAction.skip_select_to(Left, id, z) | (Right, Outer, (_, Some(id))) => @@ -19,14 +19,14 @@ module Make = (M: Editor.Meta.S) => { let range = (l: Id.t, r: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, l); print_endline("Select.range: first"); - let* Measured.{last, _} = Measured.find_by_id(r, M.measured); + let* Measured.{last, _} = Measured.find_by_id(r, M.measured_projected); print_endline("Select.range: last"); Move.do_towards(primary, last, z); }; let term = (id: Id.t, z: Zipper.t): option(Zipper.t) => { //TODO: check if selection is already a term: no-op in this case - let* (l, r) = TermRanges.find_opt(id, M.term_ranges); + let* (l, r) = TermRanges.find_opt(id, M.term_ranges_projected); print_endline( "Select.term: l: " ++ Id.show(Piece.id(l)) @@ -38,7 +38,7 @@ module Make = (M: Editor.Meta.S) => { let tile = (id: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, id); - let* Measured.{last, _} = Measured.find_by_id(id, M.measured); + let* Measured.{last, _} = Measured.find_by_id(id, M.measured_projected); Move.do_towards(primary, last, z); }; @@ -46,7 +46,8 @@ module Make = (M: Editor.Meta.S) => { switch (d) { | Goal(Piece(_)) => failwith("Select.go not implemented for Piece Goal") | Goal(Point(goal)) => - let anchor = z |> Zipper.toggle_focus |> Zipper.caret_point(M.measured); + let anchor = + z |> Zipper.toggle_focus |> Zipper.caret_point(M.measured_projected); Move.do_towards(~anchor, primary, goal, z); | Extreme(d) => Move.do_extreme(primary, d, z) | Local(d) => diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index ec5a40c262..45b4bcf2bc 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -588,7 +588,8 @@ module F = (ExerciseEnv: ExerciseEnv) => { let wrap = (term, editor: Editor.t): TermItem.t => { term, - term_ranges: editor.state.meta.term_ranges, + term_ranges: editor.state.meta.term_ranges_real, + //TODO(andrew): real here? }; let term_of = (editor: Editor.t): Term.UExp.t => diff --git a/src/haz3lweb/ScratchSlide.re b/src/haz3lweb/ScratchSlide.re index 09860711ed..a95bbc0167 100644 --- a/src/haz3lweb/ScratchSlide.re +++ b/src/haz3lweb/ScratchSlide.re @@ -51,6 +51,6 @@ let mk_statics = let term = MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; let info_map = Interface.Statics.mk_map_ctx(settings.core, ctx_init, term); let error_ids = - Statics.Map.error_ids(editor.state.meta.term_ranges, info_map); + Statics.Map.error_ids(editor.state.meta.term_ranges_projected, info_map); {term, info_map, error_ids}; }; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index c7e5df9ddd..124133acd3 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -121,8 +121,16 @@ let deco = ~highlights: option(ColorSteps.colorMap), { state: { - zipper, - meta: {term_ranges, segment, measured, terms, tiles, _}, + // zipper, + meta: { + z_projected, + term_ranges_projected, + segment_projected, + measured_projected, + terms, + tiles, + _, + }, _, }, _, @@ -130,20 +138,28 @@ let deco = ) => { module Deco = Deco.Deco({ - let map = measured; + let map = measured_projected; let terms = terms; - let term_ranges = term_ranges; + let term_ranges = term_ranges_projected; let tiles = tiles; let font_metrics = font_metrics; let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; }); - let decos = selected ? Deco.all(zipper, segment) : Deco.err_holes(zipper); + let decos = + selected + ? Deco.all(z_projected, segment_projected) + : Deco.err_holes(z_projected); let decos = switch (test_results) { | None => decos | Some(test_results) => - decos @ test_result_layer(~font_metrics, ~measured, test_results) // TODO move into decos + decos + @ test_result_layer( + ~font_metrics, + ~measured=measured_projected, + test_results, + ) // TODO move into decos }; switch (highlights) { | Some(colorMap) => diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index c7af673096..5f7a9a5ba0 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -162,15 +162,22 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - {state: {meta: {measured, buffer_ids, segment, holes, _}, _}, _}: Editor.t, + { + state: { + meta: {measured_projected, buffer_ids, segment_projected, holes, _}, + _, + }, + _, + }: Editor.t, ) : Node.t => { module Text = Text({ - let map = measured; + let map = measured_projected; let settings = settings; }); - let code = Text.of_segment(buffer_ids, false, sort, segment); - let holes = List.map(of_hole(~measured, ~font_metrics), holes); + let code = Text.of_segment(buffer_ids, false, sort, segment_projected); + let holes = + List.map(of_hole(~measured=measured_projected, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 52302e7493..28f4fa2c86 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -60,7 +60,10 @@ let view = Cell.editor_view( ~selected=pos == this_pos, ~error_ids= - Statics.Map.error_ids(editor.state.meta.term_ranges, di.info_map), + Statics.Map.error_ids( + editor.state.meta.term_ranges_projected, + di.info_map, + ), ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re index 3370ab03f6..8b7f006c30 100644 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ b/src/haz3lweb/view/assistant/UpdateAssistant.re @@ -68,7 +68,7 @@ let apply = * first hole. This should be revisited if completions are * refactored to use a more structured buffer format */ module M = (val Editor.Meta.module_of_t(editor.state.meta)); - let start = Zipper.caret_point(M.measured, z); + let start = Zipper.caret_point(M.measured_projected, z); let rec do_actions = (model, actions: list(UpdateAction.t)) => switch (actions) { | [] => Ok(model) From 177adf283b93ceea2f32d50c909d37ba7c28174a Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 15 May 2024 02:12:42 -0400 Subject: [PATCH 027/168] movement and selection fully working for basic convex leaf projectors --- src/haz3lcore/zipper/Projector.re | 119 ++--------- src/haz3lcore/zipper/Zipper.re | 190 ++++++++++++------ .../zipper/action/ProjectorAction.re | 34 ---- src/haz3lcore/zipper/action/Select.re | 17 +- 4 files changed, 150 insertions(+), 210 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 1826cc52e0..b8d7e4ba7a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -36,79 +36,6 @@ module Map = { type t = p; -// let rep_id = (seg, r) => r |> Aba.first_a |> List.nth(seg) |> Piece.id; - -// let rec left_idx = (skel: Skel.t): int => { -// switch (skel) { -// | Op(r) -// | Pre(r, _) => Aba.first_a(r) -// | Post(s, _) -// | Bin(s, _, _) => left_idx(s) -// }; -// }; - -// let rec right_idx = (skel: Skel.t): int => { -// switch (skel) { -// | Op(r) -// | Post(_, r) => Aba.first_a(r) -// | Pre(_, s) -// | Bin(_, _, s) => right_idx(s) -// }; -// }; - -// let get_extreme_idxs = (skel: Skel.t): (int, int) => ( -// left_idx(skel), -// right_idx(skel), -// ); - -// type projector_range = { -// id: Id.t, -// start: int, -// last: int, -// }; - -// let get_range = (seg: Segment.t, ps: Map.t): option((Id.t, (int, int))) => { -// let rec go = (skel: Skel.t) => { -// let id = rep_id(seg, Skel.root(skel)); -// switch (Id.Map.find_opt(id, ps)) { -// | Some(_) => -// let (l, r) = get_extreme_idxs(skel); -// Some((id, (l, r))); -// | None => -// switch (skel) { -// | Op(_) => None -// | Pre(_, r) => go(r) -// | Post(l, _) => go(l) -// | Bin(l, _, r) => -// switch (go(l)) { -// | Some(x) => Some(x) -// | None => go(r) -// } -// } -// }; -// }; -// go(Segment.skel(seg)); -// }; - -// let get_ranges = (seg: Segment.t, ps: Map.t): list((Id.t, (int, int))) => { -// let rec go = (skel: Skel.t) => { -// let id = rep_id(seg, Skel.root(skel)); -// switch (Id.Map.find_opt(id, ps)) { -// | Some(_) => -// let (l, r) = get_extreme_idxs(skel); -// [(id, (l, r))]; -// | None => -// switch (skel) { -// | Op(_) => [] -// | Pre(_, r) => go(r) -// | Post(l, _) => go(l) -// | Bin(l, _, r) => go(l) @ go(r) -// } -// }; -// }; -// go(Segment.skel(seg)); -// }; - let split_seg = (seg: Segment.t, range: option((Id.t, (int, int)))) : option((Segment.t, Segment.t, Segment.t, Id.t)) => { @@ -159,35 +86,23 @@ and of_tile = (projectors, t: Tile.t): Tile.t => { {...t, children: List.map(of_segment(projectors), t.children)}; }; -// let fake_measured = -// (p: Map.t, measured: Measured.t, term_ranges: TermRanges.t): Measured.t => -// Map.fold( -// (id, pr: t, measured: Measured.t) => { -// switch ( -// Measured.find_by_id(id, measured), -// Id.Map.find_opt(id, term_ranges), -// ) { -// | (Some(m), Some((p_start, p_last))) => -// let p_start = placeholder(pr, Piece.id(p_start)); -// let p_last = placeholder(pr, Piece.id(p_last)); -// let measured = Measured.add_p(p_start, m, measured); -// let measured = Measured.add_p(p_last, m, measured); -// print_endline("fake_measured: added placeholder tiles:"); -// print_endline("root_id:" ++ Id.to_string(id)); -// print_endline("start_id:" ++ Id.to_string(Piece.id(p_start))); -// print_endline("last_id:" ++ Id.to_string(Piece.id(p_last))); -// measured; -// | (Some(_), None) => -// print_endline("fake_measured: no term range for projector"); -// measured; -// | _ => -// print_endline("fake_measured: no measurement for projector"); -// measured; -// } -// }, -// p, -// measured, -// ); +let piece_is = (projectors: Map.t, p: option(Piece.t)) => + switch (p) { + | Some(p) when Map.mem(Piece.id(p), projectors) => + Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None + | _ => None + }; + +let neighbor_is = (projectors, s: Siblings.t): (option(Id.t), option(Id.t)) => ( + piece_is(projectors, Siblings.left_neighbor(s)), + piece_is(projectors, Siblings.right_neighbor(s)), +); + +let selection_sides_is = + (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( + piece_is(projectors, ListUtil.hd_opt(s.content)), + piece_is(projectors, ListUtil.last_opt(s.content)), +); /* projector map has ids of projectors diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 07c68b37ee..db89a3fc71 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -78,6 +78,8 @@ let update_relatives = (f: Relatives.t => Relatives.t, z: t): t => { let update_siblings: (Siblings.t => Siblings.t, t) => t = f => update_relatives(rs => {...rs, siblings: f(rs.siblings)}); +let put_siblings = (siblings, z: t): t => update_siblings(_ => siblings, z); + let parent = (z: t): option(Piece.t) => Relatives.parent(~sel=z.selection.content, z.relatives); @@ -173,10 +175,85 @@ let update_selection = (selection: Selection.t, z: t): (Selection.t, t) => { let put_selection = (sel: Selection.t, z: t): t => snd(update_selection(sel, z)); +let put_selection_content = (content: Segment.t, z): t => { + ...z, + selection: { + ...z.selection, + content, + }, +}; + +let push_right = ((ls: Segment.t, rs: Segment.t)): (Segment.t, Segment.t) => + switch (ls |> List.rev) { + | [l, ...ls] => (ls |> List.rev, [l, ...rs]) + | [] => (ls, rs) + }; + +let push_left = ((ls: Segment.t, rs: Segment.t)): (Segment.t, Segment.t) => + switch (rs) { + | [r, ...rs] => (ls @ [r], rs) + | [] => (ls, rs) + }; + +let skip_grow_left = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { + let (ls, content) = push_right((ls, z.selection.content)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; +}; + +let skip_grow_right = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { + let (content, rs) = push_left((z.selection.content, rs)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; +}; + +let projector_grow_selection = + ({relatives: {siblings, _}, projectors, _} as z: t): option(t) => + switch (z.selection.focus, Projector.neighbor_is(projectors, siblings)) { + | (Left, (Some(_), _)) => skip_grow_left(z) + | (Right, (_, Some(_))) => skip_grow_right(z) + | _ => None + }; + +let skip_shrink_left = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { + let (ls, content) = push_left((ls, z.selection.content)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; +}; + +let skip_shrink_right = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { + let (content, rs) = push_right((z.selection.content, rs)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; +}; + +let projector_shrink_selection = + ({selection, projectors, _} as z: t): option(t) => + switch ( + selection.focus, + Projector.selection_sides_is(projectors, selection), + ) { + | (Left, (Some(_), _)) => skip_shrink_left(z) + | (Right, (_, Some(_))) => skip_shrink_right(z) + | _ => None + }; + let grow_selection = (z: t): option(t) => { - let+ (p, relatives) = Relatives.pop(z.selection.focus, z.relatives); - let selection = Selection.push(p, z.selection); - {...z, selection, relatives}; + switch (projector_grow_selection(z)) { + | Some(z) => Some(z) + | None => + let+ (p, relatives) = Relatives.pop(z.selection.focus, z.relatives); + let selection = Selection.push(p, z.selection); + {...z, selection, relatives}; + }; }; // toggles focus and grows if selection is empty @@ -186,11 +263,15 @@ let shrink_selection = (z: t): option(t) => { let selection = Selection.toggle_focus(z.selection); grow_selection({...z, selection}); | Some((p, selection)) => - let relatives = - z.relatives - |> Relatives.push(selection.focus, p) - |> Relatives.reassemble; - Some({...z, selection, relatives}); + switch (projector_shrink_selection(z)) { + | Some(z) => Some(z) + | None => + let relatives = + z.relatives + |> Relatives.push(selection.focus, p) + |> Relatives.reassemble; + Some({...z, selection, relatives}); + } }; }; @@ -204,54 +285,24 @@ let directional_unselect = (d: Direction.t, z: t): t => { unselect({...z, selection}); }; -let piece_is = (projectors, nhbr) => - switch (nhbr) { - | Some(p) when Projector.Map.mem(Piece.id(p), projectors) => - Projector.Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None - | _ => None - }; +let skip_left = ({relatives: {siblings, _}, _} as z: t): option(t) => + z |> put_siblings(push_right(siblings)) |> Option.some; -let neighbor_is_projector = - ({relatives: {siblings, _}, projectors, _}: t) - : (option(Id.t), option(Id.t)) => ( - piece_is(projectors, Siblings.left_neighbor(siblings)), - piece_is(projectors, Siblings.right_neighbor(siblings)), -); - -let skip_left = (z: t): option(t) => - switch (fst(z.relatives.siblings) |> List.rev, snd(z.relatives.siblings)) { - | ([l_nhbr, ...l_rest], r) => - print_endline("Zipper.skip_left"); - Some({ - ...z, - relatives: { - ...z.relatives, - siblings: (List.rev(l_rest), [l_nhbr, ...r]), - }, - }); - | _ => None - }; +let skip_right = ({relatives: {siblings, _}, _} as z: t): option(t) => + z |> put_siblings(push_left(siblings)) |> Option.some; -let skip_right = (z: t): option(t) => - switch (fst(z.relatives.siblings) |> List.rev, snd(z.relatives.siblings)) { - | (l, [r_nhbr, ...r_rest]) => - print_endline("Zipper.skip_right"); - Some({ - ...z, - relatives: { - ...z.relatives, - siblings: ([r_nhbr, ...l] |> List.rev, r_rest), - }, - }); +let projector_move = (d: Direction.t, z: t): option(t) => + switch (d, Projector.neighbor_is(z.projectors, z.relatives.siblings)) { + | (Left, (Some(_), _)) => skip_left(z) + | (Right, (_, Some(_))) => skip_right(z) | _ => None }; let move = (d: Direction.t, z: t): option(t) => if (Selection.is_empty(z.selection)) { - switch (d, neighbor_is_projector(z)) { - | (Direction.Left, (Some(_), _)) => skip_left(z) - | (Direction.Right, (_, Some(_))) => skip_right(z) - | _ => + switch (projector_move(d, z)) { + | Some(z) => Some(z) + | None => let+ (p, relatives) = Relatives.pop(d, z.relatives); let relatives = relatives @@ -266,14 +317,29 @@ let move = (d: Direction.t, z: t): option(t) => let select = (d: Direction.t, z: t): option(t) => d == z.selection.focus ? grow_selection(z) : shrink_selection(z); -let select_caret = (d: Direction.t, z: t): option(t) => - if (z.caret == Outer) { - select(d, z); - } else if (d == Left) { - z |> set_caret(Outer) |> move(Right) |> OptUtil.and_then(select(d)); - } else { - z |> set_caret(Outer) |> select(d); - }; +// let id_on = (d: Direction.t, id: Id.t, z: t): bool => +// switch (d) { +// | Left => +// switch (z.relatives.siblings, z.relatives.ancestors) { +// | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id +// | _ => false +// } +// | Right => +// switch (z.relatives.siblings, z.relatives.ancestors) { +// | ((_, [r, ..._]), _) => Piece.id(r) == id +// | _ => false +// } +// }; + +/* Loop action until pred is satisfied */ +// let rec do_until = +// (action: t => option(t), pred: t => bool, z: t): option(t) => +// pred(z) +// ? Some(z) +// : { +// let* z = action(z); +// do_until(action, pred, z); +// }; let pick_up = (z: t): t => { let (selected, z) = update_selection(Selection.empty, z); @@ -518,13 +584,3 @@ let seg_for_view = smart_seg(~erase_buffer=false, ~dump_backpack=false); let seg_for_sem = smart_seg(~erase_buffer=true, ~dump_backpack=true); let seg_without_buffer = smart_seg(~erase_buffer=true, ~dump_backpack=false); - -/* Loop action until pred is satisfied */ -let rec do_until = - (action: t => option(t), pred: t => bool, z: t): option(t) => - pred(z) - ? Some(z) - : { - let* z = action(z); - do_until(action, pred, z); - }; diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 2ecb793c3d..e02fb281e7 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -1,38 +1,4 @@ open Zipper; -open Util; - -let id_on = (d: Direction.t, id: Id.t, z: Zipper.t): bool => - switch (d) { - | Left => - switch (z.relatives.siblings, z.relatives.ancestors) { - | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id - | _ => false - } - | Right => - switch (z.relatives.siblings, z.relatives.ancestors) { - | ((_, [r, ..._]), _) => Piece.id(r) == id - | _ => false - } - }; - -let skip_to = (d: Direction.t, id: Id.t, z: Zipper.t): option(Zipper.t) => { - // print_endline("ProjectorAction.skip_to"); - Zipper.do_until( - Zipper.move(d), - id_on(Direction.toggle(d), id), - z, - ); -}; - -let skip_select_to = - (d: Direction.t, id: Id.t, z: Zipper.t): option(Zipper.t) => { - // print_endline("ProjectorAction.skip_select_to"); - Zipper.do_until( - Zipper.select_caret(d), - id_on(Direction.toggle(d), id), - z, - ); -}; let of_siblings = (projectors: Projector.Map.t, siblings: Siblings.t): Siblings.t => { diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 23e144e68a..6a198a4e5f 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -5,12 +5,15 @@ module Make = (M: Editor.Meta.S) => { module Move = Move.Make(M); let primary = (d: Direction.t, z: Zipper.t): option(Zipper.t) => - switch (d, z.caret, Zipper.neighbor_is_projector(z)) { - | (Left, Outer, (Some(id), _)) => - ProjectorAction.skip_select_to(Left, id, z) - | (Right, Outer, (_, Some(id))) => - ProjectorAction.skip_select_to(Right, id, z) - | _ => Zipper.select_caret(d, z) + if (z.caret == Outer) { + Zipper.select(d, z); + } else if (d == Left) { + z + |> Zipper.set_caret(Outer) + |> Zipper.move(Right) + |> OptUtil.and_then(Zipper.select(d)); + } else { + z |> Zipper.set_caret(Outer) |> Zipper.select(d); }; let vertical = (d: Direction.t, ed: Zipper.t): option(Zipper.t) => @@ -21,7 +24,7 @@ module Make = (M: Editor.Meta.S) => { print_endline("Select.range: first"); let* Measured.{last, _} = Measured.find_by_id(r, M.measured_projected); print_endline("Select.range: last"); - Move.do_towards(primary, last, z); + Move.do_towards(Zipper.select, last, z); }; let term = (id: Id.t, z: Zipper.t): option(Zipper.t) => { From b3590636d27cbee16818c27ed1208dd92831319c Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 15 May 2024 02:17:44 -0400 Subject: [PATCH 028/168] cleanup --- src/haz3lcore/zipper/Projector.re | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index b8d7e4ba7a..83a16393f7 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,27 +1,29 @@ open Util; [@deriving (show({with_path: false}), sexp, yojson)] -type p = +type t = | Normal | Fold; -let to_string: p => string = +let to_string: t => string = fun | Normal => "" | Fold => "F"; -let toggle_fold: p => p = +let toggle_fold: t => t = fun | Normal => Fold | Fold => Normal; -let placeholder_length: p => int = +let placeholder_length: t => int = fun | Normal => (-666) | Fold => 2; [@deriving (show({with_path: false}), sexp, yojson)] module Map = { + [@deriving (show({with_path: false}), sexp, yojson)] + type p = t; open Id.Map; [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(p); @@ -34,22 +36,6 @@ module Map = { let cardinal = cardinal; }; -type t = p; - -let split_seg = - (seg: Segment.t, range: option((Id.t, (int, int)))) - : option((Segment.t, Segment.t, Segment.t, Id.t)) => { - switch (range) { - | None => None - | Some((id, (start, last))) => - //TODO(andrew): numeric edge cases? - switch (ListUtil.split_sublist_opt(start, last + 1, seg)) { - | Some((pre, mid, suf)) => Some((pre, mid, suf, id)) - | _ => None - } - }; -}; - let placeholder = (pr: t, id: Id.t): Piece.t => Piece.Tile({ id, From e79b37b22546e577f168cb6adb2adbc77e9a89cf Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 00:59:24 -0400 Subject: [PATCH 029/168] projector showing expected type of holes --- src/haz3lcore/zipper/Editor.re | 74 +++++++++++++------------- src/haz3lcore/zipper/Projector.re | 35 +++++++----- src/haz3lcore/zipper/action/Action.re | 2 +- src/haz3lcore/zipper/action/Perform.re | 20 ++++--- src/haz3lschool/Exercise.re | 7 ++- src/haz3lschool/Grading.re | 4 +- src/haz3lweb/Editors.re | 6 +++ src/haz3lweb/Update.re | 6 ++- src/haz3lweb/view/Cell.re | 7 +-- src/haz3lweb/view/Deco.re | 53 +++++------------- src/haz3lweb/view/FoldView.re | 14 ----- src/haz3lweb/view/ProjectorsUpdate.re | 25 +++++++++ src/haz3lweb/view/ProjectorsView.re | 66 +++++++++++++++++++++++ 13 files changed, 196 insertions(+), 123 deletions(-) delete mode 100644 src/haz3lweb/view/FoldView.re create mode 100644 src/haz3lweb/view/ProjectorsUpdate.re create mode 100644 src/haz3lweb/view/ProjectorsView.re diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index fd762d83fa..25d69365c3 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -5,14 +5,13 @@ module Meta = { type t = { col_target: int, touched: Touched.t, - z_projected: Zipper.t, + segment_real: Segment.t, measured_real: Measured.t, + z_projected: Zipper.t, + segment_projected: Segment.t, measured_projected: Measured.t, - term_ranges_real: TermRanges.t, + term_projected: Term.UExp.t, term_ranges_projected: TermRanges.t, - segment_real: Segment.t, - segment_projected: Segment.t, - view_term: Term.UExp.t, terms: TermMap.t, tiles: TileMap.t, holes: list(Grout.t), @@ -21,21 +20,23 @@ module Meta = { let init = (z: Zipper.t) => { let segment_real = Zipper.unselect_and_zip(z); - let segment_projected = Projector.of_segment(z.projectors, segment_real); - /*NOTE(andrew): consider using segment' for view_term (but terms problematic) */ - let (view_term, terms) = MakeTerm.go(segment_projected); + let measured_real = Measured.of_segment(segment_real); + let is_proj = !Id.Map.is_empty(z.projectors); + let z_projected = is_proj ? ProjectorAction.of_zipper(z) : z; + let segment_projected = + is_proj ? Zipper.unselect_and_zip(z_projected) : segment_real; + let (term_projected, terms) = MakeTerm.go(segment_projected); { col_target: 0, touched: Touched.empty, - z_projected: ProjectorAction.of_zipper(z), - measured_real: Measured.of_segment(segment_real), - measured_projected: Measured.of_segment(segment_projected), + z_projected, segment_real, + measured_real, + measured_projected: Measured.of_segment(segment_projected), segment_projected, - term_ranges_real: TermRanges.mk(segment_real), term_ranges_projected: TermRanges.mk(segment_projected), tiles: TileMap.mk(segment_projected), - view_term, + term_projected, terms, holes: Segment.holes(segment_projected), buffer_ids: Selection.buffer_ids(z.selection), @@ -46,7 +47,6 @@ module Meta = { module type S = { let touched: Touched.t; let measured_projected: Measured.t; - let measured_real: Measured.t; let term_ranges_projected: TermRanges.t; let col_target: int; }; @@ -55,7 +55,6 @@ module Meta = { { let touched = m.touched; let measured_projected = m.measured_projected; - let measured_real = m.measured_real; let term_ranges_projected = m.term_ranges_projected; let col_target = m.col_target; }); @@ -71,22 +70,23 @@ module Meta = { let {touched, measured_real, measured_projected, col_target, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); let is_edit = Action.is_edit(a); - let z_projected = ProjectorAction.of_zipper(z); + let is_proj = !Id.Map.is_empty(z.projectors); let segment_real = is_edit ? Zipper.unselect_and_zip(z) : meta.segment_real; - let segment_projected = Projector.of_segment(z.projectors, segment_real); - //print_endline("projected segment:"); - //segment |> Segment.show |> print_endline; let measured_real = Measured.of_segment(~touched, ~old=measured_real, segment_real); + let z_projected = is_proj ? ProjectorAction.of_zipper(z) : z; + let segment_projected = + is_proj + ? Projector.of_segment(z.projectors, segment_real) : segment_real; let measured_projected = - Measured.of_segment( - ~touched, - ~old=measured_projected, - segment_projected, - ); - let term_ranges_real = - is_edit ? TermRanges.mk(segment_real) : meta.term_ranges_real; + is_proj + ? Measured.of_segment( + ~touched, + ~old=measured_projected, + segment_projected, + ) + : measured_real; let term_ranges_projected = is_edit ? TermRanges.mk(segment_projected) : meta.term_ranges_projected; let col_target = @@ -94,18 +94,16 @@ module Meta = { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => col_target | _ => - switch (Indicated.index(z_projected)) { - | Some(i) => print_endline("indicated_id:" ++ Id.show(i)) - //let x = Id.Map.find(i, measured.tiles); - | None => print_endline("no indicated_id") - }; + // switch (Indicated.index(z_projected)) { + // | Some(i) => print_endline("indicated_id:" ++ Id.show(i)) + // | None => print_endline("no indicated_id") + // }; print_endline("Editor.next.caret_point"); Zipper.caret_point(measured_projected, z_projected).col; }; - let (view_term, terms) = - //NOTE(andrew): could use unprojected version here, might be dangerous + let (term_projected, terms) = is_edit - ? MakeTerm.go(segment_projected) : (meta.view_term, meta.terms); + ? MakeTerm.go(segment_projected) : (meta.term_projected, meta.terms); { col_target, touched, @@ -114,10 +112,9 @@ module Meta = { measured_projected, segment_real, segment_projected, - term_ranges_real, term_ranges_projected, - tiles: is_edit ? TileMap.mk(segment_real) : meta.tiles, - view_term, + tiles: is_edit ? TileMap.mk(segment_projected) : meta.tiles, + term_projected, terms, //NOTE(andrew): this is seg_project bc otherwise Code.of_hole crashes holes: is_edit ? Segment.holes(segment_projected) : meta.holes, @@ -245,3 +242,6 @@ let add_projector = (id: Id.t, p: Projector.t, ed: t) => z => {...z, projectors: Projector.Map.add(id, p, z.projectors)}, ed, ); + +let map_projectors = (f: Projector.t => Projector.t, ed: t) => + update_z(z => {...z, projectors: Projector.Map.map(f, z.projectors)}, ed); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 83a16393f7..6fc8e7321b 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,24 +1,34 @@ open Util; +open Sexplib.Std; + +[@deriving (show({with_path: false}), sexp, yojson)] +type infer = { + id: Id.t, + expected_ty: option(Typ.t), +}; [@deriving (show({with_path: false}), sexp, yojson)] type t = - | Normal - | Fold; + | Fold + | Infer(infer); let to_string: t => string = fun - | Normal => "" - | Fold => "F"; + | Fold => "F" + | Infer(_) => "I"; -let toggle_fold: t => t = - fun - | Normal => Fold - | Fold => Normal; +// let toggle_fold: t => t = +// fun +// | Normal => Fold +// | Fold => Infer +// | Infer => Normal; let placeholder_length: t => int = fun - | Normal => (-666) - | Fold => 2; + | Fold => 2 + | Infer({expected_ty: None, _}) => "-" |> String.length + | Infer({expected_ty: Some(expected_ty), _}) => + expected_ty |> Typ.pretty_print |> String.length; [@deriving (show({with_path: false}), sexp, yojson)] module Map = { @@ -33,7 +43,9 @@ module Map = { let find = find_opt; let mem = mem; let fold = fold; + let map = map; let cardinal = cardinal; + let update = update; }; let placeholder = (pr: t, id: Id.t): Piece.t => @@ -47,8 +59,7 @@ let placeholder = (pr: t, id: Id.t): Piece.t => let placehold = (prjs, p: Piece.t) => switch (Map.find(Piece.id(p), prjs)) { - | None - | Some(Normal) => p + | None => p | Some(pr) => //TODO(andrew): Maybe shouldn't just duplicate this id in the general case? placeholder( diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 539d407c4d..d43ad48b44 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -79,7 +79,7 @@ module Result = { let is_edit: t => bool = fun - | Project(_) //TODO(andrew) + | Project(_) //TODO(andrew): maybe yes as want to trigger infer? | Insert(_) | Destruct(_) | Pick_up diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index ea23981c40..593079973e 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -84,10 +84,19 @@ let go_z = switch (Indicated.index(z)) { | Some(id) => switch (Projector.Map.find(id, z.projectors)) { - | Some(_p) => { - ...z, - projectors: Projector.Map.remove(id, z.projectors), + | Some(p) => + switch (p) { + | Fold => + let f = _ => + //TODO(andrew) + Some(Projector.Infer({id, expected_ty: None})); + {...z, projectors: Projector.Map.update(id, f, z.projectors)}; + | Infer(_) => { + ...z, + projectors: Projector.Map.remove(id, z.projectors), + } } + | None => let z = { ...z, @@ -110,10 +119,7 @@ let go_z = ) ) { | None => Error(Action.Failure.Cant_move) - | Some((pid, d, _)) => - let z = proj_loj(p, z, pid, d); - //selection_dance(z, d, pid); - Ok(z); + | Some((pid, d, _)) => Ok(proj_loj(p, z, pid, d)) } | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 45b4bcf2bc..6867a18388 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -588,13 +588,12 @@ module F = (ExerciseEnv: ExerciseEnv) => { let wrap = (term, editor: Editor.t): TermItem.t => { term, - term_ranges: editor.state.meta.term_ranges_real, - //TODO(andrew): real here? + term_ranges: editor.state.meta.term_ranges_projected, + //TODO(andrew): what is this for? }; let term_of = (editor: Editor.t): Term.UExp.t => - //TODO(andrew): this is the wrong term - editor.state.meta.view_term; + MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; let stitch3 = (ed1: Editor.t, ed2: Editor.t, ed3: Editor.t) => EditorUtil.append_exp( diff --git a/src/haz3lschool/Grading.re b/src/haz3lschool/Grading.re index 2593f26dc1..4a3e940206 100644 --- a/src/haz3lschool/Grading.re +++ b/src/haz3lschool/Grading.re @@ -171,8 +171,8 @@ module F = (ExerciseEnv: Exercise.ExerciseEnv) => { }; let mk = (~your_impl: Editor.t, ~tests: syntax_tests): t => { - //TODO(andrew): this is the wrong term - let user_impl_term = your_impl.state.meta.view_term; + let user_impl_term = + MakeTerm.from_zip_for_sem(your_impl.state.zipper) |> fst; let predicates = List.map(((_, p)) => SyntaxTest.predicate_fn(p), tests); diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 95a1d81dbe..2557425025 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -178,3 +178,9 @@ let switch_example_slide = (editors: t, name: string): option(t) => None | Documentation(_, slides) => Some(Documentation(name, slides)) }; + +let get_projectors = (editors: t): Projector.Map.t => + editors |> get_editor |> Editor.get_projectors; + +let map_projectors = (editors: t, f: Projector.t => Projector.t): t => + put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 260aa6a151..0f916b6253 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -218,7 +218,11 @@ let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); let m = update_statics || update_dynamics && m.settings.core.statics - ? {...m, statics: Editors.mk_statics(~settings=m.settings, m.editors)} + ? { + let statics = Editors.mk_statics(~settings=m.settings, m.editors); + print_endline("UPDATING PROJECTORS"); + ProjectorsUpdate.update_all({...m, statics}); + } : m; if (update_dynamics && m.settings.core.dynamics) { schedule_evaluation(~schedule_action, m); diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 124133acd3..cb838d2d46 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -121,7 +121,6 @@ let deco = ~highlights: option(ColorSteps.colorMap), { state: { - // zipper, meta: { z_projected, term_ranges_projected, @@ -147,9 +146,7 @@ let deco = let error_ids = error_ids; }); let decos = - selected - ? Deco.all(z_projected, segment_projected) - : Deco.err_holes(z_projected); + selected ? Deco.all(z_projected, segment_projected) : Deco.err_holes(); let decos = switch (test_results) { | None => decos @@ -409,7 +406,7 @@ let locked = ? Interface.elaborate( ~settings=settings.core, statics.info_map, - editor.state.meta.view_term //TODO(andrew): use semantics term + statics.term, ) : DHExp.BoolLit(true); let result: ModelResult.t = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 86715ad6d8..482009a589 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -305,43 +305,16 @@ module Deco = ); }; - // faster infomap traversal - let err_holes = (_z: Zipper.t) => + let err_holes = () => List.map(term_highlight(~clss=["err-hole"]), M.error_ids); - let get_proj_measure = (id, projectors) => - switch (Projector.Map.find(id, projectors)) { - | Some(p) => - switch (Measured.find_by_id(id, M.map)) { - | Some(measurement) => Some((p, measurement)) - | _ => None - } - | None => None - }; - - let projectors = (z: Zipper.t) => - List.filter_map( - ((id, _p)) => - switch (get_proj_measure(id, z.projectors)) { - | Some((p, measurement)) => - switch (p) { - | Fold => Some(FoldView.base(~font_metrics, measurement)) - | Normal => None - } - | _ => None - }, - Id.Map.bindings(z.projectors), - ); - let indication_deco = (z: Zipper.t) => switch (Indicated.index(z)) { | Some(id) => - switch (get_proj_measure(id, z.projectors)) { - | Some((p, measurement)) => - switch (p) { - | Fold => FoldView.indicated(~font_metrics, measurement) - | Normal => indicated_piece_deco(z) - } + switch ( + ProjectorsView.indication_view(id, z.projectors, M.map, ~font_metrics) + ) { + | Some(v) => v | None => indicated_piece_deco(z) } | _ => indicated_piece_deco(z) @@ -349,17 +322,17 @@ module Deco = let all = (zipper, sel_seg) => List.concat([ - //[Node.div(~attr=Attr.id("caret"), [])], caret(zipper), - try(indication_deco(zipper)) { - | _ => - print_endline("PROJECTOR CRASH: indication_deco"); - []; - }, + indication_deco(zipper), + // try(indication_deco(zipper)) { + // | _ => + // print_endline("PROJECTOR CRASH: indication_deco"); + // []; + // }, selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), - err_holes(zipper), - projectors(zipper), + err_holes(), + ProjectorsView.view(zipper.projectors, ~font_metrics, M.map), ]); }; diff --git a/src/haz3lweb/view/FoldView.re b/src/haz3lweb/view/FoldView.re deleted file mode 100644 index 47cc905525..0000000000 --- a/src/haz3lweb/view/FoldView.re +++ /dev/null @@ -1,14 +0,0 @@ -open Virtual_dom.Vdom; -open Node; - -let base = (~font_metrics, measurement) => - div( - ~attr= - Attr.many([ - Attr.classes(["fold"]), - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [text("⋱")], - ); - -let indicated = (~font_metrics as _, _measurement) => []; diff --git a/src/haz3lweb/view/ProjectorsUpdate.re b/src/haz3lweb/view/ProjectorsUpdate.re new file mode 100644 index 0000000000..9e3734f19b --- /dev/null +++ b/src/haz3lweb/view/ProjectorsUpdate.re @@ -0,0 +1,25 @@ +open Haz3lcore; +open Projector; + +let update = (info_map: Statics.Map.t, p: t): t => + switch (p) { + | Fold => Fold + | Infer({id, _}) => + print_endline("updating infer projector id:" ++ Id.show(id)); + let expected_ty = + switch (Id.Map.find_opt(id, info_map)) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => + print_endline("infer: type found"); + Mode.ty_of(mode); + | _ => + print_endline("infer: type not found"); + Typ.Float; + }; + Infer({id, expected_ty: Some(expected_ty)}); + }; + +let update_all = ({settings, editors, statics, _} as model: Model.t): Model.t => { + let statics = Editors.lookup_statics(~settings, ~statics, editors); + let editors = Editors.map_projectors(editors, update(statics.info_map)); + {...model, editors}; +}; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re new file mode 100644 index 0000000000..5cfa7c868d --- /dev/null +++ b/src/haz3lweb/view/ProjectorsView.re @@ -0,0 +1,66 @@ +open Virtual_dom.Vdom; +open Node; +open Haz3lcore; +open Projector; + +let fold_view = (~font_metrics, measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["fold"]), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [text("⋱")], + ); + +let infer = (~font_metrics, expected_ty, measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["infer"]), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [Type.view(expected_ty)], + ); + +let projector_view = (p: Projector.t, ~font_metrics, ~measurement) => + switch (p) { + | Fold => Some(fold_view(~font_metrics, measurement)) + | Infer({expected_ty: None, _}) => + Some(infer(~font_metrics, Var("-"), measurement)) + | Infer({expected_ty: Some(expected_ty), _}) => + Some(infer(~font_metrics, expected_ty, measurement)) + }; + +let get_proj_measure = (id, projectors, map) => + switch (Projector.Map.find(id, projectors)) { + | Some(p) => + switch (Measured.find_by_id(id, map)) { + | Some(measurement) => Some((p, measurement)) + | None => None + } + | None => None + }; + +let view = (ps: Map.t, ~font_metrics, measured: Measured.t) => + List.filter_map( + ((id, _p)) => + switch (get_proj_measure(id, ps, measured)) { + | Some((p, measurement)) => + projector_view(p, ~font_metrics, ~measurement) + | _ => None + }, + Id.Map.bindings(ps), + ); + +let indication_view = + (id, projectors, measured: Measured.t, ~font_metrics as _) + : option(list(Node.t)) => + switch (get_proj_measure(id, projectors, measured: Measured.t)) { + | Some((p, _measurement)) => + switch (p) { + | Fold => Some([]) //TODO(andrew) + | Infer(_) => Some([]) //TODO(andrew) + } + | None => None + }; From 018431dc7b08b93599a6f3dee23259c8d9bfa1b0 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 02:39:45 -0400 Subject: [PATCH 030/168] better projector style --- src/haz3lcore/zipper/Editor.re | 1 + src/haz3lweb/view/ProjectorsView.re | 54 +++++++++++++++++++++++------ src/haz3lweb/view/dec/DecUtil.re | 5 +-- src/haz3lweb/view/dec/PieceDec.re | 2 ++ src/haz3lweb/www/style.css | 46 ++++++++++++++++++++---- 5 files changed, 89 insertions(+), 19 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 25d69365c3..e1f14c5ada 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -69,6 +69,7 @@ module Meta = { (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { let {touched, measured_real, measured_projected, col_target, _} = meta; let touched = Touched.update(Time.tick(), effects, touched); + //TODO(andrew): gate appropriate things on edit let is_edit = Action.is_edit(a); let is_proj = !Id.Map.is_empty(z.projectors); let segment_real = diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 5cfa7c868d..e64864313b 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -3,6 +3,16 @@ open Node; open Haz3lcore; open Projector; +let simple_shard = (~font_metrics, ~measurement: Measured.measurement) => + PieceDec.simple_shard( + ~absolute=false, + ~font_metrics, + ~shapes=(Convex, Convex), + ~path_cls=[], + ~base_cls=[], + measurement, + ); + let fold_view = (~font_metrics, measurement) => div( ~attr= @@ -10,26 +20,37 @@ let fold_view = (~font_metrics, measurement) => Attr.classes(["fold"]), DecUtil.abs_style(measurement, ~font_metrics), ]), - [text("⋱")], + [text("⋱"), simple_shard(~font_metrics, ~measurement)], + ); + +let fold_indicated = (~font_metrics, ~measurement: Measured.measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["projector-indicated", "fold"]), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [text("⋱"), simple_shard(~font_metrics, ~measurement)], ); -let infer = (~font_metrics, expected_ty, measurement) => +let infer_view = + (clss, ~font_metrics, expected_ty, ~measurement: Measured.measurement) => div( ~attr= Attr.many([ - Attr.classes(["infer"]), + Attr.classes(clss), DecUtil.abs_style(measurement, ~font_metrics), ]), - [Type.view(expected_ty)], + [Type.view(expected_ty), simple_shard(~font_metrics, ~measurement)], ); let projector_view = (p: Projector.t, ~font_metrics, ~measurement) => switch (p) { | Fold => Some(fold_view(~font_metrics, measurement)) | Infer({expected_ty: None, _}) => - Some(infer(~font_metrics, Var("-"), measurement)) + Some(infer_view(["infer"], ~font_metrics, Var("-"), ~measurement)) | Infer({expected_ty: Some(expected_ty), _}) => - Some(infer(~font_metrics, expected_ty, measurement)) + Some(infer_view(["infer"], ~font_metrics, expected_ty, ~measurement)) }; let get_proj_measure = (id, projectors, map) => @@ -54,13 +75,26 @@ let view = (ps: Map.t, ~font_metrics, measured: Measured.t) => ); let indication_view = - (id, projectors, measured: Measured.t, ~font_metrics as _) + (id, projectors, measured: Measured.t, ~font_metrics) : option(list(Node.t)) => switch (get_proj_measure(id, projectors, measured: Measured.t)) { - | Some((p, _measurement)) => + | Some((p, measurement)) => switch (p) { - | Fold => Some([]) //TODO(andrew) - | Infer(_) => Some([]) //TODO(andrew) + | Fold => Some([fold_indicated(~measurement, ~font_metrics)]) + | Infer({expected_ty, _}) => + let expected_ty = + switch (expected_ty) { + | Some(expected_ty) => expected_ty + | None => Var("-") + }; + Some([ + infer_view( + ["projector-indicated", "infer"], + ~measurement, + expected_ty, + ~font_metrics, + ), + ]); } | None => None }; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 0451490f0a..e4d9734144 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -72,6 +72,7 @@ let abs_style = (~font_metrics, measurement): Attr.t => let code_svg_sized = ( ~font_metrics: FontMetrics.t, + ~absolute=true, ~measurement: Haz3lcore.Measured.measurement, ~base_cls=[], ~path_cls=[], @@ -79,13 +80,13 @@ let code_svg_sized = paths: list(SvgUtil.Path.cmd), ) => { let d = abs_dims(measurement); - let style = pos_str(~d, ~fudge, font_metrics); + let d = absolute ? d : {left: 0, top: 0, width: d.width, height: d.height}; create_svg( "svg", ~attr= Attr.many([ Attr.classes(base_cls), - Attr.create("style", style), + Attr.create("style", pos_str(~d, ~fudge, font_metrics)), Attr.create( "viewBox", Printf.sprintf("0 0 %d %d", d.width, d.height), diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 92d0ac54fc..bd14945d10 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -45,6 +45,7 @@ let simple_shard = ~path_cls, ~base_cls, ~fudge=DecUtil.fzero, + ~absolute=true, measurement: Measured.measurement, ) : t => @@ -54,6 +55,7 @@ let simple_shard = ~base_cls, ~path_cls, ~fudge, + ~absolute, simple_shard_path(shapes, measurement.last.col - measurement.origin.col), ); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 10de63ceeb..0925b4b072 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -676,22 +676,54 @@ select { position: relative; } +/* PROJECTORS */ + .code-container .fold { position: absolute; z-index: 4; display: flex; justify-content: center; - outline: 0.3px solid #c7b480; - border-radius: 0.2em; - background-color: #f0e7d6; color: #c7b480; + cursor: pointer; } .code-container .fold:hover { color: rgb(0, 0, 0); - background-color: #c7b480; + /* background-color: #c7b480; */ } .code-container .fold svg { - filter: invert(1); + fill: #f0e7d6; + z-index: -1; +} +.code-container .infer { + opacity: 60%; + z-index: 4; +} + +.code-container .infer svg { + fill: var(--typ-bg-off-color); + z-index: -1; +} + +.projector-indicated { + z-index: 5 !important; + display: flex !important; + justify-content: center !important; +} + +.projector-indicated svg { + z-index: -1; +} +.projector-indicated.fold { + color: black; +} +.projector-indicated.fold svg { + fill: var(--exp-bg-off-color); +} +.projector-indicated.infer .typ-view{ + color: var(--typ-text-color) +} +.projector-indicated.infer svg { + fill: var(--typ-bg-off-color); } .code { @@ -1816,14 +1848,14 @@ svg.expandable path { } .cell-result.hidden { - background-color: #E8DCBF; + background-color: #e8dcbf; } .cell-result .toggle-switch { mix-blend-mode: luminosity; } .cell-result .equiv { - font-family: 'Source Code Pro'; + font-family: "Source Code Pro"; } .cell-report { From 1cd8635b502b39ad3cafe8e0f315e68cb1534cc6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 03:35:51 -0400 Subject: [PATCH 031/168] basic projection click handlers --- src/haz3lcore/zipper/action/Action.re | 3 +- src/haz3lcore/zipper/action/Perform.re | 48 +++++----- src/haz3lweb/view/Cell.re | 5 +- src/haz3lweb/view/Deco.re | 28 +++--- src/haz3lweb/view/ProjectorsView.re | 117 ++++++++++++------------- src/haz3lweb/www/style.css | 33 +++---- 6 files changed, 122 insertions(+), 112 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index d43ad48b44..93b1cffebf 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,7 +45,8 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | ToggleFold; + | ToggleFold + | Toggle(Id.t); [@deriving (show({with_path: false}), sexp, yojson)] type t = diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 593079973e..8f36287512 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -77,35 +77,39 @@ let go_z = }; }; + let la = (id, z: t, pid, d) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(p) => + switch (p) { + | Fold => + let f = _ => + //TODO(andrew) + Some(Projector.Infer({id, expected_ty: None})); + {...z, projectors: Projector.Map.update(id, f, z.projectors)}; + | Infer(_) => { + ...z, + projectors: Projector.Map.remove(id, z.projectors), + } + } + | None => + let z = { + ...z, + projectors: Projector.Map.add(id, Projector.Fold, z.projectors), + }; + selection_dance(z, d, pid); + }; + let proj_loj = (p: Action.project, z: t, pid, d) => switch (p) { | ToggleFold => print_endline("Project.go: ToggleFold"); switch (Indicated.index(z)) { - | Some(id) => - switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => - switch (p) { - | Fold => - let f = _ => - //TODO(andrew) - Some(Projector.Infer({id, expected_ty: None})); - {...z, projectors: Projector.Map.update(id, f, z.projectors)}; - | Infer(_) => { - ...z, - projectors: Projector.Map.remove(id, z.projectors), - } - } - - | None => - let z = { - ...z, - projectors: Projector.Map.add(id, Projector.Fold, z.projectors), - }; - selection_dance(z, d, pid); - } + | Some(id) => la(id, z, pid, d) | None => z }; + | Toggle(id) => + print_endline("Project.go: Toggle Id"); + la(id, z, pid, d); }; switch (a) { diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index cb838d2d46..ccb8cda2b7 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -113,6 +113,7 @@ let test_result_layer = let deco = ( + ~inject, ~font_metrics, ~show_backpack_targets, ~selected, @@ -146,7 +147,8 @@ let deco = let error_ids = error_ids; }); let decos = - selected ? Deco.all(z_projected, segment_projected) : Deco.err_holes(); + selected + ? Deco.all(~inject, z_projected, segment_projected) : Deco.err_holes(); let decos = switch (test_results) { | None => decos @@ -282,6 +284,7 @@ let editor_view = let code_text_view = Code.view(~sort, ~font_metrics, ~settings, editor); let deco_view = deco( + ~inject, ~font_metrics, ~show_backpack_targets, ~selected, diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 482009a589..76b22c282d 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -308,31 +308,37 @@ module Deco = let err_holes = () => List.map(term_highlight(~clss=["err-hole"]), M.error_ids); - let indication_deco = (z: Zipper.t) => + let indication_deco = (~inject, z: Zipper.t) => switch (Indicated.index(z)) { | Some(id) => switch ( - ProjectorsView.indication_view(id, z.projectors, M.map, ~font_metrics) + ProjectorsView.indication_view( + ~inject, + id, + z.projectors, + M.map, + ~font_metrics, + ) ) { - | Some(v) => v + | Some(v) => [v] | None => indicated_piece_deco(z) } | _ => indicated_piece_deco(z) }; - let all = (zipper, sel_seg) => + let all = (~inject, zipper, sel_seg) => List.concat([ caret(zipper), - indication_deco(zipper), - // try(indication_deco(zipper)) { - // | _ => - // print_endline("PROJECTOR CRASH: indication_deco"); - // []; - // }, + indication_deco(~inject, zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), err_holes(), - ProjectorsView.view(zipper.projectors, ~font_metrics, M.map), + ProjectorsView.view_all( + zipper.projectors, + ~inject, + ~font_metrics, + M.map, + ), ]); }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index e64864313b..a171cd26e5 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -1,7 +1,8 @@ +open Haz3lcore; open Virtual_dom.Vdom; open Node; -open Haz3lcore; open Projector; +open Util.OptUtil.Syntax; let simple_shard = (~font_metrics, ~measurement: Measured.measurement) => PieceDec.simple_shard( @@ -13,88 +14,82 @@ let simple_shard = (~font_metrics, ~measurement: Measured.measurement) => measurement, ); -let fold_view = (~font_metrics, measurement) => +let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => div( ~attr= Attr.many([ - Attr.classes(["fold"]), - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [text("⋱"), simple_shard(~font_metrics, ~measurement)], - ); - -let fold_indicated = (~font_metrics, ~measurement: Measured.measurement) => - div( - ~attr= - Attr.many([ - Attr.classes(["projector-indicated", "fold"]), + Attr.classes(["projector", "fold"] @ clss), + Attr.on_pointerdown(_ => + inject(Update.PerformAction(Project(Toggle(id)))) + ), DecUtil.abs_style(measurement, ~font_metrics), ]), [text("⋱"), simple_shard(~font_metrics, ~measurement)], ); let infer_view = - (clss, ~font_metrics, expected_ty, ~measurement: Measured.measurement) => + ( + id: Id.t, + clss, + ~font_metrics, + expected_ty, + ~inject, + ~measurement: Measured.measurement, + ) => div( ~attr= Attr.many([ - Attr.classes(clss), + Attr.classes(["projector", "infer"] @ clss), + Attr.on_pointerdown(_ => + Effect.Many([inject(Update.PerformAction(Project(Toggle(id))))]) + ), DecUtil.abs_style(measurement, ~font_metrics), ]), [Type.view(expected_ty), simple_shard(~font_metrics, ~measurement)], ); -let projector_view = (p: Projector.t, ~font_metrics, ~measurement) => +let display_ty = (expected_ty: option(Typ.t)): Typ.t => + switch (expected_ty) { + | Some(expected_ty) => expected_ty + | None => Var("-") + }; + +let projector_view = + (id, p: Projector.t, ~inject, ~font_metrics, ~measurement) => switch (p) { - | Fold => Some(fold_view(~font_metrics, measurement)) - | Infer({expected_ty: None, _}) => - Some(infer_view(["infer"], ~font_metrics, Var("-"), ~measurement)) - | Infer({expected_ty: Some(expected_ty), _}) => - Some(infer_view(["infer"], ~font_metrics, expected_ty, ~measurement)) + | Fold => fold_view(id, [], ~inject, ~font_metrics, ~measurement) + | Infer({expected_ty, _}) => + let ty = display_ty(expected_ty); + infer_view(id, [], ~inject, ~font_metrics, ty, ~measurement); }; -let get_proj_measure = (id, projectors, map) => - switch (Projector.Map.find(id, projectors)) { - | Some(p) => - switch (Measured.find_by_id(id, map)) { - | Some(measurement) => Some((p, measurement)) - | None => None - } - | None => None +let indicated_view = + (id, p: Projector.t, ~inject, ~font_metrics, ~measurement) => + switch (p) { + | Fold => + fold_view(id, ["indicated"], ~measurement, ~font_metrics, ~inject) + | Infer({expected_ty, _}) => + let ty = display_ty(expected_ty); + infer_view(id, ["indicated"], ~inject, ty, ~measurement, ~font_metrics); }; -let view = (ps: Map.t, ~font_metrics, measured: Measured.t) => +let view = + (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { + let* p = Projector.Map.find(id, ps); + let+ measurement = Measured.find_by_id(id, measured); + projector_view(id, p, ~inject, ~font_metrics, ~measurement); +}; + +let indication_view = + (id: Id.t, ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) + : option(Node.t) => { + let* p = Projector.Map.find(id, ps); + let+ measurement = Measured.find_by_id(id, measured); + indicated_view(id, p, ~inject, ~font_metrics, ~measurement); +}; + +let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => List.filter_map( - ((id, _p)) => - switch (get_proj_measure(id, ps, measured)) { - | Some((p, measurement)) => - projector_view(p, ~font_metrics, ~measurement) - | _ => None - }, + ((id, _)) => view(id, ps, ~measured, ~inject, ~font_metrics), Id.Map.bindings(ps), ); - -let indication_view = - (id, projectors, measured: Measured.t, ~font_metrics) - : option(list(Node.t)) => - switch (get_proj_measure(id, projectors, measured: Measured.t)) { - | Some((p, measurement)) => - switch (p) { - | Fold => Some([fold_indicated(~measurement, ~font_metrics)]) - | Infer({expected_ty, _}) => - let expected_ty = - switch (expected_ty) { - | Some(expected_ty) => expected_ty - | None => Var("-") - }; - Some([ - infer_view( - ["projector-indicated", "infer"], - ~measurement, - expected_ty, - ~font_metrics, - ), - ]); - } - | None => None - }; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 0925b4b072..2059bf6517 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -678,25 +678,26 @@ select { /* PROJECTORS */ -.code-container .fold { +.projector { position: absolute; - z-index: 4; + z-index: 15; + cursor: pointer; +} + +.projector.fold { display: flex; justify-content: center; color: #c7b480; - cursor: pointer; } -.code-container .fold:hover { - color: rgb(0, 0, 0); - /* background-color: #c7b480; */ +.projector.fold:hover { + color: black; } -.code-container .fold svg { +.projector.fold svg { fill: #f0e7d6; z-index: -1; } -.code-container .infer { +.projector.infer { opacity: 60%; - z-index: 4; } .code-container .infer svg { @@ -704,25 +705,25 @@ select { z-index: -1; } -.projector-indicated { +.projector.indicated { z-index: 5 !important; display: flex !important; justify-content: center !important; } -.projector-indicated svg { +.projector.indicated svg { z-index: -1; } -.projector-indicated.fold { +.projector.indicated.fold { color: black; } -.projector-indicated.fold svg { +.projector.indicated.fold svg { fill: var(--exp-bg-off-color); } -.projector-indicated.infer .typ-view{ - color: var(--typ-text-color) +.projector.indicated.infer .typ-view { + color: var(--typ-text-color); } -.projector-indicated.infer svg { +.projector.indicated.infer svg { fill: var(--typ-bg-off-color); } From e0b5bda9acdf7b0ec7da69593c46d6d086f9a71f Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 15:47:12 -0400 Subject: [PATCH 032/168] streamline way static info is provided to projectors. fix bug with projector indication --- src/haz3lcore/zipper/Editor.re | 7 ++++-- src/haz3lcore/zipper/Projector.re | 36 ++++++++++----------------- src/haz3lweb/Editors.re | 2 +- src/haz3lweb/view/ProjectorsUpdate.re | 17 ++++++------- src/haz3lweb/view/ProjectorsView.re | 2 +- src/haz3lweb/www/style.css | 6 ++--- 6 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index e1f14c5ada..d638d246d5 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -244,5 +244,8 @@ let add_projector = (id: Id.t, p: Projector.t, ed: t) => ed, ); -let map_projectors = (f: Projector.t => Projector.t, ed: t) => - update_z(z => {...z, projectors: Projector.Map.map(f, z.projectors)}, ed); +let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => + update_z( + z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, + ed, + ); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 6fc8e7321b..884a8ca256 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -17,12 +17,6 @@ let to_string: t => string = | Fold => "F" | Infer(_) => "I"; -// let toggle_fold: t => t = -// fun -// | Normal => Fold -// | Fold => Infer -// | Infer => Normal; - let placeholder_length: t => int = fun | Fold => 2 @@ -30,6 +24,15 @@ let placeholder_length: t => int = | Infer({expected_ty: Some(expected_ty), _}) => expected_ty |> Typ.pretty_print |> String.length; +let placeholder = (pr: t, id: Id.t): Piece.t => + Piece.Tile({ + id, + label: [String.make(placeholder_length(pr), ' ')], + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], + }); + [@deriving (show({with_path: false}), sexp, yojson)] module Map = { [@deriving (show({with_path: false}), sexp, yojson)] @@ -43,30 +46,17 @@ module Map = { let find = find_opt; let mem = mem; let fold = fold; - let map = map; + let mapi = mapi; let cardinal = cardinal; let update = update; }; -let placeholder = (pr: t, id: Id.t): Piece.t => - Piece.Tile({ - id, - label: [String.make(placeholder_length(pr), ' ')], - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], - }); - -let placehold = (prjs, p: Piece.t) => - switch (Map.find(Piece.id(p), prjs)) { +let placehold = (ps: Map.t, p: Piece.t) => + switch (Map.find(Piece.id(p), ps)) { | None => p | Some(pr) => //TODO(andrew): Maybe shouldn't just duplicate this id in the general case? - placeholder( - pr, - //Id.mk(), - Piece.id(p), - ) + placeholder(pr, Piece.id(p)) }; let rec of_segment = (projectors, seg: Segment.t): Segment.t => { diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 2557425025..fbfdb0ae00 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -182,5 +182,5 @@ let switch_example_slide = (editors: t, name: string): option(t) => let get_projectors = (editors: t): Projector.Map.t => editors |> get_editor |> Editor.get_projectors; -let map_projectors = (editors: t, f: Projector.t => Projector.t): t => +let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/view/ProjectorsUpdate.re b/src/haz3lweb/view/ProjectorsUpdate.re index 9e3734f19b..6285e47176 100644 --- a/src/haz3lweb/view/ProjectorsUpdate.re +++ b/src/haz3lweb/view/ProjectorsUpdate.re @@ -1,25 +1,24 @@ open Haz3lcore; open Projector; -let update = (info_map: Statics.Map.t, p: t): t => +let update = (ci: option(Info.t), p: t): t => switch (p) { | Fold => Fold | Infer({id, _}) => print_endline("updating infer projector id:" ++ Id.show(id)); let expected_ty = - switch (Id.Map.find_opt(id, info_map)) { - | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => - print_endline("infer: type found"); - Mode.ty_of(mode); - | _ => - print_endline("infer: type not found"); - Typ.Float; + switch (ci) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) + | _ => Typ.Float }; Infer({id, expected_ty: Some(expected_ty)}); }; let update_all = ({settings, editors, statics, _} as model: Model.t): Model.t => { let statics = Editors.lookup_statics(~settings, ~statics, editors); - let editors = Editors.map_projectors(editors, update(statics.info_map)); + let editors = + Editors.map_projectors(editors, (id, p) => + update(Id.Map.find_opt(id, statics.info_map), p) + ); {...model, editors}; }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index a171cd26e5..5ecf163f16 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -31,8 +31,8 @@ let infer_view = ( id: Id.t, clss, - ~font_metrics, expected_ty, + ~font_metrics, ~inject, ~measurement: Measured.measurement, ) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 2059bf6517..300646948f 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -706,9 +706,9 @@ select { } .projector.indicated { - z-index: 5 !important; - display: flex !important; - justify-content: center !important; + z-index: 16; + display: flex; + justify-content: center; } .projector.indicated svg { From b836796c33c0981d0cc86509b8310005840834cb Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 19:47:26 -0400 Subject: [PATCH 033/168] custom key handlers per projector --- src/haz3lcore/Measured.re | 16 ++++++++- src/haz3lweb/Update.re | 1 + src/haz3lweb/view/CursorInspector.re | 13 +------ src/haz3lweb/view/Page.re | 18 +++++++--- src/haz3lweb/view/ProjectorsView.re | 54 ++++++++++++++++++++++++++-- src/haz3lweb/www/style.css | 4 +-- 6 files changed, 84 insertions(+), 22 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 2be20802c4..bf84e425ed 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -213,7 +213,21 @@ let find_p = (~msg="", p: Piece.t, map): measurement => p |> Piece.get( w => find_w(w, map), - g => find_g(g, map), + g => + //TODO(andrew): find better way to reconcile this + try(find_g(g, map)) { + | _ => + find_t( + { + id: g.id, + label: [String.make(2, ' ')], + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], + }, + map, + ) + }, t => find_t(t, map), ) ) { diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 0f916b6253..8e2fa5b9d3 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -219,6 +219,7 @@ let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let m = update_statics || update_dynamics && m.settings.core.statics ? { + print_endline("UPDATING STATICS"); let statics = Editors.mk_statics(~settings=m.settings, m.editors); print_endline("UPDATING PROJECTORS"); ProjectorsUpdate.update_all({...m, statics}); diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index be91889a0c..00f9fa9cfa 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -254,17 +254,6 @@ let inspector_view = (~inject, ~settings, ci): Node.t => [view_of_info(~inject, ~settings, ci)], ); -let projectors_view = (~inject as _, editor: Editor.t) => { - open Util.OptUtil.Syntax; - let projectors = Editor.get_projectors(editor); - let* id = Indicated.index(editor.state.zipper); - let+ projector = Projector.Map.find(id, projectors); - div( - ~attr=Attr.classes(["projector-ci"]), - [text(Projector.to_string(projector))], - ); -}; - let view = (~inject, ~settings: Settings.t, editor, cursor_info: option(Info.t)) => { let bar_view = div(~attr=Attr.id("bottom-bar")); @@ -284,7 +273,7 @@ let view = div( ~attr=clss(["id"]), [text(String.sub(Id.to_string(Info.id_of(ci)), 0, 4))] - @ Option.to_list(projectors_view(~inject, editor)), + @ Option.to_list(ProjectorsView.ci(~inject, editor)), ), ]) }; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 3d992f4b06..c1a79dadad 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -3,19 +3,27 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model) => { +let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => { let get_selection = (model: Model.t): string => model.editors |> Editors.get_editor |> Printer.to_string_selection; let key_handler = (~inject, ~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)) - : Effect.t(unit) => - Effect.( - switch (Keyboard.handle_key_event(Key.mk(dir, evt))) { + : Effect.t(unit) => { + open Effect; + let key = Key.mk(dir, evt); + let editor = Editors.get_editor(model.editors); + // dispatch to projector if one is indicated + switch (ProjectorsView.dispatch_key_to(editor, key)) { + | Some(action) => + Many([Prevent_default, Stop_propagation, inject(action)]) + | None => + switch (Keyboard.handle_key_event(key)) { | None => Ignore | Some(action) => Many([Prevent_default, Stop_propagation, inject(action)]) } - ); + }; + }; [ Attr.on_keypress(_ => Effect.Prevent_default), Attr.on_keyup(key_handler(~inject, ~dir=KeyUp)), diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 5ecf163f16..e596d7de51 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,6 +4,12 @@ open Node; open Projector; open Util.OptUtil.Syntax; +let stop_mousedown_propagation = + Attr.on_mousedown(evt => { + Js_of_ocaml.Dom_html.stopPropagation(evt); + Virtual_dom.Vdom.Effect.Ignore; + }); + let simple_shard = (~font_metrics, ~measurement: Measured.measurement) => PieceDec.simple_shard( ~absolute=false, @@ -19,6 +25,7 @@ let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => ~attr= Attr.many([ Attr.classes(["projector", "fold"] @ clss), + stop_mousedown_propagation, Attr.on_pointerdown(_ => inject(Update.PerformAction(Project(Toggle(id)))) ), @@ -40,6 +47,7 @@ let infer_view = ~attr= Attr.many([ Attr.classes(["projector", "infer"] @ clss), + stop_mousedown_propagation, Attr.on_pointerdown(_ => Effect.Many([inject(Update.PerformAction(Project(Toggle(id))))]) ), @@ -50,8 +58,14 @@ let infer_view = let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { - | Some(expected_ty) => expected_ty - | None => Var("-") + | Some(expected_ty) => + print_endline( + "ProjectorsView: infer_view. expected_ty:" ++ Typ.show(expected_ty), + ); + expected_ty; + | None => + print_endline("ProjectorsView: infer_view. expected_ty: None"); + Var("-"); }; let projector_view = @@ -73,6 +87,20 @@ let indicated_view = infer_view(id, ["indicated"], ~inject, ty, ~measurement, ~font_metrics); }; +let key_handler = (p: t, id: Id.t, key: Key.t): option(UpdateAction.t) => + switch (p) { + | Infer(_) => + switch (key) { + | {key: D("Escape"), _} => Some(PerformAction(Project(Toggle(id)))) + | _ => None + } + | Fold => + switch (key) { + | {key: D("Escape"), _} => Some(PerformAction(Project(Toggle(id)))) + | _ => None + } + }; + let view = (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { let* p = Projector.Map.find(id, ps); @@ -93,3 +121,25 @@ let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => ((id, _)) => view(id, ps, ~measured, ~inject, ~font_metrics), Id.Map.bindings(ps), ); + +let indicated_proj_ed = (editor: Editor.t) => { + let projectors = Editor.get_projectors(editor); + //TODO: use z_proj instead of zipper? + let* id = Indicated.index(editor.state.zipper); + let+ projector = Projector.Map.find(id, projectors); + (id, projector); +}; + +let dispatch_key_to = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => + switch (indicated_proj_ed(editor)) { + | None => None + | Some((id, p)) => key_handler(p, id, key) + }; + +let ci = (~inject as _, editor: Editor.t) => { + let+ (_, projector) = indicated_proj_ed(editor); + div( + ~attr=Attr.classes(["projector-ci"]), + [text(Projector.to_string(projector))], + ); +}; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 300646948f..654a7d8d11 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -680,7 +680,7 @@ select { .projector { position: absolute; - z-index: 15; + z-index: 12; cursor: pointer; } @@ -706,7 +706,7 @@ select { } .projector.indicated { - z-index: 16; + z-index: 13; display: flex; justify-content: center; } From 0b807ccaece0b319c52ab8a67f0c68b60f7b3454 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 19:52:11 -0400 Subject: [PATCH 034/168] cleanup --- src/haz3lcore/zipper/Projector.re | 5 +---- src/haz3lcore/zipper/action/Perform.re | 2 +- src/haz3lweb/view/Page.re | 1 - src/haz3lweb/view/ProjectorsUpdate.re | 6 +++--- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 884a8ca256..e48a28466c 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -2,10 +2,7 @@ open Util; open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] -type infer = { - id: Id.t, - expected_ty: option(Typ.t), -}; +type infer = {expected_ty: option(Typ.t)}; [@deriving (show({with_path: false}), sexp, yojson)] type t = diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 8f36287512..7ef1124719 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -84,7 +84,7 @@ let go_z = | Fold => let f = _ => //TODO(andrew) - Some(Projector.Infer({id, expected_ty: None})); + Some(Projector.Infer({expected_ty: None})); {...z, projectors: Projector.Map.update(id, f, z.projectors)}; | Infer(_) => { ...z, diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index c1a79dadad..a7dd4674f0 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -12,7 +12,6 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => open Effect; let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - // dispatch to projector if one is indicated switch (ProjectorsView.dispatch_key_to(editor, key)) { | Some(action) => Many([Prevent_default, Stop_propagation, inject(action)]) diff --git a/src/haz3lweb/view/ProjectorsUpdate.re b/src/haz3lweb/view/ProjectorsUpdate.re index 6285e47176..5bcba5e440 100644 --- a/src/haz3lweb/view/ProjectorsUpdate.re +++ b/src/haz3lweb/view/ProjectorsUpdate.re @@ -4,14 +4,14 @@ open Projector; let update = (ci: option(Info.t), p: t): t => switch (p) { | Fold => Fold - | Infer({id, _}) => - print_endline("updating infer projector id:" ++ Id.show(id)); + | Infer(_) => + print_endline("updating infer projector"); let expected_ty = switch (ci) { | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) | _ => Typ.Float }; - Infer({id, expected_ty: Some(expected_ty)}); + Infer({expected_ty: Some(expected_ty)}); }; let update_all = ({settings, editors, statics, _} as model: Model.t): Model.t => { From af38b9cc450810bf3afe4ec40a4a89dd9df44193 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 22:58:02 -0400 Subject: [PATCH 035/168] projection types are now gated by syntactic predicate. projection caret dance is now more performant. --- src/haz3lcore/tiles/Piece.re | 6 ++ src/haz3lcore/zipper/Editor.re | 12 ++++ src/haz3lcore/zipper/action/Action.re | 3 +- src/haz3lcore/zipper/action/Indicated.re | 7 +- src/haz3lcore/zipper/action/Move.re | 3 +- src/haz3lcore/zipper/action/Perform.re | 52 ++------------- .../zipper/action/ProjectorAction.re | 65 +++++++++++++++++++ 7 files changed, 96 insertions(+), 52 deletions(-) diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 86205585d6..4fa01da541 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -84,6 +84,12 @@ let disassemble = (p: t): segment => let shapes = get(_ => None, g => Some(Grout.shapes(g)), t => Some(Tile.shapes(t))); +let is_convex = (p: t): bool => + switch (shapes(p)) { + | Some((Convex, Convex)) => true + | _ => false + }; + let is_grout: t => bool = fun | Grout(_) => true diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index d638d246d5..3004070f9d 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -249,3 +249,15 @@ let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, ); + +//TODO(andrew): use or lose +let get_projected_piece = (ed: t, id: Id.t): option(Piece.t) => { + /* Assumes for the moment that the projected thing is either + * a tile or a grout (not secondary or segment) */ + switch (Id.Map.find_opt(id, ed.state.meta.tiles)) { + | Some(tile) => Some(Tile(tile)) + | None => + List.find_opt((g: Grout.t) => g.id == id, ed.state.meta.holes) + |> Option.map(g => Piece.Grout(g)) + }; +}; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 93b1cffebf..5fcb01ea5c 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -70,7 +70,8 @@ module Failure = { | Cant_insert | Cant_destruct | Cant_select - | Cant_put_down; + | Cant_put_down + | Cant_project; }; module Result = { diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index 3df1f3cb5c..f9e3a3fcd4 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -85,10 +85,11 @@ let shard_index = (z: Zipper.t): option(int) => } }; +let for_index = + piece'(~no_ws=false, ~ign=Piece.is_secondary, ~trim_secondary=false); + let index = (z: Zipper.t): option(Id.t) => - switch ( - piece'(~no_ws=false, ~ign=Piece.is_secondary, ~trim_secondary=false, z) - ) { + switch (for_index(z)) { | None => None | Some((p, _, _)) => Some(Piece.id(p)) }; diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 55eae54546..a60c4149ff 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -82,11 +82,12 @@ module Make = (M: Editor.Meta.S) => { z |> Zipper.set_caret(Inner(d_init, c_max)) |> Zipper.move(d); let primary = (chunkiness: chunkiness, d: Direction.t, z: t): option(t) => { - print_endline("Move.primary"); switch (d, z.caret, neighbor_movability(chunkiness, z)) { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) + /* Need this case to avoid moving sub-caret onto projectors: */ + | _ when Zipper.projector_move(d, z) != None => Zipper.move(d, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 7ef1124719..ae7508b1b2 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -49,7 +49,7 @@ let go_z = } }; - let selection_dance = (z, d, pid): t => { + let _selection_dance = (z, d, pid): t => { //TODO(andrew): clean up hacky movement print_endline("PERFORM: going to start"); print_endline("direction: " ++ Direction.show(d)); @@ -77,53 +77,11 @@ let go_z = }; }; - let la = (id, z: t, pid, d) => - switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => - switch (p) { - | Fold => - let f = _ => - //TODO(andrew) - Some(Projector.Infer({expected_ty: None})); - {...z, projectors: Projector.Map.update(id, f, z.projectors)}; - | Infer(_) => { - ...z, - projectors: Projector.Map.remove(id, z.projectors), - } - } - | None => - let z = { - ...z, - projectors: Projector.Map.add(id, Projector.Fold, z.projectors), - }; - selection_dance(z, d, pid); - }; - - let proj_loj = (p: Action.project, z: t, pid, d) => - switch (p) { - | ToggleFold => - print_endline("Project.go: ToggleFold"); - switch (Indicated.index(z)) { - | Some(id) => la(id, z, pid, d) - | None => z - }; - | Toggle(id) => - print_endline("Project.go: Toggle Id"); - la(id, z, pid, d); - }; - switch (a) { - | Project(p) => - switch ( - Indicated.piece'( - ~no_ws=false, - ~ign=Piece.is_secondary, - ~trim_secondary=false, - z, - ) - ) { - | None => Error(Action.Failure.Cant_move) - | Some((pid, d, _)) => Ok(proj_loj(p, z, pid, d)) + | Project(a) => + switch (ProjectorAction.go(a, z)) { + | None => Error(Action.Failure.Cant_project) + | Some(z) => Ok(z) } | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index e02fb281e7..7ec201d34e 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -47,3 +47,68 @@ let of_zipper = (z: Zipper.t): Zipper.t => { }, }; }; + +let move_out_of_piece = + (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => + /* Might not work for pieces with more than 2 delims */ + switch (rel) { + | Sibling => {...z, caret: Outer} + | Parent => + switch (Zipper.move(d, {...z, caret: Outer})) { + | Some(z) => z + | None => z + } + }; + +let update = (f, id, z) => { + ...z, + projectors: Projector.Map.update(id, f, z.projectors), +}; + +let set = (prj, id, z) => update(_ => prj, id, z); + +let can_project = (prj: Projector.t, p: Piece.t) => + switch (prj) { + | Infer(_) => + Piece.is_convex(p) + && ( + switch (p) { + | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | _ => false + } + ) + | Fold => Piece.is_convex(p) + }; + +let default_infer: Projector.t = Infer({expected_ty: None}); + +let project = (prj, id, d, rel, z) => + z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; + +let toggle = (id, z: Zipper.t, piece, d, rel) => + switch (Projector.Map.find(id, z.projectors)) { + | Some(Fold) => + if (can_project(default_infer, piece)) { + project(default_infer, id, d, rel, z); + } else { + Some(set(None, id, z)); + } + | Some(Infer(_)) => Some(set(None, id, z)) + | None when Piece.is_convex(piece) => + if (can_project(Fold, piece)) { + project(Fold, id, d, rel, z); + } else { + None; + } + | None => None + }; + +let go = (a: Action.project, z: Zipper.t) => + switch (Indicated.for_index(z)) { + | None => None + | Some((p, d, rel)) => + switch (a) { + | ToggleFold => toggle(Piece.id(p), z, p, d, rel) + | Toggle(id) => toggle(id, z, p, d, rel) + } + }; From a473d339a62d5cd6dc55e7b21b570def29f60658 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 16 May 2024 23:29:16 -0400 Subject: [PATCH 036/168] projectors large-scale cleanup --- src/haz3lcore/tiles/Grout.re | 2 - src/haz3lcore/tiles/Piece.re | 7 -- src/haz3lcore/tiles/Secondary.re | 2 - src/haz3lcore/tiles/Tile.re | 2 - src/haz3lcore/zipper/Editor.re | 24 ++-- src/haz3lcore/zipper/Printer.re | 32 +++++ src/haz3lcore/zipper/Projector.re | 154 +------------------------ src/haz3lcore/zipper/action/Move.re | 6 +- src/haz3lcore/zipper/action/Perform.re | 39 +------ src/haz3lcore/zipper/action/Select.re | 2 +- src/haz3lschool/Exercise.re | 3 +- src/haz3lweb/Editors.re | 3 - src/haz3lweb/ScratchSlide.re | 2 +- src/haz3lweb/Update.re | 1 - src/haz3lweb/UpdateAction.re | 2 +- src/haz3lweb/util/JsUtil.re | 37 +++--- src/haz3lweb/view/Cell.re | 4 +- src/haz3lweb/view/ExerciseMode.re | 5 +- src/haz3lweb/view/Icons.re | 9 -- 19 files changed, 74 insertions(+), 262 deletions(-) diff --git a/src/haz3lcore/tiles/Grout.re b/src/haz3lcore/tiles/Grout.re index 57aa4431fd..496de68f10 100644 --- a/src/haz3lcore/tiles/Grout.re +++ b/src/haz3lcore/tiles/Grout.re @@ -57,5 +57,3 @@ let merge = (gs: list(t)): option(t) => | Some((_, ft)) => hd.shape == ft.shape ? Some(hd) : None } }; - -let update_id = (g: t, id: Id.t): t => {...g, id}; diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 4fa01da541..eb2b91e6d3 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -151,10 +151,3 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) }; - -let update_id = (p: t, id: Id.t): t => - switch (p) { - | Tile(t) => Tile(Tile.update_id(id, t)) - | Grout(g) => Grout(Grout.update_id(g, id)) - | Secondary(w) => Secondary(Secondary.update_id(w, id)) - }; diff --git a/src/haz3lcore/tiles/Secondary.re b/src/haz3lcore/tiles/Secondary.re index 3f5da66e76..7ef17b16a1 100644 --- a/src/haz3lcore/tiles/Secondary.re +++ b/src/haz3lcore/tiles/Secondary.re @@ -68,5 +68,3 @@ let get_string: secondary_content => string = }; let id = w => w.id; - -let update_id = (w: t, id) => {...w, id}; diff --git a/src/haz3lcore/tiles/Tile.re b/src/haz3lcore/tiles/Tile.re index ae18ee8c90..10c7c41e42 100644 --- a/src/haz3lcore/tiles/Tile.re +++ b/src/haz3lcore/tiles/Tile.re @@ -156,5 +156,3 @@ let pop_r = (tile: t): (segment, piece) => // }; // }; // }; - -let update_id = (id, t: t) => {...t, id}; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 3004070f9d..d1394f76af 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -11,7 +11,7 @@ module Meta = { segment_projected: Segment.t, measured_projected: Measured.t, term_projected: Term.UExp.t, - term_ranges_projected: TermRanges.t, + term_ranges: TermRanges.t, terms: TermMap.t, tiles: TileMap.t, holes: list(Grout.t), @@ -34,7 +34,7 @@ module Meta = { measured_real, measured_projected: Measured.of_segment(segment_projected), segment_projected, - term_ranges_projected: TermRanges.mk(segment_projected), + term_ranges: TermRanges.mk(segment_projected), tiles: TileMap.mk(segment_projected), term_projected, terms, @@ -43,11 +43,10 @@ module Meta = { }; }; - //TODO(andrew): what is this module used for? module type S = { let touched: Touched.t; let measured_projected: Measured.t; - let term_ranges_projected: TermRanges.t; + let term_ranges: TermRanges.t; let col_target: int; }; let module_of_t = (m: t): (module S) => @@ -55,7 +54,7 @@ module Meta = { { let touched = m.touched; let measured_projected = m.measured_projected; - let term_ranges_projected = m.term_ranges_projected; + let term_ranges = m.term_ranges; let col_target = m.col_target; }); @@ -88,8 +87,8 @@ module Meta = { segment_projected, ) : measured_real; - let term_ranges_projected = - is_edit ? TermRanges.mk(segment_projected) : meta.term_ranges_projected; + let term_ranges = + is_edit ? TermRanges.mk(segment_projected) : meta.term_ranges; let col_target = switch (a) { | Move(Local(Up | Down)) @@ -113,7 +112,7 @@ module Meta = { measured_projected, segment_real, segment_projected, - term_ranges_projected, + term_ranges, tiles: is_edit ? TileMap.mk(segment_projected) : meta.tiles, term_projected, terms, @@ -235,15 +234,6 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let get_projector = (id: Id.t, ed: t) => - Projector.Map.find(id, ed.state.zipper.projectors); - -let add_projector = (id: Id.t, p: Projector.t, ed: t) => - update_z( - z => {...z, projectors: Projector.Map.add(id, p, z.projectors)}, - ed, - ); - let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 2a1fea8493..5614c2ff86 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -91,6 +91,38 @@ let to_string_selection = (editor: Editor.t): string => ) |> String.concat("\n"); +let to_log = (~measured: Measured.t, z: Zipper.t): t => { + code: + to_rows( + ~holes=None, + ~measured, + ~caret=Some(Zipper.caret_point(measured, z)), + ~indent=" ", + ~segment=seg_of_zip(z), + ), + selection: z.selection.content |> of_segment(~holes=None) |> lines_to_list, + backpack: + List.map( + (s: Selection.t) => + s.content |> of_segment(~holes=None) |> lines_to_list, + z.backpack, + ), +}; + +let to_log_flat = (~measured, z: Zipper.t): string => { + let {code, selection, backpack} = to_log(~measured, z); + Printf.sprintf( + "CODE:\n%s\nSELECTION:\n%s\n%s\n", + String.concat("\n", code), + String.concat("\n", selection), + backpack + |> List.mapi((i, b) => + Printf.sprintf("BP(%d):\n %s\n", i, String.concat("\n", b)) + ) + |> String.concat(""), + ); +}; + let zipper_of_string = (~zipper_init=Zipper.init(), str: string): option(Zipper.t) => { let insert = (z: option(Zipper.t), c: string): option(Zipper.t) => { diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index e48a28466c..ecbbcafc27 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -51,9 +51,7 @@ module Map = { let placehold = (ps: Map.t, p: Piece.t) => switch (Map.find(Piece.id(p), ps)) { | None => p - | Some(pr) => - //TODO(andrew): Maybe shouldn't just duplicate this id in the general case? - placeholder(pr, Piece.id(p)) + | Some(pr) => placeholder(pr, Piece.id(p)) }; let rec of_segment = (projectors, seg: Segment.t): Segment.t => { @@ -87,153 +85,3 @@ let selection_sides_is = piece_is(projectors, ListUtil.hd_opt(s.content)), piece_is(projectors, ListUtil.last_opt(s.content)), ); - -/* - projector map has ids of projectors - can use infomap to get ancestors of projectors - - projector map has projector type - but for each projector we also need: - - it's extent (to use for measured) - - clarification: 'range of projector': extent in base syntax - - vs 'domain of projector': extent in view (eg collapsed entirely for fold) - - it's view function (to use for view) - - it's action function (to use for action dispatch - we might want to pre-derive: - - parent segment - - the range of the projector in the segment - - measured side: - recurse into segment, accumulating ancestor list - i guess this alternatingly comes from enclosing tiles and segment skels - i guess inside a segment, we recurse into the skel, tracking going through ancestors - from the ancestor list until we hit a tile - whose id is the target id - then we subsistute in a token consisting only of spaces/linebreaks which - takes up the space of the projector (which i guess should be a starting - and ending offset in the frame of the parent editor) - - - view side: - recurse into segment, accumulating ancestor list - i guess this alternatingly comes from enclosing tiles and segment skels - i guess inside a segment, we recurse into the skel, tracking going through ancestors - from the ancestor list until we hit a tile - whose id is the target id - - maybe to make things easier: - if for each projector we know its parent segment - and know what range of the segment 0 <= start < end < length(seg) corresponds to the projector - - ok, new plan: - in view_of_segment, we recurse the skel looking for projectors. the first (topmost) one we find, - we find it's range in the segment, and create new segment to render, consisting of the segment - vefore the projector subrange, a placeholder for the projector subrange, and the segment after - the projector subrange. we don't handle any drawing for the projector; that goes through Deco - - for first pass we dont need full recursion, so can just have a deco type that is subeditors - for first pass subeditor will just be stub views, so they can be treated as inline/tokens - (for higher phases will want to be able to insert full editors, so will likely need editors - to have programable starting col, so that we can draw them as if they were just a subsegment - of the parent editor) - - - action side: - - for opaque projectors, we will prohibit movement into them, - and make forming them eject the cursor. as long as we - ensure the cursor cant move into one, we can dont - need to worry about whether we're inside one for action permissions - - so for basic movement actions, we make moving left into an - opaque leaf projector jump to its right, and vice versa - - (phase 1.5 we allow a single cursor state on the projector itself) - - actions: movement - - phase 1.0: move past subview - - phase 1.5: move onto subview - - phase 2: move into subview - - for phase 1.5, we probably need to extend caret position to - model the cursor being on the projector itself. being in this - state will dispatch keyboard input to the projector's handler - - old: - type t = - | Outer - | Inner(int, int); - - v2: - type inner = - | Token(int, int) - | SubCell(Id.t); - type t = - | Outer - | Inner(inner); - - v3: - type base = - | Outer - | Inner(int, int); - type t = - | Base(base) - | SubCell(Id.t, t); // supports nested subcells - - - - primary movement needs to check if the piece we're trying to move into starts/ends - a subcell. if so, we (phase i) skip over it or (phase ii) move into it, ie set caret - position to Subcell(Id.t,og_caret_pos) - - 2024-02-26 - want to add some entries to Measured - right now the placeholder approach is that a monotoken is introduced - with the same id as the projector root term. this seems to work well - in the case where the projector root tile is convex, as this means that - the delims on the left and right of the projected segment are shards of - the same tile. but actually even this creates some issues actually, - see the FuCkNASTY hackzz in Measured. - - in general we are concerned with caret positions to the left and right - of the projected segment. caret_point/base_point is excepting there - because they are looking for ids not found in measured, in the case - of infix operators on both sides so they can't currently be folded. - - not sure if its a good idea, but one approach is to make sure that - the ids in Measured include the left and right delims of the projected - segment instead of the root id. - - but we probably dont want to add multiple tiles to the projection zipper. - but maybe we could add ids after the fact, copying some measurements - by querying the measurements of the placeholder tile. - - collapsed segments: - - [1]: root is 1, L is 1, R is 1 - [(1)]: root is [(,)], L is [(], R is [)] - [1+2] : root is +, L is 1, R is 2 - [let x = 1 in 4] root is [let,=,in], L is [let], R is 4 - (mythical postfix operator:) - [5!] root is [,], L is 5, L is [!] - - ideally the placeholder tile should correspond to the left and right - delims of the projected segment so as to make measured accesses - seamless. so what if: - placeholder tiles uses two shards, one for the left delim and - one for the right delim - then after we run Measured we get the placeholder measurement, - and create (up to) two new entries in the Measured map, one for - the left delim and one for the right delim, - - NOTE: currently the FuCkNASTY occurs on the right delim - of a collapsed "(1+2)" segment, but not a "1" segment - - - Current status: - singletons and convex seem to work fine - can fold [fun, ->] and [let, =, in], can unfold (from one side at least), - some movement problems - can fold infix ops if surrounded by parens; movement bugged, cant unfold - - */ diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index a60c4149ff..aa327631e4 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -104,7 +104,6 @@ module Make = (M: Editor.Meta.S) => { }; let is_at_side_of_row = (d: Direction.t, z: Zipper.t) => { - print_endline("Move.is_at_side_of_row"); let Measured.Point.{row, col} = caret_point(z); switch (Zipper.move(d, z)) { | None => true @@ -177,7 +176,6 @@ module Make = (M: Editor.Meta.S) => { /* Here f should be a function which results in strict d-wards movement of the caret. Iterate f until we get to the closet caret position to a target derived from the initial position */ - print_endline("Move.do_vertical"); let cur_p = caret_point(z); let goal = Measured.Point.{ @@ -239,10 +237,10 @@ module Make = (M: Editor.Meta.S) => { | Some(z) => Some(z) }; - let jump_to_id = (~init=Direction.Left, z: t, id: Id.t): option(t) => { + let jump_to_id = (z: t, id: Id.t): option(t) => { let* {origin, _} = Measured.find_by_id(id, M.measured_projected); let z = - switch (init == Left ? to_start(z) : to_end(z)) { + switch (to_start(z)) { | None => z | Some(z) => z }; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index ae7508b1b2..ea1867aaeb 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -3,12 +3,13 @@ open Zipper; let is_write_action = (a: Action.t) => { switch (a) { + //TODO: revist as projectors grow + | Project(_) => false | Move(_) | MoveToNextHole(_) | Unselect(_) | Jump(_) | Select(_) => false - | Project(_) //TODO(andrew): ?? | Destruct(_) | Insert(_) | Pick_up @@ -37,46 +38,14 @@ let go_z = let select_term_current = z => switch (Indicated.index(z)) { - | None => - print_endline("PERFORM.select_term_current: no index"); - Error(Action.Failure.Cant_select); + | None => Error(Action.Failure.Cant_select) | Some(id) => switch (Select.term(id, z)) { | Some(z) => Ok(z) - | None => - print_endline("PERFORM.select_term_current: Select.term failed"); - Error(Action.Failure.Cant_select); + | None => Error(Action.Failure.Cant_select) } }; - let _selection_dance = (z, d, pid): t => { - //TODO(andrew): clean up hacky movement - print_endline("PERFORM: going to start"); - print_endline("direction: " ++ Direction.show(d)); - //d == Left ? Move.to_end(z) : Move.to_start(z) - switch (select_term_current(z)) { - | Error(_err) => - //TODO(andrew): deal with this properly - //figure out why selection is failing (metrics issue?) - print_endline("PERFORM: ERROR couldn't select, going to start instead"); - switch (Move.jump_to_id(~init=Left, z, Piece.id(pid))) { - | None => - print_endline("PERFORM: jump_to_id failed"); - z; - | Some(z) => - print_endline("PERFORM: jump_to_id succeeded"); - z; - // switch (select_term_current(z)) { - // | Ok(z) => Ok(directional_unselect(Direction.toggle(d), z)) - // | Error(_err) => Ok(z) - // }; - }; - | Ok(z) => - print_endline("PERFORM: select_term_current succeeded"); - directional_unselect(Direction.toggle(d), z); - }; - }; - switch (a) { | Project(a) => switch (ProjectorAction.go(a, z)) { diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 6a198a4e5f..4eff98afdf 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -29,7 +29,7 @@ module Make = (M: Editor.Meta.S) => { let term = (id: Id.t, z: Zipper.t): option(Zipper.t) => { //TODO: check if selection is already a term: no-op in this case - let* (l, r) = TermRanges.find_opt(id, M.term_ranges_projected); + let* (l, r) = TermRanges.find_opt(id, M.term_ranges); print_endline( "Select.term: l: " ++ Id.show(Piece.id(l)) diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 6867a18388..b9f6165ace 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -588,8 +588,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { let wrap = (term, editor: Editor.t): TermItem.t => { term, - term_ranges: editor.state.meta.term_ranges_projected, - //TODO(andrew): what is this for? + term_ranges: editor.state.meta.term_ranges, }; let term_of = (editor: Editor.t): Term.UExp.t => diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index fbfdb0ae00..28bce5be19 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -179,8 +179,5 @@ let switch_example_slide = (editors: t, name: string): option(t) => | Documentation(_, slides) => Some(Documentation(name, slides)) }; -let get_projectors = (editors: t): Projector.Map.t => - editors |> get_editor |> Editor.get_projectors; - let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/ScratchSlide.re b/src/haz3lweb/ScratchSlide.re index a95bbc0167..09860711ed 100644 --- a/src/haz3lweb/ScratchSlide.re +++ b/src/haz3lweb/ScratchSlide.re @@ -51,6 +51,6 @@ let mk_statics = let term = MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; let info_map = Interface.Statics.mk_map_ctx(settings.core, ctx_init, term); let error_ids = - Statics.Map.error_ids(editor.state.meta.term_ranges_projected, info_map); + Statics.Map.error_ids(editor.state.meta.term_ranges, info_map); {term, info_map, error_ids}; }; diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 8e2fa5b9d3..ff51baad26 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -221,7 +221,6 @@ let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { ? { print_endline("UPDATING STATICS"); let statics = Editors.mk_statics(~settings=m.settings, m.editors); - print_endline("UPDATING PROJECTORS"); ProjectorsUpdate.update_all({...m, statics}); } : m; diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index e4ce0b4840..2003a48d15 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -279,7 +279,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) => true - | Project(_) //TODO(andrew) + | Project(_) | Unselect(_) | Select(All) => false } diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index 1b8685f6b3..d9a7efc7fc 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -3,11 +3,13 @@ open Virtual_dom.Vdom; let get_elem_by_id = id => { let doc = Dom_html.document; - Js.Opt.get(doc##getElementById(Js.string(id)), () => { - assert - (false) - //print_endline(id); - }); + Js.Opt.get( + doc##getElementById(Js.string(id)), + () => { + print_endline(id); + assert(false); + }, + ); }; let date_now = () => { @@ -121,18 +123,21 @@ let copy = (str: string) => { ); }; -let scroll_cursor_into_view_if_needed = () => { - let caret_elem = get_elem_by_id("caret"); - let main = get_elem_by_id("main"); - let main_rect = main##getBoundingClientRect; - let caret_rect = caret_elem##getBoundingClientRect; - - if (caret_rect##.top < main_rect##.top) { - caret_elem##scrollIntoView(Js._true); - } else if (caret_rect##.bottom > main_rect##.bottom) { - caret_elem##scrollIntoView(Js._false); +let scroll_cursor_into_view_if_needed = () => + try({ + let caret_elem = get_elem_by_id("caret"); + let main = get_elem_by_id("main"); + let main_rect = main##getBoundingClientRect; + let caret_rect = caret_elem##getBoundingClientRect; + + if (caret_rect##.top < main_rect##.top) { + caret_elem##scrollIntoView(Js._true); + } else if (caret_rect##.bottom > main_rect##.bottom) { + caret_elem##scrollIntoView(Js._false); + }; + }) { + | Assert_failure(_) => () }; -}; module Fragment = { let set_current = frag => { diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index ccb8cda2b7..1aeed58a06 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -124,7 +124,7 @@ let deco = state: { meta: { z_projected, - term_ranges_projected, + term_ranges, segment_projected, measured_projected, terms, @@ -140,7 +140,7 @@ let deco = Deco.Deco({ let map = measured_projected; let terms = terms; - let term_ranges = term_ranges_projected; + let term_ranges = term_ranges; let tiles = tiles; let font_metrics = font_metrics; let show_backpack_targets = show_backpack_targets; diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 28f4fa2c86..52302e7493 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -60,10 +60,7 @@ let view = Cell.editor_view( ~selected=pos == this_pos, ~error_ids= - Statics.Map.error_ids( - editor.state.meta.term_ranges_projected, - di.info_map, - ), + Statics.Map.error_ids(editor.state.meta.term_ranges, di.info_map), ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], diff --git a/src/haz3lweb/view/Icons.re b/src/haz3lweb/view/Icons.re index 9957445b48..1067286891 100644 --- a/src/haz3lweb/view/Icons.re +++ b/src/haz3lweb/view/Icons.re @@ -57,15 +57,6 @@ let star = ], ); -let fold = - simple_icon( - ~view="0 0 1200 1200", - [ - "m875 625h-275c-13.805 0-25-11.195-25-25v-267.19h50v206.83l407.32-407.32 35.359 35.352-407.32 407.32h214.64z", - "m125 200c0-13.809 11.191-25 25-25h500v50h-475v800h800v-475h50v500c0 13.805-11.195 25-25 25h-850c-13.809 0-25-11.195-25-25z", - ], - ); - let bomb = simple_icon( ~view="0 0 1200 1200", From 1c2e452c3b7de753f1d494351e1ff2d9dea35f73 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 17 May 2024 20:34:11 -0400 Subject: [PATCH 037/168] remove some dodgy try-catching --- src/haz3lcore/zipper/Editor.re | 4 --- src/haz3lcore/zipper/action/Indicated.re | 16 +++------ src/haz3lweb/view/Deco.re | 46 ++++++++++-------------- src/haz3lweb/view/ProjectorsView.re | 17 +++------ src/haz3lweb/view/dec/PieceDec.re | 13 +++++++ 5 files changed, 41 insertions(+), 55 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index d1394f76af..b72353f632 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -94,10 +94,6 @@ module Meta = { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => col_target | _ => - // switch (Indicated.index(z_projected)) { - // | Some(i) => print_endline("indicated_id:" ++ Id.show(i)) - // | None => print_endline("no indicated_id") - // }; print_endline("Editor.next.caret_point"); Zipper.caret_point(measured_projected, z_projected).col; }; diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index f9e3a3fcd4..e70a77a014 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -7,20 +7,15 @@ type relation = | Sibling; let piece' = - (~no_ws: bool, ~ign: Piece.t => bool, ~trim_secondary=false, z: Zipper.t) + (~no_ws: bool, ~ign: Piece.t => bool, z: Zipper.t) : option((Piece.t, Direction.t, relation)) => { - let sibs = - trim_secondary - ? sibs_with_sel(z) |> Siblings.trim_secondary : sibs_with_sel(z); /* Returns the piece currently indicated (if any) and which side of that piece the caret is on. We favor indicating the piece to the (R)ight, but may end up indicating the (P)arent or the (L)eft. We don't indicate secondary tiles. This function ignores whether or not there is a selection so this can be used to get the caret direction, but the caller shouldn't indicate if there's a selection */ - switch (Siblings.neighbors(sibs), parent(z)) { - /* Non-empty selection => no indication */ - //| _ when z.selection.content != [] => None + switch (Siblings.neighbors(sibs_with_sel(z)), parent(z)) { /* Empty syntax => no indication */ | ((None, None), None) => None /* L not secondary, R is secondary => indicate L */ @@ -85,8 +80,7 @@ let shard_index = (z: Zipper.t): option(int) => } }; -let for_index = - piece'(~no_ws=false, ~ign=Piece.is_secondary, ~trim_secondary=false); +let for_index = piece'(~no_ws=false, ~ign=Piece.is_secondary); let index = (z: Zipper.t): option(Id.t) => switch (for_index(z)) { @@ -101,9 +95,7 @@ let ci_of = (z: Zipper.t, info_map: Statics.Map.t): option(Statics.Info.t) => * Secondary. But if this doesn't succeed, then we create a 'virtual' * info map entry representing the Secondary notation, which takes on * some of the semantic context of a nearby 'proxy' term */ - switch ( - piece'(~no_ws=true, ~ign=Piece.is_secondary, ~trim_secondary=false, z) - ) { + switch (piece'(~no_ws=true, ~ign=Piece.is_secondary, z)) { | Some((p, _, _)) => Id.Map.find_opt(Piece.id(p), info_map) | None => let sibs = sibs_with_sel(z); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 76b22c282d..ff973d3cd1 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -43,35 +43,27 @@ module Deco = (start_shape: Nib.Shape.t, p: Piece.t) : (Nib.Shape.t, list(option(shard_data))) => { let shard_data = - try( - switch (p) { - | Tile(t) => sel_of_tile(~start_shape, t) - | Grout(g) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), - p, - ), + switch (p) { + | Tile(t) => sel_of_tile(~start_shape, t) + | Grout(g) => [ + Some( + sel_shard_svg( + ~start_shape, + Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), + p, ), - ] - | Secondary(w) when Secondary.is_linebreak(w) => [None] - | Secondary(w) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), - p, - ), + ), + ] + | Secondary(w) when Secondary.is_linebreak(w) => [None] + | Secondary(w) => [ + Some( + sel_shard_svg( + ~start_shape, + Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), + p, ), - ] - } - ) { - | _ => - print_endline("PROJECTOR CRASH: sel_of_piece"); - //TODO(andrew): relax. this is the case when tiles are missing - //measured info due to being hidden by a projector - []; + ), + ] }; let start_shape = switch (Piece.nibs(p)) { diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index e596d7de51..8f9089bf5b 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -10,16 +10,6 @@ let stop_mousedown_propagation = Virtual_dom.Vdom.Effect.Ignore; }); -let simple_shard = (~font_metrics, ~measurement: Measured.measurement) => - PieceDec.simple_shard( - ~absolute=false, - ~font_metrics, - ~shapes=(Convex, Convex), - ~path_cls=[], - ~base_cls=[], - measurement, - ); - let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => div( ~attr= @@ -31,7 +21,7 @@ let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => ), DecUtil.abs_style(measurement, ~font_metrics), ]), - [text("⋱"), simple_shard(~font_metrics, ~measurement)], + [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], ); let infer_view = @@ -53,7 +43,10 @@ let infer_view = ), DecUtil.abs_style(measurement, ~font_metrics), ]), - [Type.view(expected_ty), simple_shard(~font_metrics, ~measurement)], + [ + Type.view(expected_ty), + PieceDec.convex_shard(~font_metrics, ~measurement), + ], ); let display_ty = (expected_ty: option(Typ.t)): Typ.t => diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index bd14945d10..15f5eadeac 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -59,6 +59,19 @@ let simple_shard = simple_shard_path(shapes, measurement.last.col - measurement.origin.col), ); +let relative_shard = + (~font_metrics, ~shapes, ~measurement: Measured.measurement) => + simple_shard( + ~absolute=false, + ~font_metrics, + ~shapes, + ~path_cls=[], + ~base_cls=[], + measurement, + ); + +let convex_shard = relative_shard(~shapes=(Convex, Convex)); + let simple_shard_selected = (~font_metrics, ~shapes, ~measurement: Measured.measurement, ~buffer): t => { let path_cls = [ From 2e1299f7ece1937be18a17f3233bf91326f78815 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 18 May 2024 00:50:41 -0400 Subject: [PATCH 038/168] principled editor meta for projectors --- src/haz3lcore/Measured.re | 25 +--- src/haz3lcore/zipper/Editor.re | 138 ++++++++---------- src/haz3lcore/zipper/Printer.re | 52 ++----- src/haz3lcore/zipper/Zipper.re | 47 +++--- src/haz3lcore/zipper/action/Move.re | 12 +- .../zipper/action/ProjectorAction.re | 21 +-- src/haz3lcore/zipper/action/Select.re | 7 +- src/haz3lschool/Exercise.re | 2 +- src/haz3lweb/ScratchSlide.re | 2 +- src/haz3lweb/view/Cell.re | 20 +-- src/haz3lweb/view/Code.re | 9 +- src/haz3lweb/view/ExerciseMode.re | 5 +- .../view/assistant/UpdateAssistant.re | 3 +- 13 files changed, 134 insertions(+), 209 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index bf84e425ed..0b849ac195 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -199,35 +199,18 @@ let find_t = (t: Tile.t, map): measurement => { let last = ListUtil.assoc_err(Tile.r_shard(t), shards, "find_t"); (first, last); }) { - | _ => - print_endline("FuCkNASTY hackzz"); - let s = shards |> List.hd; - (s |> snd, s |> snd); + | _ => failwith("find_t: inconsistent shard infor between tile and map") + // let s = shards |> List.hd; + // (s |> snd, s |> snd); }; {origin: first.origin, last: last.last}; }; -// let find_a = ({shards: (l, r), _} as a: Ancestor.t, map) => -// List.assoc(l @ r, Id.Map.find(a.id, map.tiles)); let find_p = (~msg="", p: Piece.t, map): measurement => try( p |> Piece.get( w => find_w(w, map), - g => - //TODO(andrew): find better way to reconcile this - try(find_g(g, map)) { - | _ => - find_t( - { - id: g.id, - label: [String.make(2, ' ')], - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], - }, - map, - ) - }, + g => find_g(g, map), t => find_t(t, map), ) ) { diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index b72353f632..86387a6d31 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -2,15 +2,12 @@ open Sexplib.Std; open Util; module Meta = { - type t = { - col_target: int, - touched: Touched.t, - segment_real: Segment.t, - measured_real: Measured.t, - z_projected: Zipper.t, - segment_projected: Segment.t, - measured_projected: Measured.t, - term_projected: Term.UExp.t, + /* Derived data for projected zipper */ + type projected = { + z: Zipper.t, + segment: Segment.t, + measured: Measured.t, + term: Term.UExp.t, term_ranges: TermRanges.t, terms: TermMap.t, tiles: TileMap.t, @@ -18,34 +15,39 @@ module Meta = { buffer_ids: list(Id.t), }; + type t = { + col_target: int, + touched: Touched.t, + projected, + }; + + let init_projected = (z_projected: Zipper.t): projected => { + let segment = Zipper.unselect_and_zip(z_projected); + let (term, terms) = MakeTerm.go(segment); + { + z: z_projected, + segment, + term, + terms, + term_ranges: TermRanges.mk(segment), + tiles: TileMap.mk(segment), + holes: Segment.holes(segment), + measured: Measured.of_segment(segment), + buffer_ids: Selection.buffer_ids(z_projected.selection), + }; + }; + let init = (z: Zipper.t) => { - let segment_real = Zipper.unselect_and_zip(z); - let measured_real = Measured.of_segment(segment_real); - let is_proj = !Id.Map.is_empty(z.projectors); - let z_projected = is_proj ? ProjectorAction.of_zipper(z) : z; - let segment_projected = - is_proj ? Zipper.unselect_and_zip(z_projected) : segment_real; - let (term_projected, terms) = MakeTerm.go(segment_projected); { col_target: 0, touched: Touched.empty, - z_projected, - segment_real, - measured_real, - measured_projected: Measured.of_segment(segment_projected), - segment_projected, - term_ranges: TermRanges.mk(segment_projected), - tiles: TileMap.mk(segment_projected), - term_projected, - terms, - holes: Segment.holes(segment_projected), - buffer_ids: Selection.buffer_ids(z.selection), + projected: z |> ProjectorAction.of_zipper |> init_projected, }; }; module type S = { let touched: Touched.t; - let measured_projected: Measured.t; + let measured: Measured.t; let term_ranges: TermRanges.t; let col_target: int; }; @@ -53,8 +55,8 @@ module Meta = { (module { let touched = m.touched; - let measured_projected = m.measured_projected; - let term_ranges = m.term_ranges; + let measured = m.projected.measured; + let term_ranges = m.projected.term_ranges; let col_target = m.col_target; }); @@ -64,58 +66,40 @@ module Meta = { let yojson_of_t = _ => failwith("Editor.Meta.yojson_of_t"); let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); + let next_projected = (z, ~touched, ~old) => { + let segment = Zipper.unselect_and_zip(z); + let (term, terms) = MakeTerm.go(segment); + let measured = Measured.of_segment(~touched, ~old, segment); + { + z, + segment, + term, + terms, + measured, + term_ranges: TermRanges.mk(segment), + tiles: TileMap.mk(segment), + holes: Segment.holes(segment), + buffer_ids: Selection.buffer_ids(z.selection), + }; + }; + let next = (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { - let {touched, measured_real, measured_projected, col_target, _} = meta; - let touched = Touched.update(Time.tick(), effects, touched); - //TODO(andrew): gate appropriate things on edit - let is_edit = Action.is_edit(a); - let is_proj = !Id.Map.is_empty(z.projectors); - let segment_real = - is_edit ? Zipper.unselect_and_zip(z) : meta.segment_real; - let measured_real = - Measured.of_segment(~touched, ~old=measured_real, segment_real); - let z_projected = is_proj ? ProjectorAction.of_zipper(z) : z; - let segment_projected = - is_proj - ? Projector.of_segment(z.projectors, segment_real) : segment_real; - let measured_projected = - is_proj - ? Measured.of_segment( - ~touched, - ~old=measured_projected, - segment_projected, - ) - : measured_real; - let term_ranges = - is_edit ? TermRanges.mk(segment_projected) : meta.term_ranges; + let touched = Touched.update(Time.tick(), effects, meta.touched); let col_target = switch (a) { | Move(Local(Up | Down)) - | Select(Resize(Local(Up | Down))) => col_target + | Select(Resize(Local(Up | Down))) => meta.col_target + | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col + }; + let z_projected = ProjectorAction.of_zipper(z); + let projected = + switch (Action.is_edit(a)) { + | false => {...meta.projected, z: z_projected} | _ => - print_endline("Editor.next.caret_point"); - Zipper.caret_point(measured_projected, z_projected).col; + next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; - let (term_projected, terms) = - is_edit - ? MakeTerm.go(segment_projected) : (meta.term_projected, meta.terms); - { - col_target, - touched, - z_projected, - measured_real, - measured_projected, - segment_real, - segment_projected, - term_ranges, - tiles: is_edit ? TileMap.mk(segment_projected) : meta.tiles, - term_projected, - terms, - //NOTE(andrew): this is seg_project bc otherwise Code.of_hole crashes - holes: is_edit ? Segment.holes(segment_projected) : meta.holes, - buffer_ids: Selection.buffer_ids(z.selection), - }; + {touched, col_target, projected}; }; }; @@ -240,10 +224,10 @@ let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => let get_projected_piece = (ed: t, id: Id.t): option(Piece.t) => { /* Assumes for the moment that the projected thing is either * a tile or a grout (not secondary or segment) */ - switch (Id.Map.find_opt(id, ed.state.meta.tiles)) { + switch (Id.Map.find_opt(id, ed.state.meta.projected.tiles)) { | Some(tile) => Some(Tile(tile)) | None => - List.find_opt((g: Grout.t) => g.id == id, ed.state.meta.holes) + List.find_opt((g: Grout.t) => g.id == id, ed.state.meta.projected.holes) |> Option.map(g => Piece.Grout(g)) }; }; diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 5614c2ff86..a96108a219 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -60,9 +60,11 @@ let to_rows = }; }; -let pretty_print = (~measured: Measured.t, z: Zipper.t): string => +let pretty_print = + (~holes: option(string)=Some(""), ~measured: Measured.t, z: Zipper.t) + : string => to_rows( - ~holes=None, + ~holes, ~measured, ~caret=None, ~indent=" ", @@ -70,20 +72,24 @@ let pretty_print = (~measured: Measured.t, z: Zipper.t): string => ) |> String.concat("\n"); -let to_string_editor = - (~holes: option(string)=Some(""), editor: Editor.t): string => +let zipper_to_string = + (~holes: option(string)=Some(""), z: Zipper.t): string => to_rows( ~holes, - ~measured=editor.state.meta.measured_real, + ~measured=Zipper.measured(z), ~caret=None, ~indent="", - ~segment=seg_of_zip(editor.state.zipper), + ~segment=seg_of_zip(z), ) |> String.concat("\n"); +let to_string_editor = + (~holes: option(string)=Some(""), editor: Editor.t): string => + zipper_to_string(~holes, editor.state.zipper); + let to_string_selection = (editor: Editor.t): string => to_rows( - ~measured=editor.state.meta.measured_real, + ~measured=Zipper.measured(editor.state.zipper), ~caret=None, ~indent=" ", ~holes=None, @@ -91,38 +97,6 @@ let to_string_selection = (editor: Editor.t): string => ) |> String.concat("\n"); -let to_log = (~measured: Measured.t, z: Zipper.t): t => { - code: - to_rows( - ~holes=None, - ~measured, - ~caret=Some(Zipper.caret_point(measured, z)), - ~indent=" ", - ~segment=seg_of_zip(z), - ), - selection: z.selection.content |> of_segment(~holes=None) |> lines_to_list, - backpack: - List.map( - (s: Selection.t) => - s.content |> of_segment(~holes=None) |> lines_to_list, - z.backpack, - ), -}; - -let to_log_flat = (~measured, z: Zipper.t): string => { - let {code, selection, backpack} = to_log(~measured, z); - Printf.sprintf( - "CODE:\n%s\nSELECTION:\n%s\n%s\n", - String.concat("\n", code), - String.concat("\n", selection), - backpack - |> List.mapi((i, b) => - Printf.sprintf("BP(%d):\n %s\n", i, String.concat("\n", b)) - ) - |> String.concat(""), - ); -}; - let zipper_of_string = (~zipper_init=Zipper.init(), str: string): option(Zipper.t) => { let insert = (z: option(Zipper.t), c: string): option(Zipper.t) => { diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index db89a3fc71..8f01ce414d 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -317,30 +317,6 @@ let move = (d: Direction.t, z: t): option(t) => let select = (d: Direction.t, z: t): option(t) => d == z.selection.focus ? grow_selection(z) : shrink_selection(z); -// let id_on = (d: Direction.t, id: Id.t, z: t): bool => -// switch (d) { -// | Left => -// switch (z.relatives.siblings, z.relatives.ancestors) { -// | (([_, ..._] as ls, _), _) => Piece.id(ListUtil.last(ls)) == id -// | _ => false -// } -// | Right => -// switch (z.relatives.siblings, z.relatives.ancestors) { -// | ((_, [r, ..._]), _) => Piece.id(r) == id -// | _ => false -// } -// }; - -/* Loop action until pred is satisfied */ -// let rec do_until = -// (action: t => option(t), pred: t => bool, z: t): option(t) => -// pred(z) -// ? Some(z) -// : { -// let* z = action(z); -// do_until(action, pred, z); -// }; - let pick_up = (z: t): t => { let (selected, z) = update_selection(Selection.empty, z); let selection = @@ -468,9 +444,32 @@ let caret_direction = (z: t): option(Direction.t) => } }; +let get_projector = (z: t, id: Id.t): option(Projector.t) => + Projector.Map.find(id, z.projectors); + +let measured = z => { + z |> unselect_and_zip |> Measured.of_segment; +}; + let base_point = (measured: Measured.t, z: t): Measured.Point.t => { switch (representative_piece(z)) { | Some((p, d)) => + /* NOTE(andrew): Below conversion necessary because sometimes + * we call this with measured based on projected zipper + * measurements but also z is the non-projected zipper. + * This should work okay since the core movement/selection + * actions in Zipper avoid cursor positions around pieces + * which would be absent in the projected zipper. The problem + * is the projected tile itself. Specifically because looking + * up measurements is not currently homogenous; it takes a + * piece, not an id. Piece-based lookups will fail if (say) + * a Grout becomes a Tile. Hence we convert pieces that + * would be projected to their placeholders before lookup */ + let p = + switch (get_projector(z, Piece.id(p))) { + | Some(pr) => Projector.placeholder(pr, Piece.id(p)) + | None => p + }; let seg = Piece.disassemble(p); switch (d) { | Left => diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index aa327631e4..fe16b5fb05 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -61,15 +61,7 @@ let neighbor_movability = }; module Make = (M: Editor.Meta.S) => { - let caret_point = t => { - // print_endline("Move.caret_point"); - Zipper.caret_point( - M.measured_projected, - //TODO(andrew): why real here? if use projected, - // get caret point errs but only for grout not tiles - t, - ); - }; + let caret_point = t => Zipper.caret_point(M.measured, t); let pop_out = z => Some(z |> Zipper.set_caret(Outer)); let pop_move = (d, z) => z |> Zipper.set_caret(Outer) |> Zipper.move(d); @@ -238,7 +230,7 @@ module Make = (M: Editor.Meta.S) => { }; let jump_to_id = (z: t, id: Id.t): option(t) => { - let* {origin, _} = Measured.find_by_id(id, M.measured_projected); + let* {origin, _} = Measured.find_by_id(id, M.measured); let z = switch (to_start(z)) { | None => z diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 7ec201d34e..2a018f9f5b 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -37,16 +37,19 @@ let of_selection = }; }; -let of_zipper = (z: Zipper.t): Zipper.t => { - { - ...z, - selection: of_selection(z.projectors, z.selection), - relatives: { - ancestors: of_ancestors(z.projectors, z.relatives.ancestors), - siblings: of_siblings(z.projectors, z.relatives.siblings), - }, +let of_zipper = (z: Zipper.t): Zipper.t => + if (Id.Map.is_empty(z.projectors)) { + z; + } else { + { + ...z, + selection: of_selection(z.projectors, z.selection), + relatives: { + ancestors: of_ancestors(z.projectors, z.relatives.ancestors), + siblings: of_siblings(z.projectors, z.relatives.siblings), + }, + }; }; -}; let move_out_of_piece = (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index 4eff98afdf..b905e0cb02 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -22,7 +22,7 @@ module Make = (M: Editor.Meta.S) => { let range = (l: Id.t, r: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, l); print_endline("Select.range: first"); - let* Measured.{last, _} = Measured.find_by_id(r, M.measured_projected); + let* Measured.{last, _} = Measured.find_by_id(r, M.measured); print_endline("Select.range: last"); Move.do_towards(Zipper.select, last, z); }; @@ -41,7 +41,7 @@ module Make = (M: Editor.Meta.S) => { let tile = (id: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, id); - let* Measured.{last, _} = Measured.find_by_id(id, M.measured_projected); + let* Measured.{last, _} = Measured.find_by_id(id, M.measured); Move.do_towards(primary, last, z); }; @@ -49,8 +49,7 @@ module Make = (M: Editor.Meta.S) => { switch (d) { | Goal(Piece(_)) => failwith("Select.go not implemented for Piece Goal") | Goal(Point(goal)) => - let anchor = - z |> Zipper.toggle_focus |> Zipper.caret_point(M.measured_projected); + let anchor = z |> Zipper.toggle_focus |> Zipper.caret_point(M.measured); Move.do_towards(~anchor, primary, goal, z); | Extreme(d) => Move.do_extreme(primary, d, z) | Local(d) => diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index b9f6165ace..ed0ab06529 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -588,7 +588,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { let wrap = (term, editor: Editor.t): TermItem.t => { term, - term_ranges: editor.state.meta.term_ranges, + term_ranges: editor.state.meta.projected.term_ranges, }; let term_of = (editor: Editor.t): Term.UExp.t => diff --git a/src/haz3lweb/ScratchSlide.re b/src/haz3lweb/ScratchSlide.re index 09860711ed..0c346aaa7b 100644 --- a/src/haz3lweb/ScratchSlide.re +++ b/src/haz3lweb/ScratchSlide.re @@ -51,6 +51,6 @@ let mk_statics = let term = MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; let info_map = Interface.Statics.mk_map_ctx(settings.core, ctx_init, term); let error_ids = - Statics.Map.error_ids(editor.state.meta.term_ranges, info_map); + Statics.Map.error_ids(editor.state.meta.projected.term_ranges, info_map); {term, info_map, error_ids}; }; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 1aeed58a06..e6f89dea54 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -123,12 +123,7 @@ let deco = { state: { meta: { - z_projected, - term_ranges, - segment_projected, - measured_projected, - terms, - tiles, + projected: {z, term_ranges, segment, measured, terms, tiles, _}, _, }, _, @@ -138,7 +133,7 @@ let deco = ) => { module Deco = Deco.Deco({ - let map = measured_projected; + let map = measured; let terms = terms; let term_ranges = term_ranges; let tiles = tiles; @@ -146,19 +141,12 @@ let deco = let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; }); - let decos = - selected - ? Deco.all(~inject, z_projected, segment_projected) : Deco.err_holes(); + let decos = selected ? Deco.all(~inject, z, segment) : Deco.err_holes(); let decos = switch (test_results) { | None => decos | Some(test_results) => - decos - @ test_result_layer( - ~font_metrics, - ~measured=measured_projected, - test_results, - ) // TODO move into decos + decos @ test_result_layer(~font_metrics, ~measured, test_results) // TODO move into decos }; switch (highlights) { | Some(colorMap) => diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 5f7a9a5ba0..191db619be 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -164,7 +164,7 @@ let view = ~settings: Settings.t, { state: { - meta: {measured_projected, buffer_ids, segment_projected, holes, _}, + meta: {projected: {measured, buffer_ids, segment, holes, _}, _}, _, }, _, @@ -173,11 +173,10 @@ let view = : Node.t => { module Text = Text({ - let map = measured_projected; + let map = measured; let settings = settings; }); - let code = Text.of_segment(buffer_ids, false, sort, segment_projected); - let holes = - List.map(of_hole(~measured=measured_projected, ~font_metrics), holes); + let code = Text.of_segment(buffer_ids, false, sort, segment); + let holes = List.map(of_hole(~measured, ~font_metrics), holes); div(~attr=Attr.class_("code"), [span_c("code-text", code), ...holes]); }; diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 52302e7493..ea1e8d6a84 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -60,7 +60,10 @@ let view = Cell.editor_view( ~selected=pos == this_pos, ~error_ids= - Statics.Map.error_ids(editor.state.meta.term_ranges, di.info_map), + Statics.Map.error_ids( + editor.state.meta.projected.term_ranges, + di.info_map, + ), ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re index 8b7f006c30..5452ba291f 100644 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ b/src/haz3lweb/view/assistant/UpdateAssistant.re @@ -68,7 +68,8 @@ let apply = * first hole. This should be revisited if completions are * refactored to use a more structured buffer format */ module M = (val Editor.Meta.module_of_t(editor.state.meta)); - let start = Zipper.caret_point(M.measured_projected, z); + let start = + Zipper.caret_point(M.measured, editor.state.meta.projected.z); let rec do_actions = (model, actions: list(UpdateAction.t)) => switch (actions) { | [] => Ok(model) From 550289598c693da31a85d9c629577787abf31e1c Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 18 May 2024 01:05:57 -0400 Subject: [PATCH 039/168] projectors cleanup --- src/haz3lcore/Measured.re | 7 ------- src/haz3lcore/zipper/Projector.re | 4 ---- src/haz3lcore/zipper/action/Action.re | 4 ++-- src/haz3lcore/zipper/action/Move.re | 2 +- src/haz3lcore/zipper/action/Perform.re | 3 +-- src/haz3lcore/zipper/action/ProjectorAction.re | 2 +- src/haz3lweb/Keyboard.re | 2 +- 7 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 0b849ac195..40976875c6 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -86,11 +86,6 @@ module Shards = { snd(List.hd(row)).origin.row == snd(hd).origin.row ? [[hd, ...row], ...rows] : [[hd], row, ...rows] }; - // let last = (shards: t) => - // shards - // |> List.sort(((i, _), (j, _)) => Int.compare(i, j)) - // |> ListUtil.last_opt - // |> Option.map(snd); }; type t = { @@ -200,8 +195,6 @@ let find_t = (t: Tile.t, map): measurement => { (first, last); }) { | _ => failwith("find_t: inconsistent shard infor between tile and map") - // let s = shards |> List.hd; - // (s |> snd, s |> snd); }; {origin: first.origin, last: last.last}; }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ecbbcafc27..9e65f580ff 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -38,13 +38,9 @@ module Map = { [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(p); let empty = empty; - let add = add; - let remove = remove; let find = find_opt; let mem = mem; - let fold = fold; let mapi = mapi; - let cardinal = cardinal; let update = update; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 5fcb01ea5c..8f0b77331f 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,7 +45,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | ToggleFold + | ToggleIndicated | Toggle(Id.t); [@deriving (show({with_path: false}), sexp, yojson)] @@ -81,7 +81,7 @@ module Result = { let is_edit: t => bool = fun - | Project(_) //TODO(andrew): maybe yes as want to trigger infer? + | Project(_) => true //TODO(andrew): revisit | Insert(_) | Destruct(_) | Pick_up diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index fe16b5fb05..861c52ddb2 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -61,7 +61,7 @@ let neighbor_movability = }; module Make = (M: Editor.Meta.S) => { - let caret_point = t => Zipper.caret_point(M.measured, t); + let caret_point = Zipper.caret_point(M.measured); let pop_out = z => Some(z |> Zipper.set_caret(Outer)); let pop_move = (d, z) => z |> Zipper.set_caret(Outer) |> Zipper.move(d); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index ea1867aaeb..59d19eefcd 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -3,8 +3,7 @@ open Zipper; let is_write_action = (a: Action.t) => { switch (a) { - //TODO: revist as projectors grow - | Project(_) => false + | Project(_) => false //TODO(andrew): revisit | Move(_) | MoveToNextHole(_) | Unselect(_) diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 2a018f9f5b..70172fe30e 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -111,7 +111,7 @@ let go = (a: Action.project, z: Zipper.t) => | None => None | Some((p, d, rel)) => switch (a) { - | ToggleFold => toggle(Piece.id(p), z, p, d, rel) + | ToggleIndicated => toggle(Piece.id(p), z, p, d, rel) | Toggle(id) => toggle(id, z, p, d, rel) } }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 13b43a64c9..40685f0ec7 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -73,7 +73,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: Mac, shift: Up, meta: Down, ctrl: Up, alt: Up} => switch (key) { - | "e" => Some(PerformAction(Project(ToggleFold))) + | "e" => Some(PerformAction(Project(ToggleIndicated))) | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) From c7654f4df47960d90aef8e91786db2011092bcae Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 18 May 2024 01:12:36 -0400 Subject: [PATCH 040/168] projectors cleanup --- src/haz3lcore/zipper/action/Select.re | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/haz3lcore/zipper/action/Select.re b/src/haz3lcore/zipper/action/Select.re index b905e0cb02..4948a83068 100644 --- a/src/haz3lcore/zipper/action/Select.re +++ b/src/haz3lcore/zipper/action/Select.re @@ -21,21 +21,13 @@ module Make = (M: Editor.Meta.S) => { let range = (l: Id.t, r: Id.t, z: Zipper.t): option(Zipper.t) => { let* z = Move.jump_to_id(z, l); - print_endline("Select.range: first"); let* Measured.{last, _} = Measured.find_by_id(r, M.measured); - print_endline("Select.range: last"); Move.do_towards(Zipper.select, last, z); }; let term = (id: Id.t, z: Zipper.t): option(Zipper.t) => { //TODO: check if selection is already a term: no-op in this case let* (l, r) = TermRanges.find_opt(id, M.term_ranges); - print_endline( - "Select.term: l: " - ++ Id.show(Piece.id(l)) - ++ " r: " - ++ Id.show(Piece.id(r)), - ); range(Piece.id(l), Piece.id(r), z); }; From 97e8afa76bb7ef955e1ceab9a26959bdc91596ee Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 18 May 2024 23:10:13 -0400 Subject: [PATCH 041/168] experiment with module type. not compiling --- src/haz3lcore/statics/TypBase.re | 8 +- src/haz3lcore/zipper/Projector.re | 208 ++++++++++++------ .../zipper/action/ProjectorAction.re | 9 +- 3 files changed, 148 insertions(+), 77 deletions(-) diff --git a/src/haz3lcore/statics/TypBase.re b/src/haz3lcore/statics/TypBase.re index 58690c3aec..cbb9cdd4b7 100644 --- a/src/haz3lcore/statics/TypBase.re +++ b/src/haz3lcore/statics/TypBase.re @@ -507,14 +507,14 @@ module rec Typ: { | String => "String" | Var(tvar) => tvar | List(t) => "[" ++ pretty_print(t) ++ "]" - | Arrow(t1, t2) => paren_pretty_print(t1) ++ "->" ++ pretty_print(t2) + | Arrow(t1, t2) => paren_pretty_print(t1) ++ " -> " ++ pretty_print(t2) | Sum(sm) => switch (sm) { | [] => "+?" | [t0] => "+" ++ ctr_pretty_print(t0) | [t0, ...ts] => List.fold_left( - (acc, t) => acc ++ "+" ++ ctr_pretty_print(t), + (acc, t) => acc ++ " + " ++ ctr_pretty_print(t), ctr_pretty_print(t0), ts, ) @@ -528,8 +528,8 @@ module rec Typ: { ts, ) ++ ")" - | Rec(tv, t) => "rec " ++ tv ++ "->" ++ pretty_print(t) - | Forall(tv, t) => "forall " ++ tv ++ "->" ++ pretty_print(t) + | Rec(tv, t) => "rec " ++ tv ++ " -> " ++ pretty_print(t) + | Forall(tv, t) => "forall " ++ tv ++ " -> " ++ pretty_print(t) } and ctr_pretty_print = ((ctr, typ)) => switch (typ) { diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 9e65f580ff..95274faa2a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,83 +1,155 @@ open Util; open Sexplib.Std; -[@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = - | Fold - | Infer(infer); +module type P = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t; + let placeholder_length: t => int; //Projector + let to_string: t => string; //Projector //TODO: rename to ci_string or something + let can_project: (t, Piece.t) => bool; //ProjectorAction + let update: (option(Info.t), t) => t; // ProjectorsUpdate + //let toggle = (id: Id.t, z: Zipper.t, piece, d, rel) //ProjectorAction +}; -let to_string: t => string = - fun - | Fold => "F" - | Infer(_) => "I"; +module Fold: P = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = unit; + let to_string: t => string = () => "F"; + let can_project = ((): t, p: Piece.t): bool => Piece.is_convex(p); + let placeholder_length: t => int = () => 2; + let update = (_: option(Info.t), (): t): t => (); +}; -let placeholder_length: t => int = - fun - | Fold => 2 - | Infer({expected_ty: None, _}) => "-" |> String.length - | Infer({expected_ty: Some(expected_ty), _}) => - expected_ty |> Typ.pretty_print |> String.length; +module Infer: P = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = {expected_ty: option(Typ.t)}; -let placeholder = (pr: t, id: Id.t): Piece.t => - Piece.Tile({ - id, - label: [String.make(placeholder_length(pr), ' ')], - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], - }); + let to_string: t => string = _ => "I"; + let can_project = (_: t, p: Piece.t): bool => + Piece.is_convex(p) + && ( + switch (p) { + | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | _ => false + } + ); + let placeholder_length: t => int = + fun + | {expected_ty: None, _} => "-" |> String.length + | {expected_ty: Some(expected_ty), _} => { + /* NOTE: This assumes pretty_print handles whitespace the same as view */ + //TODO(andrew): cleanup + print_endline("placeholder_ty: " ++ Typ.pretty_print(expected_ty)); + print_endline( + "placeholder_length " + ++ ( + expected_ty |> Typ.pretty_print |> String.length |> string_of_int + ), + ); + expected_ty |> Typ.pretty_print |> String.length; + }; + let update = (ci: option(Info.t), _: t): t => { + print_endline("updating infer projector"); + let expected_ty = + switch (ci) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) + | _ => Typ.Float + }; + {expected_ty: Some(expected_ty)}; + }; +}; [@deriving (show({with_path: false}), sexp, yojson)] -module Map = { - [@deriving (show({with_path: false}), sexp, yojson)] - type p = t; - open Id.Map; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(p); - let empty = empty; - let find = find_opt; - let mem = mem; - let mapi = mapi; - let update = update; -}; +type t = + | Fold(Fold.t) + | Infer(Infer.t); -let placehold = (ps: Map.t, p: Piece.t) => - switch (Map.find(Piece.id(p), ps)) { - | None => p - | Some(pr) => placeholder(pr, Piece.id(p)) - }; +// let placeholder = (pr: P.t, id: Id.t): Piece.t => { +// Piece.Tile({ +// id, +// label: [String.make(P.placeholder_length(pr), ' ')], +// mold: Mold.mk_op(Any, []), +// shards: [0], +// children: [], +// }); +// }; +// let placeholder = (type p, module X: P with type t = p, pr: p, id: Id.t) => { +// Piece.Tile({ +// id, +// label: [String.make(X.placeholder_length(pr), ' ')], +// mold: Mold.mk_op(Any, []), +// shards: [0], +// children: [], +// }); +// }; -let rec of_segment = (projectors, seg: Segment.t): Segment.t => { - seg |> List.map(placehold(projectors)) |> List.map(of_piece(projectors)); -} -and of_piece = (projectors, p: Piece.t): Piece.t => { - switch (p) { - | Tile(t) => Tile(of_tile(projectors, t)) - | Grout(_) => p - | Secondary(_) => p +module MkProjectorM = (P: P) => { + [@deriving (show({with_path: false}), sexp, yojson)] + module Map = { + [@deriving (show({with_path: false}), sexp, yojson)] + type p = P.t; + open Id.Map; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Id.Map.t(p); + let empty = empty; + let find = find_opt; + let mem = mem; + let mapi = mapi; + let update = update; }; -} -and of_tile = (projectors, t: Tile.t): Tile.t => { - {...t, children: List.map(of_segment(projectors), t.children)}; -}; + let placeholder = (pr: P.t, id: Id.t) => { + Piece.Tile({ + id, + label: [String.make(P.placeholder_length(pr), ' ')], + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], + }); + }; + let placehold = (ps: Map.t, p: Piece.t) => + switch (Map.find(Piece.id(p), ps)) { + | None => p + | Some(pr) => placeholder(pr, Piece.id(p)) + }; -let piece_is = (projectors: Map.t, p: option(Piece.t)) => - switch (p) { - | Some(p) when Map.mem(Piece.id(p), projectors) => - Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None - | _ => None + let rec of_segment = (projectors, seg: Segment.t): Segment.t => { + seg + |> List.map(placehold(projectors)) + |> List.map(of_piece(projectors)); + } + and of_piece = (projectors, p: Piece.t): Piece.t => { + switch (p) { + | Tile(t) => Tile(of_tile(projectors, t)) + | Grout(_) => p + | Secondary(_) => p + }; + } + and of_tile = (projectors, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(projectors), t.children)}; }; -let neighbor_is = (projectors, s: Siblings.t): (option(Id.t), option(Id.t)) => ( - piece_is(projectors, Siblings.left_neighbor(s)), - piece_is(projectors, Siblings.right_neighbor(s)), -); + let piece_is = (projectors: Map.t, p: option(Piece.t)) => + switch (p) { + | Some(p) when Map.mem(Piece.id(p), projectors) => + Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None + | _ => None + }; + + let neighbor_is = + (projectors, s: Siblings.t): (option(Id.t), option(Id.t)) => ( + piece_is(projectors, Siblings.left_neighbor(s)), + piece_is(projectors, Siblings.right_neighbor(s)), + ); + + let selection_sides_is = + (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( + piece_is(projectors, ListUtil.hd_opt(s.content)), + piece_is(projectors, ListUtil.last_opt(s.content)), + ); +}; + +module FoldPlaceholder = MkProjectorM(Fold); +module InferPlaceholder = MkProjectorM(Infer); -let selection_sides_is = - (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( - piece_is(projectors, ListUtil.hd_opt(s.content)), - piece_is(projectors, ListUtil.last_opt(s.content)), -); +type tt = + | A(FoldPlaceholder.t); diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 70172fe30e..f6155319e5 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -70,7 +70,7 @@ let update = (f, id, z) => { let set = (prj, id, z) => update(_ => prj, id, z); -let can_project = (prj: Projector.t, p: Piece.t) => +let can_project = (prj: Projector.t, p: Piece.t): bool => switch (prj) { | Infer(_) => Piece.is_convex(p) @@ -83,19 +83,18 @@ let can_project = (prj: Projector.t, p: Piece.t) => | Fold => Piece.is_convex(p) }; -let default_infer: Projector.t = Infer({expected_ty: None}); - let project = (prj, id, d, rel, z) => z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; -let toggle = (id, z: Zipper.t, piece, d, rel) => +let toggle = (id: Id.t, z: Zipper.t, piece, d, rel) => switch (Projector.Map.find(id, z.projectors)) { | Some(Fold) => + let default_infer = Projector.Infer({expected_ty: None}); if (can_project(default_infer, piece)) { project(default_infer, id, d, rel, z); } else { Some(set(None, id, z)); - } + }; | Some(Infer(_)) => Some(set(None, id, z)) | None when Piece.is_convex(piece) => if (can_project(Fold, piece)) { From eb0cb662aecf07dc79138b4d6698f3240fedbcef Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 21 May 2024 12:10:30 -0400 Subject: [PATCH 042/168] make type prettyprint consistent with type view. partial success in projector statics sync --- src/haz3lcore/statics/TypBase.re | 11 ++-- src/haz3lcore/zipper/Editor.re | 8 ++- src/haz3lcore/zipper/Projector.re | 26 ++++++++ src/haz3lcore/zipper/action/Perform.re | 12 +++- .../zipper/action/ProjectorAction.re | 62 +++++++++---------- src/haz3lweb/Keyboard.re | 1 + src/haz3lweb/Model.re | 5 ++ src/haz3lweb/Update.re | 17 ++++- src/haz3lweb/view/ProjectorsUpdate.re | 24 ------- 9 files changed, 96 insertions(+), 70 deletions(-) delete mode 100644 src/haz3lweb/view/ProjectorsUpdate.re diff --git a/src/haz3lcore/statics/TypBase.re b/src/haz3lcore/statics/TypBase.re index 58690c3aec..4e4f23ec7c 100644 --- a/src/haz3lcore/statics/TypBase.re +++ b/src/haz3lcore/statics/TypBase.re @@ -497,7 +497,8 @@ module rec Typ: { | Sum(_) => true /* disambiguate between (A + B) -> C and A + (B -> C) */ }; - /* Essentially recreates haz3lweb/view/Type.re's view_ty but with string output */ + /* Essentially recreates haz3lweb/view/Type.re's view_ty but with string output. + * NOTE: Projectors rely on this including whitespace agreeing with view */ let rec pretty_print = (ty: t): string => switch (ty) { | Unknown(_) => "?" @@ -507,14 +508,14 @@ module rec Typ: { | String => "String" | Var(tvar) => tvar | List(t) => "[" ++ pretty_print(t) ++ "]" - | Arrow(t1, t2) => paren_pretty_print(t1) ++ "->" ++ pretty_print(t2) + | Arrow(t1, t2) => paren_pretty_print(t1) ++ " -> " ++ pretty_print(t2) | Sum(sm) => switch (sm) { | [] => "+?" | [t0] => "+" ++ ctr_pretty_print(t0) | [t0, ...ts] => List.fold_left( - (acc, t) => acc ++ "+" ++ ctr_pretty_print(t), + (acc, t) => acc ++ " + " ++ ctr_pretty_print(t), ctr_pretty_print(t0), ts, ) @@ -528,8 +529,8 @@ module rec Typ: { ts, ) ++ ")" - | Rec(tv, t) => "rec " ++ tv ++ "->" ++ pretty_print(t) - | Forall(tv, t) => "forall " ++ tv ++ "->" ++ pretty_print(t) + | Rec(tv, t) => "rec " ++ tv ++ " -> " ++ pretty_print(t) + | Forall(tv, t) => "forall " ++ tv ++ " -> " ++ pretty_print(t) } and ctr_pretty_print = ((ctr, typ)) => switch (typ) { diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 86387a6d31..c9a805f38a 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -41,7 +41,7 @@ module Meta = { { col_target: 0, touched: Touched.empty, - projected: z |> ProjectorAction.of_zipper |> init_projected, + projected: z |> ProjectorAction.project |> init_projected, }; }; @@ -92,10 +92,12 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col }; - let z_projected = ProjectorAction.of_zipper(z); + let z_projected = ProjectorAction.project(z); let projected = switch (Action.is_edit(a)) { - | false => {...meta.projected, z: z_projected} + //TODO(andrew): reenable + //TODO: andrew figure out why core desyncs from view on measure length.. prob use diff statics + //| false => {...meta.projected, z: z_projected} | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 9e65f580ff..4481a15267 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -30,6 +30,32 @@ let placeholder = (pr: t, id: Id.t): Piece.t => children: [], }); +let update = (ci: option(Info.t), p: t): t => + switch (p) { + | Fold => Fold + | Infer(_) => + print_endline("updating infer projector"); + let expected_ty = + switch (ci) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) + | _ => Typ.Float + }; + Infer({expected_ty: Some(expected_ty)}); + }; + +let can_project = (prj: t, p: Piece.t) => + switch (prj) { + | Infer(_) => + Piece.is_convex(p) + && ( + switch (p) { + | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | _ => false + } + ) + | Fold => Piece.is_convex(p) + }; + [@deriving (show({with_path: false}), sexp, yojson)] module Map = { [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 59d19eefcd..f513a2e651 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -21,6 +21,7 @@ let is_write_action = (a: Action.t) => { let go_z = ( ~meta: option(Editor.Meta.t)=?, + ~statics: CachedStatics.statics=CachedStatics.empty_statics, ~settings: CoreSettings.t, a: Action.t, z: Zipper.t, @@ -47,7 +48,7 @@ let go_z = switch (a) { | Project(a) => - switch (ProjectorAction.go(a, z)) { + switch (ProjectorAction.go(a, statics, z)) { | None => Error(Action.Failure.Cant_project) | Some(z) => Ok(z) } @@ -191,7 +192,12 @@ let go_z = }; let go = - (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) + ( + ~settings: CoreSettings.t, + ~statics: CachedStatics.statics=CachedStatics.empty_statics, + a: Action.t, + ed: Editor.t, + ) : Action.Result.t(Editor.t) => if (ed.read_only && is_write_action(a)) { Result.Ok(ed); @@ -199,6 +205,6 @@ let go = open Result.Syntax; let Editor.State.{zipper, meta} = ed.state; Effect.s_clear(); - let+ z = go_z(~settings, ~meta, a, zipper); + let+ z = go_z(~statics, ~settings, ~meta, a, zipper); Editor.new_state(~effects=Effect.s^, a, z, ed); }; diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 70172fe30e..28ca07d2bb 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -1,5 +1,3 @@ -open Zipper; - let of_siblings = (projectors: Projector.Map.t, siblings: Siblings.t): Siblings.t => { let l_sibs = Projector.of_segment(projectors, fst(siblings)); @@ -37,7 +35,7 @@ let of_selection = }; }; -let of_zipper = (z: Zipper.t): Zipper.t => +let project = (z: Zipper.t): Zipper.t => if (Id.Map.is_empty(z.projectors)) { z; } else { @@ -63,55 +61,53 @@ let move_out_of_piece = } }; -let update = (f, id, z) => { +let set = (p: option(Projector.t), id: Id.t, ps: Projector.Map.t) => + Projector.Map.update(id, _ => p, ps); + +let set = (p: option(Projector.t), id: Id.t, z: Zipper.t) => { ...z, - projectors: Projector.Map.update(id, f, z.projectors), + projectors: set(p, id, z.projectors), }; -let set = (prj, id, z) => update(_ => prj, id, z); - -let can_project = (prj: Projector.t, p: Piece.t) => - switch (prj) { - | Infer(_) => - Piece.is_convex(p) - && ( - switch (p) { - | Tile(t) => t.mold.out == Exp || t.mold.out == Pat - | _ => false - } - ) - | Fold => Piece.is_convex(p) - }; - -let default_infer: Projector.t = Infer({expected_ty: None}); - -let project = (prj, id, d, rel, z) => +let set_project = + ( + prj: Projector.t, + id: Id.t, + d: Util.Direction.t, + rel: Indicated.relation, + z: Zipper.t, + ) => z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; -let toggle = (id, z: Zipper.t, piece, d, rel) => +let toggle = (id, info, z: Zipper.t, piece, d, rel) => { switch (Projector.Map.find(id, z.projectors)) { | Some(Fold) => - if (can_project(default_infer, piece)) { - project(default_infer, id, d, rel, z); + let infer = Projector.update(info, Infer({expected_ty: None})); + if (Projector.can_project(infer, piece)) { + set_project(infer, id, d, rel, z); } else { Some(set(None, id, z)); - } + }; | Some(Infer(_)) => Some(set(None, id, z)) | None when Piece.is_convex(piece) => - if (can_project(Fold, piece)) { - project(Fold, id, d, rel, z); + if (Projector.can_project(Fold, piece)) { + set_project(Fold, id, d, rel, z); } else { None; } | None => None }; +}; -let go = (a: Action.project, z: Zipper.t) => +let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => + //TODO(andrew): avoid bringing statics in here? switch (Indicated.for_index(z)) { | None => None | Some((p, d, rel)) => + let id = Piece.id(p); + let info = Id.Map.find_opt(id, statics.info_map); switch (a) { - | ToggleIndicated => toggle(Piece.id(p), z, p, d, rel) - | Toggle(id) => toggle(id, z, p, d, rel) - } + | ToggleIndicated => toggle(id, info, z, p, d, rel) + | Toggle(id) => toggle(id, info, z, p, d, rel) + }; }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 40685f0ec7..c7f9d5a0f8 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -89,6 +89,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: PC, shift: Up, meta: Up, ctrl: Down, alt: Up} => switch (key) { + | "e" => Some(PerformAction(Project(ToggleIndicated))) | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index 75ac22a0e4..5bcd3af948 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -108,6 +108,7 @@ let save_and_return = (model: t) => { save(model); Ok(model); }; + let reset = (model: t): t => { /* Reset model to default, including in localstorage, but don't otherwise erase localstorage, allowing @@ -126,3 +127,7 @@ let reset = (model: t): t => { }, }; }; + +let current_statics = + ({settings, editors, statics, _}: t): CachedStatics.statics => + Editors.lookup_statics(~settings, ~statics, editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index ff51baad26..d1f6a07c72 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -213,6 +213,15 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; +let update_projectors = (model: Model.t): Model.t => { + let statics = Model.current_statics(model); + let editors = + Editors.map_projectors(model.editors, (id, p) => + Projector.update(Id.Map.find_opt(id, statics.info_map), p) + ); + {...model, editors}; +}; + let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_statics = is_edit(update) || reevaluate_post_update(update); let update_dynamics = reevaluate_post_update(update); @@ -221,7 +230,7 @@ let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { ? { print_endline("UPDATING STATICS"); let statics = Editors.mk_statics(~settings=m.settings, m.editors); - ProjectorsUpdate.update_all({...m, statics}); + update_projectors({...m, statics}); } : m; if (update_dynamics && m.settings.core.dynamics) { @@ -236,7 +245,11 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => switch ( model.editors |> Editors.get_editor - |> Haz3lcore.Perform.go(~settings=model.settings.core, a) + |> Haz3lcore.Perform.go( + ~statics=Model.current_statics(model), + ~settings=model.settings.core, + a, + ) ) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => diff --git a/src/haz3lweb/view/ProjectorsUpdate.re b/src/haz3lweb/view/ProjectorsUpdate.re deleted file mode 100644 index 5bcba5e440..0000000000 --- a/src/haz3lweb/view/ProjectorsUpdate.re +++ /dev/null @@ -1,24 +0,0 @@ -open Haz3lcore; -open Projector; - -let update = (ci: option(Info.t), p: t): t => - switch (p) { - | Fold => Fold - | Infer(_) => - print_endline("updating infer projector"); - let expected_ty = - switch (ci) { - | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) - | _ => Typ.Float - }; - Infer({expected_ty: Some(expected_ty)}); - }; - -let update_all = ({settings, editors, statics, _} as model: Model.t): Model.t => { - let statics = Editors.lookup_statics(~settings, ~statics, editors); - let editors = - Editors.map_projectors(editors, (id, p) => - update(Id.Map.find_opt(id, statics.info_map), p) - ); - {...model, editors}; -}; From 6f48f27bc2cda74adcbe910c23e700ffc30e7866 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 21 May 2024 12:56:19 -0400 Subject: [PATCH 043/168] allow infer proj on grout --- src/haz3lcore/zipper/Projector.re | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 4481a15267..26701e3c0e 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -38,7 +38,7 @@ let update = (ci: option(Info.t), p: t): t => let expected_ty = switch (ci) { | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) - | _ => Typ.Float + | _ => Typ.Unknown(Internal) }; Infer({expected_ty: Some(expected_ty)}); }; @@ -50,6 +50,7 @@ let can_project = (prj: t, p: Piece.t) => && ( switch (p) { | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | Grout(_) => true | _ => false } ) From 29dd2b42b63a9ae25b992aeeaf422b1495a38702 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 23 May 2024 11:18:08 -0400 Subject: [PATCH 044/168] refine interaction for infer projection --- src/haz3lcore/statics/TypBase.re | 2 +- .../zipper/action/ProjectorAction.re | 37 ++++++++++++++++--- src/haz3lweb/view/Cell.re | 3 +- src/haz3lweb/view/Deco.re | 12 +++++- src/haz3lweb/view/ProjectorsView.re | 3 +- src/haz3lweb/www/style.css | 5 +-- 6 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/haz3lcore/statics/TypBase.re b/src/haz3lcore/statics/TypBase.re index 4e4f23ec7c..d75d88b853 100644 --- a/src/haz3lcore/statics/TypBase.re +++ b/src/haz3lcore/statics/TypBase.re @@ -493,7 +493,7 @@ module rec Typ: { | Forall(_, _) => true | List(_) => false /* is already wrapped in [] */ | Arrow(_, _) => true - | Prod(_) + | Prod(_) => false /* is already wrapped in () in this printer */ | Sum(_) => true /* disambiguate between (A + B) -> C and A + (B -> C) */ }; diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index 28ca07d2bb..b8158043e0 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -79,7 +79,7 @@ let set_project = ) => z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; -let toggle = (id, info, z: Zipper.t, piece, d, rel) => { +let _toggle = (id, info, z: Zipper.t, piece, d, rel) => { switch (Projector.Map.find(id, z.projectors)) { | Some(Fold) => let infer = Projector.update(info, Infer({expected_ty: None})); @@ -99,15 +99,40 @@ let toggle = (id, info, z: Zipper.t, piece, d, rel) => { }; }; +let toggle_fold = (id, _info, z: Zipper.t, piece, d, rel) => { + switch (Projector.Map.find(id, z.projectors)) { + | Some(Fold) => Some(set(None, id, z)) + | _ => + if (Projector.can_project(Fold, piece)) { + set_project(Fold, id, d, rel, z); + } else { + None; + } + }; +}; + +let toggle_infer = (id, info, z: Zipper.t) => { + //TODO: get piece of target for predicate + switch (Projector.Map.find(id, z.projectors)) { + | Some(Fold) => + let infer = Projector.update(info, Infer({expected_ty: None})); + Some(set(Some(infer), id, z)); + | _ => Some(set(Some(Fold), id, z)) + }; +}; + let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => //TODO(andrew): avoid bringing statics in here? switch (Indicated.for_index(z)) { | None => None | Some((p, d, rel)) => - let id = Piece.id(p); - let info = Id.Map.find_opt(id, statics.info_map); switch (a) { - | ToggleIndicated => toggle(id, info, z, p, d, rel) - | Toggle(id) => toggle(id, info, z, p, d, rel) - }; + | ToggleIndicated => + let id = Piece.id(p); + let info = Id.Map.find_opt(id, statics.info_map); + toggle_fold(id, info, z, p, d, rel); + | Toggle(id) => + let info = Id.Map.find_opt(id, statics.info_map); + toggle_infer(id, info, z); + } }; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index e6f89dea54..62c1f68801 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -141,7 +141,8 @@ let deco = let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; }); - let decos = selected ? Deco.all(~inject, z, segment) : Deco.err_holes(); + let decos = + selected ? Deco.all(~inject, z, segment) : Deco.always(~inject, z); let decos = switch (test_results) { | None => decos diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index ff973d3cd1..183e11f93a 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -318,13 +318,17 @@ module Deco = | _ => indicated_piece_deco(z) }; - let all = (~inject, zipper, sel_seg) => + let active = (~inject, zipper, sel_seg) => List.concat([ caret(zipper), indication_deco(~inject, zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), + ]); + + let always = (~inject, zipper: Zipper.t) => + List.concat([ err_holes(), ProjectorsView.view_all( zipper.projectors, @@ -333,4 +337,10 @@ module Deco = M.map, ), ]); + + let all = (~inject, zipper, sel_seg) => + List.concat([ + active(~inject, zipper, sel_seg), + always(~inject, zipper), + ]); }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 8f9089bf5b..f0e26af218 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -44,7 +44,8 @@ let infer_view = DecUtil.abs_style(measurement, ~font_metrics), ]), [ - Type.view(expected_ty), + text(Typ.pretty_print(expected_ty)), + //Type.view(expected_ty), PieceDec.convex_shard(~font_metrics, ~measurement), ], ); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 654a7d8d11..a24504fca4 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -698,6 +698,7 @@ select { } .projector.infer { opacity: 60%; + color: var(--typ-text-color); } .code-container .infer svg { @@ -709,6 +710,7 @@ select { z-index: 13; display: flex; justify-content: center; + cursor: pointer !important; } .projector.indicated svg { @@ -720,9 +722,6 @@ select { .projector.indicated.fold svg { fill: var(--exp-bg-off-color); } -.projector.indicated.infer .typ-view { - color: var(--typ-text-color); -} .projector.indicated.infer svg { fill: var(--typ-bg-off-color); } From 0b00c98e79d6fe9ed64b14dd79e4d09101cd0ddd Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 23 May 2024 18:08:27 -0400 Subject: [PATCH 045/168] first class module projectors compiles --- src/haz3lcore/zipper/Editor.re | 3 +- src/haz3lcore/zipper/Projector.re | 72 +++------ .../zipper/action/ProjectorAction.re | 18 ++- src/haz3lweb/Editors.re | 3 +- src/haz3lweb/Update.re | 10 +- src/haz3lweb/view/ProjectorsView.re | 146 ++++++++++++------ 6 files changed, 142 insertions(+), 110 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index c9a805f38a..a40a590957 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -216,7 +216,8 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => +let map_projectors = + (f: (Id.t, (module Projector.P)) => (module Projector.P), ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 731e528c0d..21ce0eeaa0 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,20 +1,28 @@ open Util; open Sexplib.Std; +[@deriving (show({with_path: false}), sexp, yojson)] +type infer = {expected_ty: option(Typ.t)}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type fold = unit; + type proj_type = - | Fold - | Infer; + | Fold(ref(fold)) + | Infer(ref(infer)); module type P = { [@deriving (show({with_path: false}), sexp, yojson)] type t; let proj_type: proj_type; - let data: t; + let data: ref(t); + let placeholder_length: unit => int; //Projector - let to_string: unit => string; //Projector //TODO: rename to ci_string or something + let can_project: Piece.t => bool; //ProjectorAction - let update: option(Info.t) => t; // ProjectorsUpdate + let update: option(Info.t) => unit; // ProjectorsUpdate //let toggle = (id: Id.t, z: Zipper.t, piece, d, rel) //ProjectorAction + let get: unit => t; }; let mkFold = (data): (module P) => @@ -22,24 +30,21 @@ let mkFold = (data): (module P) => { [@deriving (show({with_path: false}), sexp, yojson)] type t = unit; - let proj_type = Fold; - let data = data; - let to_string = () => "F"; + let data = ref(data); + let proj_type = Fold(data); let can_project = Piece.is_convex; let placeholder_length = () => 2; let update = _ => (); + let get = () => (); }); -[@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; let mkFInfer = (data: infer): (module P) => (module { [@deriving (show({with_path: false}), sexp, yojson)] type t = infer; - let proj_type = Infer; - let data = data; - let to_string: unit => string = _ => "I"; + let data = ref(data); + let proj_type = Infer(data); let can_project = (p: Piece.t): bool => Piece.is_convex(p) && ( @@ -49,7 +54,7 @@ let mkFInfer = (data: infer): (module P) => } ); let placeholder_length = _ => - switch (data) { + switch (data^) { | {expected_ty: None, _} => "-" |> String.length | {expected_ty: Some(expected_ty), _} => /* NOTE: This assumes pretty_print handles whitespace the same as view */ @@ -63,7 +68,7 @@ let mkFInfer = (data: infer): (module P) => ); expected_ty |> Typ.pretty_print |> String.length; }; - let update = (ci: option(Info.t)): t => { + let update = (ci: option(Info.t)): unit => { print_endline("updating infer projector"); let expected_ty = switch (ci) { @@ -71,43 +76,12 @@ let mkFInfer = (data: infer): (module P) => Mode.ty_of(mode) | _ => Typ.Float }; - {expected_ty: Some(expected_ty)}; + + data := {expected_ty: Some(expected_ty)}; }; + let get = () => data^; }); -// let placeholder = (pr: P.t, id: Id.t): Piece.t => { -// Piece.Tile({ -// id, -// label: [String.make(P.placeholder_length(pr), ' ')], -// mold: Mold.mk_op(Any, []), -// shards: [0], -// children: [], -// }); -// }; -// let placeholder = (type p, module X: P with type t = p, pr: p, id: Id.t) => { -// Piece.Tile({ -// id, -// label: [String.make(X.placeholder_length(pr), ' ')], -// mold: Mold.mk_op(Any, []), -// shards: [0], -// children: [], -// }); -// }; - -let i: module P = mkFInfer({expected_ty: None}); -let f: module P = mkFold(); - -let xs: list(module P) = [i, f]; - -let _ = - List.map( - (p: (module P)) => { - let (module P) = p; - P.placeholder_length(); - }, - xs, - ); - [@deriving (show({with_path: false}), sexp, yojson)] module Map = { //[@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index edc9e9a312..c398980920 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -83,7 +83,10 @@ let toggle_fold = (id, _info, z: Zipper.t, piece, d, rel) => { switch (Projector.Map.find(id, z.projectors)) { | Some(p) => let (module P) = p; - P.proj_type == Fold ? Some(set(None, id, z)) : None; + switch (P.proj_type) { + | Fold(_) => Some(set(None, id, z)) + | Infer(_) => None + }; | _ => let p: module Projector.P = Projector.mkFold(); let (module P) = p; @@ -95,13 +98,16 @@ let toggle_fold = (id, _info, z: Zipper.t, piece, d, rel) => { }; }; -let toggle_infer = (id, _info, z: Zipper.t) => { +let toggle_infer = (id, info, z: Zipper.t) => { //TODO: get piece of target for predicate switch (Projector.Map.find(id, z.projectors)) { - // | Some(p) => - // let (module P) = p; - // let infer = Projector.mkFInfer(P.update(info);) - // Some(set(Some(infer), id, z)); + | Some(p) => + let (module P) = p; + let infer = Projector.mkFInfer({expected_ty: None}); + let (module I) = infer; + I.update(info); + //TODO(andrew): does this nonsense make sense? + Some(set(Some(infer), id, z)); | _ => let p: module Projector.P = Projector.mkFold(); Some(set(Some(p), id, z)); diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 28bce5be19..611f892f54 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -179,5 +179,6 @@ let switch_example_slide = (editors: t, name: string): option(t) => | Documentation(_, slides) => Some(Documentation(name, slides)) }; -let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => +let map_projectors = + (editors: t, f: (Id.t, (module Projector.P)) => (module Projector.P)): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index d1f6a07c72..19ee385672 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -216,8 +216,14 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => let update_projectors = (model: Model.t): Model.t => { let statics = Model.current_statics(model); let editors = - Editors.map_projectors(model.editors, (id, p) => - Projector.update(Id.Map.find_opt(id, statics.info_map), p) + Editors.map_projectors( + model.editors, + (id, p) => { + let (module P) = p; + //TODO(andrew): do i need to repackage this? + P.update(Id.Map.find_opt(id, statics.info_map)); + p; + }, ); {...model, editors}; }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index f0e26af218..2961b737c2 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -3,6 +3,7 @@ open Virtual_dom.Vdom; open Node; open Projector; open Util.OptUtil.Syntax; +open Sexplib.Std; let stop_mousedown_propagation = Attr.on_mousedown(evt => { @@ -10,7 +11,7 @@ let stop_mousedown_propagation = Virtual_dom.Vdom.Effect.Ignore; }); -let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => +let fold_view = (clss, id, ~font_metrics, ~inject, ~measurement) => div( ~attr= Attr.many([ @@ -24,11 +25,23 @@ let fold_view = (id, clss, ~font_metrics, ~inject, ~measurement) => [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], ); +let display_ty = (expected_ty: option(Typ.t)): Typ.t => + switch (expected_ty) { + | Some(expected_ty) => + print_endline( + "ProjectorsView: infer_view. expected_ty:" ++ Typ.show(expected_ty), + ); + expected_ty; + | None => + print_endline("ProjectorsView: infer_view. expected_ty: None"); + Var("-"); + }; + let infer_view = ( - id: Id.t, clss, - expected_ty, + expected_ty: option(Typ.t), + id: Id.t, ~font_metrics, ~inject, ~measurement: Measured.measurement, @@ -44,62 +57,94 @@ let infer_view = DecUtil.abs_style(measurement, ~font_metrics), ]), [ - text(Typ.pretty_print(expected_ty)), + text(expected_ty |> display_ty |> Typ.pretty_print), //Type.view(expected_ty), PieceDec.convex_shard(~font_metrics, ~measurement), ], ); -let display_ty = (expected_ty: option(Typ.t)): Typ.t => - switch (expected_ty) { - | Some(expected_ty) => - print_endline( - "ProjectorsView: infer_view. expected_ty:" ++ Typ.show(expected_ty), - ); - expected_ty; - | None => - print_endline("ProjectorsView: infer_view. expected_ty: None"); - Var("-"); - }; +module type PV = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t; + //let proj_type: Projector.proj_type; + let data: t; -let projector_view = - (id, p: Projector.t, ~inject, ~font_metrics, ~measurement) => - switch (p) { - | Fold => fold_view(id, [], ~inject, ~font_metrics, ~measurement) - | Infer({expected_ty, _}) => - let ty = display_ty(expected_ty); - infer_view(id, [], ~inject, ~font_metrics, ty, ~measurement); - }; + let normal: + ( + Id.t, + ~font_metrics: FontMetrics.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ~measurement: Measured.measurement + ) => + Node.t; -let indicated_view = - (id, p: Projector.t, ~inject, ~font_metrics, ~measurement) => - switch (p) { - | Fold => - fold_view(id, ["indicated"], ~measurement, ~font_metrics, ~inject) - | Infer({expected_ty, _}) => - let ty = display_ty(expected_ty); - infer_view(id, ["indicated"], ~inject, ty, ~measurement, ~font_metrics); - }; + let indicated: + ( + Id.t, + ~font_metrics: FontMetrics.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ~measurement: Measured.measurement + ) => + Node.t; + + let key_handler: (Id.t, Key.t) => option(UpdateAction.t); + let to_string: unit => string; //Projector //TODO: rename to ci_string or something +}; + +let mkFold = (data): (module PV) => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = unit; + let data = data; + let normal = fold_view([]); + let indicated = fold_view(["indicated"]); + let key_handler = (id, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => + Some(PerformAction(Project(Toggle(id)))) + | _ => None + }; + let to_string = () => "F"; + }); + +let mkInfer = (data): (module PV) => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Projector.infer; + let data = data; + let normal = infer_view([], data.expected_ty); + let indicated = infer_view(["indicated"], data.expected_ty); + let key_handler = (id, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => + Some(PerformAction(Project(Toggle(id)))) + | _ => None + }; + let to_string: unit => string = _ => "I"; + }); -let key_handler = (p: t, id: Id.t, key: Key.t): option(UpdateAction.t) => - switch (p) { - | Infer(_) => - switch (key) { - | {key: D("Escape"), _} => Some(PerformAction(Project(Toggle(id)))) - | _ => None - } - | Fold => - switch (key) { - | {key: D("Escape"), _} => Some(PerformAction(Project(Toggle(id)))) - | _ => None - } +let proj_view_m = (p: (module Projector.P)): (module PV) => { + let (module P) = p; + switch (P.proj_type) { + | Fold(data) => mkFold(data^) + | Infer(data) => mkInfer(data^) }; +}; + +let key_handler = + (p: (module Projector.P), id: Id.t, key: Key.t): option(UpdateAction.t) => { + let (module PV) = proj_view_m(p); + PV.key_handler(id, key); +}; let view = (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - projector_view(id, p, ~inject, ~font_metrics, ~measurement); + let (module PV) = proj_view_m(p); + PV.normal(id, ~inject, ~font_metrics, ~measurement); }; let indication_view = @@ -107,7 +152,8 @@ let indication_view = : option(Node.t) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - indicated_view(id, p, ~inject, ~font_metrics, ~measurement); + let (module PV) = proj_view_m(p); + PV.indicated(id, ~inject, ~font_metrics, ~measurement); }; let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => @@ -131,9 +177,7 @@ let dispatch_key_to = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => }; let ci = (~inject as _, editor: Editor.t) => { - let+ (_, projector) = indicated_proj_ed(editor); - div( - ~attr=Attr.classes(["projector-ci"]), - [text(Projector.to_string(projector))], - ); + let+ (_, p) = indicated_proj_ed(editor); + let (module PV) = proj_view_m(p); + div(~attr=Attr.classes(["projector-ci"]), [text(PV.to_string())]); }; From 2253266594f166dba11fc68eb440cca8652342a4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 23 May 2024 19:06:29 -0400 Subject: [PATCH 046/168] first class module projectors cleanup. still getting compare functions exception --- src/haz3lcore/zipper/Editor.re | 3 +- src/haz3lcore/zipper/Projector.re | 61 ++++++++----------- src/haz3lcore/zipper/Zipper.re | 2 +- .../zipper/action/ProjectorAction.re | 6 +- src/haz3lweb/Editors.re | 3 +- src/haz3lweb/Update.re | 1 - src/haz3lweb/view/Page.re | 2 +- src/haz3lweb/view/ProjectorsView.re | 44 ++++--------- 8 files changed, 47 insertions(+), 75 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index a40a590957..c9a805f38a 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -216,8 +216,7 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let map_projectors = - (f: (Id.t, (module Projector.P)) => (module Projector.P), ed: t) => +let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 21ce0eeaa0..4f6eaafe30 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -16,16 +16,14 @@ module type P = { type t; let proj_type: proj_type; let data: ref(t); - - let placeholder_length: unit => int; //Projector - - let can_project: Piece.t => bool; //ProjectorAction - let update: option(Info.t) => unit; // ProjectorsUpdate - //let toggle = (id: Id.t, z: Zipper.t, piece, d, rel) //ProjectorAction - let get: unit => t; + let placeholder_length: unit => int; + let can_project: Piece.t => bool; + let update: option(Info.t) => unit; }; -let mkFold = (data): (module P) => +type t = (module P); + +let mkFold = (data): t => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -35,10 +33,23 @@ let mkFold = (data): (module P) => let can_project = Piece.is_convex; let placeholder_length = () => 2; let update = _ => (); - let get = () => (); }); -let mkFInfer = (data: infer): (module P) => +//TODO(andrew): proper serialization +let t_of_sexp = _ => mkFold(); +let sexp_of_t = _ => Sexplib.Sexp.Atom("OPAQUE"); +let yojson_of_t = _ => Yojson.Safe.from_string("OPAQUE"); +let t_of_yojson = _ => mkFold(); +let pp: (Format.formatter, t) => unit = (_fmt, _map) => (); +let compare = (_, _) => 0; + +let display_ty = (expected_ty: option(Typ.t)): Typ.t => + switch (expected_ty) { + | Some(expected_ty) => expected_ty + | None => Unknown(Internal) + }; + +let mkFInfer = (data: infer): t => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -54,20 +65,7 @@ let mkFInfer = (data: infer): (module P) => } ); let placeholder_length = _ => - switch (data^) { - | {expected_ty: None, _} => "-" |> String.length - | {expected_ty: Some(expected_ty), _} => - /* NOTE: This assumes pretty_print handles whitespace the same as view */ - //TODO(andrew): cleanup - print_endline("placeholder_ty: " ++ Typ.pretty_print(expected_ty)); - print_endline( - "placeholder_length " - ++ ( - expected_ty |> Typ.pretty_print |> String.length |> string_of_int - ), - ); - expected_ty |> Typ.pretty_print |> String.length; - }; + display_ty(data^.expected_ty) |> Typ.pretty_print |> String.length; let update = (ci: option(Info.t)): unit => { print_endline("updating infer projector"); let expected_ty = @@ -76,31 +74,26 @@ let mkFInfer = (data: infer): (module P) => Mode.ty_of(mode) | _ => Typ.Float }; - data := {expected_ty: Some(expected_ty)}; }; - let get = () => data^; }); [@deriving (show({with_path: false}), sexp, yojson)] module Map = { - //[@deriving (show({with_path: false}), sexp, yojson)] - type p = (module P); + [@deriving (show({with_path: false}), sexp, yojson)] + type p = t; + open Id.Map; - //[@deriving (show({with_path: false}), sexp, yojson)] + [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(p); let empty = empty; let find = find_opt; let mem = mem; let mapi = mapi; let update = update; - let t_of_sexp = _ => Id.Map.empty; - let sexp_of_t = _ => Sexplib.Sexp.Atom("OPAQUE"); - let yojson_of_t = _ => Yojson.Safe.from_string("OPAQUE"); - let t_of_yojson = _ => Id.Map.empty; }; -let placeholder = (p: (module P), id: Id.t) => { +let placeholder = (p: t, id: Id.t) => { let (module P) = p; Piece.Tile({ id, diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 0ffebde382..12359a9a2c 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -445,7 +445,7 @@ let caret_direction = (z: t): option(Direction.t) => } }; -let get_projector = (z: t, id: Id.t): option(module Projector.P) => +let get_projector = (z: t, id: Id.t): option(Projector.t) => Projector.Map.find(id, z.projectors); let measured = z => { diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index c398980920..c5eaa30a7d 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -61,17 +61,17 @@ let move_out_of_piece = } }; -let set = (p: option(module Projector.P), id: Id.t, ps: Projector.Map.t) => +let set = (p: option(Projector.t), id: Id.t, ps: Projector.Map.t) => Projector.Map.update(id, _ => p, ps); -let set = (p: option(module Projector.P), id: Id.t, z: Zipper.t) => { +let set = (p: option(Projector.t), id: Id.t, z: Zipper.t) => { ...z, projectors: set(p, id, z.projectors), }; let set_project = ( - prj: (module Projector.P), + prj: Projector.t, id: Id.t, d: Util.Direction.t, rel: Indicated.relation, diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 611f892f54..28bce5be19 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -179,6 +179,5 @@ let switch_example_slide = (editors: t, name: string): option(t) => | Documentation(_, slides) => Some(Documentation(name, slides)) }; -let map_projectors = - (editors: t, f: (Id.t, (module Projector.P)) => (module Projector.P)): t => +let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 19ee385672..e5f609481a 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -220,7 +220,6 @@ let update_projectors = (model: Model.t): Model.t => { model.editors, (id, p) => { let (module P) = p; - //TODO(andrew): do i need to repackage this? P.update(Id.Map.find_opt(id, statics.info_map)); p; }, diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index a7dd4674f0..8d8272c9b4 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -12,7 +12,7 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => open Effect; let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.dispatch_key_to(editor, key)) { + switch (ProjectorsView.key_handler(editor, key)) { | Some(action) => Many([Prevent_default, Stop_propagation, inject(action)]) | None => diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 2961b737c2..0260a0773e 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -3,7 +3,6 @@ open Virtual_dom.Vdom; open Node; open Projector; open Util.OptUtil.Syntax; -open Sexplib.Std; let stop_mousedown_propagation = Attr.on_mousedown(evt => { @@ -25,18 +24,6 @@ let fold_view = (clss, id, ~font_metrics, ~inject, ~measurement) => [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], ); -let display_ty = (expected_ty: option(Typ.t)): Typ.t => - switch (expected_ty) { - | Some(expected_ty) => - print_endline( - "ProjectorsView: infer_view. expected_ty:" ++ Typ.show(expected_ty), - ); - expected_ty; - | None => - print_endline("ProjectorsView: infer_view. expected_ty: None"); - Var("-"); - }; - let infer_view = ( clss, @@ -66,7 +53,6 @@ let infer_view = module type PV = { [@deriving (show({with_path: false}), sexp, yojson)] type t; - //let proj_type: Projector.proj_type; let data: t; let normal: @@ -88,14 +74,14 @@ module type PV = { Node.t; let key_handler: (Id.t, Key.t) => option(UpdateAction.t); - let to_string: unit => string; //Projector //TODO: rename to ci_string or something + let ci_string: unit => string; //Projector //TODO: rename to ci_string or something }; let mkFold = (data): (module PV) => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type t = unit; + type t = Projector.fold; let data = data; let normal = fold_view([]); let indicated = fold_view(["indicated"]); @@ -105,7 +91,7 @@ let mkFold = (data): (module PV) => Some(PerformAction(Project(Toggle(id)))) | _ => None }; - let to_string = () => "F"; + let ci_string = () => "F"; }); let mkInfer = (data): (module PV) => @@ -122,10 +108,10 @@ let mkInfer = (data): (module PV) => Some(PerformAction(Project(Toggle(id)))) | _ => None }; - let to_string: unit => string = _ => "I"; + let ci_string: unit => string = _ => "I"; }); -let proj_view_m = (p: (module Projector.P)): (module PV) => { +let convert = (p: Projector.t): (module PV) => { let (module P) = p; switch (P.proj_type) { | Fold(data) => mkFold(data^) @@ -133,17 +119,11 @@ let proj_view_m = (p: (module Projector.P)): (module PV) => { }; }; -let key_handler = - (p: (module Projector.P), id: Id.t, key: Key.t): option(UpdateAction.t) => { - let (module PV) = proj_view_m(p); - PV.key_handler(id, key); -}; - let view = (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = proj_view_m(p); + let (module PV) = convert(p); PV.normal(id, ~inject, ~font_metrics, ~measurement); }; @@ -152,7 +132,7 @@ let indication_view = : option(Node.t) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = proj_view_m(p); + let (module PV) = convert(p); PV.indicated(id, ~inject, ~font_metrics, ~measurement); }; @@ -170,14 +150,16 @@ let indicated_proj_ed = (editor: Editor.t) => { (id, projector); }; -let dispatch_key_to = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => +let key_handler = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => switch (indicated_proj_ed(editor)) { | None => None - | Some((id, p)) => key_handler(p, id, key) + | Some((id, p)) => + let (module PV) = convert(p); + PV.key_handler(id, key); }; let ci = (~inject as _, editor: Editor.t) => { let+ (_, p) = indicated_proj_ed(editor); - let (module PV) = proj_view_m(p); - div(~attr=Attr.classes(["projector-ci"]), [text(PV.to_string())]); + let (module PV) = convert(p); + div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); }; From f7c9af5175d585124ec595e1791454f8f2d404f3 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 17:32:22 -0400 Subject: [PATCH 047/168] first class modules functional --- src/haz3lcore/zipper/Editor.re | 3 +- src/haz3lcore/zipper/Projector.re | 35 ++++++++++++--- .../zipper/action/ProjectorAction.re | 44 +++++++------------ src/haz3lweb/Editors.re | 3 +- src/haz3lweb/Update.re | 3 +- 5 files changed, 50 insertions(+), 38 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index c9a805f38a..c6c74ac7c1 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -216,7 +216,8 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => +let map_projectors = + (f: (Id.t, Projector.proj_type2) => Projector.proj_type2, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 4f6eaafe30..eb1d03a25d 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,5 +1,6 @@ open Util; open Sexplib.Std; +open OptUtil.Syntax; [@deriving (show({with_path: false}), sexp, yojson)] type infer = {expected_ty: option(Typ.t)}; @@ -7,6 +8,10 @@ type infer = {expected_ty: option(Typ.t)}; [@deriving (show({with_path: false}), sexp, yojson)] type fold = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type proj_type2 = + | Fold(fold) + | Infer(infer); type proj_type = | Fold(ref(fold)) | Infer(ref(infer)); @@ -18,7 +23,7 @@ module type P = { let data: ref(t); let placeholder_length: unit => int; let can_project: Piece.t => bool; - let update: option(Info.t) => unit; + let update: option(Info.t) => proj_type2; }; type t = (module P); @@ -32,7 +37,7 @@ let mkFold = (data): t => let proj_type = Fold(data); let can_project = Piece.is_convex; let placeholder_length = () => 2; - let update = _ => (); + let update = _: proj_type2 => Fold(); }); //TODO(andrew): proper serialization @@ -66,7 +71,7 @@ let mkFInfer = (data: infer): t => ); let placeholder_length = _ => display_ty(data^.expected_ty) |> Typ.pretty_print |> String.length; - let update = (ci: option(Info.t)): unit => { + let update = (ci: option(Info.t)): proj_type2 => { print_endline("updating infer projector"); let expected_ty = switch (ci) { @@ -75,22 +80,38 @@ let mkFInfer = (data: infer): t => | _ => Typ.Float }; data := {expected_ty: Some(expected_ty)}; + Infer(data^); }; }); +let to_module = (p: proj_type2): t => + switch ((p: proj_type2)) { + | Fold(data) => mkFold(data) + | Infer(data) => mkFInfer(data) + }; + [@deriving (show({with_path: false}), sexp, yojson)] module Map = { [@deriving (show({with_path: false}), sexp, yojson)] - type p = t; + type p = proj_type2; open Id.Map; [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(p); let empty = empty; - let find = find_opt; + let find2 = find_opt; + let find = (key, map) => { + let+ p = find_opt(key, map); + to_module(p); + }; let mem = mem; - let mapi = mapi; - let update = update; + let mapi = (f: (Id.t, p) => p, map: Id.Map.t(p)): Id.Map.t(p) => { + mapi(f, map); + }; + + let update = (key, f, map) => { + update(key, f, map); + }; }; let placeholder = (p: t, id: Id.t) => { diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/ProjectorAction.re index c5eaa30a7d..71be100988 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/ProjectorAction.re @@ -61,17 +61,17 @@ let move_out_of_piece = } }; -let set = (p: option(Projector.t), id: Id.t, ps: Projector.Map.t) => +let set = (p: option(Projector.proj_type2), id: Id.t, ps: Projector.Map.t) => Projector.Map.update(id, _ => p, ps); -let set = (p: option(Projector.t), id: Id.t, z: Zipper.t) => { +let set = (p: option(Projector.proj_type2), id: Id.t, z: Zipper.t) => { ...z, projectors: set(p, id, z.projectors), }; let set_project = ( - prj: Projector.t, + prj: Projector.proj_type2, id: Id.t, d: Util.Direction.t, rel: Indicated.relation, @@ -79,38 +79,28 @@ let set_project = ) => z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; -let toggle_fold = (id, _info, z: Zipper.t, piece, d, rel) => { +let toggle_local = (id, _info, z: Zipper.t, piece, d, rel) => { switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => - let (module P) = p; - switch (P.proj_type) { - | Fold(_) => Some(set(None, id, z)) - | Infer(_) => None - }; + | Some(_) => Some(set(None, id, z)) | _ => - let p: module Projector.P = Projector.mkFold(); - let (module P) = p; + let (module P) = Projector.mkFold(); if (P.can_project(piece)) { - set_project(p, id, d, rel, z); + set_project(Fold(), id, d, rel, z); } else { None; }; }; }; -let toggle_infer = (id, info, z: Zipper.t) => { +let toggle_click = (id, info, z: Zipper.t) => { //TODO: get piece of target for predicate - switch (Projector.Map.find(id, z.projectors)) { - | Some(p) => - let (module P) = p; - let infer = Projector.mkFInfer({expected_ty: None}); - let (module I) = infer; - I.update(info); - //TODO(andrew): does this nonsense make sense? - Some(set(Some(infer), id, z)); - | _ => - let p: module Projector.P = Projector.mkFold(); - Some(set(Some(p), id, z)); + switch (Projector.Map.find2(id, z.projectors)) { + | Some(Infer(_)) => Some(set(Some(Fold()), id, z)) + | Some(Fold ()) => + let (module I) = Projector.mkFInfer({expected_ty: None}); + //TODO: get piece of target for I.can_project(piece) + Some(set(Some(I.update(info)), id, z)); + | None => Some(set(Some(Fold()), id, z)) }; }; @@ -123,9 +113,9 @@ let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => | ToggleIndicated => let id = Piece.id(p); let info = Id.Map.find_opt(id, statics.info_map); - toggle_fold(id, info, z, p, d, rel); + toggle_local(id, info, z, p, d, rel); | Toggle(id) => let info = Id.Map.find_opt(id, statics.info_map); - toggle_infer(id, info, z); + toggle_click(id, info, z); } }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 28bce5be19..2c65549494 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -179,5 +179,6 @@ let switch_example_slide = (editors: t, name: string): option(t) => | Documentation(_, slides) => Some(Documentation(name, slides)) }; -let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => +let map_projectors = + (editors: t, f: (Id.t, Projector.proj_type2) => Projector.proj_type2): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index e5f609481a..5d1a9c9a4e 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -219,9 +219,8 @@ let update_projectors = (model: Model.t): Model.t => { Editors.map_projectors( model.editors, (id, p) => { - let (module P) = p; + let (module P) = Projector.to_module(p); P.update(Id.Map.find_opt(id, statics.info_map)); - p; }, ); {...model, editors}; From 4e5e0d6ac59690bb9ef45435bd0578e8be0022ab Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 18:27:13 -0400 Subject: [PATCH 048/168] projectors cleanup --- src/haz3lcore/zipper/Editor.re | 7 +- src/haz3lcore/zipper/Projector.re | 91 ++++++++++--------- src/haz3lcore/zipper/Zipper.re | 9 +- src/haz3lcore/zipper/action/Perform.re | 2 +- ...ProjectorAction.re => PerformProjector.re} | 50 ++-------- src/haz3lweb/Editors.re | 3 +- src/haz3lweb/view/ProjectorsView.re | 18 ++-- 7 files changed, 72 insertions(+), 108 deletions(-) rename src/haz3lcore/zipper/action/{ProjectorAction.re => PerformProjector.re} (63%) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index c6c74ac7c1..fa81fb38af 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -41,7 +41,7 @@ module Meta = { { col_target: 0, touched: Touched.empty, - projected: z |> ProjectorAction.project |> init_projected, + projected: z |> PerformProjector.project |> init_projected, }; }; @@ -92,7 +92,7 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col }; - let z_projected = ProjectorAction.project(z); + let z_projected = PerformProjector.project(z); let projected = switch (Action.is_edit(a)) { //TODO(andrew): reenable @@ -216,8 +216,7 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let map_projectors = - (f: (Id.t, Projector.proj_type2) => Projector.proj_type2, ed: t) => +let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index eb1d03a25d..3aba1d7b59 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,6 +1,5 @@ open Util; open Sexplib.Std; -open OptUtil.Syntax; [@deriving (show({with_path: false}), sexp, yojson)] type infer = {expected_ty: option(Typ.t)}; @@ -9,57 +8,46 @@ type infer = {expected_ty: option(Typ.t)}; type fold = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type proj_type2 = +type proj_type = | Fold(fold) | Infer(infer); -type proj_type = - | Fold(ref(fold)) - | Infer(ref(infer)); module type P = { [@deriving (show({with_path: false}), sexp, yojson)] type t; let proj_type: proj_type; - let data: ref(t); + let data: t; let placeholder_length: unit => int; let can_project: Piece.t => bool; - let update: option(Info.t) => proj_type2; + let update: option(Info.t) => proj_type; }; -type t = (module P); +type p = (module P); -let mkFold = (data): t => +let mkFold = (data): p => (module { [@deriving (show({with_path: false}), sexp, yojson)] type t = unit; - let data = ref(data); + let data = data; let proj_type = Fold(data); let can_project = Piece.is_convex; let placeholder_length = () => 2; - let update = _: proj_type2 => Fold(); + let update = _: proj_type => Fold(); }); -//TODO(andrew): proper serialization -let t_of_sexp = _ => mkFold(); -let sexp_of_t = _ => Sexplib.Sexp.Atom("OPAQUE"); -let yojson_of_t = _ => Yojson.Safe.from_string("OPAQUE"); -let t_of_yojson = _ => mkFold(); -let pp: (Format.formatter, t) => unit = (_fmt, _map) => (); -let compare = (_, _) => 0; - let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { | Some(expected_ty) => expected_ty | None => Unknown(Internal) }; -let mkFInfer = (data: infer): t => +let mkFInfer = (data: infer): p => (module { [@deriving (show({with_path: false}), sexp, yojson)] type t = infer; - let data = ref(data); + let data = data; let proj_type = Infer(data); let can_project = (p: Piece.t): bool => Piece.is_convex(p) @@ -70,8 +58,8 @@ let mkFInfer = (data: infer): t => } ); let placeholder_length = _ => - display_ty(data^.expected_ty) |> Typ.pretty_print |> String.length; - let update = (ci: option(Info.t)): proj_type2 => { + display_ty(data.expected_ty) |> Typ.pretty_print |> String.length; + let update = (ci: option(Info.t)): proj_type => { print_endline("updating infer projector"); let expected_ty = switch (ci) { @@ -79,43 +67,33 @@ let mkFInfer = (data: infer): t => Mode.ty_of(mode) | _ => Typ.Float }; - data := {expected_ty: Some(expected_ty)}; - Infer(data^); + Infer({expected_ty: Some(expected_ty)}); }; }); -let to_module = (p: proj_type2): t => - switch ((p: proj_type2)) { +let to_module = (p: proj_type): p => + switch ((p: proj_type)) { | Fold(data) => mkFold(data) | Infer(data) => mkFInfer(data) }; [@deriving (show({with_path: false}), sexp, yojson)] module Map = { - [@deriving (show({with_path: false}), sexp, yojson)] - type p = proj_type2; - open Id.Map; [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(p); + type t = Id.Map.t(proj_type); let empty = empty; - let find2 = find_opt; - let find = (key, map) => { - let+ p = find_opt(key, map); - to_module(p); - }; + let find = find_opt; let mem = mem; - let mapi = (f: (Id.t, p) => p, map: Id.Map.t(p)): Id.Map.t(p) => { - mapi(f, map); - }; - - let update = (key, f, map) => { - update(key, f, map); - }; + let mapi = mapi; + let update = update; }; +[@deriving (show({with_path: false}), sexp, yojson)] +type t = proj_type; + let placeholder = (p: t, id: Id.t) => { - let (module P) = p; + let (module P) = to_module(p); Piece.Tile({ id, label: [String.make(P.placeholder_length(), ' ')], @@ -161,3 +139,28 @@ let selection_sides_is = piece_is(projectors, ListUtil.hd_opt(s.content)), piece_is(projectors, ListUtil.last_opt(s.content)), ); + +let toggle_click = (id, info, projectors: Map.t) => { + switch (Map.find(id, projectors)) { + | Some(Infer(_)) => (Some(Fold()), id) + | Some(Fold ()) => + let (module I) = mkFInfer({expected_ty: None}); + //TODO(andrew): get piece of target for I.can_project(piece) + (Some(I.update(info)), id); + | None => (Some(Fold()), id) + }; +}; + +let toggle_local = (id, projectors: Map.t, piece) => { + // returns prev, next + switch (Map.find(id, projectors)) { + | Some(p) => (Some(p), None) + | None => + let (module P) = mkFold(); + if (P.can_project(piece)) { + (None, Some(Fold())); + } else { + (None, None); + }; + }; +}; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 12359a9a2c..62909716bf 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -445,12 +445,7 @@ let caret_direction = (z: t): option(Direction.t) => } }; -let get_projector = (z: t, id: Id.t): option(Projector.t) => - Projector.Map.find(id, z.projectors); - -let measured = z => { - z |> unselect_and_zip |> Measured.of_segment; -}; +let measured = z => z |> unselect_and_zip |> Measured.of_segment; let base_point = (measured: Measured.t, z: t): Measured.Point.t => { switch (representative_piece(z)) { @@ -467,7 +462,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * a Grout becomes a Tile. Hence we convert pieces that * would be projected to their placeholders before lookup */ let p = - switch (get_projector(z, Piece.id(p))) { + switch (Projector.Map.find(Piece.id(p), z.projectors)) { | Some(pr) => Projector.placeholder(pr, Piece.id(p)) | None => p }; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index f513a2e651..504f8f7eb8 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -48,7 +48,7 @@ let go_z = switch (a) { | Project(a) => - switch (ProjectorAction.go(a, statics, z)) { + switch (PerformProjector.go(a, statics, z)) { | None => Error(Action.Failure.Cant_project) | Some(z) => Ok(z) } diff --git a/src/haz3lcore/zipper/action/ProjectorAction.re b/src/haz3lcore/zipper/action/PerformProjector.re similarity index 63% rename from src/haz3lcore/zipper/action/ProjectorAction.re rename to src/haz3lcore/zipper/action/PerformProjector.re index 71be100988..83e4961979 100644 --- a/src/haz3lcore/zipper/action/ProjectorAction.re +++ b/src/haz3lcore/zipper/action/PerformProjector.re @@ -61,49 +61,14 @@ let move_out_of_piece = } }; -let set = (p: option(Projector.proj_type2), id: Id.t, ps: Projector.Map.t) => +let set = (p: option(Projector.t), id: Id.t, ps: Projector.Map.t) => Projector.Map.update(id, _ => p, ps); -let set = (p: option(Projector.proj_type2), id: Id.t, z: Zipper.t) => { +let set = (p: option(Projector.t), id: Id.t, z: Zipper.t) => { ...z, projectors: set(p, id, z.projectors), }; -let set_project = - ( - prj: Projector.proj_type2, - id: Id.t, - d: Util.Direction.t, - rel: Indicated.relation, - z: Zipper.t, - ) => - z |> set(Some(prj), id) |> move_out_of_piece(d, rel) |> Option.some; - -let toggle_local = (id, _info, z: Zipper.t, piece, d, rel) => { - switch (Projector.Map.find(id, z.projectors)) { - | Some(_) => Some(set(None, id, z)) - | _ => - let (module P) = Projector.mkFold(); - if (P.can_project(piece)) { - set_project(Fold(), id, d, rel, z); - } else { - None; - }; - }; -}; - -let toggle_click = (id, info, z: Zipper.t) => { - //TODO: get piece of target for predicate - switch (Projector.Map.find2(id, z.projectors)) { - | Some(Infer(_)) => Some(set(Some(Fold()), id, z)) - | Some(Fold ()) => - let (module I) = Projector.mkFInfer({expected_ty: None}); - //TODO: get piece of target for I.can_project(piece) - Some(set(Some(I.update(info)), id, z)); - | None => Some(set(Some(Fold()), id, z)) - }; -}; - let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => //TODO(andrew): avoid bringing statics in here? switch (Indicated.for_index(z)) { @@ -112,10 +77,15 @@ let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => switch (a) { | ToggleIndicated => let id = Piece.id(p); - let info = Id.Map.find_opt(id, statics.info_map); - toggle_local(id, info, z, p, d, rel); + switch (Projector.toggle_local(id, z.projectors, p)) { + | (None, None) => None + | (None, opt_p) => + Some(set(opt_p, id, z) |> move_out_of_piece(d, rel)) + | _ => Some(set(None, id, z)) + }; | Toggle(id) => let info = Id.Map.find_opt(id, statics.info_map); - toggle_click(id, info, z); + let (opt_p, id) = Projector.toggle_click(id, info, z.projectors); + Some(set(opt_p, id, z)); } }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 2c65549494..28bce5be19 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -179,6 +179,5 @@ let switch_example_slide = (editors: t, name: string): option(t) => | Documentation(_, slides) => Some(Documentation(name, slides)) }; -let map_projectors = - (editors: t, f: (Id.t, Projector.proj_type2) => Projector.proj_type2): t => +let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 0260a0773e..1d25005120 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -111,19 +111,17 @@ let mkInfer = (data): (module PV) => let ci_string: unit => string = _ => "I"; }); -let convert = (p: Projector.t): (module PV) => { - let (module P) = p; - switch (P.proj_type) { - | Fold(data) => mkFold(data^) - | Infer(data) => mkInfer(data^) +let to_module = (p: Projector.t): (module PV) => + switch (p) { + | Fold(data) => mkFold(data) + | Infer(data) => mkInfer(data) }; -}; let view = (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = convert(p); + let (module PV) = to_module(p); PV.normal(id, ~inject, ~font_metrics, ~measurement); }; @@ -132,7 +130,7 @@ let indication_view = : option(Node.t) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = convert(p); + let (module PV) = to_module(p); PV.indicated(id, ~inject, ~font_metrics, ~measurement); }; @@ -154,12 +152,12 @@ let key_handler = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => - let (module PV) = convert(p); + let (module PV) = to_module(p); PV.key_handler(id, key); }; let ci = (~inject as _, editor: Editor.t) => { let+ (_, p) = indicated_proj_ed(editor); - let (module PV) = convert(p); + let (module PV) = to_module(p); div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); }; From 0aaba12347d5b2c58f00fe46eca220df316fb716 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 19:37:18 -0400 Subject: [PATCH 049/168] factored out zipper and projector types to ZipperBase. seperated out individual projector cores and views to their own files --- src/haz3lcore/tiles/Segment.re | 12 + src/haz3lcore/zipper/Editor.re | 4 +- src/haz3lcore/zipper/Projector.re | 275 ++++++++++-------- src/haz3lcore/zipper/Zipper.re | 137 +-------- src/haz3lcore/zipper/ZipperBase.re | 85 ++++++ src/haz3lcore/zipper/action/Move.re | 2 +- src/haz3lcore/zipper/action/Perform.re | 2 +- .../zipper/action/PerformProjector.re | 91 ------ .../zipper/action/ProjectorPerform.re | 68 +++++ .../zipper/projectors/FoldProjectorCore.re | 14 + .../zipper/projectors/InferProjectorCore.re | 39 +++ src/haz3lweb/util/JsUtil.re | 6 + src/haz3lweb/view/ProjectorViewModule.re | 31 ++ src/haz3lweb/view/ProjectorsView.re | 115 +------- .../view/projectors/FoldProjectorView.re | 34 +++ .../view/projectors/InferProjectorView.re | 45 +++ 16 files changed, 498 insertions(+), 462 deletions(-) create mode 100644 src/haz3lcore/zipper/ZipperBase.re delete mode 100644 src/haz3lcore/zipper/action/PerformProjector.re create mode 100644 src/haz3lcore/zipper/action/ProjectorPerform.re create mode 100644 src/haz3lcore/zipper/projectors/FoldProjectorCore.re create mode 100644 src/haz3lcore/zipper/projectors/InferProjectorCore.re create mode 100644 src/haz3lweb/view/ProjectorViewModule.re create mode 100644 src/haz3lweb/view/projectors/FoldProjectorView.re create mode 100644 src/haz3lweb/view/projectors/InferProjectorView.re diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index fc1c54e2f4..9895943d2d 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -754,3 +754,15 @@ let rec get_incomplete_ids = (seg: t): list(Id.t) => let ids_of_incomplete_tiles_in_bidelimiteds = (seg: t): list(Id.t) => get_childrens(seg) |> List.concat |> get_incomplete_ids; + +let push_right = ((ls: t, rs: t)): (t, t) => + switch (ls |> List.rev) { + | [l, ...ls] => (ls |> List.rev, [l, ...rs]) + | [] => (ls, rs) + }; + +let push_left = ((ls: t, rs: t)): (t, t) => + switch (rs) { + | [r, ...rs] => (ls @ [r], rs) + | [] => (ls, rs) + }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index fa81fb38af..2e10daccf7 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -41,7 +41,7 @@ module Meta = { { col_target: 0, touched: Touched.empty, - projected: z |> PerformProjector.project |> init_projected, + projected: z |> Projector.Project.go |> init_projected, }; }; @@ -92,7 +92,7 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col }; - let z_projected = PerformProjector.project(z); + let z_projected = Projector.Project.go(z); let projected = switch (Action.is_edit(a)) { //TODO(andrew): reenable diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 3aba1d7b59..0b7e477fd5 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,98 +1,25 @@ open Util; -open Sexplib.Std; +open ZipperBase; [@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; +module Map = ProjectorMap; [@deriving (show({with_path: false}), sexp, yojson)] -type fold = unit; +type fold = ZipperBase.fold; [@deriving (show({with_path: false}), sexp, yojson)] -type proj_type = - | Fold(fold) - | Infer(infer); - -module type P = { - [@deriving (show({with_path: false}), sexp, yojson)] - type t; - let proj_type: proj_type; - let data: t; - let placeholder_length: unit => int; - let can_project: Piece.t => bool; - let update: option(Info.t) => proj_type; -}; - -type p = (module P); - -let mkFold = (data): p => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = unit; - let data = data; - let proj_type = Fold(data); - let can_project = Piece.is_convex; - let placeholder_length = () => 2; - let update = _: proj_type => Fold(); - }); - -let display_ty = (expected_ty: option(Typ.t)): Typ.t => - switch (expected_ty) { - | Some(expected_ty) => expected_ty - | None => Unknown(Internal) - }; +type infer = ZipperBase.infer; -let mkFInfer = (data: infer): p => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = infer; - let data = data; - let proj_type = Infer(data); - let can_project = (p: Piece.t): bool => - Piece.is_convex(p) - && ( - switch (p) { - | Tile(t) => t.mold.out == Exp || t.mold.out == Pat - | _ => false - } - ); - let placeholder_length = _ => - display_ty(data.expected_ty) |> Typ.pretty_print |> String.length; - let update = (ci: option(Info.t)): proj_type => { - print_endline("updating infer projector"); - let expected_ty = - switch (ci) { - | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => - Mode.ty_of(mode) - | _ => Typ.Float - }; - Infer({expected_ty: Some(expected_ty)}); - }; - }); - -let to_module = (p: proj_type): p => +let to_module = (p: proj_type): projector_module => switch ((p: proj_type)) { - | Fold(data) => mkFold(data) - | Infer(data) => mkFInfer(data) + | Fold(data) => FoldProjectorCore.mk(data) + | Infer(data) => InferProjectorCore.mk(data) }; -[@deriving (show({with_path: false}), sexp, yojson)] -module Map = { - open Id.Map; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(proj_type); - let empty = empty; - let find = find_opt; - let mem = mem; - let mapi = mapi; - let update = update; -}; - [@deriving (show({with_path: false}), sexp, yojson)] type t = proj_type; -let placeholder = (p: t, id: Id.t) => { +let placeholder = (p: t, id: Id.t): Piece.t => { let (module P) = to_module(p); Piece.Tile({ id, @@ -102,65 +29,155 @@ let placeholder = (p: t, id: Id.t) => { children: [], }); }; -let placehold = (ps: Map.t, p: Piece.t) => - switch (Map.find(Piece.id(p), ps)) { - | None => p - | Some(pr) => placeholder(pr, Piece.id(p)) + +let piece_is = (ps: Map.t, piece: option(Piece.t)): option(Id.t) => + switch (piece) { + | Some(p) when Map.mem(Piece.id(p), ps) => + Map.mem(Piece.id(p), ps) ? Some(Piece.id(p)) : None + | _ => None }; -let rec of_segment = (projectors, seg: Segment.t): Segment.t => { - seg |> List.map(placehold(projectors)) |> List.map(of_piece(projectors)); -} -and of_piece = (projectors, p: Piece.t): Piece.t => { - switch (p) { - | Tile(t) => Tile(of_tile(projectors, t)) - | Grout(_) => p - | Secondary(_) => p +let neighbor_is = (ps, s: Siblings.t): (option(Id.t), option(Id.t)) => ( + piece_is(ps, Siblings.left_neighbor(s)), + piece_is(ps, Siblings.right_neighbor(s)), +); + +module Select = { + let skip_grow_left = + ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { + let (ls, content) = Segment.push_right((ls, z.selection.content)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; }; -} -and of_tile = (projectors, t: Tile.t): Tile.t => { - {...t, children: List.map(of_segment(projectors), t.children)}; -}; -let piece_is = (projectors: Map.t, p: option(Piece.t)) => - switch (p) { - | Some(p) when Map.mem(Piece.id(p), projectors) => - Map.mem(Piece.id(p), projectors) ? Some(Piece.id(p)) : None - | _ => None + let skip_grow_right = + ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { + let (content, rs) = Segment.push_left((z.selection.content, rs)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; }; -let neighbor_is = (projectors, s: Siblings.t): (option(Id.t), option(Id.t)) => ( - piece_is(projectors, Siblings.left_neighbor(s)), - piece_is(projectors, Siblings.right_neighbor(s)), -); + let grow = + ({relatives: {siblings, _}, projectors, _} as z: ZipperBase.t) + : option(ZipperBase.t) => + switch (z.selection.focus, neighbor_is(projectors, siblings)) { + | (Left, (Some(_), _)) => skip_grow_left(z) + | (Right, (_, Some(_))) => skip_grow_right(z) + | _ => None + }; -let selection_sides_is = - (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( - piece_is(projectors, ListUtil.hd_opt(s.content)), - piece_is(projectors, ListUtil.last_opt(s.content)), -); + let skip_shrink_left = + ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { + let (ls, content) = Segment.push_left((ls, z.selection.content)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; + }; -let toggle_click = (id, info, projectors: Map.t) => { - switch (Map.find(id, projectors)) { - | Some(Infer(_)) => (Some(Fold()), id) - | Some(Fold ()) => - let (module I) = mkFInfer({expected_ty: None}); - //TODO(andrew): get piece of target for I.can_project(piece) - (Some(I.update(info)), id); - | None => (Some(Fold()), id) + let skip_shrink_right = + ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { + let (content, rs) = Segment.push_right((z.selection.content, rs)); + z + |> put_selection_content(content) + |> put_siblings((ls, rs)) + |> Option.some; }; + + let selection_sides_is = + (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( + piece_is(projectors, ListUtil.hd_opt(s.content)), + piece_is(projectors, ListUtil.last_opt(s.content)), + ); + + let shrink = + ({selection, projectors, _} as z: ZipperBase.t): option(ZipperBase.t) => + switch (selection.focus, selection_sides_is(projectors, selection)) { + | (Left, (Some(_), _)) => skip_shrink_left(z) + | (Right, (_, Some(_))) => skip_shrink_right(z) + | _ => None + }; }; -let toggle_local = (id, projectors: Map.t, piece) => { - // returns prev, next - switch (Map.find(id, projectors)) { - | Some(p) => (Some(p), None) - | None => - let (module P) = mkFold(); - if (P.can_project(piece)) { - (None, Some(Fold())); - } else { - (None, None); +module Move = { + let go = (d: Direction.t, z: ZipperBase.t): option(ZipperBase.t) => + switch (d, neighbor_is(z.projectors, z.relatives.siblings)) { + | (Left, (Some(_), _)) => + Some(put_siblings(Segment.push_right(z.relatives.siblings), z)) + | (Right, (_, Some(_))) => + Some(put_siblings(Segment.push_left(z.relatives.siblings), z)) + | _ => None + }; +}; + +module Project = { + let placehold = (ps: Map.t, p: Piece.t) => + switch (Map.find(Piece.id(p), ps)) { + | None => p + | Some(pr) => placeholder(pr, Piece.id(p)) + }; + + let rec of_segment = (projectors, seg: Segment.t): Segment.t => { + seg + |> List.map(placehold(projectors)) + |> List.map(of_piece(projectors)); + } + and of_piece = (projectors, p: Piece.t): Piece.t => { + switch (p) { + | Tile(t) => Tile(of_tile(projectors, t)) + | Grout(_) => p + | Secondary(_) => p + }; + } + and of_tile = (projectors, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(projectors), t.children)}; + }; + + let of_siblings = (projectors: Map.t, siblings: Siblings.t): Siblings.t => { + let l_sibs = of_segment(projectors, fst(siblings)); + let r_sibs = of_segment(projectors, snd(siblings)); + (l_sibs, r_sibs); + }; + + let of_ancestor = (projectors: Map.t, ancestor: Ancestor.t): Ancestor.t => { + { + ...ancestor, + children: ( + List.map(of_segment(projectors), fst(ancestor.children)), + List.map(of_segment(projectors), snd(ancestor.children)), + ), }; }; + + let of_generation = + (projectors: Map.t, generation: Ancestors.generation) + : Ancestors.generation => ( + of_ancestor(projectors, fst(generation)), + of_siblings(projectors, snd(generation)), + ); + + let of_ancestors = (projectors: Map.t, ancestors: Ancestors.t): Ancestors.t => + List.map(of_generation(projectors), ancestors); + + let of_selection = (projectors: Map.t, selection: Selection.t): Selection.t => { + {...selection, content: of_segment(projectors, selection.content)}; + }; + + let go = (z: ZipperBase.t): ZipperBase.t => + if (Id.Map.is_empty(z.projectors)) { + z; + } else { + { + ...z, + selection: of_selection(z.projectors, z.selection), + relatives: { + ancestors: of_ancestors(z.projectors, z.relatives.ancestors), + siblings: of_siblings(z.projectors, z.relatives.siblings), + }, + }; + }; }; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 62909716bf..18cd1208a5 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -1,35 +1,12 @@ -open Sexplib.Std; open Util; open OptUtil.Syntax; +open ZipperBase; -module Caret = { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = - | Outer - | Inner(int, int); - - let decrement: t => t = - fun - | Outer - | Inner(_, 0) => Outer - | Inner(d, c) => Inner(d, c - 1); - - let offset: t => int = - fun - | Outer => 0 - | Inner(_, c) => c + 1; -}; +[@deriving (show({with_path: false}), sexp, yojson)] +type t = ZipperBase.t; -// assuming single backpack, shards may appear in selection, backpack, or siblings [@deriving (show({with_path: false}), sexp, yojson)] -type t = { - selection: Selection.t, - backpack: Backpack.t, - relatives: Relatives.t, - caret: Caret.t, - [@opaque] - projectors: Projector.Map.t, -}; +module Caret = ZipperBase.Caret; let init: unit => t = () => { @@ -40,7 +17,7 @@ let init: unit => t = ancestors: [], }, caret: Outer, - projectors: Projector.Map.empty, + projectors: ProjectorMap.empty, }; let next_blank = _ => Id.mk(); @@ -71,16 +48,6 @@ let update_caret = (f: Caret.t => Caret.t, z: t): t => { }; let set_caret = (caret: Caret.t): (t => t) => update_caret(_ => caret); -let update_relatives = (f: Relatives.t => Relatives.t, z: t): t => { - ...z, - relatives: f(z.relatives), -}; - -let update_siblings: (Siblings.t => Siblings.t, t) => t = - f => update_relatives(rs => {...rs, siblings: f(rs.siblings)}); - -let put_siblings = (siblings, z: t): t => update_siblings(_ => siblings, z); - let parent = (z: t): option(Piece.t) => Relatives.parent(~sel=z.selection.content, z.relatives); @@ -100,7 +67,7 @@ let unzip = (seg: Segment.t): t => { ancestors: [], }, caret: Outer, - projectors: Projector.Map.empty, + projectors: ProjectorMap.empty, }; let sibs_with_sel = @@ -176,79 +143,8 @@ let update_selection = (selection: Selection.t, z: t): (Selection.t, t) => { let put_selection = (sel: Selection.t, z: t): t => snd(update_selection(sel, z)); -let put_selection_content = (content: Segment.t, z): t => { - ...z, - selection: { - ...z.selection, - content, - }, -}; - -let push_right = ((ls: Segment.t, rs: Segment.t)): (Segment.t, Segment.t) => - switch (ls |> List.rev) { - | [l, ...ls] => (ls |> List.rev, [l, ...rs]) - | [] => (ls, rs) - }; - -let push_left = ((ls: Segment.t, rs: Segment.t)): (Segment.t, Segment.t) => - switch (rs) { - | [r, ...rs] => (ls @ [r], rs) - | [] => (ls, rs) - }; - -let skip_grow_left = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { - let (ls, content) = push_right((ls, z.selection.content)); - z - |> put_selection_content(content) - |> put_siblings((ls, rs)) - |> Option.some; -}; - -let skip_grow_right = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { - let (content, rs) = push_left((z.selection.content, rs)); - z - |> put_selection_content(content) - |> put_siblings((ls, rs)) - |> Option.some; -}; - -let projector_grow_selection = - ({relatives: {siblings, _}, projectors, _} as z: t): option(t) => - switch (z.selection.focus, Projector.neighbor_is(projectors, siblings)) { - | (Left, (Some(_), _)) => skip_grow_left(z) - | (Right, (_, Some(_))) => skip_grow_right(z) - | _ => None - }; - -let skip_shrink_left = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { - let (ls, content) = push_left((ls, z.selection.content)); - z - |> put_selection_content(content) - |> put_siblings((ls, rs)) - |> Option.some; -}; - -let skip_shrink_right = ({relatives: {siblings: (ls, rs), _}, _} as z: t) => { - let (content, rs) = push_right((z.selection.content, rs)); - z - |> put_selection_content(content) - |> put_siblings((ls, rs)) - |> Option.some; -}; - -let projector_shrink_selection = - ({selection, projectors, _} as z: t): option(t) => - switch ( - selection.focus, - Projector.selection_sides_is(projectors, selection), - ) { - | (Left, (Some(_), _)) => skip_shrink_left(z) - | (Right, (_, Some(_))) => skip_shrink_right(z) - | _ => None - }; - let grow_selection = (z: t): option(t) => { - switch (projector_grow_selection(z)) { + switch (Projector.Select.grow(z)) { | Some(z) => Some(z) | None => let+ (p, relatives) = Relatives.pop(z.selection.focus, z.relatives); @@ -264,7 +160,7 @@ let shrink_selection = (z: t): option(t) => { let selection = Selection.toggle_focus(z.selection); grow_selection({...z, selection}); | Some((p, selection)) => - switch (projector_shrink_selection(z)) { + switch (Projector.Select.shrink(z)) { | Some(z) => Some(z) | None => let relatives = @@ -286,22 +182,9 @@ let directional_unselect = (d: Direction.t, z: t): t => { unselect({...z, selection}); }; -let skip_left = ({relatives: {siblings, _}, _} as z: t): option(t) => - z |> put_siblings(push_right(siblings)) |> Option.some; - -let skip_right = ({relatives: {siblings, _}, _} as z: t): option(t) => - z |> put_siblings(push_left(siblings)) |> Option.some; - -let projector_move = (d: Direction.t, z: t): option(t) => - switch (d, Projector.neighbor_is(z.projectors, z.relatives.siblings)) { - | (Left, (Some(_), _)) => skip_left(z) - | (Right, (_, Some(_))) => skip_right(z) - | _ => None - }; - let move = (d: Direction.t, z: t): option(t) => if (Selection.is_empty(z.selection)) { - switch (projector_move(d, z)) { + switch (Projector.Move.go(d, z)) { | Some(z) => Some(z) | None => let+ (p, relatives) = Relatives.pop(d, z.relatives); @@ -462,7 +345,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * a Grout becomes a Tile. Hence we convert pieces that * would be projected to their placeholders before lookup */ let p = - switch (Projector.Map.find(Piece.id(p), z.projectors)) { + switch (ProjectorMap.find(Piece.id(p), z.projectors)) { | Some(pr) => Projector.placeholder(pr, Piece.id(p)) | None => p }; diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re new file mode 100644 index 0000000000..66baedee7d --- /dev/null +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -0,0 +1,85 @@ +open Sexplib.Std; + +/* Projector model types */ + +[@deriving (show({with_path: false}), sexp, yojson)] +type infer = {expected_ty: option(Typ.t)}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type fold = unit; + +[@deriving (show({with_path: false}), sexp, yojson)] +type proj_type = + | Fold(fold) + | Infer(infer); + +[@deriving (show({with_path: false}), sexp, yojson)] +module ProjectorMap = { + open Id.Map; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Id.Map.t(proj_type); + let empty = empty; + let find = find_opt; + let mem = mem; + let mapi = mapi; + let update = update; +}; + +module type P = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t; + let proj_type: proj_type; + let data: t; + let placeholder_length: unit => int; + let can_project: Piece.t => bool; + let update: option(Info.t) => proj_type; +}; + +type projector_module = (module P); + +module Caret = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = + | Outer + | Inner(int, int); + + let decrement: t => t = + fun + | Outer + | Inner(_, 0) => Outer + | Inner(d, c) => Inner(d, c - 1); + + let offset: t => int = + fun + | Outer => 0 + | Inner(_, c) => c + 1; +}; + +// assuming single backpack, shards may appear in selection, backpack, or siblings +[@deriving (show({with_path: false}), sexp, yojson)] +type t = { + selection: Selection.t, + backpack: Backpack.t, + relatives: Relatives.t, + caret: Caret.t, + [@opaque] + projectors: ProjectorMap.t, +}; + +let update_relatives = (f: Relatives.t => Relatives.t, z: t): t => { + ...z, + relatives: f(z.relatives), +}; + +let update_siblings: (Siblings.t => Siblings.t, t) => t = + f => update_relatives(rs => {...rs, siblings: f(rs.siblings)}); + +let put_siblings = (siblings, z: t): t => update_siblings(_ => siblings, z); + +let put_selection_content = (content: Segment.t, z): t => { + ...z, + selection: { + ...z.selection, + content, + }, +}; diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 861c52ddb2..5473478101 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -79,7 +79,7 @@ module Make = (M: Editor.Meta.S) => { (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) /* Need this case to avoid moving sub-caret onto projectors: */ - | _ when Zipper.projector_move(d, z) != None => Zipper.move(d, z) + | _ when Projector.Move.go(d, z) != None => Zipper.move(d, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 504f8f7eb8..1e4224a2d2 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -48,7 +48,7 @@ let go_z = switch (a) { | Project(a) => - switch (PerformProjector.go(a, statics, z)) { + switch (ProjectorPerform.go(a, statics, z)) { | None => Error(Action.Failure.Cant_project) | Some(z) => Ok(z) } diff --git a/src/haz3lcore/zipper/action/PerformProjector.re b/src/haz3lcore/zipper/action/PerformProjector.re deleted file mode 100644 index 83e4961979..0000000000 --- a/src/haz3lcore/zipper/action/PerformProjector.re +++ /dev/null @@ -1,91 +0,0 @@ -let of_siblings = - (projectors: Projector.Map.t, siblings: Siblings.t): Siblings.t => { - let l_sibs = Projector.of_segment(projectors, fst(siblings)); - let r_sibs = Projector.of_segment(projectors, snd(siblings)); - (l_sibs, r_sibs); -}; - -let of_ancestor = - (projectors: Projector.Map.t, ancestor: Ancestor.t): Ancestor.t => { - { - ...ancestor, - children: ( - List.map(Projector.of_segment(projectors), fst(ancestor.children)), - List.map(Projector.of_segment(projectors), snd(ancestor.children)), - ), - }; -}; - -let of_generation = - (projectors: Projector.Map.t, generation: Ancestors.generation) - : Ancestors.generation => ( - of_ancestor(projectors, fst(generation)), - of_siblings(projectors, snd(generation)), -); - -let of_ancestors = - (projectors: Projector.Map.t, ancestors: Ancestors.t): Ancestors.t => - List.map(of_generation(projectors), ancestors); - -let of_selection = - (projectors: Projector.Map.t, selection: Selection.t): Selection.t => { - { - ...selection, - content: Projector.of_segment(projectors, selection.content), - }; -}; - -let project = (z: Zipper.t): Zipper.t => - if (Id.Map.is_empty(z.projectors)) { - z; - } else { - { - ...z, - selection: of_selection(z.projectors, z.selection), - relatives: { - ancestors: of_ancestors(z.projectors, z.relatives.ancestors), - siblings: of_siblings(z.projectors, z.relatives.siblings), - }, - }; - }; - -let move_out_of_piece = - (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => - /* Might not work for pieces with more than 2 delims */ - switch (rel) { - | Sibling => {...z, caret: Outer} - | Parent => - switch (Zipper.move(d, {...z, caret: Outer})) { - | Some(z) => z - | None => z - } - }; - -let set = (p: option(Projector.t), id: Id.t, ps: Projector.Map.t) => - Projector.Map.update(id, _ => p, ps); - -let set = (p: option(Projector.t), id: Id.t, z: Zipper.t) => { - ...z, - projectors: set(p, id, z.projectors), -}; - -let go = (a: Action.project, statics: CachedStatics.statics, z: Zipper.t) => - //TODO(andrew): avoid bringing statics in here? - switch (Indicated.for_index(z)) { - | None => None - | Some((p, d, rel)) => - switch (a) { - | ToggleIndicated => - let id = Piece.id(p); - switch (Projector.toggle_local(id, z.projectors, p)) { - | (None, None) => None - | (None, opt_p) => - Some(set(opt_p, id, z) |> move_out_of_piece(d, rel)) - | _ => Some(set(None, id, z)) - }; - | Toggle(id) => - let info = Id.Map.find_opt(id, statics.info_map); - let (opt_p, id) = Projector.toggle_click(id, info, z.projectors); - Some(set(opt_p, id, z)); - } - }; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re new file mode 100644 index 0000000000..eb0ee9f9b4 --- /dev/null +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -0,0 +1,68 @@ +open Projector; + +let move_out_of_piece = + (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => + /* Might not work for pieces with more than 2 delims */ + switch (rel) { + | Sibling => {...z, caret: Outer} + | Parent => + switch (Zipper.move(d, {...z, caret: Outer})) { + | Some(z) => z + | None => z + } + }; + +let set = (p: option(t), id: Id.t, ps: Map.t) => Map.update(id, _ => p, ps); + +let set = (p: option(t), id: Id.t, z: ZipperBase.t) => { + ...z, + projectors: set(p, id, z.projectors), +}; + +let toggle_click = + (id: Id.t, info: option(Info.t), ps: Map.t): (option(t), Id.t) => { + switch (Map.find(id, ps)) { + | Some(Infer(_)) => (Some(Fold()), id) + | Some(Fold ()) => + let (module I) = InferProjectorCore.mk({expected_ty: None}); + //TODO(andrew): get piece of target for I.can_project(piece) + (Some(I.update(info)), id); + | None => (Some(Fold()), id) + }; +}; + +let toggle_local = + (id, projectors: Map.t, piece: Piece.t): (option(t), option(t)) => { + // returns prev & new projector model + switch (Map.find(id, projectors)) { + | Some(p) => (Some(p), None) + | None => + let (module P) = FoldProjectorCore.mk(); + if (P.can_project(piece)) { + (None, Some(Fold())); + } else { + (None, None); + }; + }; +}; + +let go = (a: Action.project, statics: CachedStatics.statics, z: ZipperBase.t) => + //TODO(andrew): avoid bringing statics in here? + switch (Indicated.for_index(z)) { + | None => None + | Some((p, d, rel)) => + switch (a) { + | ToggleIndicated => + let id = Piece.id(p); + switch (toggle_local(id, z.projectors, p)) { + | (None, None) => None + | (None, opt_p) => + Some(set(opt_p, id, z) |> move_out_of_piece(d, rel)) + | _ => Some(set(None, id, z)) + }; + | Toggle(id) => + let info = Id.Map.find_opt(id, statics.info_map); + let (opt_p, id) = toggle_click(id, info, z.projectors); + Some(set(opt_p, id, z)); + } + }; diff --git a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re new file mode 100644 index 0000000000..0e2c94aa78 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re @@ -0,0 +1,14 @@ +open Sexplib.Std; +open ZipperBase; + +let mk = (data): projector_module => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = unit; + let data = data; + let proj_type = Fold(data); + let can_project = Piece.is_convex; + let placeholder_length = () => 2; + let update = _: proj_type => Fold(); + }); diff --git a/src/haz3lcore/zipper/projectors/InferProjectorCore.re b/src/haz3lcore/zipper/projectors/InferProjectorCore.re new file mode 100644 index 0000000000..c9dd554e53 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/InferProjectorCore.re @@ -0,0 +1,39 @@ +open ZipperBase; + +let display_ty = (expected_ty: option(Typ.t)): Typ.t => + switch (expected_ty) { + | Some(expected_ty) => expected_ty + | None => Unknown(Internal) + }; + +let mk = (data: infer): projector_module => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = infer; + let data = data; + let proj_type = Infer(data); + + let can_project = (p: Piece.t): bool => + Piece.is_convex(p) + && ( + switch (p) { + | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | _ => false + } + ); + + let placeholder_length = _ => + display_ty(data.expected_ty) |> Typ.pretty_print |> String.length; + + let update = (ci: option(Info.t)): proj_type => { + print_endline("updating infer projector"); + let expected_ty = + switch (ci) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => + Mode.ty_of(mode) + | _ => Typ.Float + }; + Infer({expected_ty: Some(expected_ty)}); + }; + }); diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index d9a7efc7fc..f2efd591e3 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -160,3 +160,9 @@ module Fragment = { Url.Current.get() |> Option.map(fragment_of_url); }; }; + +let stop_mousedown_propagation = + Attr.on_mousedown(evt => { + Js_of_ocaml.Dom_html.stopPropagation(evt); + Virtual_dom.Vdom.Effect.Ignore; + }); diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re new file mode 100644 index 0000000000..cb3635f76e --- /dev/null +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -0,0 +1,31 @@ +open Haz3lcore; +open Virtual_dom.Vdom; + +module type PV = { + [@deriving (show({with_path: false}), sexp, yojson)] + type t; + let data: t; + + let normal: + ( + Id.t, + ~font_metrics: FontMetrics.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ~measurement: Measured.measurement + ) => + Node.t; + + let indicated: + ( + Id.t, + ~font_metrics: FontMetrics.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ~measurement: Measured.measurement + ) => + Node.t; + + let key_handler: (Id.t, Key.t) => option(UpdateAction.t); + let ci_string: unit => string; //Projector //TODO: rename to ci_string or something +}; + +type t = (module PV); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 1d25005120..5b3e3aa7e9 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,117 +4,10 @@ open Node; open Projector; open Util.OptUtil.Syntax; -let stop_mousedown_propagation = - Attr.on_mousedown(evt => { - Js_of_ocaml.Dom_html.stopPropagation(evt); - Virtual_dom.Vdom.Effect.Ignore; - }); - -let fold_view = (clss, id, ~font_metrics, ~inject, ~measurement) => - div( - ~attr= - Attr.many([ - Attr.classes(["projector", "fold"] @ clss), - stop_mousedown_propagation, - Attr.on_pointerdown(_ => - inject(Update.PerformAction(Project(Toggle(id)))) - ), - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], - ); - -let infer_view = - ( - clss, - expected_ty: option(Typ.t), - id: Id.t, - ~font_metrics, - ~inject, - ~measurement: Measured.measurement, - ) => - div( - ~attr= - Attr.many([ - Attr.classes(["projector", "infer"] @ clss), - stop_mousedown_propagation, - Attr.on_pointerdown(_ => - Effect.Many([inject(Update.PerformAction(Project(Toggle(id))))]) - ), - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [ - text(expected_ty |> display_ty |> Typ.pretty_print), - //Type.view(expected_ty), - PieceDec.convex_shard(~font_metrics, ~measurement), - ], - ); - -module type PV = { - [@deriving (show({with_path: false}), sexp, yojson)] - type t; - let data: t; - - let normal: - ( - Id.t, - ~font_metrics: FontMetrics.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ~measurement: Measured.measurement - ) => - Node.t; - - let indicated: - ( - Id.t, - ~font_metrics: FontMetrics.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ~measurement: Measured.measurement - ) => - Node.t; - - let key_handler: (Id.t, Key.t) => option(UpdateAction.t); - let ci_string: unit => string; //Projector //TODO: rename to ci_string or something -}; - -let mkFold = (data): (module PV) => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Projector.fold; - let data = data; - let normal = fold_view([]); - let indicated = fold_view(["indicated"]); - let key_handler = (id, key: Key.t): option(UpdateAction.t) => - switch (key) { - | {key: D("Escape"), _} => - Some(PerformAction(Project(Toggle(id)))) - | _ => None - }; - let ci_string = () => "F"; - }); - -let mkInfer = (data): (module PV) => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Projector.infer; - let data = data; - let normal = infer_view([], data.expected_ty); - let indicated = infer_view(["indicated"], data.expected_ty); - let key_handler = (id, key: Key.t): option(UpdateAction.t) => - switch (key) { - | {key: D("Escape"), _} => - Some(PerformAction(Project(Toggle(id)))) - | _ => None - }; - let ci_string: unit => string = _ => "I"; - }); - -let to_module = (p: Projector.t): (module PV) => +let to_module = (p: Projector.t): ProjectorViewModule.t => switch (p) { - | Fold(data) => mkFold(data) - | Infer(data) => mkInfer(data) + | Fold(data) => FoldProjectorView.mk(data) + | Infer(data) => InferProjectorView.mk(data) }; let view = @@ -142,7 +35,7 @@ let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => let indicated_proj_ed = (editor: Editor.t) => { let projectors = Editor.get_projectors(editor); - //TODO: use z_proj instead of zipper? + //TODO(andrew): use z_proj instead of zipper? let* id = Indicated.index(editor.state.zipper); let+ projector = Projector.Map.find(id, projectors); (id, projector); diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re new file mode 100644 index 0000000000..35a6608285 --- /dev/null +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -0,0 +1,34 @@ +open Haz3lcore; +open Virtual_dom.Vdom; +open Node; + +let base = (clss, id, ~font_metrics, ~inject, ~measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["projector", "fold"] @ clss), + JsUtil.stop_mousedown_propagation, + Attr.on_pointerdown(_ => + inject(Update.PerformAction(Project(Toggle(id)))) + ), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], + ); + +let mk = (data: Projector.fold): ProjectorViewModule.t => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Projector.fold; + let data = data; + let normal = base([]); + let indicated = base(["indicated"]); + let key_handler = (id, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => + Some(PerformAction(Project(Toggle(id)))) + | _ => None + }; + let ci_string = () => "F"; + }); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re new file mode 100644 index 0000000000..7f9cb13861 --- /dev/null +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -0,0 +1,45 @@ +open Haz3lcore; +open Virtual_dom.Vdom; +open Node; + +let base = + ( + clss, + expected_ty: option(Typ.t), + id: Id.t, + ~font_metrics, + ~inject, + ~measurement: Measured.measurement, + ) => + div( + ~attr= + Attr.many([ + Attr.classes(["projector", "infer"] @ clss), + JsUtil.stop_mousedown_propagation, + Attr.on_pointerdown(_ => + Effect.Many([inject(Update.PerformAction(Project(Toggle(id))))]) + ), + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [ + text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print), + PieceDec.convex_shard(~font_metrics, ~measurement), + ], + ); + +let mk = (data: Projector.infer): ProjectorViewModule.t => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Projector.infer; + let data = data; + let normal = base([], data.expected_ty); + let indicated = base(["indicated"], data.expected_ty); + let key_handler = (id, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => + Some(PerformAction(Project(Toggle(id)))) + | _ => None + }; + let ci_string: unit => string = _ => "I"; + }); From 3f16821055d6923a640707758ea545305acd3493 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 22:11:26 -0400 Subject: [PATCH 050/168] generalize projector info provision --- src/haz3lcore/zipper/Projector.re | 9 ++++++--- src/haz3lcore/zipper/ZipperBase.re | 15 +++++++++------ src/haz3lcore/zipper/action/ProjectorPerform.re | 16 +++++++--------- .../zipper/projectors/FoldProjectorCore.re | 6 +++--- .../zipper/projectors/InferProjectorCore.re | 8 ++++---- src/haz3lweb/Update.re | 3 ++- src/haz3lweb/view/ProjectorViewModule.re | 6 +++--- 7 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 0b7e477fd5..aa6a0578cb 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -4,20 +4,23 @@ open ZipperBase; [@deriving (show({with_path: false}), sexp, yojson)] module Map = ProjectorMap; +[@deriving (show({with_path: false}), sexp, yojson)] +type info = ZipperBase.projector_info; + [@deriving (show({with_path: false}), sexp, yojson)] type fold = ZipperBase.fold; [@deriving (show({with_path: false}), sexp, yojson)] type infer = ZipperBase.infer; -let to_module = (p: proj_type): projector_module => - switch ((p: proj_type)) { +let to_module = (p: projector): projector_core => + switch ((p: projector)) { | Fold(data) => FoldProjectorCore.mk(data) | Infer(data) => InferProjectorCore.mk(data) }; [@deriving (show({with_path: false}), sexp, yojson)] -type t = proj_type; +type t = projector; let placeholder = (p: t, id: Id.t): Piece.t => { let (module P) = to_module(p); diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 66baedee7d..58d5085fe7 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -9,7 +9,7 @@ type infer = {expected_ty: option(Typ.t)}; type fold = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type proj_type = +type projector = | Fold(fold) | Infer(infer); @@ -17,7 +17,7 @@ type proj_type = module ProjectorMap = { open Id.Map; [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(proj_type); + type t = Id.Map.t(projector); let empty = empty; let find = find_opt; let mem = mem; @@ -25,17 +25,20 @@ module ProjectorMap = { let update = update; }; -module type P = { +[@deriving (show({with_path: false}), sexp, yojson)] +type projector_info = {info: option(Info.t)}; + +module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] type t; - let proj_type: proj_type; + let projector: projector; let data: t; let placeholder_length: unit => int; let can_project: Piece.t => bool; - let update: option(Info.t) => proj_type; + let update: projector_info => projector; }; -type projector_module = (module P); +type projector_core = (module ProjectorCore); module Caret = { [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index eb0ee9f9b4..6999bf3743 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -19,21 +19,20 @@ let set = (p: option(t), id: Id.t, z: ZipperBase.t) => { projectors: set(p, id, z.projectors), }; -let toggle_click = - (id: Id.t, info: option(Info.t), ps: Map.t): (option(t), Id.t) => { +let toggle_click = (id: Id.t, info: Projector.info, ps: Map.t): option(t) => { switch (Map.find(id, ps)) { - | Some(Infer(_)) => (Some(Fold()), id) + | Some(Infer(_)) => Some(Fold()) | Some(Fold ()) => let (module I) = InferProjectorCore.mk({expected_ty: None}); //TODO(andrew): get piece of target for I.can_project(piece) - (Some(I.update(info)), id); - | None => (Some(Fold()), id) + Some(I.update(info)); + | None => Some(Fold()) }; }; let toggle_local = - (id, projectors: Map.t, piece: Piece.t): (option(t), option(t)) => { - // returns prev & new projector model + (id: Id.t, projectors: Map.t, piece: Piece.t): (option(t), option(t)) => { + /* returns prev & new projector model */ switch (Map.find(id, projectors)) { | Some(p) => (Some(p), None) | None => @@ -62,7 +61,6 @@ let go = (a: Action.project, statics: CachedStatics.statics, z: ZipperBase.t) => }; | Toggle(id) => let info = Id.Map.find_opt(id, statics.info_map); - let (opt_p, id) = toggle_click(id, info, z.projectors); - Some(set(opt_p, id, z)); + Some(set(toggle_click(id, {info: info}, z.projectors), id, z)); } }; diff --git a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re index 0e2c94aa78..55eef5a922 100644 --- a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re @@ -1,14 +1,14 @@ open Sexplib.Std; open ZipperBase; -let mk = (data): projector_module => +let mk = (data): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type t = unit; let data = data; - let proj_type = Fold(data); + let projector = Fold(data); let can_project = Piece.is_convex; let placeholder_length = () => 2; - let update = _: proj_type => Fold(); + let update = _: projector => Fold(); }); diff --git a/src/haz3lcore/zipper/projectors/InferProjectorCore.re b/src/haz3lcore/zipper/projectors/InferProjectorCore.re index c9dd554e53..04eaeebcb3 100644 --- a/src/haz3lcore/zipper/projectors/InferProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/InferProjectorCore.re @@ -6,13 +6,13 @@ let display_ty = (expected_ty: option(Typ.t)): Typ.t => | None => Unknown(Internal) }; -let mk = (data: infer): projector_module => +let mk = (data: infer): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type t = infer; let data = data; - let proj_type = Infer(data); + let projector = Infer(data); let can_project = (p: Piece.t): bool => Piece.is_convex(p) @@ -26,10 +26,10 @@ let mk = (data: infer): projector_module => let placeholder_length = _ => display_ty(data.expected_ty) |> Typ.pretty_print |> String.length; - let update = (ci: option(Info.t)): proj_type => { + let update = ({info, _}): projector => { print_endline("updating infer projector"); let expected_ty = - switch (ci) { + switch (info) { | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) | _ => Typ.Float diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 5d1a9c9a4e..61966b0b1b 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -220,7 +220,8 @@ let update_projectors = (model: Model.t): Model.t => { model.editors, (id, p) => { let (module P) = Projector.to_module(p); - P.update(Id.Map.find_opt(id, statics.info_map)); + let info = Id.Map.find_opt(id, statics.info_map); + P.update({info: info}); }, ); {...model, editors}; diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index cb3635f76e..61b048a649 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -1,7 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; -module type PV = { +module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] type t; let data: t; @@ -25,7 +25,7 @@ module type PV = { Node.t; let key_handler: (Id.t, Key.t) => option(UpdateAction.t); - let ci_string: unit => string; //Projector //TODO: rename to ci_string or something + let ci_string: unit => string; }; -type t = (module PV); +type t = (module ProjectorView); From 4d4a1709efe7402b42ba23478ca420bfac09d9b6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 23:06:22 -0400 Subject: [PATCH 051/168] new keyboard controls: opt/alt-f for fold, opt/alt-t for type --- src/haz3lcore/zipper/Projector.re | 7 ++ src/haz3lcore/zipper/action/Action.re | 6 +- src/haz3lcore/zipper/action/Perform.re | 6 +- .../zipper/action/ProjectorPerform.re | 65 +++++++------------ src/haz3lweb/Keyboard.re | 23 ++++--- .../view/projectors/FoldProjectorView.re | 9 ++- .../view/projectors/InferProjectorView.re | 11 ++-- 7 files changed, 57 insertions(+), 70 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index aa6a0578cb..ba47779503 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -33,6 +33,13 @@ let placeholder = (p: t, id: Id.t): Piece.t => { }); }; +let create = + (p: t, piece: Piece.t, id: Id.t, info_map: Statics.Map.t): option(t) => { + let (module P) = to_module(p); + P.can_project(piece) + ? Some(P.update({info: Id.Map.find_opt(id, info_map)})) : None; +}; + let piece_is = (ps: Map.t, piece: option(Piece.t)): option(Id.t) => switch (piece) { | Some(p) when Map.mem(Piece.id(p), ps) => diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 8f0b77331f..f32f24f323 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,8 +45,10 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | ToggleIndicated - | Toggle(Id.t); + | AddOrRemoveIndicated(Projector.t) + | Remove(Id.t); +//| UpdateModel(Id.t, projector_type(X)_action) +//| UpdateSyntax(Id.t, Piece.t => Piece.t) [@deriving (show({with_path: false}), sexp, yojson)] type t = diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 1e4224a2d2..ae846c167c 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -47,11 +47,7 @@ let go_z = }; switch (a) { - | Project(a) => - switch (ProjectorPerform.go(a, statics, z)) { - | None => Error(Action.Failure.Cant_project) - | Some(z) => Ok(z) - } + | Project(a) => ProjectorPerform.go(a, statics, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 6999bf3743..67110d4f46 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -12,55 +12,34 @@ let move_out_of_piece = } }; -let set = (p: option(t), id: Id.t, ps: Map.t) => Map.update(id, _ => p, ps); - -let set = (p: option(t), id: Id.t, z: ZipperBase.t) => { +let set = (id: Id.t, p: option(t), z: ZipperBase.t) => { ...z, - projectors: set(p, id, z.projectors), -}; - -let toggle_click = (id: Id.t, info: Projector.info, ps: Map.t): option(t) => { - switch (Map.find(id, ps)) { - | Some(Infer(_)) => Some(Fold()) - | Some(Fold ()) => - let (module I) = InferProjectorCore.mk({expected_ty: None}); - //TODO(andrew): get piece of target for I.can_project(piece) - Some(I.update(info)); - | None => Some(Fold()) - }; + projectors: Map.update(id, _ => p, z.projectors), }; -let toggle_local = - (id: Id.t, projectors: Map.t, piece: Piece.t): (option(t), option(t)) => { - /* returns prev & new projector model */ - switch (Map.find(id, projectors)) { - | Some(p) => (Some(p), None) - | None => - let (module P) = FoldProjectorCore.mk(); - if (P.can_project(piece)) { - (None, Some(Fold())); - } else { - (None, None); - }; +let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => + switch (Map.mem(id, z.projectors)) { + | false => + switch (Projector.create(p, piece, id, info_map)) { + | None => Error(Action.Failure.Cant_project) + | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) + } + | true => Ok(set(id, None, z)) }; -}; let go = (a: Action.project, statics: CachedStatics.statics, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? - switch (Indicated.for_index(z)) { - | None => None - | Some((p, d, rel)) => - switch (a) { - | ToggleIndicated => - let id = Piece.id(p); - switch (toggle_local(id, z.projectors, p)) { - | (None, None) => None - | (None, opt_p) => - Some(set(opt_p, id, z) |> move_out_of_piece(d, rel)) - | _ => Some(set(None, id, z)) - }; - | Toggle(id) => - let info = Id.Map.find_opt(id, statics.info_map); - Some(set(toggle_click(id, {info: info}, z.projectors), id, z)); + //TODO(andrew): method to remotely get projected piece + switch (a) { + | AddOrRemoveIndicated(p) => + switch (Indicated.for_index(z)) { + | None => Error(Action.Failure.Cant_project) + | Some((piece, d, rel)) => + add_or_remove(Piece.id(piece), z, statics.info_map, p, piece, d, rel) + } + | Remove(id) => + switch (Map.mem(id, z.projectors)) { + | false => Error(Action.Failure.Cant_project) + | true => Ok(set(id, None, z)) } }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index c7f9d5a0f8..1e405b58db 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -73,7 +73,6 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: Mac, shift: Up, meta: Down, ctrl: Up, alt: Up} => switch (key) { - | "e" => Some(PerformAction(Project(ToggleIndicated))) | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) @@ -89,7 +88,6 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: PC, shift: Up, meta: Up, ctrl: Down, alt: Up} => switch (key) { - | "e" => Some(PerformAction(Project(ToggleIndicated))) | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) @@ -109,13 +107,20 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "e" => now(Move(Extreme(Right(ByToken)))) | _ => None } - | {key: D(key), sys, shift: Up, meta: Up, ctrl: Up, alt: Down} => - switch (sys, key) { - | (_, "ArrowLeft") => now(MoveToBackpackTarget(Left(ByToken))) - | (_, "ArrowRight") => now(MoveToBackpackTarget(Right(ByToken))) - | (_, "Alt") => Some(SetMeta(ShowBackpackTargets(true))) - | (_, "ArrowUp") => now(MoveToBackpackTarget(Up)) - | (_, "ArrowDown") => now(MoveToBackpackTarget(Down)) + | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => + switch (key) { + | "ƒ" => Some(PerformAction(Project(AddOrRemoveIndicated(Fold())))) + | "†" => + Some( + PerformAction( + Project(AddOrRemoveIndicated(Infer({expected_ty: None}))), + ), + ) + | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) + | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) + | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) + | "ArrowUp" => now(MoveToBackpackTarget(Up)) + | "ArrowDown" => now(MoveToBackpackTarget(Down)) | _ => None } | _ => None diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index 35a6608285..cab1d80724 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -2,15 +2,15 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; +let remove = id => Update.PerformAction(Project(Remove(id))); + let base = (clss, id, ~font_metrics, ~inject, ~measurement) => div( ~attr= Attr.many([ Attr.classes(["projector", "fold"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_pointerdown(_ => - inject(Update.PerformAction(Project(Toggle(id)))) - ), + Attr.on_double_click(_ => inject(remove(id))), DecUtil.abs_style(measurement, ~font_metrics), ]), [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], @@ -26,8 +26,7 @@ let mk = (data: Projector.fold): ProjectorViewModule.t => let indicated = base(["indicated"]); let key_handler = (id, key: Key.t): option(UpdateAction.t) => switch (key) { - | {key: D("Escape"), _} => - Some(PerformAction(Project(Toggle(id)))) + | {key: D("Escape"), _} => Some(remove(id)) | _ => None }; let ci_string = () => "F"; diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 7f9cb13861..0cc31b87f7 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -2,6 +2,8 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; +let remove = id => Update.PerformAction(Project(Remove(id))); + let base = ( clss, @@ -16,9 +18,7 @@ let base = Attr.many([ Attr.classes(["projector", "infer"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_pointerdown(_ => - Effect.Many([inject(Update.PerformAction(Project(Toggle(id))))]) - ), + Attr.on_double_click(_ => inject(remove(id))), DecUtil.abs_style(measurement, ~font_metrics), ]), [ @@ -35,10 +35,9 @@ let mk = (data: Projector.infer): ProjectorViewModule.t => let data = data; let normal = base([], data.expected_ty); let indicated = base(["indicated"], data.expected_ty); - let key_handler = (id, key: Key.t): option(UpdateAction.t) => + let key_handler = (id, key: Key.t) => switch (key) { - | {key: D("Escape"), _} => - Some(PerformAction(Project(Toggle(id)))) + | {key: D("Escape"), _} => Some(remove(id)) | _ => None }; let ci_string: unit => string = _ => "I"; From 083b50434e88bbc7942dac7f2abf82a13db1bd34 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 24 May 2024 23:12:11 -0400 Subject: [PATCH 052/168] projectors cleanup --- src/haz3lcore/zipper/action/Action.re | 2 +- src/haz3lcore/zipper/action/Perform.re | 2 +- src/haz3lcore/zipper/action/ProjectorPerform.re | 6 +++--- src/haz3lweb/Keyboard.re | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index f32f24f323..8913e582dd 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,7 +45,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | AddOrRemoveIndicated(Projector.t) + | ToggleIndicated(Projector.t) | Remove(Id.t); //| UpdateModel(Id.t, projector_type(X)_action) //| UpdateSyntax(Id.t, Piece.t => Piece.t) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index ae846c167c..86155f39e2 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -47,7 +47,7 @@ let go_z = }; switch (a) { - | Project(a) => ProjectorPerform.go(a, statics, z) + | Project(a) => ProjectorPerform.go(a, statics.info_map, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 67110d4f46..4437316593 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -27,15 +27,15 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; -let go = (a: Action.project, statics: CachedStatics.statics, z: ZipperBase.t) => +let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? //TODO(andrew): method to remotely get projected piece switch (a) { - | AddOrRemoveIndicated(p) => + | ToggleIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) | Some((piece, d, rel)) => - add_or_remove(Piece.id(piece), z, statics.info_map, p, piece, d, rel) + add_or_remove(Piece.id(piece), z, info_map, p, piece, d, rel) } | Remove(id) => switch (Map.mem(id, z.projectors)) { diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 1e405b58db..6fd5e2f427 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -109,11 +109,11 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => switch (key) { - | "ƒ" => Some(PerformAction(Project(AddOrRemoveIndicated(Fold())))) + | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold())))) | "†" => Some( PerformAction( - Project(AddOrRemoveIndicated(Infer({expected_ty: None}))), + Project(ToggleIndicated(Infer({expected_ty: None}))), ), ) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) From 7a0c3069d2c58aad2ea3e6f8a23e66e5ffbd1519 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 10 Jun 2024 13:31:09 -0400 Subject: [PATCH 053/168] projectors cleanup --- src/haz3lcore/zipper/ZipperBase.re | 6 ++-- .../zipper/projectors/FoldProjectorCore.re | 10 ++++--- .../zipper/projectors/InferProjectorCore.re | 29 +++++++++++-------- src/haz3lweb/view/ProjectorViewModule.re | 9 +++--- src/haz3lweb/view/ProjectorsView.re | 22 +++++++------- .../view/projectors/FoldProjectorView.re | 23 ++++++++------- .../view/projectors/InferProjectorView.re | 25 +++++++++------- 7 files changed, 69 insertions(+), 55 deletions(-) diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 58d5085fe7..47d9e3dd1f 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -30,12 +30,14 @@ type projector_info = {info: option(Info.t)}; module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] - type t; + type model; + type action; let projector: projector; - let data: t; + let model: model; let placeholder_length: unit => int; let can_project: Piece.t => bool; let update: projector_info => projector; + let act: action => projector; }; type projector_core = (module ProjectorCore); diff --git a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re index 55eef5a922..182aaaec8e 100644 --- a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re @@ -1,14 +1,16 @@ open Sexplib.Std; open ZipperBase; -let mk = (data): projector_core => +let mk = (model): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type t = unit; - let data = data; - let projector = Fold(data); + type model = unit; + type action = unit; + let model = model; + let projector = Fold(model); let can_project = Piece.is_convex; let placeholder_length = () => 2; let update = _: projector => Fold(); + let act = _ => Fold(); }); diff --git a/src/haz3lcore/zipper/projectors/InferProjectorCore.re b/src/haz3lcore/zipper/projectors/InferProjectorCore.re index 04eaeebcb3..b8985afc21 100644 --- a/src/haz3lcore/zipper/projectors/InferProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/InferProjectorCore.re @@ -6,13 +6,20 @@ let display_ty = (expected_ty: option(Typ.t)): Typ.t => | None => Unknown(Internal) }; -let mk = (data: infer): projector_core => +let expected_ty = (info: option(Info.t)) => + switch (info) { + | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) + | _ => Unknown(Internal) + }; + +let mk = (model: infer): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type t = infer; - let data = data; - let projector = Infer(data); + type model = infer; + type action = unit; + let model = model; + let projector = Infer(model); let can_project = (p: Piece.t): bool => Piece.is_convex(p) @@ -24,16 +31,14 @@ let mk = (data: infer): projector_core => ); let placeholder_length = _ => - display_ty(data.expected_ty) |> Typ.pretty_print |> String.length; + display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; let update = ({info, _}): projector => { print_endline("updating infer projector"); - let expected_ty = - switch (info) { - | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => - Mode.ty_of(mode) - | _ => Typ.Float - }; - Infer({expected_ty: Some(expected_ty)}); + Infer({expected_ty: Some(expected_ty(info))}); }; + let act = (action: action): projector => + switch (action) { + | () => Infer({expected_ty: None}) + }; }); diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 61b048a649..365296cd76 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -3,12 +3,12 @@ open Virtual_dom.Vdom; module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] - type t; - let data: t; + type model; + let model: model; + let id: Id.t; let normal: ( - Id.t, ~font_metrics: FontMetrics.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~measurement: Measured.measurement @@ -17,14 +17,13 @@ module type ProjectorView = { let indicated: ( - Id.t, ~font_metrics: FontMetrics.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~measurement: Measured.measurement ) => Node.t; - let key_handler: (Id.t, Key.t) => option(UpdateAction.t); + let key_handler: Key.t => option(UpdateAction.t); let ci_string: unit => string; }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 5b3e3aa7e9..29075fd732 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,18 +4,18 @@ open Node; open Projector; open Util.OptUtil.Syntax; -let to_module = (p: Projector.t): ProjectorViewModule.t => +let to_module = (id, p: Projector.t): ProjectorViewModule.t => switch (p) { - | Fold(data) => FoldProjectorView.mk(data) - | Infer(data) => InferProjectorView.mk(data) + | Fold(model) => FoldProjectorView.mk(id, model) + | Infer(model) => InferProjectorView.mk(id, model) }; let view = (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(p); - PV.normal(id, ~inject, ~font_metrics, ~measurement); + let (module PV) = to_module(id, p); + PV.normal(~inject, ~font_metrics, ~measurement); }; let indication_view = @@ -23,8 +23,8 @@ let indication_view = : option(Node.t) => { let* p = Projector.Map.find(id, ps); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(p); - PV.indicated(id, ~inject, ~font_metrics, ~measurement); + let (module PV) = to_module(id, p); + PV.indicated(~inject, ~font_metrics, ~measurement); }; let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => @@ -45,12 +45,12 @@ let key_handler = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => - let (module PV) = to_module(p); - PV.key_handler(id, key); + let (module PV) = to_module(id, p); + PV.key_handler(key); }; let ci = (~inject as _, editor: Editor.t) => { - let+ (_, p) = indicated_proj_ed(editor); - let (module PV) = to_module(p); + let+ (id, p) = indicated_proj_ed(editor); + let (module PV) = to_module(id, p); div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); }; diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index cab1d80724..cb3f7fd83c 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -16,18 +16,21 @@ let base = (clss, id, ~font_metrics, ~inject, ~measurement) => [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], ); -let mk = (data: Projector.fold): ProjectorViewModule.t => +let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => Some(remove(id)) + | _ => None + }; + +let mk = (id: Id.t, model: Projector.fold): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type t = Projector.fold; - let data = data; - let normal = base([]); - let indicated = base(["indicated"]); - let key_handler = (id, key: Key.t): option(UpdateAction.t) => - switch (key) { - | {key: D("Escape"), _} => Some(remove(id)) - | _ => None - }; + type model = Projector.fold; + let model = model; + let id = id; + let normal = base([], id); + let indicated = base(["indicated"], id); + let key_handler = key_handler(id); let ci_string = () => "F"; }); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 0cc31b87f7..7221f79bab 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -7,8 +7,8 @@ let remove = id => Update.PerformAction(Project(Remove(id))); let base = ( clss, - expected_ty: option(Typ.t), id: Id.t, + expected_ty: option(Typ.t), ~font_metrics, ~inject, ~measurement: Measured.measurement, @@ -27,18 +27,21 @@ let base = ], ); -let mk = (data: Projector.infer): ProjectorViewModule.t => +let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => Some(remove(id)) + | _ => None + }; + +let mk = (id: Id.t, model: Projector.infer): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type t = Projector.infer; - let data = data; - let normal = base([], data.expected_ty); - let indicated = base(["indicated"], data.expected_ty); - let key_handler = (id, key: Key.t) => - switch (key) { - | {key: D("Escape"), _} => Some(remove(id)) - | _ => None - }; + type model = Projector.infer; + let model = model; + let id = id; + let normal = base([], id, model.expected_ty); + let indicated = base(["indicated"], id, model.expected_ty); + let key_handler = key_handler(id); let ci_string: unit => string = _ => "I"; }); From 14bdd61c440099d152b067f5c9f3eba63e7720ac Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 10 Jun 2024 21:10:17 -0400 Subject: [PATCH 054/168] projectors can update syntax. checkbox projector --- src/haz3lcore/tiles/Piece.re | 7 + src/haz3lcore/zipper/Editor.re | 21 +- src/haz3lcore/zipper/Projector.re | 182 +++++++++++++----- src/haz3lcore/zipper/ZipperBase.re | 14 +- src/haz3lcore/zipper/action/Action.re | 2 +- .../zipper/action/ProjectorPerform.re | 1 + .../projectors/CheckboxProjectorCore.re | 23 +++ .../zipper/projectors/FoldProjectorCore.re | 2 +- .../zipper/projectors/InferProjectorCore.re | 2 +- src/haz3lweb/Keyboard.re | 1 + src/haz3lweb/Update.re | 2 +- src/haz3lweb/view/Cell.re | 12 +- src/haz3lweb/view/Deco.re | 3 + src/haz3lweb/view/ExplainThis.re | 1 + src/haz3lweb/view/ProjectorViewModule.re | 1 + src/haz3lweb/view/ProjectorsView.re | 45 +++-- .../view/projectors/CheckboxProjectorView.re | 72 +++++++ .../view/projectors/FoldProjectorView.re | 4 +- .../view/projectors/InferProjectorView.re | 4 +- src/haz3lweb/www/style.css | 13 ++ 20 files changed, 337 insertions(+), 75 deletions(-) create mode 100644 src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re create mode 100644 src/haz3lweb/view/projectors/CheckboxProjectorView.re diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index eb2b91e6d3..f7b6aea5e2 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -151,3 +151,10 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) }; + +let replace_id = (id: Id.t, p: t): t => + switch (p) { + | Tile(t) => Tile({...t, id}) + | Grout(g) => Grout({...g, id}) + | Secondary(w) => Secondary({...w, id}) + }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 2e10daccf7..db322924e5 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -13,6 +13,7 @@ module Meta = { tiles: TileMap.t, holes: list(Grout.t), buffer_ids: list(Id.t), + syntax_map: Id.Map.t(Piece.t), }; type t = { @@ -21,11 +22,11 @@ module Meta = { projected, }; - let init_projected = (z_projected: Zipper.t): projected => { - let segment = Zipper.unselect_and_zip(z_projected); + let init_projected = (z_projected: Projector.proj_ret): projected => { + let segment = Zipper.unselect_and_zip(z_projected.z); let (term, terms) = MakeTerm.go(segment); { - z: z_projected, + z: z_projected.z, segment, term, terms, @@ -33,7 +34,8 @@ module Meta = { tiles: TileMap.mk(segment), holes: Segment.holes(segment), measured: Measured.of_segment(segment), - buffer_ids: Selection.buffer_ids(z_projected.selection), + buffer_ids: Selection.buffer_ids(z_projected.z.selection), + syntax_map: z_projected.syntax_map, }; }; @@ -41,7 +43,7 @@ module Meta = { { col_target: 0, touched: Touched.empty, - projected: z |> Projector.Project.go |> init_projected, + projected: Projector.Project.go(z) |> init_projected, }; }; @@ -66,12 +68,12 @@ module Meta = { let yojson_of_t = _ => failwith("Editor.Meta.yojson_of_t"); let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); - let next_projected = (z, ~touched, ~old) => { - let segment = Zipper.unselect_and_zip(z); + let next_projected = (z_projected: Projector.proj_ret, ~touched, ~old) => { + let segment = Zipper.unselect_and_zip(z_projected.z); let (term, terms) = MakeTerm.go(segment); let measured = Measured.of_segment(~touched, ~old, segment); { - z, + z: z_projected.z, segment, term, terms, @@ -79,7 +81,8 @@ module Meta = { term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), - buffer_ids: Selection.buffer_ids(z.selection), + buffer_ids: Selection.buffer_ids(z_projected.z.selection), + syntax_map: z_projected.syntax_map, }; }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ba47779503..1f29b02bdd 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -13,10 +13,14 @@ type fold = ZipperBase.fold; [@deriving (show({with_path: false}), sexp, yojson)] type infer = ZipperBase.infer; +[@deriving (show({with_path: false}), sexp, yojson)] +type checkbox = ZipperBase.checkbox; + let to_module = (p: projector): projector_core => switch ((p: projector)) { - | Fold(data) => FoldProjectorCore.mk(data) - | Infer(data) => InferProjectorCore.mk(data) + | Fold(model) => FoldProjectorCore.mk(model) + | Infer(model) => InferProjectorCore.mk(model) + | Checkbox(model) => CheckboxProjectorCore.mk(model) }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -37,7 +41,7 @@ let create = (p: t, piece: Piece.t, id: Id.t, info_map: Statics.Map.t): option(t) => { let (module P) = to_module(p); P.can_project(piece) - ? Some(P.update({info: Id.Map.find_opt(id, info_map)})) : None; + ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; }; let piece_is = (ps: Map.t, piece: option(Piece.t)): option(Id.t) => @@ -124,70 +128,158 @@ module Move = { }; }; -module Project = { - let placehold = (ps: Map.t, p: Piece.t) => - switch (Map.find(Piece.id(p), ps)) { - | None => p - | Some(pr) => placeholder(pr, Piece.id(p)) - }; +module MapPiece = { + type updater = Piece.t => Piece.t; - let rec of_segment = (projectors, seg: Segment.t): Segment.t => { - seg - |> List.map(placehold(projectors)) - |> List.map(of_piece(projectors)); + let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { + seg |> List.map(f) |> List.map(of_piece(f)); } - and of_piece = (projectors, p: Piece.t): Piece.t => { - switch (p) { - | Tile(t) => Tile(of_tile(projectors, t)) - | Grout(_) => p - | Secondary(_) => p + and of_piece = (f: updater, piece: Piece.t): Piece.t => { + switch (piece) { + | Tile(t) => Tile(of_tile(f, t)) + | Grout(_) + | Secondary(_) => piece }; } - and of_tile = (projectors, t: Tile.t): Tile.t => { - {...t, children: List.map(of_segment(projectors), t.children)}; + and of_tile = (f: updater, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(f), t.children)}; }; - let of_siblings = (projectors: Map.t, siblings: Siblings.t): Siblings.t => { - let l_sibs = of_segment(projectors, fst(siblings)); - let r_sibs = of_segment(projectors, snd(siblings)); - (l_sibs, r_sibs); - }; + let of_siblings = (f: updater, sibs: Siblings.t): Siblings.t => ( + of_segment(f, fst(sibs)), + of_segment(f, snd(sibs)), + ); - let of_ancestor = (projectors: Map.t, ancestor: Ancestor.t): Ancestor.t => { + let of_ancestor = (f: updater, ancestor: Ancestor.t): Ancestor.t => { { ...ancestor, children: ( - List.map(of_segment(projectors), fst(ancestor.children)), - List.map(of_segment(projectors), snd(ancestor.children)), + List.map(of_segment(f), fst(ancestor.children)), + List.map(of_segment(f), snd(ancestor.children)), ), }; }; let of_generation = - (projectors: Map.t, generation: Ancestors.generation) - : Ancestors.generation => ( - of_ancestor(projectors, fst(generation)), - of_siblings(projectors, snd(generation)), + (f: updater, generation: Ancestors.generation): Ancestors.generation => ( + of_ancestor(f, fst(generation)), + of_siblings(f, snd(generation)), ); - let of_ancestors = (projectors: Map.t, ancestors: Ancestors.t): Ancestors.t => - List.map(of_generation(projectors), ancestors); + let of_ancestors = (f: updater, ancestors: Ancestors.t): Ancestors.t => + List.map(of_generation(f), ancestors); + + let of_selection = (f: updater, selection: Selection.t): Selection.t => { + {...selection, content: of_segment(f, selection.content)}; + }; - let of_selection = (projectors: Map.t, selection: Selection.t): Selection.t => { - {...selection, content: of_segment(projectors, selection.content)}; + let go = (f: updater, z: ZipperBase.t): ZipperBase.t => { + ...z, + selection: of_selection(f, z.selection), + relatives: { + ancestors: of_ancestors(f, z.relatives.ancestors), + siblings: of_siblings(f, z.relatives.siblings), + }, }; +}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type proj_ret = { + z: ZipperBase.t, + syntax_map: Id.Map.t(Piece.t), +}; + +module Project = { + let syntax_map: ref(Id.Map.t(Piece.t)) = ref(Id.Map.empty); + + let placehold = (projectors: Map.t, piece: Piece.t) => + switch (Map.find(Piece.id(piece), projectors)) { + | None => piece + | Some(pr) => + syntax_map := Id.Map.add(Piece.id(piece), piece, syntax_map^); + placeholder(pr, Piece.id(piece)); + }; - let go = (z: ZipperBase.t): ZipperBase.t => + let go = (z: ZipperBase.t): proj_ret => { + syntax_map := Id.Map.empty; if (Id.Map.is_empty(z.projectors)) { - z; + {z, syntax_map: syntax_map^}; } else { - { - ...z, - selection: of_selection(z.projectors, z.selection), - relatives: { - ancestors: of_ancestors(z.projectors, z.relatives.ancestors), - siblings: of_siblings(z.projectors, z.relatives.siblings), - }, + let z = MapPiece.go(placehold(z.projectors), z); + // print_endline( + // "map card:" ++ string_of_int(Id.Map.cardinal(syntax_map^)), + // ); + {z, syntax_map: syntax_map^}; + }; + }; +}; + +module UpdateSyntax = { + let update_piece = (f, id: Id.t, piece: Piece.t) => + id == Piece.id(piece) ? f(piece) : piece; + + let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { + switch (z.relatives.siblings |> get) { + | Some(l) => Piece.id(l) == id + | _ => false + }; + }; + + let left_sib_has_id = sib_has_id(Siblings.left_neighbor); + let right_sib_has_id = sib_has_id(Siblings.right_neighbor); + + let update_left_sib = (f: Piece.t => Piece.t, z: ZipperBase.t) => { + let (l, r) = z.relatives.siblings; + let sibs = (List.map(f, l), List.map(f, r)); + z |> put_siblings(sibs); + }; + + let update_right_sib = (f: Piece.t => Piece.t, z: ZipperBase.t) => { + let sibs = + switch (z.relatives.siblings) { + | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) + | sibs => sibs }; + z |> put_siblings(sibs); + }; + + let go = (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + /* This applies the function to the piece in the zipper having id id, and + * then replaces the id of the resulting piece with the idea of the old + * piece, ensuring that the root id remains stable. This function assumes + * the cursor is not inside the piece to be updated. This is optimized to + * be O(1) when the piece is directly to the left or right of the cursor, + * otherwise it is O(|zipper|) */ + let f = piece => + update_piece(p => p |> f |> Piece.replace_id(Piece.id(p)), id, piece); + if (left_sib_has_id(z, id)) { + update_left_sib(f, z); + } else if (right_sib_has_id(z, id)) { + update_right_sib(f, z); + } else { + MapPiece.go(f, z); }; + }; }; +//TODO(andrew): rm if unused +// exception PieceFound(Piece.t); +// let get = (id: Id.t, z: ZipperBase.t): option(Piece.t) => { +// /* Gets the piece under the projector with id id. This is optimized to +// * be O(1) when the piece is directly to the left or right of the cursor, +// * otherwise it is O(|zipper|) */ +// let f = piece => { +// if (Piece.id(piece) == id) { +// raise(PieceFound(piece)); +// }; +// piece; +// }; +// try( +// { +// go(f, id, z) |> ignore; +// None; +// } +// ) { +// | PieceFound(piece) => Some(piece) +// }; +// }; +// }; diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 47d9e3dd1f..670ccb84b1 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -8,10 +8,14 @@ type infer = {expected_ty: option(Typ.t)}; [@deriving (show({with_path: false}), sexp, yojson)] type fold = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type checkbox = unit; + [@deriving (show({with_path: false}), sexp, yojson)] type projector = | Fold(fold) - | Infer(infer); + | Infer(infer) + | Checkbox(checkbox); [@deriving (show({with_path: false}), sexp, yojson)] module ProjectorMap = { @@ -28,6 +32,12 @@ module ProjectorMap = { [@deriving (show({with_path: false}), sexp, yojson)] type projector_info = {info: option(Info.t)}; +//TODO(andrew): use or lose +// [@deriving (show({with_path: false}), sexp, yojson)] +// type projector_action('action) = +// | UpdateSyntax(Piece.t => Piece.t) +// | Internal('action); + module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] type model; @@ -36,7 +46,7 @@ module type ProjectorCore = { let model: model; let placeholder_length: unit => int; let can_project: Piece.t => bool; - let update: projector_info => projector; + let auto_update: projector_info => projector; let act: action => projector; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 8913e582dd..668e3ece17 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -45,10 +45,10 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = + | UpdateSyntax(Id.t, Piece.t => Piece.t) | ToggleIndicated(Projector.t) | Remove(Id.t); //| UpdateModel(Id.t, projector_type(X)_action) -//| UpdateSyntax(Id.t, Piece.t => Piece.t) [@deriving (show({with_path: false}), sexp, yojson)] type t = diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 4437316593..59df20e02a 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -42,4 +42,5 @@ let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => | false => Error(Action.Failure.Cant_project) | true => Ok(set(id, None, z)) } + | UpdateSyntax(id, f) => Ok(Projector.UpdateSyntax.go(f, id, z)) }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re b/src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re new file mode 100644 index 0000000000..79329a44f0 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re @@ -0,0 +1,23 @@ +open Sexplib.Std; +open ZipperBase; + +let state_of = (piece: Piece.t): option(bool) => + switch (piece) { + | Tile({label: ["true"], _}) => Some(true) + | Tile({label: ["false"], _}) => Some(false) + | _ => None + }; + +let mk = (model): projector_core => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = unit; + type action = unit; + let model = model; + let projector = Checkbox(model); + let can_project = p => Piece.is_convex(p) && state_of(p) != None; + let placeholder_length = () => 2; + let auto_update = _: projector => Checkbox(); + let act = _ => Checkbox(); + }); diff --git a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re index 182aaaec8e..26ead311e5 100644 --- a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/FoldProjectorCore.re @@ -11,6 +11,6 @@ let mk = (model): projector_core => let projector = Fold(model); let can_project = Piece.is_convex; let placeholder_length = () => 2; - let update = _: projector => Fold(); + let auto_update = _: projector => Fold(); let act = _ => Fold(); }); diff --git a/src/haz3lcore/zipper/projectors/InferProjectorCore.re b/src/haz3lcore/zipper/projectors/InferProjectorCore.re index b8985afc21..a7a10162c4 100644 --- a/src/haz3lcore/zipper/projectors/InferProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/InferProjectorCore.re @@ -33,7 +33,7 @@ let mk = (model: infer): projector_core => let placeholder_length = _ => display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; - let update = ({info, _}): projector => { + let auto_update = ({info, _}): projector => { print_endline("updating infer projector"); Infer({expected_ty: Some(expected_ty(info))}); }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 6fd5e2f427..b577a602e2 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -116,6 +116,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { Project(ToggleIndicated(Infer({expected_ty: None}))), ), ) + | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox())))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 61966b0b1b..2a0c83d09e 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -221,7 +221,7 @@ let update_projectors = (model: Model.t): Model.t => { (id, p) => { let (module P) = Projector.to_module(p); let info = Id.Map.find_opt(id, statics.info_map); - P.update({info: info}); + P.auto_update({info: info}); }, ); {...model, editors}; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 62c1f68801..206e2e4b22 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -123,7 +123,16 @@ let deco = { state: { meta: { - projected: {z, term_ranges, segment, measured, terms, tiles, _}, + projected: { + z, + term_ranges, + segment, + measured, + terms, + tiles, + syntax_map, + _, + }, _, }, _, @@ -140,6 +149,7 @@ let deco = let font_metrics = font_metrics; let show_backpack_targets = show_backpack_targets; let error_ids = error_ids; + let syntax_map = syntax_map; }); let decos = selected ? Deco.all(~inject, z, segment) : Deco.always(~inject, z); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 183e11f93a..6253ac4192 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -12,6 +12,7 @@ module Deco = let term_ranges: TermRanges.t; let error_ids: list(Id.t); let tiles: TileMap.t; + let syntax_map: Id.Map.t(Piece.t); }, ) => { let font_metrics = M.font_metrics; @@ -308,6 +309,7 @@ module Deco = ~inject, id, z.projectors, + M.syntax_map, M.map, ~font_metrics, ) @@ -332,6 +334,7 @@ module Deco = err_holes(), ProjectorsView.view_all( zipper.projectors, + M.syntax_map, ~inject, ~font_metrics, M.map, diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index b065effb7d..10cdaacadf 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -223,6 +223,7 @@ let expander_deco = let term_ranges = TermRanges.mk(doc.syntactic_form); let tiles = TileMap.mk(doc.syntactic_form); let error_ids = []; + let syntax_map = Id.Map.empty; }); switch (doc.expandable_id, List.length(options)) { | (None, _) diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 365296cd76..9286d60684 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -6,6 +6,7 @@ module type ProjectorView = { type model; let model: model; let id: Id.t; + let syntax: Piece.t; let normal: ( diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 29075fd732..4af4f63c13 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,32 +4,51 @@ open Node; open Projector; open Util.OptUtil.Syntax; -let to_module = (id, p: Projector.t): ProjectorViewModule.t => +let to_module = (id, syntax: Piece.t, p: Projector.t): ProjectorViewModule.t => switch (p) { - | Fold(model) => FoldProjectorView.mk(id, model) - | Infer(model) => InferProjectorView.mk(id, model) + | Fold(model) => FoldProjectorView.mk(id, syntax, model) + | Infer(model) => InferProjectorView.mk(id, syntax, model) + | Checkbox(model) => CheckboxProjectorView.mk(id, syntax, model) }; let view = - (id: Id.t, ps: Map.t, ~measured: Measured.t, ~inject, ~font_metrics) => { + ( + id: Id.t, + ps: Map.t, + syntax_map, + ~measured: Measured.t, + ~inject, + ~font_metrics, + ) => { let* p = Projector.Map.find(id, ps); + let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, p); + let (module PV) = to_module(id, syntax, p); PV.normal(~inject, ~font_metrics, ~measurement); }; let indication_view = - (id: Id.t, ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) + ( + id: Id.t, + ps: Map.t, + syntax_map, + measured: Measured.t, + ~inject, + ~font_metrics, + ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); + let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, p); + let (module PV) = to_module(id, syntax, p); PV.indicated(~inject, ~font_metrics, ~measurement); }; -let view_all = (ps: Map.t, measured: Measured.t, ~inject, ~font_metrics) => +let view_all = + (ps: Map.t, syntax_map, measured: Measured.t, ~inject, ~font_metrics) => List.filter_map( - ((id, _)) => view(id, ps, ~measured, ~inject, ~font_metrics), + ((id, _)) => + view(id, ps, syntax_map, ~measured, ~inject, ~font_metrics), Id.Map.bindings(ps), ); @@ -45,12 +64,14 @@ let key_handler = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => - let (module PV) = to_module(id, p); + let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); + let (module PV) = to_module(id, syntax, p); PV.key_handler(key); }; let ci = (~inject as _, editor: Editor.t) => { - let+ (id, p) = indicated_proj_ed(editor); - let (module PV) = to_module(id, p); + let* (id, p) = indicated_proj_ed(editor); + let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); + let (module PV) = to_module(id, syntax, p); div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); }; diff --git a/src/haz3lweb/view/projectors/CheckboxProjectorView.re b/src/haz3lweb/view/projectors/CheckboxProjectorView.re new file mode 100644 index 0000000000..73d604daae --- /dev/null +++ b/src/haz3lweb/view/projectors/CheckboxProjectorView.re @@ -0,0 +1,72 @@ +open Haz3lcore; +open Virtual_dom.Vdom; +open Node; + +let remove = id => Update.PerformAction(Project(Remove(id))); + +let put = (bool: bool) => + Example.mk_monotile(Form.mk_atomic(Exp, string_of_bool(bool))); + +let get = piece => + switch (CheckboxProjectorCore.state_of(piece)) { + | None => failwith("toggle: not a checkbox") + | Some(s) => s + }; + +let toggle = (piece: Piece.t) => { + let cur = + switch (CheckboxProjectorCore.state_of(piece)) { + | None => failwith("toggle: not a checkbox") + | Some(s) => s + }; + put(!cur); +}; + +let toggle = id => + UpdateAction.PerformAction(Project(UpdateSyntax(id, toggle))); + +let base = (clss, syntax, id, ~font_metrics, ~inject, ~measurement) => + div( + ~attr= + Attr.many([ + Attr.classes(["projector", "checkbox"] @ clss), + JsUtil.stop_mousedown_propagation, + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [ + Node.input( + ~attr= + Attr.many( + [ + Attr.create("type", "checkbox"), + Attr.on_input((_evt, _str) => {inject(toggle(id))}), + JsUtil.stop_mousedown_propagation, + ] + @ (get(syntax) ? [Attr.checked] : []), + ), + [], + ), + PieceDec.convex_shard(~font_metrics, ~measurement), + ], + ); + +let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => + switch (key) { + | {key: D("Escape"), _} => Some(remove(id)) + | _ => None + }; + +let mk = + (id: Id.t, syntax: Piece.t, model: Projector.fold): ProjectorViewModule.t => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = Projector.checkbox; + let model = model; + let id = id; + let syntax = syntax; + let normal = base([], syntax, id); + let indicated = base(["indicated"], syntax, id); + let key_handler = key_handler(id); + let ci_string = () => "F"; + }); diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index cb3f7fd83c..163522d389 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -22,13 +22,15 @@ let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => | _ => None }; -let mk = (id: Id.t, model: Projector.fold): ProjectorViewModule.t => +let mk = + (id: Id.t, syntax: Piece.t, model: Projector.fold): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.fold; let model = model; let id = id; + let syntax = syntax; let normal = base([], id); let indicated = base(["indicated"], id); let key_handler = key_handler(id); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 7221f79bab..096c9650e6 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -33,13 +33,15 @@ let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => | _ => None }; -let mk = (id: Id.t, model: Projector.infer): ProjectorViewModule.t => +let mk = + (id: Id.t, syntax: Piece.t, model: Projector.infer): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.infer; let model = model; let id = id; + let syntax = syntax; let normal = base([], id, model.expected_ty); let indicated = base(["indicated"], id, model.expected_ty); let key_handler = key_handler(id); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index a24504fca4..5cee75b130 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -706,6 +706,16 @@ select { z-index: -1; } +.projector.checkbox { + display: flex; + justify-content: center; + color: #c7b480; +} +.projector.checkbox svg { + fill: #f0e7d6; + z-index: -1; +} + .projector.indicated { z-index: 13; display: flex; @@ -725,6 +735,9 @@ select { .projector.indicated.infer svg { fill: var(--typ-bg-off-color); } +.projector.indicated.checkbox svg { + fill: var(--exp-bg-off-color); +} .code { /*white-space: nowrap;*/ From dc487d90e209a63113f27c984db3a7777a268870 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 13:34:25 -0400 Subject: [PATCH 055/168] internalized action injection for projectors --- src/haz3lcore/zipper/Projector.re | 8 ++- src/haz3lcore/zipper/ZipperBase.re | 7 +- src/haz3lweb/view/Page.re | 2 +- src/haz3lweb/view/ProjectorViewModule.re | 18 ++---- src/haz3lweb/view/ProjectorsView.re | 64 ++++++++++++++----- .../view/projectors/CheckboxProjectorView.re | 26 ++++---- .../view/projectors/FoldProjectorView.re | 21 +++--- .../view/projectors/InferProjectorView.re | 20 +++--- 8 files changed, 94 insertions(+), 72 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 1f29b02bdd..957487a782 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -26,6 +26,12 @@ let to_module = (p: projector): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type t = projector; +[@deriving (show({with_path: false}), sexp, yojson)] +type action('action) = + | Remove + | UpdateSyntax(Piece.t => Piece.t) + | Internal('action); + let placeholder = (p: t, id: Id.t): Piece.t => { let (module P) = to_module(p); Piece.Tile({ @@ -282,4 +288,4 @@ module UpdateSyntax = { // | PieceFound(piece) => Some(piece) // }; // }; -// }; +// diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 670ccb84b1..acfbc0175d 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -29,15 +29,10 @@ module ProjectorMap = { let update = update; }; +/* Externally calculated info to be fed to projectors */ [@deriving (show({with_path: false}), sexp, yojson)] type projector_info = {info: option(Info.t)}; -//TODO(andrew): use or lose -// [@deriving (show({with_path: false}), sexp, yojson)] -// type projector_action('action) = -// | UpdateSyntax(Piece.t => Piece.t) -// | Internal('action); - module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] type model; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 8d8272c9b4..de04f97727 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -12,7 +12,7 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => open Effect; let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.key_handler(editor, key)) { + switch (ProjectorsView.key_handler(editor, ~inject, key)) { | Some(action) => Many([Prevent_default, Stop_propagation, inject(action)]) | None => diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 9286d60684..39579e33e7 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -4,27 +4,21 @@ open Virtual_dom.Vdom; module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] type model; + type action; + let model: model; - let id: Id.t; let syntax: Piece.t; + let inject: Projector.action(action) => Ui_effect.t(unit); let normal: - ( - ~font_metrics: FontMetrics.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ~measurement: Measured.measurement - ) => + (~font_metrics: FontMetrics.t, ~measurement: Measured.measurement) => Node.t; let indicated: - ( - ~font_metrics: FontMetrics.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ~measurement: Measured.measurement - ) => + (~font_metrics: FontMetrics.t, ~measurement: Measured.measurement) => Node.t; - let key_handler: Key.t => option(UpdateAction.t); + let key_handler: Key.t => option(Projector.action(action)); let ci_string: unit => string; }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 4af4f63c13..225087cd8e 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,12 +4,31 @@ open Node; open Projector; open Util.OptUtil.Syntax; -let to_module = (id, syntax: Piece.t, p: Projector.t): ProjectorViewModule.t => +let proj_inject = (id, action: Projector.action('action)): UpdateAction.t => { + switch (action) { + | Remove => PerformAction(Project(Remove(id))) + | UpdateSyntax(f) => PerformAction(Project(UpdateSyntax(id, f))) + | Internal(_) => + //TODO(andrew) + PerformAction(Project(Remove(id))) + }; +}; + +let to_module = + ( + id, + syntax: Piece.t, + p: Projector.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ) + : ProjectorViewModule.t => { + let inject = pa => inject(proj_inject(id, pa)); switch (p) { - | Fold(model) => FoldProjectorView.mk(id, syntax, model) - | Infer(model) => InferProjectorView.mk(id, syntax, model) - | Checkbox(model) => CheckboxProjectorView.mk(id, syntax, model) + | Fold(model) => FoldProjectorView.mk(syntax, model, ~inject) + | Infer(model) => InferProjectorView.mk(syntax, model, ~inject) + | Checkbox(model) => CheckboxProjectorView.mk(syntax, model, ~inject) }; +}; let view = ( @@ -17,14 +36,14 @@ let view = ps: Map.t, syntax_map, ~measured: Measured.t, - ~inject, + ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, ) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, syntax, p); - PV.normal(~inject, ~font_metrics, ~measurement); + let (module PV) = to_module(id, syntax, p, ~inject); + PV.normal(~font_metrics, ~measurement); }; let indication_view = @@ -33,19 +52,25 @@ let indication_view = ps: Map.t, syntax_map, measured: Measured.t, - ~inject, + ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, syntax, p); - PV.indicated(~inject, ~font_metrics, ~measurement); + let (module PV) = to_module(id, syntax, p, ~inject); + PV.indicated(~font_metrics, ~measurement); }; let view_all = - (ps: Map.t, syntax_map, measured: Measured.t, ~inject, ~font_metrics) => + ( + ps: Map.t, + syntax_map, + measured: Measured.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ~font_metrics, + ) => List.filter_map( ((id, _)) => view(id, ps, syntax_map, ~measured, ~inject, ~font_metrics), @@ -60,18 +85,25 @@ let indicated_proj_ed = (editor: Editor.t) => { (id, projector); }; -let key_handler = (editor: Editor.t, key: Key.t): option(UpdateAction.t) => +let key_handler = + ( + editor: Editor.t, + key: Key.t, + ~inject: UpdateAction.t => Ui_effect.t(unit), + ) + : option(UpdateAction.t) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module PV) = to_module(id, syntax, p); - PV.key_handler(key); + let (module PV) = to_module(id, syntax, p, ~inject); + let+ action = PV.key_handler(key); + proj_inject(id, action); }; -let ci = (~inject as _, editor: Editor.t) => { +let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { let* (id, p) = indicated_proj_ed(editor); let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module PV) = to_module(id, syntax, p); + let (module PV) = to_module(id, syntax, p, ~inject); div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); }; diff --git a/src/haz3lweb/view/projectors/CheckboxProjectorView.re b/src/haz3lweb/view/projectors/CheckboxProjectorView.re index 73d604daae..7df30f0bbc 100644 --- a/src/haz3lweb/view/projectors/CheckboxProjectorView.re +++ b/src/haz3lweb/view/projectors/CheckboxProjectorView.re @@ -2,8 +2,6 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let remove = id => Update.PerformAction(Project(Remove(id))); - let put = (bool: bool) => Example.mk_monotile(Form.mk_atomic(Exp, string_of_bool(bool))); @@ -22,10 +20,7 @@ let toggle = (piece: Piece.t) => { put(!cur); }; -let toggle = id => - UpdateAction.PerformAction(Project(UpdateSyntax(id, toggle))); - -let base = (clss, syntax, id, ~font_metrics, ~inject, ~measurement) => +let base = (clss, syntax, ~font_metrics, ~inject, ~measurement) => div( ~attr= Attr.many([ @@ -39,7 +34,9 @@ let base = (clss, syntax, id, ~font_metrics, ~inject, ~measurement) => Attr.many( [ Attr.create("type", "checkbox"), - Attr.on_input((_evt, _str) => {inject(toggle(id))}), + Attr.on_input((_evt, _str) => + inject(Projector.UpdateSyntax(toggle)) + ), JsUtil.stop_mousedown_propagation, ] @ (get(syntax) ? [Attr.checked] : []), @@ -50,23 +47,24 @@ let base = (clss, syntax, id, ~font_metrics, ~inject, ~measurement) => ], ); -let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => +let key_handler = (key: Key.t): option(Projector.action(unit)) => switch (key) { - | {key: D("Escape"), _} => Some(remove(id)) + | {key: D("Escape"), _} => Some(Remove) | _ => None }; let mk = - (id: Id.t, syntax: Piece.t, model: Projector.fold): ProjectorViewModule.t => + (syntax: Piece.t, ~inject, model: Projector.fold): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.checkbox; + type action = unit; //TODO(andrew) let model = model; - let id = id; let syntax = syntax; - let normal = base([], syntax, id); - let indicated = base(["indicated"], syntax, id); - let key_handler = key_handler(id); + let inject = inject; + let normal = base([], syntax, ~inject); + let indicated = base(["indicated"], syntax, ~inject); + let key_handler = key_handler; let ci_string = () => "F"; }); diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index 163522d389..5d12aaf08e 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -2,37 +2,36 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let remove = id => Update.PerformAction(Project(Remove(id))); - -let base = (clss, id, ~font_metrics, ~inject, ~measurement) => +let base = (clss, ~font_metrics, ~inject, ~measurement) => div( ~attr= Attr.many([ Attr.classes(["projector", "fold"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_double_click(_ => inject(remove(id))), + Attr.on_double_click(_ => inject(Projector.Remove)), DecUtil.abs_style(measurement, ~font_metrics), ]), [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], ); -let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => +let key_handler = (key: Key.t): option(Projector.action(unit)) => switch (key) { - | {key: D("Escape"), _} => Some(remove(id)) + | {key: D("Escape"), _} => Some(Projector.Remove) | _ => None }; let mk = - (id: Id.t, syntax: Piece.t, model: Projector.fold): ProjectorViewModule.t => + (syntax: Piece.t, model: Projector.fold, ~inject): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.fold; + type action = unit; let model = model; - let id = id; let syntax = syntax; - let normal = base([], id); - let indicated = base(["indicated"], id); - let key_handler = key_handler(id); + let inject = inject; + let normal = base([], ~inject); + let indicated = base(["indicated"], ~inject); + let key_handler = key_handler; let ci_string = () => "F"; }); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 096c9650e6..4212b8085f 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -2,12 +2,9 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let remove = id => Update.PerformAction(Project(Remove(id))); - let base = ( clss, - id: Id.t, expected_ty: option(Typ.t), ~font_metrics, ~inject, @@ -18,7 +15,7 @@ let base = Attr.many([ Attr.classes(["projector", "infer"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_double_click(_ => inject(remove(id))), + Attr.on_double_click(_ => inject(Projector.Remove)), DecUtil.abs_style(measurement, ~font_metrics), ]), [ @@ -27,23 +24,24 @@ let base = ], ); -let key_handler = (id: Id.t, key: Key.t): option(UpdateAction.t) => +let key_handler = (key: Key.t): option(Projector.action(unit)) => switch (key) { - | {key: D("Escape"), _} => Some(remove(id)) + | {key: D("Escape"), _} => Some(Remove) | _ => None }; let mk = - (id: Id.t, syntax: Piece.t, model: Projector.infer): ProjectorViewModule.t => + (syntax: Piece.t, model: Projector.infer, ~inject): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.infer; + type action = unit; let model = model; - let id = id; let syntax = syntax; - let normal = base([], id, model.expected_ty); - let indicated = base(["indicated"], id, model.expected_ty); - let key_handler = key_handler(id); + let inject = inject; + let normal = base([], model.expected_ty, ~inject); + let indicated = base(["indicated"], model.expected_ty, ~inject); + let key_handler = key_handler; let ci_string: unit => string = _ => "I"; }); From 299184d8039b63de3116f271841ef549959f59cc Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 13:46:03 -0400 Subject: [PATCH 056/168] factored out projector wrapper --- .../view/projectors/CheckboxProjectorView.re | 50 ++++++++++++------- .../view/projectors/FoldProjectorView.re | 24 +++++++-- .../view/projectors/InferProjectorView.re | 35 +++++++++---- 3 files changed, 76 insertions(+), 33 deletions(-) diff --git a/src/haz3lweb/view/projectors/CheckboxProjectorView.re b/src/haz3lweb/view/projectors/CheckboxProjectorView.re index 7df30f0bbc..315650fbe0 100644 --- a/src/haz3lweb/view/projectors/CheckboxProjectorView.re +++ b/src/haz3lweb/view/projectors/CheckboxProjectorView.re @@ -20,31 +20,43 @@ let toggle = (piece: Piece.t) => { put(!cur); }; -let base = (clss, syntax, ~font_metrics, ~inject, ~measurement) => +let wrap = + ( + ~font_metrics, + ~measurement: Measured.measurement, + clss, // include projector name + guy, + ) => div( ~attr= Attr.many([ - Attr.classes(["projector", "checkbox"] @ clss), + Attr.classes(["projector"] @ clss), JsUtil.stop_mousedown_propagation, DecUtil.abs_style(measurement, ~font_metrics), ]), - [ - Node.input( - ~attr= - Attr.many( - [ - Attr.create("type", "checkbox"), - Attr.on_input((_evt, _str) => - inject(Projector.UpdateSyntax(toggle)) - ), - JsUtil.stop_mousedown_propagation, - ] - @ (get(syntax) ? [Attr.checked] : []), - ), - [], - ), - PieceDec.convex_shard(~font_metrics, ~measurement), - ], + [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], + ); + +let base = + (~font_metrics, ~measurement: Measured.measurement, ~inject, clss, syntax) => + wrap( + ~font_metrics, + ~measurement, + ["checkbox", ...clss], + Node.input( + ~attr= + Attr.many( + [ + Attr.create("type", "checkbox"), + Attr.on_input((_evt, _str) => + inject(Projector.UpdateSyntax(toggle)) + ), + JsUtil.stop_mousedown_propagation, + ] + @ (get(syntax) ? [Attr.checked] : []), + ), + [], + ), ); let key_handler = (key: Key.t): option(Projector.action(unit)) => diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index 5d12aaf08e..f580bb9cdf 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -2,16 +2,32 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let base = (clss, ~font_metrics, ~inject, ~measurement) => +let wrap = + ( + ~font_metrics, + ~measurement: Measured.measurement, + clss, // include projector name + guy, + ) => div( ~attr= Attr.many([ - Attr.classes(["projector", "fold"] @ clss), + Attr.classes(["projector"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_double_click(_ => inject(Projector.Remove)), DecUtil.abs_style(measurement, ~font_metrics), ]), - [text("⋱"), PieceDec.convex_shard(~font_metrics, ~measurement)], + [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], + ); + +let base = (~font_metrics, ~measurement: Measured.measurement, ~inject, clss) => + wrap( + ~font_metrics, + ~measurement, + ["fold", ...clss], + div( + ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + [text("⋱")], + ), ); let key_handler = (key: Key.t): option(Projector.action(unit)) => diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 4212b8085f..7a28dc0acd 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -2,26 +2,41 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let base = +let wrap = ( - clss, - expected_ty: option(Typ.t), ~font_metrics, - ~inject, ~measurement: Measured.measurement, + clss, // include projector name + guy, ) => div( ~attr= Attr.many([ - Attr.classes(["projector", "infer"] @ clss), + Attr.classes(["projector"] @ clss), JsUtil.stop_mousedown_propagation, - Attr.on_double_click(_ => inject(Projector.Remove)), DecUtil.abs_style(measurement, ~font_metrics), ]), - [ - text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print), - PieceDec.convex_shard(~font_metrics, ~measurement), - ], + [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], + ); + +let base = + ( + ~font_metrics, + ~measurement: Measured.measurement, + ~inject, + clss, + expected_ty: option(Typ.t), + ) => + wrap( + ~font_metrics, + ~measurement, + ["infer", ...clss], + div( + ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + [ + text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print), + ], + ), ); let key_handler = (key: Key.t): option(Projector.action(unit)) => From afb6057a0a452c5bb98cd0b96474020769d00674 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 14:09:09 -0400 Subject: [PATCH 057/168] internalize projector positioning wrapper and indication style --- src/haz3lcore/zipper/Projector.re | 7 +++ src/haz3lweb/view/ProjectorViewModule.re | 14 +---- src/haz3lweb/view/ProjectorsView.re | 27 +++++++- .../view/projectors/CheckboxProjectorView.re | 62 ++++++------------- .../view/projectors/FoldProjectorView.re | 34 ++-------- .../view/projectors/InferProjectorView.re | 43 ++----------- 6 files changed, 65 insertions(+), 122 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 957487a782..2af4c3c3de 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -32,6 +32,13 @@ type action('action) = | UpdateSyntax(Piece.t => Piece.t) | Internal('action); +let name = (p: t): string => + switch (p) { + | Fold(_) => "fold" + | Infer(_) => "infer" + | Checkbox(_) => "checkbox" + }; + let placeholder = (p: t, id: Id.t): Piece.t => { let (module P) = to_module(p); Piece.Tile({ diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 39579e33e7..82e25f87d4 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -4,22 +4,14 @@ open Virtual_dom.Vdom; module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] type model; + [@deriving (show({with_path: false}), sexp, yojson)] type action; - let model: model; let syntax: Piece.t; + let model: model; + let view: Node.t; let inject: Projector.action(action) => Ui_effect.t(unit); - - let normal: - (~font_metrics: FontMetrics.t, ~measurement: Measured.measurement) => - Node.t; - - let indicated: - (~font_metrics: FontMetrics.t, ~measurement: Measured.measurement) => - Node.t; - let key_handler: Key.t => option(Projector.action(action)); - let ci_string: unit => string; }; type t = (module ProjectorView); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 225087cd8e..6e6d7ecba1 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -30,6 +30,24 @@ let to_module = }; }; +let wrap = + ( + ~font_metrics, + ~measurement: Measured.measurement, + p: Projector.t, + clss: list(string), + guy, + ) => + div( + ~attr= + Attr.many([ + Attr.classes(["projector", Projector.name(p)] @ clss), + JsUtil.stop_mousedown_propagation, + DecUtil.abs_style(measurement, ~font_metrics), + ]), + [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], + ); + let view = ( id: Id.t, @@ -43,7 +61,7 @@ let view = let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module PV) = to_module(id, syntax, p, ~inject); - PV.normal(~font_metrics, ~measurement); + wrap(~font_metrics, ~measurement, p, [], PV.view); }; let indication_view = @@ -60,7 +78,7 @@ let indication_view = let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module PV) = to_module(id, syntax, p, ~inject); - PV.indicated(~font_metrics, ~measurement); + wrap(~font_metrics, ~measurement, p, ["indicated"], PV.view); }; let view_all = @@ -105,5 +123,8 @@ let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { let* (id, p) = indicated_proj_ed(editor); let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let (module PV) = to_module(id, syntax, p, ~inject); - div(~attr=Attr.classes(["projector-ci"]), [text(PV.ci_string())]); + div( + ~attr=Attr.classes(["projector-ci"]), + [text(String.sub(Projector.name(p), 0, 1))], + ); }; diff --git a/src/haz3lweb/view/projectors/CheckboxProjectorView.re b/src/haz3lweb/view/projectors/CheckboxProjectorView.re index 315650fbe0..b7231a557b 100644 --- a/src/haz3lweb/view/projectors/CheckboxProjectorView.re +++ b/src/haz3lweb/view/projectors/CheckboxProjectorView.re @@ -1,62 +1,39 @@ open Haz3lcore; open Virtual_dom.Vdom; -open Node; +open Sexplib.Std; let put = (bool: bool) => Example.mk_monotile(Form.mk_atomic(Exp, string_of_bool(bool))); let get = piece => switch (CheckboxProjectorCore.state_of(piece)) { - | None => failwith("toggle: not a checkbox") + | None => failwith("toggle: not boolean literal") | Some(s) => s }; let toggle = (piece: Piece.t) => { let cur = switch (CheckboxProjectorCore.state_of(piece)) { - | None => failwith("toggle: not a checkbox") + | None => failwith("toggle: not boolean literal") | Some(s) => s }; put(!cur); }; -let wrap = - ( - ~font_metrics, - ~measurement: Measured.measurement, - clss, // include projector name - guy, - ) => - div( +let view = (~inject, syntax) => + Node.input( ~attr= - Attr.many([ - Attr.classes(["projector"] @ clss), - JsUtil.stop_mousedown_propagation, - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], - ); - -let base = - (~font_metrics, ~measurement: Measured.measurement, ~inject, clss, syntax) => - wrap( - ~font_metrics, - ~measurement, - ["checkbox", ...clss], - Node.input( - ~attr= - Attr.many( - [ - Attr.create("type", "checkbox"), - Attr.on_input((_evt, _str) => - inject(Projector.UpdateSyntax(toggle)) - ), - JsUtil.stop_mousedown_propagation, - ] - @ (get(syntax) ? [Attr.checked] : []), - ), - [], - ), + Attr.many( + [ + Attr.create("type", "checkbox"), + Attr.on_input((_evt, _str) => + inject(Projector.UpdateSyntax(toggle)) + ), + JsUtil.stop_mousedown_propagation, + ] + @ (get(syntax) ? [Attr.checked] : []), + ), + [], ); let key_handler = (key: Key.t): option(Projector.action(unit)) => @@ -71,12 +48,11 @@ let mk = { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.checkbox; - type action = unit; //TODO(andrew) + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let model = model; let syntax = syntax; let inject = inject; - let normal = base([], syntax, ~inject); - let indicated = base(["indicated"], syntax, ~inject); + let view = view(syntax, ~inject); let key_handler = key_handler; - let ci_string = () => "F"; }); diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldProjectorView.re index f580bb9cdf..5e233cca8e 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldProjectorView.re @@ -1,33 +1,12 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; +open Sexplib.Std; -let wrap = - ( - ~font_metrics, - ~measurement: Measured.measurement, - clss, // include projector name - guy, - ) => +let view = (~inject) => div( - ~attr= - Attr.many([ - Attr.classes(["projector"] @ clss), - JsUtil.stop_mousedown_propagation, - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], - ); - -let base = (~font_metrics, ~measurement: Measured.measurement, ~inject, clss) => - wrap( - ~font_metrics, - ~measurement, - ["fold", ...clss], - div( - ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [text("⋱")], - ), + ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + [text("⋱")], ); let key_handler = (key: Key.t): option(Projector.action(unit)) => @@ -42,12 +21,11 @@ let mk = { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.fold; + [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; let syntax = syntax; let inject = inject; - let normal = base([], ~inject); - let indicated = base(["indicated"], ~inject); + let view = view(~inject); let key_handler = key_handler; - let ci_string = () => "F"; }); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferProjectorView.re index 7a28dc0acd..cb029eb803 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferProjectorView.re @@ -1,42 +1,12 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; +open Sexplib.Std; -let wrap = - ( - ~font_metrics, - ~measurement: Measured.measurement, - clss, // include projector name - guy, - ) => +let view = (~inject, expected_ty: option(Typ.t)) => div( - ~attr= - Attr.many([ - Attr.classes(["projector"] @ clss), - JsUtil.stop_mousedown_propagation, - DecUtil.abs_style(measurement, ~font_metrics), - ]), - [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], - ); - -let base = - ( - ~font_metrics, - ~measurement: Measured.measurement, - ~inject, - clss, - expected_ty: option(Typ.t), - ) => - wrap( - ~font_metrics, - ~measurement, - ["infer", ...clss], - div( - ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [ - text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print), - ], - ), + ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + [text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print)], ); let key_handler = (key: Key.t): option(Projector.action(unit)) => @@ -51,12 +21,11 @@ let mk = { [@deriving (show({with_path: false}), sexp, yojson)] type model = Projector.infer; + [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; let syntax = syntax; let inject = inject; - let normal = base([], model.expected_ty, ~inject); - let indicated = base(["indicated"], model.expected_ty, ~inject); + let view = view(~inject, model.expected_ty); let key_handler = key_handler; - let ci_string: unit => string = _ => "I"; }); From 61079495122454ad14757629823b047a3c322347 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 14:37:41 -0400 Subject: [PATCH 058/168] projector cleanup and rename --- src/haz3lcore/tiles/Piece.re | 11 +++ src/haz3lcore/zipper/Projector.re | 82 ++++++++----------- ...eckboxProjectorCore.re => CheckboxCore.re} | 13 ++- .../{FoldProjectorCore.re => FoldCore.re} | 8 +- .../{InferProjectorCore.re => InferCore.re} | 11 +-- src/haz3lweb/explainthis/Example.re | 11 +-- src/haz3lweb/view/ProjectorsView.re | 16 ++-- ...eckboxProjectorView.re => CheckboxView.re} | 26 +----- .../{FoldProjectorView.re => FoldView.re} | 22 ++--- .../{InferProjectorView.re => InferView.re} | 2 +- 10 files changed, 89 insertions(+), 113 deletions(-) rename src/haz3lcore/zipper/projectors/{CheckboxProjectorCore.re => CheckboxCore.re} (61%) rename src/haz3lcore/zipper/projectors/{FoldProjectorCore.re => FoldCore.re} (67%) rename src/haz3lcore/zipper/projectors/{InferProjectorCore.re => InferCore.re} (86%) rename src/haz3lweb/view/projectors/{CheckboxProjectorView.re => CheckboxView.re} (57%) rename src/haz3lweb/view/projectors/{FoldProjectorView.re => FoldView.re} (56%) rename src/haz3lweb/view/projectors/{InferProjectorView.re => InferView.re} (91%) diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index f7b6aea5e2..68c08a0a14 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -158,3 +158,14 @@ let replace_id = (id: Id.t, p: t): t => | Grout(g) => Grout({...g, id}) | Secondary(w) => Secondary({...w, id}) }; + +let mk_tile: (Form.t, list(list(t))) => t = + //TODO: asserts + (form, children) => + Tile({ + id: Id.mk(), + label: form.label, + mold: form.mold, + shards: List.mapi((i, _) => i, form.label), + children, + }); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 2af4c3c3de..0c180adabd 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -18,18 +18,22 @@ type checkbox = ZipperBase.checkbox; let to_module = (p: projector): projector_core => switch ((p: projector)) { - | Fold(model) => FoldProjectorCore.mk(model) - | Infer(model) => InferProjectorCore.mk(model) - | Checkbox(model) => CheckboxProjectorCore.mk(model) + | Fold(model) => FoldCore.mk(model) + | Infer(model) => InferCore.mk(model) + | Checkbox(model) => CheckboxCore.mk(model) }; [@deriving (show({with_path: false}), sexp, yojson)] type t = projector; +/* The kind of syntax data to which projection can apply */ +[@deriving (show({with_path: false}), sexp, yojson)] +type syntax = Piece.t; + [@deriving (show({with_path: false}), sexp, yojson)] type action('action) = | Remove - | UpdateSyntax(Piece.t => Piece.t) + | UpdateSyntax(syntax => syntax) | Internal('action); let name = (p: t): string => @@ -39,7 +43,7 @@ let name = (p: t): string => | Checkbox(_) => "checkbox" }; -let placeholder = (p: t, id: Id.t): Piece.t => { +let placeholder = (p: t, id: Id.t): syntax => { let (module P) = to_module(p); Piece.Tile({ id, @@ -50,15 +54,19 @@ let placeholder = (p: t, id: Id.t): Piece.t => { }); }; +/* Currently projection is limited to convex pieces */ +let minimum_projection_condition = (syntax: syntax): bool => + Piece.is_convex(syntax); + let create = - (p: t, piece: Piece.t, id: Id.t, info_map: Statics.Map.t): option(t) => { + (p: t, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { let (module P) = to_module(p); - P.can_project(piece) + P.can_project(syntax) && minimum_projection_condition(syntax) ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; }; -let piece_is = (ps: Map.t, piece: option(Piece.t)): option(Id.t) => - switch (piece) { +let piece_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => + switch (syntax) { | Some(p) when Map.mem(Piece.id(p), ps) => Map.mem(Piece.id(p), ps) ? Some(Piece.id(p)) : None | _ => None @@ -142,7 +150,7 @@ module Move = { }; module MapPiece = { - type updater = Piece.t => Piece.t; + type updater = syntax => syntax; let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { seg |> List.map(f) |> List.map(of_piece(f)); @@ -199,18 +207,18 @@ module MapPiece = { [@deriving (show({with_path: false}), sexp, yojson)] type proj_ret = { z: ZipperBase.t, - syntax_map: Id.Map.t(Piece.t), + syntax_map: Id.Map.t(syntax), }; module Project = { - let syntax_map: ref(Id.Map.t(Piece.t)) = ref(Id.Map.empty); + let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); - let placehold = (projectors: Map.t, piece: Piece.t) => - switch (Map.find(Piece.id(piece), projectors)) { - | None => piece + let placehold = (projectors: Map.t, syntax: syntax) => + switch (Map.find(Piece.id(syntax), projectors)) { + | None => syntax | Some(pr) => - syntax_map := Id.Map.add(Piece.id(piece), piece, syntax_map^); - placeholder(pr, Piece.id(piece)); + syntax_map := Id.Map.add(Piece.id(syntax), syntax, syntax_map^); + placeholder(pr, Piece.id(syntax)); }; let go = (z: ZipperBase.t): proj_ret => { @@ -228,8 +236,8 @@ module Project = { }; module UpdateSyntax = { - let update_piece = (f, id: Id.t, piece: Piece.t) => - id == Piece.id(piece) ? f(piece) : piece; + let update_piece = (f, id: Id.t, syntax: syntax) => + id == Piece.id(syntax) ? f(syntax) : syntax; let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { switch (z.relatives.siblings |> get) { @@ -241,13 +249,13 @@ module UpdateSyntax = { let left_sib_has_id = sib_has_id(Siblings.left_neighbor); let right_sib_has_id = sib_has_id(Siblings.right_neighbor); - let update_left_sib = (f: Piece.t => Piece.t, z: ZipperBase.t) => { + let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { let (l, r) = z.relatives.siblings; let sibs = (List.map(f, l), List.map(f, r)); z |> put_siblings(sibs); }; - let update_right_sib = (f: Piece.t => Piece.t, z: ZipperBase.t) => { + let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { let sibs = switch (z.relatives.siblings) { | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) @@ -256,15 +264,19 @@ module UpdateSyntax = { z |> put_siblings(sibs); }; - let go = (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let go = (f: syntax => syntax, id: Id.t, z: ZipperBase.t): ZipperBase.t => { /* This applies the function to the piece in the zipper having id id, and * then replaces the id of the resulting piece with the idea of the old * piece, ensuring that the root id remains stable. This function assumes * the cursor is not inside the piece to be updated. This is optimized to * be O(1) when the piece is directly to the left or right of the cursor, * otherwise it is O(|zipper|) */ - let f = piece => - update_piece(p => p |> f |> Piece.replace_id(Piece.id(p)), id, piece); + let f = syntax => + update_piece( + p => p |> f |> Piece.replace_id(Piece.id(p)), + id, + syntax, + ); if (left_sib_has_id(z, id)) { update_left_sib(f, z); } else if (right_sib_has_id(z, id)) { @@ -274,25 +286,3 @@ module UpdateSyntax = { }; }; }; -//TODO(andrew): rm if unused -// exception PieceFound(Piece.t); -// let get = (id: Id.t, z: ZipperBase.t): option(Piece.t) => { -// /* Gets the piece under the projector with id id. This is optimized to -// * be O(1) when the piece is directly to the left or right of the cursor, -// * otherwise it is O(|zipper|) */ -// let f = piece => { -// if (Piece.id(piece) == id) { -// raise(PieceFound(piece)); -// }; -// piece; -// }; -// try( -// { -// go(f, id, z) |> ignore; -// None; -// } -// ) { -// | PieceFound(piece) => Some(piece) -// }; -// }; -// diff --git a/src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re similarity index 61% rename from src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re rename to src/haz3lcore/zipper/projectors/CheckboxCore.re index 79329a44f0..93d55da9d1 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -8,6 +8,17 @@ let state_of = (piece: Piece.t): option(bool) => | _ => None }; +let get = (piece: Piece.t): bool => + switch (state_of(piece)) { + | None => failwith("Checkbox: not boolean literal") + | Some(s) => s + }; + +let put = (bool: bool): Piece.t => + bool |> string_of_bool |> Form.mk_atomic(Exp) |> Piece.mk_tile(_, []); + +let toggle = (piece: Piece.t) => put(!get(piece)); + let mk = (model): projector_core => (module { @@ -16,7 +27,7 @@ let mk = (model): projector_core => type action = unit; let model = model; let projector = Checkbox(model); - let can_project = p => Piece.is_convex(p) && state_of(p) != None; + let can_project = p => state_of(p) != None; let placeholder_length = () => 2; let auto_update = _: projector => Checkbox(); let act = _ => Checkbox(); diff --git a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re similarity index 67% rename from src/haz3lcore/zipper/projectors/FoldProjectorCore.re rename to src/haz3lcore/zipper/projectors/FoldCore.re index 26ead311e5..eb158df97e 100644 --- a/src/haz3lcore/zipper/projectors/FoldProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,15 +1,15 @@ open Sexplib.Std; open ZipperBase; -let mk = (model): projector_core => +let mk = (): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; type action = unit; - let model = model; - let projector = Fold(model); - let can_project = Piece.is_convex; + let model = (); + let projector = Fold(); + let can_project = _ => true; let placeholder_length = () => 2; let auto_update = _: projector => Fold(); let act = _ => Fold(); diff --git a/src/haz3lcore/zipper/projectors/InferProjectorCore.re b/src/haz3lcore/zipper/projectors/InferCore.re similarity index 86% rename from src/haz3lcore/zipper/projectors/InferProjectorCore.re rename to src/haz3lcore/zipper/projectors/InferCore.re index a7a10162c4..7d8528a761 100644 --- a/src/haz3lcore/zipper/projectors/InferProjectorCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -22,13 +22,10 @@ let mk = (model: infer): projector_core => let projector = Infer(model); let can_project = (p: Piece.t): bool => - Piece.is_convex(p) - && ( - switch (p) { - | Tile(t) => t.mold.out == Exp || t.mold.out == Pat - | _ => false - } - ); + switch (p) { + | Tile(t) => t.mold.out == Exp || t.mold.out == Pat + | _ => false + }; let placeholder_length = _ => display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; diff --git a/src/haz3lweb/explainthis/Example.re b/src/haz3lweb/explainthis/Example.re index bed048cfc0..aef4fd243d 100644 --- a/src/haz3lweb/explainthis/Example.re +++ b/src/haz3lweb/explainthis/Example.re @@ -3,16 +3,7 @@ open Haz3lcore; let mk_secondary: string => Piece.t = content => Secondary({id: Id.mk(), content: Whitespace(content)}); -let mk_tile: (Form.t, list(list(Piece.t))) => Piece.t = - //TODO: asserts - (form, children) => - Tile({ - id: Id.mk(), - label: form.label, - mold: form.mold, - shards: List.mapi((i, _) => i, form.label), - children, - }); +let mk_tile = Piece.mk_tile; let mk_ancestor: (Form.t, (list(Segment.t), list(Segment.t))) => Ancestor.t = //TODO: asserts diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 6e6d7ecba1..2a59711c03 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -16,27 +16,27 @@ let proj_inject = (id, action: Projector.action('action)): UpdateAction.t => { let to_module = ( - id, + id: Id.t, syntax: Piece.t, p: Projector.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ) : ProjectorViewModule.t => { - let inject = pa => inject(proj_inject(id, pa)); + let inject = action => inject(proj_inject(id, action)); switch (p) { - | Fold(model) => FoldProjectorView.mk(syntax, model, ~inject) - | Infer(model) => InferProjectorView.mk(syntax, model, ~inject) - | Checkbox(model) => CheckboxProjectorView.mk(syntax, model, ~inject) + | Fold(model) => FoldView.mk(syntax, model, ~inject) + | Infer(model) => InferView.mk(syntax, model, ~inject) + | Checkbox(model) => CheckboxView.mk(syntax, model, ~inject) }; }; let wrap = ( - ~font_metrics, + ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, p: Projector.t, clss: list(string), - guy, + view: Node.t, ) => div( ~attr= @@ -45,7 +45,7 @@ let wrap = JsUtil.stop_mousedown_propagation, DecUtil.abs_style(measurement, ~font_metrics), ]), - [guy, PieceDec.convex_shard(~font_metrics, ~measurement)], + [view, PieceDec.convex_shard(~font_metrics, ~measurement)], ); let view = diff --git a/src/haz3lweb/view/projectors/CheckboxProjectorView.re b/src/haz3lweb/view/projectors/CheckboxView.re similarity index 57% rename from src/haz3lweb/view/projectors/CheckboxProjectorView.re rename to src/haz3lweb/view/projectors/CheckboxView.re index b7231a557b..e5e0c9ca0a 100644 --- a/src/haz3lweb/view/projectors/CheckboxProjectorView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -2,36 +2,18 @@ open Haz3lcore; open Virtual_dom.Vdom; open Sexplib.Std; -let put = (bool: bool) => - Example.mk_monotile(Form.mk_atomic(Exp, string_of_bool(bool))); - -let get = piece => - switch (CheckboxProjectorCore.state_of(piece)) { - | None => failwith("toggle: not boolean literal") - | Some(s) => s - }; - -let toggle = (piece: Piece.t) => { - let cur = - switch (CheckboxProjectorCore.state_of(piece)) { - | None => failwith("toggle: not boolean literal") - | Some(s) => s - }; - put(!cur); -}; - -let view = (~inject, syntax) => +let view = (~inject: Projector.action(unit) => Ui_effect.t(unit), syntax) => Node.input( ~attr= Attr.many( [ Attr.create("type", "checkbox"), - Attr.on_input((_evt, _str) => - inject(Projector.UpdateSyntax(toggle)) + Attr.on_input((_, _) => + inject(UpdateSyntax(CheckboxCore.toggle)) ), JsUtil.stop_mousedown_propagation, ] - @ (get(syntax) ? [Attr.checked] : []), + @ (CheckboxCore.get(syntax) ? [Attr.checked] : []), ), [], ); diff --git a/src/haz3lweb/view/projectors/FoldProjectorView.re b/src/haz3lweb/view/projectors/FoldView.re similarity index 56% rename from src/haz3lweb/view/projectors/FoldProjectorView.re rename to src/haz3lweb/view/projectors/FoldView.re index 5e233cca8e..834756824f 100644 --- a/src/haz3lweb/view/projectors/FoldProjectorView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -3,18 +3,6 @@ open Virtual_dom.Vdom; open Node; open Sexplib.Std; -let view = (~inject) => - div( - ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [text("⋱")], - ); - -let key_handler = (key: Key.t): option(Projector.action(unit)) => - switch (key) { - | {key: D("Escape"), _} => Some(Projector.Remove) - | _ => None - }; - let mk = (syntax: Piece.t, model: Projector.fold, ~inject): ProjectorViewModule.t => (module @@ -23,9 +11,15 @@ let mk = type model = Projector.fold; [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; + let model = model; let syntax = syntax; let inject = inject; - let view = view(~inject); - let key_handler = key_handler; + + let view = + div( + ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + [text("⋱")], + ); + let key_handler = _: option(Projector.action(action)) => None; }); diff --git a/src/haz3lweb/view/projectors/InferProjectorView.re b/src/haz3lweb/view/projectors/InferView.re similarity index 91% rename from src/haz3lweb/view/projectors/InferProjectorView.re rename to src/haz3lweb/view/projectors/InferView.re index cb029eb803..e1a98d5adc 100644 --- a/src/haz3lweb/view/projectors/InferProjectorView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -6,7 +6,7 @@ open Sexplib.Std; let view = (~inject, expected_ty: option(Typ.t)) => div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [text(expected_ty |> InferProjectorCore.display_ty |> Typ.pretty_print)], + [text(expected_ty |> InferCore.display_ty |> Typ.pretty_print)], ); let key_handler = (key: Key.t): option(Projector.action(unit)) => From 0493db2b1b125c08d8bb6825f02513ab2d9313de Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 14:50:43 -0400 Subject: [PATCH 059/168] stub internal projector action dispatch --- src/haz3lcore/zipper/Projector.re | 2 +- src/haz3lcore/zipper/action/Action.re | 2 +- src/haz3lcore/zipper/action/ProjectorPerform.re | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 0c180adabd..874c21f6b7 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -150,7 +150,7 @@ module Move = { }; module MapPiece = { - type updater = syntax => syntax; + type updater = Piece.t => Piece.t; let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { seg |> List.map(f) |> List.map(of_piece(f)); diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 668e3ece17..f09cc0a6cc 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -46,9 +46,9 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = | UpdateSyntax(Id.t, Piece.t => Piece.t) + | UpdateModel(Id.t, Projector.t => Projector.t) | ToggleIndicated(Projector.t) | Remove(Id.t); -//| UpdateModel(Id.t, projector_type(X)_action) [@deriving (show({with_path: false}), sexp, yojson)] type t = diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 59df20e02a..4f7c5692ca 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -2,7 +2,7 @@ open Projector; let move_out_of_piece = (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => - /* Might not work for pieces with more than 2 delims */ + /* NOTE: Might not work for pieces with more than 2 delims */ switch (rel) { | Sibling => {...z, caret: Outer} | Parent => @@ -29,7 +29,6 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? - //TODO(andrew): method to remotely get projected piece switch (a) { | ToggleIndicated(p) => switch (Indicated.for_index(z)) { @@ -43,4 +42,6 @@ let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => | true => Ok(set(id, None, z)) } | UpdateSyntax(id, f) => Ok(Projector.UpdateSyntax.go(f, id, z)) + | UpdateModel(id, f) => + Ok({...z, projectors: Map.update(id, Option.map(f), z.projectors)}) }; From dd1773366b9e186525a29a43fd5df315b6ce869c Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 17:18:25 -0400 Subject: [PATCH 060/168] internalized projector-specific action type; doesn't quite work through --- src/haz3lcore/zipper/Projector.re | 13 +--- src/haz3lcore/zipper/ZipperBase.re | 24 +++++-- .../zipper/projectors/CheckboxCore.re | 3 +- src/haz3lcore/zipper/projectors/FoldCore.re | 3 +- src/haz3lcore/zipper/projectors/InferCore.re | 7 +-- src/haz3lcore/zipper/projectors/SliderCore.re | 18 ++++++ src/haz3lweb/Keyboard.re | 2 + src/haz3lweb/view/Deco.re | 10 +-- src/haz3lweb/view/ProjectorViewModule.re | 4 +- src/haz3lweb/view/ProjectorsView.re | 48 +++++++++----- src/haz3lweb/view/projectors/CheckboxView.re | 15 +++-- src/haz3lweb/view/projectors/FoldView.re | 12 ++-- src/haz3lweb/view/projectors/InferView.re | 15 +++-- src/haz3lweb/view/projectors/SliderView.re | 41 ++++++++++++ src/haz3lweb/www/style.css | 62 +++++++------------ 15 files changed, 170 insertions(+), 107 deletions(-) create mode 100644 src/haz3lcore/zipper/projectors/SliderCore.re create mode 100644 src/haz3lweb/view/projectors/SliderView.re diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 874c21f6b7..8bd6135d35 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -7,20 +7,12 @@ module Map = ProjectorMap; [@deriving (show({with_path: false}), sexp, yojson)] type info = ZipperBase.projector_info; -[@deriving (show({with_path: false}), sexp, yojson)] -type fold = ZipperBase.fold; - -[@deriving (show({with_path: false}), sexp, yojson)] -type infer = ZipperBase.infer; - -[@deriving (show({with_path: false}), sexp, yojson)] -type checkbox = ZipperBase.checkbox; - let to_module = (p: projector): projector_core => switch ((p: projector)) { | Fold(model) => FoldCore.mk(model) | Infer(model) => InferCore.mk(model) | Checkbox(model) => CheckboxCore.mk(model) + | Slider(model) => SliderCore.mk(model) }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -34,13 +26,14 @@ type syntax = Piece.t; type action('action) = | Remove | UpdateSyntax(syntax => syntax) - | Internal('action); + | UpdateModel('action); let name = (p: t): string => switch (p) { | Fold(_) => "fold" | Infer(_) => "infer" | Checkbox(_) => "checkbox" + | Slider(_) => "slider" }; let placeholder = (p: t, id: Id.t): syntax => { diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index acfbc0175d..1258ec83c6 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -2,20 +2,33 @@ open Sexplib.Std; /* Projector model types */ +[@deriving (show({with_path: false}), sexp, yojson)] +type fold = unit; [@deriving (show({with_path: false}), sexp, yojson)] type infer = {expected_ty: option(Typ.t)}; - [@deriving (show({with_path: false}), sexp, yojson)] -type fold = unit; +type checkbox = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type slider = {value: int}; + +/* Projector action types */ [@deriving (show({with_path: false}), sexp, yojson)] -type checkbox = unit; +type fold_action = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type infer_action = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type checkbox_action = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type slider_action = + | Set(int); [@deriving (show({with_path: false}), sexp, yojson)] type projector = | Fold(fold) | Infer(infer) - | Checkbox(checkbox); + | Checkbox(checkbox) + | Slider(slider); [@deriving (show({with_path: false}), sexp, yojson)] module ProjectorMap = { @@ -36,13 +49,14 @@ type projector_info = {info: option(Info.t)}; module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] type model; + [@deriving (show({with_path: false}), sexp, yojson)] type action; let projector: projector; let model: model; let placeholder_length: unit => int; let can_project: Piece.t => bool; let auto_update: projector_info => projector; - let act: action => projector; + let update: action => projector; }; type projector_core = (module ProjectorCore); diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 93d55da9d1..b604df5e19 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -24,11 +24,12 @@ let mk = (model): projector_core => { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; let projector = Checkbox(model); let can_project = p => state_of(p) != None; let placeholder_length = () => 2; let auto_update = _: projector => Checkbox(); - let act = _ => Checkbox(); + let update = _action => Checkbox(); }); diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index eb158df97e..7dadac4a0d 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -6,11 +6,12 @@ let mk = (): projector_core => { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = (); let projector = Fold(); let can_project = _ => true; let placeholder_length = () => 2; let auto_update = _: projector => Fold(); - let act = _ => Fold(); + let update = _action => Fold(); }); diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index 7d8528a761..9e7e104fda 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,4 +1,5 @@ open ZipperBase; +open Sexplib.Std; let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { @@ -17,6 +18,7 @@ let mk = (model: infer): projector_core => { [@deriving (show({with_path: false}), sexp, yojson)] type model = infer; + [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; let projector = Infer(model); @@ -34,8 +36,5 @@ let mk = (model: infer): projector_core => print_endline("updating infer projector"); Infer({expected_ty: Some(expected_ty(info))}); }; - let act = (action: action): projector => - switch (action) { - | () => Infer({expected_ty: None}) - }; + let update = _action => Infer(model); }); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re new file mode 100644 index 0000000000..f201307acb --- /dev/null +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -0,0 +1,18 @@ +open ZipperBase; + +let mk = (model): projector_core => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = ZipperBase.slider; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = ZipperBase.slider_action; + let model = model; + let projector = Slider(model); + let can_project = _ => true; + let placeholder_length = () => 10; + let auto_update = _: projector => Slider(model); + let update = + fun + | Set(value) => Slider({value: value}); + }); diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index b577a602e2..6663f46de7 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -117,6 +117,8 @@ let handle_key_event = (k: Key.t): option(Update.t) => { ), ) | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox())))) + | "ß" => + Some(PerformAction(Project(ToggleIndicated(Slider({value: 10}))))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 6253ac4192..53e5adbc61 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -306,11 +306,11 @@ module Deco = | Some(id) => switch ( ProjectorsView.indication_view( - ~inject, id, z.projectors, - M.syntax_map, - M.map, + ~inject, + ~syntax_map=M.syntax_map, + ~measured=M.map, ~font_metrics, ) ) { @@ -334,10 +334,10 @@ module Deco = err_holes(), ProjectorsView.view_all( zipper.projectors, - M.syntax_map, + ~syntax_map=M.syntax_map, ~inject, ~font_metrics, - M.map, + ~measured=M.map, ), ]); diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 82e25f87d4..4b1bb8a44f 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -7,11 +7,9 @@ module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] type action; - let syntax: Piece.t; let model: model; let view: Node.t; - let inject: Projector.action(action) => Ui_effect.t(unit); - let key_handler: Key.t => option(Projector.action(action)); + let keymap: Key.t => option(Projector.action(action)); }; type t = (module ProjectorView); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 2a59711c03..2b1af3eca2 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -4,13 +4,25 @@ open Node; open Projector; open Util.OptUtil.Syntax; -let proj_inject = (id, action: Projector.action('action)): UpdateAction.t => { +let handle = (id, action): UpdateAction.t => { switch (action) { | Remove => PerformAction(Project(Remove(id))) | UpdateSyntax(f) => PerformAction(Project(UpdateSyntax(id, f))) - | Internal(_) => + | UpdateModel(_action) => //TODO(andrew) - PerformAction(Project(Remove(id))) + print_endline("TODO: update model"); + // PerformAction( + // Project( + // UpdateModel( + // id, + // p => { + // let (module P) = Projector.to_module(p); + // P.update(action); + // }, + // ), + // ), + // ); + PerformAction(Project(UpdateModel(id, x => x))); }; }; @@ -22,11 +34,15 @@ let to_module = ~inject: UpdateAction.t => Ui_effect.t(unit), ) : ProjectorViewModule.t => { - let inject = action => inject(proj_inject(id, action)); switch (p) { - | Fold(model) => FoldView.mk(syntax, model, ~inject) - | Infer(model) => InferView.mk(syntax, model, ~inject) - | Checkbox(model) => CheckboxView.mk(syntax, model, ~inject) + | Fold(model) => + FoldView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + | Infer(model) => + InferView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + | Checkbox(model) => + CheckboxView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + | Slider(model) => + SliderView.mk(syntax, model, ~inject=a => inject(handle(id, a))) }; }; @@ -52,7 +68,7 @@ let view = ( id: Id.t, ps: Map.t, - syntax_map, + ~syntax_map: Id.Map.t(syntax), ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, @@ -68,8 +84,8 @@ let indication_view = ( id: Id.t, ps: Map.t, - syntax_map, - measured: Measured.t, + ~syntax_map: Id.Map.t(syntax), + ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, ) @@ -84,20 +100,20 @@ let indication_view = let view_all = ( ps: Map.t, - syntax_map, - measured: Measured.t, + ~syntax_map: Id.Map.t(syntax), + ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, ) => List.filter_map( ((id, _)) => - view(id, ps, syntax_map, ~measured, ~inject, ~font_metrics), + view(id, ps, ~syntax_map, ~measured, ~inject, ~font_metrics), Id.Map.bindings(ps), ); let indicated_proj_ed = (editor: Editor.t) => { let projectors = Editor.get_projectors(editor); - //TODO(andrew): use z_proj instead of zipper? + //TODO(andrew): In future use z_proj instead of zipper? let* id = Indicated.index(editor.state.zipper); let+ projector = Projector.Map.find(id, projectors); (id, projector); @@ -115,8 +131,8 @@ let key_handler = | Some((id, p)) => let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let (module PV) = to_module(id, syntax, p, ~inject); - let+ action = PV.key_handler(key); - proj_inject(id, action); + let+ action = PV.keymap(key); + handle(id, action); }; let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index e5e0c9ca0a..00d10e79df 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -1,6 +1,5 @@ open Haz3lcore; open Virtual_dom.Vdom; -open Sexplib.Std; let view = (~inject: Projector.action(unit) => Ui_effect.t(unit), syntax) => Node.input( @@ -18,23 +17,23 @@ let view = (~inject: Projector.action(unit) => Ui_effect.t(unit), syntax) => [], ); -let key_handler = (key: Key.t): option(Projector.action(unit)) => +let keymap = (key: Key.t): option(Projector.action(unit)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None }; let mk = - (syntax: Piece.t, ~inject, model: Projector.fold): ProjectorViewModule.t => + (syntax: Piece.t, ~inject, model: ZipperBase.checkbox) + : ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = Projector.checkbox; + type model = ZipperBase.checkbox; [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; + type action = ZipperBase.checkbox_action; + let model = model; - let syntax = syntax; - let inject = inject; let view = view(syntax, ~inject); - let key_handler = key_handler; + let keymap = keymap; }); diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 834756824f..216ecd42e2 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -1,25 +1,21 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -open Sexplib.Std; let mk = - (syntax: Piece.t, model: Projector.fold, ~inject): ProjectorViewModule.t => + (_syntax: Piece.t, model: ZipperBase.fold, ~inject): ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = Projector.fold; + type model = ZipperBase.fold; [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; + type action = ZipperBase.fold_action; let model = model; - let syntax = syntax; - let inject = inject; - let view = div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), [text("⋱")], ); - let key_handler = _: option(Projector.action(action)) => None; + let keymap = _: option(Projector.action(action)) => None; }); diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index e1a98d5adc..f94b1d7e94 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -1,7 +1,6 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -open Sexplib.Std; let view = (~inject, expected_ty: option(Typ.t)) => div( @@ -9,23 +8,23 @@ let view = (~inject, expected_ty: option(Typ.t)) => [text(expected_ty |> InferCore.display_ty |> Typ.pretty_print)], ); -let key_handler = (key: Key.t): option(Projector.action(unit)) => +let keymap = (key: Key.t): option(Projector.action(unit)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None }; let mk = - (syntax: Piece.t, model: Projector.infer, ~inject): ProjectorViewModule.t => + (_syntax: Piece.t, model: ZipperBase.infer, ~inject) + : ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = Projector.infer; + type model = ZipperBase.infer; [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; + type action = ZipperBase.infer_action; + let model = model; - let syntax = syntax; - let inject = inject; let view = view(~inject, model.expected_ty); - let key_handler = key_handler; + let keymap = keymap; }); diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re new file mode 100644 index 0000000000..5492b8ba5f --- /dev/null +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -0,0 +1,41 @@ +open Haz3lcore; +open Virtual_dom.Vdom; + +let view = + ( + ~inject: + Projector.action(ZipperBase.slider_action) => Ui_effect.t(unit), + value: int, + ) => + Node.input( + ~attr= + Attr.many([ + Attr.create("type", "range"), + Attr.create("value", string_of_int(value)), + Attr.on_input((_evt, new_val) => + inject(UpdateModel(Set(int_of_string(new_val)))) + ), + ]), + [], + ); + +let keymap = + (key: Key.t): option(Projector.action(ZipperBase.slider_action)) => + switch (key) { + | {key: D("Escape"), _} => Some(Remove) + | _ => None + }; + +let mk = + (_syntax: Piece.t, ~inject, model: ZipperBase.slider) + : ProjectorViewModule.t => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = ZipperBase.slider; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = ZipperBase.slider_action; + let model = model; + let view = view(model.value, ~inject); + let keymap = keymap; + }); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 5cee75b130..978b2f8423 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -676,69 +676,55 @@ select { position: relative; } -/* PROJECTORS */ +/* PROJECTORS: default */ .projector { position: absolute; z-index: 12; cursor: pointer; -} - -.projector.fold { display: flex; justify-content: center; color: #c7b480; } -.projector.fold:hover { - color: black; -} -.projector.fold svg { - fill: #f0e7d6; - z-index: -1; -} -.projector.infer { - opacity: 60%; - color: var(--typ-text-color); -} - -.code-container .infer svg { - fill: var(--typ-bg-off-color); - z-index: -1; -} - -.projector.checkbox { - display: flex; - justify-content: center; - color: #c7b480; -} -.projector.checkbox svg { - fill: #f0e7d6; - z-index: -1; -} - .projector.indicated { z-index: 13; display: flex; justify-content: center; cursor: pointer !important; } - -.projector.indicated svg { +.projector > svg { z-index: -1; + fill: #f0e7d6; } +.projector.indicated > svg { + fill: var(--exp-bg-off-color); +} + +/* PROJECTOR: FOLD */ + +.projector.fold:hover, .projector.indicated.fold { color: black; } -.projector.indicated.fold svg { - fill: var(--exp-bg-off-color); + +/* PROJECTOR: INFER */ + +.projector.infer { + opacity: 60%; + color: var(--typ-text-color); } -.projector.indicated.infer svg { +.projector.infer > svg { fill: var(--typ-bg-off-color); } -.projector.indicated.checkbox svg { - fill: var(--exp-bg-off-color); + +/* PROJECTOR: SLIDER */ + +.projector.slider > input { + width: 100%; } +/* END PROJECTORS */ + .code { /*white-space: nowrap;*/ } From 5f44697860c6e4c57eb4f23cad52287cbd8cd205 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 17:26:08 -0400 Subject: [PATCH 061/168] projector kind type for creation dispatch --- src/haz3lcore/zipper/Projector.re | 19 +++++++++++++++++-- src/haz3lcore/zipper/action/Action.re | 2 +- src/haz3lweb/Keyboard.re | 14 ++++---------- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 8bd6135d35..bafb048b85 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -18,6 +18,13 @@ let to_module = (p: projector): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type t = projector; +[@deriving (show({with_path: false}), sexp, yojson)] +type kind = + | Fold + | Infer + | Checkbox + | Slider; + /* The kind of syntax data to which projection can apply */ [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; @@ -51,9 +58,17 @@ let placeholder = (p: t, id: Id.t): syntax => { let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); +let init = (f: kind): projector_core => + switch (f) { + | Fold => FoldCore.mk() + | Infer => InferCore.mk({expected_ty: None}) + | Checkbox => CheckboxCore.mk() + | Slider => SliderCore.mk({value: 10}) + }; + let create = - (p: t, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { - let (module P) = to_module(p); + (k: kind, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { + let (module P) = init(k); P.can_project(syntax) && minimum_projection_condition(syntax) ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index f09cc0a6cc..0263966765 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -47,7 +47,7 @@ type select = type project = | UpdateSyntax(Id.t, Piece.t => Piece.t) | UpdateModel(Id.t, Projector.t => Projector.t) - | ToggleIndicated(Projector.t) + | ToggleIndicated(Projector.kind) | Remove(Id.t); [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 6663f46de7..52828a2795 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -109,16 +109,10 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => switch (key) { - | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold())))) - | "†" => - Some( - PerformAction( - Project(ToggleIndicated(Infer({expected_ty: None}))), - ), - ) - | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox())))) - | "ß" => - Some(PerformAction(Project(ToggleIndicated(Slider({value: 10}))))) + | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold)))) + | "†" => Some(PerformAction(Project(ToggleIndicated(Infer)))) + | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox)))) + | "ß" => Some(PerformAction(Project(ToggleIndicated(Slider)))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) From b0c947eb6dd07383b58f7e80a07d6e745ee79cfe Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 11 Jun 2024 18:57:18 -0400 Subject: [PATCH 062/168] simplified projector view module signature --- src/haz3lweb/view/ProjectorViewModule.re | 3 --- src/haz3lweb/view/projectors/CheckboxView.re | 5 +---- src/haz3lweb/view/projectors/FoldView.re | 6 ++---- src/haz3lweb/view/projectors/InferView.re | 3 --- src/haz3lweb/view/projectors/SliderView.re | 4 +--- 5 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 4b1bb8a44f..d8f5632986 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -2,12 +2,9 @@ open Haz3lcore; open Virtual_dom.Vdom; module type ProjectorView = { - [@deriving (show({with_path: false}), sexp, yojson)] - type model; [@deriving (show({with_path: false}), sexp, yojson)] type action; - let model: model; let view: Node.t; let keymap: Key.t => option(Projector.action(action)); }; diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index 00d10e79df..d2ea6d51e3 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -24,16 +24,13 @@ let keymap = (key: Key.t): option(Projector.action(unit)) => }; let mk = - (syntax: Piece.t, ~inject, model: ZipperBase.checkbox) + (syntax: Piece.t, _model: ZipperBase.checkbox, ~inject) : ProjectorViewModule.t => (module { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.checkbox; [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.checkbox_action; - let model = model; let view = view(syntax, ~inject); let keymap = keymap; }); diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 216ecd42e2..5349641f9b 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -3,15 +3,13 @@ open Virtual_dom.Vdom; open Node; let mk = - (_syntax: Piece.t, model: ZipperBase.fold, ~inject): ProjectorViewModule.t => + (_syntax: Piece.t, _model: ZipperBase.fold, ~inject) + : ProjectorViewModule.t => (module { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.fold; [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.fold_action; - let model = model; let view = div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index f94b1d7e94..ecc7c88e03 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -19,12 +19,9 @@ let mk = : ProjectorViewModule.t => (module { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.infer; [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.infer_action; - let model = model; let view = view(~inject, model.expected_ty); let keymap = keymap; }); diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index 5492b8ba5f..8bede42b7a 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -31,11 +31,9 @@ let mk = : ProjectorViewModule.t => (module { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.slider; [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.slider_action; - let model = model; + let view = view(model.value, ~inject); let keymap = keymap; }); From eb9aa0c9f509d63550373b04ba7c0100c3c97282 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 17 Jun 2024 14:35:40 -0400 Subject: [PATCH 063/168] projectors action serialization --- src/haz3lcore/zipper/Projector.re | 4 +- src/haz3lcore/zipper/ZipperBase.re | 2 +- .../zipper/action/ProjectorPerform.re | 2 +- .../zipper/projectors/CheckboxCore.re | 18 ++++---- src/haz3lcore/zipper/projectors/InferCore.re | 8 ++-- src/haz3lcore/zipper/projectors/SliderCore.re | 13 ++++-- src/haz3lweb/view/Deco.re | 1 - src/haz3lweb/view/ProjectorViewModule.re | 2 +- src/haz3lweb/view/ProjectorsView.re | 41 +++++++++++-------- src/haz3lweb/view/dec/DecUtil.re | 2 +- src/haz3lweb/view/projectors/CheckboxView.re | 4 +- src/haz3lweb/view/projectors/FoldView.re | 2 +- src/haz3lweb/view/projectors/InferView.re | 8 +++- src/haz3lweb/view/projectors/SliderView.re | 41 ++++++++++++++----- src/haz3lweb/www/style.css | 37 ++++++++++++++--- src/util/StringUtil.re | 4 ++ 16 files changed, 130 insertions(+), 59 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index bafb048b85..d2fb6e780e 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -243,7 +243,7 @@ module Project = { }; }; -module UpdateSyntax = { +module Syntax = { let update_piece = (f, id: Id.t, syntax: syntax) => id == Piece.id(syntax) ? f(syntax) : syntax; @@ -272,7 +272,7 @@ module UpdateSyntax = { z |> put_siblings(sibs); }; - let go = (f: syntax => syntax, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let update = (f: syntax => syntax, id: Id.t, z: ZipperBase.t): ZipperBase.t => { /* This applies the function to the piece in the zipper having id id, and * then replaces the id of the resulting piece with the idea of the old * piece, ensuring that the root id remains stable. This function assumes diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 1258ec83c6..dcba189c73 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -56,7 +56,7 @@ module type ProjectorCore = { let placeholder_length: unit => int; let can_project: Piece.t => bool; let auto_update: projector_info => projector; - let update: action => projector; + let update: string => projector; }; type projector_core = (module ProjectorCore); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 4f7c5692ca..f4f2bf9c6c 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -41,7 +41,7 @@ let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => | false => Error(Action.Failure.Cant_project) | true => Ok(set(id, None, z)) } - | UpdateSyntax(id, f) => Ok(Projector.UpdateSyntax.go(f, id, z)) + | UpdateSyntax(id, f) => Ok(Projector.Syntax.update(f, id, z)) | UpdateModel(id, f) => Ok({...z, projectors: Map.update(id, Option.map(f), z.projectors)}) }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index b604df5e19..4d0ac409e8 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -1,21 +1,25 @@ open Sexplib.Std; open ZipperBase; -let state_of = (piece: Piece.t): option(bool) => - switch (piece) { - | Tile({label: ["true"], _}) => Some(true) - | Tile({label: ["false"], _}) => Some(false) +let of_mono = (syntax: Piece.t): option(string) => + switch (syntax) { + | Tile({label: [l], _}) => Some(l) | _ => None }; +let mk_mono = (sort: Sort.t, string: string): Piece.t => + string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + +let state_of = (piece: Piece.t): option(bool) => + piece |> of_mono |> Option.map(bool_of_string); + let get = (piece: Piece.t): bool => - switch (state_of(piece)) { + switch (piece |> of_mono |> Option.map(bool_of_string)) { | None => failwith("Checkbox: not boolean literal") | Some(s) => s }; -let put = (bool: bool): Piece.t => - bool |> string_of_bool |> Form.mk_atomic(Exp) |> Piece.mk_tile(_, []); +let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index 9e7e104fda..0bfd536690 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,5 +1,4 @@ open ZipperBase; -open Sexplib.Std; let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { @@ -19,7 +18,7 @@ let mk = (model: infer): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type model = infer; [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; + type action = infer_action; let model = model; let projector = Infer(model); @@ -29,8 +28,9 @@ let mk = (model: infer): projector_core => | _ => false }; - let placeholder_length = _ => - display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; + let placeholder_length = () => + 3 + + (display_ty(model.expected_ty) |> Typ.pretty_print |> String.length); let auto_update = ({info, _}): projector => { print_endline("updating infer projector"); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index f201307acb..9b3cfd4195 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,5 +1,11 @@ open ZipperBase; +let serialize = a => + a |> ZipperBase.sexp_of_slider_action |> Sexplib.Sexp.to_string; + +let deserialize = a => + a |> Sexplib.Sexp.of_string |> ZipperBase.slider_action_of_sexp; + let mk = (model): projector_core => (module { @@ -12,7 +18,8 @@ let mk = (model): projector_core => let can_project = _ => true; let placeholder_length = () => 10; let auto_update = _: projector => Slider(model); - let update = - fun - | Set(value) => Slider({value: value}); + let update = (action: string) => + switch (deserialize(action)) { + | Set(value) => Slider({value: value}) + }; }); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 53e5adbc61..7c3f1b4c05 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -20,7 +20,6 @@ module Deco = let tile = id => Id.Map.find(id, M.tiles); let caret = (z: Zipper.t): list(Node.t) => { - print_endline("Deco.caret_point"); let origin = Zipper.caret_point(M.map, z); let shape = Zipper.caret_direction(z); let side = diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index d8f5632986..8d74734d4e 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -6,7 +6,7 @@ module type ProjectorView = { type action; let view: Node.t; - let keymap: Key.t => option(Projector.action(action)); + let keymap: Key.t => option(Projector.action(string)); }; type t = (module ProjectorView); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 2b1af3eca2..a3bba3af73 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -8,21 +8,21 @@ let handle = (id, action): UpdateAction.t => { switch (action) { | Remove => PerformAction(Project(Remove(id))) | UpdateSyntax(f) => PerformAction(Project(UpdateSyntax(id, f))) - | UpdateModel(_action) => + | UpdateModel(action) => //TODO(andrew) - print_endline("TODO: update model"); - // PerformAction( - // Project( - // UpdateModel( - // id, - // p => { - // let (module P) = Projector.to_module(p); - // P.update(action); - // }, - // ), - // ), - // ); - PerformAction(Project(UpdateModel(id, x => x))); + // print_endline("TODO: update model"); + PerformAction( + Project( + UpdateModel( + id, + p => { + let (module P) = Projector.to_module(p); + P.update(action); + }, + ), + ), + ) + // PerformAction(Project(UpdateModel(id, x => x))); }; }; @@ -58,10 +58,19 @@ let wrap = ~attr= Attr.many([ Attr.classes(["projector", Projector.name(p)] @ clss), - JsUtil.stop_mousedown_propagation, DecUtil.abs_style(measurement, ~font_metrics), ]), - [view, PieceDec.convex_shard(~font_metrics, ~measurement)], + [ + div( + ~attr= + Attr.many([ + Attr.classes(["projector-wrapper"] @ clss), + JsUtil.stop_mousedown_propagation, + ]), + [view], + ), + PieceDec.convex_shard(~font_metrics, ~measurement), + ], ); let view = diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index e4d9734144..e701f4524a 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -162,7 +162,7 @@ let code_svg = // (https://bugs.chromium.org/p/chromium/issues/detail?id=424288) that // causes miaslignment between piece decorations and text. // Using a different viewBox size seems to fix this. - let scale = 2.; + let scale = 0.5; create_svg( "svg", ~attr= diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index d2ea6d51e3..f4fb235971 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -1,7 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = (~inject: Projector.action(unit) => Ui_effect.t(unit), syntax) => +let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax) => Node.input( ~attr= Attr.many( @@ -17,7 +17,7 @@ let view = (~inject: Projector.action(unit) => Ui_effect.t(unit), syntax) => [], ); -let keymap = (key: Key.t): option(Projector.action(unit)) => +let keymap = (key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 5349641f9b..47239092b2 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -15,5 +15,5 @@ let mk = ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), [text("⋱")], ); - let keymap = _: option(Projector.action(action)) => None; + let keymap = _: option(Projector.action(string)) => None; }); diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index ecc7c88e03..063e41b660 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -5,10 +5,14 @@ open Node; let view = (~inject, expected_ty: option(Typ.t)) => div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [text(expected_ty |> InferCore.display_ty |> Typ.pretty_print)], + [ + text( + "⇐ " ++ (expected_ty |> InferCore.display_ty |> Typ.pretty_print), + ), + ], ); -let keymap = (key: Key.t): option(Projector.action(unit)) => +let keymap = (key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index 8bede42b7a..9e9caa5d8a 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -1,39 +1,58 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = - ( - ~inject: - Projector.action(ZipperBase.slider_action) => Ui_effect.t(unit), - value: int, - ) => +// let of_mono = (syntax: Piece.t): option(string) => +// switch (syntax) { +// | Tile({label: [l], _}) => Some(l) +// | _ => None +// }; + +// let mk_mono = (sort: Sort.t, string: string): Piece.t => +// string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + +// let state_of = (piece: Piece.t): option(int) => +// piece |> of_mono |> Option.map(int_of_string); + +// let get = (piece: Piece.t): int => +// switch (piece |> of_mono |> Option.map(int_of_string)) { +// | None => failwith("Slider: not integer literal") +// | Some(s) => s +// }; + +// let put = (int: int): Piece.t => int |> string_of_int |> mk_mono(Exp); + +let view = (~inject: Projector.action(_) => Ui_effect.t(unit), value: int) => Node.input( ~attr= Attr.many([ Attr.create("type", "range"), Attr.create("value", string_of_int(value)), Attr.on_input((_evt, new_val) => - inject(UpdateModel(Set(int_of_string(new_val)))) + inject( + UpdateModel(SliderCore.serialize(Set(int_of_string(new_val)))), + ) ), + // => inject(UpdateSyntax(_ => put(int_of_string(new_val)))) ]), [], ); -let keymap = - (key: Key.t): option(Projector.action(ZipperBase.slider_action)) => +let keymap = (key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None }; let mk = - (_syntax: Piece.t, ~inject, model: ZipperBase.slider) + (_syntax: Piece.t, ~inject, _model: ZipperBase.slider) : ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.slider_action; - let view = view(model.value, ~inject); + //let value = get(_syntax); + let value = _model.value; + let view = view(value, ~inject); let keymap = keymap; }); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 978b2f8423..7ecb584a73 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -681,16 +681,18 @@ select { .projector { position: absolute; z-index: 12; - cursor: pointer; display: flex; justify-content: center; + align-items: center; color: #c7b480; } -.projector.indicated { - z-index: 13; +.projector-wrapper { display: flex; justify-content: center; - cursor: pointer !important; + align-items: center; +} +.projector.indicated { + z-index: 13; } .projector > svg { z-index: -1; @@ -706,21 +708,44 @@ select { .projector.indicated.fold { color: black; } +.projector.fold .projector-wrapper { + cursor: pointer; +} /* PROJECTOR: INFER */ .projector.infer { - opacity: 60%; + opacity: 0.5; color: var(--typ-text-color); } +.projector.infer:hover { + opacity: 1; +} .projector.infer > svg { fill: var(--typ-bg-off-color); } +.projector.infer .projector-wrapper div { + cursor: pointer; +} + +/* PROJECTOR: CHECKBOX */ + +.projector.checkbox input { + margin: 0; + filter: sepia(1); + cursor: pointer; +} /* PROJECTOR: SLIDER */ -.projector.slider > input { +.projector.slider .projector-wrapper { + width: 95%; +} +.projector.slider input { + margin: 0; width: 100%; + filter: sepia(1); + cursor: pointer; } /* END PROJECTORS */ diff --git a/src/util/StringUtil.re b/src/util/StringUtil.re index 7ad426df3d..58f80daefa 100644 --- a/src/util/StringUtil.re +++ b/src/util/StringUtil.re @@ -24,3 +24,7 @@ let repeat = (n, s) => String.concat("", List.init(n, _ => s)); let abbreviate = (max_len, s) => String.length(s) > max_len ? String.sub(s, 0, max_len) ++ "..." : s; + +let num_linebreaks = (s: string) => + List.init(String.length(s), String.get(s)) + |> List.fold_left((acc, c) => c == '\n' ? acc + 1 : acc, 0); From ebf6d32e9c3c7deba088efd7e6aee6a88ef97aa9 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 20 Jun 2024 21:06:59 -0400 Subject: [PATCH 064/168] multiline projectors experimentation, partially functional --- src/haz3lcore/Measured.re | 32 ++++++++++++++++--- src/haz3lcore/zipper/Projector.re | 13 ++++++-- src/haz3lcore/zipper/ZipperBase.re | 7 +++- src/haz3lcore/zipper/action/Move.re | 10 +++++- .../zipper/projectors/CheckboxCore.re | 2 +- src/haz3lcore/zipper/projectors/FoldCore.re | 2 +- src/haz3lcore/zipper/projectors/InferCore.re | 7 ++-- src/haz3lcore/zipper/projectors/SliderCore.re | 2 +- src/haz3lweb/view/ProjectorsView.re | 6 +++- 9 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 40976875c6..40e9279a23 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -282,6 +282,24 @@ let is_indented_map = (seg: Segment.t) => { go(seg); }; +let num_linebreaks = (str: string) => { + let rec go = (~count=0, str: string) => + if (str == "") { + count; + } else { + let (c, rest) = ( + String.sub(str, 0, 1), + String.sub(str, 1, String.length(str) - 1), + ); + if (c == "\n") { + go(~count=count + 1, rest); + } else { + go(~count, rest); + }; + }; + go(str); +}; + let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let is_indented = is_indented_map(seg); @@ -377,11 +395,17 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { | Tile(t) => let token = List.nth(t.label); let add_shard = (origin, shard, map) => { + //TODO(andrew): properize let last = - Point.{ - ...origin, - col: origin.col + String.length(token(shard)), - }; + num_linebreaks(token(shard)) == 0 + ? Point.{ + col: origin.col + String.length(token(shard)), + row: origin.row, + } + : Point.{ + col: 0, + row: origin.row + num_linebreaks(token(shard)), + }; let map = map |> add_s(t.id, shard, {origin, last}); (last, map); }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index d2fb6e780e..4e3b10c2b3 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -43,16 +43,23 @@ let name = (p: t): string => | Slider(_) => "slider" }; -let placeholder = (p: t, id: Id.t): syntax => { +let shape = (p: t): shape => { let (module P) = to_module(p); + P.placeholder(); +}; + +let placeholder = (p: t, id: Id.t): syntax => Piece.Tile({ id, - label: [String.make(P.placeholder_length(), ' ')], + label: + switch (shape(p)) { + | Inline(width) => [String.make(width, ' ')] + | Block(height) => [String.make(height, '\n')] + }, mold: Mold.mk_op(Any, []), shards: [0], children: [], }); -}; /* Currently projection is limited to convex pieces */ let minimum_projection_condition = (syntax: syntax): bool => diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index dcba189c73..00f91893f2 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -23,6 +23,11 @@ type checkbox_action = unit; type slider_action = | Set(int); +[@deriving (show({with_path: false}), sexp, yojson)] +type shape = + | Inline(int) + | Block(int); + [@deriving (show({with_path: false}), sexp, yojson)] type projector = | Fold(fold) @@ -53,7 +58,7 @@ module type ProjectorCore = { type action; let projector: projector; let model: model; - let placeholder_length: unit => int; + let placeholder: unit => shape; let can_project: Piece.t => bool; let auto_update: projector_info => projector; let update: string => projector; diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 5473478101..259668971a 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -119,12 +119,20 @@ module Make = (M: Editor.Meta.S) => { ? Direction.Left : Right; let rec go = (prev: t, curr: t) => { let curr_p = caret_point(curr); + let prev_p = caret_point(prev); switch ( Measured.Point.dcomp(d, curr_p.col, goal.col), Measured.Point.dcomp(d, curr_p.row, goal.row), ) { | (Exact, Exact) => curr - | (_, Over) => prev + //TODO(andrew): document + //| (_, Over) when init != caret_point(prev) => curr + | (_, Over) => + switch (Measured.Point.dcomp(d, prev_p.row, goal.row)) { + | Under => curr + | _ => prev + } + //| (_, Over) => prev | (_, Under) | (Under, Exact) => switch (f(d, curr)) { diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 4d0ac409e8..4f650455ff 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -33,7 +33,7 @@ let mk = (model): projector_core => let model = model; let projector = Checkbox(model); let can_project = p => state_of(p) != None; - let placeholder_length = () => 2; + let placeholder = () => Block(4); let auto_update = _: projector => Checkbox(); let update = _action => Checkbox(); }); diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 7dadac4a0d..a9cb9addb6 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -11,7 +11,7 @@ let mk = (): projector_core => let model = (); let projector = Fold(); let can_project = _ => true; - let placeholder_length = () => 2; + let placeholder = () => Inline(2); let auto_update = _: projector => Fold(); let update = _action => Fold(); }); diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index 0bfd536690..a442adcc42 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -28,9 +28,10 @@ let mk = (model: infer): projector_core => | _ => false }; - let placeholder_length = () => - 3 - + (display_ty(model.expected_ty) |> Typ.pretty_print |> String.length); + let len = + display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; + + let placeholder = () => Inline(3 + len); let auto_update = ({info, _}): projector => { print_endline("updating infer projector"); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 9b3cfd4195..fd4dad649d 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -16,7 +16,7 @@ let mk = (model): projector_core => let model = model; let projector = Slider(model); let can_project = _ => true; - let placeholder_length = () => 10; + let placeholder = () => Inline(10); let auto_update = _: projector => Slider(model); let update = (action: string) => switch (deserialize(action)) { diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index a3bba3af73..7ce3db3b91 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -69,7 +69,11 @@ let wrap = ]), [view], ), - PieceDec.convex_shard(~font_metrics, ~measurement), + //TODO(andrew): document + switch (Projector.shape(p)) { + | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) + | Block(_) => div([]) + }, ], ); From ae2a563015a3fb9a8711064e286e3eac62251936 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 23 Jun 2024 01:38:47 -0400 Subject: [PATCH 065/168] bottom bar UI for selecting projector --- src/haz3lcore/zipper/Projector.re | 42 +++++- src/haz3lcore/zipper/ZipperBase.re | 7 +- src/haz3lcore/zipper/action/Action.re | 1 + .../zipper/action/ProjectorPerform.re | 18 ++- .../zipper/projectors/CheckboxCore.re | 2 +- src/haz3lcore/zipper/projectors/SliderCore.re | 11 +- .../zipper/projectors/TextAreaCore.re | 35 +++++ src/haz3lweb/Keyboard.re | 1 + src/haz3lweb/view/CursorInspector.re | 13 +- src/haz3lweb/view/Page.re | 30 ++++- src/haz3lweb/view/ProjectorsView.re | 120 +++++++++++++++++- src/haz3lweb/view/projectors/CheckboxView.re | 2 +- src/haz3lweb/view/projectors/SliderView.re | 20 --- src/haz3lweb/view/projectors/TextAreaView.re | 39 ++++++ src/haz3lweb/www/img/noun-brochure-16464.svg | 4 + src/haz3lweb/www/img/noun-brochure-26888.svg | 4 + src/haz3lweb/www/img/noun-fold-1593402.svg | 15 +++ src/haz3lweb/www/img/noun-fold-1593409.svg | 15 +++ src/haz3lweb/www/img/noun-map-24173.svg | 4 + src/haz3lweb/www/img/noun-map-6188938.svg | 4 + src/haz3lweb/www/img/noun-pa-5383544.svg | 8 ++ src/haz3lweb/www/style.css | 73 +++++++++-- 22 files changed, 406 insertions(+), 62 deletions(-) create mode 100644 src/haz3lcore/zipper/projectors/TextAreaCore.re create mode 100644 src/haz3lweb/view/projectors/TextAreaView.re create mode 100644 src/haz3lweb/www/img/noun-brochure-16464.svg create mode 100644 src/haz3lweb/www/img/noun-brochure-26888.svg create mode 100644 src/haz3lweb/www/img/noun-fold-1593402.svg create mode 100644 src/haz3lweb/www/img/noun-fold-1593409.svg create mode 100644 src/haz3lweb/www/img/noun-map-24173.svg create mode 100644 src/haz3lweb/www/img/noun-map-6188938.svg create mode 100644 src/haz3lweb/www/img/noun-pa-5383544.svg diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 4e3b10c2b3..64aa62ab4a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -13,6 +13,7 @@ let to_module = (p: projector): projector_core => | Infer(model) => InferCore.mk(model) | Checkbox(model) => CheckboxCore.mk(model) | Slider(model) => SliderCore.mk(model) + | TextArea(model) => TextAreaCore.mk(model) }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -23,7 +24,27 @@ type kind = | Fold | Infer | Checkbox - | Slider; + | Slider + | TextArea; + +let name_ = (p: kind): string => + switch (p) { + | Fold => "fold" + | Infer => "type" + | Checkbox => "check" + | Slider => "slide" + | TextArea => "text" + }; + +let of_name = (p: string): kind => + switch (p) { + | "fold" => Fold + | "type" => Infer + | "check" => Checkbox + | "slide" => Slider + | "text" => TextArea + | _ => failwith("Unknown projector kind") + }; /* The kind of syntax data to which projection can apply */ [@deriving (show({with_path: false}), sexp, yojson)] @@ -31,18 +52,24 @@ type syntax = Piece.t; [@deriving (show({with_path: false}), sexp, yojson)] type action('action) = + | Default // Defer to focal DOM element | Remove + | Focus | UpdateSyntax(syntax => syntax) - | UpdateModel('action); + | UpdateModel('action) + | Seq(action('action), action('action)); -let name = (p: t): string => +let kind = (p: t): kind => switch (p) { - | Fold(_) => "fold" - | Infer(_) => "infer" - | Checkbox(_) => "checkbox" - | Slider(_) => "slider" + | Fold(_) => Fold + | Infer(_) => Infer + | Checkbox(_) => Checkbox + | Slider(_) => Slider + | TextArea(_) => TextArea }; +let name = (p: t): string => p |> kind |> name_; + let shape = (p: t): shape => { let (module P) = to_module(p); P.placeholder(); @@ -71,6 +98,7 @@ let init = (f: kind): projector_core => | Infer => InferCore.mk({expected_ty: None}) | Checkbox => CheckboxCore.mk() | Slider => SliderCore.mk({value: 10}) + | TextArea => TextAreaCore.mk({value: "TODO(andrew)"}) }; let create = diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 00f91893f2..5a9e071d17 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -10,6 +10,8 @@ type infer = {expected_ty: option(Typ.t)}; type checkbox = unit; [@deriving (show({with_path: false}), sexp, yojson)] type slider = {value: int}; +[@deriving (show({with_path: false}), sexp, yojson)] +type textarea = {value: string}; /* Projector action types */ @@ -22,6 +24,8 @@ type checkbox_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] type slider_action = | Set(int); +[@deriving (show({with_path: false}), sexp, yojson)] +type textarea_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] type shape = @@ -33,7 +37,8 @@ type projector = | Fold(fold) | Infer(infer) | Checkbox(checkbox) - | Slider(slider); + | Slider(slider) + | TextArea(textarea); [@deriving (show({with_path: false}), sexp, yojson)] module ProjectorMap = { diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 0263966765..4880f97d92 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -47,6 +47,7 @@ type select = type project = | UpdateSyntax(Id.t, Piece.t => Piece.t) | UpdateModel(Id.t, Projector.t => Projector.t) + | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) | Remove(Id.t); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index f4f2bf9c6c..9074a521d6 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -17,19 +17,27 @@ let set = (id: Id.t, p: option(t), z: ZipperBase.t) => { projectors: Map.update(id, _ => p, z.projectors), }; +let add = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => + switch (Projector.create(p, piece, id, info_map)) { + | None => Error(Action.Failure.Cant_project) + | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) + }; + let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => switch (Map.mem(id, z.projectors)) { - | false => - switch (Projector.create(p, piece, id, info_map)) { - | None => Error(Action.Failure.Cant_project) - | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) - } + | false => add(id, z, info_map, p, piece, d, rel) | true => Ok(set(id, None, z)) }; let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? switch (a) { + | SetIndicated(p) => + switch (Indicated.for_index(z)) { + | None => Error(Action.Failure.Cant_project) + | Some((piece, d, rel)) => + add(Piece.id(piece), z, info_map, p, piece, d, rel) + } | ToggleIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 4f650455ff..ce021944b7 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -33,7 +33,7 @@ let mk = (model): projector_core => let model = model; let projector = Checkbox(model); let can_project = p => state_of(p) != None; - let placeholder = () => Block(4); + let placeholder = () => Inline(2); let auto_update = _: projector => Checkbox(); let update = _action => Checkbox(); }); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index fd4dad649d..f82965dfa5 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -6,6 +6,15 @@ let serialize = a => let deserialize = a => a |> Sexplib.Sexp.of_string |> ZipperBase.slider_action_of_sexp; +let of_mono = (syntax: Piece.t): option(string) => + switch (syntax) { + | Tile({label: [l], _}) => Some(l) + | _ => None + }; + +let state_of = (piece: Piece.t): option(int) => + piece |> of_mono |> Option.map(int_of_string); + let mk = (model): projector_core => (module { @@ -15,7 +24,7 @@ let mk = (model): projector_core => type action = ZipperBase.slider_action; let model = model; let projector = Slider(model); - let can_project = _ => true; + let can_project = p => state_of(p) != None; let placeholder = () => Inline(10); let auto_update = _: projector => Slider(model); let update = (action: string) => diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re new file mode 100644 index 0000000000..239cf036a2 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -0,0 +1,35 @@ +open ZipperBase; + +let of_mono = (syntax: Piece.t): option(string) => + switch (syntax) { + | Tile({label: [l], _}) => Some(l) + | _ => None + }; + +let mk_mono = (sort: Sort.t, string: string): Piece.t => + string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + +let state_of = (piece: Piece.t): option(string) => piece |> of_mono; + +let get = (piece: Piece.t): string => + switch (piece |> of_mono) { + | None => failwith("TextArea: not string literal") + | Some(s) => s + }; + +let put = (s: string): Piece.t => s |> mk_mono(Exp); + +let mk = (model): projector_core => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = ZipperBase.textarea; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = ZipperBase.textarea_action; + let model = model; + let projector = TextArea(model); + let can_project = _ => true; + let placeholder = () => Block(4); + let auto_update = _: projector => TextArea(model); + let update = _ => TextArea(model); + }); diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 52828a2795..7d06571cc2 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -113,6 +113,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "†" => Some(PerformAction(Project(ToggleIndicated(Infer)))) | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox)))) | "ß" => Some(PerformAction(Project(ToggleIndicated(Slider)))) + | "∑" => Some(PerformAction(Project(ToggleIndicated(TextArea)))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 3cb7800964..99fd28b880 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -271,6 +271,13 @@ let inspector_view = (~inject, ~settings, ci): Node.t => [view_of_info(~inject, ~settings, ci)], ); +let _projectors_view = (~inject, editor: Editor.t, ci: Info.t) => + div( + ~attr=clss(["id"]), + [text(String.sub(Id.to_string(Info.id_of(ci)), 0, 4))] + @ Option.to_list(ProjectorsView.ci(~inject, editor)), + ); + let view = (~inject, ~settings: Settings.t, editor, cursor_info: option(Info.t)) => { let bar_view = div(~attr=Attr.id("bottom-bar")); @@ -287,11 +294,7 @@ let view = | Some(ci) => bar_view([ inspector_view(~inject, ~settings, ci), - div( - ~attr=clss(["id"]), - [text(String.sub(Id.to_string(Info.id_of(ci)), 0, 4))] - @ Option.to_list(ProjectorsView.ci(~inject, editor)), - ), + ProjectorsView.panel(~inject, editor, ci), ]) }; }; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index de04f97727..c55bb984cd 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -13,18 +13,42 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); switch (ProjectorsView.key_handler(editor, ~inject, key)) { + | Some(PerformAction(Project(Remove(id)))) when id == Id.invalid => + //TODO(andrew): cleanup + Ignore | Some(action) => - Many([Prevent_default, Stop_propagation, inject(action)]) + Many([ + Prevent_default, + // Stop_propagation, + inject(action), + ]) | None => switch (Keyboard.handle_key_event(key)) { | None => Ignore | Some(action) => - Many([Prevent_default, Stop_propagation, inject(action)]) + Many([ + Prevent_default, + // Stop_propagation, + inject(action), + ]) } }; }; + let keypress_handler = + (~inject, ~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)) + : Effect.t(unit) => { + open Effect; //TODO(andrew): cleanup + + let key = Key.mk(dir, evt); + let editor = Editors.get_editor(model.editors); + switch (ProjectorsView.key_handler(editor, ~inject, key)) { + | Some(PerformAction(Project(Remove(id)))) when id == Id.invalid => + Ignore + | _ => Effect.Prevent_default + }; + }; [ - Attr.on_keypress(_ => Effect.Prevent_default), + Attr.on_keypress(keypress_handler(~inject, ~dir=KeyDown)), Attr.on_keyup(key_handler(~inject, ~dir=KeyUp)), Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), /* safety handler in case mousedown overlay doesn't catch it */ diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 7ce3db3b91..26ca074a95 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -3,9 +3,16 @@ open Virtual_dom.Vdom; open Node; open Projector; open Util.OptUtil.Syntax; +open Util.Web; -let handle = (id, action): UpdateAction.t => { +let rec handle = (id, action): UpdateAction.t => { switch (action) { + | Focus => + //TODO(andrew): end up on nearest side + PerformAction(Jump(TileId(id))) + | Default => + //TODO(andrew): no-op + PerformAction(Project(Remove(Id.invalid))) | Remove => PerformAction(Project(Remove(id))) | UpdateSyntax(f) => PerformAction(Project(UpdateSyntax(id, f))) | UpdateModel(action) => @@ -23,6 +30,7 @@ let handle = (id, action): UpdateAction.t => { ), ) // PerformAction(Project(UpdateModel(id, x => x))); + | Seq(a1, _a2) => handle(id, a1) //TODO }; }; @@ -43,11 +51,15 @@ let to_module = CheckboxView.mk(syntax, model, ~inject=a => inject(handle(id, a))) | Slider(model) => SliderView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + | TextArea(model) => + TextAreaView.mk(syntax, model, ~inject=a => inject(handle(id, a))) }; }; let wrap = ( + ~inject as _, + ~id as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, p: Projector.t, @@ -57,6 +69,7 @@ let wrap = div( ~attr= Attr.many([ + JsUtil.stop_mousedown_propagation, Attr.classes(["projector", Projector.name(p)] @ clss), DecUtil.abs_style(measurement, ~font_metrics), ]), @@ -65,7 +78,10 @@ let wrap = ~attr= Attr.many([ Attr.classes(["projector-wrapper"] @ clss), - JsUtil.stop_mousedown_propagation, + // Attr.on_mousedown(_ => { + // print_endline("WRAPPPER"); + // inject(Update.PerformAction(Jump(TileId(id)))); + // }), ]), [view], ), @@ -90,7 +106,7 @@ let view = let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module PV) = to_module(id, syntax, p, ~inject); - wrap(~font_metrics, ~measurement, p, [], PV.view); + wrap(~inject, ~id, ~font_metrics, ~measurement, p, [], PV.view); }; let indication_view = @@ -107,7 +123,7 @@ let indication_view = let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module PV) = to_module(id, syntax, p, ~inject); - wrap(~font_metrics, ~measurement, p, ["indicated"], PV.view); + wrap(~font_metrics, ~inject, ~id, ~measurement, p, ["indicated"], PV.view); }; let view_all = @@ -157,3 +173,99 @@ let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { [text(String.sub(Projector.name(p), 0, 1))], ); }; + +let cur = (editor: Editor.t) => { + let+ (_id, p) = indicated_proj_ed(editor); + Projector.kind(p); +}; + +let id = (editor: Editor.t) => { + switch (indicated_proj_ed(editor)) { + | None => Id.invalid + | Some((id, _)) => id + }; +}; + +let option_view = (name, n) => + option( + ~attr=n == name ? Attr.create("selected", "selected") : Attr.many([]), + [text(n)], + ); + +let set = (k: Projector.kind) => + Update.PerformAction(Project(SetIndicated(k))); + +let remove = (id: Id.t) => Update.PerformAction(Project(Remove(id))); + +let applicable_projectors = (ci: Info.t) => + ( + switch (Info.cls_of(ci)) { + | Exp(Bool) + | Pat(Bool) => [Checkbox] + | Exp(Int) + | Pat(Int) => [Slider] + | Exp(String) + | Pat(String) => [TextArea] + | _ => [] + } + ) + @ [Fold] + @ ( + switch (ci) { + | InfoExp(_) + | InfoPat(_) => [Infer] + | _ => [] + } + ); + +let toggle_view = (~inject, ci, id, active: bool) => + div( + ~attr= + Attr.many([ + clss(["toggle-switch"] @ (active ? ["active"] : [])), + Attr.on_click(_ => + inject( + active + ? remove(id) + : applicable_projectors(ci) != [] + ? set(List.hd(applicable_projectors(ci))) : remove(id), + ) + ), + ]), + [ + div( + ~attr=clss(["toggle-knob"]), + [ + Node.create("img", ~attr=Attr.src("img/noun-fold-1593402.svg"), []), + ], + ), + ], + ); + +let currently_selected = editor => + option_view( + switch (cur(editor)) { + | None => "Fold" + | Some(k) => Projector.name_(k) + }, + ); + +let panel = (~inject, editor: Editor.t, ci: Info.t) => { + div( + ~attr=Attr.id("projectors"), + [ + toggle_view(~inject, ci, id(editor), cur(editor) != None), + Node.select( + ~attr= + Attr.many([ + Attr.on_change((_, name) => + inject(set(Projector.of_name(name))) + ), + ]), + applicable_projectors(ci) + |> List.map((k: Projector.kind) => Projector.name_(k)) + |> List.map(currently_selected(editor)), + ), + ], + ); +}; diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index f4fb235971..4a7815ba8b 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -10,7 +10,7 @@ let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax) => Attr.on_input((_, _) => inject(UpdateSyntax(CheckboxCore.toggle)) ), - JsUtil.stop_mousedown_propagation, + //JsUtil.stop_mousedown_propagation, ] @ (CheckboxCore.get(syntax) ? [Attr.checked] : []), ), diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index 9e9caa5d8a..6e7d9be305 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -1,26 +1,6 @@ open Haz3lcore; open Virtual_dom.Vdom; -// let of_mono = (syntax: Piece.t): option(string) => -// switch (syntax) { -// | Tile({label: [l], _}) => Some(l) -// | _ => None -// }; - -// let mk_mono = (sort: Sort.t, string: string): Piece.t => -// string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); - -// let state_of = (piece: Piece.t): option(int) => -// piece |> of_mono |> Option.map(int_of_string); - -// let get = (piece: Piece.t): int => -// switch (piece |> of_mono |> Option.map(int_of_string)) { -// | None => failwith("Slider: not integer literal") -// | Some(s) => s -// }; - -// let put = (int: int): Piece.t => int |> string_of_int |> mk_mono(Exp); - let view = (~inject: Projector.action(_) => Ui_effect.t(unit), value: int) => Node.input( ~attr= diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re new file mode 100644 index 0000000000..2c3fe6d9f7 --- /dev/null +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -0,0 +1,39 @@ +open Haz3lcore; +open Virtual_dom.Vdom; + +let view = + (~inject: Projector.action(_) => Ui_effect.t(unit), value: string) => + Node.textarea( + ~attr= + Attr.many([ + Attr.create("rows", "4"), + Attr.create("cols", "30"), + Attr.on_mousedown(_ => inject(Focus)), + Attr.on_input((_evt, new_val) => + inject( + UpdateSyntax( + _ => new_val |> Form.string_quote |> TextAreaCore.put, + ), + ) + ), + ]), + [Node.text(value)], + ); + +let keymap = (key: Key.t): option(Projector.action(string)) => + switch (key) { + | _ => Some(Default) + }; + +let mk = + (~inject, syntax: Piece.t, _model: ZipperBase.textarea) + : ProjectorViewModule.t => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type action = ZipperBase.slider_action; + + let value = syntax |> TextAreaCore.get |> Form.strip_quotes; + let view = view(value, ~inject); + let keymap = keymap; + }); diff --git a/src/haz3lweb/www/img/noun-brochure-16464.svg b/src/haz3lweb/www/img/noun-brochure-16464.svg new file mode 100644 index 0000000000..332d222366 --- /dev/null +++ b/src/haz3lweb/www/img/noun-brochure-16464.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/haz3lweb/www/img/noun-brochure-26888.svg b/src/haz3lweb/www/img/noun-brochure-26888.svg new file mode 100644 index 0000000000..974a5990a8 --- /dev/null +++ b/src/haz3lweb/www/img/noun-brochure-26888.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/haz3lweb/www/img/noun-fold-1593402.svg b/src/haz3lweb/www/img/noun-fold-1593402.svg new file mode 100644 index 0000000000..6cd4c9d9ba --- /dev/null +++ b/src/haz3lweb/www/img/noun-fold-1593402.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/haz3lweb/www/img/noun-fold-1593409.svg b/src/haz3lweb/www/img/noun-fold-1593409.svg new file mode 100644 index 0000000000..db6149dfff --- /dev/null +++ b/src/haz3lweb/www/img/noun-fold-1593409.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/src/haz3lweb/www/img/noun-map-24173.svg b/src/haz3lweb/www/img/noun-map-24173.svg new file mode 100644 index 0000000000..bcfaa12eea --- /dev/null +++ b/src/haz3lweb/www/img/noun-map-24173.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/haz3lweb/www/img/noun-map-6188938.svg b/src/haz3lweb/www/img/noun-map-6188938.svg new file mode 100644 index 0000000000..cc83ede9c4 --- /dev/null +++ b/src/haz3lweb/www/img/noun-map-6188938.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/haz3lweb/www/img/noun-pa-5383544.svg b/src/haz3lweb/www/img/noun-pa-5383544.svg new file mode 100644 index 0000000000..7333419486 --- /dev/null +++ b/src/haz3lweb/www/img/noun-pa-5383544.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 7ecb584a73..6adb76738d 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -709,39 +709,46 @@ select { color: black; } .projector.fold .projector-wrapper { - cursor: pointer; -} + cursor: pointer; +} /* PROJECTOR: INFER */ -.projector.infer { +.projector.type { opacity: 0.5; color: var(--typ-text-color); } -.projector.infer:hover { +.projector.type:hover { opacity: 1; } -.projector.infer > svg { +.projector.type > svg { fill: var(--typ-bg-off-color); } -.projector.infer .projector-wrapper div { +.projector.type .projector-wrapper div { cursor: pointer; } /* PROJECTOR: CHECKBOX */ -.projector.checkbox input { +.projector.check input { margin: 0; filter: sepia(1); cursor: pointer; } +/* PROJECTOR: TEXTAREA */ + +.projector.text textarea { + filter: sepia(1); + caret-color: red; +} + /* PROJECTOR: SLIDER */ -.projector.slider .projector-wrapper { +.projector.slide .projector-wrapper { width: 95%; } -.projector.slider input { +.projector.slide input { margin: 0; width: 100%; filter: sepia(1); @@ -1545,14 +1552,52 @@ svg.tile-selected { mix-blend-mode: luminosity; } -#bottom-bar .id { +#bottom-bar #projectors { display: flex; - gap: 1em; + gap: 1.3em; font-size: 0.6em; align-items: center; - padding-left: 1em; + padding-left: 1.3em; padding-right: 1em; white-space: nowrap; + border-radius: 2em 0 0 0; + outline: 0.3px solid #ada187; + background-color: #ffde88; +} + +#bottom-bar #projectors img { + width: 1.4em; +} + +#bottom-bar #projectors select { + background: none; + border: none; + font-size: 1.2em; + color: #807350; + padding: 0; + text-transform: capitalize; + width: 4.5em; +} + +#bottom-bar #projectors option { + font-size: 1em; + color: #807350; + +} + +#bottom-bar #projectors .toggle-switch { + height: 2em; + width: 3.5em; + display: flex; + align-items: center; +} + +#bottom-bar #projectors .toggle-knob { + width: 2em; + height: 90%; +} +#bottom-bar #projectors .toggle-switch.active .toggle-knob { + margin-left: 1.3em; } .bottom-bar .id-and-class .syntax-class { @@ -2426,11 +2471,11 @@ svg.expandable path { margin-bottom: 1em; } -.slide { +/* .slide { margin-bottom: 2em; min-width: 7.5in; width: 7.5in; -} +} */ .slide h1 { margin-top: 0; From b2631b154a8446f095d8a9ec6b1391e9905e9ccc Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 23 Jun 2024 17:09:36 -0400 Subject: [PATCH 066/168] un/escape string linebreaks outside of textarea projector --- src/haz3lcore/zipper/projectors/InferCore.re | 9 +++++---- src/haz3lcore/zipper/projectors/TextAreaCore.re | 14 ++++++++++++-- src/haz3lweb/view/projectors/InferView.re | 6 +----- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index a442adcc42..b8f0f88dad 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -12,6 +12,9 @@ let expected_ty = (info: option(Info.t)) => | _ => Unknown(Internal) }; +let display = expected_ty => + "⋱ ⇐ " ++ (expected_ty |> display_ty |> Typ.pretty_print); + let mk = (model: infer): projector_core => (module { @@ -28,10 +31,8 @@ let mk = (model: infer): projector_core => | _ => false }; - let len = - display_ty(model.expected_ty) |> Typ.pretty_print |> String.length; - - let placeholder = () => Inline(3 + len); + let placeholder = () => + Inline((model.expected_ty |> display |> String.length) - 2); let auto_update = ({info, _}): projector => { print_endline("updating infer projector"); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 239cf036a2..41c78eae0b 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,13 +1,23 @@ open ZipperBase; +/* Function to escape linebreaks */ +let escape_linebreaks = (str: string): string => { + Re.Str.global_replace(Re.Str.regexp("\n"), "\\n", str); +}; + +/* Function to unescape linebreaks */ +let unescape_linebreaks = (str: string): string => { + Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n", str); +}; + let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { - | Tile({label: [l], _}) => Some(l) + | Tile({label: [l], _}) => Some(unescape_linebreaks(l)) | _ => None }; let mk_mono = (sort: Sort.t, string: string): Piece.t => - string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + string |> escape_linebreaks |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); let state_of = (piece: Piece.t): option(string) => piece |> of_mono; diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index 063e41b660..2a9cda2c32 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -5,11 +5,7 @@ open Node; let view = (~inject, expected_ty: option(Typ.t)) => div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), - [ - text( - "⇐ " ++ (expected_ty |> InferCore.display_ty |> Typ.pretty_print), - ), - ], + [text(InferCore.display(expected_ty))], ); let keymap = (key: Key.t): option(Projector.action(string)) => From adfdd41e67c60844793e153c7ec10555d3bdbbc0 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 23 Jun 2024 18:38:57 -0400 Subject: [PATCH 067/168] fixed crash due to measured rows miscalibration for multi-line tokens --- src/haz3lcore/Measured.re | 23 +++++++++++++++++------ src/haz3lweb/view/dec/PieceDec.re | 17 ++++++++++++----- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 40e9279a23..ea34f91bef 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -395,18 +395,29 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { | Tile(t) => let token = List.nth(t.label); let add_shard = (origin, shard, map) => { - //TODO(andrew): properize + //TODO(andrew): properize or document + let num_lb = num_linebreaks(token(shard)); let last = - num_linebreaks(token(shard)) == 0 + num_lb == 0 ? Point.{ col: origin.col + String.length(token(shard)), row: origin.row, } - : Point.{ - col: 0, - row: origin.row + num_linebreaks(token(shard)), - }; + : Point.{col: 0, row: origin.row + num_lb}; let map = map |> add_s(t.id, shard, {origin, last}); + let row_indent = container_indent + contained_indent; + let rec add_n_rows = (n, map) => + switch (n) { + | 0 => map + | _ => + map + |> add_n_rows(n - 1) + |> add_row( + origin.row + n - 1, + {indent: row_indent, max_col: origin.col}, + ) + }; + let map = num_lb == 0 ? map : map |> add_n_rows(num_lb); (last, map); }; let (last, map) = diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 15f5eadeac..4a9e6a3d82 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -292,11 +292,18 @@ let uni_lines = ]; } else if (r.row > m_last.last.row) { let min_col = - Measured.Rows.min_col( - ListUtil.range(~lo=m_last.last.row, r.row + 1), - rows, - ) - |> min(m_last.last.col); + try( + Measured.Rows.min_col( + ListUtil.range(~lo=m_last.last.row, r.row + 1), + rows, + ) + |> min(m_last.last.col) + ) { + | _ => + //this crashes when manuvering in the presence of multiline tokens + print_endline("TODO(andrew)"); + 0; + }; // let r_indent = Measured.Rows.find(r.row, rows).indent; let (_, m_flast) = { let shard_rows = Measured.Shards.split_by_row(shards); From e33294c1e29138426f1d0c5d240f15b7f21eaa61 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 24 Jun 2024 15:42:18 -0400 Subject: [PATCH 068/168] better textarea surface UI --- src/haz3lcore/Measured.re | 11 ++++--- src/haz3lcore/zipper/Projector.re | 4 ++- src/haz3lcore/zipper/ZipperBase.re | 2 +- .../zipper/projectors/TextAreaCore.re | 3 +- src/haz3lweb/view/Code.re | 17 +++++++--- src/haz3lweb/view/Deco.re | 1 + src/haz3lweb/view/ProjectorViewModule.re | 2 +- src/haz3lweb/view/ProjectorsView.re | 6 ++-- src/haz3lweb/view/dec/PieceDec.re | 17 +++------- src/haz3lweb/view/projectors/CheckboxView.re | 2 +- src/haz3lweb/view/projectors/FoldView.re | 2 +- src/haz3lweb/view/projectors/InferView.re | 2 +- src/haz3lweb/view/projectors/SliderView.re | 2 +- src/haz3lweb/view/projectors/TextAreaView.re | 15 ++++++--- src/haz3lweb/www/style.css | 33 ++++++++++++++++++- 15 files changed, 84 insertions(+), 35 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index ea34f91bef..a8e77dc023 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -393,17 +393,20 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let map = map |> add_g(g, {origin, last}); (contained_indent, last, map); | Tile(t) => - let token = List.nth(t.label); let add_shard = (origin, shard, map) => { + let token = List.nth(t.label, shard); //TODO(andrew): properize or document - let num_lb = num_linebreaks(token(shard)); + let num_lb = num_linebreaks(token); let last = num_lb == 0 ? Point.{ - col: origin.col + String.length(token(shard)), + col: origin.col + String.length(token), row: origin.row, } - : Point.{col: 0, row: origin.row + num_lb}; + : Point.{ + col: origin.col + String.length(token) - num_lb, + row: origin.row + num_lb, + }; let map = map |> add_s(t.id, shard, {origin, last}); let row_indent = container_indent + contained_indent; let rec add_n_rows = (n, map) => diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 64aa62ab4a..ba92240821 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -81,7 +81,9 @@ let placeholder = (p: t, id: Id.t): syntax => label: switch (shape(p)) { | Inline(width) => [String.make(width, ' ')] - | Block(height) => [String.make(height, '\n')] + | Block({row, col}) => [ + String.make(row, '\n') ++ String.make(col, ' '), + ] }, mold: Mold.mk_op(Any, []), shards: [0], diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 5a9e071d17..8154eec0c3 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -30,7 +30,7 @@ type textarea_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] type shape = | Inline(int) - | Block(int); + | Block(Measured.Point.t); [@deriving (show({with_path: false}), sexp, yojson)] type projector = diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 41c78eae0b..fc69a86954 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -39,7 +39,8 @@ let mk = (model): projector_core => let model = model; let projector = TextArea(model); let can_project = _ => true; - let placeholder = () => Block(4); + //TODO(andrew): fudge factors below + let placeholder = () => Block({row: 4 - 1, col: 20 + 2}); let auto_update = _: projector => TextArea(model); let update = _ => TextArea(model); }); diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 191db619be..7ae4ec1f87 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -7,7 +7,7 @@ open Util.Web; let of_delim' = Core.Memo.general( ~cache_size_bound=10000, - ((label, is_in_buffer, sort, is_consistent, is_complete, i)) => { + ((label, is_in_buffer, sort, is_consistent, is_complete, indent, i)) => { let cls = switch (label) { | _ when is_in_buffer => "in-buffer" @@ -19,23 +19,30 @@ let of_delim' = }; let plurality = List.length(label) == 1 ? "mono" : "poly"; let label = is_in_buffer ? AssistantExpander.mark(label) : label; + let token = List.nth(label, i); + /* Add indent to multiline tokens: */ + let token = + StringUtil.num_linebreaks(token) == 0 + ? token : token ++ StringUtil.repeat(indent, Unicode.nbsp); [ span( ~attr= Attr.classes(["token", cls, Sort.to_string(sort), plurality]), - [Node.text(List.nth(label, i))], + [Node.text(token)], ), ]; }, ); let of_delim = - (is_in_buffer, is_consistent, t: Piece.tile, i: int): list(Node.t) => + (is_in_buffer, is_consistent, indent, t: Piece.tile, i: int) + : list(Node.t) => of_delim'(( t.label, is_in_buffer, t.mold.out, is_consistent, Tile.is_complete(t), + indent, i, )); @@ -105,7 +112,9 @@ module Text = (M: { let is_consistent = Sort.consistent(t.mold.out, expected_sort); let is_in_buffer = List.mem(t.id, buffer_ids); Aba.mk(t.shards, children_and_sorts) - |> Aba.join(of_delim(is_in_buffer, is_consistent, t), ((seg, sort)) => + |> Aba.join( + of_delim(is_in_buffer, is_consistent, m(Tile(t)).origin.col, t), + ((seg, sort)) => of_segment(buffer_ids, false, sort, seg) ) |> List.concat; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 7c3f1b4c05..ae53a3ddf6 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -303,6 +303,7 @@ module Deco = let indication_deco = (~inject, z: Zipper.t) => switch (Indicated.index(z)) { | Some(id) => + //TODO(andrew): do this in a way that doesn't duplicate the view switch ( ProjectorsView.indication_view( id, diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 8d74734d4e..a388edd735 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -6,7 +6,7 @@ module type ProjectorView = { type action; let view: Node.t; - let keymap: Key.t => option(Projector.action(string)); + let keymap: (Util.Direction.t, Key.t) => option(Projector.action(string)); }; type t = (module ProjectorView); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 26ca074a95..63267873e2 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -69,7 +69,7 @@ let wrap = div( ~attr= Attr.many([ - JsUtil.stop_mousedown_propagation, + // JsUtil.stop_mousedown_propagation, Attr.classes(["projector", Projector.name(p)] @ clss), DecUtil.abs_style(measurement, ~font_metrics), ]), @@ -77,6 +77,7 @@ let wrap = div( ~attr= Attr.many([ + JsUtil.stop_mousedown_propagation, Attr.classes(["projector-wrapper"] @ clss), // Attr.on_mousedown(_ => { // print_endline("WRAPPPER"); @@ -160,7 +161,8 @@ let key_handler = | Some((id, p)) => let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let (module PV) = to_module(id, syntax, p, ~inject); - let+ action = PV.keymap(key); + let* (_, d, _) = Indicated.piece(editor.state.zipper); + let+ action = PV.keymap(d, key); handle(id, action); }; diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 4a9e6a3d82..15f5eadeac 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -292,18 +292,11 @@ let uni_lines = ]; } else if (r.row > m_last.last.row) { let min_col = - try( - Measured.Rows.min_col( - ListUtil.range(~lo=m_last.last.row, r.row + 1), - rows, - ) - |> min(m_last.last.col) - ) { - | _ => - //this crashes when manuvering in the presence of multiline tokens - print_endline("TODO(andrew)"); - 0; - }; + Measured.Rows.min_col( + ListUtil.range(~lo=m_last.last.row, r.row + 1), + rows, + ) + |> min(m_last.last.col); // let r_indent = Measured.Rows.find(r.row, rows).indent; let (_, m_flast) = { let shard_rows = Measured.Shards.split_by_row(shards); diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index 4a7815ba8b..818e9c5a1f 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -17,7 +17,7 @@ let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax) => [], ); -let keymap = (key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 47239092b2..96870d3ce1 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -15,5 +15,5 @@ let mk = ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), [text("⋱")], ); - let keymap = _: option(Projector.action(string)) => None; + let keymap = (_, _): option(Projector.action(string)) => None; }); diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index 2a9cda2c32..19178d0a7e 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -8,7 +8,7 @@ let view = (~inject, expected_ty: option(Typ.t)) => [text(InferCore.display(expected_ty))], ); -let keymap = (key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index 6e7d9be305..35dc28ded8 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -17,7 +17,7 @@ let view = (~inject: Projector.action(_) => Ui_effect.t(unit), value: int) => [], ); -let keymap = (key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(Projector.action(string)) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index 2c3fe6d9f7..81fd0c34ae 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -6,8 +6,9 @@ let view = Node.textarea( ~attr= Attr.many([ - Attr.create("rows", "4"), - Attr.create("cols", "30"), + //TODO(andrew): fudge factors below + // Attr.create("rows", "4"), + // Attr.create("cols", "21"), Attr.on_mousedown(_ => inject(Focus)), Attr.on_input((_evt, new_val) => inject( @@ -20,8 +21,14 @@ let view = [Node.text(value)], ); -let keymap = (key: Key.t): option(Projector.action(string)) => - switch (key) { +let keymap = (_direction, key: Key.t): option(Projector.action(string)) => + switch (key.key) { + | D( + "ArrowLeft" | "ArrowRight" | "ArrowUp" | "ArrowDown" | "Enter" | + "Backspace" | + " ", + ) => + None | _ => Some(Default) }; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 6adb76738d..e25deda569 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -738,9 +738,40 @@ select { /* PROJECTOR: TEXTAREA */ +.projector.text { + display: flex; + justify-content: left; + align-items: start; +} + +.projector.text .projector-wrapper { + height: 100%; + width: 100%; + display: flex; + justify-content: start; + align-items: start; +} + .projector.text textarea { - filter: sepia(1); + /* filter: sepia(1); */ + height: 100%; + width: 100%; caret-color: red; + padding: 0; + line-height: var(--line-height); + font-family: "Source Code Pro", monospace; + font-size: inherit; + border: none; + border-radius: 0.1em; + outline: 1px solid #a69460; + background-color: #f0e7d6; + color: #8c7e62; + +} + +.projector.text textarea::selection { + color: black; + background-color: var(--selection-color); } /* PROJECTOR: SLIDER */ From dc33d8a4b59f8bfbe7634f2529efa7b369358b0a Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 24 Jun 2024 15:59:39 -0400 Subject: [PATCH 069/168] fixed leftward movement onto projector directly adjacent to following token causes caret subposition bug --- src/haz3lcore/zipper/action/Move.re | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 259668971a..81841d3e03 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -79,7 +79,10 @@ module Make = (M: Editor.Meta.S) => { (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) /* Need this case to avoid moving sub-caret onto projectors: */ - | _ when Projector.Move.go(d, z) != None => Zipper.move(d, z) + // | (Right, _, _) when Projector.Move.go(d, z) != None => + // Zipper.move(d, z) + | (_, Outer, _) when Projector.Move.go(d, z) != None => + Zipper.move(d, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) From 6a2a80c8784fd8fbe3c22578dbf2a5377e1eb1a1 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 24 Jun 2024 17:14:52 -0400 Subject: [PATCH 070/168] fixed bug with multiline projectors causing selection decorations of surrounding forms to be misaligned --- src/haz3lcore/Measured.re | 22 ++-------------------- src/haz3lcore/zipper/action/Move.re | 10 ++++------ src/haz3lweb/view/Deco.re | 8 ++++++-- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index a8e77dc023..c2585c3e87 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -282,24 +282,6 @@ let is_indented_map = (seg: Segment.t) => { go(seg); }; -let num_linebreaks = (str: string) => { - let rec go = (~count=0, str: string) => - if (str == "") { - count; - } else { - let (c, rest) = ( - String.sub(str, 0, 1), - String.sub(str, 1, String.length(str) - 1), - ); - if (c == "\n") { - go(~count=count + 1, rest); - } else { - go(~count, rest); - }; - }; - go(str); -}; - let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let is_indented = is_indented_map(seg); @@ -394,9 +376,9 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { (contained_indent, last, map); | Tile(t) => let add_shard = (origin, shard, map) => { - let token = List.nth(t.label, shard); //TODO(andrew): properize or document - let num_lb = num_linebreaks(token); + let token = List.nth(t.label, shard); + let num_lb = StringUtil.num_linebreaks(token); let last = num_lb == 0 ? Point.{ diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 81841d3e03..f6286a5a63 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -79,8 +79,6 @@ module Make = (M: Editor.Meta.S) => { (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) /* Need this case to avoid moving sub-caret onto projectors: */ - // | (Right, _, _) when Projector.Move.go(d, z) != None => - // Zipper.move(d, z) | (_, Outer, _) when Projector.Move.go(d, z) != None => Zipper.move(d, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => @@ -122,20 +120,20 @@ module Make = (M: Editor.Meta.S) => { ? Direction.Left : Right; let rec go = (prev: t, curr: t) => { let curr_p = caret_point(curr); - let prev_p = caret_point(prev); switch ( Measured.Point.dcomp(d, curr_p.col, goal.col), Measured.Point.dcomp(d, curr_p.row, goal.row), ) { | (Exact, Exact) => curr //TODO(andrew): document - //| (_, Over) when init != caret_point(prev) => curr + //TODO(andrew): pick new goal to get right col + //| (_, Over) => prev | (_, Over) => + let prev_p = caret_point(prev); switch (Measured.Point.dcomp(d, prev_p.row, goal.row)) { | Under => curr | _ => prev - } - //| (_, Over) => prev + }; | (_, Under) | (Under, Exact) => switch (f(d, curr)) { diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index ae53a3ddf6..19ba51fc09 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -76,11 +76,15 @@ module Deco = let tile_shards = Measured.find_shards(~msg="sel_of_tile", t, M.map) |> List.filter(((i, _)) => List.mem(i, t.shards)) - |> List.map(((index, measurement)) => + |> List.map(((index, measurement)) => { + let token = List.nth(t.label, index); + // Adjustment for multi-line tokens e.g. projector placeholders + let num_lb = StringUtil.num_linebreaks(token); [ Some(sel_shard_svg(~start_shape, ~index, measurement, Tile(t))), ] - ); + @ List.init(num_lb, _ => None); + }); let shape_at = index => snd(Mold.nibs(~index, t.mold)).shape; let children_shards = t.children |> List.mapi(index => sel_of_segment(shape_at(index))); From 9b338c9dd2a7c05e575cd8f8eb32d1fc0ae0ea3d Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 24 Jun 2024 17:24:33 -0400 Subject: [PATCH 071/168] move selected deco above projector backing --- src/haz3lweb/www/style.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index e25deda569..089f0b2294 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -680,7 +680,7 @@ select { .projector { position: absolute; - z-index: 12; + display: flex; justify-content: center; align-items: center; @@ -688,6 +688,7 @@ select { } .projector-wrapper { display: flex; + z-index: 12; justify-content: center; align-items: center; } @@ -695,7 +696,7 @@ select { z-index: 13; } .projector > svg { - z-index: -1; + z-index: 1; fill: #f0e7d6; } .projector.indicated > svg { @@ -715,7 +716,7 @@ select { /* PROJECTOR: INFER */ .projector.type { - opacity: 0.5; + /* opacity: 0.5; */ color: var(--typ-text-color); } .projector.type:hover { From 22c445a8aedbb74d68abeab478229b3691cd4a86 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 25 Jun 2024 01:16:13 -0400 Subject: [PATCH 072/168] implemented side caret override for multiline projectors. much better textarea layout --- src/haz3lcore/zipper/ZipperBase.re | 6 +- src/haz3lcore/zipper/projectors/SliderCore.re | 22 ++-- .../zipper/projectors/TextAreaCore.re | 13 +- src/haz3lweb/view/Deco.re | 73 +++++------ src/haz3lweb/view/ProjectorViewModule.re | 15 ++- src/haz3lweb/view/ProjectorsView.re | 121 ++++++++++-------- src/haz3lweb/view/projectors/CheckboxView.re | 2 +- src/haz3lweb/view/projectors/FoldView.re | 2 +- src/haz3lweb/view/projectors/InferView.re | 2 +- src/haz3lweb/view/projectors/SliderView.re | 13 +- src/haz3lweb/view/projectors/TextAreaView.re | 29 +++-- src/haz3lweb/www/style.css | 56 +++++++- 12 files changed, 226 insertions(+), 128 deletions(-) diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 8154eec0c3..0088bc3f16 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -22,10 +22,10 @@ type infer_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] type checkbox_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type slider_action = - | Set(int); +type slider_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type textarea_action = unit; +type textarea_action = + | Set(int); [@deriving (show({with_path: false}), sexp, yojson)] type shape = diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index f82965dfa5..2b4b6e2fe7 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,20 +1,25 @@ open ZipperBase; -let serialize = a => - a |> ZipperBase.sexp_of_slider_action |> Sexplib.Sexp.to_string; - -let deserialize = a => - a |> Sexplib.Sexp.of_string |> ZipperBase.slider_action_of_sexp; - let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { | Tile({label: [l], _}) => Some(l) | _ => None }; +let mk_mono = (sort: Sort.t, string: string): Piece.t => + string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + let state_of = (piece: Piece.t): option(int) => piece |> of_mono |> Option.map(int_of_string); +let put = (new_val: string): Piece.t => mk_mono(Exp, new_val); + +let get = (piece: Piece.t): int => + switch (piece |> of_mono |> Option.map(int_of_string)) { + | None => failwith("Slider: not integer literal") + | Some(s) => s + }; + let mk = (model): projector_core => (module { @@ -27,8 +32,5 @@ let mk = (model): projector_core => let can_project = p => state_of(p) != None; let placeholder = () => Inline(10); let auto_update = _: projector => Slider(model); - let update = (action: string) => - switch (deserialize(action)) { - | Set(value) => Slider({value: value}) - }; + let update = _ => Slider(model); }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index fc69a86954..65d2bea9d6 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,5 +1,11 @@ open ZipperBase; +let serialize = a => + a |> ZipperBase.sexp_of_slider_action |> Sexplib.Sexp.to_string; + +let deserialize = a => + a |> Sexplib.Sexp.of_string |> ZipperBase.slider_action_of_sexp; + /* Function to escape linebreaks */ let escape_linebreaks = (str: string): string => { Re.Str.global_replace(Re.Str.regexp("\n"), "\\n", str); @@ -43,4 +49,9 @@ let mk = (model): projector_core => let placeholder = () => Block({row: 4 - 1, col: 20 + 2}); let auto_update = _: projector => TextArea(model); let update = _ => TextArea(model); - }); + } + // let update = (action: string) => + // switch (deserialize(action)) { + // | Set(value) => Slider({value: value}) + // }; +); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 19ba51fc09..a473fc46cd 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -20,14 +20,18 @@ module Deco = let tile = id => Id.Map.find(id, M.tiles); let caret = (z: Zipper.t): list(Node.t) => { - let origin = Zipper.caret_point(M.map, z); - let shape = Zipper.caret_direction(z); - let side = - switch (Indicated.piece(z)) { - | Some((_, side, _)) => side - | _ => Right - }; - [CaretDec.view(~font_metrics, ~profile={side, origin, shape})]; + switch (ProjectorsView.shape(z)) { + | Some(Block(_)) => [] + | _ => + let origin = Zipper.caret_point(M.map, z); + let shape = Zipper.caret_direction(z); + let side = + switch (Indicated.piece(z)) { + | Some((_, side, _)) => side + | _ => Right + }; + [CaretDec.view(~font_metrics, ~profile={side, origin, shape})]; + }; }; type shard_data = (Measured.measurement, Nibs.shapes); @@ -76,14 +80,14 @@ module Deco = let tile_shards = Measured.find_shards(~msg="sel_of_tile", t, M.map) |> List.filter(((i, _)) => List.mem(i, t.shards)) - |> List.map(((index, measurement)) => { + |> List.map(((index, m)) => { let token = List.nth(t.label, index); - // Adjustment for multi-line tokens e.g. projector placeholders - let num_lb = StringUtil.num_linebreaks(token); - [ - Some(sel_shard_svg(~start_shape, ~index, measurement, Tile(t))), - ] - @ List.init(num_lb, _ => None); + switch (StringUtil.num_linebreaks(token)) { + | 0 => [Some(sel_shard_svg(~start_shape, ~index, m, Tile(t)))] + /* No deco for multi-line tokens e.g. projector placeholders, + * but need to leave some blank lines */ + | num_lb => List.init(num_lb, _ => None) + }; }); let shape_at = index => snd(Mold.nibs(~index, t.mold)).shape; let children_shards = @@ -304,30 +308,23 @@ module Deco = let err_holes = () => List.map(term_highlight(~clss=["err-hole"]), M.error_ids); - let indication_deco = (~inject, z: Zipper.t) => - switch (Indicated.index(z)) { - | Some(id) => - //TODO(andrew): do this in a way that doesn't duplicate the view - switch ( - ProjectorsView.indication_view( - id, - z.projectors, - ~inject, - ~syntax_map=M.syntax_map, - ~measured=M.map, - ~font_metrics, - ) - ) { - | Some(v) => [v] - | None => indicated_piece_deco(z) - } - | _ => indicated_piece_deco(z) + let accent = (z: Zipper.t) => + switch (Indicated.piece(z)) { + | Some((p, d, _)) => + Some((Piece.id(p), ProjectorViewModule.Indicated(d))) + | None => None + }; + + let indication_deco = (z: Zipper.t) => + switch (ProjectorsView.indicated_proj_z(z)) { + | Some(_) => [] + | None => indicated_piece_deco(z) }; - let active = (~inject, zipper, sel_seg) => + let active = (zipper, sel_seg) => List.concat([ caret(zipper), - indication_deco(~inject, zipper), + indication_deco(zipper), selected_pieces(zipper), backpack(zipper), targets'(zipper.backpack, sel_seg), @@ -342,12 +339,10 @@ module Deco = ~inject, ~font_metrics, ~measured=M.map, + ~accent=accent(zipper), ), ]); let all = (~inject, zipper, sel_seg) => - List.concat([ - active(~inject, zipper, sel_seg), - always(~inject, zipper), - ]); + List.concat([active(zipper, sel_seg), always(~inject, zipper)]); }; diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index a388edd735..51055f1b0c 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -1,11 +1,24 @@ open Haz3lcore; open Virtual_dom.Vdom; +[@deriving (show({with_path: false}), sexp, yojson)] +type accent = + | Indicated(Util.Direction.t) + | Selected; + +let cls = (indicated: option(accent)) => + switch (indicated) { + | Some(Indicated(Left)) => ["indicated", "left"] + | Some(Indicated(Right)) => ["indicated", "right"] + | Some(Selected) => ["selected"] + | None => [] + }; + module type ProjectorView = { [@deriving (show({with_path: false}), sexp, yojson)] type action; - let view: Node.t; + let view: option(accent) => Node.t; let keymap: (Util.Direction.t, Key.t) => option(Projector.action(string)); }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 63267873e2..a75eeca117 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -62,15 +62,17 @@ let wrap = ~id as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, + ~accent: option(ProjectorViewModule.accent), p: Projector.t, - clss: list(string), view: Node.t, ) => div( ~attr= Attr.many([ // JsUtil.stop_mousedown_propagation, - Attr.classes(["projector", Projector.name(p)] @ clss), + Attr.classes( + ["projector", Projector.name(p)] @ ProjectorViewModule.cls(accent), + ), DecUtil.abs_style(measurement, ~font_metrics), ]), [ @@ -78,7 +80,7 @@ let wrap = ~attr= Attr.many([ JsUtil.stop_mousedown_propagation, - Attr.classes(["projector-wrapper"] @ clss), + Attr.classes(["projector-wrapper"]), // Attr.on_mousedown(_ => { // print_endline("WRAPPPER"); // inject(Update.PerformAction(Jump(TileId(id)))); @@ -102,31 +104,30 @@ let view = ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, - ) => { - let* p = Projector.Map.find(id, ps); - let* syntax = Id.Map.find_opt(id, syntax_map); - let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, syntax, p, ~inject); - wrap(~inject, ~id, ~font_metrics, ~measurement, p, [], PV.view); -}; - -let indication_view = - ( - id: Id.t, - ps: Map.t, - ~syntax_map: Id.Map.t(syntax), - ~measured: Measured.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ~font_metrics, + ~accent: option(ProjectorViewModule.accent), ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module PV) = to_module(id, syntax, p, ~inject); - wrap(~font_metrics, ~inject, ~id, ~measurement, p, ["indicated"], PV.view); + wrap( + ~font_metrics, + ~inject, + ~id, + ~measurement, + ~accent, + p, + PV.view(accent), + ); }; +let bdfg = z => + switch (Indicated.piece(z)) { + | Some((_, d, _)) => Some(d) + | None => None + }; + let view_all = ( ps: Map.t, @@ -134,21 +135,63 @@ let view_all = ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, + ~accent, ) => List.filter_map( ((id, _)) => - view(id, ps, ~syntax_map, ~measured, ~inject, ~font_metrics), + view( + id, + ps, + ~syntax_map, + ~measured, + ~inject, + ~font_metrics, + ~accent= + switch (accent) { + | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) + | _ => None + }, + ), Id.Map.bindings(ps), ); -let indicated_proj_ed = (editor: Editor.t) => { - let projectors = Editor.get_projectors(editor); - //TODO(andrew): In future use z_proj instead of zipper? - let* id = Indicated.index(editor.state.zipper); - let+ projector = Projector.Map.find(id, projectors); +let indicated_proj_z = (z: Zipper.t) => { + let* id = Indicated.index(z); + let+ projector = Projector.Map.find(id, z.projectors); (id, projector); }; +let indicated_proj_ed = (editor: Editor.t) => + //TODO(andrew): In future use z_proj instead of zipper? + indicated_proj_z(editor.state.zipper); + +let kind = (editor: Editor.t) => { + let+ (_, p) = indicated_proj_ed(editor); + Projector.kind(p); +}; + +let shape = (z: Zipper.t) => { + let+ (_, p) = indicated_proj_z(z); + Projector.shape(p); +}; + +let id = (editor: Editor.t) => { + switch (indicated_proj_ed(editor)) { + | Some((id, _)) => id + | None => Id.invalid + }; +}; + +let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { + let* (id, p) = indicated_proj_ed(editor); + let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); + let (module PV) = to_module(id, syntax, p, ~inject); + div( + ~attr=Attr.classes(["projector-ci"]), + [text(String.sub(Projector.name(p), 0, 1))], + ); +}; + let key_handler = ( editor: Editor.t, @@ -166,28 +209,6 @@ let key_handler = handle(id, action); }; -let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { - let* (id, p) = indicated_proj_ed(editor); - let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module PV) = to_module(id, syntax, p, ~inject); - div( - ~attr=Attr.classes(["projector-ci"]), - [text(String.sub(Projector.name(p), 0, 1))], - ); -}; - -let cur = (editor: Editor.t) => { - let+ (_id, p) = indicated_proj_ed(editor); - Projector.kind(p); -}; - -let id = (editor: Editor.t) => { - switch (indicated_proj_ed(editor)) { - | None => Id.invalid - | Some((id, _)) => id - }; -}; - let option_view = (name, n) => option( ~attr=n == name ? Attr.create("selected", "selected") : Attr.many([]), @@ -246,7 +267,7 @@ let toggle_view = (~inject, ci, id, active: bool) => let currently_selected = editor => option_view( - switch (cur(editor)) { + switch (kind(editor)) { | None => "Fold" | Some(k) => Projector.name_(k) }, @@ -256,7 +277,7 @@ let panel = (~inject, editor: Editor.t, ci: Info.t) => { div( ~attr=Attr.id("projectors"), [ - toggle_view(~inject, ci, id(editor), cur(editor) != None), + toggle_view(~inject, ci, id(editor), kind(editor) != None), Node.select( ~attr= Attr.many([ diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index 818e9c5a1f..82d2cd3fce 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -1,7 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax) => +let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax, _) => Node.input( ~attr= Attr.many( diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 96870d3ce1..89b4230d5a 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -10,7 +10,7 @@ let mk = [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.fold_action; - let view = + let view = _ => div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), [text("⋱")], diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index 19178d0a7e..db3382f708 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -2,7 +2,7 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let view = (~inject, expected_ty: option(Typ.t)) => +let view = (~inject, expected_ty: option(Typ.t), _) => div( ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), [text(InferCore.display(expected_ty))], diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index 35dc28ded8..a262f7e84f 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -1,18 +1,16 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = (~inject: Projector.action(_) => Ui_effect.t(unit), value: int) => +let view = + (~inject: Projector.action(_) => Ui_effect.t(unit), value: int, _) => Node.input( ~attr= Attr.many([ Attr.create("type", "range"), Attr.create("value", string_of_int(value)), Attr.on_input((_evt, new_val) => - inject( - UpdateModel(SliderCore.serialize(Set(int_of_string(new_val)))), - ) + inject(UpdateSyntax(_ => SliderCore.put(new_val))) ), - // => inject(UpdateSyntax(_ => put(int_of_string(new_val)))) ]), [], ); @@ -24,15 +22,14 @@ let keymap = (_, key: Key.t): option(Projector.action(string)) => }; let mk = - (_syntax: Piece.t, ~inject, _model: ZipperBase.slider) + (syntax: Piece.t, ~inject, _model: ZipperBase.slider) : ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.slider_action; - //let value = get(_syntax); - let value = _model.value; + let value = SliderCore.get(syntax); let view = view(value, ~inject); let keymap = keymap; }); diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index 81fd0c34ae..c41b4234b4 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -1,8 +1,12 @@ open Haz3lcore; open Virtual_dom.Vdom; +open Util.Web; -let view = - (~inject: Projector.action(_) => Ui_effect.t(unit), value: string) => +let put = (str: string): Projector.action(_) => + Projector.UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); + +let textarea2 = + (~inject: Projector.action(_) => Ui_effect.t(unit), text: string) => Node.textarea( ~attr= Attr.many([ @@ -10,15 +14,20 @@ let view = // Attr.create("rows", "4"), // Attr.create("cols", "21"), Attr.on_mousedown(_ => inject(Focus)), - Attr.on_input((_evt, new_val) => - inject( - UpdateSyntax( - _ => new_val |> Form.string_quote |> TextAreaCore.put, - ), - ) - ), + Attr.on_input((_, new_text) => inject(put(new_text))), ]), - [Node.text(value)], + [Node.text(text)], + ); + +let n_of = (n: int) => + [Node.text(".")] + @ (List.init(n, _ => [Node.br(), Node.text(".")]) |> List.flatten); + +let view = (~inject, text, indicated: option(ProjectorViewModule.accent)) => + Node.div( + ~attr=clss(["cols"] @ ProjectorViewModule.cls(indicated)), + n_of(3) //TODO(andrew): magic number + @ [textarea2(~inject, text)], ); let keymap = (_direction, key: Key.t): option(Projector.action(string)) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 089f0b2294..8418f265f9 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -753,21 +753,51 @@ select { align-items: start; } +.projector.text .cols { + border-radius: 0.1em; + outline: 0.3px solid #a69460; + background-color: #e0d1b7; + color: #f0e7d6; + height: 100%; + align-items: start; + display: flex; + border-left: 2px solid #0000; + /* border-right: 2px solid #0000; */ + margin-left: -2px; + margin-right: -2px; +} +.projector.text .cols.indicated.left { + position: relative; + border-right: 2px solid red; + animation: 1s blink_border_right step-end infinite; + /* right: 2px; */ +} +.projector.text .cols.indicated.right { + position: relative; + border-left: 2px solid red; + animation: 1s blink_border_left step-end infinite; + /* right: 2px; */ +} + .projector.text textarea { /* filter: sepia(1); */ + resize: none; height: 100%; - width: 100%; + /* width: 100%; */ caret-color: red; padding: 0; + margin: 0; line-height: var(--line-height); font-family: "Source Code Pro", monospace; font-size: inherit; border: none; border-radius: 0.1em; - outline: 1px solid #a69460; + outline: 0.3px solid #a69460; background-color: #f0e7d6; color: #8c7e62; - +} +.projector.text textarea { + background: repeating-linear-gradient(#f0e7d6, #f0e7d6 1.4em, #e0d1b7 1.4em, #e0d1b7 1.46em); } .projector.text textarea::selection { @@ -1363,6 +1393,26 @@ svg.tile-selected { } } +@keyframes blink_border_left{ + from, + to { + border-left-color: red; + } + 50% { + border-left-color: rgba(255, 0, 0, 0); + } +} + +@keyframes blink_border_right { + from, + to { + border-right-color: red; + } + 50% { + border-right-color: rgba(255, 0, 0, 0); + } +} + /* STATICS */ .code-container svg.err-hole { From c0b73a7695723cf2defbe9425d89b6ced65a58cf Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 25 Jun 2024 03:46:27 -0400 Subject: [PATCH 073/168] entering and escaping text area from the left works. cleanup needed --- src/haz3lcore/zipper/Projector.re | 5 +- src/haz3lcore/zipper/ZipperBase.re | 4 +- .../zipper/projectors/TextAreaCore.re | 16 ++-- src/haz3lweb/util/JsUtil.re | 83 +++++++++++++++++++ src/haz3lweb/view/ProjectorsView.re | 18 +++- src/haz3lweb/view/projectors/TextAreaView.re | 83 ++++++++++++++----- 6 files changed, 175 insertions(+), 34 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ba92240821..dda99bb3ba 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -54,7 +54,8 @@ type syntax = Piece.t; type action('action) = | Default // Defer to focal DOM element | Remove - | Focus + | FocusInternal + | JumpTo | UpdateSyntax(syntax => syntax) | UpdateModel('action) | Seq(action('action), action('action)); @@ -100,7 +101,7 @@ let init = (f: kind): projector_core => | Infer => InferCore.mk({expected_ty: None}) | Checkbox => CheckboxCore.mk() | Slider => SliderCore.mk({value: 10}) - | TextArea => TextAreaCore.mk({value: "TODO(andrew)"}) + | TextArea => TextAreaCore.mk({inside: false}) }; let create = diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 0088bc3f16..7a98ceb836 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -11,7 +11,7 @@ type checkbox = unit; [@deriving (show({with_path: false}), sexp, yojson)] type slider = {value: int}; [@deriving (show({with_path: false}), sexp, yojson)] -type textarea = {value: string}; +type textarea = {inside: bool}; /* Projector action types */ @@ -25,7 +25,7 @@ type checkbox_action = unit; type slider_action = unit; [@deriving (show({with_path: false}), sexp, yojson)] type textarea_action = - | Set(int); + | SetInside(bool); [@deriving (show({with_path: false}), sexp, yojson)] type shape = diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 65d2bea9d6..46455fcb9a 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,10 +1,10 @@ open ZipperBase; let serialize = a => - a |> ZipperBase.sexp_of_slider_action |> Sexplib.Sexp.to_string; + a |> ZipperBase.sexp_of_textarea_action |> Sexplib.Sexp.to_string; let deserialize = a => - a |> Sexplib.Sexp.of_string |> ZipperBase.slider_action_of_sexp; + a |> Sexplib.Sexp.of_string |> ZipperBase.textarea_action_of_sexp; /* Function to escape linebreaks */ let escape_linebreaks = (str: string): string => { @@ -48,10 +48,8 @@ let mk = (model): projector_core => //TODO(andrew): fudge factors below let placeholder = () => Block({row: 4 - 1, col: 20 + 2}); let auto_update = _: projector => TextArea(model); - let update = _ => TextArea(model); - } - // let update = (action: string) => - // switch (deserialize(action)) { - // | Set(value) => Slider({value: value}) - // }; -); + let update = (a: string) => + switch (deserialize(a)) { + | SetInside(b) => TextArea({inside: b}) + }; + }); diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index f2efd591e3..0293a4213c 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -1,5 +1,6 @@ open Js_of_ocaml; open Virtual_dom.Vdom; +open Sexplib.Std; let get_elem_by_id = id => { let doc = Dom_html.document; @@ -12,6 +13,17 @@ let get_elem_by_id = id => { ); }; +let get_elem_by_selector = selector => { + let doc = Dom_html.document; + Js.Opt.get( + doc##querySelector(Js.string(selector)), + () => { + print_endline(selector); + assert(false); + }, + ); +}; + let date_now = () => { [%js new Js.date_now]; }; @@ -166,3 +178,74 @@ let stop_mousedown_propagation = Js_of_ocaml.Dom_html.stopPropagation(evt); Virtual_dom.Vdom.Effect.Ignore; }); + +[@deriving (show({with_path: false}), sexp, yojson)] +type text_position = { + row: int, + col: int, +}; + +let get_textarea = (selector: string): Js.t(Dom_html.textAreaElement) => + Dom_html.CoerceTo.textarea(get_elem_by_selector(selector)) + |> Js.Opt.get(_, _ => failwith("get_caret_text_position")); + +let get_textarea_lines = + (textarea: Js.t(Dom_html.textAreaElement)): list(string) => { + let text_content = Js.to_string(textarea##.value); + Str.split(Str.regexp("\n"), text_content); +}; + +let textarea_max_row = (selector: string): int => { + let textarea = get_textarea(selector); + let lines = get_textarea_lines(textarea); + List.length(lines) - 1; +}; + +let textarea_caret_position = (selector: string): text_position => { + let textarea = get_textarea(selector); + let lines = get_textarea_lines(textarea); + let caret_position = textarea##.selectionStart; + let rec find_position = (lines, current_position, row, col) => { + switch (lines) { + | [] => {row, col} + | [line, ...rest] => + let line_length = String.length(line) + 1; // +1 for the newline + if (current_position <= line_length) { + {row, col: current_position}; + } else { + find_position(rest, current_position - line_length, row + 1, 0); + }; + }; + }; + find_position(lines, caret_position, 0, 0); +}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type position_type = + | First + | Middle + | Last; + +[@deriving (show({with_path: false}), sexp, yojson)] +type caret_position = { + rows: position_type, + cols: position_type, +}; + +let get_caret_position_type = (selector: string): caret_position => { + //TODO(andrew): This isn't quite right; first col non-first row isn't right + let determine_position = (current, max) => + if (current == 0) { + First; + } else if (current == max) { + Last; + } else { + Middle; + }; + let lines = selector |> get_textarea |> get_textarea_lines; + let {row, col} = textarea_caret_position(selector); + { + rows: determine_position(row, List.length(lines) - 1), + cols: determine_position(col, String.length(List.nth(lines, row)) - 1), + }; +}; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index a75eeca117..59b33aa923 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -7,9 +7,25 @@ open Util.Web; let rec handle = (id, action): UpdateAction.t => { switch (action) { - | Focus => + | JumpTo => //TODO(andrew): end up on nearest side + //TODO(andrew): set inside PerformAction(Jump(TileId(id))) + | FocusInternal => + //TODO(andrew): unhardcode selector + JsUtil.get_elem_by_selector(".projector.text textarea")##focus; + PerformAction( + Project( + UpdateModel( + id, + p => { + //TODO(andrew): remove this crime + let (module P) = Projector.to_module(p); + P.update(TextAreaCore.serialize(SetInside(true))); + }, + ), + ), + ); | Default => //TODO(andrew): no-op PerformAction(Project(Remove(Id.invalid))) diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index c41b4234b4..34b0d88734 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -5,15 +5,24 @@ open Util.Web; let put = (str: string): Projector.action(_) => Projector.UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); -let textarea2 = - (~inject: Projector.action(_) => Ui_effect.t(unit), text: string) => +let textarea = + (~inject: Projector.action(string) => Ui_effect.t(unit), text: string) => Node.textarea( ~attr= Attr.many([ //TODO(andrew): fudge factors below // Attr.create("rows", "4"), // Attr.create("cols", "21"), - Attr.on_mousedown(_ => inject(Focus)), + Attr.on_blur(_ => + inject(UpdateModel(TextAreaCore.serialize(SetInside(false)))) + ), + Attr.on_mousedown(_ => + Effect.Many([ + inject(JumpTo), + inject(UpdateModel(TextAreaCore.serialize(SetInside(true)))), + Effect.Stop_propagation, + ]) + ), Attr.on_input((_, new_text) => inject(put(new_text))), ]), [Node.text(text)], @@ -23,33 +32,67 @@ let n_of = (n: int) => [Node.text(".")] @ (List.init(n, _ => [Node.br(), Node.text(".")]) |> List.flatten); -let view = (~inject, text, indicated: option(ProjectorViewModule.accent)) => +let view = + ( + ~inject, + model: ZipperBase.textarea, + text: string, + indicated: option(ProjectorViewModule.accent), + ) => Node.div( - ~attr=clss(["cols"] @ ProjectorViewModule.cls(indicated)), - n_of(3) //TODO(andrew): magic number - @ [textarea2(~inject, text)], + ~attr= + clss( + ["cols"] @ (model.inside ? [] : ProjectorViewModule.cls(indicated)), + ), + n_of(1 + Util.StringUtil.num_linebreaks(text)) //TODO(andrew): magic number + @ [textarea(~inject, text)], ); -let keymap = (_direction, key: Key.t): option(Projector.action(string)) => - switch (key.key) { - | D( - "ArrowLeft" | "ArrowRight" | "ArrowUp" | "ArrowDown" | "Enter" | - "Backspace" | - " ", - ) => - None - | _ => Some(Default) +let keymap = + (model: ZipperBase.textarea, direction: Util.Direction.t, key: Key.t) + : option(Projector.action(string)) => { + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //TODO(andrew): unhardcoded element !!!!!!!!!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + let selector = ".projector.text textarea"; + let JsUtil.{rows, cols} = JsUtil.get_caret_position_type(selector); + print_endline("model-inside:" ++ string_of_bool(model.inside)); + switch (key.key, direction) { + | (D("ArrowRight"), Right) when !model.inside => Some(FocusInternal) + | (D("ArrowLeft"), Left) when !model.inside => Some(FocusInternal) + | (D("ArrowRight"), _) when model.inside && rows == Last && cols == Last => + //TODO(andrew): need to move zipper caret to right side + //TODO(andrew): focus specific element id + JsUtil.get_elem_by_selector(selector)##blur; + print_endline("escape to right"); + Some(UpdateModel(TextAreaCore.serialize(SetInside(false)))); + | (D("ArrowLeft"), _) when model.inside && rows == First && cols == First => + //TODO(andrew): need to move zipper caret to left side + //TODO(andrew): focus specific element id + JsUtil.get_elem_by_selector(selector)##blur; + print_endline("escape to left"); + Some(UpdateModel(TextAreaCore.serialize(SetInside(false)))); + | _ when model.inside => + let pos = JsUtil.get_caret_position_type(selector); + let pos' = JsUtil.textarea_caret_position(selector); + print_endline("pos: " ++ JsUtil.show_caret_position(pos)); + print_endline("pos': " ++ JsUtil.show_text_position(pos')); + Some(Default); + | _ => + print_endline("Not model.inside"); + None; }; +}; let mk = - (~inject, syntax: Piece.t, _model: ZipperBase.textarea) + (~inject, syntax: Piece.t, model: ZipperBase.textarea) : ProjectorViewModule.t => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type action = ZipperBase.slider_action; + type action = ZipperBase.textarea_action; let value = syntax |> TextAreaCore.get |> Form.strip_quotes; - let view = view(value, ~inject); - let keymap = keymap; + let view = view(model, value, ~inject); + let keymap = keymap(model); }); From 8d32ea5e652fb0b93f4185c5bd81cc587a936863 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 25 Jun 2024 23:50:26 -0400 Subject: [PATCH 074/168] can enter and escape textarea from either direction --- src/haz3lcore/zipper/Projector.re | 8 +- .../zipper/projectors/TextAreaCore.re | 5 +- src/haz3lweb/util/JsUtil.re | 38 +++++--- src/haz3lweb/view/Page.re | 17 ++-- src/haz3lweb/view/ProjectorsView.re | 93 +++++++++++-------- src/haz3lweb/view/projectors/TextAreaView.re | 71 +++++++------- 6 files changed, 135 insertions(+), 97 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index dda99bb3ba..0797d38233 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,5 +1,6 @@ open Util; open ZipperBase; +open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] module Map = ProjectorMap; @@ -54,8 +55,9 @@ type syntax = Piece.t; type action('action) = | Default // Defer to focal DOM element | Remove - | FocusInternal + | FocusInternal(string) | JumpTo + | Escape(string, Util.Direction.t) | UpdateSyntax(syntax => syntax) | UpdateModel('action) | Seq(action('action), action('action)); @@ -95,7 +97,7 @@ let placeholder = (p: t, id: Id.t): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let init = (f: kind): projector_core => +let init = (f: kind, _syntax): projector_core => switch (f) { | Fold => FoldCore.mk() | Infer => InferCore.mk({expected_ty: None}) @@ -106,7 +108,7 @@ let init = (f: kind): projector_core => let create = (k: kind, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { - let (module P) = init(k); + let (module P) = init(k, syntax); P.can_project(syntax) && minimum_projection_condition(syntax) ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 46455fcb9a..7d9661ee59 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -45,8 +45,9 @@ let mk = (model): projector_core => let model = model; let projector = TextArea(model); let can_project = _ => true; - //TODO(andrew): fudge factors below - let placeholder = () => Block({row: 4 - 1, col: 20 + 2}); + //TODO(andrew): unhardcode below numbers + let row = 4 - 1; //Util.StringUtil.num_linebreaks(get(syntax)); + let placeholder = () => Block({row, col: 20 + 2}); let auto_update = _: projector => TextArea(model); let update = (a: string) => switch (deserialize(a)) { diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index 0293a4213c..ec8865b035 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -209,11 +209,11 @@ let textarea_caret_position = (selector: string): text_position => { switch (lines) { | [] => {row, col} | [line, ...rest] => - let line_length = String.length(line) + 1; // +1 for the newline + let line_length = String.length(line); // +1 for the newline if (current_position <= line_length) { {row, col: current_position}; } else { - find_position(rest, current_position - line_length, row + 1, 0); + find_position(rest, current_position - line_length - 1, row + 1, 0); }; }; }; @@ -232,20 +232,30 @@ type caret_position = { cols: position_type, }; -let get_caret_position_type = (selector: string): caret_position => { - //TODO(andrew): This isn't quite right; first col non-first row isn't right - let determine_position = (current, max) => - if (current == 0) { - First; - } else if (current == max) { - Last; - } else { - Middle; - }; +let boundary_pos = (current, max) => + if (current == 0) { + First; + } else if (current == max) { + Last; + } else { + Middle; + }; + +let textarea_caret_rel_pos = (selector: string): caret_position => { let lines = selector |> get_textarea |> get_textarea_lines; let {row, col} = textarea_caret_position(selector); { - rows: determine_position(row, List.length(lines) - 1), - cols: determine_position(col, String.length(List.nth(lines, row)) - 1), + rows: boundary_pos(row, List.length(lines) - 1), + cols: boundary_pos(col, String.length(List.nth(lines, row))), }; }; + +let set_textarea_caret_to_end = (selector: string): unit => { + let textarea = get_textarea(selector); + // Focus the textarea + textarea##focus; + // Set the selection start (and implicitly, the end) to the length of the content + let content_length = String.length(Js.to_string(textarea##.value)); + textarea##.selectionStart := content_length; + textarea##.selectionEnd := content_length; +}; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index c55bb984cd..8541cf7251 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -13,15 +13,17 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some(PerformAction(Project(Remove(id)))) when id == Id.invalid => + | Some([PerformAction(Project(Remove(id)))]) when id == Id.invalid => //TODO(andrew): cleanup Ignore | Some(action) => - Many([ - Prevent_default, - // Stop_propagation, - inject(action), - ]) + Many( + [ + Prevent_default, + // Stop_propagation, + ] + @ List.map(inject, action), + ) | None => switch (Keyboard.handle_key_event(key)) { | None => Ignore @@ -42,7 +44,8 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some(PerformAction(Project(Remove(id)))) when id == Id.invalid => + | Some([PerformAction(Project(Remove(id)))]) when id == Id.invalid => + //TODO(andrew): cleanup Ignore | _ => Effect.Prevent_default }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 59b33aa923..4775dc5b81 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -5,48 +5,55 @@ open Projector; open Util.OptUtil.Syntax; open Util.Web; -let rec handle = (id, action): UpdateAction.t => { +let handle = (id, action): list(UpdateAction.t) => { + let crime = (b, p) => { + //TODO(andrew): remove this crime + let (module P) = Projector.to_module(p); + P.update(TextAreaCore.serialize(SetInside(b))); + }; switch (action) { + | Escape(selector, Left) => + JsUtil.get_elem_by_selector(selector)##blur; + [ + PerformAction(Project(UpdateModel(id, crime(false)))), + PerformAction(Move(Local(Right(ByToken)))), + ]; + | Escape(selector, Right) => + JsUtil.get_elem_by_selector(selector)##blur; + [PerformAction(Project(UpdateModel(id, crime(false))))]; | JumpTo => //TODO(andrew): end up on nearest side //TODO(andrew): set inside - PerformAction(Jump(TileId(id))) - | FocusInternal => - //TODO(andrew): unhardcode selector - JsUtil.get_elem_by_selector(".projector.text textarea")##focus; - PerformAction( - Project( - UpdateModel( - id, - p => { - //TODO(andrew): remove this crime - let (module P) = Projector.to_module(p); - P.update(TextAreaCore.serialize(SetInside(true))); - }, - ), - ), - ); + [PerformAction(Jump(TileId(id)))] + | FocusInternal(selector) => + JsUtil.get_elem_by_selector(selector)##focus; + /* Note: jumping her normalizes position, so when exiting + * we know we're intially to the left and can move or not accordingly */ + [ + PerformAction(Jump(TileId(id))), + PerformAction(Project(UpdateModel(id, crime(true)))), + ]; | Default => //TODO(andrew): no-op - PerformAction(Project(Remove(Id.invalid))) - | Remove => PerformAction(Project(Remove(id))) - | UpdateSyntax(f) => PerformAction(Project(UpdateSyntax(id, f))) + [PerformAction(Project(Remove(Id.invalid)))] + | Remove => [PerformAction(Project(Remove(id)))] + | UpdateSyntax(f) => [PerformAction(Project(UpdateSyntax(id, f)))] | UpdateModel(action) => //TODO(andrew) - // print_endline("TODO: update model"); - PerformAction( - Project( - UpdateModel( - id, - p => { - let (module P) = Projector.to_module(p); - P.update(action); - }, + [ + PerformAction( + Project( + UpdateModel( + id, + p => { + let (module P) = Projector.to_module(p); + P.update(action); + }, + ), ), ), - ) - // PerformAction(Project(UpdateModel(id, x => x))); - | Seq(a1, _a2) => handle(id, a1) //TODO + ] + | Seq(_a1, _a2) => [] //TODO(andrew) }; }; @@ -60,15 +67,25 @@ let to_module = : ProjectorViewModule.t => { switch (p) { | Fold(model) => - FoldView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + FoldView.mk(syntax, model, ~inject=a => + Effect.Many(List.map(inject, handle(id, a))) + ) | Infer(model) => - InferView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + InferView.mk(syntax, model, ~inject=a => + Effect.Many(List.map(inject, handle(id, a))) + ) | Checkbox(model) => - CheckboxView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + CheckboxView.mk(syntax, model, ~inject=a => + Effect.Many(List.map(inject, handle(id, a))) + ) | Slider(model) => - SliderView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + SliderView.mk(syntax, model, ~inject=a => + Effect.Many(List.map(inject, handle(id, a))) + ) | TextArea(model) => - TextAreaView.mk(syntax, model, ~inject=a => inject(handle(id, a))) + TextAreaView.mk(syntax, model, ~inject=a => + Effect.Many(List.map(inject, handle(id, a))) + ) }; }; @@ -214,7 +231,7 @@ let key_handler = key: Key.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ) - : option(UpdateAction.t) => + : option(list(UpdateAction.t)) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index 34b0d88734..10df1f2c8e 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -6,7 +6,11 @@ let put = (str: string): Projector.action(_) => Projector.UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); let textarea = - (~inject: Projector.action(string) => Ui_effect.t(unit), text: string) => + ( + ~selector, + ~inject: Projector.action(string) => Ui_effect.t(unit), + text: string, + ) => Node.textarea( ~attr= Attr.many([ @@ -18,9 +22,10 @@ let textarea = ), Attr.on_mousedown(_ => Effect.Many([ - inject(JumpTo), - inject(UpdateModel(TextAreaCore.serialize(SetInside(true)))), - Effect.Stop_propagation, + // inject(JumpTo), + // inject(UpdateModel(TextAreaCore.serialize(SetInside(true)))), + inject(FocusInternal(selector)), + //Effect.Stop_propagation, ]) ), Attr.on_input((_, new_text) => inject(put(new_text))), @@ -29,12 +34,13 @@ let textarea = ); let n_of = (n: int) => - [Node.text(".")] - @ (List.init(n, _ => [Node.br(), Node.text(".")]) |> List.flatten); + [Node.text("·")] + @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); let view = ( ~inject, + ~selector, model: ZipperBase.textarea, text: string, indicated: option(ProjectorViewModule.accent), @@ -45,39 +51,34 @@ let view = ["cols"] @ (model.inside ? [] : ProjectorViewModule.cls(indicated)), ), n_of(1 + Util.StringUtil.num_linebreaks(text)) //TODO(andrew): magic number - @ [textarea(~inject, text)], + @ [textarea(~inject, ~selector, text)], ); let keymap = - (model: ZipperBase.textarea, direction: Util.Direction.t, key: Key.t) + ( + ~selector, + model: ZipperBase.textarea, + direction: Util.Direction.t, + key: Key.t, + ) : option(Projector.action(string)) => { - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - //TODO(andrew): unhardcoded element !!!!!!!!!! - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - let selector = ".projector.text textarea"; - let JsUtil.{rows, cols} = JsUtil.get_caret_position_type(selector); + let JsUtil.{rows, cols} = JsUtil.textarea_caret_rel_pos(selector); print_endline("model-inside:" ++ string_of_bool(model.inside)); + let pos = JsUtil.textarea_caret_rel_pos(selector); + let pos' = JsUtil.textarea_caret_position(selector); + print_endline("pos: " ++ JsUtil.show_caret_position(pos)); + print_endline("pos': " ++ JsUtil.show_text_position(pos')); switch (key.key, direction) { - | (D("ArrowRight"), Right) when !model.inside => Some(FocusInternal) - | (D("ArrowLeft"), Left) when !model.inside => Some(FocusInternal) + | (D("ArrowRight"), Right) when !model.inside => + Some(FocusInternal(selector)) + | (D("ArrowLeft"), Left) when !model.inside => + JsUtil.set_textarea_caret_to_end(selector); + Some(FocusInternal(selector)); | (D("ArrowRight"), _) when model.inside && rows == Last && cols == Last => - //TODO(andrew): need to move zipper caret to right side - //TODO(andrew): focus specific element id - JsUtil.get_elem_by_selector(selector)##blur; - print_endline("escape to right"); - Some(UpdateModel(TextAreaCore.serialize(SetInside(false)))); + Some(Escape(selector, Left)) | (D("ArrowLeft"), _) when model.inside && rows == First && cols == First => - //TODO(andrew): need to move zipper caret to left side - //TODO(andrew): focus specific element id - JsUtil.get_elem_by_selector(selector)##blur; - print_endline("escape to left"); - Some(UpdateModel(TextAreaCore.serialize(SetInside(false)))); - | _ when model.inside => - let pos = JsUtil.get_caret_position_type(selector); - let pos' = JsUtil.textarea_caret_position(selector); - print_endline("pos: " ++ JsUtil.show_caret_position(pos)); - print_endline("pos': " ++ JsUtil.show_text_position(pos')); - Some(Default); + Some(Escape(selector, Right)) + | _ when model.inside => Some(Default) | _ => print_endline("Not model.inside"); None; @@ -91,8 +92,12 @@ let mk = { [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.textarea_action; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //TODO(andrew): unhardcode element !!!!!!!!!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + let selector = ".projector.text textarea"; let value = syntax |> TextAreaCore.get |> Form.strip_quotes; - let view = view(model, value, ~inject); - let keymap = keymap(model); + let view = view(model, value, ~selector, ~inject); + let keymap = keymap(~selector, model); }); From 178da06282e92f7235556a9721a6d0b97ddf3374 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 26 Jun 2024 01:37:32 -0400 Subject: [PATCH 075/168] projectors cleanup incl new JsUtils TextArea module --- src/haz3lcore/Measured.re | 2 +- src/haz3lcore/zipper/Projector.re | 6 +- src/haz3lcore/zipper/action/Action.re | 1 + .../zipper/action/ProjectorPerform.re | 10 ++ src/haz3lweb/util/JsUtil.re | 127 +++++++++--------- src/haz3lweb/view/Page.re | 24 +--- src/haz3lweb/view/ProjectorsView.re | 57 +++----- src/haz3lweb/view/projectors/TextAreaView.re | 54 ++++---- 8 files changed, 127 insertions(+), 154 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index c2585c3e87..c0c3045b6a 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -376,8 +376,8 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { (contained_indent, last, map); | Tile(t) => let add_shard = (origin, shard, map) => { - //TODO(andrew): properize or document let token = List.nth(t.label, shard); + // Adjustment for multi-line tokens e.g. projector placeholders let num_lb = StringUtil.num_linebreaks(token); let last = num_lb == 0 diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 0797d38233..f40db3e47d 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -53,14 +53,12 @@ type syntax = Piece.t; [@deriving (show({with_path: false}), sexp, yojson)] type action('action) = - | Default // Defer to focal DOM element | Remove | FocusInternal(string) - | JumpTo + | Default // Defer input to focal DOM element | Escape(string, Util.Direction.t) | UpdateSyntax(syntax => syntax) - | UpdateModel('action) - | Seq(action('action), action('action)); + | UpdateModel('action); let kind = (p: t): kind => switch (p) { diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 4880f97d92..581e04ad85 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -49,6 +49,7 @@ type project = | UpdateModel(Id.t, Projector.t => Projector.t) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) + | SetKeyDispatch(Id.t, bool) | Remove(Id.t); [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 9074a521d6..c0e76d1fb8 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -32,6 +32,16 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? switch (a) { + | SetKeyDispatch(id, b) => + let crime = (b, p) => { + //TODO(andrew): remove this crime + let (module P) = Projector.to_module(p); + P.update(TextAreaCore.serialize(SetInside(b))); + }; + Ok({ + ...z, + projectors: Map.update(id, Option.map(crime(b)), z.projectors), + }); | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index ec8865b035..1a23321710 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -179,83 +179,76 @@ let stop_mousedown_propagation = Virtual_dom.Vdom.Effect.Ignore; }); -[@deriving (show({with_path: false}), sexp, yojson)] -type text_position = { - row: int, - col: int, -}; +module TextArea = { + type t = Js.t(Dom_html.textAreaElement); -let get_textarea = (selector: string): Js.t(Dom_html.textAreaElement) => - Dom_html.CoerceTo.textarea(get_elem_by_selector(selector)) - |> Js.Opt.get(_, _ => failwith("get_caret_text_position")); + [@deriving (show({with_path: false}), sexp, yojson)] + type pos = { + row: int, + col: int, + }; -let get_textarea_lines = - (textarea: Js.t(Dom_html.textAreaElement)): list(string) => { - let text_content = Js.to_string(textarea##.value); - Str.split(Str.regexp("\n"), text_content); -}; + [@deriving (show({with_path: false}), sexp, yojson)] + type rel = + | First + | Middle + | Last; -let textarea_max_row = (selector: string): int => { - let textarea = get_textarea(selector); - let lines = get_textarea_lines(textarea); - List.length(lines) - 1; -}; + [@deriving (show({with_path: false}), sexp, yojson)] + type rel_pos = { + rows: rel, + cols: rel, + }; -let textarea_caret_position = (selector: string): text_position => { - let textarea = get_textarea(selector); - let lines = get_textarea_lines(textarea); - let caret_position = textarea##.selectionStart; - let rec find_position = (lines, current_position, row, col) => { - switch (lines) { - | [] => {row, col} - | [line, ...rest] => - let line_length = String.length(line); // +1 for the newline - if (current_position <= line_length) { - {row, col: current_position}; - } else { - find_position(rest, current_position - line_length - 1, row + 1, 0); + let get = (selector: string): Js.t(Dom_html.textAreaElement) => + selector + |> get_elem_by_selector + |> Dom_html.CoerceTo.textarea + |> Js.Opt.get(_, _ => failwith("TextArea.get")); + + let lines = (textarea: t): list(string) => + Str.split(Str.regexp("\n"), Js.to_string(textarea##.value)); + + let caret_pos = (textarea: t): pos => { + let rec find_position = (lines, cur_pos, row, col) => { + switch (lines) { + | [] => {row, col} + | [line, ...rest] => + let line_length = String.length(line); + if (cur_pos <= line_length) { + {row, col: cur_pos}; + } else { + find_position(rest, cur_pos - line_length - 1, row + 1, 0); + }; }; }; + let lines = lines(textarea); + let caret_position = textarea##.selectionStart; + find_position(lines, caret_position, 0, 0); }; - find_position(lines, caret_position, 0, 0); -}; -[@deriving (show({with_path: false}), sexp, yojson)] -type position_type = - | First - | Middle - | Last; - -[@deriving (show({with_path: false}), sexp, yojson)] -type caret_position = { - rows: position_type, - cols: position_type, -}; + let rel = (current: int, max: int): rel => + if (current == 0) { + First; + } else if (current == max) { + Last; + } else { + Middle; + }; -let boundary_pos = (current, max) => - if (current == 0) { - First; - } else if (current == max) { - Last; - } else { - Middle; + let caret_rel_pos = (textarea: t): rel_pos => { + let lines = textarea |> lines; + let {row, col} = caret_pos(textarea); + { + rows: rel(row, List.length(lines) - 1), + cols: rel(col, String.length(List.nth(lines, row))), + }; }; -let textarea_caret_rel_pos = (selector: string): caret_position => { - let lines = selector |> get_textarea |> get_textarea_lines; - let {row, col} = textarea_caret_position(selector); - { - rows: boundary_pos(row, List.length(lines) - 1), - cols: boundary_pos(col, String.length(List.nth(lines, row))), + let set_caret_to_end = (textarea: t): unit => { + textarea##focus; + let content_length = String.length(Js.to_string(textarea##.value)); + textarea##.selectionStart := content_length; + textarea##.selectionEnd := content_length; }; }; - -let set_textarea_caret_to_end = (selector: string): unit => { - let textarea = get_textarea(selector); - // Focus the textarea - textarea##focus; - // Set the selection start (and implicitly, the end) to the length of the content - let content_length = String.length(Js.to_string(textarea##.value)); - textarea##.selectionStart := content_length; - textarea##.selectionEnd := content_length; -}; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 8541cf7251..9c571382d8 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -13,26 +13,14 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some([PerformAction(Project(Remove(id)))]) when id == Id.invalid => - //TODO(andrew): cleanup + | Some([]) => + //TODO(andrew): proper no-op (see ProjectorsView) Ignore - | Some(action) => - Many( - [ - Prevent_default, - // Stop_propagation, - ] - @ List.map(inject, action), - ) + | Some(action) => Many([Prevent_default] @ List.map(inject, action)) | None => switch (Keyboard.handle_key_event(key)) { | None => Ignore - | Some(action) => - Many([ - Prevent_default, - // Stop_propagation, - inject(action), - ]) + | Some(action) => Many([Prevent_default, inject(action)]) } }; }; @@ -44,8 +32,8 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some([PerformAction(Project(Remove(id)))]) when id == Id.invalid => - //TODO(andrew): cleanup + | Some([]) => + //TODO(andrew): proper no-op (see ProjectorsView) Ignore | _ => Effect.Prevent_default }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 4775dc5b81..e3e909ce93 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -5,55 +5,38 @@ open Projector; open Util.OptUtil.Syntax; open Util.Web; +let update_model = (action, p) => { + let (module P) = Projector.to_module(p); + P.update(action); +}; + let handle = (id, action): list(UpdateAction.t) => { - let crime = (b, p) => { - //TODO(andrew): remove this crime - let (module P) = Projector.to_module(p); - P.update(TextAreaCore.serialize(SetInside(b))); - }; switch (action) { - | Escape(selector, Left) => - JsUtil.get_elem_by_selector(selector)##blur; - [ - PerformAction(Project(UpdateModel(id, crime(false)))), - PerformAction(Move(Local(Right(ByToken)))), - ]; - | Escape(selector, Right) => - JsUtil.get_elem_by_selector(selector)##blur; - [PerformAction(Project(UpdateModel(id, crime(false))))]; - | JumpTo => - //TODO(andrew): end up on nearest side - //TODO(andrew): set inside - [PerformAction(Jump(TileId(id)))] | FocusInternal(selector) => JsUtil.get_elem_by_selector(selector)##focus; /* Note: jumping her normalizes position, so when exiting * we know we're intially to the left and can move or not accordingly */ [ PerformAction(Jump(TileId(id))), - PerformAction(Project(UpdateModel(id, crime(true)))), + PerformAction(Project(SetKeyDispatch(id, true))), ]; + | Escape(selector, Left) => + JsUtil.get_elem_by_selector(selector)##blur; + [ + PerformAction(Project(SetKeyDispatch(id, false))), + PerformAction(Move(Local(Right(ByToken)))), + ]; + | Escape(selector, Right) => + JsUtil.get_elem_by_selector(selector)##blur; + [PerformAction(Project(SetKeyDispatch(id, false)))]; | Default => - //TODO(andrew): no-op - [PerformAction(Project(Remove(Id.invalid)))] + //TODO(andrew): proper no-op + [] | Remove => [PerformAction(Project(Remove(id)))] | UpdateSyntax(f) => [PerformAction(Project(UpdateSyntax(id, f)))] - | UpdateModel(action) => - //TODO(andrew) - [ - PerformAction( - Project( - UpdateModel( - id, - p => { - let (module P) = Projector.to_module(p); - P.update(action); - }, - ), - ), - ), + | UpdateModel(action) => [ + PerformAction(Project(UpdateModel(id, update_model(action)))), ] - | Seq(_a1, _a2) => [] //TODO(andrew) }; }; @@ -89,7 +72,7 @@ let to_module = }; }; -let wrap = +let wrap = //TODO(andrew): cleanup params ( ~inject as _, ~id as _, diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index 10df1f2c8e..f5b678da21 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -2,6 +2,11 @@ open Haz3lcore; open Virtual_dom.Vdom; open Util.Web; +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//TODO(andrew): unhardcode element !!!!!!!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +let selector = ".projector.text textarea"; + let put = (str: string): Projector.action(_) => Projector.UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); @@ -14,20 +19,12 @@ let textarea = Node.textarea( ~attr= Attr.many([ - //TODO(andrew): fudge factors below // Attr.create("rows", "4"), // Attr.create("cols", "21"), Attr.on_blur(_ => inject(UpdateModel(TextAreaCore.serialize(SetInside(false)))) ), - Attr.on_mousedown(_ => - Effect.Many([ - // inject(JumpTo), - // inject(UpdateModel(TextAreaCore.serialize(SetInside(true)))), - inject(FocusInternal(selector)), - //Effect.Stop_propagation, - ]) - ), + Attr.on_click(_ => inject(FocusInternal(selector))), Attr.on_input((_, new_text) => inject(put(new_text))), ]), [Node.text(text)], @@ -50,7 +47,7 @@ let view = clss( ["cols"] @ (model.inside ? [] : ProjectorViewModule.cls(indicated)), ), - n_of(1 + Util.StringUtil.num_linebreaks(text)) //TODO(andrew): magic number + n_of(1 + Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); @@ -62,25 +59,32 @@ let keymap = key: Key.t, ) : option(Projector.action(string)) => { - let JsUtil.{rows, cols} = JsUtil.textarea_caret_rel_pos(selector); - print_endline("model-inside:" ++ string_of_bool(model.inside)); - let pos = JsUtil.textarea_caret_rel_pos(selector); - let pos' = JsUtil.textarea_caret_position(selector); - print_endline("pos: " ++ JsUtil.show_caret_position(pos)); - print_endline("pos': " ++ JsUtil.show_text_position(pos')); + let textarea = JsUtil.TextArea.get(selector); + let focussed = model.inside; + //TODO(andrew): make actual focus king? + //IE query focus state FocusInternal side? + // but what if gets unfocussed due to eg refresh? + let pos = JsUtil.TextArea.caret_rel_pos(textarea); + let is_last_pos = pos.rows == Last && pos.cols == Last; + let is_first_pos = pos.rows == First && pos.cols == First; + // print_endline("is_focus:" ++ string_of_bool(is_focus)); + // let rel_pos = JsUtil.TextArea.caret_rel_pos(textarea); + // let pos = JsUtil.TextArea.caret_pos(textarea); + // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); + // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); switch (key.key, direction) { - | (D("ArrowRight"), Right) when !model.inside => + | (D("ArrowRight"), Right) when !focussed => Some(FocusInternal(selector)) - | (D("ArrowLeft"), Left) when !model.inside => - JsUtil.set_textarea_caret_to_end(selector); + | (D("ArrowLeft"), Left) when !focussed => + JsUtil.TextArea.set_caret_to_end(textarea); Some(FocusInternal(selector)); - | (D("ArrowRight"), _) when model.inside && rows == Last && cols == Last => + | (D("ArrowRight" | "ArrowDown"), _) when focussed && is_last_pos => Some(Escape(selector, Left)) - | (D("ArrowLeft"), _) when model.inside && rows == First && cols == First => + | (D("ArrowLeft" | "ArrowUp"), _) when focussed && is_first_pos => Some(Escape(selector, Right)) - | _ when model.inside => Some(Default) + | _ when focussed => Some(Default) | _ => - print_endline("Not model.inside"); + print_endline("Warning: Not focussed"); None; }; }; @@ -92,10 +96,6 @@ let mk = { [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.textarea_action; - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - //TODO(andrew): unhardcode element !!!!!!!!!! - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - let selector = ".projector.text textarea"; let value = syntax |> TextAreaCore.get |> Form.strip_quotes; let view = view(model, value, ~selector, ~inject); From fd4a217a34b25707adde220e18820ee62ea19be4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 26 Jun 2024 14:38:44 -0400 Subject: [PATCH 076/168] textarea projector now sets size depending on syntax. messy implementation... --- src/haz3lcore/zipper/Projector.re | 20 ++++++------- src/haz3lcore/zipper/Zipper.re | 2 +- src/haz3lcore/zipper/action/Perform.re | 3 +- .../zipper/action/ProjectorPerform.re | 25 +++++++++------- .../zipper/projectors/TextAreaCore.re | 19 +++++++++--- src/haz3lweb/Update.re | 5 +++- src/haz3lweb/view/Deco.re | 12 +++++++- src/haz3lweb/view/ProjectorsView.re | 30 +++++++++++-------- src/haz3lweb/www/style.css | 3 +- 9 files changed, 77 insertions(+), 42 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index f40db3e47d..ba1d1c8e36 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -8,13 +8,13 @@ module Map = ProjectorMap; [@deriving (show({with_path: false}), sexp, yojson)] type info = ZipperBase.projector_info; -let to_module = (p: projector): projector_core => +let to_module = (syntax, p: projector): projector_core => switch ((p: projector)) { | Fold(model) => FoldCore.mk(model) | Infer(model) => InferCore.mk(model) | Checkbox(model) => CheckboxCore.mk(model) | Slider(model) => SliderCore.mk(model) - | TextArea(model) => TextAreaCore.mk(model) + | TextArea(model) => TextAreaCore.mk(syntax, model) }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -71,16 +71,16 @@ let kind = (p: t): kind => let name = (p: t): string => p |> kind |> name_; -let shape = (p: t): shape => { - let (module P) = to_module(p); +let shape = (p: t, syntax): shape => { + let (module P) = to_module(syntax, p); P.placeholder(); }; -let placeholder = (p: t, id: Id.t): syntax => +let placeholder = (p: t, syntax: syntax): syntax => Piece.Tile({ - id, + id: Piece.id(syntax), label: - switch (shape(p)) { + switch (shape(p, syntax)) { | Inline(width) => [String.make(width, ' ')] | Block({row, col}) => [ String.make(row, '\n') ++ String.make(col, ' '), @@ -95,13 +95,13 @@ let placeholder = (p: t, id: Id.t): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let init = (f: kind, _syntax): projector_core => +let init = (f: kind, syntax): projector_core => switch (f) { | Fold => FoldCore.mk() | Infer => InferCore.mk({expected_ty: None}) | Checkbox => CheckboxCore.mk() | Slider => SliderCore.mk({value: 10}) - | TextArea => TextAreaCore.mk({inside: false}) + | TextArea => TextAreaCore.mk(syntax, {inside: false}) }; let create = @@ -264,7 +264,7 @@ module Project = { | None => syntax | Some(pr) => syntax_map := Id.Map.add(Piece.id(syntax), syntax, syntax_map^); - placeholder(pr, Piece.id(syntax)); + placeholder(pr, syntax); }; let go = (z: ZipperBase.t): proj_ret => { diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 18cd1208a5..804988530e 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -346,7 +346,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * would be projected to their placeholders before lookup */ let p = switch (ProjectorMap.find(Piece.id(p), z.projectors)) { - | Some(pr) => Projector.placeholder(pr, Piece.id(p)) + | Some(pr) => Projector.placeholder(pr, p) | None => p }; let seg = Piece.disassemble(p); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 86155f39e2..1b8ba660a2 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -47,7 +47,8 @@ let go_z = }; switch (a) { - | Project(a) => ProjectorPerform.go(a, statics.info_map, z) + | Project(a) => + ProjectorPerform.go(a, statics.info_map, meta.projected.syntax_map, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index c0e76d1fb8..f9ca5d804e 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -29,19 +29,24 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; -let go = (a: Action.project, info_map: Statics.Map.t, z: ZipperBase.t) => +let go = + (a: Action.project, info_map: Statics.Map.t, syntax_map, z: ZipperBase.t) => //TODO(andrew): avoid bringing statics in here? switch (a) { | SetKeyDispatch(id, b) => - let crime = (b, p) => { - //TODO(andrew): remove this crime - let (module P) = Projector.to_module(p); - P.update(TextAreaCore.serialize(SetInside(b))); - }; - Ok({ - ...z, - projectors: Map.update(id, Option.map(crime(b)), z.projectors), - }); + switch (Id.Map.find_opt(id, syntax_map)) { + | Some(syntax) => + let crime = (b, p) => { + //TODO(andrew): remove this crime + let (module P) = Projector.to_module(syntax, p); + P.update(TextAreaCore.serialize(SetInside(b))); + }; + Ok({ + ...z, + projectors: Map.update(id, Option.map(crime(b)), z.projectors), + }); + | None => Error(Action.Failure.Cant_project) + } | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 7d9661ee59..cab3dcc5e9 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -35,7 +35,7 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); -let mk = (model): projector_core => +let mk = (syntax, model): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -45,9 +45,20 @@ let mk = (model): projector_core => let model = model; let projector = TextArea(model); let can_project = _ => true; - //TODO(andrew): unhardcode below numbers - let row = 4 - 1; //Util.StringUtil.num_linebreaks(get(syntax)); - let placeholder = () => Block({row, col: 20 + 2}); + //TODO(andrew): cleanup + let row = Util.StringUtil.num_linebreaks(get(syntax)); + /* +2 for left and right padding */ + let col = + 2 + + List.fold_left( + max, + 0, + List.map( + String.length, + Re.Str.split(Re.Str.regexp("\n"), get(syntax)), + ), + ); + let placeholder = () => Block({row, col}); let auto_update = _: projector => TextArea(model); let update = (a: string) => switch (deserialize(a)) { diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index f56ee86327..e812e3315a 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -218,11 +218,14 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => let update_projectors = (model: Model.t): Model.t => { let statics = Model.current_statics(model); + let editor = Editors.get_editor(model.editors); + let syntax_map = editor.state.meta.projected.syntax_map; let editors = Editors.map_projectors( model.editors, (id, p) => { - let (module P) = Projector.to_module(p); + let syntax = Id.Map.find(id, syntax_map); + let (module P) = Projector.to_module(syntax, p); let info = Id.Map.find_opt(id, statics.info_map); P.auto_update({info: info}); }, diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index a473fc46cd..8b9e085802 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -20,7 +20,17 @@ module Deco = let tile = id => Id.Map.find(id, M.tiles); let caret = (z: Zipper.t): list(Node.t) => { - switch (ProjectorsView.shape(z)) { + //TODO(andrew): document + let shape = + switch (Indicated.index(z)) { + | Some(id) => + switch (Id.Map.find_opt(id, M.syntax_map)) { + | Some(syntax) => ProjectorsView.shape(z, syntax) + | None => None + } + | None => None + }; + switch (shape) { | Some(Block(_)) => [] | _ => let origin = Zipper.caret_point(M.map, z); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index e3e909ce93..1cc76c03ae 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -5,12 +5,12 @@ open Projector; open Util.OptUtil.Syntax; open Util.Web; -let update_model = (action, p) => { - let (module P) = Projector.to_module(p); +let update_model = (action, syntax, p) => { + let (module P) = Projector.to_module(syntax, p); P.update(action); }; -let handle = (id, action): list(UpdateAction.t) => { +let handle = (id, syntax, action): list(UpdateAction.t) => { switch (action) { | FocusInternal(selector) => JsUtil.get_elem_by_selector(selector)##focus; @@ -35,7 +35,9 @@ let handle = (id, action): list(UpdateAction.t) => { | Remove => [PerformAction(Project(Remove(id)))] | UpdateSyntax(f) => [PerformAction(Project(UpdateSyntax(id, f)))] | UpdateModel(action) => [ - PerformAction(Project(UpdateModel(id, update_model(action)))), + PerformAction( + Project(UpdateModel(id, update_model(action, syntax))), + ), ] }; }; @@ -51,23 +53,23 @@ let to_module = switch (p) { | Fold(model) => FoldView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, a))) + Effect.Many(List.map(inject, handle(id, syntax, a))) ) | Infer(model) => InferView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, a))) + Effect.Many(List.map(inject, handle(id, syntax, a))) ) | Checkbox(model) => CheckboxView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, a))) + Effect.Many(List.map(inject, handle(id, syntax, a))) ) | Slider(model) => SliderView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, a))) + Effect.Many(List.map(inject, handle(id, syntax, a))) ) | TextArea(model) => TextAreaView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, a))) + Effect.Many(List.map(inject, handle(id, syntax, a))) ) }; }; @@ -79,6 +81,7 @@ let wrap = //TODO(andrew): cleanup params ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~accent: option(ProjectorViewModule.accent), + ~syntax, p: Projector.t, view: Node.t, ) => @@ -105,7 +108,7 @@ let wrap = //TODO(andrew): cleanup params [view], ), //TODO(andrew): document - switch (Projector.shape(p)) { + switch (Projector.shape(p, syntax)) { | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) | Block(_) => div([]) }, @@ -133,6 +136,7 @@ let view = ~id, ~measurement, ~accent, + ~syntax, p, PV.view(accent), ); @@ -186,9 +190,9 @@ let kind = (editor: Editor.t) => { Projector.kind(p); }; -let shape = (z: Zipper.t) => { +let shape = (z: Zipper.t, syntax) => { let+ (_, p) = indicated_proj_z(z); - Projector.shape(p); + Projector.shape(p, syntax); }; let id = (editor: Editor.t) => { @@ -222,7 +226,7 @@ let key_handler = let (module PV) = to_module(id, syntax, p, ~inject); let* (_, d, _) = Indicated.piece(editor.state.zipper); let+ action = PV.keymap(d, key); - handle(id, action); + handle(id, syntax, action); }; let option_view = (name, n) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 8418f265f9..fa05b7bc6d 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -759,6 +759,7 @@ select { background-color: #e0d1b7; color: #f0e7d6; height: 100%; + width:100%; align-items: start; display: flex; border-left: 2px solid #0000; @@ -783,7 +784,7 @@ select { /* filter: sepia(1); */ resize: none; height: 100%; - /* width: 100%; */ + width: 100%; caret-color: red; padding: 0; margin: 0; From 4965c939e4dfb9ee2ae9f1476cb6603f59129e1e Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 6 Jul 2024 13:16:21 -0400 Subject: [PATCH 077/168] fmt --- src/haz3lcore/zipper/Touched.re | 4 +--- src/haz3lweb/util/JsUtil.re | 3 ++- src/haz3lweb/util/WeakMap.re | 6 ++++-- src/pretty/Box.rei | 4 +--- src/pretty/MeasuredLayout.rei | 4 +--- src/util/Monads.re | 2 +- src/util/StateMonad.re | 4 +--- src/util/StateMonad.rei | 4 +--- 8 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/haz3lcore/zipper/Touched.re b/src/haz3lcore/zipper/Touched.re index 2a428deb28..70644f9c2b 100644 --- a/src/haz3lcore/zipper/Touched.re +++ b/src/haz3lcore/zipper/Touched.re @@ -1,9 +1,7 @@ include Id.Map; type t = Id.Map.t(Time.t); -module type S = { - let touched: t; -}; +module type S = {let touched: t;}; let update = (t: Time.t, es: list(Effect.t), td: t) => es diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lweb/util/JsUtil.re index 1a23321710..916e0cb165 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lweb/util/JsUtil.re @@ -25,7 +25,8 @@ let get_elem_by_selector = selector => { }; let date_now = () => { - [%js new Js.date_now]; + %js + new Js.date_now; }; let timestamp = () => date_now()##valueOf; diff --git a/src/haz3lweb/util/WeakMap.re b/src/haz3lweb/util/WeakMap.re index a3ab0951a9..edf5fda68d 100644 --- a/src/haz3lweb/util/WeakMap.re +++ b/src/haz3lweb/util/WeakMap.re @@ -16,7 +16,8 @@ module JsMap = { let mk: 'k 'v. unit => t('k, 'v) = () => { let c = Js.Unsafe.global##._Map; - [%js new c]; + %js + new c; }; }; @@ -26,7 +27,8 @@ module JsWeakMap = { let mk: 'k 'v. unit => t('k, 'v) = () => { let c = Js.Unsafe.global##._WeakMap; - [%js new c]; + %js + new c; }; }; diff --git a/src/pretty/Box.rei b/src/pretty/Box.rei index 67bb197242..f19613be50 100644 --- a/src/pretty/Box.rei +++ b/src/pretty/Box.rei @@ -29,6 +29,4 @@ type t('annot) = | VBox(list(t('annot))) | Annot('annot, t('annot)); -module Make: (MemoTbl.S) => { - let mk: Layout.t('annot) => t('annot); - }; +module Make: (MemoTbl.S) => {let mk: Layout.t('annot) => t('annot);}; diff --git a/src/pretty/MeasuredLayout.rei b/src/pretty/MeasuredLayout.rei index 428cbb85e6..8ebc6dbf74 100644 --- a/src/pretty/MeasuredLayout.rei +++ b/src/pretty/MeasuredLayout.rei @@ -97,6 +97,4 @@ let pos_fold: let next_position: (~indent: int, MeasuredPosition.t, t(_)) => MeasuredPosition.t; -module Make: (MemoTbl.S) => { - let mk: Layout.t('annot) => t('annot); - }; +module Make: (MemoTbl.S) => {let mk: Layout.t('annot) => t('annot);}; diff --git a/src/util/Monads.re b/src/util/Monads.re index 89756c915a..6c0b0eda53 100644 --- a/src/util/Monads.re +++ b/src/util/Monads.re @@ -75,4 +75,4 @@ module Make_Monad_Z = (M: MONAD_ZIP) => { }; module Make_Monad_B = (M: MONAD_BASIC) => - Make_Monad_Z(Make_Zip(Make_Functor(M))); + Make_Monad_Z((Make_Zip((Make_Functor(M))))); diff --git a/src/util/StateMonad.re b/src/util/StateMonad.re index 6931dfd31b..d3e1fa9a49 100644 --- a/src/util/StateMonad.re +++ b/src/util/StateMonad.re @@ -1,6 +1,4 @@ -module type STATE = { - type t; -}; +module type STATE = {type t;}; module type S = { type state; diff --git a/src/util/StateMonad.rei b/src/util/StateMonad.rei index 42a668f00e..96eed96261 100644 --- a/src/util/StateMonad.rei +++ b/src/util/StateMonad.rei @@ -5,9 +5,7 @@ /** State type module specification. */ -module type STATE = { - type t; -}; +module type STATE = {type t;}; /** Output of the functor [Make]. From 288c4dceb41e5435e5a0c2b8b49ddcaa5f3d5586 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 6 Jul 2024 17:20:24 -0400 Subject: [PATCH 078/168] vdom dep in core build to merge view into projectors module. type errors resolved but non-compiling possibly due to build issue. --- src/{haz3lweb/util => haz3lcore}/JsUtil.re | 2 +- src/{haz3lweb/util => haz3lcore}/Key.re | 20 ++- src/{haz3lweb => haz3lcore}/Os.re | 0 src/haz3lcore/ProjectorsUpdate.re | 14 ++ src/haz3lcore/dune | 9 +- src/haz3lcore/zipper/Projector.re | 54 +++----- src/haz3lcore/zipper/ZipperBase.re | 36 ++++- src/haz3lcore/zipper/action/Action.re | 4 +- .../zipper/projectors/CheckboxCore.re | 29 +++- src/haz3lcore/zipper/projectors/FoldCore.re | 16 ++- src/haz3lcore/zipper/projectors/InferCore.re | 20 ++- src/haz3lcore/zipper/projectors/SliderCore.re | 28 +++- .../zipper/projectors/TextAreaCore.re | 97 +++++++++++++- src/haz3lweb/Benchmark.re | 2 + src/haz3lweb/Log.re | 1 + src/haz3lweb/LogEntry.re | 1 + src/haz3lweb/Main.re | 1 + src/haz3lweb/dune | 6 +- src/haz3lweb/view/DebugMode.re | 1 + src/haz3lweb/view/Deco.re | 3 +- src/haz3lweb/view/NutMenu.re | 1 + src/haz3lweb/view/ProjectorViewModule.re | 4 +- src/haz3lweb/view/ProjectorsView.re | 124 +++++++----------- src/haz3lweb/view/projectors/CheckboxView.re | 4 +- src/haz3lweb/view/projectors/FoldView.re | 4 +- src/haz3lweb/view/projectors/InferView.re | 4 +- src/haz3lweb/view/projectors/SliderView.re | 5 +- src/haz3lweb/view/projectors/TextAreaView.re | 10 +- 28 files changed, 335 insertions(+), 165 deletions(-) rename src/{haz3lweb/util => haz3lcore}/JsUtil.re (98%) rename src/{haz3lweb/util => haz3lcore}/Key.re (71%) rename src/{haz3lweb => haz3lcore}/Os.re (100%) create mode 100644 src/haz3lcore/ProjectorsUpdate.re diff --git a/src/haz3lweb/util/JsUtil.re b/src/haz3lcore/JsUtil.re similarity index 98% rename from src/haz3lweb/util/JsUtil.re rename to src/haz3lcore/JsUtil.re index 916e0cb165..d4af906110 100644 --- a/src/haz3lweb/util/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -208,7 +208,7 @@ module TextArea = { |> Js.Opt.get(_, _ => failwith("TextArea.get")); let lines = (textarea: t): list(string) => - Str.split(Str.regexp("\n"), Js.to_string(textarea##.value)); + Re.Str.split(Re.Str.regexp("\n"), Js.to_string(textarea##.value)); let caret_pos = (textarea: t): pos => { let rec find_position = (lines, cur_pos, row, col) => { diff --git a/src/haz3lweb/util/Key.re b/src/haz3lcore/Key.re similarity index 71% rename from src/haz3lweb/util/Key.re rename to src/haz3lcore/Key.re index 8f7b3a3fcb..2aca94dac3 100644 --- a/src/haz3lweb/util/Key.re +++ b/src/haz3lcore/Key.re @@ -1,3 +1,5 @@ +open Js_of_ocaml; + [@deriving (show({with_path: false}), yojson)] type dir = | KeyUp @@ -28,8 +30,16 @@ type t = { alt: held, }; +let get_key = evt => + Js.to_string(Js.Optdef.get(evt##.key, () => failwith("JsUtil.get_key"))); + +let ctrl_held = evt => Js.to_bool(evt##.ctrlKey); +let shift_held = evt => Js.to_bool(evt##.shiftKey); +let alt_held = evt => Js.to_bool(evt##.altKey); +let meta_held = evt => Js.to_bool(evt##.metaKey); + let key_of = (dir: dir, evt): key => { - let key = JsUtil.get_key(evt); + let key = get_key(evt); switch (dir) { | KeyUp => U(key) | KeyDown => D(key) @@ -41,10 +51,10 @@ let to_held: bool => held = b => b ? Down : Up; let mk = (dir, evt): t => { key: key_of(dir, evt), sys: Os.is_mac^ ? Mac : PC, - shift: to_held(JsUtil.shift_held(evt)), - meta: to_held(JsUtil.meta_held(evt)), - ctrl: to_held(JsUtil.ctrl_held(evt)), - alt: to_held(JsUtil.alt_held(evt)), + shift: to_held(shift_held(evt)), + meta: to_held(meta_held(evt)), + ctrl: to_held(ctrl_held(evt)), + alt: to_held(alt_held(evt)), }; let modifier_string = (h: held, m): string => h == Down ? " + " ++ m : ""; diff --git a/src/haz3lweb/Os.re b/src/haz3lcore/Os.re similarity index 100% rename from src/haz3lweb/Os.re rename to src/haz3lcore/Os.re diff --git a/src/haz3lcore/ProjectorsUpdate.re b/src/haz3lcore/ProjectorsUpdate.re new file mode 100644 index 0000000000..5135dfc5c8 --- /dev/null +++ b/src/haz3lcore/ProjectorsUpdate.re @@ -0,0 +1,14 @@ +open Sexplib.Std; + +/* The kind of syntax data to which projection can apply */ +[@deriving (show({with_path: false}), sexp, yojson)] +type syntax = Piece.t; + +[@deriving (show({with_path: false}), sexp, yojson)] +type t = + | Remove + | FocusInternal(string) + | Default // Defer input to focal DOM element + | Escape(string, Util.Direction.t) + | UpdateSyntax(syntax => syntax) + | UpdateModel(string); diff --git a/src/haz3lcore/dune b/src/haz3lcore/dune index 2bfd69309d..56745adcd5 100644 --- a/src/haz3lcore/dune +++ b/src/haz3lcore/dune @@ -2,12 +2,17 @@ (library (name haz3lcore) - (libraries util re sexplib unionFind uuidm) + (libraries util re sexplib unionFind uuidm virtual_dom) (js_of_ocaml (flags (:include js-of-ocaml-flags-%{profile}))) (preprocess - (pps ppx_let ppx_sexp_conv ppx_deriving.show ppx_yojson_conv))) + (pps + ppx_let + ppx_sexp_conv + ppx_deriving.show + ppx_yojson_conv + js_of_ocaml-ppx))) (rule (write-file js-of-ocaml-flags-dev "(:standard --debuginfo --noinline)")) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ba1d1c8e36..26a66d289a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,6 +1,6 @@ open Util; open ZipperBase; -open Sexplib.Std; +// open Sexplib.Std; [@deriving (show({with_path: false}), sexp, yojson)] module Map = ProjectorMap; @@ -8,25 +8,29 @@ module Map = ProjectorMap; [@deriving (show({with_path: false}), sexp, yojson)] type info = ZipperBase.projector_info; +[@deriving (show({with_path: false}), sexp, yojson)] +type syntax = Piece.t; + let to_module = (syntax, p: projector): projector_core => switch ((p: projector)) { - | Fold(model) => FoldCore.mk(model) - | Infer(model) => InferCore.mk(model) - | Checkbox(model) => CheckboxCore.mk(model) - | Slider(model) => SliderCore.mk(model) - | TextArea(model) => TextAreaCore.mk(syntax, model) + | Fold(model) => FoldCore.mk(model, ~syntax) + | Infer(model) => InferCore.mk(model, ~syntax) + | Checkbox(model) => CheckboxCore.mk(model, ~syntax) + | Slider(model) => SliderCore.mk(model, ~syntax) + | TextArea(model) => TextAreaCore.mk(model, ~syntax) }; -[@deriving (show({with_path: false}), sexp, yojson)] -type t = projector; +let init = (f: kind, syntax): projector_core => + switch (f) { + | Fold => FoldCore.mk((), ~syntax) + | Infer => InferCore.mk({expected_ty: None}, ~syntax) + | Checkbox => CheckboxCore.mk((), ~syntax) + | Slider => SliderCore.mk({value: 10}, ~syntax) + | TextArea => TextAreaCore.mk({inside: false}, ~syntax) + }; [@deriving (show({with_path: false}), sexp, yojson)] -type kind = - | Fold - | Infer - | Checkbox - | Slider - | TextArea; +type t = projector; let name_ = (p: kind): string => switch (p) { @@ -47,19 +51,6 @@ let of_name = (p: string): kind => | _ => failwith("Unknown projector kind") }; -/* The kind of syntax data to which projection can apply */ -[@deriving (show({with_path: false}), sexp, yojson)] -type syntax = Piece.t; - -[@deriving (show({with_path: false}), sexp, yojson)] -type action('action) = - | Remove - | FocusInternal(string) - | Default // Defer input to focal DOM element - | Escape(string, Util.Direction.t) - | UpdateSyntax(syntax => syntax) - | UpdateModel('action); - let kind = (p: t): kind => switch (p) { | Fold(_) => Fold @@ -95,15 +86,6 @@ let placeholder = (p: t, syntax: syntax): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let init = (f: kind, syntax): projector_core => - switch (f) { - | Fold => FoldCore.mk() - | Infer => InferCore.mk({expected_ty: None}) - | Checkbox => CheckboxCore.mk() - | Slider => SliderCore.mk({value: 10}) - | TextArea => TextAreaCore.mk(syntax, {inside: false}) - }; - let create = (k: kind, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { let (module P) = init(k, syntax); diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 7a98ceb836..6395d2f4ed 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -1,4 +1,5 @@ open Sexplib.Std; +open Virtual_dom.Vdom; /* Projector model types */ @@ -27,11 +28,6 @@ type slider_action = unit; type textarea_action = | SetInside(bool); -[@deriving (show({with_path: false}), sexp, yojson)] -type shape = - | Inline(int) - | Block(Measured.Point.t); - [@deriving (show({with_path: false}), sexp, yojson)] type projector = | Fold(fold) @@ -56,6 +52,32 @@ module ProjectorMap = { [@deriving (show({with_path: false}), sexp, yojson)] type projector_info = {info: option(Info.t)}; +[@deriving (show({with_path: false}), sexp, yojson)] +type shape = + | Inline(int) + | Block(Measured.Point.t); + +[@deriving (show({with_path: false}), sexp, yojson)] +type accent = + | Indicated(Util.Direction.t) + | Selected; + +let cls = (indicated: option(accent)) => + switch (indicated) { + | Some(Indicated(Left)) => ["indicated", "left"] + | Some(Indicated(Right)) => ["indicated", "right"] + | Some(Selected) => ["selected"] + | None => [] + }; + +[@deriving (show({with_path: false}), sexp, yojson)] +type kind = + | Fold + | Infer + | Checkbox + | Slider + | TextArea; + module type ProjectorCore = { [@deriving (show({with_path: false}), sexp, yojson)] type model; @@ -67,6 +89,10 @@ module type ProjectorCore = { let can_project: Piece.t => bool; let auto_update: projector_info => projector; let update: string => projector; + let view: + (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), option(accent)) => + Node.t; + let keymap: (Util.Direction.t, Key.t) => option(ProjectorsUpdate.t); }; type projector_core = (module ProjectorCore); diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 581e04ad85..58e1427a86 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -47,8 +47,8 @@ type select = type project = | UpdateSyntax(Id.t, Piece.t => Piece.t) | UpdateModel(Id.t, Projector.t => Projector.t) - | SetIndicated(Projector.kind) - | ToggleIndicated(Projector.kind) + | SetIndicated(ZipperBase.kind) + | ToggleIndicated(ZipperBase.kind) | SetKeyDispatch(Id.t, bool) | Remove(Id.t); diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index ce021944b7..04e7925be3 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -1,5 +1,6 @@ open Sexplib.Std; open ZipperBase; +open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { @@ -23,7 +24,27 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let mk = (model): projector_core => +let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), ~syntax, _) => + Node.input( + ~attr= + Attr.many( + [ + Attr.create("type", "checkbox"), + Attr.on_input((_, _) => inject(UpdateSyntax(toggle))), + //JsUtil.stop_mousedown_propagation, + ] + @ (get(syntax) ? [Attr.checked] : []), + ), + [], + ); + +let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => + switch (key) { + | {key: D("Escape"), _} => Some(Remove) + | _ => None + }; + +let mk = (model, ~syntax): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -31,9 +52,11 @@ let mk = (model): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; - let projector = Checkbox(model); + let projector: projector = Checkbox(model); let can_project = p => state_of(p) != None; let placeholder = () => Inline(2); let auto_update = _: projector => Checkbox(); - let update = _action => Checkbox(); + let update = (_action): projector => Checkbox(); + let view = view(~syntax); + let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index a9cb9addb6..6b6d2df7ad 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,7 +1,9 @@ open Sexplib.Std; open ZipperBase; +open Virtual_dom.Vdom; +open Node; -let mk = (): projector_core => +let mk = (_model: ZipperBase.fold, ~syntax as _): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -9,9 +11,15 @@ let mk = (): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = (); - let projector = Fold(); + let projector: ZipperBase.projector = Fold(); let can_project = _ => true; let placeholder = () => Inline(2); - let auto_update = _: projector => Fold(); - let update = _action => Fold(); + let auto_update = _: ZipperBase.projector => Fold(); + let update = (_action): ZipperBase.projector => Fold(); + let view = (~inject, _) => + div( + ~attr=Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove)), + [text("⋱")], + ); + let keymap = (_, _): option(ProjectorsUpdate.t) => None; }); diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index b8f0f88dad..2d757f42d6 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,4 +1,6 @@ open ZipperBase; +open Virtual_dom.Vdom; +open Node; let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { @@ -15,7 +17,7 @@ let expected_ty = (info: option(Info.t)) => let display = expected_ty => "⋱ ⇐ " ++ (expected_ty |> display_ty |> Typ.pretty_print); -let mk = (model: infer): projector_core => +let mk = (model: ZipperBase.infer, ~syntax as _): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -23,7 +25,7 @@ let mk = (model: infer): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = infer_action; let model = model; - let projector = Infer(model); + let projector: projector = Infer(model); let can_project = (p: Piece.t): bool => switch (p) { @@ -38,5 +40,17 @@ let mk = (model: infer): projector_core => print_endline("updating infer projector"); Infer({expected_ty: Some(expected_ty(info))}); }; - let update = _action => Infer(model); + let update = (_action): projector => Infer(model); + + let view = (~inject, _) => + div( + ~attr=Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove)), + [text(display(model.expected_ty))], + ); + + let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => + switch (key) { + | {key: D("Escape"), _} => Some(Remove) + | _ => None + }; }); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 2b4b6e2fe7..58635ca814 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,4 +1,5 @@ open ZipperBase; +open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { @@ -20,7 +21,26 @@ let get = (piece: Piece.t): int => | Some(s) => s }; -let mk = (model): projector_core => +let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), value: int, _) => + Node.input( + ~attr= + Attr.many([ + Attr.create("type", "range"), + Attr.create("value", string_of_int(value)), + Attr.on_input((_evt, new_val) => + inject(UpdateSyntax(_ => put(new_val))) + ), + ]), + [], + ); + +let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => + switch (key) { + | {key: D("Escape"), _} => Some(Remove) + | _ => None + }; + +let mk = (model, ~syntax): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -28,9 +48,11 @@ let mk = (model): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.slider_action; let model = model; - let projector = Slider(model); + let projector: projector = Slider(model); let can_project = p => state_of(p) != None; let placeholder = () => Inline(10); let auto_update = _: projector => Slider(model); - let update = _ => Slider(model); + let update = _: projector => Slider(model); + let view = view(get(syntax)); + let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index cab3dcc5e9..0c2ed04175 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,4 +1,10 @@ open ZipperBase; +open Virtual_dom.Vdom; + +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +//TODO(andrew): unhardcode element !!!!!!!!!! +// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +let selector = ".projector.text textarea"; let serialize = a => a |> ZipperBase.sexp_of_textarea_action |> Sexplib.Sexp.to_string; @@ -35,7 +41,89 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); -let mk = (syntax, model): projector_core => +let put = (str: string): ProjectorsUpdate.t => + UpdateSyntax(_ => str |> Form.string_quote |> put); + +let textarea = + ( + ~selector, + ~inject: ProjectorsUpdate.t => Ui_effect.t(unit), + text: string, + ) => + Node.textarea( + ~attr= + Attr.many([ + // Attr.create("rows", "4"), + // Attr.create("cols", "21"), + Attr.on_blur(_ => + inject(UpdateModel(serialize(SetInside(false)))) + ), + Attr.on_click(_ => inject(FocusInternal(selector))), + Attr.on_input((_, new_text) => inject(put(new_text))), + ]), + [Node.text(text)], + ); + +let n_of = (n: int) => + [Node.text("·")] + @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); + +let view = + ( + ~inject, + ~selector, + model: ZipperBase.textarea, + text: string, + indicated: option(ZipperBase.accent), + ) => + Node.div( + ~attr= + Attr.classes( + ["cols"] @ (model.inside ? [] : ZipperBase.cls(indicated)), + ), + n_of(1 + Util.StringUtil.num_linebreaks(text)) + @ [textarea(~inject, ~selector, text)], + ); + +let keymap = + ( + ~selector, + model: ZipperBase.textarea, + direction: Util.Direction.t, + key: Key.t, + ) + : option(ProjectorsUpdate.t) => { + let textarea = JsUtil.TextArea.get(selector); + let focussed = model.inside; + //TODO(andrew): make actual focus king? + //IE query focus state FocusInternal side? + // but what if gets unfocussed due to eg refresh? + let pos = JsUtil.TextArea.caret_rel_pos(textarea); + let is_last_pos = pos.rows == Last && pos.cols == Last; + let is_first_pos = pos.rows == First && pos.cols == First; + // print_endline("is_focus:" ++ string_of_bool(is_focus)); + // let rel_pos = JsUtil.TextArea.caret_rel_pos(textarea); + // let pos = JsUtil.TextArea.caret_pos(textarea); + // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); + // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); + switch (key.key, direction) { + | (D("ArrowRight"), Right) when !focussed => + Some(FocusInternal(selector)) + | (D("ArrowLeft"), Left) when !focussed => + JsUtil.TextArea.set_caret_to_end(textarea); + Some(FocusInternal(selector)); + | (D("ArrowRight" | "ArrowDown"), _) when focussed && is_last_pos => + Some(Escape(selector, Left)) + | (D("ArrowLeft" | "ArrowUp"), _) when focussed && is_first_pos => + Some(Escape(selector, Right)) + | _ when focussed => Some(Default) + | _ => + print_endline("Warning: Not focussed"); + None; + }; +}; + +let mk = (~syntax, model): projector_core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -43,7 +131,7 @@ let mk = (syntax, model): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = ZipperBase.textarea_action; let model = model; - let projector = TextArea(model); + let projector: projector = TextArea(model); let can_project = _ => true; //TODO(andrew): cleanup let row = Util.StringUtil.num_linebreaks(get(syntax)); @@ -60,8 +148,11 @@ let mk = (syntax, model): projector_core => ); let placeholder = () => Block({row, col}); let auto_update = _: projector => TextArea(model); - let update = (a: string) => + let update = (a: string): projector => switch (deserialize(a)) { | SetInside(b) => TextArea({inside: b}) }; + let value = syntax |> get |> Form.strip_quotes; + let view = view(model, value, ~selector); + let keymap = keymap(~selector, model); }); diff --git a/src/haz3lweb/Benchmark.re b/src/haz3lweb/Benchmark.re index 5d0b4390f1..067166af8b 100644 --- a/src/haz3lweb/Benchmark.re +++ b/src/haz3lweb/Benchmark.re @@ -1,3 +1,5 @@ +open Haz3lcore; + let sample_1 = {|# Hazel Language Quick Reference # # Recursive Functions (arrow type annotation required) # diff --git a/src/haz3lweb/Log.re b/src/haz3lweb/Log.re index 83876619ef..010594ee42 100644 --- a/src/haz3lweb/Log.re +++ b/src/haz3lweb/Log.re @@ -1,6 +1,7 @@ /* Logging system for actions. Persists log via IndexedDB */ open Sexplib.Std; +open Haz3lcore; let is_action_logged: UpdateAction.t => bool = fun diff --git a/src/haz3lweb/LogEntry.re b/src/haz3lweb/LogEntry.re index 948c88779e..3e10e965a2 100644 --- a/src/haz3lweb/LogEntry.re +++ b/src/haz3lweb/LogEntry.re @@ -1,4 +1,5 @@ open Sexplib.Std; +open Haz3lcore; [@deriving (show({with_path: false}), yojson, sexp)] type t = (float, UpdateAction.t); diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index e1268431af..6072605161 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -1,6 +1,7 @@ open Js_of_ocaml; open Incr_dom; open Haz3lweb; +open Haz3lcore; let scroll_to_caret = ref(true); let edit_action_applied = ref(true); diff --git a/src/haz3lweb/dune b/src/haz3lweb/dune index 6dcaeb3b1d..9187df7ca5 100644 --- a/src/haz3lweb/dune +++ b/src/haz3lweb/dune @@ -54,11 +54,11 @@ (:include js-of-ocaml-flags-%{profile}))) (preprocess (pps - ppx_yojson_conv - js_of_ocaml-ppx ppx_let ppx_sexp_conv - ppx_deriving.show))) + ppx_deriving.show + ppx_yojson_conv + js_of_ocaml-ppx))) (executable (name main) diff --git a/src/haz3lweb/view/DebugMode.re b/src/haz3lweb/view/DebugMode.re index 67618ee6ee..af8b5d9bb3 100644 --- a/src/haz3lweb/view/DebugMode.re +++ b/src/haz3lweb/view/DebugMode.re @@ -1,4 +1,5 @@ open Virtual_dom.Vdom; +open Haz3lcore; [@deriving (show({with_path: false}), sexp, yojson)] type action = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 8b9e085802..7b517327e3 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -320,8 +320,7 @@ module Deco = let accent = (z: Zipper.t) => switch (Indicated.piece(z)) { - | Some((p, d, _)) => - Some((Piece.id(p), ProjectorViewModule.Indicated(d))) + | Some((p, d, _)) => Some((Piece.id(p), ZipperBase.Indicated(d))) | None => None }; diff --git a/src/haz3lweb/view/NutMenu.re b/src/haz3lweb/view/NutMenu.re index 7b771c40fb..f5362db0d8 100644 --- a/src/haz3lweb/view/NutMenu.re +++ b/src/haz3lweb/view/NutMenu.re @@ -3,6 +3,7 @@ open Js_of_ocaml; open Node; open Util.Web; open Widgets; +open Haz3lcore; let export_persistent_data = (~inject: Update.t => 'a) => button_named( diff --git a/src/haz3lweb/view/ProjectorViewModule.re b/src/haz3lweb/view/ProjectorViewModule.re index 51055f1b0c..cc8545b047 100644 --- a/src/haz3lweb/view/ProjectorViewModule.re +++ b/src/haz3lweb/view/ProjectorViewModule.re @@ -1,6 +1,8 @@ open Haz3lcore; open Virtual_dom.Vdom; +//TODO(andrew): cleanup/rm + [@deriving (show({with_path: false}), sexp, yojson)] type accent = | Indicated(Util.Direction.t) @@ -19,7 +21,7 @@ module type ProjectorView = { type action; let view: option(accent) => Node.t; - let keymap: (Util.Direction.t, Key.t) => option(Projector.action(string)); + let keymap: (Util.Direction.t, Key.t) => option(ProjectorsUpdate.t); }; type t = (module ProjectorView); diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 1cc76c03ae..a9e1fb3884 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -10,68 +10,31 @@ let update_model = (action, syntax, p) => { P.update(action); }; -let handle = (id, syntax, action): list(UpdateAction.t) => { - switch (action) { - | FocusInternal(selector) => - JsUtil.get_elem_by_selector(selector)##focus; - /* Note: jumping her normalizes position, so when exiting - * we know we're intially to the left and can move or not accordingly */ - [ - PerformAction(Jump(TileId(id))), - PerformAction(Project(SetKeyDispatch(id, true))), - ]; - | Escape(selector, Left) => - JsUtil.get_elem_by_selector(selector)##blur; - [ - PerformAction(Project(SetKeyDispatch(id, false))), - PerformAction(Move(Local(Right(ByToken)))), - ]; - | Escape(selector, Right) => - JsUtil.get_elem_by_selector(selector)##blur; - [PerformAction(Project(SetKeyDispatch(id, false)))]; - | Default => - //TODO(andrew): proper no-op - [] - | Remove => [PerformAction(Project(Remove(id)))] - | UpdateSyntax(f) => [PerformAction(Project(UpdateSyntax(id, f)))] - | UpdateModel(action) => [ - PerformAction( +let handle = (id, syntax, action: ProjectorsUpdate.t): list(UpdateAction.t) => { + ( + switch (action) { + | FocusInternal(selector) => + JsUtil.get_elem_by_selector(selector)##focus; + /* Note: jumping her normalizes position, so when exiting + * we know we're intially to the left and can move or not accordingly */ + [Jump(TileId(id)), Project(SetKeyDispatch(id, true))]; + | Escape(selector, Left) => + JsUtil.get_elem_by_selector(selector)##blur; + [Project(SetKeyDispatch(id, false)), Move(Local(Right(ByToken)))]; + | Escape(selector, Right) => + JsUtil.get_elem_by_selector(selector)##blur; + [Project(SetKeyDispatch(id, false))]; + | Default => + //TODO(andrew): proper no-op + [] + | Remove => [Project(Remove(id))] + | UpdateSyntax(f) => [Project(UpdateSyntax(id, f))] + | UpdateModel(action) => [ Project(UpdateModel(id, update_model(action, syntax))), - ), - ] - }; -}; - -let to_module = - ( - id: Id.t, - syntax: Piece.t, - p: Projector.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), - ) - : ProjectorViewModule.t => { - switch (p) { - | Fold(model) => - FoldView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, syntax, a))) - ) - | Infer(model) => - InferView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, syntax, a))) - ) - | Checkbox(model) => - CheckboxView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, syntax, a))) - ) - | Slider(model) => - SliderView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, syntax, a))) - ) - | TextArea(model) => - TextAreaView.mk(syntax, model, ~inject=a => - Effect.Many(List.map(inject, handle(id, syntax, a))) - ) - }; + ] + } + ) + |> List.map(a => Update.PerformAction(a)); }; let wrap = //TODO(andrew): cleanup params @@ -80,7 +43,7 @@ let wrap = //TODO(andrew): cleanup params ~id as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~accent: option(ProjectorViewModule.accent), + ~accent: option(ZipperBase.accent), ~syntax, p: Projector.t, view: Node.t, @@ -90,7 +53,7 @@ let wrap = //TODO(andrew): cleanup params Attr.many([ // JsUtil.stop_mousedown_propagation, Attr.classes( - ["projector", Projector.name(p)] @ ProjectorViewModule.cls(accent), + ["projector", Projector.name(p)] @ ZipperBase.cls(accent), ), DecUtil.abs_style(measurement, ~font_metrics), ]), @@ -123,13 +86,17 @@ let view = ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, - ~accent: option(ProjectorViewModule.accent), + ~accent: option(ZipperBase.accent), ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); - let (module PV) = to_module(id, syntax, p, ~inject); + let (module PV) = to_module(syntax, p); + let inject = a => + handle(id, syntax, a) + |> List.map(x => inject(x)) + |> (x => Virtual_dom.Vdom.Effect.Many(x)); wrap( ~font_metrics, ~inject, @@ -138,7 +105,7 @@ let view = ~accent, ~syntax, p, - PV.view(accent), + PV.view(~inject, accent), ); }; @@ -202,10 +169,11 @@ let id = (editor: Editor.t) => { }; }; -let ci = (editor: Editor.t, ~inject: UpdateAction.t => Ui_effect.t(unit)) => { - let* (id, p) = indicated_proj_ed(editor); - let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module PV) = to_module(id, syntax, p, ~inject); +let ci = + (editor: Editor.t, ~inject as _: UpdateAction.t => Ui_effect.t(unit)) => { + let+ (_id, p) = indicated_proj_ed(editor); + //let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); + //let (module P) = to_module(syntax, p); div( ~attr=Attr.classes(["projector-ci"]), [text(String.sub(Projector.name(p), 0, 1))], @@ -216,16 +184,16 @@ let key_handler = ( editor: Editor.t, key: Key.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), + ~inject as _: UpdateAction.t => Ui_effect.t(unit), ) : option(list(UpdateAction.t)) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module PV) = to_module(id, syntax, p, ~inject); + let (module P) = to_module(syntax, p); let* (_, d, _) = Indicated.piece(editor.state.zipper); - let+ action = PV.keymap(d, key); + let+ action = P.keymap(d, key); handle(id, syntax, action); }; @@ -235,16 +203,16 @@ let option_view = (name, n) => [text(n)], ); -let set = (k: Projector.kind) => +let set = (k: ZipperBase.kind) => Update.PerformAction(Project(SetIndicated(k))); let remove = (id: Id.t) => Update.PerformAction(Project(Remove(id))); -let applicable_projectors = (ci: Info.t) => +let applicable_projectors = (ci: Info.t): list(ZipperBase.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [Checkbox] + | Pat(Bool) => [ZipperBase.Checkbox] | Exp(Int) | Pat(Int) => [Slider] | Exp(String) @@ -252,7 +220,7 @@ let applicable_projectors = (ci: Info.t) => | _ => [] } ) - @ [Fold] + @ [ZipperBase.Fold] @ ( switch (ci) { | InfoExp(_) @@ -306,7 +274,7 @@ let panel = (~inject, editor: Editor.t, ci: Info.t) => { ), ]), applicable_projectors(ci) - |> List.map((k: Projector.kind) => Projector.name_(k)) + |> List.map((k: ZipperBase.kind) => Projector.name_(k)) |> List.map(currently_selected(editor)), ), ], diff --git a/src/haz3lweb/view/projectors/CheckboxView.re b/src/haz3lweb/view/projectors/CheckboxView.re index 82d2cd3fce..f74c9157aa 100644 --- a/src/haz3lweb/view/projectors/CheckboxView.re +++ b/src/haz3lweb/view/projectors/CheckboxView.re @@ -1,7 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax, _) => +let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), syntax, _) => Node.input( ~attr= Attr.many( @@ -17,7 +17,7 @@ let view = (~inject: Projector.action(_) => Ui_effect.t(unit), syntax, _) => [], ); -let keymap = (_, key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/FoldView.re b/src/haz3lweb/view/projectors/FoldView.re index 89b4230d5a..1bf878c6a6 100644 --- a/src/haz3lweb/view/projectors/FoldView.re +++ b/src/haz3lweb/view/projectors/FoldView.re @@ -12,8 +12,8 @@ let mk = let view = _ => div( - ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + ~attr=Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove)), [text("⋱")], ); - let keymap = (_, _): option(Projector.action(string)) => None; + let keymap = (_, _): option(ProjectorsUpdate.t) => None; }); diff --git a/src/haz3lweb/view/projectors/InferView.re b/src/haz3lweb/view/projectors/InferView.re index db3382f708..b89ccfa377 100644 --- a/src/haz3lweb/view/projectors/InferView.re +++ b/src/haz3lweb/view/projectors/InferView.re @@ -4,11 +4,11 @@ open Node; let view = (~inject, expected_ty: option(Typ.t), _) => div( - ~attr=Attr.on_double_click(_ => inject(Projector.Remove)), + ~attr=Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove)), [text(InferCore.display(expected_ty))], ); -let keymap = (_, key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/SliderView.re b/src/haz3lweb/view/projectors/SliderView.re index a262f7e84f..7f8211880d 100644 --- a/src/haz3lweb/view/projectors/SliderView.re +++ b/src/haz3lweb/view/projectors/SliderView.re @@ -1,8 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; -let view = - (~inject: Projector.action(_) => Ui_effect.t(unit), value: int, _) => +let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), value: int, _) => Node.input( ~attr= Attr.many([ @@ -15,7 +14,7 @@ let view = [], ); -let keymap = (_, key: Key.t): option(Projector.action(string)) => +let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lweb/view/projectors/TextAreaView.re b/src/haz3lweb/view/projectors/TextAreaView.re index f5b678da21..e9227077d7 100644 --- a/src/haz3lweb/view/projectors/TextAreaView.re +++ b/src/haz3lweb/view/projectors/TextAreaView.re @@ -7,13 +7,13 @@ open Util.Web; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! let selector = ".projector.text textarea"; -let put = (str: string): Projector.action(_) => - Projector.UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); +// let put = (str: string):ProjectorsUpdate.t => +// UpdateSyntax(_ => str |> Form.string_quote |> TextAreaCore.put); let textarea = ( ~selector, - ~inject: Projector.action(string) => Ui_effect.t(unit), + ~inject: ProjectorsUpdate.t => Ui_effect.t(unit), text: string, ) => Node.textarea( @@ -25,7 +25,7 @@ let textarea = inject(UpdateModel(TextAreaCore.serialize(SetInside(false)))) ), Attr.on_click(_ => inject(FocusInternal(selector))), - Attr.on_input((_, new_text) => inject(put(new_text))), + //Attr.on_input((_, new_text) => inject(put(new_text))), ]), [Node.text(text)], ); @@ -58,7 +58,7 @@ let keymap = direction: Util.Direction.t, key: Key.t, ) - : option(Projector.action(string)) => { + : option(ProjectorsUpdate.t) => { let textarea = JsUtil.TextArea.get(selector); let focussed = model.inside; //TODO(andrew): make actual focus king? From ff9ba63bcb74ba7543357070b7df4bbaff5dccca Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 8 Jul 2024 19:22:18 -0400 Subject: [PATCH 079/168] projectors cleanup --- src/haz3lcore/zipper/Projector.re | 41 ++++---- src/haz3lcore/zipper/ProjectorBase.re | 83 ++++++++++++++++ src/haz3lcore/zipper/Zipper.re | 14 +-- src/haz3lcore/zipper/ZipperBase.re | 99 +------------------ src/haz3lcore/zipper/action/Action.re | 4 +- .../zipper/action/ProjectorPerform.re | 5 +- .../zipper/projectors/CheckboxCore.re | 4 +- src/haz3lcore/zipper/projectors/FoldCore.re | 10 +- src/haz3lcore/zipper/projectors/InferCore.re | 8 +- src/haz3lcore/zipper/projectors/SliderCore.re | 17 ++-- .../zipper/projectors/TextAreaCore.re | 36 ++++--- src/haz3lweb/view/Deco.re | 2 +- src/haz3lweb/view/ProjectorsView.re | 27 ++--- 13 files changed, 161 insertions(+), 189 deletions(-) create mode 100644 src/haz3lcore/zipper/ProjectorBase.re diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 26a66d289a..a6b22680ef 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,17 +1,10 @@ open Util; -open ZipperBase; -// open Sexplib.Std; - -[@deriving (show({with_path: false}), sexp, yojson)] -module Map = ProjectorMap; - -[@deriving (show({with_path: false}), sexp, yojson)] -type info = ZipperBase.projector_info; +include ProjectorBase; [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; -let to_module = (syntax, p: projector): projector_core => +let to_module = (syntax, p: projector): core => switch ((p: projector)) { | Fold(model) => FoldCore.mk(model, ~syntax) | Infer(model) => InferCore.mk(model, ~syntax) @@ -20,7 +13,7 @@ let to_module = (syntax, p: projector): projector_core => | TextArea(model) => TextAreaCore.mk(model, ~syntax) }; -let init = (f: kind, syntax): projector_core => +let init = (f: kind, syntax): core => switch (f) { | Fold => FoldCore.mk((), ~syntax) | Infer => InferCore.mk({expected_ty: None}, ~syntax) @@ -110,8 +103,8 @@ module Select = { ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { let (ls, content) = Segment.push_right((ls, z.selection.content)); z - |> put_selection_content(content) - |> put_siblings((ls, rs)) + |> ZipperBase.put_selection_content(content) + |> ZipperBase.put_siblings((ls, rs)) |> Option.some; }; @@ -119,8 +112,8 @@ module Select = { ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { let (content, rs) = Segment.push_left((z.selection.content, rs)); z - |> put_selection_content(content) - |> put_siblings((ls, rs)) + |> ZipperBase.put_selection_content(content) + |> ZipperBase.put_siblings((ls, rs)) |> Option.some; }; @@ -137,8 +130,8 @@ module Select = { ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { let (ls, content) = Segment.push_left((ls, z.selection.content)); z - |> put_selection_content(content) - |> put_siblings((ls, rs)) + |> ZipperBase.put_selection_content(content) + |> ZipperBase.put_siblings((ls, rs)) |> Option.some; }; @@ -146,8 +139,8 @@ module Select = { ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { let (content, rs) = Segment.push_right((z.selection.content, rs)); z - |> put_selection_content(content) - |> put_siblings((ls, rs)) + |> ZipperBase.put_selection_content(content) + |> ZipperBase.put_siblings((ls, rs)) |> Option.some; }; @@ -170,9 +163,13 @@ module Move = { let go = (d: Direction.t, z: ZipperBase.t): option(ZipperBase.t) => switch (d, neighbor_is(z.projectors, z.relatives.siblings)) { | (Left, (Some(_), _)) => - Some(put_siblings(Segment.push_right(z.relatives.siblings), z)) + Some( + ZipperBase.put_siblings(Segment.push_right(z.relatives.siblings), z), + ) | (Right, (_, Some(_))) => - Some(put_siblings(Segment.push_left(z.relatives.siblings), z)) + Some( + ZipperBase.put_siblings(Segment.push_left(z.relatives.siblings), z), + ) | _ => None }; }; @@ -280,7 +277,7 @@ module Syntax = { let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { let (l, r) = z.relatives.siblings; let sibs = (List.map(f, l), List.map(f, r)); - z |> put_siblings(sibs); + z |> ZipperBase.put_siblings(sibs); }; let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { @@ -289,7 +286,7 @@ module Syntax = { | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) | sibs => sibs }; - z |> put_siblings(sibs); + z |> ZipperBase.put_siblings(sibs); }; let update = (f: syntax => syntax, id: Id.t, z: ZipperBase.t): ZipperBase.t => { diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re new file mode 100644 index 0000000000..14e1efdbd9 --- /dev/null +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -0,0 +1,83 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +open Virtual_dom.Vdom; + +[@deriving (show({with_path: false}), sexp, yojson)] +type fold = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type infer = {expected_ty: option(Typ.t)}; +[@deriving (show({with_path: false}), sexp, yojson)] +type checkbox = unit; +[@deriving (show({with_path: false}), sexp, yojson)] +type slider = {value: int}; +[@deriving (show({with_path: false}), sexp, yojson)] +type textarea = {inside: bool}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type projector = + | Fold(fold) + | Infer(infer) + | Checkbox(checkbox) + | Slider(slider) + | TextArea(textarea); + +[@deriving (show({with_path: false}), sexp, yojson)] +module Map = { + open Id.Map; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = Id.Map.t(projector); + let empty = empty; + let find = find_opt; + let mem = mem; + let mapi = mapi; + let update = update; +}; + +/* Externally calculated info to be fed to projectors */ +[@deriving (show({with_path: false}), sexp, yojson)] +type info = {info: option(Info.t)}; + +[@deriving (show({with_path: false}), sexp, yojson)] +type shape = + | Inline(int) + | Block(Measured.Point.t); + +[@deriving (show({with_path: false}), sexp, yojson)] +type accent = + | Indicated(Util.Direction.t) + | Selected; + +let cls = (indicated: option(accent)) => + switch (indicated) { + | Some(Indicated(Left)) => ["indicated", "left"] + | Some(Indicated(Right)) => ["indicated", "right"] + | Some(Selected) => ["selected"] + | None => [] + }; + +[@deriving (show({with_path: false}), sexp, yojson)] +type kind = + | Fold + | Infer + | Checkbox + | Slider + | TextArea; + +module type Core = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model; + [@deriving (show({with_path: false}), sexp, yojson)] + type action; + let projector: projector; + let model: model; + let placeholder: unit => shape; + let can_project: Piece.t => bool; + let auto_update: info => projector; + let update: string => projector; + let view: + (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), option(accent)) => + Node.t; + let keymap: (Util.Direction.t, Key.t) => option(ProjectorsUpdate.t); +}; + +type core = (module Core); diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 804988530e..09bc70fdbd 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -1,12 +1,6 @@ open Util; open OptUtil.Syntax; -open ZipperBase; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = ZipperBase.t; - -[@deriving (show({with_path: false}), sexp, yojson)] -module Caret = ZipperBase.Caret; +include ZipperBase; let init: unit => t = () => { @@ -17,7 +11,7 @@ let init: unit => t = ancestors: [], }, caret: Outer, - projectors: ProjectorMap.empty, + projectors: ProjectorBase.Map.empty, }; let next_blank = _ => Id.mk(); @@ -67,7 +61,7 @@ let unzip = (seg: Segment.t): t => { ancestors: [], }, caret: Outer, - projectors: ProjectorMap.empty, + projectors: ProjectorBase.Map.empty, }; let sibs_with_sel = @@ -345,7 +339,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * a Grout becomes a Tile. Hence we convert pieces that * would be projected to their placeholders before lookup */ let p = - switch (ProjectorMap.find(Piece.id(p), z.projectors)) { + switch (ProjectorBase.Map.find(Piece.id(p), z.projectors)) { | Some(pr) => Projector.placeholder(pr, p) | None => p }; diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 7b20293cdf..41db1c804b 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -1,102 +1,5 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; -open Virtual_dom.Vdom; - -/* Projector model types */ - -[@deriving (show({with_path: false}), sexp, yojson)] -type fold = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; -[@deriving (show({with_path: false}), sexp, yojson)] -type checkbox = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type slider = {value: int}; -[@deriving (show({with_path: false}), sexp, yojson)] -type textarea = {inside: bool}; - -/* Projector action types */ - -[@deriving (show({with_path: false}), sexp, yojson)] -type fold_action = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type infer_action = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type checkbox_action = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type slider_action = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type textarea_action = - | SetInside(bool); - -[@deriving (show({with_path: false}), sexp, yojson)] -type projector = - | Fold(fold) - | Infer(infer) - | Checkbox(checkbox) - | Slider(slider) - | TextArea(textarea); - -[@deriving (show({with_path: false}), sexp, yojson)] -module ProjectorMap = { - open Id.Map; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(projector); - let empty = empty; - let find = find_opt; - let mem = mem; - let mapi = mapi; - let update = update; -}; - -/* Externally calculated info to be fed to projectors */ -[@deriving (show({with_path: false}), sexp, yojson)] -type projector_info = {info: option(Info.t)}; - -[@deriving (show({with_path: false}), sexp, yojson)] -type shape = - | Inline(int) - | Block(Measured.Point.t); - -[@deriving (show({with_path: false}), sexp, yojson)] -type accent = - | Indicated(Util.Direction.t) - | Selected; - -let cls = (indicated: option(accent)) => - switch (indicated) { - | Some(Indicated(Left)) => ["indicated", "left"] - | Some(Indicated(Right)) => ["indicated", "right"] - | Some(Selected) => ["selected"] - | None => [] - }; - -[@deriving (show({with_path: false}), sexp, yojson)] -type kind = - | Fold - | Infer - | Checkbox - | Slider - | TextArea; - -module type ProjectorCore = { - [@deriving (show({with_path: false}), sexp, yojson)] - type model; - [@deriving (show({with_path: false}), sexp, yojson)] - type action; - let projector: projector; - let model: model; - let placeholder: unit => shape; - let can_project: Piece.t => bool; - let auto_update: projector_info => projector; - let update: string => projector; - let view: - (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), option(accent)) => - Node.t; - let keymap: (Util.Direction.t, Key.t) => option(ProjectorsUpdate.t); -}; - -type projector_core = (module ProjectorCore); module Caret = { [@deriving (show({with_path: false}), sexp, yojson)] @@ -124,7 +27,7 @@ type t = { relatives: Relatives.t, caret: Caret.t, [@opaque] - projectors: ProjectorMap.t, + projectors: ProjectorBase.Map.t, }; let update_relatives = (f: Relatives.t => Relatives.t, z: t): t => { diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 9fd6592fc4..5257281ad9 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -48,8 +48,8 @@ type select = type project = | UpdateSyntax(Id.t, Piece.t => Piece.t) | UpdateModel(Id.t, Projector.t => Projector.t) - | SetIndicated(ZipperBase.kind) - | ToggleIndicated(ZipperBase.kind) + | SetIndicated(Projector.kind) + | ToggleIndicated(Projector.kind) | SetKeyDispatch(Id.t, bool) | Remove(Id.t); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index f9ca5d804e..43ddfc5de6 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -12,7 +12,7 @@ let move_out_of_piece = } }; -let set = (id: Id.t, p: option(t), z: ZipperBase.t) => { +let set = (id: Id.t, p: option(t), z: Zipper.t) => { ...z, projectors: Map.update(id, _ => p, z.projectors), }; @@ -29,8 +29,7 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; -let go = - (a: Action.project, info_map: Statics.Map.t, syntax_map, z: ZipperBase.t) => +let go = (a: Action.project, info_map: Statics.Map.t, syntax_map, z: Zipper.t) => //TODO(andrew): avoid bringing statics in here? switch (a) { | SetKeyDispatch(id, b) => diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 1fc8470f11..565c679d87 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -1,6 +1,6 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; -open ZipperBase; +open ProjectorBase; open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => @@ -43,7 +43,7 @@ let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => | _ => None }; -let mk = (model, ~syntax): projector_core => +let mk = (model, ~syntax): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index c5e6a0999c..e5265114fd 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,10 +1,10 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; -open ZipperBase; +open ProjectorBase; open Virtual_dom.Vdom; open Node; -let mk = (_model: ZipperBase.fold, ~syntax as _): projector_core => +let mk = (_model: fold, ~syntax as _): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] @@ -12,11 +12,11 @@ let mk = (_model: ZipperBase.fold, ~syntax as _): projector_core => [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = (); - let projector: ZipperBase.projector = Fold(); + let projector: projector = Fold(); let can_project = _ => true; let placeholder = () => Inline(2); - let auto_update = _: ZipperBase.projector => Fold(); - let update = (_action): ZipperBase.projector => Fold(); + let auto_update = _: projector => Fold(); + let update = (_action): projector => Fold(); let view = (~inject, _) => div( ~attrs=[Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove))], diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index 5d13a245b7..ec373e92ac 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,4 +1,6 @@ -open ZipperBase; +open ProjectorBase; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open Node; @@ -17,13 +19,13 @@ let expected_ty = (info: option(Info.t)) => let display = expected_ty => "⋱ ⇐ " ++ (expected_ty |> display_ty |> Typ.pretty_print); -let mk = (model: ZipperBase.infer, ~syntax as _): projector_core => +let mk = (model: infer, ~syntax as _): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = infer; [@deriving (show({with_path: false}), sexp, yojson)] - type action = infer_action; + type action = unit; let model = model; let projector: projector = Infer(model); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 91b6ce800c..ca893902f5 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,4 +1,5 @@ -open ZipperBase; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => @@ -39,19 +40,19 @@ let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => | _ => None }; -let mk = (model, ~syntax): projector_core => +let mk = (model, ~syntax): ProjectorBase.core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.slider; + type model = ProjectorBase.slider; [@deriving (show({with_path: false}), sexp, yojson)] - type action = ZipperBase.slider_action; + type action = unit; let model = model; - let projector: projector = Slider(model); + let projector: ProjectorBase.projector = Slider(model); let can_project = p => state_of(p) != None; - let placeholder = () => Inline(10); - let auto_update = _: projector => Slider(model); - let update = _: projector => Slider(model); + let placeholder = (): ProjectorBase.shape => Inline(10); + let auto_update = _: ProjectorBase.projector => Slider(model); + let update = _: ProjectorBase.projector => Slider(model); let view = view(get(syntax)); let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index cfb21167b9..af653aa209 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,16 +1,20 @@ -open ZipperBase; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //TODO(andrew): unhardcode element !!!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +[@deriving (show({with_path: false}), sexp, yojson)] +type action_ = + | SetInside(bool); + let selector = ".projector.text textarea"; -let serialize = a => - a |> ZipperBase.sexp_of_textarea_action |> Sexplib.Sexp.to_string; +let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; -let deserialize = a => - a |> Sexplib.Sexp.of_string |> ZipperBase.textarea_action_of_sexp; +let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; /* Function to escape linebreaks */ let escape_linebreaks = (str: string): string => { @@ -69,14 +73,14 @@ let view = ( ~inject, ~selector, - model: ZipperBase.textarea, + model: ProjectorBase.textarea, text: string, - indicated: option(ZipperBase.accent), + indicated: option(ProjectorBase.accent), ) => Node.div( ~attrs=[ Attr.classes( - ["cols"] @ (model.inside ? [] : ZipperBase.cls(indicated)), + ["cols"] @ (model.inside ? [] : ProjectorBase.cls(indicated)), ), ], n_of(1 + Util.StringUtil.num_linebreaks(text)) @@ -86,7 +90,7 @@ let view = let keymap = ( ~selector, - model: ZipperBase.textarea, + model: ProjectorBase.textarea, direction: Util.Direction.t, key: Key.t, ) @@ -121,15 +125,15 @@ let keymap = }; }; -let mk = (~syntax, model): projector_core => +let mk = (~syntax, model): ProjectorBase.core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = ZipperBase.textarea; + type model = ProjectorBase.textarea; [@deriving (show({with_path: false}), sexp, yojson)] - type action = ZipperBase.textarea_action; + type action = action_; let model = model; - let projector: projector = TextArea(model); + let projector: ProjectorBase.projector = TextArea(model); let can_project = _ => true; //TODO(andrew): cleanup let row = Util.StringUtil.num_linebreaks(get(syntax)); @@ -144,9 +148,9 @@ let mk = (~syntax, model): projector_core => Re.Str.split(Re.Str.regexp("\n"), get(syntax)), ), ); - let placeholder = () => Block({row, col}); - let auto_update = _: projector => TextArea(model); - let update = (a: string): projector => + let placeholder = (): ProjectorBase.shape => Block({row, col}); + let auto_update = _: ProjectorBase.projector => TextArea(model); + let update = (a: string): ProjectorBase.projector => switch (deserialize(a)) { | SetInside(b) => TextArea({inside: b}) }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 7b517327e3..c6e55fded3 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -320,7 +320,7 @@ module Deco = let accent = (z: Zipper.t) => switch (Indicated.piece(z)) { - | Some((p, d, _)) => Some((Piece.id(p), ZipperBase.Indicated(d))) + | Some((p, d, _)) => Some((Piece.id(p), Projector.Indicated(d))) | None => None }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index de976859b4..636a87e62a 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -43,7 +43,7 @@ let wrap = //TODO(andrew): cleanup params ~id as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~accent: option(ZipperBase.accent), + ~accent: option(Projector.accent), ~syntax, p: Projector.t, view: Node.t, @@ -52,7 +52,7 @@ let wrap = //TODO(andrew): cleanup params ~attrs=[ // JsUtil.stop_mousedown_propagation, Attr.classes( - ["projector", Projector.name(p)] @ ZipperBase.cls(accent), + ["projector", Projector.name(p)] @ Projector.cls(accent), ), DecUtil.abs_style(measurement, ~font_metrics), ], @@ -84,7 +84,7 @@ let view = ~measured: Measured.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, - ~accent: option(ZipperBase.accent), + ~accent: option(Projector.accent), ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); @@ -167,17 +167,6 @@ let id = (editor: Editor.t) => { }; }; -let ci = - (editor: Editor.t, ~inject as _: UpdateAction.t => Ui_effect.t(unit)) => { - let+ (_id, p) = indicated_proj_ed(editor); - //let+ syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - //let (module P) = to_module(syntax, p); - div( - ~attrs=[Attr.classes(["projector-ci"])], - [text(String.sub(Projector.name(p), 0, 1))], - ); -}; - let key_handler = ( editor: Editor.t, @@ -201,16 +190,16 @@ let option_view = (name, n) => [text(n)], ); -let set = (k: ZipperBase.kind) => +let set = (k: Projector.kind) => Update.PerformAction(Project(SetIndicated(k))); let remove = (id: Id.t) => Update.PerformAction(Project(Remove(id))); -let applicable_projectors = (ci: Info.t): list(ZipperBase.kind) => +let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [ZipperBase.Checkbox] + | Pat(Bool) => [Projector.Checkbox] | Exp(Int) | Pat(Int) => [Slider] | Exp(String) @@ -218,7 +207,7 @@ let applicable_projectors = (ci: Info.t): list(ZipperBase.kind) => | _ => [] } ) - @ [ZipperBase.Fold] + @ [Projector.Fold] @ ( switch (ci) { | InfoExp(_) @@ -274,7 +263,7 @@ let panel = (~inject, editor: Editor.t, ci: Info.t) => { ), ], applicable_projectors(ci) - |> List.map((k: ZipperBase.kind) => Projector.name_(k)) + |> List.map((k: Projector.kind) => Projector.name_(k)) |> List.map(currently_selected(editor)), ), ], From e35b722074af59a49c459344a83c9b992d9c29a5 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 8 Jul 2024 19:35:11 -0400 Subject: [PATCH 080/168] projectors cleanup --- opam.export | 18 ++++++++++++++++++ src/haz3lcore/zipper/action/Perform.re | 2 +- ...rojectorPerform.re => ProjectorsPerform.re} | 0 3 files changed, 19 insertions(+), 1 deletion(-) rename src/haz3lcore/zipper/action/{ProjectorPerform.re => ProjectorsPerform.re} (100%) diff --git a/opam.export b/opam.export index c197ade563..8ab9f07013 100644 --- a/opam.export +++ b/opam.export @@ -18,7 +18,9 @@ roots: [ "ezjs_min.0.3.0" "incr_dom.v0.16.0" "js_of_ocaml-ppx.5.8.2" + "merlin.5.1-502" "ocaml-base-compiler.5.2.0" + "ocaml-lsp-server.1.18.0~5.2preview" "ocamlformat.0.26.2" "omd.1.3.2" "ppx_deriving.6.0.2" @@ -53,6 +55,7 @@ installed: [ "bigstringaf.0.9.1" "bin_prot.v0.16.0" "camlp-streams.5.0.1" + "chrome-trace.3.16.0" "cmdliner.1.3.0" "conf-bash.1" "conf-gmp.4" @@ -61,12 +64,16 @@ installed: [ "cppo.1.6.9" "csexp.1.5.2" "diffable.v0.16.0" + "dot-merlin-reader.5.1" "dune.3.16.0" "dune-build-info.3.16.0" "dune-configurator.3.16.0" + "dune-rpc.3.16.0" + "dyn.3.16.0" "either.1.0.0" "ezjs_idb.0.1.1" "ezjs_min.0.3.0" + "fiber.3.7.0" "fieldslib.v0.16.0" "fix.20230505" "fpath.0.7.3" @@ -92,24 +99,32 @@ installed: [ "menhirCST.20231231" "menhirLib.20231231" "menhirSdk.20231231" + "merlin.5.1-502" "merlin-extend.0.6.1" + "merlin-lib.5.1-502" "num.1.5" "ocaml.5.2.0" "ocaml-base-compiler.5.2.0" "ocaml-compiler-libs.v0.17.0" "ocaml-config.3" + "ocaml-index.1.0" + "ocaml-lsp-server.1.18.0~5.2preview" "ocaml-options-vanilla.1" "ocaml-syntax-shims.1.0.0" "ocaml-version.3.6.7" "ocamlbuild.0.14.3" + "ocamlc-loc.3.16.0" "ocamlfind.1.9.6" "ocamlformat.0.26.2" "ocamlformat-lib.0.26.2" + "ocamlformat-rpc-lib.0.26.2" "ocp-indent.1.8.1" "octavius.1.2.2" "ojs.1.1.2" "omd.1.3.2" + "ordering.3.16.0" "parsexp.v0.16.0" + "pp.1.2.0" "ppx_assert.v0.16.0" "ppx_base.v0.16.0" "ppx_bench.v0.16.0" @@ -159,9 +174,11 @@ installed: [ "seq.base" "sexplib.v0.16.0" "sexplib0.v0.16.0" + "spawn.v0.15.1" "splittable_random.v0.16.0" "stdio.v0.16.0" "stdlib-shims.0.3.0" + "stdune.3.16.0" "stored_reversed.v0.16.0" "streamable.v0.16.1" "stringext.1.6.0" @@ -180,6 +197,7 @@ installed: [ "uutf.1.0.3" "variantslib.v0.16.0" "virtual_dom.v0.16.0" + "xdg.3.16.0" "yojson.2.2.2" "zarith.1.13" "zarith_stubs_js.v0.16.1" diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 1b8ba660a2..bb98fa44d2 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -48,7 +48,7 @@ let go_z = switch (a) { | Project(a) => - ProjectorPerform.go(a, statics.info_map, meta.projected.syntax_map, z) + ProjectorsPerform.go(a, statics.info_map, meta.projected.syntax_map, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorsPerform.re similarity index 100% rename from src/haz3lcore/zipper/action/ProjectorPerform.re rename to src/haz3lcore/zipper/action/ProjectorsPerform.re From 5fefe3189784c799434dd0cea430b96458d1e2b5 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 8 Jul 2024 20:22:58 -0400 Subject: [PATCH 081/168] projectorsView.handle now only returns one action as god intended --- src/haz3lcore/zipper/action/Action.re | 3 +- src/haz3lcore/zipper/action/Perform.re | 9 ++- .../zipper/action/ProjectorsPerform.re | 54 +++++++++++--- src/haz3lweb/view/Cell.re | 4 +- src/haz3lweb/view/CursorInspector.re | 6 +- src/haz3lweb/view/Page.re | 24 ++++--- src/haz3lweb/view/ProjectorsView.re | 72 +++++++------------ 7 files changed, 98 insertions(+), 74 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 5257281ad9..9a5607e498 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -50,7 +50,8 @@ type project = | UpdateModel(Id.t, Projector.t => Projector.t) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) - | SetKeyDispatch(Id.t, bool) + | FocusInternal(Id.t) + | Escape(Id.t, Direction.t) | Remove(Id.t); [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index bb98fa44d2..05c20633cd 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -48,7 +48,14 @@ let go_z = switch (a) { | Project(a) => - ProjectorsPerform.go(a, statics.info_map, meta.projected.syntax_map, z) + ProjectorsPerform.go( + Move.jump_to_id, + Move.primary, + a, + statics.info_map, + meta.projected.syntax_map, + z, + ) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | MoveToNextHole(d) => diff --git a/src/haz3lcore/zipper/action/ProjectorsPerform.re b/src/haz3lcore/zipper/action/ProjectorsPerform.re index 43ddfc5de6..a5eaf6ecc0 100644 --- a/src/haz3lcore/zipper/action/ProjectorsPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorsPerform.re @@ -29,23 +29,54 @@ let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; -let go = (a: Action.project, info_map: Statics.Map.t, syntax_map, z: Zipper.t) => +let go = + ( + jump_to_id, + primary: + (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), + a: Action.project, + info_map: Statics.Map.t, + syntax_map, + z: Zipper.t, + ) => { //TODO(andrew): avoid bringing statics in here? - switch (a) { - | SetKeyDispatch(id, b) => + let crime = (syntax, b, p) => { + //TODO(andrew): remove this crime + let (module P) = Projector.to_module(syntax, p); + P.update(TextAreaCore.serialize(SetInside(b))); + }; + let set_dispatch = (z: Zipper.t, id, b) => switch (Id.Map.find_opt(id, syntax_map)) { | Some(syntax) => - let crime = (b, p) => { - //TODO(andrew): remove this crime - let (module P) = Projector.to_module(syntax, p); - P.update(TextAreaCore.serialize(SetInside(b))); - }; Ok({ ...z, - projectors: Map.update(id, Option.map(crime(b)), z.projectors), - }); + projectors: + Map.update(id, Option.map(crime(syntax, b)), z.projectors), + }) | None => Error(Action.Failure.Cant_project) - } + }; + switch (a) { + | FocusInternal(id) => + /* Note: jumping her normalizes position, so when exiting + * we know we're intially to the left and can move or not accordingly */ + let z = + switch (jump_to_id(z, id)) { + | Some(z) => z + | None => z + }; + set_dispatch(z, id, true); + // JsUtil.get_elem_by_selector(selector)##focus; + | Escape(id, Left) => + // JsUtil.get_elem_by_selector(selector)##blur; + let z = + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + }; + set_dispatch(z, id, false); + | Escape(id, Right) => + // JsUtil.get_elem_by_selector(selector)##blur; + set_dispatch(z, id, false) | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) @@ -67,3 +98,4 @@ let go = (a: Action.project, info_map: Statics.Map.t, syntax_map, z: Zipper.t) = | UpdateModel(id, f) => Ok({...z, projectors: Map.update(id, Option.map(f), z.projectors)}) }; +}; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index fbb59aee57..a17a82bb6c 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -262,7 +262,7 @@ let footer = let editor_view = ( - ~inject, + ~inject: UpdateAction.t => Ui_effect.t(unit), ~ui_state as {font_metrics, show_backpack_targets, mousedown, _}: Model.ui_state, ~settings: Settings.t, @@ -282,7 +282,7 @@ let editor_view = let code_text_view = Code.view(~sort, ~font_metrics, ~settings, editor); let deco_view = deco( - ~inject, + ~inject=a => inject(PerformAction(Project(a))), ~font_metrics, ~show_backpack_targets, ~selected, diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 2f05007620..14b65ab09e 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -290,7 +290,11 @@ let view = | Some(ci) => bar_view([ inspector_view(~inject, ~settings, ci), - ProjectorsView.panel(~inject, editor, ci), + ProjectorsView.panel( + ~inject=a => inject(PerformAction(Project(a))), + editor, + ci, + ), ]) }; }; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 3d1ac52ceb..b9f377575c 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -12,11 +12,15 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => open Effect; let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some([]) => + switch (ProjectorsView.key_handler(editor, key)) { + | Some(Remove(id)) when id == Id.invalid => //TODO(andrew): proper no-op (see ProjectorsView) Ignore - | Some(action) => Many([Prevent_default] @ List.map(inject, action)) + | Some(action) => + Many([ + Prevent_default, + inject(Update.PerformAction(Project(action))), + ]) | None => switch (Keyboard.handle_key_event(key)) { | None => Ignore @@ -25,21 +29,19 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => }; }; let keypress_handler = - (~inject, ~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)) - : Effect.t(unit) => { - open Effect; //TODO(andrew): cleanup - + (~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)): Effect.t(unit) => { let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.key_handler(editor, ~inject, key)) { - | Some([]) => + switch (ProjectorsView.key_handler(editor, key)) { + | Some(Remove(id)) when id == Id.invalid => + //TODO(andrew): document why this exists //TODO(andrew): proper no-op (see ProjectorsView) - Ignore + Effect.Ignore | _ => Effect.Prevent_default }; }; [ - Attr.on_keypress(keypress_handler(~inject, ~dir=KeyDown)), + Attr.on_keypress(keypress_handler(~dir=KeyDown)), Attr.on_keyup(key_handler(~inject, ~dir=KeyUp)), Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), /* safety handler in case mousedown overlay doesn't catch it */ diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorsView.re index 636a87e62a..a2b7494971 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorsView.re @@ -10,37 +10,27 @@ let update_model = (action, syntax, p) => { P.update(action); }; -let handle = (id, syntax, action: ProjectorsUpdate.t): list(UpdateAction.t) => { - ( - switch (action) { - | FocusInternal(selector) => - JsUtil.get_elem_by_selector(selector)##focus; - /* Note: jumping her normalizes position, so when exiting - * we know we're intially to the left and can move or not accordingly */ - [Jump(TileId(id)), Project(SetKeyDispatch(id, true))]; - | Escape(selector, Left) => - JsUtil.get_elem_by_selector(selector)##blur; - [Project(SetKeyDispatch(id, false)), Move(Local(Right(ByToken)))]; - | Escape(selector, Right) => - JsUtil.get_elem_by_selector(selector)##blur; - [Project(SetKeyDispatch(id, false))]; - | Default => - //TODO(andrew): proper no-op - [] - | Remove => [Project(Remove(id))] - | UpdateSyntax(f) => [Project(UpdateSyntax(id, f))] - | UpdateModel(action) => [ - Project(UpdateModel(id, update_model(action, syntax))), - ] - } - ) - |> List.map(a => Update.PerformAction(a)); -}; +let handle = (id, syntax, action: ProjectorsUpdate.t): Action.project => + switch (action) { + | FocusInternal(selector) => + JsUtil.get_elem_by_selector(selector)##focus; + Action.(FocusInternal(id)); + | Escape(selector, Left) => + JsUtil.get_elem_by_selector(selector)##blur; + Escape(id, Left); + | Escape(selector, Right) => + JsUtil.get_elem_by_selector(selector)##blur; + Escape(id, Right); + | Default => + //TODO(andrew): proper no-op + Remove(Id.invalid) + | Remove => Remove(id) + | UpdateSyntax(f) => UpdateSyntax(id, f) + | UpdateModel(action) => UpdateModel(id, update_model(action, syntax)) + }; -let wrap = //TODO(andrew): cleanup params +let wrap = ( - ~inject as _, - ~id as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~accent: option(Projector.accent), @@ -82,7 +72,7 @@ let view = ps: Map.t, ~syntax_map: Id.Map.t(syntax), ~measured: Measured.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), + ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, ~accent: option(Projector.accent), ) @@ -91,14 +81,9 @@ let view = let* syntax = Id.Map.find_opt(id, syntax_map); let+ measurement = Measured.find_by_id(id, measured); let (module P) = to_module(syntax, p); - let inject = a => - handle(id, syntax, a) - |> List.map(x => inject(x)) - |> (x => Virtual_dom.Vdom.Effect.Many(x)); + let inject = a => handle(id, syntax, a) |> inject; wrap( ~font_metrics, - ~inject, - ~id, ~measurement, ~accent, ~syntax, @@ -118,7 +103,7 @@ let view_all = ps: Map.t, ~syntax_map: Id.Map.t(syntax), ~measured: Measured.t, - ~inject: UpdateAction.t => Ui_effect.t(unit), + ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, ~accent, ) => @@ -167,13 +152,7 @@ let id = (editor: Editor.t) => { }; }; -let key_handler = - ( - editor: Editor.t, - key: Key.t, - ~inject as _: UpdateAction.t => Ui_effect.t(unit), - ) - : option(list(UpdateAction.t)) => +let key_handler = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => @@ -190,10 +169,9 @@ let option_view = (name, n) => [text(n)], ); -let set = (k: Projector.kind) => - Update.PerformAction(Project(SetIndicated(k))); +let set = (k: Projector.kind) => Action.SetIndicated(k); -let remove = (id: Id.t) => Update.PerformAction(Project(Remove(id))); +let remove = (id: Id.t) => Action.Remove(id); let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( From 582e0979b2939c9de369fa12d400222796b25e1d Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 8 Jul 2024 22:45:48 -0400 Subject: [PATCH 082/168] projectors cleanup --- src/haz3lcore/ProjectorsUpdate.re | 15 ---- src/haz3lcore/zipper/Projector.re | 37 +++++----- src/haz3lcore/zipper/ProjectorBase.re | 40 ++++++----- src/haz3lcore/zipper/action/Perform.re | 2 +- ...ojectorsPerform.re => ProjectorPerform.re} | 0 .../zipper/projectors/CheckboxCore.re | 4 +- src/haz3lcore/zipper/projectors/FoldCore.re | 10 +-- src/haz3lcore/zipper/projectors/InferCore.re | 12 ++-- src/haz3lcore/zipper/projectors/SliderCore.re | 18 ++--- .../zipper/projectors/TextAreaCore.re | 68 +++++++++---------- src/haz3lweb/view/CursorInspector.re | 2 +- src/haz3lweb/view/Deco.re | 6 +- src/haz3lweb/view/Page.re | 8 +-- .../{ProjectorsView.re => ProjectorView.re} | 64 ++++++++--------- 14 files changed, 133 insertions(+), 153 deletions(-) delete mode 100644 src/haz3lcore/ProjectorsUpdate.re rename src/haz3lcore/zipper/action/{ProjectorsPerform.re => ProjectorPerform.re} (100%) rename src/haz3lweb/view/{ProjectorsView.re => ProjectorView.re} (82%) diff --git a/src/haz3lcore/ProjectorsUpdate.re b/src/haz3lcore/ProjectorsUpdate.re deleted file mode 100644 index a1dc7fc998..0000000000 --- a/src/haz3lcore/ProjectorsUpdate.re +++ /dev/null @@ -1,15 +0,0 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; - -/* The kind of syntax data to which projection can apply */ -[@deriving (show({with_path: false}), sexp, yojson)] -type syntax = Piece.t; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = - | Remove - | FocusInternal(string) - | Default // Defer input to focal DOM element - | Escape(string, Util.Direction.t) - | UpdateSyntax(syntax => syntax) - | UpdateModel(string); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index a6b22680ef..e25c23bcaa 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -2,7 +2,15 @@ open Util; include ProjectorBase; [@deriving (show({with_path: false}), sexp, yojson)] -type syntax = Piece.t; +type t = projector; + +[@deriving (show({with_path: false}), sexp, yojson)] +type kind = + | Fold + | Infer + | Checkbox + | Slider + | TextArea; let to_module = (syntax, p: projector): core => switch ((p: projector)) { @@ -13,19 +21,25 @@ let to_module = (syntax, p: projector): core => | TextArea(model) => TextAreaCore.mk(model, ~syntax) }; +let kind = (p: t): kind => + switch (p) { + | Fold(_) => Fold + | Infer(_) => Infer + | Checkbox(_) => Checkbox + | Slider(_) => Slider + | TextArea(_) => TextArea + }; + let init = (f: kind, syntax): core => switch (f) { | Fold => FoldCore.mk((), ~syntax) | Infer => InferCore.mk({expected_ty: None}, ~syntax) | Checkbox => CheckboxCore.mk((), ~syntax) - | Slider => SliderCore.mk({value: 10}, ~syntax) + | Slider => SliderCore.mk((), ~syntax) | TextArea => TextAreaCore.mk({inside: false}, ~syntax) }; -[@deriving (show({with_path: false}), sexp, yojson)] -type t = projector; - -let name_ = (p: kind): string => +let name_of_kind = (p: kind): string => switch (p) { | Fold => "fold" | Infer => "type" @@ -44,16 +58,7 @@ let of_name = (p: string): kind => | _ => failwith("Unknown projector kind") }; -let kind = (p: t): kind => - switch (p) { - | Fold(_) => Fold - | Infer(_) => Infer - | Checkbox(_) => Checkbox - | Slider(_) => Slider - | TextArea(_) => TextArea - }; - -let name = (p: t): string => p |> kind |> name_; +let name = (p: t): string => p |> kind |> name_of_kind; let shape = (p: t, syntax): shape => { let (module P) = to_module(syntax, p); diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 14e1efdbd9..bced6135f6 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -9,9 +9,9 @@ type infer = {expected_ty: option(Typ.t)}; [@deriving (show({with_path: false}), sexp, yojson)] type checkbox = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type slider = {value: int}; +type slider = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type textarea = {inside: bool}; +type textarea = {inside: bool}; //TODO(andrew): rm [@deriving (show({with_path: false}), sexp, yojson)] type projector = @@ -47,6 +47,18 @@ type accent = | Indicated(Util.Direction.t) | Selected; +[@deriving (show({with_path: false}), sexp, yojson)] +type syntax = Piece.t; + +[@deriving (show({with_path: false}), sexp, yojson)] +type action = + | Remove /* Remove projector */ + | FocusInternal(string) /* DOM Focus on projector */ + | Default /* Defer input to focal DOM element */ + | Escape(string, Util.Direction.t) /* Pass key control to parent editor */ + | UpdateSyntax(syntax => syntax) + | UpdateModel(string); + let cls = (indicated: option(accent)) => switch (indicated) { | Some(Indicated(Left)) => ["indicated", "left"] @@ -55,29 +67,21 @@ let cls = (indicated: option(accent)) => | None => [] }; -[@deriving (show({with_path: false}), sexp, yojson)] -type kind = - | Fold - | Infer - | Checkbox - | Slider - | TextArea; - module type Core = { [@deriving (show({with_path: false}), sexp, yojson)] type model; - [@deriving (show({with_path: false}), sexp, yojson)] - type action; - let projector: projector; + let model: model; + let view: (~inject: action => Ui_effect.t(unit), option(accent)) => Node.t; + let update: string => projector; + let keymap: (Util.Direction.t, Key.t) => option(action); let placeholder: unit => shape; let can_project: Piece.t => bool; let auto_update: info => projector; - let update: string => projector; - let view: - (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), option(accent)) => - Node.t; - let keymap: (Util.Direction.t, Key.t) => option(ProjectorsUpdate.t); + let projector: projector; + + [@deriving (show({with_path: false}), sexp, yojson)] + type action; }; type core = (module Core); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 05c20633cd..d7d1747306 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -48,7 +48,7 @@ let go_z = switch (a) { | Project(a) => - ProjectorsPerform.go( + ProjectorPerform.go( Move.jump_to_id, Move.primary, a, diff --git a/src/haz3lcore/zipper/action/ProjectorsPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re similarity index 100% rename from src/haz3lcore/zipper/action/ProjectorsPerform.re rename to src/haz3lcore/zipper/action/ProjectorPerform.re diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 565c679d87..fc50180f99 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -25,7 +25,7 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), ~syntax, _) => +let view = (~inject: ProjectorBase.action => Ui_effect.t(unit), ~syntax, _) => Node.input( ~attrs= [ @@ -37,7 +37,7 @@ let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), ~syntax, _) => (), ); -let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => +let keymap = (_, key: Key.t): option(ProjectorBase.action) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index e5265114fd..b6f0d4b1d6 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -12,15 +12,15 @@ let mk = (_model: fold, ~syntax as _): core => [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = (); - let projector: projector = Fold(); + let projector = Fold(); let can_project = _ => true; let placeholder = () => Inline(2); - let auto_update = _: projector => Fold(); - let update = (_action): projector => Fold(); + let auto_update = _ => Fold(); + let update = _ => Fold(); let view = (~inject, _) => div( - ~attrs=[Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove))], + ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], ); - let keymap = (_, _): option(ProjectorsUpdate.t) => None; + let keymap = (_, _): option(ProjectorBase.action) => None; }); diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index ec373e92ac..d133d25de1 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,8 +1,8 @@ -open ProjectorBase; open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open Node; +open ProjectorBase; let display_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { @@ -27,7 +27,7 @@ let mk = (model: infer, ~syntax as _): core => [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; - let projector: projector = Infer(model); + let projector = Infer(model); let can_project = (p: Piece.t): bool => switch (p) { @@ -38,19 +38,19 @@ let mk = (model: infer, ~syntax as _): core => let placeholder = () => Inline((model.expected_ty |> display |> String.length) - 2); - let auto_update = ({info, _}): projector => { + let auto_update = ({info, _}) => { print_endline("updating infer projector"); Infer({expected_ty: Some(expected_ty(info))}); }; - let update = (_action): projector => Infer(model); + let update = _ => Infer(model); let view = (~inject, _) => div( - ~attrs=[Attr.on_double_click(_ => inject(ProjectorsUpdate.Remove))], + ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text(display(model.expected_ty))], ); - let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => + let keymap = (_, key: Key.t): option(ProjectorBase.action) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index ca893902f5..d07ea2ea74 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,6 +1,7 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; +open ProjectorBase; let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { @@ -22,7 +23,8 @@ let get = (piece: Piece.t): int => | Some(s) => s }; -let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), value: int, _) => +let view = + (~inject: ProjectorBase.action => Ui_effect.t(unit), value: int, _) => Node.input( ~attrs=[ Attr.create("type", "range"), @@ -34,25 +36,25 @@ let view = (~inject: ProjectorsUpdate.t => Ui_effect.t(unit), value: int, _) => (), ); -let keymap = (_, key: Key.t): option(ProjectorsUpdate.t) => +let keymap = (_, key: Key.t): option(ProjectorBase.action) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None }; -let mk = (model, ~syntax): ProjectorBase.core => +let mk = (model, ~syntax): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = ProjectorBase.slider; + type model = slider; [@deriving (show({with_path: false}), sexp, yojson)] type action = unit; let model = model; - let projector: ProjectorBase.projector = Slider(model); + let projector = Slider(model); let can_project = p => state_of(p) != None; - let placeholder = (): ProjectorBase.shape => Inline(10); - let auto_update = _: ProjectorBase.projector => Slider(model); - let update = _: ProjectorBase.projector => Slider(model); + let placeholder = () => Inline(10); + let auto_update = _ => Slider(model); + let update = _ => Slider(model); let view = view(get(syntax)); let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index af653aa209..9156e440bc 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,6 +1,7 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; +open ProjectorBase; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //TODO(andrew): unhardcode element !!!!!!!!!! @@ -45,19 +46,17 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); -let put = (str: string): ProjectorsUpdate.t => +let put = (str: string): ProjectorBase.action => UpdateSyntax(_ => str |> Form.string_quote |> put); let textarea = ( ~selector, - ~inject: ProjectorsUpdate.t => Ui_effect.t(unit), + ~inject: ProjectorBase.action => Ui_effect.t(unit), text: string, ) => Node.textarea( ~attrs=[ - // Attr.create("rows", "4"), - // Attr.create("cols", "21"), Attr.on_blur(_ => inject(UpdateModel(serialize(SetInside(false))))), Attr.on_click(_ => inject(FocusInternal(selector))), Attr.on_input((_, new_text) => inject(put(new_text))), @@ -73,28 +72,19 @@ let view = ( ~inject, ~selector, - model: ProjectorBase.textarea, + model: textarea, text: string, - indicated: option(ProjectorBase.accent), + indicated: option(accent), ) => Node.div( - ~attrs=[ - Attr.classes( - ["cols"] @ (model.inside ? [] : ProjectorBase.cls(indicated)), - ), - ], + ~attrs=[Attr.classes(["cols"] @ (model.inside ? [] : cls(indicated)))], n_of(1 + Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); let keymap = - ( - ~selector, - model: ProjectorBase.textarea, - direction: Util.Direction.t, - key: Key.t, - ) - : option(ProjectorsUpdate.t) => { + (~selector, model: textarea, direction: Util.Direction.t, key: Key.t) + : option(ProjectorBase.action) => { let textarea = JsUtil.TextArea.get(selector); let focussed = model.inside; //TODO(andrew): make actual focus king? @@ -125,32 +115,36 @@ let keymap = }; }; -let mk = (~syntax, model): ProjectorBase.core => +let placeholder = (syntax, ()) => { + //TODO(andrew): cleanup + let row = Util.StringUtil.num_linebreaks(get(syntax)); + /* +2 for left and right padding */ + let col = + 2 + + List.fold_left( + max, + 0, + List.map( + String.length, + Re.Str.split(Re.Str.regexp("\n"), get(syntax)), + ), + ); + Block({row, col}); +}; + +let mk = (~syntax, model): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = ProjectorBase.textarea; + type model = textarea; [@deriving (show({with_path: false}), sexp, yojson)] type action = action_; let model = model; - let projector: ProjectorBase.projector = TextArea(model); + let projector = TextArea(model); let can_project = _ => true; - //TODO(andrew): cleanup - let row = Util.StringUtil.num_linebreaks(get(syntax)); - /* +2 for left and right padding */ - let col = - 2 - + List.fold_left( - max, - 0, - List.map( - String.length, - Re.Str.split(Re.Str.regexp("\n"), get(syntax)), - ), - ); - let placeholder = (): ProjectorBase.shape => Block({row, col}); - let auto_update = _: ProjectorBase.projector => TextArea(model); - let update = (a: string): ProjectorBase.projector => + let placeholder = placeholder(syntax); + let auto_update = _ => TextArea(model); + let update = (a: string) => switch (deserialize(a)) { | SetInside(b) => TextArea({inside: b}) }; diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 14b65ab09e..8401de5271 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -290,7 +290,7 @@ let view = | Some(ci) => bar_view([ inspector_view(~inject, ~settings, ci), - ProjectorsView.panel( + ProjectorView.panel( ~inject=a => inject(PerformAction(Project(a))), editor, ci, diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index c6e55fded3..acb73a56cb 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -25,7 +25,7 @@ module Deco = switch (Indicated.index(z)) { | Some(id) => switch (Id.Map.find_opt(id, M.syntax_map)) { - | Some(syntax) => ProjectorsView.shape(z, syntax) + | Some(syntax) => ProjectorView.shape(z, syntax) | None => None } | None => None @@ -325,7 +325,7 @@ module Deco = }; let indication_deco = (z: Zipper.t) => - switch (ProjectorsView.indicated_proj_z(z)) { + switch (ProjectorView.indicated_proj_z(z)) { | Some(_) => [] | None => indicated_piece_deco(z) }; @@ -342,7 +342,7 @@ module Deco = let always = (~inject, zipper: Zipper.t) => List.concat([ err_holes(), - ProjectorsView.view_all( + ProjectorView.view_all( zipper.projectors, ~syntax_map=M.syntax_map, ~inject, diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index b9f377575c..5ec0f74dd8 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -12,9 +12,9 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => open Effect; let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.key_handler(editor, key)) { + switch (ProjectorView.key_handler(editor, key)) { | Some(Remove(id)) when id == Id.invalid => - //TODO(andrew): proper no-op (see ProjectorsView) + //TODO(andrew): proper no-op (see ProjectorView) Ignore | Some(action) => Many([ @@ -32,10 +32,10 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => (~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)): Effect.t(unit) => { let key = Key.mk(dir, evt); let editor = Editors.get_editor(model.editors); - switch (ProjectorsView.key_handler(editor, key)) { + switch (ProjectorView.key_handler(editor, key)) { | Some(Remove(id)) when id == Id.invalid => //TODO(andrew): document why this exists - //TODO(andrew): proper no-op (see ProjectorsView) + //TODO(andrew): proper no-op (see ProjectorView) Effect.Ignore | _ => Effect.Prevent_default }; diff --git a/src/haz3lweb/view/ProjectorsView.re b/src/haz3lweb/view/ProjectorView.re similarity index 82% rename from src/haz3lweb/view/ProjectorsView.re rename to src/haz3lweb/view/ProjectorView.re index a2b7494971..4cb8cfe657 100644 --- a/src/haz3lweb/view/ProjectorsView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -10,8 +10,12 @@ let update_model = (action, syntax, p) => { P.update(action); }; -let handle = (id, syntax, action: ProjectorsUpdate.t): Action.project => +let handle = (id, syntax, action: ProjectorBase.action): Action.project => switch (action) { + | Default => + //TODO(andrew): proper no-op + Remove(Id.invalid) + | Remove => Remove(id) | FocusInternal(selector) => JsUtil.get_elem_by_selector(selector)##focus; Action.(FocusInternal(id)); @@ -21,14 +25,22 @@ let handle = (id, syntax, action: ProjectorsUpdate.t): Action.project => | Escape(selector, Right) => JsUtil.get_elem_by_selector(selector)##blur; Escape(id, Right); - | Default => - //TODO(andrew): proper no-op - Remove(Id.invalid) - | Remove => Remove(id) | UpdateSyntax(f) => UpdateSyntax(id, f) | UpdateModel(action) => UpdateModel(id, update_model(action, syntax)) }; +let backing_deco = + ( + ~font_metrics: FontMetrics.t, + ~measurement: Measured.measurement, + ~syntax, + p: Projector.t, + ) => + switch (Projector.shape(p, syntax)) { + | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) + | Block(_) => div([]) + }; + let wrap = ( ~font_metrics: FontMetrics.t, @@ -40,7 +52,6 @@ let wrap = ) => div( ~attrs=[ - // JsUtil.stop_mousedown_propagation, Attr.classes( ["projector", Projector.name(p)] @ Projector.cls(accent), ), @@ -51,18 +62,10 @@ let wrap = ~attrs=[ JsUtil.stop_mousedown_propagation, Attr.classes(["projector-wrapper"]), - // Attr.on_mousedown(_ => { - // print_endline("WRAPPPER"); - // inject(Update.PerformAction(Jump(TileId(id)))); - // }), ], [view], ), - //TODO(andrew): document - switch (Projector.shape(p, syntax)) { - | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) - | Block(_) => div([]) - }, + backing_deco(~font_metrics, ~measurement, ~syntax, p), ], ); @@ -92,12 +95,6 @@ let view = ); }; -let bdfg = z => - switch (Indicated.piece(z)) { - | Some((_, d, _)) => Some(d) - | None => None - }; - let view_all = ( ps: Map.t, @@ -169,15 +166,11 @@ let option_view = (name, n) => [text(n)], ); -let set = (k: Projector.kind) => Action.SetIndicated(k); - -let remove = (id: Id.t) => Action.Remove(id); - let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [Projector.Checkbox] + | Pat(Bool) => [Checkbox] | Exp(Int) | Pat(Int) => [Slider] | Exp(String) @@ -194,18 +187,15 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => } ); +let toggle_projector = (active, id, ci): Action.project => + active || applicable_projectors(ci) == [] + ? Remove(id) : SetIndicated(List.hd(applicable_projectors(ci))); + let toggle_view = (~inject, ci, id, active: bool) => div( ~attrs=[ clss(["toggle-switch"] @ (active ? ["active"] : [])), - Attr.on_click(_ => - inject( - active - ? remove(id) - : applicable_projectors(ci) != [] - ? set(List.hd(applicable_projectors(ci))) : remove(id), - ) - ), + Attr.on_click(_ => inject(toggle_projector(active, id, ci))), ], [ div( @@ -225,7 +215,7 @@ let currently_selected = editor => option_view( switch (kind(editor)) { | None => "Fold" - | Some(k) => Projector.name_(k) + | Some(k) => Projector.name_of_kind(k) }, ); @@ -237,11 +227,11 @@ let panel = (~inject, editor: Editor.t, ci: Info.t) => { Node.select( ~attrs=[ Attr.on_change((_, name) => - inject(set(Projector.of_name(name))) + inject(SetIndicated(Projector.of_name(name))) ), ], applicable_projectors(ci) - |> List.map((k: Projector.kind) => Projector.name_(k)) + |> List.map(Projector.name_of_kind) |> List.map(currently_selected(editor)), ), ], From 90bec8b6eb734020c079acb82d37fb9dd1a1dfe8 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 00:42:13 -0400 Subject: [PATCH 083/168] projectors action refactor to extensible variants. modfied way static info is passed to projectors (partially; somewhat buggy). projector module sig cleanup --- src/haz3lcore/zipper/Editor.re | 2 +- src/haz3lcore/zipper/Projector.re | 52 ++++++----- src/haz3lcore/zipper/ProjectorBase.re | 39 +++++--- src/haz3lcore/zipper/Zipper.re | 12 ++- .../zipper/action/ProjectorPerform.re | 7 +- .../zipper/projectors/CheckboxCore.re | 19 ++-- src/haz3lcore/zipper/projectors/FoldCore.re | 9 +- src/haz3lcore/zipper/projectors/InferCore.re | 15 ++-- src/haz3lcore/zipper/projectors/SliderCore.re | 31 ++++--- .../zipper/projectors/TextAreaCore.re | 89 ++++++++----------- src/haz3lweb/Update.re | 8 +- src/haz3lweb/view/Cell.re | 12 +-- src/haz3lweb/view/Deco.re | 54 +++++------ src/haz3lweb/view/ExerciseMode.re | 14 +-- src/haz3lweb/view/ExplainThis.re | 4 +- src/haz3lweb/view/ProjectorView.re | 77 ++++++++++------ src/haz3lweb/view/ScratchMode.re | 4 +- 17 files changed, 242 insertions(+), 206 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index d98732bc33..615d7958a1 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -101,7 +101,7 @@ module Meta = { switch (Action.is_edit(a)) { //TODO(andrew): reenable //TODO: andrew figure out why core desyncs from view on measure length.. prob use diff statics - //| false => {...meta.projected, z: z_projected} + //| false => {...meta.projected, z: z_projected.z} | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index e25c23bcaa..f4585a8c5e 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -12,13 +12,13 @@ type kind = | Slider | TextArea; -let to_module = (syntax, p: projector): core => +let to_module = (p: projector): core => switch ((p: projector)) { - | Fold(model) => FoldCore.mk(model, ~syntax) - | Infer(model) => InferCore.mk(model, ~syntax) - | Checkbox(model) => CheckboxCore.mk(model, ~syntax) - | Slider(model) => SliderCore.mk(model, ~syntax) - | TextArea(model) => TextAreaCore.mk(model, ~syntax) + | Fold(model) => FoldCore.mk(model) + | Infer(model) => InferCore.mk(model) + | Checkbox(model) => CheckboxCore.mk(model) + | Slider(model) => SliderCore.mk(model) + | TextArea(model) => TextAreaCore.mk(model) }; let kind = (p: t): kind => @@ -30,13 +30,13 @@ let kind = (p: t): kind => | TextArea(_) => TextArea }; -let init = (f: kind, syntax): core => +let init = (f: kind): core => switch (f) { - | Fold => FoldCore.mk((), ~syntax) - | Infer => InferCore.mk({expected_ty: None}, ~syntax) - | Checkbox => CheckboxCore.mk((), ~syntax) - | Slider => SliderCore.mk((), ~syntax) - | TextArea => TextAreaCore.mk({inside: false}, ~syntax) + | Fold => FoldCore.mk() + | Infer => InferCore.mk({expected_ty: None}) + | Checkbox => CheckboxCore.mk() + | Slider => SliderCore.mk() + | TextArea => TextAreaCore.mk({inside: false}) }; let name_of_kind = (p: kind): string => @@ -61,20 +61,28 @@ let of_name = (p: string): kind => let name = (p: t): string => p |> kind |> name_of_kind; let shape = (p: t, syntax): shape => { - let (module P) = to_module(syntax, p); - P.placeholder(); + let (module P) = to_module(p); + P.placeholder(syntax); }; +let is_placeholder = (p: Piece.t): bool => { + //TODO: Revisit + switch (p) { + | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 + | _ => false + }; +}; + +let placeholder_label = (p: t, syntax): list(string) => + switch (shape(p, syntax)) { + | Inline(width) => [String.make(width, ' ')] + | Block({row, col}) => [String.make(row, '\n') ++ String.make(col, ' ')] + }; + let placeholder = (p: t, syntax: syntax): syntax => Piece.Tile({ id: Piece.id(syntax), - label: - switch (shape(p, syntax)) { - | Inline(width) => [String.make(width, ' ')] - | Block({row, col}) => [ - String.make(row, '\n') ++ String.make(col, ' '), - ] - }, + label: placeholder_label(p, syntax), mold: Mold.mk_op(Any, []), shards: [0], children: [], @@ -86,7 +94,7 @@ let minimum_projection_condition = (syntax: syntax): bool => let create = (k: kind, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { - let (module P) = init(k, syntax); + let (module P) = init(k); P.can_project(syntax) && minimum_projection_condition(syntax) ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; }; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index bced6135f6..884b724b28 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -43,23 +43,27 @@ type shape = | Block(Measured.Point.t); [@deriving (show({with_path: false}), sexp, yojson)] -type accent = +type status = | Indicated(Util.Direction.t) | Selected; [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; -[@deriving (show({with_path: false}), sexp, yojson)] +type inner_action = ..; +//TODO(andrew): decide how to rm +type inner_action += + | SetInside(bool); + type action = | Remove /* Remove projector */ | FocusInternal(string) /* DOM Focus on projector */ | Default /* Defer input to focal DOM element */ | Escape(string, Util.Direction.t) /* Pass key control to parent editor */ | UpdateSyntax(syntax => syntax) - | UpdateModel(string); + | UpdateModel(inner_action); -let cls = (indicated: option(accent)) => +let cls = (indicated: option(status)) => switch (indicated) { | Some(Indicated(Left)) => ["indicated", "left"] | Some(Indicated(Right)) => ["indicated", "right"] @@ -71,17 +75,26 @@ module type Core = { [@deriving (show({with_path: false}), sexp, yojson)] type model; - let model: model; - let view: (~inject: action => Ui_effect.t(unit), option(accent)) => Node.t; - let update: string => projector; - let keymap: (Util.Direction.t, Key.t) => option(action); - let placeholder: unit => shape; let can_project: Piece.t => bool; - let auto_update: info => projector; - let projector: projector; - [@deriving (show({with_path: false}), sexp, yojson)] - type action; + let model: model; + // let projector: projector; + + let view: + ( + ~status: option(status), + ~syntax: syntax, + ~info: Info.t, + ~inject: action => Ui_effect.t(unit) + ) => + Node.t; + let placeholder: syntax => shape; + + //[@deriving (show({with_path: false}), sexp, yojson)] + //type action; + let update: inner_action => projector; + let auto_update: info => projector; + let keymap: (Util.Direction.t, Key.t) => option(action); }; type core = (module Core); diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 09bc70fdbd..62847b50df 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -327,7 +327,7 @@ let measured = z => z |> unselect_and_zip |> Measured.of_segment; let base_point = (measured: Measured.t, z: t): Measured.Point.t => { switch (representative_piece(z)) { | Some((p, d)) => - /* NOTE(andrew): Below conversion necessary because sometimes + /* NOTE: Below conversion necessary because sometimes * we call this with measured based on projected zipper * measurements but also z is the non-projected zipper. * This should work okay since the core movement/selection @@ -340,6 +340,16 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * would be projected to their placeholders before lookup */ let p = switch (ProjectorBase.Map.find(Piece.id(p), z.projectors)) { + | _ when Projector.is_placeholder(p) => + /* NOTE: If OTOH we call this on the projected zipper, then + * p will already be a placeholder. In this case we may not + * want to call Projector.placeholder, as it may not be able + * to account for recieving a placeholder. AFAIK disabling + * this check doesn't currently cause any issues, but it + * did in the past when we were reifying the module in the + * below call, resulting in trying to interpret the syntax + * of the placeholder as e.g. an int for the slider */ + p | Some(pr) => Projector.placeholder(pr, p) | None => p }; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index a5eaf6ecc0..11488db422 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -40,10 +40,11 @@ let go = z: Zipper.t, ) => { //TODO(andrew): avoid bringing statics in here? - let crime = (syntax, b, p) => { + let crime = (_syntax, b, p) => { //TODO(andrew): remove this crime - let (module P) = Projector.to_module(syntax, p); - P.update(TextAreaCore.serialize(SetInside(b))); + let (module P) = Projector.to_module(p); + P.update(SetInside(b)); + //p; }; let set_dispatch = (z: Zipper.t, id, b) => switch (Id.Map.find_opt(id, syntax_map)) { diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index fc50180f99..2a8172e2b6 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -16,7 +16,7 @@ let state_of = (piece: Piece.t): option(bool) => piece |> of_mono |> Option.map(bool_of_string); let get = (piece: Piece.t): bool => - switch (piece |> of_mono |> Option.map(bool_of_string)) { + switch (piece |> of_mono |> Util.OptUtil.and_then(bool_of_string_opt)) { | None => failwith("Checkbox: not boolean literal") | Some(s) => s }; @@ -25,7 +25,13 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let view = (~inject: ProjectorBase.action => Ui_effect.t(unit), ~syntax, _) => +let view = + ( + ~status as _, + ~syntax, + ~info as _, + ~inject: ProjectorBase.action => Ui_effect.t(unit), + ) => Node.input( ~attrs= [ @@ -43,19 +49,16 @@ let keymap = (_, key: Key.t): option(ProjectorBase.action) => | _ => None }; -let mk = (model, ~syntax): core => +let mk = (model): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; - [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; let model = model; - let projector: projector = Checkbox(model); let can_project = p => state_of(p) != None; - let placeholder = () => Inline(2); + let placeholder = _ => Inline(2); let auto_update = _: projector => Checkbox(); let update = (_action): projector => Checkbox(); - let view = view(~syntax); + let view = view; let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index b6f0d4b1d6..3144df0bc0 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -4,20 +4,17 @@ open ProjectorBase; open Virtual_dom.Vdom; open Node; -let mk = (_model: fold, ~syntax as _): core => +let mk = (_model: fold): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; - [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; let model = (); - let projector = Fold(); let can_project = _ => true; - let placeholder = () => Inline(2); + let placeholder = _ => Inline(2); let auto_update = _ => Fold(); let update = _ => Fold(); - let view = (~inject, _) => + let view = (~status as _, ~syntax as _, ~info as _, ~inject) => div( ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index d133d25de1..42b2a6239d 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -1,5 +1,5 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +// open Sexplib.Std; +// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open Node; open ProjectorBase; @@ -19,15 +19,12 @@ let expected_ty = (info: option(Info.t)) => let display = expected_ty => "⋱ ⇐ " ++ (expected_ty |> display_ty |> Typ.pretty_print); -let mk = (model: infer, ~syntax as _): core => +let mk = (model: infer): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = infer; - [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; let model = model; - let projector = Infer(model); let can_project = (p: Piece.t): bool => switch (p) { @@ -35,7 +32,7 @@ let mk = (model: infer, ~syntax as _): core => | _ => false }; - let placeholder = () => + let placeholder = _ => Inline((model.expected_ty |> display |> String.length) - 2); let auto_update = ({info, _}) => { @@ -44,10 +41,10 @@ let mk = (model: infer, ~syntax as _): core => }; let update = _ => Infer(model); - let view = (~inject, _) => + let view = (~status as _, ~syntax as _, ~info, ~inject) => div( ~attrs=[Attr.on_double_click(_ => inject(Remove))], - [text(display(model.expected_ty))], + [text(display(Some(expected_ty(Some(info)))))], ); let keymap = (_, key: Key.t): option(ProjectorBase.action) => diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index d07ea2ea74..ebfb130c6d 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,5 +1,5 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +// open Sexplib.Std; +// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; @@ -13,18 +13,26 @@ let mk_mono = (sort: Sort.t, string: string): Piece.t => string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); let state_of = (piece: Piece.t): option(int) => - piece |> of_mono |> Option.map(int_of_string); + piece |> of_mono |> Util.OptUtil.and_then(int_of_string_opt); let put = (new_val: string): Piece.t => mk_mono(Exp, new_val); let get = (piece: Piece.t): int => - switch (piece |> of_mono |> Option.map(int_of_string)) { - | None => failwith("Slider: not integer literal") + switch (state_of(piece)) { + | None => + //TODO(andrew): fix this bug (moving caret to right of slider crashes) + switch (of_mono(piece)) { + | Some(p) => + print_endline("ERROR: Slider: not integer literal: " ++ p); + 0; + | None => + print_endline("ERROR: Slider: not integer literal: No piece"); + 0; + } | Some(s) => s }; -let view = - (~inject: ProjectorBase.action => Ui_effect.t(unit), value: int, _) => +let view = (~inject: ProjectorBase.action => Ui_effect.t(unit), value: int) => Node.input( ~attrs=[ Attr.create("type", "range"), @@ -42,19 +50,16 @@ let keymap = (_, key: Key.t): option(ProjectorBase.action) => | _ => None }; -let mk = (model, ~syntax): core => +let mk = (model): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = slider; - [@deriving (show({with_path: false}), sexp, yojson)] - type action = unit; let model = model; - let projector = Slider(model); let can_project = p => state_of(p) != None; - let placeholder = () => Inline(10); + let placeholder = _ => Inline(10); let auto_update = _ => Slider(model); let update = _ => Slider(model); - let view = view(get(syntax)); + let view = (~status as _, ~syntax, ~info as _) => view(get(syntax)); let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 9156e440bc..91e69f1507 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,5 +1,5 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +// open Sexplib.Std; +// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; @@ -7,25 +7,22 @@ open ProjectorBase; //TODO(andrew): unhardcode element !!!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -[@deriving (show({with_path: false}), sexp, yojson)] -type action_ = - | SetInside(bool); +//TODO(andrew): reinstate +// [@deriving (show({with_path: false}), sexp, yojson)] +// type inner_action += +// | SetInside(bool); let selector = ".projector.text textarea"; -let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; +// let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; -let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; +// let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; -/* Function to escape linebreaks */ -let escape_linebreaks = (str: string): string => { - Re.Str.global_replace(Re.Str.regexp("\n"), "\\n", str); -}; +let escape_linebreaks: string => string = + Re.Str.global_replace(Re.Str.regexp("\n"), "\\n"); -/* Function to unescape linebreaks */ -let unescape_linebreaks = (str: string): string => { - Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n", str); -}; +let unescape_linebreaks: string => string = + Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n"); let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { @@ -57,8 +54,10 @@ let textarea = ) => Node.textarea( ~attrs=[ - Attr.on_blur(_ => inject(UpdateModel(serialize(SetInside(false))))), + Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), + Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), Attr.on_click(_ => inject(FocusInternal(selector))), + Attr.on_mousedown(_ => inject(FocusInternal(selector))), Attr.on_input((_, new_text) => inject(put(new_text))), ], [Node.text(text)], @@ -68,19 +67,14 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let view = - ( - ~inject, - ~selector, - model: textarea, - text: string, - indicated: option(accent), - ) => +let view = (model: textarea, ~selector, ~status, ~syntax, ~info as _, ~inject) => { + let text = syntax |> get |> Form.strip_quotes; Node.div( - ~attrs=[Attr.classes(["cols"] @ (model.inside ? [] : cls(indicated)))], + ~attrs=[Attr.classes(["cols"] @ (model.inside ? [] : cls(status)))], n_of(1 + Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); +}; let keymap = (~selector, model: textarea, direction: Util.Direction.t, key: Key.t) @@ -115,40 +109,33 @@ let keymap = }; }; -let placeholder = (syntax, ()) => { - //TODO(andrew): cleanup - let row = Util.StringUtil.num_linebreaks(get(syntax)); - /* +2 for left and right padding */ - let col = - 2 - + List.fold_left( - max, - 0, - List.map( - String.length, - Re.Str.split(Re.Str.regexp("\n"), get(syntax)), - ), - ); - Block({row, col}); -}; +let line_lengths = syntax => + List.map(String.length, Re.Str.split(Re.Str.regexp("\n"), get(syntax))); + +let num_lines = syntax => List.fold_left(max, 0, line_lengths(syntax)); -let mk = (~syntax, model): core => +let placeholder = syntax => + Block({ + row: Util.StringUtil.num_linebreaks(get(syntax)), + col: 2 + num_lines(syntax) /* +2 for left and right padding */ + }); + +let mk = (model): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = textarea; - [@deriving (show({with_path: false}), sexp, yojson)] - type action = action_; let model = model; - let projector = TextArea(model); let can_project = _ => true; - let placeholder = placeholder(syntax); + let placeholder = placeholder; let auto_update = _ => TextArea(model); - let update = (a: string) => - switch (deserialize(a)) { - | SetInside(b) => TextArea({inside: b}) + let update = a => + switch (a) { + | SetInside(b) => + print_endline("setting inside:" ++ string_of_bool(b)); + TextArea({inside: b}); + | _ => TextArea(model) }; - let value = syntax |> get |> Form.strip_quotes; - let view = view(model, value, ~selector); + let view = view(model, ~selector); let keymap = keymap(~selector, model); }); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index e812e3315a..00eccbdce5 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -218,14 +218,14 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => let update_projectors = (model: Model.t): Model.t => { let statics = Model.current_statics(model); - let editor = Editors.get_editor(model.editors); - let syntax_map = editor.state.meta.projected.syntax_map; + //let editor = Editors.get_editor(model.editors); + //let syntax_map = editor.state.meta.projected.syntax_map; let editors = Editors.map_projectors( model.editors, (id, p) => { - let syntax = Id.Map.find(id, syntax_map); - let (module P) = Projector.to_module(syntax, p); + //let syntax = Id.Map.find(id, syntax_map); + let (module P) = Projector.to_module(p); let info = Id.Map.find_opt(id, statics.info_map); P.auto_update({info: info}); }, diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index a17a82bb6c..84d4d1d7da 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -110,7 +110,7 @@ let deco = ~font_metrics, ~show_backpack_targets, ~selected, - ~error_ids, + ~statics: CachedStatics.statics, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), { @@ -144,7 +144,7 @@ let deco = let tiles = tiles; let font_metrics = font_metrics; let show_backpack_targets = show_backpack_targets; - let error_ids = error_ids; + let statics = statics; let syntax_map = syntax_map; }); let decos = @@ -275,7 +275,7 @@ let editor_view = ~footer: option(list(Node.t))=?, ~highlights: option(ColorSteps.colorMap), ~overlayer: option(Node.t)=None, - ~error_ids: list(Id.t), + ~statics: CachedStatics.statics, ~sort=Sort.root, editor: Editor.t, ) => { @@ -286,7 +286,7 @@ let editor_view = ~font_metrics, ~show_backpack_targets, ~selected, - ~error_ids, + ~statics, ~test_results, ~highlights, editor, @@ -380,7 +380,7 @@ let locked_no_statics = ~target_id, ~footer=[], ~test_results=None, - ~error_ids=[], + ~statics=CachedStatics.empty_statics, ~overlayer=Some(expander_deco), ~sort, segment |> Zipper.unzip |> Editor.init(~read_only=true), @@ -440,7 +440,7 @@ let locked = ~target_id, ~footer, ~test_results=ModelResult.test_results(result), - ~error_ids=statics.error_ids, + ~statics=CachedStatics.empty_statics, editor, ); }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index acb73a56cb..5c53f2dd6e 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -10,7 +10,7 @@ module Deco = let show_backpack_targets: bool; let terms: TermMap.t; let term_ranges: TermRanges.t; - let error_ids: list(Id.t); + let statics: CachedStatics.statics; let tiles: TileMap.t; let syntax_map: Id.Map.t(Piece.t); }, @@ -19,31 +19,24 @@ module Deco = let tile = id => Id.Map.find(id, M.tiles); - let caret = (z: Zipper.t): list(Node.t) => { - //TODO(andrew): document - let shape = - switch (Indicated.index(z)) { - | Some(id) => - switch (Id.Map.find_opt(id, M.syntax_map)) { - | Some(syntax) => ProjectorView.shape(z, syntax) - | None => None - } - | None => None + let base_caret = (z: Zipper.t): list(Node.t) => { + let origin = Zipper.caret_point(M.map, z); + let shape = Zipper.caret_direction(z); + let side = + switch (Indicated.piece(z)) { + | Some((_, side, _)) => side + | _ => Right }; - switch (shape) { - | Some(Block(_)) => [] - | _ => - let origin = Zipper.caret_point(M.map, z); - let shape = Zipper.caret_direction(z); - let side = - switch (Indicated.piece(z)) { - | Some((_, side, _)) => side - | _ => Right - }; - [CaretDec.view(~font_metrics, ~profile={side, origin, shape})]; - }; + [CaretDec.view(~font_metrics, ~profile={side, origin, shape})]; }; + let caret = (z: Zipper.t): list(Node.t) => + /* Projectors can override adjacent carets */ + switch (ProjectorView.caret(z, M.syntax_map)) { + | Some(caret) => caret + | None => base_caret(z) + }; + type shard_data = (Measured.measurement, Nibs.shapes); let sel_shard_svg = @@ -94,6 +87,7 @@ module Deco = let token = List.nth(t.label, index); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index, m, Tile(t)))] + //TODO(andrew): decoration for selections /* No deco for multi-line tokens e.g. projector placeholders, * but need to leave some blank lines */ | num_lb => List.init(num_lb, _ => None) @@ -316,17 +310,11 @@ module Deco = }; let err_holes = () => - List.map(term_highlight(~clss=["err-hole"]), M.error_ids); - - let accent = (z: Zipper.t) => - switch (Indicated.piece(z)) { - | Some((p, d, _)) => Some((Piece.id(p), Projector.Indicated(d))) - | None => None - }; + List.map(term_highlight(~clss=["err-hole"]), M.statics.error_ids); let indication_deco = (z: Zipper.t) => switch (ProjectorView.indicated_proj_z(z)) { - | Some(_) => [] + | Some(_) => [] /* projector indication handled internally */ | None => indicated_piece_deco(z) }; @@ -343,12 +331,12 @@ module Deco = List.concat([ err_holes(), ProjectorView.view_all( - zipper.projectors, + zipper, ~syntax_map=M.syntax_map, + ~info_map=M.statics.info_map, ~inject, ~font_metrics, ~measured=M.map, - ~accent=accent(zipper), ), ]); diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 3f93d64bbe..550b805ffd 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -59,11 +59,15 @@ let view = ) => { Cell.editor_view( ~selected=pos == this_pos, - ~error_ids= - Statics.Map.error_ids( - editor.state.meta.projected.term_ranges, - di.info_map, - ), + ~statics={ + term: di.term, + info_map: di.info_map, + error_ids: + Statics.Map.error_ids( + editor.state.meta.projected.term_ranges, + di.info_map, + ), + }, ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index c9ab1ad578..a61300c108 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -218,10 +218,10 @@ let expander_deco = let font_metrics = font_metrics; let map = Measured.of_segment(doc.syntactic_form); let show_backpack_targets = false; - let (_term, terms) = MakeTerm.go(doc.syntactic_form); + let (_, terms) = MakeTerm.go(doc.syntactic_form); let term_ranges = TermRanges.mk(doc.syntactic_form); let tiles = TileMap.mk(doc.syntactic_form); - let error_ids = []; + let statics = CachedStatics.empty_statics; let syntax_map = Id.Map.empty; }); switch (doc.expandable_id, List.length(options)) { diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 4cb8cfe657..e7f48d500c 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -5,12 +5,12 @@ open Projector; open Util.OptUtil.Syntax; open Util.Web; -let update_model = (action, syntax, p) => { - let (module P) = to_module(syntax, p); +let update_model = (action: ProjectorBase.inner_action, p) => { + let (module P) = to_module(p); P.update(action); }; -let handle = (id, syntax, action: ProjectorBase.action): Action.project => +let handle = (id, action: ProjectorBase.action): Action.project => switch (action) { | Default => //TODO(andrew): proper no-op @@ -26,7 +26,7 @@ let handle = (id, syntax, action: ProjectorBase.action): Action.project => JsUtil.get_elem_by_selector(selector)##blur; Escape(id, Right); | UpdateSyntax(f) => UpdateSyntax(id, f) - | UpdateModel(action) => UpdateModel(id, update_model(action, syntax)) + | UpdateModel(action) => UpdateModel(id, update_model(action)) }; let backing_deco = @@ -41,11 +41,11 @@ let backing_deco = | Block(_) => div([]) }; -let wrap = +let view_inner = ( ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~accent: option(Projector.accent), + ~status: option(Projector.status), ~syntax, p: Projector.t, view: Node.t, @@ -53,7 +53,7 @@ let wrap = div( ~attrs=[ Attr.classes( - ["projector", Projector.name(p)] @ Projector.cls(accent), + ["projector", Projector.name(p)] @ Projector.cls(status), ), DecUtil.abs_style(measurement, ~font_metrics), ], @@ -69,57 +69,67 @@ let wrap = ], ); -let view = +let view_setup = ( id: Id.t, ps: Map.t, ~syntax_map: Id.Map.t(syntax), + ~info_map: Statics.Map.t, ~measured: Measured.t, ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, - ~accent: option(Projector.accent), + ~status: option(Projector.status), ) : option(Node.t) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); + let* info = Id.Map.find_opt(id, info_map); let+ measurement = Measured.find_by_id(id, measured); - let (module P) = to_module(syntax, p); - let inject = a => handle(id, syntax, a) |> inject; - wrap( + let (module P) = to_module(p); + let inject = a => handle(id, a) |> inject; + view_inner( ~font_metrics, ~measurement, - ~accent, + ~status, ~syntax, p, - P.view(~inject, accent), + P.view(~status, ~syntax, ~info, ~inject), ); }; +let status = (z: Zipper.t) => + switch (Indicated.piece(z)) { + | Some((p, d, _)) => Some((Piece.id(p), Projector.Indicated(d))) + | None => None + }; + let view_all = ( - ps: Map.t, + z: Zipper.t, + ~info_map: Statics.Map.t, ~syntax_map: Id.Map.t(syntax), ~measured: Measured.t, ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, - ~accent, ) => List.filter_map( - ((id, _)) => - view( + ((id, _)) => { + view_setup( id, - ps, + z.projectors, ~syntax_map, + ~info_map, ~measured, ~inject, ~font_metrics, - ~accent= - switch (accent) { + ~status= + switch (status(z)) { | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) | _ => None }, - ), - Id.Map.bindings(ps), + ) + }, + Id.Map.bindings(z.projectors), ); let indicated_proj_z = (z: Zipper.t) => { @@ -137,7 +147,7 @@ let kind = (editor: Editor.t) => { Projector.kind(p); }; -let shape = (z: Zipper.t, syntax) => { +let shape = (z: Zipper.t, syntax): option(shape) => { let+ (_, p) = indicated_proj_z(z); Projector.shape(p, syntax); }; @@ -149,15 +159,28 @@ let id = (editor: Editor.t) => { }; }; +let shape_from_map = (z, syntax_map): option(shape) => { + let* id = Indicated.index(z); + let* syntax = Id.Map.find_opt(id, syntax_map); + shape(z, syntax); +}; + +let caret = (z: Zipper.t, syntax_map): option(list(Node.t)) => + switch (shape_from_map(z, syntax_map)) { + | None => None + | Some(Inline(_)) => None + | Some(Block(_)) => Some([]) + }; + let key_handler = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None | Some((id, p)) => - let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); - let (module P) = to_module(syntax, p); + //let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let* (_, d, _) = Indicated.piece(editor.state.zipper); + let (module P) = to_module(p); let+ action = P.keymap(d, key); - handle(id, syntax, action); + handle(id, action); }; let option_view = (name, n) => diff --git a/src/haz3lweb/view/ScratchMode.re b/src/haz3lweb/view/ScratchMode.re index 2a967300d2..97e983f6f4 100644 --- a/src/haz3lweb/view/ScratchMode.re +++ b/src/haz3lweb/view/ScratchMode.re @@ -10,7 +10,7 @@ let view = ~highlights, ~results: ModelResults.t, ~result_key, - ~statics as {error_ids, _}: CachedStatics.statics, + ~statics: CachedStatics.statics, editor: Editor.t, ) => { let result = ModelResults.lookup(results, result_key); @@ -36,7 +36,7 @@ let view = ~ui_state, ~settings, ~target_id, - ~error_ids, + ~statics, ~test_results, ~footer?, ~highlights, From 78d63ba02ec126bbc50ed120a1e127cea2d404c4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 15:15:43 -0400 Subject: [PATCH 084/168] new statics info pathway complete (for scratch mode at least). cleanup req --- src/haz3lcore/zipper/Editor.re | 86 ++++++++--- src/haz3lcore/zipper/EditorUtil.re | 68 ++++----- src/haz3lcore/zipper/Projector.re | 72 ++++++--- src/haz3lcore/zipper/ProjectorBase.re | 25 ++- src/haz3lcore/zipper/Zipper.re | 21 +-- src/haz3lcore/zipper/ZipperBase.re | 17 +++ src/haz3lcore/zipper/action/Indicated.re | 17 ++- src/haz3lcore/zipper/action/Perform.re | 16 +- .../zipper/action/ProjectorPerform.re | 15 +- .../zipper/projectors/CheckboxCore.re | 12 +- src/haz3lcore/zipper/projectors/FoldCore.re | 4 +- src/haz3lcore/zipper/projectors/InferCore.re | 16 +- src/haz3lcore/zipper/projectors/SliderCore.re | 19 +-- .../zipper/projectors/TextAreaCore.re | 16 +- src/haz3lschool/Exercise.re | 112 +++++++------- src/haz3lschool/Gradescope.re | 3 +- src/haz3lweb/Editors.re | 23 +-- src/haz3lweb/Export.re | 15 +- src/haz3lweb/Model.re | 11 +- src/haz3lweb/ScratchSlide.re | 30 ++-- src/haz3lweb/Store.re | 143 ++++++++++++------ src/haz3lweb/Update.re | 94 ++++++++---- src/haz3lweb/view/Cell.re | 15 +- src/haz3lweb/view/Deco.re | 2 +- src/haz3lweb/view/ExerciseMode.re | 18 +-- src/haz3lweb/view/Page.re | 8 +- src/haz3lweb/view/ProjectorView.re | 35 +++-- src/haz3lweb/view/ScratchMode.re | 2 - .../view/assistant/UpdateAssistant.re | 7 +- 29 files changed, 539 insertions(+), 383 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 615d7958a1..c726f9ab1d 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -17,9 +17,12 @@ module Meta = { syntax_map: Id.Map.t(Piece.t), }; + type statics = CachedStatics.statics; + type t = { col_target: int, touched: Touched.t, + statics, projected, }; @@ -40,12 +43,16 @@ module Meta = { }; }; - let init = (z: Zipper.t) => { - { - col_target: 0, - touched: Touched.empty, - projected: Projector.Project.go(z) |> init_projected, - }; + let init = (~settings: CoreSettings.t, z: Zipper.t) => { + //TODO(andrew): allow pass-in of init ctx + //TODO(andrew): cleanup + let ctx_init = Builtins.ctx_init; + let term = MakeTerm.from_zip_for_sem(z) |> fst; + let info_map = Interface.Statics.mk_map_ctx(settings, ctx_init, term); + let projected = Projector.Project.go(z, info_map) |> init_projected; + let error_ids = Statics.Map.error_ids(projected.term_ranges, info_map); + let statics = CachedStatics.{term, info_map, error_ids}; + {col_target: 0, touched: Touched.empty, statics, projected}; }; module type S = { @@ -88,7 +95,14 @@ module Meta = { }; let next = - (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, meta: t): t => { + ( + ~effects: list(Effect.t)=[], + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + meta: t, + ) + : t => { let touched = Touched.update(Time.tick(), effects, meta.touched); let col_target = switch (a) { @@ -96,16 +110,35 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col }; - let z_projected = Projector.Project.go(z); + //TODO(andrew): cleanup + let (term, info_map) = + switch (Action.is_edit(a)) { + | false => (meta.statics.term, meta.statics.info_map) + | _ => + //TODO(andrew): allow pass-in of init ctx + let ctx_init = Builtins.ctx_init; + let term = MakeTerm.from_zip_for_sem(z) |> fst; + let info_map = Interface.Statics.mk_map_ctx(settings, ctx_init, term); + (term, info_map); + }; + let z_projected = Projector.Project.go(z, info_map); let projected = switch (Action.is_edit(a)) { //TODO(andrew): reenable //TODO: andrew figure out why core desyncs from view on measure length.. prob use diff statics - //| false => {...meta.projected, z: z_projected.z} + | false => {...meta.projected, z: z_projected.z} | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; - {touched, col_target, projected}; + let statics = + switch (Action.is_edit(a)) { + | false => meta.statics + | _ => + let error_ids = + Statics.Map.error_ids(projected.term_ranges, info_map); + CachedStatics.{term, info_map, error_ids}; + }; + {touched, col_target, projected, statics}; }; }; @@ -117,11 +150,21 @@ module State = { meta: Meta.t, }; - let init = zipper => {zipper, meta: Meta.init(zipper)}; + let init = (zipper, ~settings: CoreSettings.t) => { + zipper, + meta: Meta.init(zipper, ~settings), + }; - let next = (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, state) => { + let next = + ( + ~effects: list(Effect.t)=[], + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + state, + ) => { zipper: z, - meta: Meta.next(~effects, a, z, state.meta), + meta: Meta.next(~effects, ~settings, a, z, state.meta), }; }; @@ -146,12 +189,12 @@ type t = { read_only: bool, }; -let init = (~read_only=false, z) => { - state: State.init(z), +let init = (~read_only=false, z, ~settings: CoreSettings.t) => { + state: State.init(z, ~settings), history: History.empty, read_only, }; -let empty = id => init(~read_only=false, Zipper.init(id)); +// let empty = id => init(~read_only=false, Zipper.init(id)); let update_z = (f: Zipper.t => Zipper.t, ed: t) => { ...ed, @@ -169,8 +212,15 @@ let update_z_opt = (f: Zipper.t => option(Zipper.t), ed: t) => { }; let new_state = - (~effects: list(Effect.t)=[], a: Action.t, z: Zipper.t, ed: t): t => { - let state = State.next(~effects, a, z, ed.state); + ( + ~effects: list(Effect.t)=[], + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + ed: t, + ) + : t => { + let state = State.next(~effects, ~settings, a, z, ed.state); let history = History.add(a, ed.state, ed.history); {state, history, read_only: ed.read_only}; }; diff --git a/src/haz3lcore/zipper/EditorUtil.re b/src/haz3lcore/zipper/EditorUtil.re index bccb43ced0..f6d130e855 100644 --- a/src/haz3lcore/zipper/EditorUtil.re +++ b/src/haz3lcore/zipper/EditorUtil.re @@ -5,41 +5,41 @@ let editor_of_code = (~read_only=false, code: CodeString.t) => { }; }; -let editors_for = - (~read_only=false, xs: list('a), f: 'a => option(string)) - : (int, list(('a, option(Editor.t)))) => { - let zs = - List.fold_left( - (acc_zs, a) => { - switch (f(a)) { - | Some(str) => - switch (Printer.zipper_of_string(str)) { - | None => acc_zs @ [(a, Some(Zipper.init()))] - | Some(z) => acc_zs @ [(a, Some(z))] - } - | None => acc_zs @ [(a, None)] - } - }, - [], - xs, - ); - ( - 0, - List.map( - ((a, sz)) => - switch (sz) { - | Some(z) => (a, Some(Editor.init(z, ~read_only))) - | None => (a, None) - }, - zs, - ), - ); -}; +// let editors_for = +// (~read_only=false, xs: list('a), f: 'a => option(string)) +// : (int, list(('a, option(Editor.t)))) => { +// let zs = +// List.fold_left( +// (acc_zs, a) => { +// switch (f(a)) { +// | Some(str) => +// switch (Printer.zipper_of_string(str)) { +// | None => acc_zs @ [(a, Some(Zipper.init()))] +// | Some(z) => acc_zs @ [(a, Some(z))] +// } +// | None => acc_zs @ [(a, None)] +// } +// }, +// [], +// xs, +// ); +// ( +// 0, +// List.map( +// ((a, sz)) => +// switch (sz) { +// | Some(z) => (a, Some(Editor.init(z, ~read_only))) +// | None => (a, None) +// }, +// zs, +// ), +// ); +// }; -let editors_of_strings = (~read_only=false, xs: list(string)) => { - let (i, aes) = editors_for(xs, x => Some(x), ~read_only); - (i, List.map(((_, oe)) => Option.get(oe), aes)); -}; +// let editors_of_strings = (~read_only=false, xs: list(string)) => { +// let (i, aes) = editors_for(xs, x => Some(x), ~read_only); +// (i, List.map(((_, oe)) => Option.get(oe), aes)); +// }; let rec append_exp = (e1: TermBase.UExp.t, e2: TermBase.UExp.t) => { switch (e1.term) { diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index f4585a8c5e..c16a57a0d2 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -30,13 +30,22 @@ let kind = (p: t): kind => | TextArea(_) => TextArea }; -let init = (f: kind): core => +// let init = (f: kind): core => +// switch (f) { +// | Fold => FoldCore.mk() +// | Infer => InferCore.mk({expected_ty: None}) +// | Checkbox => CheckboxCore.mk() +// | Slider => SliderCore.mk() +// | TextArea => TextAreaCore.mk({inside: false}) +// }; + +let init = (f: kind): projector => switch (f) { - | Fold => FoldCore.mk() - | Infer => InferCore.mk({expected_ty: None}) - | Checkbox => CheckboxCore.mk() - | Slider => SliderCore.mk() - | TextArea => TextAreaCore.mk({inside: false}) + | Fold => Fold() + | Infer => Infer({expected_ty: None}) + | Checkbox => Checkbox() + | Slider => Slider() + | TextArea => TextArea({inside: false}) }; let name_of_kind = (p: kind): string => @@ -60,6 +69,19 @@ let of_name = (p: string): kind => let name = (p: t): string => p |> kind |> name_of_kind; +let status_and_id = (z: ZipperBase.t) => + //TODO(andrew): add Selected, Focused (maybe) + switch (Indicated.piece(z)) { + | Some((p, d, _)) => Some((Piece.id(p), Indicated(d))) + | None => None + }; + +let status = (z: ZipperBase.t): option(status) => + switch (status_and_id(z)) { + | Some((_, status)) => Some(status) + | None => None + }; + let shape = (p: t, syntax): shape => { let (module P) = to_module(p); P.placeholder(syntax); @@ -79,10 +101,10 @@ let placeholder_label = (p: t, syntax): list(string) => | Block({row, col}) => [String.make(row, '\n') ++ String.make(col, ' ')] }; -let placeholder = (p: t, syntax: syntax): syntax => +let placeholder = (p: t, info: info): syntax => Piece.Tile({ - id: Piece.id(syntax), - label: placeholder_label(p, syntax), + id: Piece.id(info.syntax), + label: placeholder_label(p, info), mold: Mold.mk_op(Any, []), shards: [0], children: [], @@ -92,11 +114,11 @@ let placeholder = (p: t, syntax: syntax): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let create = - (k: kind, syntax: syntax, id: Id.t, info_map: Statics.Map.t): option(t) => { - let (module P) = init(k); +let create = (k: kind, syntax: syntax): option(t) => { + let p = init(k); + let (module P) = to_module(p); P.can_project(syntax) && minimum_projection_condition(syntax) - ? Some(P.auto_update({info: Id.Map.find_opt(id, info_map)})) : None; + ? Some(p) : None; }; let piece_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => @@ -191,7 +213,7 @@ module MapPiece = { type updater = Piece.t => Piece.t; let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { - seg |> List.map(f) |> List.map(of_piece(f)); + seg |> List.map(p => f(p)) |> List.map(of_piece(f)); } and of_piece = (f: updater, piece: Piece.t): Piece.t => { switch (piece) { @@ -251,23 +273,27 @@ type proj_ret = { module Project = { let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); - let placehold = (projectors: Map.t, syntax: syntax) => - switch (Map.find(Piece.id(syntax), projectors)) { + let placehold = (projectors: Map.t, info_map: Statics.Map.t, syntax: syntax) => { + let id = Piece.id(syntax); + switch (Map.find(id, projectors)) { | None => syntax | Some(pr) => - syntax_map := Id.Map.add(Piece.id(syntax), syntax, syntax_map^); - placeholder(pr, syntax); + let info: info = { + syntax, + status: None, //TODO(andrew) + ci: Id.Map.find_opt(id, info_map), + }; + syntax_map := Id.Map.add(id, syntax, syntax_map^); + placeholder(pr, info); }; + }; - let go = (z: ZipperBase.t): proj_ret => { + let go = (z: ZipperBase.t, info_map: Statics.Map.t): proj_ret => { syntax_map := Id.Map.empty; if (Id.Map.is_empty(z.projectors)) { {z, syntax_map: syntax_map^}; } else { - let z = MapPiece.go(placehold(z.projectors), z); - // print_endline( - // "map card:" ++ string_of_int(Id.Map.cardinal(syntax_map^)), - // ); + let z = MapPiece.go(placehold(z.projectors, info_map), z); {z, syntax_map: syntax_map^}; }; }; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 884b724b28..6c491d6664 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -33,10 +33,6 @@ module Map = { let update = update; }; -/* Externally calculated info to be fed to projectors */ -[@deriving (show({with_path: false}), sexp, yojson)] -type info = {info: option(Info.t)}; - [@deriving (show({with_path: false}), sexp, yojson)] type shape = | Inline(int) @@ -63,6 +59,14 @@ type action = | UpdateSyntax(syntax => syntax) | UpdateModel(inner_action); +/* Externally calculated info to be fed to projectors */ +[@deriving (show({with_path: false}), sexp, yojson)] +type info = { + syntax, + status: option(status), + ci: option(Info.t), +}; + let cls = (indicated: option(status)) => switch (indicated) { | Some(Indicated(Left)) => ["indicated", "left"] @@ -80,20 +84,13 @@ module type Core = { let model: model; // let projector: projector; - let view: - ( - ~status: option(status), - ~syntax: syntax, - ~info: Info.t, - ~inject: action => Ui_effect.t(unit) - ) => - Node.t; - let placeholder: syntax => shape; + let view: (~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; + let placeholder: info => shape; //[@deriving (show({with_path: false}), sexp, yojson)] //type action; let update: inner_action => projector; - let auto_update: info => projector; + // let auto_update: info => projector; let keymap: (Util.Direction.t, Key.t) => option(action); }; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 62847b50df..eb04b5ddef 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -42,9 +42,6 @@ let update_caret = (f: Caret.t => Caret.t, z: t): t => { }; let set_caret = (caret: Caret.t): (t => t) => update_caret(_ => caret); -let parent = (z: t): option(Piece.t) => - Relatives.parent(~sel=z.selection.content, z.relatives); - let delete_parent = (z: t): t => { ...z, relatives: Relatives.delete_parent(z.relatives), @@ -64,20 +61,6 @@ let unzip = (seg: Segment.t): t => { projectors: ProjectorBase.Map.empty, }; -let sibs_with_sel = - ( - { - selection: {content, focus, _}, - relatives: {siblings: (l_sibs, r_sibs), _}, - _, - }: t, - ) - : Siblings.t => - switch (focus) { - | Left => (l_sibs, content @ r_sibs) - | Right => (l_sibs @ content, r_sibs) - }; - let pop_backpack = (z: t) => Backpack.pop(Relatives.local_incomplete_tiles(z.relatives), z.backpack); @@ -350,7 +333,9 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * below call, resulting in trying to interpret the syntax * of the placeholder as e.g. an int for the slider */ p - | Some(pr) => Projector.placeholder(pr, p) + | Some(pr) => + //TODO(andrew): figure out if ci None below will causes problems with eg Infer + Projector.placeholder(pr, {syntax: p, status: None, ci: None}) | None => p }; let seg = Piece.disassemble(p); diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 41db1c804b..35424485dd 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -47,3 +47,20 @@ let put_selection_content = (content: Segment.t, z): t => { content, }, }; + +let parent = (z: t): option(Piece.t) => + Relatives.parent(~sel=z.selection.content, z.relatives); + +let sibs_with_sel = + ( + { + selection: {content, focus, _}, + relatives: {siblings: (l_sibs, r_sibs), _}, + _, + }: t, + ) + : Siblings.t => + switch (focus) { + | Left => (l_sibs, content @ r_sibs) + | Right => (l_sibs @ content, r_sibs) + }; diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index e70a77a014..bc15b33e4e 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -1,5 +1,4 @@ open Util; -open Zipper; open OptUtil.Syntax; type relation = @@ -7,7 +6,7 @@ type relation = | Sibling; let piece' = - (~no_ws: bool, ~ign: Piece.t => bool, z: Zipper.t) + (~no_ws: bool, ~ign: Piece.t => bool, z: ZipperBase.t) : option((Piece.t, Direction.t, relation)) => { /* Returns the piece currently indicated (if any) and which side of that piece the caret is on. We favor indicating the piece to the @@ -15,7 +14,10 @@ let piece' = We don't indicate secondary tiles. This function ignores whether or not there is a selection so this can be used to get the caret direction, but the caller shouldn't indicate if there's a selection */ - switch (Siblings.neighbors(sibs_with_sel(z)), parent(z)) { + switch ( + Siblings.neighbors(ZipperBase.sibs_with_sel(z)), + ZipperBase.parent(z), + ) { /* Empty syntax => no indication */ | ((None, None), None) => None /* L not secondary, R is secondary => indicate L */ @@ -52,7 +54,7 @@ let piece' = let piece = piece'(~no_ws=true, ~ign=p => Piece.(is_secondary(p) || is_grout(p))); -let shard_index = (z: Zipper.t): option(int) => +let shard_index = (z: ZipperBase.t): option(int) => switch (piece(z)) { | None => None | Some((p, side, relation)) => @@ -82,13 +84,14 @@ let shard_index = (z: Zipper.t): option(int) => let for_index = piece'(~no_ws=false, ~ign=Piece.is_secondary); -let index = (z: Zipper.t): option(Id.t) => +let index = (z: ZipperBase.t): option(Id.t) => switch (for_index(z)) { | None => None | Some((p, _, _)) => Some(Piece.id(p)) }; -let ci_of = (z: Zipper.t, info_map: Statics.Map.t): option(Statics.Info.t) => +let ci_of = + (z: ZipperBase.t, info_map: Statics.Map.t): option(Statics.Info.t) => /* This version takes into accounts Secondary, while accounting for the * fact that Secondary is not currently added to the infomap. First we * try the basic indication function, specifying that we do not want @@ -98,7 +101,7 @@ let ci_of = (z: Zipper.t, info_map: Statics.Map.t): option(Statics.Info.t) => switch (piece'(~no_ws=true, ~ign=Piece.is_secondary, z)) { | Some((p, _, _)) => Id.Map.find_opt(Piece.id(p), info_map) | None => - let sibs = sibs_with_sel(z); + let sibs = ZipperBase.sibs_with_sel(z); let* cls = switch (Siblings.neighbors(sibs)) { /* If on side of comment, say we're on comment */ diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index d7d1747306..6a592fb953 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -21,7 +21,6 @@ let is_write_action = (a: Action.t) => { let go_z = ( ~meta: option(Editor.Meta.t)=?, - ~statics: CachedStatics.statics=CachedStatics.empty_statics, ~settings: CoreSettings.t, a: Action.t, z: Zipper.t, @@ -30,7 +29,7 @@ let go_z = let meta = switch (meta) { | Some(m) => m - | None => Editor.Meta.init(z) + | None => Editor.Meta.init(z, ~settings) }; module M = (val Editor.Meta.module_of_t(meta)); module Move = Move.Make(M); @@ -52,7 +51,7 @@ let go_z = Move.jump_to_id, Move.primary, a, - statics.info_map, + // statics.info_map, meta.projected.syntax_map, z, ) @@ -196,12 +195,7 @@ let go_z = }; let go = - ( - ~settings: CoreSettings.t, - ~statics: CachedStatics.statics=CachedStatics.empty_statics, - a: Action.t, - ed: Editor.t, - ) + (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) : Action.Result.t(Editor.t) => if (ed.read_only && is_write_action(a)) { Result.Ok(ed); @@ -209,6 +203,6 @@ let go = open Result.Syntax; let Editor.State.{zipper, meta} = ed.state; Effect.s_clear(); - let+ z = go_z(~statics, ~settings, ~meta, a, zipper); - Editor.new_state(~effects=Effect.s^, a, z, ed); + let+ z = go_z(~settings, ~meta, a, zipper); + Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); }; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 11488db422..cdd7f56b08 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -17,15 +17,15 @@ let set = (id: Id.t, p: option(t), z: Zipper.t) => { projectors: Map.update(id, _ => p, z.projectors), }; -let add = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => - switch (Projector.create(p, piece, id, info_map)) { +let add = (id: Id.t, z: Zipper.t, p, piece, d, rel) => + switch (Projector.create(p, piece)) { | None => Error(Action.Failure.Cant_project) | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) }; -let add_or_remove = (id: Id.t, z: Zipper.t, info_map, p, piece, d, rel) => +let add_or_remove = (id: Id.t, z: Zipper.t, p, piece, d, rel) => switch (Map.mem(id, z.projectors)) { - | false => add(id, z, info_map, p, piece, d, rel) + | false => add(id, z, p, piece, d, rel) | true => Ok(set(id, None, z)) }; @@ -35,11 +35,9 @@ let go = primary: (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), a: Action.project, - info_map: Statics.Map.t, syntax_map, z: Zipper.t, ) => { - //TODO(andrew): avoid bringing statics in here? let crime = (_syntax, b, p) => { //TODO(andrew): remove this crime let (module P) = Projector.to_module(p); @@ -81,14 +79,13 @@ let go = | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) - | Some((piece, d, rel)) => - add(Piece.id(piece), z, info_map, p, piece, d, rel) + | Some((piece, d, rel)) => add(Piece.id(piece), z, p, piece, d, rel) } | ToggleIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) | Some((piece, d, rel)) => - add_or_remove(Piece.id(piece), z, info_map, p, piece, d, rel) + add_or_remove(Piece.id(piece), z, p, piece, d, rel) } | Remove(id) => switch (Map.mem(id, z.projectors)) { diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 2a8172e2b6..be2adc1460 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -25,13 +25,7 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let view = - ( - ~status as _, - ~syntax, - ~info as _, - ~inject: ProjectorBase.action => Ui_effect.t(unit), - ) => +let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Node.input( ~attrs= [ @@ -39,7 +33,7 @@ let view = Attr.on_input((_, _) => inject(UpdateSyntax(toggle))), //JsUtil.stop_mousedown_propagation, ] - @ (get(syntax) ? [Attr.checked] : []), + @ (get(info.syntax) ? [Attr.checked] : []), (), ); @@ -57,7 +51,7 @@ let mk = (model): core => let model = model; let can_project = p => state_of(p) != None; let placeholder = _ => Inline(2); - let auto_update = _: projector => Checkbox(); + // let auto_update = _: projector => Checkbox(); let update = (_action): projector => Checkbox(); let view = view; let keymap = keymap; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 3144df0bc0..b8ff993594 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -12,9 +12,9 @@ let mk = (_model: fold): core => let model = (); let can_project = _ => true; let placeholder = _ => Inline(2); - let auto_update = _ => Fold(); + // let auto_update = _ => Fold(); let update = _ => Fold(); - let view = (~status as _, ~syntax as _, ~info as _, ~inject) => + let view = (~info as _, ~inject) => div( ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re index 42b2a6239d..7c71a51c6d 100644 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ b/src/haz3lcore/zipper/projectors/InferCore.re @@ -32,19 +32,19 @@ let mk = (model: infer): core => | _ => false }; - let placeholder = _ => - Inline((model.expected_ty |> display |> String.length) - 2); + let placeholder = (info: ProjectorBase.info) => + Inline((Some(expected_ty(info.ci)) |> display |> String.length) - 2); - let auto_update = ({info, _}) => { - print_endline("updating infer projector"); - Infer({expected_ty: Some(expected_ty(info))}); - }; + // let auto_update = ({ci, _}) => { + // print_endline("updating infer projector"); + // Infer({expected_ty: Some(expected_ty(Some(ci)))}); + // }; let update = _ => Infer(model); - let view = (~status as _, ~syntax as _, ~info, ~inject) => + let view = (~info: ProjectorBase.info, ~inject) => div( ~attrs=[Attr.on_double_click(_ => inject(Remove))], - [text(display(Some(expected_ty(Some(info)))))], + [text(display(Some(expected_ty(info.ci))))], ); let keymap = (_, key: Key.t): option(ProjectorBase.action) => diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index ebfb130c6d..3b250b798e 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -19,24 +19,15 @@ let put = (new_val: string): Piece.t => mk_mono(Exp, new_val); let get = (piece: Piece.t): int => switch (state_of(piece)) { - | None => - //TODO(andrew): fix this bug (moving caret to right of slider crashes) - switch (of_mono(piece)) { - | Some(p) => - print_endline("ERROR: Slider: not integer literal: " ++ p); - 0; - | None => - print_endline("ERROR: Slider: not integer literal: No piece"); - 0; - } + | None => failwith("ERROR: Slider: not integer literal") | Some(s) => s }; -let view = (~inject: ProjectorBase.action => Ui_effect.t(unit), value: int) => +let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Node.input( ~attrs=[ Attr.create("type", "range"), - Attr.create("value", string_of_int(value)), + Attr.create("value", string_of_int(get(info.syntax))), Attr.on_input((_evt, new_val) => inject(UpdateSyntax(_ => put(new_val))) ), @@ -58,8 +49,8 @@ let mk = (model): core => let model = model; let can_project = p => state_of(p) != None; let placeholder = _ => Inline(10); - let auto_update = _ => Slider(model); + // let auto_update = _ => Slider(model); let update = _ => Slider(model); - let view = (~status as _, ~syntax, ~info as _) => view(get(syntax)); + let view = view; let keymap = keymap; }); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 91e69f1507..7de9bd117f 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -67,10 +67,12 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let view = (model: textarea, ~selector, ~status, ~syntax, ~info as _, ~inject) => { - let text = syntax |> get |> Form.strip_quotes; +let view = (model: textarea, ~selector, ~info, ~inject) => { + let text = info.syntax |> get |> Form.strip_quotes; Node.div( - ~attrs=[Attr.classes(["cols"] @ (model.inside ? [] : cls(status)))], + ~attrs=[ + Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), + ], n_of(1 + Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); @@ -114,10 +116,10 @@ let line_lengths = syntax => let num_lines = syntax => List.fold_left(max, 0, line_lengths(syntax)); -let placeholder = syntax => +let placeholder = info => Block({ - row: Util.StringUtil.num_linebreaks(get(syntax)), - col: 2 + num_lines(syntax) /* +2 for left and right padding */ + row: Util.StringUtil.num_linebreaks(get(info.syntax)), + col: 2 + num_lines(info.syntax) /* +2 for left and right padding */ }); let mk = (model): core => @@ -128,7 +130,7 @@ let mk = (model): core => let model = model; let can_project = _ => true; let placeholder = placeholder; - let auto_update = _ => TextArea(model); + // let auto_update = _ => TextArea(model); let update = a => switch (a) { | SetInside(b) => diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 1eed676afe..90e50bcc7b 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -337,57 +337,59 @@ module F = (ExerciseEnv: ExerciseEnv) => { }; }; - let editor_of_serialization = zipper => Editor.init(zipper); - let eds_of_spec: spec => eds = - ( - { - title, - version, - module_name, - prompt, - point_distribution, - prelude, - correct_impl, - your_tests, - your_impl, - hidden_bugs, - hidden_tests, - syntax_tests, - }, - ) => { - let prelude = editor_of_serialization(prelude); - let correct_impl = editor_of_serialization(correct_impl); - let your_tests = { - let tests = editor_of_serialization(your_tests.tests); - {tests, required: your_tests.required, provided: your_tests.provided}; - }; - let your_impl = editor_of_serialization(your_impl); - let hidden_bugs = - hidden_bugs - |> List.map(({impl, hint}) => { - let impl = editor_of_serialization(impl); - {impl, hint}; - }); - let hidden_tests = { - let {tests, hints} = hidden_tests; - let tests = editor_of_serialization(tests); - {tests, hints}; - }; - { - title, - version, - module_name, - prompt, - point_distribution, - prelude, - correct_impl, - your_tests, - your_impl, - hidden_bugs, - hidden_tests, - syntax_tests, - }; + let eds_of_spec = + ( + { + title, + version, + module_name, + prompt, + point_distribution, + prelude, + correct_impl, + your_tests, + your_impl, + hidden_bugs, + hidden_tests, + syntax_tests, + }, + ~settings: CoreSettings.t, + ) + : eds => { + let editor_of_serialization = Editor.init(~settings); + let prelude = editor_of_serialization(prelude); + let correct_impl = editor_of_serialization(correct_impl); + let your_tests = { + let tests = editor_of_serialization(your_tests.tests); + {tests, required: your_tests.required, provided: your_tests.provided}; }; + let your_impl = editor_of_serialization(your_impl); + let hidden_bugs = + hidden_bugs + |> List.map(({impl, hint}) => { + let impl = editor_of_serialization(impl); + {impl, hint}; + }); + let hidden_tests = { + let {tests, hints} = hidden_tests; + let tests = editor_of_serialization(tests); + {tests, hints}; + }; + { + title, + version, + module_name, + prompt, + point_distribution, + prelude, + correct_impl, + your_tests, + your_impl, + hidden_bugs, + hidden_tests, + syntax_tests, + }; + }; // // Old version of above that did string-based parsing, may be useful @@ -478,8 +480,9 @@ module F = (ExerciseEnv: ExerciseEnv) => { }; }; - let state_of_spec = (spec, ~instructor_mode: bool): state => { - let eds = eds_of_spec(spec); + let state_of_spec = + (spec, ~instructor_mode: bool, ~settings: CoreSettings.t): state => { + let eds = eds_of_spec(~settings, spec); set_instructor_mode({pos: YourImpl, eds}, instructor_mode); }; @@ -499,15 +502,16 @@ module F = (ExerciseEnv: ExerciseEnv) => { (pos, positioned_zippers): persistent_state, ~spec: spec, ~instructor_mode: bool, + ~settings: CoreSettings.t, ) : state => { let lookup = (pos, default) => if (visible_in(pos, ~instructor_mode)) { let persisted_zipper = List.assoc(pos, positioned_zippers); let zipper = PersistentZipper.unpersist(persisted_zipper); - Editor.init(zipper); + Editor.init(zipper, ~settings); } else { - editor_of_serialization(default); + Editor.init(default, ~settings); }; let prelude = lookup(Prelude, spec.prelude); let correct_impl = lookup(CorrectImpl, spec.correct_impl); diff --git a/src/haz3lschool/Gradescope.re b/src/haz3lschool/Gradescope.re index 60fe8ec396..17f2d73dae 100644 --- a/src/haz3lschool/Gradescope.re +++ b/src/haz3lschool/Gradescope.re @@ -45,6 +45,7 @@ type section = { type chapter = list(section); module Main = { + let settings = CoreSettings.on; /* Statics and Dynamics on */ let name_to_exercise_export = path => { let yj = Yojson.Safe.from_file(path); switch (yj) { @@ -66,7 +67,6 @@ module Main = { zipper, ); }; - let settings = CoreSettings.on; let model_results = spliced_elabs(settings, exercise) |> ModelResults.init_eval @@ -118,6 +118,7 @@ module Main = { let exercise = unpersist_state( persistent_state, + ~settings, ~spec, ~instructor_mode=true, ); diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 5288c5eb91..59a9a1c5c6 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -129,34 +129,37 @@ let set_instructor_mode = (editors: t, instructor_mode: bool): t => ) }; -let reset_nth_slide = (n, slides) => { +let reset_nth_slide = (~settings: CoreSettings.t, n, slides): list(Editor.t) => { let (_, init_editors, _) = Init.startup.scratch; let data = List.nth(init_editors, n); - let init_nth = ScratchSlide.unpersist(data); + let init_nth = ScratchSlide.unpersist(~settings, data); Util.ListUtil.put_nth(n, init_nth, slides); }; -let reset_named_slide = (name, slides) => { +let reset_named_slide = + (~settings: CoreSettings.t, name, slides): list((string, Editor.t)) => { let (_, init_editors, _) = Init.startup.documentation; let data = List.assoc(name, init_editors); - let init_name = ScratchSlide.unpersist(data); + let init_name = ScratchSlide.unpersist(~settings, data); slides |> List.remove_assoc(name) |> List.cons((name, init_name)); }; -let reset_current = (editors: t, ~instructor_mode: bool): t => +let reset_current = + (editors: t, ~settings: CoreSettings.t, ~instructor_mode: bool): t => switch (editors) { - | Scratch(n, slides) => Scratch(n, reset_nth_slide(n, slides)) + | Scratch(n, slides) => Scratch(n, reset_nth_slide(~settings, n, slides)) | Documentation(name, slides) => - Documentation(name, reset_named_slide(name, slides)) + Documentation(name, reset_named_slide(~settings, name, slides)) | Exercises(n, specs, _) => Exercises( n, specs, - List.nth(specs, n) |> Exercise.state_of_spec(~instructor_mode), + List.nth(specs, n) + |> Exercise.state_of_spec(~settings, ~instructor_mode), ) }; -let import_current = (editors: t, data: option(string)): t => +let import_current = (~settings, editors: t, data: option(string)): t => switch (editors) { | Documentation(_) | Exercises(_) => failwith("impossible") @@ -164,7 +167,7 @@ let import_current = (editors: t, data: option(string)): t => switch (data) { | None => editors | Some(data) => - let state = ScratchSlide.import(data); + let state = ScratchSlide.import(~settings, data); let slides = Util.ListUtil.put_nth(idx, state, slides); Scratch(idx, slides); } diff --git a/src/haz3lweb/Export.re b/src/haz3lweb/Export.re index a6c9536971..ebe57a0b17 100644 --- a/src/haz3lweb/Export.re +++ b/src/haz3lweb/Export.re @@ -24,11 +24,11 @@ let mk_all = (~instructor_mode, ~log) => { let settings = Store.Settings.export(); let explainThisModel = Store.ExplainThisModel.export(); let settings_obj = Store.Settings.load(); - let scratch = Store.Scratch.export(~settings=settings_obj.core.evaluation); - let documentation = - Store.Documentation.export(~settings=settings_obj.core.evaluation); + let scratch = Store.Scratch.export(~settings=settings_obj.core); + let documentation = Store.Documentation.export(~settings=settings_obj.core); let exercise = Store.Exercise.export( + ~settings=settings_obj.core, ~specs=ExerciseSettings.exercises, ~instructor_mode, ); @@ -56,7 +56,12 @@ let import_all = (data, ~specs) => { let settings = Store.Settings.import(all.settings); Store.ExplainThisModel.import(all.explainThisModel); let instructor_mode = settings.instructor_mode; - Store.Scratch.import(~settings=settings.core.evaluation, all.scratch); - Store.Exercise.import(all.exercise, ~specs, ~instructor_mode); + Store.Scratch.import(~settings=settings.core, all.scratch); + Store.Exercise.import( + ~settings=settings.core, + all.exercise, + ~specs, + ~instructor_mode, + ); Log.import(all.log); }; diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index 0c17196717..7674d54b4b 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -69,6 +69,7 @@ let load_editors = | Exercises => let (n, specs, exercise) = Store.Exercise.load( + ~settings, ~specs=ExerciseSettings.exercises, ~instructor_mode, ); @@ -91,7 +92,7 @@ let load = (init_model: t): t => { let explainThisModel = Store.ExplainThisModel.load(); let (editors, results) = load_editors( - ~settings=settings.core.evaluation, + ~settings=settings.core, ~mode=settings.mode, ~instructor_mode=settings.instructor_mode, ); @@ -116,11 +117,11 @@ let reset = (model: t): t => { but don't otherwise erase localstorage, allowing e.g. api keys to persist */ let settings = Store.Settings.init(); - ignore(settings); + let settings = settings.core; ignore(Store.ExplainThisModel.init()); - ignore(Store.Scratch.init(~settings=settings.core.evaluation)); - ignore(Store.Documentation.init(~settings=settings.core.evaluation)); - ignore(Store.Exercise.init(~instructor_mode=true)); + ignore(Store.Scratch.init(~settings)); + ignore(Store.Documentation.init(~settings)); + ignore(Store.Exercise.init(~settings, ~instructor_mode=true)); let new_model = load(blank); { ...new_model, diff --git a/src/haz3lweb/ScratchSlide.re b/src/haz3lweb/ScratchSlide.re index 0c346aaa7b..6d05b1e5af 100644 --- a/src/haz3lweb/ScratchSlide.re +++ b/src/haz3lweb/ScratchSlide.re @@ -8,40 +8,46 @@ type persistent_state = PersistentZipper.t; let scratch_key = n => "scratch_" ++ n; -let persist = (editor: Editor.t) => { +let persist = (editor: Editor.t): persistent_state => { PersistentZipper.persist(editor.state.zipper); }; -let unpersist = (zipper: persistent_state) => { +let unpersist = (zipper: persistent_state, ~settings: CoreSettings.t): state => { let zipper = PersistentZipper.unpersist(zipper); - Editor.init(zipper, ~read_only=false); + Editor.init(zipper, ~read_only=false, ~settings); }; -let serialize = (state: state) => { +let serialize = (state: state): string => { persist(state) |> sexp_of_persistent_state |> Sexplib.Sexp.to_string; }; -let deserialize = (data: string) => { - Sexplib.Sexp.of_string(data) |> persistent_state_of_sexp |> unpersist; +let deserialize = (data: string, ~settings: CoreSettings.t): state => { + Sexplib.Sexp.of_string(data) + |> persistent_state_of_sexp + |> unpersist(~settings); }; -let deserialize_opt = (data: string) => { +let deserialize_opt = + (data: string, ~settings: CoreSettings.t): option(state) => { let sexp = try(Some(Sexplib.Sexp.of_string(data) |> persistent_state_of_sexp)) { | _ => None }; - sexp |> Option.map(sexp => sexp |> unpersist); + sexp |> Option.map(sexp => sexp |> unpersist(~settings)); }; -let export = (state: state) => { +let export = (state: state): Yojson.Safe.t => { state |> persist |> yojson_of_persistent_state; }; -let import = (data: string) => { - data |> Yojson.Safe.from_string |> persistent_state_of_yojson |> unpersist; +let import = (data: string, ~settings: CoreSettings.t): state => { + data + |> Yojson.Safe.from_string + |> persistent_state_of_yojson + |> unpersist(~settings); }; -let export_init = (state: state) => { +let export_init = (state: state): string => { state |> persist |> show_persistent_state; }; diff --git a/src/haz3lweb/Store.re b/src/haz3lweb/Store.re index 0c4ac3fe23..673d260c00 100644 --- a/src/haz3lweb/Store.re +++ b/src/haz3lweb/Store.re @@ -1,4 +1,6 @@ open Haz3lcore; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; // A generic key-value store for saving/loading data to/from local storage module Generic = { @@ -113,6 +115,9 @@ module Scratch = { [@deriving (show({with_path: false}), sexp, yojson)] type persistent = PersistentData.scratch; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = (int, list(Editor.t), ModelResults.M.t(ModelResult.t)); + let to_persistent = ((idx, slides, results)): persistent => ( idx, List.map(ScratchSlide.persist, slides), @@ -121,36 +126,42 @@ module Scratch = { |> ModelResults.bindings, ); - let of_persistent = (~settings, (idx, slides, results): persistent) => { + let of_persistent = + (~settings: CoreSettings.t, (idx, slides, results): persistent): t => { ( idx, - List.map(ScratchSlide.unpersist, slides), + List.map(ScratchSlide.unpersist(~settings), slides), results |> List.to_seq |> ModelResults.of_seq - |> ModelResults.map(ModelResult.of_persistent(~settings)), + |> ModelResults.map( + ModelResult.of_persistent(~settings=settings.evaluation), + ), ); }; - let serialize = scratch => { + let serialize = (scratch: t): string => { scratch |> to_persistent |> sexp_of_persistent |> Sexplib.Sexp.to_string; }; - let deserialize = data => { - data |> Sexplib.Sexp.of_string |> persistent_of_sexp |> of_persistent; + let deserialize = (data: string, ~settings: CoreSettings.t): t => { + data + |> Sexplib.Sexp.of_string + |> persistent_of_sexp + |> of_persistent(~settings); }; - let save = (scratch): unit => { + let save = (scratch: t): unit => { JsUtil.set_localstore(save_scratch_key, serialize(scratch)); }; - let init = (~settings) => { + let init = (~settings: CoreSettings.t): t => { let scratch = of_persistent(~settings, Init.startup.scratch); save(scratch); scratch; }; - let load = (~settings) => + let load = (~settings: CoreSettings.t): t => switch (JsUtil.get_localstore(save_scratch_key)) { | None => init(~settings) | Some(data) => @@ -159,8 +170,10 @@ module Scratch = { } }; - let export = (~settings) => serialize(load(~settings)); - let import = (~settings, data) => save(deserialize(~settings, data)); + let export = (~settings: CoreSettings.t): string => + serialize(load(~settings)); + let import = (~settings: CoreSettings.t, data: string): unit => + save(deserialize(~settings, data)); }; module Documentation = { @@ -169,13 +182,20 @@ module Documentation = { [@deriving (show({with_path: false}), sexp, yojson)] type persistent = PersistentData.documentation; + [@deriving (show({with_path: false}), sexp, yojson)] + type t = ( + string, + list((string, Editor.t)), + ModelResults.M.t(ModelResult.t), + ); + let persist = ((name, editor: Editor.t)) => { (name, PersistentZipper.persist(editor.state.zipper)); }; - let unpersist = ((name, zipper)) => { + let unpersist = ((name, zipper), ~settings: CoreSettings.t) => { let zipper = PersistentZipper.unpersist(zipper); - (name, Editor.init(zipper, ~read_only=false)); + (name, Editor.init(zipper, ~read_only=false, ~settings)); }; let to_persistent = ((string, slides, results)): persistent => ( @@ -186,36 +206,42 @@ module Documentation = { |> ModelResults.bindings, ); - let of_persistent = (~settings, (string, slides, results): persistent) => { + let of_persistent = + (~settings: CoreSettings.t, (string, slides, results): persistent): t => { ( string, - List.map(unpersist, slides), + List.map(unpersist(~settings), slides), results |> List.to_seq |> ModelResults.of_seq - |> ModelResults.map(ModelResult.of_persistent(~settings)), + |> ModelResults.map( + ModelResult.of_persistent(~settings=settings.evaluation), + ), ); }; - let serialize = slides => { + let serialize = (slides: t): string => { slides |> to_persistent |> sexp_of_persistent |> Sexplib.Sexp.to_string; }; - let deserialize = data => { - data |> Sexplib.Sexp.of_string |> persistent_of_sexp |> of_persistent; + let deserialize = (~settings: CoreSettings.t, data: string): t => { + data + |> Sexplib.Sexp.of_string + |> persistent_of_sexp + |> of_persistent(~settings); }; - let save = (slides): unit => { + let save = (slides: t): unit => { JsUtil.set_localstore(save_documentation_key, serialize(slides)); }; - let init = (~settings) => { + let init = (~settings: CoreSettings.t): t => { let documentation = of_persistent(~settings, Init.startup.documentation); save(documentation); documentation; }; - let load = (~settings) => + let load = (~settings: CoreSettings.t): t => switch (JsUtil.get_localstore(save_documentation_key)) { | None => init(~settings) | Some(data) => @@ -224,8 +250,10 @@ module Documentation = { } }; - let export = (~settings) => serialize(load(~settings)); - let import = (~settings, data) => save(deserialize(~settings, data)); + let export = (~settings: CoreSettings.t): string => + serialize(load(~settings)); + let import = (~settings: CoreSettings.t, data: string): unit => + save(deserialize(~settings, data)); }; module Exercise = { @@ -249,57 +277,70 @@ module Exercise = { JsUtil.set_localstore(cur_exercise_key, keystring_of_key(key)); }; - let save_exercise = (exercise, ~instructor_mode) => { + let save_exercise = (exercise, ~instructor_mode): unit => { let key = Exercise.key_of_state(exercise); let keystring = keystring_of_key(key); let value = Exercise.serialize_exercise(exercise, ~instructor_mode); JsUtil.set_localstore(keystring, value); }; - let init_exercise = (spec, ~instructor_mode) => { + let init_exercise = + (~settings: CoreSettings.t, spec, ~instructor_mode): state => { let key = Exercise.key_of(spec); let keystring = keystring_of_key(key); - let exercise = Exercise.state_of_spec(spec, ~instructor_mode); + let exercise = Exercise.state_of_spec(spec, ~instructor_mode, ~settings); save_exercise(exercise, ~instructor_mode); JsUtil.set_localstore(cur_exercise_key, keystring); exercise; }; - let load_exercise = (key, spec, ~instructor_mode): Exercise.state => { + let load_exercise = + (~settings: CoreSettings.t, key, spec, ~instructor_mode): Exercise.state => { let keystring = keystring_of_key(key); switch (JsUtil.get_localstore(keystring)) { | Some(data) => let exercise = - try(Exercise.deserialize_exercise(data, ~spec, ~instructor_mode)) { - | _ => init_exercise(spec, ~instructor_mode) + try( + Exercise.deserialize_exercise( + data, + ~spec, + ~instructor_mode, + ~settings, + ) + ) { + | _ => init_exercise(spec, ~instructor_mode, ~settings) }; JsUtil.set_localstore(cur_exercise_key, keystring); exercise; - | None => init_exercise(spec, ~instructor_mode) + | None => init_exercise(spec, ~instructor_mode, ~settings) }; }; - let save = ((n, specs, exercise), ~instructor_mode) => { + let save = ((n, specs, exercise), ~instructor_mode): unit => { let key = key_of(List.nth(specs, n)); let keystring = keystring_of_key(key); save_exercise(exercise, ~instructor_mode); JsUtil.set_localstore(cur_exercise_key, keystring); }; - let init = (~instructor_mode) => { + let init = + (~settings: CoreSettings.t, ~instructor_mode) + : (int, list(spec), state) => { let exercises = { ( 0, ExerciseSettings.exercises, List.nth(ExerciseSettings.exercises, 0) - |> Exercise.state_of_spec(~instructor_mode), + |> Exercise.state_of_spec(~instructor_mode, ~settings), ); }; save(exercises, ~instructor_mode); exercises; }; - let load = (~specs, ~instructor_mode) => { + let load = + (~settings: CoreSettings.t, ~specs, ~instructor_mode) + : (int, list(p(ZipperBase.t)), state) => { switch (JsUtil.get_localstore(cur_exercise_key)) { | Some(keystring) => let key = key_of_keystring(keystring); @@ -308,13 +349,16 @@ module Exercise = { switch (JsUtil.get_localstore(keystring)) { | Some(data) => let exercise = - try(deserialize_exercise(data, ~spec, ~instructor_mode)) { - | _ => init_exercise(spec, ~instructor_mode) + try( + deserialize_exercise(data, ~spec, ~instructor_mode, ~settings) + ) { + | _ => init_exercise(spec, ~instructor_mode, ~settings) }; (n, specs, exercise); | None => // initialize exercise from spec - let exercise = Exercise.state_of_spec(spec, ~instructor_mode); + let exercise = + Exercise.state_of_spec(spec, ~instructor_mode, ~settings); save_exercise(exercise, ~instructor_mode); (n, specs, exercise); } @@ -322,13 +366,19 @@ module Exercise = { // invalid current exercise key saved, load the first exercise let first_spec = List.nth(specs, 0); let first_key = Exercise.key_of(first_spec); - (0, specs, load_exercise(first_key, first_spec, ~instructor_mode)); + ( + 0, + specs, + load_exercise(first_key, first_spec, ~instructor_mode, ~settings), + ); }; - | None => init(~instructor_mode) + | None => init(~instructor_mode, ~settings) }; }; - let prep_exercise_export = (~specs, ~instructor_mode) => { + let prep_exercise_export = + (~specs, ~instructor_mode: bool, ~settings: CoreSettings.t) + : exercise_export => { { cur_exercise: key_of_keystring( @@ -339,15 +389,16 @@ module Exercise = { |> List.map(spec => { let key = Exercise.key_of(spec); let exercise = - load_exercise(key, spec, ~instructor_mode) + load_exercise(key, spec, ~instructor_mode, ~settings) |> Exercise.persistent_state_of_state(~instructor_mode); (key, exercise); }), }; }; - let serialize_exercise_export = (~specs, ~instructor_mode) => { - prep_exercise_export(~specs, ~instructor_mode) + let serialize_exercise_export = + (~specs, ~instructor_mode, ~settings: CoreSettings.t) => { + prep_exercise_export(~specs, ~instructor_mode, ~settings) |> sexp_of_exercise_export |> Sexplib.Sexp.to_string; }; @@ -356,7 +407,8 @@ module Exercise = { serialize_exercise_export(~specs, ~instructor_mode); }; - let import = (data, ~specs, ~instructor_mode) => { + let import = + (data, ~specs, ~instructor_mode: bool, ~settings: CoreSettings.t) => { let exercise_export = data |> deserialize_exercise_export; save_exercise_key(exercise_export.cur_exercise); exercise_export.exercise_data @@ -371,6 +423,7 @@ module Exercise = { persistent_state, ~spec, ~instructor_mode, + ~settings, ), ~instructor_mode, ) diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 00eccbdce5..9ec45ae820 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -216,22 +216,23 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; -let update_projectors = (model: Model.t): Model.t => { - let statics = Model.current_statics(model); - //let editor = Editors.get_editor(model.editors); - //let syntax_map = editor.state.meta.projected.syntax_map; - let editors = - Editors.map_projectors( - model.editors, - (id, p) => { - //let syntax = Id.Map.find(id, syntax_map); - let (module P) = Projector.to_module(p); - let info = Id.Map.find_opt(id, statics.info_map); - P.auto_update({info: info}); - }, - ); - {...model, editors}; -}; +//TODO(andrew): cleanup +// let update_projectors = (model: Model.t): Model.t => { +// let statics = Model.current_statics(model); +// //let editor = Editors.get_editor(model.editors); +// //let syntax_map = editor.state.meta.projected.syntax_map; +// let editors = +// Editors.map_projectors( +// model.editors, +// (id, p) => { +// //let syntax = Id.Map.find(id, syntax_map); +// let (module P) = Projector.to_module(p); +// let info = Id.Map.find_opt(id, statics.info_map); +// P.auto_update({info: info}); +// }, +// ); +// {...model, editors}; +// }; let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_statics = is_edit(update) || reevaluate_post_update(update); @@ -239,9 +240,11 @@ let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let m = update_statics || update_dynamics && m.settings.core.statics ? { - print_endline("UPDATING STATICS"); + print_endline("UPDATING STATICS. TODO(andrew): disable this!!!!!"); + //TODO(andrew): cleanup let statics = Editors.mk_statics(~settings=m.settings, m.editors); - update_projectors({...m, statics}); + //update_projectors({...m, statics}); + {...m, statics}; } : m; if (update_dynamics && m.settings.core.dynamics) { @@ -256,11 +259,7 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => switch ( model.editors |> Editors.get_editor - |> Haz3lcore.Perform.go( - ~statics=Model.current_statics(model), - ~settings=model.settings.core, - a, - ) + |> Haz3lcore.Perform.go(~settings=model.settings.core, a) ) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => @@ -271,7 +270,8 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => }; let switch_scratch_slide = - (editors: Editors.t, ~instructor_mode, idx: int): option(Editors.t) => + (~settings, editors: Editors.t, ~instructor_mode, idx: int) + : option(Editors.t) => switch (editors) { | Documentation(_) => None | Scratch(n, _) when n == idx => None @@ -281,7 +281,8 @@ let switch_scratch_slide = | Exercises(_, specs, _) => let spec = List.nth(specs, idx); let key = Exercise.key_of(spec); - let exercise = Store.Exercise.load_exercise(key, spec, ~instructor_mode); + let exercise = + Store.Exercise.load_exercise(key, spec, ~instructor_mode, ~settings); Some(Exercises(idx, specs, exercise)); }; @@ -310,10 +311,10 @@ let export_persistent_data = () => { let settings = Store.Settings.load(); let data: PersistentData.t = { documentation: - Store.Documentation.load(~settings=settings.core.evaluation) + Store.Documentation.load(~settings=settings.core) |> Store.Documentation.to_persistent, scratch: - Store.Scratch.load(~settings=settings.core.evaluation) + Store.Scratch.load(~settings=settings.core) |> Store.Scratch.to_persistent, settings, }; @@ -381,18 +382,35 @@ let rec apply = ); Ok(model); | FinishImportScratchpad(data) => - let editors = Editors.import_current(model.editors, data); + let editors = + Editors.import_current( + ~settings=model.settings.core, + model.editors, + data, + ); Model.save_and_return({...model, editors}); | ExportPersistentData => export_persistent_data(); Ok(model); | ResetCurrentEditor => let instructor_mode = model.settings.instructor_mode; - let editors = Editors.reset_current(model.editors, ~instructor_mode); + let editors = + Editors.reset_current( + ~settings=model.settings.core, + model.editors, + ~instructor_mode, + ); Model.save_and_return({...model, editors}); | SwitchScratchSlide(n) => let instructor_mode = model.settings.instructor_mode; - switch (switch_scratch_slide(model.editors, ~instructor_mode, n)) { + switch ( + switch_scratch_slide( + ~settings=model.settings.core, + model.editors, + ~instructor_mode, + n, + ) + ) { | None => Error(FailedToSwitch) | Some(editors) => Model.save_and_return({...model, editors}) }; @@ -450,7 +468,13 @@ let rec apply = | None => Error(CantReset) | Some(z) => //TODO: add correct action to history (Pick_up is wrong) - let editor = Haz3lcore.Editor.new_state(Pick_up, z, ed); + let editor = + Haz3lcore.Editor.new_state( + ~settings=model.settings.core, + Pick_up, + z, + ed, + ); let editors = Editors.put_editor(editor, model.editors); Ok({...model, editors}); }; @@ -467,7 +491,13 @@ let rec apply = | None => Error(CantPaste) | Some(z) => //HACK(andrew): below is not strictly a insert action... - let ed = Haz3lcore.Editor.new_state(Insert(clipboard), z, ed); + let ed = + Haz3lcore.Editor.new_state( + ~settings=model.settings.core, + Insert(clipboard), + z, + ed, + ); let editors = Editors.put_editor(ed, model.editors); Ok({...model, editors}); }; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 84d4d1d7da..5803d80a85 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -110,7 +110,6 @@ let deco = ~font_metrics, ~show_backpack_targets, ~selected, - ~statics: CachedStatics.statics, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), { @@ -118,6 +117,7 @@ let deco = { meta: { + statics, projected: { z, @@ -275,7 +275,6 @@ let editor_view = ~footer: option(list(Node.t))=?, ~highlights: option(ColorSteps.colorMap), ~overlayer: option(Node.t)=None, - ~statics: CachedStatics.statics, ~sort=Sort.root, editor: Editor.t, ) => { @@ -286,7 +285,6 @@ let editor_view = ~font_metrics, ~show_backpack_targets, ~selected, - ~statics, ~test_results, ~highlights, editor, @@ -380,10 +378,11 @@ let locked_no_statics = ~target_id, ~footer=[], ~test_results=None, - ~statics=CachedStatics.empty_statics, ~overlayer=Some(expander_deco), ~sort, - segment |> Zipper.unzip |> Editor.init(~read_only=true), + segment + |> Zipper.unzip + |> Editor.init(~settings=CoreSettings.off, ~read_only=true), ), ]; @@ -398,7 +397,10 @@ let locked = ~target_id, ~segment: Segment.t, ) => { - let editor = segment |> Zipper.unzip |> Editor.init(~read_only=true); + let editor = + segment + |> Zipper.unzip + |> Editor.init(~settings=settings.core, ~read_only=true); let statics = settings.core.statics ? ScratchSlide.mk_statics(~settings, editor, Builtins.ctx_init) @@ -440,7 +442,6 @@ let locked = ~target_id, ~footer, ~test_results=ModelResult.test_results(result), - ~statics=CachedStatics.empty_statics, editor, ); }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 5c53f2dd6e..30eef1e4e1 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -32,7 +32,7 @@ module Deco = let caret = (z: Zipper.t): list(Node.t) => /* Projectors can override adjacent carets */ - switch (ProjectorView.caret(z, M.syntax_map)) { + switch (ProjectorView.caret(z, M.syntax_map, M.statics.info_map)) { | Some(caret) => caret | None => base_caret(z) }; diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 550b805ffd..5a7731f3e6 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -59,15 +59,15 @@ let view = ) => { Cell.editor_view( ~selected=pos == this_pos, - ~statics={ - term: di.term, - info_map: di.info_map, - error_ids: - Statics.Map.error_ids( - editor.state.meta.projected.term_ranges, - di.info_map, - ), - }, + // ~statics={ + // term: di.term, + // info_map: di.info_map, + // error_ids: + // Statics.Map.error_ids( + // editor.state.meta.projected.term_ranges, + // di.info_map, + // ), + // }, ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 5ec0f74dd8..65f0e57b14 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -75,11 +75,11 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => let main_view = ( ~inject: UpdateAction.t => Ui_effect.t(unit), - {settings, editors, explainThisModel, results, statics, ui_state, _}: Model.t, + {settings, editors, explainThisModel, results, ui_state, _}: Model.t, ) => { let editor = Editors.get_editor(editors); - let statics = Editors.lookup_statics(~settings, ~statics, editors); - let cursor_info = Indicated.ci_of(editor.state.zipper, statics.info_map); + let info_map = editor.state.meta.statics.info_map; + let cursor_info = Indicated.ci_of(editor.state.zipper, info_map); let top_bar = div( ~attrs=[Attr.id("top-bar")], @@ -112,7 +112,6 @@ let main_view = ~highlights, ~results, ~result_key, - ~statics, editor, ); | Documentation(name, _) => @@ -129,7 +128,6 @@ let main_view = ~highlights, ~results, ~result_key, - ~statics, editor, ); | Exercises(_, _, exercise) => diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index e7f48d500c..7d53d07ff8 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -33,10 +33,10 @@ let backing_deco = ( ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~syntax, + ~info, p: Projector.t, ) => - switch (Projector.shape(p, syntax)) { + switch (Projector.shape(p, info)) { | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) | Block(_) => div([]) }; @@ -46,7 +46,7 @@ let view_inner = ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~status: option(Projector.status), - ~syntax, + ~info: info, p: Projector.t, view: Node.t, ) => @@ -65,7 +65,7 @@ let view_inner = ], [view], ), - backing_deco(~font_metrics, ~measurement, ~syntax, p), + backing_deco(~font_metrics, ~measurement, ~info, p), ], ); @@ -83,7 +83,8 @@ let view_setup = : option(Node.t) => { let* p = Projector.Map.find(id, ps); let* syntax = Id.Map.find_opt(id, syntax_map); - let* info = Id.Map.find_opt(id, info_map); + let ci = Id.Map.find_opt(id, info_map); + let info = {ci, syntax, status}; let+ measurement = Measured.find_by_id(id, measured); let (module P) = to_module(p); let inject = a => handle(id, a) |> inject; @@ -91,18 +92,12 @@ let view_setup = ~font_metrics, ~measurement, ~status, - ~syntax, + ~info, p, - P.view(~status, ~syntax, ~info, ~inject), + P.view(~info, ~inject), ); }; -let status = (z: Zipper.t) => - switch (Indicated.piece(z)) { - | Some((p, d, _)) => Some((Piece.id(p), Projector.Indicated(d))) - | None => None - }; - let view_all = ( z: Zipper.t, @@ -123,7 +118,7 @@ let view_all = ~inject, ~font_metrics, ~status= - switch (status(z)) { + switch (Projector.status_and_id(z)) { | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) | _ => None }, @@ -159,14 +154,18 @@ let id = (editor: Editor.t) => { }; }; -let shape_from_map = (z, syntax_map): option(shape) => { +let shape_from_map = (z, syntax_map, info_map): option(shape) => { let* id = Indicated.index(z); let* syntax = Id.Map.find_opt(id, syntax_map); - shape(z, syntax); + let ci = Id.Map.find_opt(id, info_map); + let status = Projector.status(z); + let info = {syntax, status, ci}; + shape(z, info); }; -let caret = (z: Zipper.t, syntax_map): option(list(Node.t)) => - switch (shape_from_map(z, syntax_map)) { +let caret = + (z: Zipper.t, syntax_map, info_map: Statics.Map.t): option(list(Node.t)) => + switch (shape_from_map(z, syntax_map, info_map)) { | None => None | Some(Inline(_)) => None | Some(Block(_)) => Some([]) diff --git a/src/haz3lweb/view/ScratchMode.re b/src/haz3lweb/view/ScratchMode.re index 97e983f6f4..9e4b3a4657 100644 --- a/src/haz3lweb/view/ScratchMode.re +++ b/src/haz3lweb/view/ScratchMode.re @@ -10,7 +10,6 @@ let view = ~highlights, ~results: ModelResults.t, ~result_key, - ~statics: CachedStatics.statics, editor: Editor.t, ) => { let result = ModelResults.lookup(results, result_key); @@ -36,7 +35,6 @@ let view = ~ui_state, ~settings, ~target_id, - ~statics, ~test_results, ~footer?, ~highlights, diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re index 5452ba291f..deba9a64a7 100644 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ b/src/haz3lweb/view/assistant/UpdateAssistant.re @@ -13,12 +13,13 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { let reset_buffer = (model: Model.t) => { let ed = model.editors |> Editors.get_editor; let z = ed.state.zipper; + let settings = model.settings.core; switch (z.selection.mode) { | Buffer(_) => - switch (Perform.go_z(~settings=model.settings.core, Destruct(Left), z)) { + switch (Perform.go_z(~settings, Destruct(Left), z)) { | Error(_) => model | Ok(z) => - let ed = Editor.new_state(Destruct(Left), z, ed); + let ed = Editor.new_state(~settings, Destruct(Left), z, ed); //TODO(andrew): fix double action {...model, editors: Editors.put_editor(ed, model.editors)}; } @@ -43,7 +44,7 @@ let apply = switch (TyDi.set_buffer(~settings=settings.core, ~ctx=ctx_init, z)) { | None => Ok(model) | Some(z) => - let ed = Editor.new_state(Pick_up, z, editor); + let ed = Editor.new_state(~settings=settings.core, Pick_up, z, editor); //TODO: add correct action to history (Pick_up is wrong) let editors = Editors.put_editor(ed, model.editors); Ok({...model, editors}); From 1d7193115490518c3bb7840fafbfe1f87d1d8d3c Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 17:57:23 -0400 Subject: [PATCH 085/168] new statics pathway working fairly cleanly for scratch mode. exercises has broken statics --- src/haz3lcore/assistant/TyDi.re | 16 +-- src/haz3lcore/prog/CachedStatics.re | 36 ----- src/haz3lcore/prog/Interface.re | 48 ------- src/haz3lcore/statics/Statics.re | 27 ++-- src/haz3lcore/zipper/Editor.re | 80 ++++++----- src/haz3lcore/zipper/action/Action.re | 10 +- src/haz3lcore/zipper/action/Perform.re | 15 +-- src/haz3lschool/Exercise.re | 81 ++++------- src/haz3lweb/DebugConsole.re | 11 +- src/haz3lweb/Editors.re | 48 +------ src/haz3lweb/Model.re | 14 +- src/haz3lweb/ScratchSlide.re | 10 -- src/haz3lweb/Update.re | 72 ++++------ src/haz3lweb/UpdateAction.re | 3 +- src/haz3lweb/view/Cell.re | 61 +++------ src/haz3lweb/view/Deco.re | 126 ++++++++++++------ src/haz3lweb/view/ExplainThis.re | 17 ++- .../view/assistant/UpdateAssistant.re | 5 +- test/Test_Elaboration.re | 2 +- 19 files changed, 256 insertions(+), 426 deletions(-) delete mode 100644 src/haz3lcore/prog/CachedStatics.re diff --git a/src/haz3lcore/assistant/TyDi.re b/src/haz3lcore/assistant/TyDi.re index 0832e76075..1118fc115f 100644 --- a/src/haz3lcore/assistant/TyDi.re +++ b/src/haz3lcore/assistant/TyDi.re @@ -67,17 +67,6 @@ let suffix_of = (candidate: Token.t, current: Token.t): option(Token.t) => { candidate_suffix == "" ? None : Some(candidate_suffix); }; -/* PERF: This is quite expensive */ -let z_to_ci = (~settings: CoreSettings.t, ~ctx: Ctx.t, z: Zipper.t) => { - let map = - z - |> MakeTerm.from_zip_for_sem - |> fst - |> Interface.Statics.mk_map_ctx(settings, ctx); - let* index = Indicated.index(z); - Id.Map.find_opt(index, map); -}; - /* Returns the text content of the suggestion buffer */ let get_buffer = (z: Zipper.t): option(Token.t) => switch (z.selection.mode, z.selection.content) { @@ -87,9 +76,10 @@ let get_buffer = (z: Zipper.t): option(Token.t) => }; /* Populates the suggestion buffer with a type-directed suggestion */ -let set_buffer = (~settings, ~ctx: Ctx.t, z: Zipper.t): option(Zipper.t) => { +let set_buffer = (~info_map: Statics.Map.t, z: Zipper.t): option(Zipper.t) => { let* tok_to_left = token_to_left(z); - let* ci = z_to_ci(~settings, ~ctx, z); + let* index = Indicated.index(z); + let* ci = Id.Map.find_opt(index, info_map); let suggestions = suggest(ci, z); let suggestions = suggestions diff --git a/src/haz3lcore/prog/CachedStatics.re b/src/haz3lcore/prog/CachedStatics.re deleted file mode 100644 index 1eec00443e..0000000000 --- a/src/haz3lcore/prog/CachedStatics.re +++ /dev/null @@ -1,36 +0,0 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; - -[@deriving (show({with_path: false}), sexp, yojson)] -type statics = { - term: Term.UExp.t, - info_map: Statics.Map.t, - error_ids: list(Id.t), -}; - -let empty_statics: statics = { - term: Term.UExp.{ids: [Id.invalid], term: Triv}, - info_map: Id.Map.empty, - error_ids: [], -}; - -module Key = { - include String; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = string; -}; - -module M = Util.MapUtil.Make(Key); -include M; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = M.t(statics); - -let mk = (ds: list((Key.t, statics))): t => - ds |> List.to_seq |> of_seq |> map(Fun.id); - -let lookup = (results: t, key: Key.t) => - switch (find_opt(key, results)) { - | None => empty_statics - | Some(statics) => statics - }; diff --git a/src/haz3lcore/prog/Interface.re b/src/haz3lcore/prog/Interface.re index 91d7237e06..a835eed873 100644 --- a/src/haz3lcore/prog/Interface.re +++ b/src/haz3lcore/prog/Interface.re @@ -1,37 +1,3 @@ -module Statics = { - let mk_map' = - Core.Memo.general(~cache_size_bound=1000, e => { - Statics.uexp_to_info_map( - ~ctx=Builtins.ctx_init, - ~ancestors=[], - e, - Id.Map.empty, - ) - |> snd - }); - let mk_map = (core: CoreSettings.t, exp) => - core.statics ? mk_map'(exp) : Id.Map.empty; - - let mk_map_and_info_ctx = - Core.Memo.general(~cache_size_bound=1000, (ctx, e) => { - Statics.uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) - }); - let mk_map_and_info_ctx = (core: CoreSettings.t, ctx, exp) => - core.statics - ? { - let (info, map) = mk_map_and_info_ctx(ctx, exp); - (Some(info), map); - } - : (None, Id.Map.empty); - - let mk_map_ctx = - Core.Memo.general(~cache_size_bound=1000, (ctx, e) => { - Statics.uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) |> snd - }); - let mk_map_ctx = (core: CoreSettings.t, ctx, exp) => - core.statics ? mk_map_ctx(ctx, exp) : Id.Map.empty; -}; - let dh_err = (error: string): DHExp.t => BoundVar(error); let elaborate = @@ -66,17 +32,3 @@ let evaluate = | (state, result) => ResultOk({result, state}) } }; - -let eval_z = - ( - ~settings: CoreSettings.t, - ~ctx_init: Ctx.t, - ~env_init: Environment.t, - z: Zipper.t, - ) - : ProgramResult.t => { - let (term, _) = MakeTerm.from_zip_for_sem(z); - let info_map = Statics.mk_map_ctx(settings, ctx_init, term); - let d = elaborate(~settings, info_map, term); - evaluate(~settings, ~env=env_init, d); -}; diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index ffeb60104d..f7d44274d6 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -36,22 +36,12 @@ module Map = { [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(Info.t); - let error_ids = (term_ranges: TermRanges.t, info_map: t): list(Id.t) => + let error_ids = (info_map: t): list(Id.t) => Id.Map.fold( (id, info, acc) => - /* Because of artefacts in Maketerm ID handling, - * there are be situations where ids appear in the - * info_map which do not occur in term_ranges. These - * ids should be purely duplicative, so skipping them - * when iterating over the info_map should have no - * effect, beyond supressing the resulting Not_found exs */ - switch (Id.Map.find_opt(id, term_ranges)) { - | Some(_) when Info.is_error(info) && id == Info.id_of(info) => [ - id, - ...acc, - ] - | _ => acc - }, + /* Second clause is to eliminate non-representative ids, + * which will not be found in the measurements map */ + Info.is_error(info) && id == Info.id_of(info) ? [id, ...acc] : acc, info_map, [], ); @@ -913,6 +903,15 @@ and variant_to_info_map = }; }; +let mk = + Core.Memo.general(~cache_size_bound=1000, (ctx, e) => { + uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) |> snd + }); +let mk = (core: CoreSettings.t, ctx, exp) => { + print_endline("RETICULATING STATICS"); //TODO(andrew): rm + core.statics ? mk(ctx, exp) : Id.Map.empty; +}; + let collect_errors = (map: Map.t): list((Id.t, Info.error)) => Id.Map.fold( (id, info: Info.t, acc) => diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index c726f9ab1d..bae82c91ec 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -2,6 +2,29 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Util; +module CachedStatics = { + type t = { + term: Term.UExp.t, + info_map: Statics.Map.t, + error_ids: list(Id.t), + }; + + let empty: t = { + term: Term.UExp.{ids: [Id.invalid], term: Triv}, + info_map: Id.Map.empty, + error_ids: [], + }; + + let mk = (~settings: CoreSettings.t, z: Zipper.t): t => { + //TODO(andrew): allow pass-in of init ctx + let ctx_init = Builtins.ctx_init; + let term = MakeTerm.from_zip_for_sem(z) |> fst; + let info_map = Statics.mk(settings, ctx_init, term); + let error_ids = Statics.Map.error_ids(info_map); + {term, info_map, error_ids}; + }; +}; + module Meta = { /* Derived data for projected zipper */ type projected = { @@ -17,12 +40,10 @@ module Meta = { syntax_map: Id.Map.t(Piece.t), }; - type statics = CachedStatics.statics; - type t = { col_target: int, touched: Touched.t, - statics, + statics: CachedStatics.t, projected, }; @@ -43,15 +64,13 @@ module Meta = { }; }; + let mk_statics = (~settings: CoreSettings.t, z: Zipper.t) => + settings.statics ? CachedStatics.mk(~settings, z) : CachedStatics.empty; + let init = (~settings: CoreSettings.t, z: Zipper.t) => { - //TODO(andrew): allow pass-in of init ctx - //TODO(andrew): cleanup - let ctx_init = Builtins.ctx_init; - let term = MakeTerm.from_zip_for_sem(z) |> fst; - let info_map = Interface.Statics.mk_map_ctx(settings, ctx_init, term); - let projected = Projector.Project.go(z, info_map) |> init_projected; - let error_ids = Statics.Map.error_ids(projected.term_ranges, info_map); - let statics = CachedStatics.{term, info_map, error_ids}; + let statics = mk_statics(~settings, z); + let projected = + Projector.Project.go(z, statics.info_map) |> init_projected; {col_target: 0, touched: Touched.empty, statics, projected}; }; @@ -94,6 +113,21 @@ module Meta = { }; }; + let next_statics = + ( + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + old_statics: CachedStatics.t, + ) => + if (!settings.statics) { + CachedStatics.empty; + } else if (!Action.is_edit(a)) { + old_statics; + } else { + CachedStatics.mk(~settings, z); + }; + let next = ( ~effects: list(Effect.t)=[], @@ -110,34 +144,14 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col }; - //TODO(andrew): cleanup - let (term, info_map) = - switch (Action.is_edit(a)) { - | false => (meta.statics.term, meta.statics.info_map) - | _ => - //TODO(andrew): allow pass-in of init ctx - let ctx_init = Builtins.ctx_init; - let term = MakeTerm.from_zip_for_sem(z) |> fst; - let info_map = Interface.Statics.mk_map_ctx(settings, ctx_init, term); - (term, info_map); - }; - let z_projected = Projector.Project.go(z, info_map); + let statics = next_statics(~settings, a, z, meta.statics); + let z_projected = Projector.Project.go(z, statics.info_map); let projected = switch (Action.is_edit(a)) { - //TODO(andrew): reenable - //TODO: andrew figure out why core desyncs from view on measure length.. prob use diff statics | false => {...meta.projected, z: z_projected.z} | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; - let statics = - switch (Action.is_edit(a)) { - | false => meta.statics - | _ => - let error_ids = - Statics.Map.error_ids(projected.term_ranges, info_map); - CachedStatics.{term, info_map, error_ids}; - }; {touched, col_target, projected, statics}; }; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 9a5607e498..a7a05024a7 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -56,6 +56,7 @@ type project = [@deriving (show({with_path: false}), sexp, yojson)] type t = + | RecalcStatics /* Could refactor to SetInitCtx(ctx) */ | Project(project) | Move(move) | MoveToNextHole(Direction.t) @@ -87,9 +88,16 @@ module Result = { let is_edit: t => bool = fun + | RecalcStatics => true | Project(_) => true //TODO(andrew): revisit | Insert(_) | Destruct(_) | Pick_up | Put_down => true - | _ => false; + | Move(_) + | MoveToNextHole(_) + | Jump(_) + | Select(_) + | Unselect(_) + | RotateBackpack + | MoveToBackpackTarget(_) => false; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 6a592fb953..1d5e7c19a0 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -3,6 +3,7 @@ open Zipper; let is_write_action = (a: Action.t) => { switch (a) { + | RecalcStatics | Project(_) => false //TODO(andrew): revisit | Move(_) | MoveToNextHole(_) @@ -46,12 +47,14 @@ let go_z = }; switch (a) { + | RecalcStatics => + print_endline("RecalcStatics action called"); + Ok(z); | Project(a) => ProjectorPerform.go( Move.jump_to_id, Move.primary, a, - // statics.info_map, meta.projected.syntax_map, z, ) @@ -64,11 +67,7 @@ let go_z = open OptUtil.Syntax; let idx = Indicated.index(z); - let (term, _) = - Util.TimeUtil.measure_time("Perform.go_z => MakeTerm.from_zip", true, () => - MakeTerm.from_zip_for_view(z) - ); - let statics = Interface.Statics.mk_map(settings, term); + let statics = meta.statics.info_map; ( switch (jump_target) { @@ -106,9 +105,7 @@ let go_z = if (!tile_is_term) { select_term_current(z); } else { - //PERF: this is expensive - let (term, _) = MakeTerm.from_zip_for_view(z); - let statics = Interface.Statics.mk_map(settings, term); + let statics = meta.statics.info_map; let target = switch ( Indicated.index(z) diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 90e50bcc7b..7d901521b4 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -559,17 +559,6 @@ module F = (ExerciseEnv: ExerciseEnv) => { // # Stitching - module TermItem = { - type t = { - term: TermBase.UExp.t, - term_ranges: TermRanges.t, - }; - }; - - module StaticsItem = { - type t = CachedStatics.statics; - }; - type stitched('a) = { test_validation: 'a, // prelude + correct_impl + your_tests user_impl: 'a, // prelude + your_impl @@ -591,11 +580,6 @@ module F = (ExerciseEnv: ExerciseEnv) => { ids: [Id.mk()], }; - let wrap = (term, editor: Editor.t): TermItem.t => { - term, - term_ranges: editor.state.meta.projected.term_ranges, - }; - let term_of = (editor: Editor.t): Term.UExp.t => MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; @@ -605,7 +589,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { term_of(ed3), ); - let stitch_term = ({eds, _}: state): stitched(TermItem.t) => { + let stitch_term = ({eds, _}: state): stitched(TermBase.UExp.t) => { let instructor = stitch3(eds.prelude, eds.correct_impl, eds.hidden_tests.tests); let user_impl_term = { @@ -622,24 +606,24 @@ module F = (ExerciseEnv: ExerciseEnv) => { let hidden_tests_term = EditorUtil.append_exp(user_impl_term, term_of(eds.hidden_tests.tests)); { - test_validation: wrap(test_validation_term, eds.your_tests.tests), - user_impl: wrap(user_impl_term, eds.your_impl), - user_tests: wrap(user_tests_term, eds.your_tests.tests), + test_validation: test_validation_term, + user_impl: user_impl_term, + user_tests: user_tests_term, // instructor works here as long as you don't shadow anything in the prelude - prelude: wrap(instructor, eds.prelude), - instructor: wrap(instructor, eds.correct_impl), + prelude: instructor, + instructor, hidden_bugs: List.map( - (t): TermItem.t => - wrap(stitch3(eds.prelude, t.impl, eds.your_tests.tests), t.impl), + (t): TermBase.UExp.t => + stitch3(eds.prelude, t.impl, eds.your_tests.tests), eds.hidden_bugs, ), - hidden_tests: wrap(hidden_tests_term, eds.hidden_tests.tests), + hidden_tests: hidden_tests_term, }; }; let stitch_term = Core.Memo.general(stitch_term); - type stitched_statics = stitched(StaticsItem.t); + type stitched_statics = stitched(Editor.CachedStatics.t); /* Multiple stitchings are needed for each exercise (see comments in the stitched type above) @@ -647,14 +631,12 @@ module F = (ExerciseEnv: ExerciseEnv) => { Stitching is necessary to concatenate terms from different editors, which are then typechecked. */ let stitch_static = - (settings: CoreSettings.t, t: stitched(TermItem.t)): stitched_statics => { - let mk = ({term, term_ranges, _}: TermItem.t): StaticsItem.t => { - let info_map = Interface.Statics.mk_map(settings, term); - { - term, - error_ids: Statics.Map.error_ids(term_ranges, info_map), - info_map, - }; + (settings: CoreSettings.t, t: stitched(TermBase.UExp.t)) + : stitched_statics => { + let mk = (term: TermBase.UExp.t): Editor.CachedStatics.t => { + //NOTE: this is expensive and _almost_ redundant to the statics in Editor + let info_map = Statics.mk(settings, Builtins.ctx_init, term); + {term, error_ids: Statics.Map.error_ids(info_map), info_map}; }; let instructor = mk(t.instructor); { @@ -671,7 +653,8 @@ module F = (ExerciseEnv: ExerciseEnv) => { let stitch_static = Core.Memo.general(stitch_static); let statics_of_stiched = - (state: state, s: stitched(StaticsItem.t)): StaticsItem.t => + (state: state, s: stitched(Editor.CachedStatics.t)) + : Editor.CachedStatics.t => switch (state.pos) { | Prelude => s.prelude | CorrectImpl => s.instructor @@ -682,7 +665,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { | HiddenTests => s.hidden_tests }; - let statics_of = (~settings, exercise: state): StaticsItem.t => + let statics_of = (~settings, exercise: state): Editor.CachedStatics.t => exercise |> stitch_term |> stitch_static(settings) @@ -720,7 +703,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { hidden_tests, } = stitch_static(settings, stitch_term(state)); - let elab = (s: CachedStatics.statics) => + let elab = (s: Editor.CachedStatics.t) => Interface.elaborate(~settings, s.info_map, s.term); [ (test_validation_key, elab(test_validation)), @@ -731,30 +714,12 @@ module F = (ExerciseEnv: ExerciseEnv) => { ] @ ( hidden_bugs - |> List.mapi((n, hidden_bug: StaticsItem.t) => + |> List.mapi((n, hidden_bug: Editor.CachedStatics.t) => (hidden_bugs_key(n), elab(hidden_bug)) ) ); }; - let mk_statics = - (settings: CoreSettings.t, state: state) - : list((ModelResults.key, StaticsItem.t)) => { - let stitched = stitch_static(settings, stitch_term(state)); - [ - (prelude_key, stitched.prelude), - (test_validation_key, stitched.test_validation), - (user_impl_key, stitched.user_impl), - (user_tests_key, stitched.user_tests), - (instructor_key, stitched.instructor), - (hidden_tests_key, stitched.hidden_tests), - ] - @ List.mapi( - (n, hidden_bug: StaticsItem.t) => (hidden_bugs_key(n), hidden_bug), - stitched.hidden_bugs, - ); - }; - module DynamicsItem = { type t = { term: TermBase.UExp.t, @@ -769,7 +734,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { info_map: Id.Map.empty, result: NoElab, }; - let statics_only = ({term, info_map, _}: StaticsItem.t): t => { + let statics_only = ({term, info_map, _}: Editor.CachedStatics.t): t => { {term, info_map, result: NoElab}; }; }; @@ -836,7 +801,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { }; let hidden_bugs = List.mapi( - (n, statics_item: StaticsItem.t) => + (n, statics_item: Editor.CachedStatics.t) => DynamicsItem.{ term: statics_item.term, info_map: statics_item.info_map, diff --git a/src/haz3lweb/DebugConsole.re b/src/haz3lweb/DebugConsole.re index 4e825a27a6..1216edba88 100644 --- a/src/haz3lweb/DebugConsole.re +++ b/src/haz3lweb/DebugConsole.re @@ -17,18 +17,20 @@ let print = ({settings, editors, _}: Model.t, key: string): unit => { | "F4" => z |> term - |> Interface.Statics.mk_map_ctx(settings.core, ctx_init) + |> Statics.mk(settings.core, ctx_init) |> Statics.Map.show |> print | "F5" => let env_init = Editors.get_env_init(~settings, editors); - Interface.eval_z(~settings=settings.core, ~env_init, ~ctx_init, z) + let (term, _) = MakeTerm.from_zip_for_sem(z); + let info_map = Statics.mk(settings.core, ctx_init, term); + let d = Interface.elaborate(~settings=settings.core, info_map, term); + Interface.evaluate(~settings=settings.core, ~env=env_init, d) |> ProgramResult.show |> print; | "F6" => let index = Indicated.index(z); - let map = - z |> term |> Interface.Statics.mk_map_ctx(settings.core, ctx_init); + let map = z |> term |> Statics.mk(settings.core, ctx_init); switch (index) { | Some(index) => switch (Haz3lcore.Id.Map.find_opt(index, map)) { @@ -37,7 +39,6 @@ let print = ({settings, editors, _}: Model.t, key: string): unit => { } | None => print("DEBUG: No indicated index") }; - | _ => print("DEBUG: No action for key: " ++ key) }; }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 59a9a1c5c6..a9c4af142a 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -57,39 +57,6 @@ let get_env_init = (~settings as _: Settings.t, editors: t): Environment.t => | Documentation(_) => Builtins.env_init }; -let mk_statics = (~settings: Settings.t, editors: t): CachedStatics.t => { - let editor = get_editor(editors); - let ctx_init = get_ctx_init(~settings, editors); - switch (editors) { - | _ when !settings.core.statics => CachedStatics.mk([]) - | Scratch(idx, _) => - let key = ScratchSlide.scratch_key(string_of_int(idx)); - [(key, ScratchSlide.mk_statics(~settings, editor, ctx_init))] - |> CachedStatics.mk; - | Documentation(name, _) => - let key = ScratchSlide.scratch_key(name); - [(key, ScratchSlide.mk_statics(~settings, editor, ctx_init))] - |> CachedStatics.mk; - | Exercises(_, _, exercise) => - Exercise.mk_statics(settings.core, exercise) |> CachedStatics.mk - }; -}; - -let lookup_statics = - (~settings: Settings.t, ~statics, editors: t): CachedStatics.statics => - switch (editors) { - | _ when !settings.core.statics => CachedStatics.empty_statics - | Scratch(idx, _) => - let key = ScratchSlide.scratch_key(string_of_int(idx)); - CachedStatics.lookup(statics, key); - | Documentation(name, _) => - let key = ScratchSlide.scratch_key(name); - CachedStatics.lookup(statics, key); - | Exercises(_, _, exercise) => - let key = Exercise.key_for_statics(exercise); - CachedStatics.lookup(statics, key); - }; - /* Each mode (e.g. Scratch, School) requires elaborating on some number of expressions that are spliced together from the editors @@ -98,23 +65,20 @@ let lookup_statics = Used in the Update module */ let get_spliced_elabs = - (~settings: Settings.t, statics, editors: t) + (~settings: CoreSettings.t, editors: t) : list((ModelResults.key, DHExp.t)) => switch (editors) { | Scratch(idx, _) => let key = ScratchSlide.scratch_key(idx |> string_of_int); - let CachedStatics.{term, info_map, _} = - lookup_statics(~settings, ~statics, editors); - let d = Interface.elaborate(~settings=settings.core, info_map, term); + let statics = get_editor(editors).state.meta.statics; + let d = Interface.elaborate(~settings, statics.info_map, statics.term); [(key, d)]; | Documentation(name, _) => let key = ScratchSlide.scratch_key(name); - let CachedStatics.{term, info_map, _} = - lookup_statics(~settings, ~statics, editors); - let d = Interface.elaborate(~settings=settings.core, info_map, term); + let statics = get_editor(editors).state.meta.statics; + let d = Interface.elaborate(~settings, statics.info_map, statics.term); [(key, d)]; - | Exercises(_, _, exercise) => - Exercise.spliced_elabs(settings.core, exercise) + | Exercises(_, _, exercise) => Exercise.spliced_elabs(settings, exercise) }; let set_instructor_mode = (editors: t, instructor_mode: bool): t => diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index 7674d54b4b..fa384d07de 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -37,24 +37,21 @@ type t = { editors: Editors.t, settings: Settings.t, results: ModelResults.t, - statics: CachedStatics.t, explainThisModel: ExplainThisModel.t, ui_state, }; let cutoff = (===); -let mk = (editors, results, statics) => { +let mk = (editors, results) => { editors, settings: Init.startup.settings, results, - statics, explainThisModel: ExplainThisModel.init, ui_state: ui_state_init, }; -let blank = - mk(Editors.Scratch(0, []), ModelResults.empty, CachedStatics.empty); +let blank = mk(Editors.Scratch(0, []), ModelResults.empty); let load_editors = (~settings, ~mode: Settings.mode, ~instructor_mode: bool) @@ -97,8 +94,7 @@ let load = (init_model: t): t => { ~instructor_mode=settings.instructor_mode, ); let ui_state = init_model.ui_state; - let statics = Editors.mk_statics(~settings, editors); - {editors, settings, results, statics, explainThisModel, ui_state}; + {editors, settings, results, explainThisModel, ui_state}; }; let save = ({editors, settings, explainThisModel, results, _}: t) => { @@ -131,7 +127,3 @@ let reset = (model: t): t => { }, }; }; - -let current_statics = - ({settings, editors, statics, _}: t): CachedStatics.statics => - Editors.lookup_statics(~settings, ~statics, editors); diff --git a/src/haz3lweb/ScratchSlide.re b/src/haz3lweb/ScratchSlide.re index 6d05b1e5af..554beab53d 100644 --- a/src/haz3lweb/ScratchSlide.re +++ b/src/haz3lweb/ScratchSlide.re @@ -50,13 +50,3 @@ let import = (data: string, ~settings: CoreSettings.t): state => { let export_init = (state: state): string => { state |> persist |> show_persistent_state; }; - -let mk_statics = - (~settings: Settings.t, editor: Editor.t, ctx_init: Ctx.t) - : CachedStatics.statics => { - let term = MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; - let info_map = Interface.Statics.mk_map_ctx(settings.core, ctx_init, term); - let error_ids = - Statics.Map.error_ids(editor.state.meta.projected.term_ranges, info_map); - {term, info_map, error_ids}; -}; diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 9ec45ae820..55cd91ed36 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -186,11 +186,7 @@ let update_settings = let schedule_evaluation = (~schedule_action, model: Model.t): unit => if (model.settings.core.dynamics) { let elabs = - Editors.get_spliced_elabs( - ~settings=model.settings, - model.statics, - model.editors, - ); + Editors.get_spliced_elabs(~settings=model.settings.core, model.editors); let eval_rs = ModelResults.to_evaluate(model.results, elabs); if (!ModelResults.is_empty(eval_rs)) { schedule_action(UpdateResult(eval_rs)); @@ -216,45 +212,6 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; -//TODO(andrew): cleanup -// let update_projectors = (model: Model.t): Model.t => { -// let statics = Model.current_statics(model); -// //let editor = Editors.get_editor(model.editors); -// //let syntax_map = editor.state.meta.projected.syntax_map; -// let editors = -// Editors.map_projectors( -// model.editors, -// (id, p) => { -// //let syntax = Id.Map.find(id, syntax_map); -// let (module P) = Projector.to_module(p); -// let info = Id.Map.find_opt(id, statics.info_map); -// P.auto_update({info: info}); -// }, -// ); -// {...model, editors}; -// }; - -let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { - let update_statics = is_edit(update) || reevaluate_post_update(update); - let update_dynamics = reevaluate_post_update(update); - let m = - update_statics || update_dynamics && m.settings.core.statics - ? { - print_endline("UPDATING STATICS. TODO(andrew): disable this!!!!!"); - //TODO(andrew): cleanup - let statics = Editors.mk_statics(~settings=m.settings, m.editors); - //update_projectors({...m, statics}); - {...m, statics}; - } - : m; - if (update_dynamics && m.settings.core.dynamics) { - schedule_evaluation(~schedule_action, m); - m; - } else { - m; - }; -}; - let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => switch ( model.editors @@ -269,6 +226,33 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => Ok(model); }; +let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { + let update_dynamics = reevaluate_post_update(update); + let m = + if (update_dynamics + && ( + switch (update) { + //TODO(andrew): explain or make better + | PerformAction(_) => false + | _ => true + } + )) { + print_endline("update_cached_data: performing RecalcStatics"); + switch (perform_action(m, RecalcStatics)) { + | Ok(m) => m + | Error(_) => failwith("ERROR: RecalcStatics failed") + }; + } else { + m; + }; + if (update_dynamics && m.settings.core.dynamics) { + schedule_evaluation(~schedule_action, m); + m; + } else { + m; + }; +}; + let switch_scratch_slide = (~settings, editors: Editors.t, ~instructor_mode, idx: int) : option(Editors.t) => diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 276f304910..efbee42cbf 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -172,7 +172,6 @@ let reevaluate_post_update: t => bool = | Assist | Captions | SecondaryIcons - | Statics | ContextInspector | Benchmark | ExplainThis(_) @@ -185,6 +184,7 @@ let reevaluate_post_update: t => bool = ) => false | Elaborate + | Statics | Dynamics | InstructorMode | Mode(_) => true @@ -280,6 +280,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) => true + | RecalcStatics | Project(_) | Unselect(_) | Select(All) => false diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 5803d80a85..5c0ba340b6 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -107,53 +107,28 @@ let test_result_layer = let deco = ( ~inject, - ~font_metrics, - ~show_backpack_targets, + ~ui_state, ~selected, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), - { - state: - { - meta: - { - statics, - projected: - { - z, - term_ranges, - segment, - measured, - terms, - tiles, - syntax_map, - _, - }, - _, - }, - _, - }, - _, - }: Editor.t, + meta: Editor.Meta.t, ) => { module Deco = Deco.Deco({ - let map = measured; - let terms = terms; - let term_ranges = term_ranges; - let tiles = tiles; - let font_metrics = font_metrics; - let show_backpack_targets = show_backpack_targets; - let statics = statics; - let syntax_map = syntax_map; + let ui_state = ui_state; + let meta = meta; }); - let decos = - selected ? Deco.all(~inject, z, segment) : Deco.always(~inject, z); + let decos = selected ? Deco.all(~inject) : Deco.always(~inject); let decos = switch (test_results) { | None => decos | Some(test_results) => - decos @ test_result_layer(~font_metrics, ~measured, test_results) // TODO move into decos + decos + @ test_result_layer( + ~font_metrics=ui_state.font_metrics, + ~measured=meta.projected.measured, + test_results, + ) // TODO move into decos }; switch (highlights) { | Some(colorMap) => @@ -263,8 +238,7 @@ let footer = let editor_view = ( ~inject: UpdateAction.t => Ui_effect.t(unit), - ~ui_state as - {font_metrics, show_backpack_targets, mousedown, _}: Model.ui_state, + ~ui_state: Model.ui_state, ~settings: Settings.t, ~target_id: string, ~mousedown_updates: list(Update.t)=[], @@ -278,16 +252,16 @@ let editor_view = ~sort=Sort.root, editor: Editor.t, ) => { + let Model.{font_metrics, mousedown, _} = ui_state; let code_text_view = Code.view(~sort, ~font_metrics, ~settings, editor); let deco_view = deco( ~inject=a => inject(PerformAction(Project(a))), - ~font_metrics, - ~show_backpack_targets, + ~ui_state, ~selected, ~test_results, ~highlights, - editor, + editor.state.meta, ); let code_view = div( @@ -401,10 +375,7 @@ let locked = segment |> Zipper.unzip |> Editor.init(~settings=settings.core, ~read_only=true); - let statics = - settings.core.statics - ? ScratchSlide.mk_statics(~settings, editor, Builtins.ctx_init) - : CachedStatics.empty_statics; + let statics = editor.state.meta.statics; let elab = settings.core.elaborate || settings.core.dynamics ? Interface.elaborate( diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 30eef1e4e1..1d7c328ba0 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -2,25 +2,16 @@ open Virtual_dom.Vdom; open Util; open Haz3lcore; -module Deco = - ( - M: { - let font_metrics: FontMetrics.t; - let map: Measured.t; - let show_backpack_targets: bool; - let terms: TermMap.t; - let term_ranges: TermRanges.t; - let statics: CachedStatics.statics; - let tiles: TileMap.t; - let syntax_map: Id.Map.t(Piece.t); - }, - ) => { - let font_metrics = M.font_metrics; +module Deco = (M: { + let ui_state: Model.ui_state; + let meta: Editor.Meta.t; + }) => { + let font_metrics = M.ui_state.font_metrics; - let tile = id => Id.Map.find(id, M.tiles); + let tile = id => Id.Map.find(id, M.meta.projected.tiles); let base_caret = (z: Zipper.t): list(Node.t) => { - let origin = Zipper.caret_point(M.map, z); + let origin = Zipper.caret_point(M.meta.projected.measured, z); let shape = Zipper.caret_direction(z); let side = switch (Indicated.piece(z)) { @@ -32,7 +23,13 @@ module Deco = let caret = (z: Zipper.t): list(Node.t) => /* Projectors can override adjacent carets */ - switch (ProjectorView.caret(z, M.syntax_map, M.statics.info_map)) { + switch ( + ProjectorView.caret( + z, + M.meta.projected.syntax_map, + M.meta.statics.info_map, + ) + ) { | Some(caret) => caret | None => base_caret(z) }; @@ -56,7 +53,11 @@ module Deco = Some( sel_shard_svg( ~start_shape, - Measured.find_g(~msg="Deco.sel_of_piece", g, M.map), + Measured.find_g( + ~msg="Deco.sel_of_piece", + g, + M.meta.projected.measured, + ), p, ), ), @@ -66,7 +67,11 @@ module Deco = Some( sel_shard_svg( ~start_shape, - Measured.find_w(~msg="Deco.sel_of_piece", w, M.map), + Measured.find_w( + ~msg="Deco.sel_of_piece", + w, + M.meta.projected.measured, + ), p, ), ), @@ -81,7 +86,7 @@ module Deco = } and sel_of_tile = (~start_shape, t: Tile.t): list(option(shard_data)) => { let tile_shards = - Measured.find_shards(~msg="sel_of_tile", t, M.map) + Measured.find_shards(~msg="sel_of_tile", t, M.meta.projected.measured) |> List.filter(((i, _)) => List.mem(i, t.shards)) |> List.map(((index, m)) => { let token = List.nth(t.label, index); @@ -144,12 +149,25 @@ module Deco = }; let range: option((Measured.Point.t, Measured.Point.t)) = { // if (Piece.has_ends(p)) { - let id = Id.Map.find(Piece.id(p), M.terms) |> Term.rep_id; - switch (TermRanges.find_opt(id, M.term_ranges)) { + let id = + Id.Map.find(Piece.id(p), M.meta.projected.terms) |> Term.rep_id; + switch (TermRanges.find_opt(id, M.meta.projected.term_ranges)) { | None => None | Some((p_l, p_r)) => - let l = Measured.find_p(~msg="Deco.indicated", p_l, M.map).origin; - let r = Measured.find_p(~msg="Deco.indicated", p_r, M.map).last; + let l = + Measured.find_p( + ~msg="Deco.indicated", + p_l, + M.meta.projected.measured, + ). + origin; + let r = + Measured.find_p( + ~msg="Deco.indicated", + p_r, + M.meta.projected.measured, + ). + last; Some((l, r)); }; }; @@ -162,7 +180,7 @@ module Deco = | None => [] | Some(range) => let tiles = - Id.Map.find(Piece.id(p), M.terms) + Id.Map.find(Piece.id(p), M.meta.projected.terms) |> Term.ids /* NOTE(andrew): dark_ids were originally filtered here. * Leaving this comment in place in case issues in the @@ -173,12 +191,16 @@ module Deco = ( id, t.mold, - Measured.find_shards(~msg="Deco.indicated", t, M.map), + Measured.find_shards( + ~msg="Deco.indicated", + t, + M.meta.projected.measured, + ), ); }); PieceDec.indicated( ~font_metrics, - ~rows=M.map.rows, + ~rows=M.meta.projected.measured.rows, ~caret=(Piece.id(p), index), ~tiles, range, @@ -207,10 +229,20 @@ module Deco = switch (Siblings.neighbors((l, r))) { | (None, None) => failwith("impossible") | (_, Some(p)) => - let m = Measured.find_p(~msg="Deco.targets", p, M.map); + let m = + Measured.find_p( + ~msg="Deco.targets", + p, + M.meta.projected.measured, + ); Measured.{origin: m.origin, last: m.origin}; | (Some(p), _) => - let m = Measured.find_p(~msg="Deco.targets", p, M.map); + let m = + Measured.find_p( + ~msg="Deco.targets", + p, + M.meta.projected.measured, + ); Measured.{origin: m.last, last: m.last}; }; let profile = @@ -242,14 +274,14 @@ module Deco = [ BackpackView.view( ~font_metrics, - ~origin=Zipper.caret_point(M.map, z), + ~origin=Zipper.caret_point(M.meta.projected.measured, z), z, ), ]; }; let targets' = (backpack, seg) => { - M.show_backpack_targets && Backpack.restricted(backpack) + M.ui_state.show_backpack_targets && Backpack.restricted(backpack) ? targets(backpack, seg) : []; }; @@ -259,20 +291,23 @@ module Deco = deco: ((Measured.Point.t, Measured.Point.t, SvgUtil.Path.t)) => Node.t, ) => { - let (p_l, p_r) = TermRanges.find(id, M.term_ranges); - let l = Measured.find_p(~msg="Deco.term", p_l, M.map).origin; - let r = Measured.find_p(~msg="Deco.term", p_r, M.map).last; + let (p_l, p_r) = TermRanges.find(id, M.meta.projected.term_ranges); + let l = + Measured.find_p(~msg="Deco.term", p_l, M.meta.projected.measured). + origin; + let r = + Measured.find_p(~msg="Deco.term", p_r, M.meta.projected.measured).last; open SvgUtil.Path; let r_edge = ListUtil.range(~lo=l.row, r.row + 1) |> List.concat_map(i => { - let row = Measured.Rows.find(i, M.map.rows); + let row = Measured.Rows.find(i, M.meta.projected.measured.rows); [h(~x=i == r.row ? r.col : row.max_col), v_(~dy=1)]; }); let l_edge = ListUtil.range(~lo=l.row, r.row + 1) |> List.rev_map(i => { - let row = Measured.Rows.find(i, M.map.rows); + let row = Measured.Rows.find(i, M.meta.projected.measured.rows); [h(~x=i == l.row ? l.col : row.indent), v_(~dy=-1)]; }) |> List.concat; @@ -310,7 +345,7 @@ module Deco = }; let err_holes = () => - List.map(term_highlight(~clss=["err-hole"]), M.statics.error_ids); + List.map(term_highlight(~clss=["err-hole"]), M.meta.statics.error_ids); let indication_deco = (z: Zipper.t) => switch (ProjectorView.indicated_proj_z(z)) { @@ -327,19 +362,22 @@ module Deco = targets'(zipper.backpack, sel_seg), ]); - let always = (~inject, zipper: Zipper.t) => + let always = (~inject) => List.concat([ err_holes(), ProjectorView.view_all( - zipper, - ~syntax_map=M.syntax_map, - ~info_map=M.statics.info_map, + M.meta.projected.z, + ~syntax_map=M.meta.projected.syntax_map, + ~info_map=M.meta.statics.info_map, ~inject, ~font_metrics, - ~measured=M.map, + ~measured=M.meta.projected.measured, ), ]); - let all = (~inject, zipper, sel_seg) => - List.concat([active(zipper, sel_seg), always(~inject, zipper)]); + let all = (~inject) => + List.concat([ + active(M.meta.projected.z, M.meta.projected.segment), + always(~inject), + ]); }; diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index a61300c108..abb72d59ef 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -208,22 +208,21 @@ let expander_deco = ~docs: ExplainThisModel.t, ~settings: Settings.t, ~inject, - ~ui_state as {font_metrics, _}: Model.ui_state, + ~ui_state: Model.ui_state, ~options: list((ExplainThisForm.form_id, Segment.t)), ~group: ExplainThisForm.group, ~doc: ExplainThisForm.form, ) => { module Deco = Deco.Deco({ - let font_metrics = font_metrics; - let map = Measured.of_segment(doc.syntactic_form); - let show_backpack_targets = false; - let (_, terms) = MakeTerm.go(doc.syntactic_form); - let term_ranges = TermRanges.mk(doc.syntactic_form); - let tiles = TileMap.mk(doc.syntactic_form); - let statics = CachedStatics.empty_statics; - let syntax_map = Id.Map.empty; + let ui_state = ui_state; + let meta = + Editor.Meta.init( + ~settings=CoreSettings.off, + Zipper.unzip(doc.syntactic_form), + ); }); + let Model.{font_metrics, _} = ui_state; switch (doc.expandable_id, List.length(options)) { | (None, _) | (_, 0 | 1) => div([]) diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re index deba9a64a7..733339f3c3 100644 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ b/src/haz3lweb/view/assistant/UpdateAssistant.re @@ -16,6 +16,7 @@ let reset_buffer = (model: Model.t) => { let settings = model.settings.core; switch (z.selection.mode) { | Buffer(_) => + //TODO(andrew): make sure this is synced with statics properly switch (Perform.go_z(~settings, Destruct(Left), z)) { | Error(_) => model | Ok(z) => @@ -40,8 +41,8 @@ let apply = let z = editor.state.zipper; switch (update) { | Prompt(TyDi) => - let ctx_init = Editors.get_ctx_init(~settings, model.editors); - switch (TyDi.set_buffer(~settings=settings.core, ~ctx=ctx_init, z)) { + let info_map = editor.state.meta.statics.info_map; + switch (TyDi.set_buffer(~info_map, z)) { | None => Ok(model) | Some(z) => let ed = Editor.new_state(~settings=settings.core, Pick_up, z, editor); diff --git a/test/Test_Elaboration.re b/test/Test_Elaboration.re index d584492091..e7df7b59cd 100644 --- a/test/Test_Elaboration.re +++ b/test/Test_Elaboration.re @@ -19,7 +19,7 @@ let dhexp_typ = testable(Fmt.using(dhexp_print, Fmt.string), dhexp_eq); let ids = List.init(12, _ => Id.mk()); let id_at = x => x |> List.nth(ids); -let mk_map = CoreSettings.on |> Interface.Statics.mk_map; +let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); let dhexp_of_uexp = u => Elaborator.dhexp_of_uexp(mk_map(u), u, false); let alco_check = dhexp_typ |> Alcotest.check; From d1aae2b30269036af4e141ea6b4f1c710838347e Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 19:37:14 -0400 Subject: [PATCH 086/168] new statics works for exercise mode (hacky) --- src/haz3lschool/Exercise.re | 85 +++++++--------------- src/haz3lweb/view/Cell.re | 11 ++- src/haz3lweb/view/Code.re | 9 +-- src/haz3lweb/view/Deco.re | 30 +++++--- src/haz3lweb/view/ExerciseMode.re | 31 ++++---- src/haz3lweb/view/Page.re | 113 ++++++++++++++++++------------ 6 files changed, 138 insertions(+), 141 deletions(-) diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 7d901521b4..bef1a34958 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -652,25 +652,6 @@ module F = (ExerciseEnv: ExerciseEnv) => { let stitch_static = Core.Memo.general(stitch_static); - let statics_of_stiched = - (state: state, s: stitched(Editor.CachedStatics.t)) - : Editor.CachedStatics.t => - switch (state.pos) { - | Prelude => s.prelude - | CorrectImpl => s.instructor - | YourTestsValidation => s.test_validation - | YourTestsTesting => s.user_tests - | YourImpl => s.user_impl - | HiddenBugs(idx) => List.nth(s.hidden_bugs, idx) - | HiddenTests => s.hidden_tests - }; - - let statics_of = (~settings, exercise: state): Editor.CachedStatics.t => - exercise - |> stitch_term - |> stitch_static(settings) - |> statics_of_stiched(exercise); - let prelude_key = "prelude"; let test_validation_key = "test_validation"; let user_impl_key = "user_impl"; @@ -722,23 +703,28 @@ module F = (ExerciseEnv: ExerciseEnv) => { module DynamicsItem = { type t = { - term: TermBase.UExp.t, - info_map: Statics.Map.t, + statics: Editor.CachedStatics.t, result: ModelResult.t, }; - let empty: t = { - term: { - term: Tuple([]), - ids: [Id.mk()], - }, - info_map: Id.Map.empty, + let empty: t = {statics: Editor.CachedStatics.empty, result: NoElab}; + let statics_only = (statics: Editor.CachedStatics.t): t => { + statics, result: NoElab, }; - let statics_only = ({term, info_map, _}: Editor.CachedStatics.t): t => { - {term, info_map, result: NoElab}; - }; }; + let statics_of_stiched_dynamics = + (state: state, s: stitched(DynamicsItem.t)): Editor.CachedStatics.t => + switch (state.pos) { + | Prelude => s.prelude.statics + | CorrectImpl => s.instructor.statics + | YourTestsValidation => s.test_validation.statics + | YourTestsTesting => s.user_tests.statics + | YourImpl => s.user_impl.statics + | HiddenBugs(idx) => List.nth(s.hidden_bugs, idx).statics + | HiddenTests => s.hidden_tests.statics + }; + /* Given the evaluation results, collects the relevant information for producing dynamic feedback*/ @@ -769,50 +755,27 @@ module F = (ExerciseEnv: ExerciseEnv) => { let test_validation = DynamicsItem.{ - term: test_validation.term, - info_map: test_validation.info_map, + statics: test_validation, result: result_of(test_validation_key), }; let user_impl = - DynamicsItem.{ - term: user_impl.term, - info_map: user_impl.info_map, - result: result_of(user_impl_key), - }; + DynamicsItem.{statics: user_impl, result: result_of(user_impl_key)}; let user_tests = - DynamicsItem.{ - term: user_tests.term, - info_map: user_tests.info_map, - result: result_of(user_tests_key), - }; - let prelude = - DynamicsItem.{ - term: prelude.term, - info_map: prelude.info_map, - result: NoElab, - }; + DynamicsItem.{statics: user_tests, result: result_of(user_tests_key)}; + let prelude = DynamicsItem.{statics: prelude, result: NoElab}; let instructor = - DynamicsItem.{ - term: instructor.term, - info_map: instructor.info_map, - result: result_of(instructor_key), - }; + DynamicsItem.{statics: instructor, result: result_of(instructor_key)}; let hidden_bugs = List.mapi( - (n, statics_item: Editor.CachedStatics.t) => - DynamicsItem.{ - term: statics_item.term, - info_map: statics_item.info_map, - result: result_of(hidden_bugs_key(n)), - }, + (n, statics: Editor.CachedStatics.t) => + DynamicsItem.{statics, result: result_of(hidden_bugs_key(n))}, hidden_bugs, ); let hidden_tests = DynamicsItem.{ - term: hidden_tests.term, - info_map: hidden_tests.info_map, + statics: hidden_tests, result: result_of(hidden_tests_key), }; { diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 5c0ba340b6..553f6e8c14 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -250,10 +250,17 @@ let editor_view = ~highlights: option(ColorSteps.colorMap), ~overlayer: option(Node.t)=None, ~sort=Sort.root, + ~override_statics: option(Editor.CachedStatics.t)=?, editor: Editor.t, ) => { let Model.{font_metrics, mousedown, _} = ui_state; - let code_text_view = Code.view(~sort, ~font_metrics, ~settings, editor); + let meta = + /* For exercises modes */ + switch (override_statics) { + | None => editor.state.meta + | Some(statics) => {...editor.state.meta, statics} + }; + let code_text_view = Code.view(~sort, ~font_metrics, ~settings, meta); let deco_view = deco( ~inject=a => inject(PerformAction(Project(a))), @@ -261,7 +268,7 @@ let editor_view = ~selected, ~test_results, ~highlights, - editor.state.meta, + meta, ); let code_view = div( diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index dfd52efc5b..e48820bfaa 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -172,14 +172,7 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - { - state: - { - meta: {projected: {measured, buffer_ids, segment, holes, _}, _}, - _, - }, - _, - }: Editor.t, + {projected: {measured, buffer_ids, segment, holes, _}, _}: Editor.Meta.t, ) : Node.t => { module Text = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 1d7c328ba0..08909322d9 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -319,16 +319,28 @@ module Deco = (M: { (l, r, path) |> deco; }; - let term_highlight = (~clss: list(string), id: Id.t) => { - term_decoration(~id, ((origin, last, path)) => - DecUtil.code_svg_sized( - ~font_metrics, - ~measurement={origin, last}, - ~base_cls=clss, - path, + let term_highlight = (~clss: list(string), id: Id.t) => + try( + term_decoration(~id, ((origin, last, path)) => + DecUtil.code_svg_sized( + ~font_metrics, + ~measurement={origin, last}, + ~base_cls=clss, + path, + ) ) - ); - }; + ) { + | _ => + /* This is caused by the statics overloading for exercise mode. The overriding + * Exercise mode statics is calculated based on splicing together multiple + * editors; the way the splicings are designed, a given splicing might cover more + * than just the editor to which it's statics are being applied, so there may + * be error holes that don't occur in the editor. However, any errors that do + * occur in the editor will be represented, so this hack works for now */ + //TODO(andrew) + print_endline("WARNING: Deco.term_highlight: Not found"); + Node.div([]); + }; let color_highlights = (colorings: list((Id.t, string))) => { List.filter_map( diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 5a7731f3e6..281f51d630 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -23,16 +23,16 @@ let view = ~ui_state: Model.ui_state, ~settings: Settings.t, ~exercise, - ~results, + ~stitched_dynamics, ~highlights, ) => { let Exercise.{eds, pos} = exercise; - let stitched_dynamics = - Exercise.stitch_dynamic( - settings.core, - exercise, - settings.core.dynamics ? Some(results) : None, - ); + // let stitched_dynamics = + // Exercise.stitch_dynamic( + // settings.core, + // exercise, + // settings.core.dynamics ? Some(results) : None, + // ); let { test_validation, user_impl, @@ -59,15 +59,7 @@ let view = ) => { Cell.editor_view( ~selected=pos == this_pos, - // ~statics={ - // term: di.term, - // info_map: di.info_map, - // error_ids: - // Statics.Map.error_ids( - // editor.state.meta.projected.term_ranges, - // di.info_map, - // ), - // }, + ~override_statics=di.statics, ~inject, ~ui_state, ~mousedown_updates=[SwitchEditor(this_pos)], @@ -119,10 +111,13 @@ let view = let correct_impl_trailing_hole_ctx = Haz3lcore.Editor.trailing_hole_ctx( eds.correct_impl, - instructor.info_map, + instructor.statics.info_map, ); let prelude_trailing_hole_ctx = - Haz3lcore.Editor.trailing_hole_ctx(eds.prelude, prelude.info_map); + Haz3lcore.Editor.trailing_hole_ctx( + eds.prelude, + prelude.statics.info_map, + ); switch (correct_impl_trailing_hole_ctx, prelude_trailing_hole_ctx) { | (None, _) => Node.div([text("No context available (1)")]) | (_, None) => Node.div([text("No context available (2)")]) // TODO show exercise configuration error diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 65f0e57b14..95066f4f3f 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -78,8 +78,76 @@ let main_view = {settings, editors, explainThisModel, results, ui_state, _}: Model.t, ) => { let editor = Editors.get_editor(editors); - let info_map = editor.state.meta.statics.info_map; - let cursor_info = Indicated.ci_of(editor.state.zipper, info_map); + let common = () => { + let cursor_info = + Indicated.ci_of( + editor.state.zipper, + editor.state.meta.statics.info_map, + ); + let highlights = + ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); + (cursor_info, highlights); + }; + let (editors_view, cursor_info) = + switch (editors) { + | Scratch(idx, _) => + let result_key = ScratchSlide.scratch_key(string_of_int(idx)); + let (cursor_info, highlights) = common(); + let view = + ScratchMode.view( + ~inject, + ~ui_state, + ~settings, + ~highlights, + ~results, + ~result_key, + editor, + ); + (view, cursor_info); + | Documentation(name, _) => + let result_key = ScratchSlide.scratch_key(name); + let (cursor_info, highlights) = common(); + let info = + SlideContent.get_content(editors) + |> Option.map(i => div(~attrs=[Attr.id("slide")], [i])) + |> Option.to_list; + let view = + info + @ ScratchMode.view( + ~inject, + ~ui_state, + ~settings, + ~highlights, + ~results, + ~result_key, + editor, + ); + (view, cursor_info); + | Exercises(_, _, exercise) => + //TODO(andrew): make less costly + let stitched_dynamics = + Exercise.stitch_dynamic( + settings.core, + exercise, + settings.core.dynamics ? Some(results) : None, + ); + let statics = + Exercise.statics_of_stiched_dynamics(exercise, stitched_dynamics); + let cursor_info = + Indicated.ci_of(editor.state.zipper, statics.info_map); + let highlights = + ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); + let view = + ExerciseMode.view( + ~inject, + ~ui_state, + ~settings, + ~highlights, + ~stitched_dynamics, + ~exercise, + ); + (view, cursor_info); + }; let top_bar = div( ~attrs=[Attr.id("top-bar")], @@ -99,47 +167,6 @@ let main_view = cursor_info, ) : div([]); - let highlights = - ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); - let editors_view = - switch (editors) { - | Scratch(idx, _) => - let result_key = ScratchSlide.scratch_key(string_of_int(idx)); - ScratchMode.view( - ~inject, - ~ui_state, - ~settings, - ~highlights, - ~results, - ~result_key, - editor, - ); - | Documentation(name, _) => - let result_key = ScratchSlide.scratch_key(name); - let info = - SlideContent.get_content(editors) - |> Option.map(i => div(~attrs=[Attr.id("slide")], [i])) - |> Option.to_list; - info - @ ScratchMode.view( - ~inject, - ~ui_state, - ~settings, - ~highlights, - ~results, - ~result_key, - editor, - ); - | Exercises(_, _, exercise) => - ExerciseMode.view( - ~inject, - ~ui_state, - ~settings, - ~highlights, - ~results, - ~exercise, - ) - }; [ top_bar, div( From edab8487cace21ddae386b697f405b2c28bea241 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 21:56:52 -0400 Subject: [PATCH 087/168] moved some actions from model level to editor level: paste, reparse, set buffer, reset buffer (assistant actions) --- src/haz3lcore/statics/Statics.re | 3 + src/haz3lcore/tiles/Id.re | 3 + src/haz3lcore/zipper/Editor.re | 4 +- src/haz3lcore/zipper/EditorUtil.re | 46 +------- src/haz3lcore/zipper/Printer.re | 21 +--- src/haz3lcore/zipper/action/Action.re | 39 ++++++- src/haz3lcore/zipper/action/Perform.re | 59 ++++++++-- src/haz3lweb/Editors.re | 19 +++ src/haz3lweb/Keyboard.re | 8 +- src/haz3lweb/Update.re | 110 ++++++++---------- src/haz3lweb/UpdateAction.re | 28 ++--- src/haz3lweb/view/NutMenu.re | 2 +- src/haz3lweb/view/Page.re | 2 +- .../view/assistant/UpdateAssistant.re | 63 +++------- 14 files changed, 208 insertions(+), 199 deletions(-) diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index f7d44274d6..1be0626443 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -908,6 +908,9 @@ let mk = uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) |> snd }); let mk = (core: CoreSettings.t, ctx, exp) => { + //TODO(andrew): document or rm + let exp = + EditorUtil.append_exp(exp, {ids: [Id.ctx_sentinel], term: EmptyHole}); print_endline("RETICULATING STATICS"); //TODO(andrew): rm core.statics ? mk(ctx, exp) : Id.Map.empty; }; diff --git a/src/haz3lcore/tiles/Id.re b/src/haz3lcore/tiles/Id.re index 17a00f7e39..bf55a90e7b 100644 --- a/src/haz3lcore/tiles/Id.re +++ b/src/haz3lcore/tiles/Id.re @@ -113,6 +113,9 @@ let invalid: t = let nullary_ap_flag: t = "DEADBEEF-0000-0000-0000-000000000000" |> Uuidm.of_string |> Option.get; +let ctx_sentinel: t = + "DEADBEEF-DEAD-BEEF-DEAD-DEADBEEFDEAD" |> Uuidm.of_string |> Option.get; + let is_nullary_ap_flag = (ids: list(t)) => switch (ids) { | [id] when id == nullary_ap_flag => true diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index bae82c91ec..5305dbae7b 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -235,7 +235,9 @@ let new_state = ) : t => { let state = State.next(~effects, ~settings, a, z, ed.state); - let history = History.add(a, ed.state, ed.history); + let history = + Action.is_historic(a) + ? History.add(a, ed.state, ed.history) : ed.history; {state, history, read_only: ed.read_only}; }; diff --git a/src/haz3lcore/zipper/EditorUtil.re b/src/haz3lcore/zipper/EditorUtil.re index f6d130e855..107ec25bfa 100644 --- a/src/haz3lcore/zipper/EditorUtil.re +++ b/src/haz3lcore/zipper/EditorUtil.re @@ -1,44 +1,8 @@ -let editor_of_code = (~read_only=false, code: CodeString.t) => { - switch (Printer.zipper_of_string(code)) { - | None => None - | Some(z) => Some(Editor.init(~read_only, z)) - }; -}; - -// let editors_for = -// (~read_only=false, xs: list('a), f: 'a => option(string)) -// : (int, list(('a, option(Editor.t)))) => { -// let zs = -// List.fold_left( -// (acc_zs, a) => { -// switch (f(a)) { -// | Some(str) => -// switch (Printer.zipper_of_string(str)) { -// | None => acc_zs @ [(a, Some(Zipper.init()))] -// | Some(z) => acc_zs @ [(a, Some(z))] -// } -// | None => acc_zs @ [(a, None)] -// } -// }, -// [], -// xs, -// ); -// ( -// 0, -// List.map( -// ((a, sz)) => -// switch (sz) { -// | Some(z) => (a, Some(Editor.init(z, ~read_only))) -// | None => (a, None) -// }, -// zs, -// ), -// ); -// }; - -// let editors_of_strings = (~read_only=false, xs: list(string)) => { -// let (i, aes) = editors_for(xs, x => Some(x), ~read_only); -// (i, List.map(((_, oe)) => Option.get(oe), aes)); +// let editor_of_code = (~read_only=false, code: CodeString.t) => { +// switch (Printer.zipper_of_string(code)) { +// | None => None +// | Some(z) => Some(Editor.init(~read_only, z)) +// }; // }; let rec append_exp = (e1: TermBase.UExp.t, e2: TermBase.UExp.t) => { diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 6b7e7a4814..595c58b548 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -111,19 +111,8 @@ let zipper_of_string = str |> Util.StringUtil.to_list |> List.fold_left(insert, Some(zipper_init)); }; -let paste_into_zip = (z: Zipper.t, str: string): option(Zipper.t) => { - /* HACK(andrew): These two perform calls are a hack to - deal with the fact that pasting something like "let a = b in" - won't trigger the barfing of the "in"; to trigger this, we - insert a space, and then we immediately delete it. */ - let settings = CoreSettings.off; - let* z = zipper_of_string(~zipper_init=z, str); - switch (Perform.go_z(~settings, Insert(" "), z)) { - | Error(_) => None - | Ok(z) => - switch (Perform.go_z(~settings, Destruct(Left), z)) { - | Error(_) => None - | Ok(z) => Some(z) - } - }; -}; +/* This serializes the current editor to text, resets the current + editor, and then deserializes. It is intended as a (tactical) + nuclear option for weird backpack states */ +let reparse = z => + zipper_of_string(~zipper_init=Zipper.init(), zipper_to_string(z)); diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index a7a05024a7..5aed4a90b4 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -54,9 +54,17 @@ type project = | Escape(Id.t, Direction.t) | Remove(Id.t); +[@deriving (show({with_path: false}), sexp, yojson)] +type agent = + | TyDi; + [@deriving (show({with_path: false}), sexp, yojson)] type t = | RecalcStatics /* Could refactor to SetInitCtx(ctx) */ + | SetBuffer(agent) + | ResetBuffer + | Paste(string) + | Reparse | Project(project) | Move(move) | MoveToNextHole(Direction.t) @@ -78,7 +86,9 @@ module Failure = { | Cant_destruct | Cant_select | Cant_put_down - | Cant_project; + | Cant_project + | CantPaste + | CantReparse; }; module Result = { @@ -90,6 +100,10 @@ let is_edit: t => bool = fun | RecalcStatics => true | Project(_) => true //TODO(andrew): revisit + | SetBuffer(_) => true //TODO(andrew): revisit + | ResetBuffer => true //TODO(andrew): revisit + | Paste(_) + | Reparse | Insert(_) | Destruct(_) | Pick_up @@ -101,3 +115,26 @@ let is_edit: t => bool = | Unselect(_) | RotateBackpack | MoveToBackpackTarget(_) => false; + +/* Determines whether undo/redo skips action */ +let is_historic: t => bool = + fun + | RecalcStatics => + /* If we add this to history, we can basically never undo */ + false + | SetBuffer(_) + | ResetBuffer + | Move(_) + | MoveToNextHole(_) + | Jump(_) + | Select(_) + | Unselect(_) + | RotateBackpack + | MoveToBackpackTarget(_) => false + | Paste(_) + | Reparse + | Project(_) + | Insert(_) + | Destruct(_) + | Pick_up + | Put_down => true; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 1d5e7c19a0..02317b803d 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -5,11 +5,15 @@ let is_write_action = (a: Action.t) => { switch (a) { | RecalcStatics | Project(_) => false //TODO(andrew): revisit + | SetBuffer(_) + | ResetBuffer | Move(_) | MoveToNextHole(_) | Unselect(_) | Jump(_) | Select(_) => false + | Paste(_) + | Reparse | Destruct(_) | Insert(_) | Pick_up @@ -19,14 +23,14 @@ let is_write_action = (a: Action.t) => { }; }; -let go_z = - ( - ~meta: option(Editor.Meta.t)=?, - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - ) - : Action.Result.t(Zipper.t) => { +let rec go_z = + ( + ~meta: option(Editor.Meta.t)=?, + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + ) + : Action.Result.t(Zipper.t) => { let meta = switch (meta) { | Some(m) => m @@ -46,7 +50,46 @@ let go_z = } }; + let paste = (z: Zipper.t, str: string): option(Zipper.t) => { + open Util.OptUtil.Syntax; + /* HACK(andrew): These two perform calls are a hack to + deal with the fact that pasting something like "let a = b in" + won't trigger the barfing of the "in"; to trigger this, we + insert a space, and then we immediately delete it. */ + let settings = CoreSettings.off; + let* z = Printer.zipper_of_string(~zipper_init=z, str); + switch (go_z(~settings, Insert(" "), z)) { + | Error(_) => None + | Ok(z) => + switch (go_z(~settings, Destruct(Left), z)) { + | Error(_) => None + | Ok(z) => Some(z) + } + }; + }; + switch (a) { + | Paste(clipboard) => + switch (paste(z, clipboard)) { + | None => Error(CantPaste) + | Some(z) => Ok(z) + } + | Reparse => + switch (Printer.reparse(z)) { + | None => Error(CantReparse) + | Some(z) => Ok(z) + } + | ResetBuffer => + switch (z.selection.mode) { + | Buffer(_) => Ok({...z, selection: Selection.mk([])}) + | _ => Ok(z) + } + | SetBuffer(TyDi) => + let info_map = meta.statics.info_map; + switch (TyDi.set_buffer(~info_map, z)) { + | None => Ok(z) + | Some(z) => Ok(z) + }; | RecalcStatics => print_endline("RecalcStatics action called"); Ok(z); diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index a9c4af142a..c9d1daf190 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -41,6 +41,25 @@ let put_editor = (ed: Editor.t, eds: t): t => Exercises(n, specs, Exercise.put_editor(exercise, ed)) }; +//TODO(andrew): use or lose +let update_editor = + ( + editors: t, + ~f: Editor.t => Result.t(Zipper.t, 'b), + ~settings, + ~action, + ~err: 'b => Result.t(t, 'c), + ) + : Result.t(t, 'c) => { + let ed = get_editor(editors); + switch (f(ed)) { + | Error(e) => err(e) + | Ok(z) => + let ed = Editor.new_state(~settings, action, z, ed); + Ok(put_editor(ed, editors)); + }; +}; + let get_zipper = (editors: t): Zipper.t => get_editor(editors).state.zipper; let get_ctx_init = (~settings as _: Settings.t, editors: t): Ctx.t => diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 7d06571cc2..560babfc22 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -77,8 +77,8 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) | "a" => now(Select(All)) - | "k" => Some(ReparseCurrentEditor) - | "/" => Some(Assistant(Prompt(TyDi))) + | "k" => Some(PerformAction(Reparse)) + | "/" => Some(PerformAction(SetBuffer(TyDi))) | _ when is_digit(key) => Some(SwitchScratchSlide(int_of_string(key))) | "ArrowLeft" => now(Move(Extreme(Left(ByToken)))) | "ArrowRight" => now(Move(Extreme(Right(ByToken)))) @@ -92,8 +92,8 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) | "a" => now(Select(All)) - | "k" => Some(ReparseCurrentEditor) - | "/" => Some(Assistant(Prompt(TyDi))) + | "k" => Some(PerformAction(Reparse)) + | "/" => Some(PerformAction(SetBuffer(TyDi))) | _ when is_digit(key) => Some(SwitchScratchSlide(int_of_string(key))) | "ArrowLeft" => now(Move(Local(Left(ByToken)))) | "ArrowRight" => now(Move(Local(Right(ByToken)))) diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 55cd91ed36..6e15f92335 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -212,20 +212,6 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; -let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => - switch ( - model.editors - |> Editors.get_editor - |> Haz3lcore.Perform.go(~settings=model.settings.core, a) - ) { - | Error(err) => Error(FailedToPerform(err)) - | Ok(ed) => - let model = {...model, editors: Editors.put_editor(ed, model.editors)}; - /* Note: Not saving here as saving is costly to do each keystroke, - we wait a second after the last edit action (see Main.re) */ - Ok(model); - }; - let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); let m = @@ -428,40 +414,38 @@ let rec apply = apply(model, a, state, ~schedule_action); | PerformAction(a) when model.settings.core.assist && model.settings.core.statics => - let model = UpdateAssistant.reset_buffer(model); - switch (perform_action(model, a)) { - | Ok(model) when Action.is_edit(a) => - UpdateAssistant.apply( - model, - Prompt(TyDi), - ~schedule_action, - ~state, - ~main=apply, - ) + switch (perform_action(model, ResetBuffer)) { + | Ok(model) => + switch (perform_action(model, a)) { + | Ok(model) when Action.is_edit(a) => + perform_action(model, SetBuffer(TyDi)) + | x => x + } | x => x - }; + } | PerformAction(a) => perform_action(model, a) - | ReparseCurrentEditor => - /* This serializes the current editor to text, resets the current - editor, and then deserializes. It is intended as a (tactical) - nuclear option for weird backpack states */ - let ed = Editors.get_editor(model.editors); - let zipper_init = Zipper.init(); - let ed_str = Printer.to_string_editor(ed); - switch (Printer.zipper_of_string(~zipper_init, ed_str)) { - | None => Error(CantReset) - | Some(z) => - //TODO: add correct action to history (Pick_up is wrong) - let editor = - Haz3lcore.Editor.new_state( - ~settings=model.settings.core, - Pick_up, - z, - ed, - ); - let editors = Editors.put_editor(editor, model.editors); - Ok({...model, editors}); - }; + | ReparseCurrentEditor => Ok(model) + //TODO(andrew): rm + /* This serializes the current editor to text, resets the current + editor, and then deserializes. It is intended as a (tactical) + nuclear option for weird backpack states */ + // let ed = Editors.get_editor(model.editors); + // let zipper_init = Zipper.init(); + // let ed_str = Printer.to_string_editor(ed); + // switch (Printer.zipper_of_string(~zipper_init, ed_str)) { + // | None => Error(CantReset) + // | Some(z) => + // //TODO: add correct action to history (Pick_up is wrong) + // let editor = + // Haz3lcore.Editor.new_state( + // ~settings=model.settings.core, + // Pick_up, + // z, + // ed, + // ); + // let editors = Editors.put_editor(editor, model.editors); + // Ok({...model, editors}); + // }; | Cut => // system clipboard handling itself is done in Page.view handlers perform_action(model, Destruct(Left)) @@ -469,22 +453,24 @@ let rec apply = // system clipboard handling itself is done in Page.view handlers // doesn't change the state but including as an action for logging purposes Ok(model) - | Paste(clipboard) => - let ed = Editors.get_editor(model.editors); - switch (Printer.paste_into_zip(ed.state.zipper, clipboard)) { - | None => Error(CantPaste) - | Some(z) => - //HACK(andrew): below is not strictly a insert action... - let ed = - Haz3lcore.Editor.new_state( - ~settings=model.settings.core, - Insert(clipboard), - z, - ed, - ); - let editors = Editors.put_editor(ed, model.editors); - Ok({...model, editors}); - }; + | Paste(_clipboard) => + //TODO(andrew): rm + // let ed = Editors.get_editor(model.editors); + // switch (Printer.paste_into_zip(ed.state.zipper, clipboard)) { + // | None => Error(CantPaste) + // | Some(z) => + // //HACK(andrew): below is not strictly a insert action... + // let ed = + // Haz3lcore.Editor.new_state( + // ~settings=model.settings.core, + // Insert(clipboard), + // z, + // ed, + // ); + // let editors = Editors.put_editor(ed, model.editors); + // Ok({...model, editors}); + // }; + Ok(model) | Undo => let ed = Editors.get_editor(model.editors); switch (Haz3lcore.Editor.undo(ed)) { diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index efbee42cbf..4c8922a021 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -35,13 +35,8 @@ type stepper_action = | StepForward(int) | StepBackward; -[@deriving (show({with_path: false}), sexp, yojson)] -type agent = - | TyDi; - [@deriving (show({with_path: false}), sexp, yojson)] type agent_action = - | Prompt(agent) | AcceptSuggestion; [@deriving (show({with_path: false}), sexp, yojson)] @@ -97,10 +92,6 @@ module Failure = { type t = | CantUndo | CantRedo - | CantPaste - | CantReset - | CantSuggest - | FailedToLoad | FailedToSwitch | FailedToPerform(Action.Failure.t) | Exception(string); @@ -161,8 +152,7 @@ let is_edit: t => bool = | InitImportScratchpad(_) | MoveToNextHole(_) | Benchmark(_) - | TAB - | Assistant(Prompt(_)) => false; + | TAB => false; let reevaluate_post_update: t => bool = fun @@ -197,7 +187,6 @@ let reevaluate_post_update: t => bool = | FontMetrics(_) => false } | Assistant(AcceptSuggestion) => true - | Assistant(Prompt(_)) => false | MoveToNextHole(_) | Save | Copy @@ -248,7 +237,6 @@ let should_scroll_to_caret = | Mouseup | ShowBackpackTargets(_) => false } - | Assistant(Prompt(_)) | UpdateResult(_) | ToggleStepper(_) | StepperAction(_, StepBackward | StepForward(_)) => false @@ -279,7 +267,11 @@ let should_scroll_to_caret = | Pick_up | Put_down | RotateBackpack - | MoveToBackpackTarget(_) => true + | MoveToBackpackTarget(_) + | SetBuffer(_) + | ResetBuffer + | Paste(_) + | Reparse => true | RecalcStatics | Project(_) | Unselect(_) @@ -292,3 +284,11 @@ let should_scroll_to_caret = | ExportPersistentData | DebugConsole(_) | Benchmark(_) => false; + +let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { + let ed = Editors.get_editor(model.editors); + switch (Haz3lcore.Perform.go(~settings=model.settings.core, a, ed)) { + | Error(err) => Error(FailedToPerform(err)) + | Ok(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) + }; +}; diff --git a/src/haz3lweb/view/NutMenu.re b/src/haz3lweb/view/NutMenu.re index bcc441415d..15fbec063d 100644 --- a/src/haz3lweb/view/NutMenu.re +++ b/src/haz3lweb/view/NutMenu.re @@ -32,7 +32,7 @@ let reset_hazel = let reparse = (~inject: Update.t => 'a) => button( Icons.backpack, - _ => inject(ReparseCurrentEditor), + _ => inject(PerformAction(Reparse)), ~tooltip="Reparse Current Editor", ); diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 95066f4f3f..af02050c33 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -67,7 +67,7 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => Js.to_string(evt##.clipboardData##getData(Js.string("text"))) |> Str.global_replace(Str.regexp("\n[ ]*"), "\n"); Dom.preventDefault(evt); - inject(UpdateAction.Paste(pasted_text)); + inject(PerformAction(Paste(pasted_text))); }), ]; }; diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re index 733339f3c3..b0fb6d9625 100644 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ b/src/haz3lweb/view/assistant/UpdateAssistant.re @@ -1,61 +1,19 @@ open Haz3lcore; include UpdateAction; -/* NOTE: this is duplicated from Update */ -let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { - let ed_init = Editors.get_editor(model.editors); - switch (Haz3lcore.Perform.go(~settings=model.settings.core, a, ed_init)) { - | Error(err) => Error(FailedToPerform(err)) - | Ok(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) - }; -}; - -let reset_buffer = (model: Model.t) => { - let ed = model.editors |> Editors.get_editor; - let z = ed.state.zipper; - let settings = model.settings.core; - switch (z.selection.mode) { - | Buffer(_) => - //TODO(andrew): make sure this is synced with statics properly - switch (Perform.go_z(~settings, Destruct(Left), z)) { - | Error(_) => model - | Ok(z) => - let ed = Editor.new_state(~settings, Destruct(Left), z, ed); - //TODO(andrew): fix double action - {...model, editors: Editors.put_editor(ed, model.editors)}; - } - | _ => model - }; -}; - let apply = - ( - {settings, _} as model: Model.t, - update: agent_action, - ~schedule_action, - ~state, - ~main, - ) + (model: Model.t, update: agent_action, ~schedule_action, ~state, ~main) : Result.t(Model.t) => { - let editor = model.editors |> Editors.get_editor; - let z = editor.state.zipper; switch (update) { - | Prompt(TyDi) => - let info_map = editor.state.meta.statics.info_map; - switch (TyDi.set_buffer(~info_map, z)) { - | None => Ok(model) - | Some(z) => - let ed = Editor.new_state(~settings=settings.core, Pick_up, z, editor); - //TODO: add correct action to history (Pick_up is wrong) - let editors = Editors.put_editor(ed, model.editors); - Ok({...model, editors}); - }; + //| Prompt(TyDi) => Ok(set_buffer(model)) | AcceptSuggestion => - print_endline("accepting suggestion"); + let editor = model.editors |> Editors.get_editor; + let z = editor.state.zipper; let trim = AssistantExpander.trim; switch (z.selection.mode) { | Normal => Ok(model) - | Buffer(Parsed) => perform_action(model, Unselect(Some(Right))) + | Buffer(Parsed) => + UpdateAction.perform_action(model, Unselect(Some(Right))) | Buffer(Unparsed) => switch (TyDi.get_buffer(z)) { | None => Ok(model) @@ -86,14 +44,19 @@ let apply = do_actions( model, [ - Paste(trim(completion)), + PerformAction(Paste(trim(completion))), PerformAction(Move(Goal(Point(start)))), PerformAction(MoveToNextHole(Right)), PerformAction(Move(Local(Left(ByToken)))), ], ); | Some(completion) => - main(model, Paste(trim(completion)), state, ~schedule_action) + main( + model, + PerformAction(Paste(trim(completion))), + state, + ~schedule_action, + ) } }; }; From 9bb293d2f6fe48715154e86312d93c1bd6878a17 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 23:15:01 -0400 Subject: [PATCH 088/168] move assistant accept action to perform from update --- src/haz3lcore/zipper/Selection.re | 4 +- src/haz3lcore/zipper/Zipper.re | 2 +- src/haz3lcore/zipper/action/Action.re | 19 +++-- src/haz3lcore/zipper/action/Perform.re | 77 +++++++++++++++++-- src/haz3lweb/Editors.re | 34 ++++---- src/haz3lweb/Keyboard.re | 4 +- src/haz3lweb/Log.re | 3 - src/haz3lweb/Update.re | 73 +++--------------- src/haz3lweb/UpdateAction.re | 27 +------ .../view/assistant/UpdateAssistant.re | 63 --------------- 10 files changed, 116 insertions(+), 190 deletions(-) delete mode 100644 src/haz3lweb/view/assistant/UpdateAssistant.re diff --git a/src/haz3lcore/zipper/Selection.re b/src/haz3lcore/zipper/Selection.re index e89aba3a99..20599154c6 100644 --- a/src/haz3lcore/zipper/Selection.re +++ b/src/haz3lcore/zipper/Selection.re @@ -2,8 +2,8 @@ open Util; [@deriving (show({with_path: false}), sexp, yojson)] type buffer = - | Unparsed - | Parsed; + //| Parsed + | Unparsed; [@deriving (show({with_path: false}), sexp, yojson)] type mode = diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index eb04b5ddef..862a1bcc34 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -95,7 +95,7 @@ let clear_unparsed_buffer = (z: t) => let unselect = (~erase_buffer=false, z: t): t => { /* NOTE(andrew): Erase buffer flag only applies to unparsed buffer, * that is, the buffer style that just contains a single flat token. - * Erasing a buffer the contains arbitrary tiles would be more complex + * Erasing a buffer that contains arbitrary tiles would be more complex * as we can't just empty the selection without regrouting */ let z = erase_buffer ? clear_unparsed_buffer(z) : z; let relatives = diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 5aed4a90b4..b90c947236 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -58,11 +58,16 @@ type project = type agent = | TyDi; +[@deriving (show({with_path: false}), sexp, yojson)] +type buffer = + | Set(agent) + | Clear + | Accept; + [@deriving (show({with_path: false}), sexp, yojson)] type t = | RecalcStatics /* Could refactor to SetInitCtx(ctx) */ - | SetBuffer(agent) - | ResetBuffer + | Buffer(buffer) | Paste(string) | Reparse | Project(project) @@ -88,7 +93,8 @@ module Failure = { | Cant_put_down | Cant_project | CantPaste - | CantReparse; + | CantReparse + | CantAccept; }; module Result = { @@ -100,8 +106,7 @@ let is_edit: t => bool = fun | RecalcStatics => true | Project(_) => true //TODO(andrew): revisit - | SetBuffer(_) => true //TODO(andrew): revisit - | ResetBuffer => true //TODO(andrew): revisit + | Buffer(Accept | Clear | Set(_)) | Paste(_) | Reparse | Insert(_) @@ -122,8 +127,7 @@ let is_historic: t => bool = | RecalcStatics => /* If we add this to history, we can basically never undo */ false - | SetBuffer(_) - | ResetBuffer + | Buffer(Clear | Set(_)) | Move(_) | MoveToNextHole(_) | Jump(_) @@ -131,6 +135,7 @@ let is_historic: t => bool = | Unselect(_) | RotateBackpack | MoveToBackpackTarget(_) => false + | Buffer(Accept) | Paste(_) | Reparse | Project(_) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 02317b803d..f7b8b71544 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -5,13 +5,12 @@ let is_write_action = (a: Action.t) => { switch (a) { | RecalcStatics | Project(_) => false //TODO(andrew): revisit - | SetBuffer(_) - | ResetBuffer | Move(_) | MoveToNextHole(_) | Unselect(_) | Jump(_) | Select(_) => false + | Buffer(Set(_) | Clear | Accept) | Paste(_) | Reparse | Destruct(_) @@ -52,10 +51,13 @@ let rec go_z = let paste = (z: Zipper.t, str: string): option(Zipper.t) => { open Util.OptUtil.Syntax; - /* HACK(andrew): These two perform calls are a hack to + /* HACK(andrew): The two perform calls are a hack to deal with the fact that pasting something like "let a = b in" won't trigger the barfing of the "in"; to trigger this, we - insert a space, and then we immediately delete it. */ + insert a space, and then we immediately delete it. Note + that in general it's not safe to call go_z recursively + (the meta may change) but as long as we're not relying + on anything but the raw zipper we're fine. */ let settings = CoreSettings.off; let* z = Printer.zipper_of_string(~zipper_init=z, str); switch (go_z(~settings, Insert(" "), z)) { @@ -79,17 +81,58 @@ let rec go_z = | None => Error(CantReparse) | Some(z) => Ok(z) } - | ResetBuffer => + | Buffer(Clear) => switch (z.selection.mode) { | Buffer(_) => Ok({...z, selection: Selection.mk([])}) | _ => Ok(z) } - | SetBuffer(TyDi) => + | Buffer(Set(TyDi)) => let info_map = meta.statics.info_map; switch (TyDi.set_buffer(~info_map, z)) { | None => Ok(z) | Some(z) => Ok(z) }; + | Buffer(Accept) => + switch (z.selection.mode) { + | Normal => Ok(z) + | Buffer(Unparsed) => + switch (TyDi.get_buffer(z)) { + | None => Error(CantAccept) + | Some(completion) when String.contains(completion, ' ') => + /* Slightly hacky. We assume that if a completion string has + * spaces in it, that means it will have a hole in it. This + * is a non-essential invariant currently maintained in TyDi. + * In such a case, we insert the completion as normal by + * pasting, then return to the beginning and advance to the + * first hole. This should be revisited if completions are + * refactored to use a more structured buffer format. + * + * Note that calling go_z like this without recalculating + * the meta is iffy; the goal movement only works because + * the paste only changes measurements south of the start */ + let start = Zipper.caret_point(M.measured, meta.projected.z); + let rec do_actions = (z, actions: list(Action.t)) => + switch (actions) { + | [] => Ok(z) + | [a, ...tl] => + switch (go_z(~meta, ~settings, a, z)) { + | Error(err) => Error(err) + | Ok(z) => do_actions(z, tl) + } + }; + do_actions( + z, + [ + Paste(AssistantExpander.trim(completion)), + Move(Goal(Point(start))), + MoveToNextHole(Right), + Move(Local(Left(ByToken))), + ], + ); + | Some(completion) => + go_z(~meta, ~settings, Paste(AssistantExpander.trim(completion)), z) + } + } | RecalcStatics => print_endline("RecalcStatics action called"); Ok(z); @@ -234,9 +277,11 @@ let rec go_z = }; }; -let go = +let go_base = (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) : Action.Result.t(Editor.t) => + /* This function enforces read-only editors and + * is responsible for mainting the action history */ if (ed.read_only && is_write_action(a)) { Result.Ok(ed); } else { @@ -246,3 +291,21 @@ let go = let+ z = go_z(~settings, ~meta, a, zipper); Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); }; + +let go = + (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) + : Action.Result.t(Editor.t) => + /* This function wraps assistant completions. If completions are enabled, + * then beginning any action (other than accepting a completion) clears + * the completion buffer before performing the action. Conversely, + * after any edit action, a new completion is set in the buffer */ + if (settings.assist && settings.statics) { + open Result.Syntax; + let* ed = + a == Buffer(Accept) ? Ok(ed) : go_base(~settings, Buffer(Clear), ed); + let* ed = go_base(~settings, a, ed); + Action.is_edit(a) + ? go_base(~settings, Buffer(Set(TyDi)), ed) : Ok(ed); + } else { + go_base(~settings, a, ed); + }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index c9d1daf190..f448fee5f3 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -42,23 +42,23 @@ let put_editor = (ed: Editor.t, eds: t): t => }; //TODO(andrew): use or lose -let update_editor = - ( - editors: t, - ~f: Editor.t => Result.t(Zipper.t, 'b), - ~settings, - ~action, - ~err: 'b => Result.t(t, 'c), - ) - : Result.t(t, 'c) => { - let ed = get_editor(editors); - switch (f(ed)) { - | Error(e) => err(e) - | Ok(z) => - let ed = Editor.new_state(~settings, action, z, ed); - Ok(put_editor(ed, editors)); - }; -}; +// let update_editor = +// ( +// editors: t, +// ~f: Editor.t => Result.t(Zipper.t, 'b), +// ~settings, +// ~action, +// ~err: 'b => Result.t(t, 'c), +// ) +// : Result.t(t, 'c) => { +// let ed = get_editor(editors); +// switch (f(ed)) { +// | Error(e) => err(e) +// | Ok(z) => +// let ed = Editor.new_state(~settings, action, z, ed); +// Ok(put_editor(ed, editors)); +// }; +// }; let get_zipper = (editors: t): Zipper.t => get_editor(editors).state.zipper; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 560babfc22..a9dcd59014 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -78,7 +78,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "p" => Some(PerformAction(Pick_up)) | "a" => now(Select(All)) | "k" => Some(PerformAction(Reparse)) - | "/" => Some(PerformAction(SetBuffer(TyDi))) + | "/" => Some(PerformAction(Buffer(Set(TyDi)))) | _ when is_digit(key) => Some(SwitchScratchSlide(int_of_string(key))) | "ArrowLeft" => now(Move(Extreme(Left(ByToken)))) | "ArrowRight" => now(Move(Extreme(Right(ByToken)))) @@ -93,7 +93,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "p" => Some(PerformAction(Pick_up)) | "a" => now(Select(All)) | "k" => Some(PerformAction(Reparse)) - | "/" => Some(PerformAction(SetBuffer(TyDi))) + | "/" => Some(PerformAction(Buffer(Set(TyDi)))) | _ when is_digit(key) => Some(SwitchScratchSlide(int_of_string(key))) | "ArrowLeft" => now(Move(Local(Left(ByToken)))) | "ArrowRight" => now(Move(Local(Right(ByToken)))) diff --git a/src/haz3lweb/Log.re b/src/haz3lweb/Log.re index 45435240c4..0ae5ea139d 100644 --- a/src/haz3lweb/Log.re +++ b/src/haz3lweb/Log.re @@ -17,17 +17,14 @@ let is_action_logged: UpdateAction.t => bool = | DebugConsole(_) => false | Reset | TAB - | Assistant(_) | Set(_) | SwitchScratchSlide(_) | SwitchDocumentationSlide(_) | SwitchEditor(_) | ResetCurrentEditor - | ReparseCurrentEditor | PerformAction(_) | Cut | Copy - | Paste(_) | Undo | Redo | MoveToNextHole(_) diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 6e15f92335..aace6b71eb 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -212,6 +212,14 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; +let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { + let ed = Editors.get_editor(model.editors); + switch (Haz3lcore.Perform.go(~settings=model.settings.core, a, ed)) { + | Error(err) => Error(FailedToPerform(err)) + | Ok(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) + }; +}; + let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); let m = @@ -408,44 +416,11 @@ let rec apply = |> ((ed: Editor.t) => ed.state.zipper); let a = Selection.is_buffer(z.selection) - ? Assistant(AcceptSuggestion) + ? PerformAction(Buffer(Accept)) : Zipper.can_put_down(z) ? PerformAction(Put_down) : MoveToNextHole(Right); apply(model, a, state, ~schedule_action); - | PerformAction(a) - when model.settings.core.assist && model.settings.core.statics => - switch (perform_action(model, ResetBuffer)) { - | Ok(model) => - switch (perform_action(model, a)) { - | Ok(model) when Action.is_edit(a) => - perform_action(model, SetBuffer(TyDi)) - | x => x - } - | x => x - } | PerformAction(a) => perform_action(model, a) - | ReparseCurrentEditor => Ok(model) - //TODO(andrew): rm - /* This serializes the current editor to text, resets the current - editor, and then deserializes. It is intended as a (tactical) - nuclear option for weird backpack states */ - // let ed = Editors.get_editor(model.editors); - // let zipper_init = Zipper.init(); - // let ed_str = Printer.to_string_editor(ed); - // switch (Printer.zipper_of_string(~zipper_init, ed_str)) { - // | None => Error(CantReset) - // | Some(z) => - // //TODO: add correct action to history (Pick_up is wrong) - // let editor = - // Haz3lcore.Editor.new_state( - // ~settings=model.settings.core, - // Pick_up, - // z, - // ed, - // ); - // let editors = Editors.put_editor(editor, model.editors); - // Ok({...model, editors}); - // }; | Cut => // system clipboard handling itself is done in Page.view handlers perform_action(model, Destruct(Left)) @@ -453,24 +428,8 @@ let rec apply = // system clipboard handling itself is done in Page.view handlers // doesn't change the state but including as an action for logging purposes Ok(model) - | Paste(_clipboard) => - //TODO(andrew): rm - // let ed = Editors.get_editor(model.editors); - // switch (Printer.paste_into_zip(ed.state.zipper, clipboard)) { - // | None => Error(CantPaste) - // | Some(z) => - // //HACK(andrew): below is not strictly a insert action... - // let ed = - // Haz3lcore.Editor.new_state( - // ~settings=model.settings.core, - // Insert(clipboard), - // z, - // ed, - // ); - // let editors = Editors.put_editor(ed, model.editors); - // Ok({...model, editors}); - // }; - Ok(model) + | MoveToNextHole(d) => + perform_action(model, Move(Goal(Piece(Grout, d)))) | Undo => let ed = Editors.get_editor(model.editors); switch (Haz3lcore.Editor.undo(ed)) { @@ -485,16 +444,6 @@ let rec apply = | Some(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) }; - | MoveToNextHole(d) => - perform_action(model, Move(Goal(Piece(Grout, d)))) - | Assistant(action) => - UpdateAssistant.apply( - model, - action, - ~schedule_action, - ~state, - ~main=apply, - ) | Benchmark(Start) => List.iter(schedule_action, Benchmark.actions_1); Benchmark.start(); diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 4c8922a021..c6a5c667dc 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -35,10 +35,6 @@ type stepper_action = | StepForward(int) | StepBackward; -[@deriving (show({with_path: false}), sexp, yojson)] -type agent_action = - | AcceptSuggestion; - [@deriving (show({with_path: false}), sexp, yojson)] type set_meta = | Mousedown @@ -74,15 +70,12 @@ type t = | TAB | Save | PerformAction(Action.t) - | ReparseCurrentEditor | Cut | Copy - | Paste(string) | Undo | Redo | MoveToNextHole(Direction.t) | Benchmark(benchmark_action) - | Assistant(agent_action) | ToggleStepper(ModelResults.Key.t) | StepperAction(ModelResults.Key.t, stepper_action) | UpdateResult(ModelResults.t); @@ -130,16 +123,13 @@ let is_edit: t => bool = | Cut | Undo | Redo - | Paste(_) | SwitchScratchSlide(_) | SwitchDocumentationSlide(_) | ToggleStepper(_) | StepperAction(_) - | ReparseCurrentEditor | FinishImportAll(_) | FinishImportScratchpad(_) | ResetCurrentEditor - | Assistant(AcceptSuggestion) | Reset => true | UpdateResult(_) | SwitchEditor(_) @@ -186,7 +176,6 @@ let reevaluate_post_update: t => bool = | ShowBackpackTargets(_) | FontMetrics(_) => false } - | Assistant(AcceptSuggestion) => true | MoveToNextHole(_) | Save | Copy @@ -201,7 +190,6 @@ let reevaluate_post_update: t => bool = | Benchmark(_) => false | StepperAction(_, StepForward(_) | StepBackward) | ToggleStepper(_) - | ReparseCurrentEditor | FinishImportAll(_) | FinishImportScratchpad(_) | ResetCurrentEditor @@ -209,7 +197,6 @@ let reevaluate_post_update: t => bool = | SwitchDocumentationSlide(_) | Reset | Cut - | Paste(_) | Undo | Redo => true; @@ -240,17 +227,14 @@ let should_scroll_to_caret = | UpdateResult(_) | ToggleStepper(_) | StepperAction(_, StepBackward | StepForward(_)) => false - | Assistant(AcceptSuggestion) => true | FinishImportScratchpad(_) | FinishImportAll(_) | ResetCurrentEditor | SwitchEditor(_) | SwitchScratchSlide(_) | SwitchDocumentationSlide(_) - | ReparseCurrentEditor | Reset | Copy - | Paste(_) | Cut | Undo | Redo @@ -268,8 +252,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) - | SetBuffer(_) - | ResetBuffer + | Buffer(Set(_) | Clear | Accept) | Paste(_) | Reparse => true | RecalcStatics @@ -284,11 +267,3 @@ let should_scroll_to_caret = | ExportPersistentData | DebugConsole(_) | Benchmark(_) => false; - -let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { - let ed = Editors.get_editor(model.editors); - switch (Haz3lcore.Perform.go(~settings=model.settings.core, a, ed)) { - | Error(err) => Error(FailedToPerform(err)) - | Ok(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) - }; -}; diff --git a/src/haz3lweb/view/assistant/UpdateAssistant.re b/src/haz3lweb/view/assistant/UpdateAssistant.re deleted file mode 100644 index b0fb6d9625..0000000000 --- a/src/haz3lweb/view/assistant/UpdateAssistant.re +++ /dev/null @@ -1,63 +0,0 @@ -open Haz3lcore; -include UpdateAction; - -let apply = - (model: Model.t, update: agent_action, ~schedule_action, ~state, ~main) - : Result.t(Model.t) => { - switch (update) { - //| Prompt(TyDi) => Ok(set_buffer(model)) - | AcceptSuggestion => - let editor = model.editors |> Editors.get_editor; - let z = editor.state.zipper; - let trim = AssistantExpander.trim; - switch (z.selection.mode) { - | Normal => Ok(model) - | Buffer(Parsed) => - UpdateAction.perform_action(model, Unselect(Some(Right))) - | Buffer(Unparsed) => - switch (TyDi.get_buffer(z)) { - | None => Ok(model) - /* This case shouldn't happen if we assume that we prevalidate - * everything we put in the unparsed buffer*/ - | Some(completion) when String.contains(completion, ' ') => - /* Slightly hacky. We assume that if a completion string has - * spaces in it, that means it will have a hole in it. This - * is a non-essential invariant currently maintained in TyDi. - * In such a case, we insert the completion as normal by - * pasting, then return to the beginning and advance to the - * first hole. This should be revisited if completions are - * refactored to use a more structured buffer format */ - module M = (val Editor.Meta.module_of_t(editor.state.meta)); - let start = - Zipper.caret_point(M.measured, editor.state.meta.projected.z); - let rec do_actions = (model, actions: list(UpdateAction.t)) => - switch (actions) { - | [] => Ok(model) - | [hd, ...tl] => - switch (main(model, hd, state, ~schedule_action)) { - | Error(err) => Error(err) - | Ok(model) => do_actions(model, tl) - } - }; - /* TODO(andrew): use zipper-level actions here to avoid - * measured recomputation at editor-level */ - do_actions( - model, - [ - PerformAction(Paste(trim(completion))), - PerformAction(Move(Goal(Point(start)))), - PerformAction(MoveToNextHole(Right)), - PerformAction(Move(Local(Left(ByToken)))), - ], - ); - | Some(completion) => - main( - model, - PerformAction(Paste(trim(completion))), - state, - ~schedule_action, - ) - } - }; - }; -}; From 1399f31a3203deb8f666485aaa67d3fbb4cbd086 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 10 Jul 2024 23:32:27 -0400 Subject: [PATCH 089/168] cut and paste moved to editor --- src/haz3lcore/zipper/action/Action.re | 11 +++++++---- src/haz3lcore/zipper/action/Perform.re | 15 ++++++++++----- src/haz3lweb/Keyboard.re | 2 +- src/haz3lweb/Log.re | 3 --- src/haz3lweb/Update.re | 12 ++---------- src/haz3lweb/UpdateAction.re | 15 ++------------- 6 files changed, 22 insertions(+), 36 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index b90c947236..84ccedb9d8 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -67,12 +67,13 @@ type buffer = [@deriving (show({with_path: false}), sexp, yojson)] type t = | RecalcStatics /* Could refactor to SetInitCtx(ctx) */ + | Reparse | Buffer(buffer) | Paste(string) - | Reparse + | Copy + | Cut | Project(project) | Move(move) - | MoveToNextHole(Direction.t) | Jump(jump_target) | Select(select) | Unselect(option(Direction.t)) @@ -108,13 +109,14 @@ let is_edit: t => bool = | Project(_) => true //TODO(andrew): revisit | Buffer(Accept | Clear | Set(_)) | Paste(_) + | Cut | Reparse | Insert(_) | Destruct(_) | Pick_up | Put_down => true + | Copy | Move(_) - | MoveToNextHole(_) | Jump(_) | Select(_) | Unselect(_) @@ -128,13 +130,14 @@ let is_historic: t => bool = /* If we add this to history, we can basically never undo */ false | Buffer(Clear | Set(_)) + | Copy | Move(_) - | MoveToNextHole(_) | Jump(_) | Select(_) | Unselect(_) | RotateBackpack | MoveToBackpackTarget(_) => false + | Cut | Buffer(Accept) | Paste(_) | Reparse diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index f7b8b71544..1842dfb504 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -5,12 +5,13 @@ let is_write_action = (a: Action.t) => { switch (a) { | RecalcStatics | Project(_) => false //TODO(andrew): revisit + | Copy | Move(_) - | MoveToNextHole(_) | Unselect(_) | Jump(_) | Select(_) => false | Buffer(Set(_) | Clear | Accept) + | Cut | Paste(_) | Reparse | Destruct(_) @@ -76,6 +77,13 @@ let rec go_z = | None => Error(CantPaste) | Some(z) => Ok(z) } + | Cut => + /* System clipboard handling is done in Page.view handlers */ + go_z(~settings, ~meta, Destruct(Left), z) + | Copy => + /* System clipboard handling itself is done in Page.view handlers. + * This doesn't change state but is included here for logging purposes */ + Ok(z) | Reparse => switch (Printer.reparse(z)) { | None => Error(CantReparse) @@ -125,7 +133,7 @@ let rec go_z = [ Paste(AssistantExpander.trim(completion)), Move(Goal(Point(start))), - MoveToNextHole(Right), + Move(Goal(Piece(Grout, Right))), Move(Local(Left(ByToken))), ], ); @@ -146,9 +154,6 @@ let rec go_z = ) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) - | MoveToNextHole(d) => - Move.go(Goal(Piece(Grout, d)), z) - |> Result.of_option(~error=Action.Failure.Cant_move) | Jump(jump_target) => open OptUtil.Syntax; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index a9dcd59014..2c42ce2542 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -35,7 +35,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | (Up, "Escape") => now(Unselect(None)) | (Up, "Tab") => Some(TAB) | (Up, "F12") => now(Jump(BindingSiteOfIndicatedVar)) - | (Down, "Tab") => Some(MoveToNextHole(Left)) + | (Down, "Tab") => now(Move(Goal(Piece(Grout, Left)))) | (Down, "ArrowLeft") => now(Select(Resize(Local(Left(ByToken))))) | (Down, "ArrowRight") => now(Select(Resize(Local(Right(ByToken))))) | (Down, "ArrowUp") => now(Select(Resize(Local(Up)))) diff --git a/src/haz3lweb/Log.re b/src/haz3lweb/Log.re index 0ae5ea139d..c86a7f593d 100644 --- a/src/haz3lweb/Log.re +++ b/src/haz3lweb/Log.re @@ -23,11 +23,8 @@ let is_action_logged: UpdateAction.t => bool = | SwitchEditor(_) | ResetCurrentEditor | PerformAction(_) - | Cut - | Copy | Undo | Redo - | MoveToNextHole(_) | UpdateResult(_) | ToggleStepper(_) | StepperAction(_, StepForward(_) | StepBackward) diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index aace6b71eb..26cd7e00d1 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -418,18 +418,10 @@ let rec apply = Selection.is_buffer(z.selection) ? PerformAction(Buffer(Accept)) : Zipper.can_put_down(z) - ? PerformAction(Put_down) : MoveToNextHole(Right); + ? PerformAction(Put_down) + : PerformAction(Move(Goal(Piece(Grout, Right)))); apply(model, a, state, ~schedule_action); | PerformAction(a) => perform_action(model, a) - | Cut => - // system clipboard handling itself is done in Page.view handlers - perform_action(model, Destruct(Left)) - | Copy => - // system clipboard handling itself is done in Page.view handlers - // doesn't change the state but including as an action for logging purposes - Ok(model) - | MoveToNextHole(d) => - perform_action(model, Move(Goal(Piece(Grout, d)))) | Undo => let ed = Editors.get_editor(model.editors); switch (Haz3lcore.Editor.undo(ed)) { diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index c6a5c667dc..d694e8e5ba 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -70,11 +70,8 @@ type t = | TAB | Save | PerformAction(Action.t) - | Cut - | Copy | Undo | Redo - | MoveToNextHole(Direction.t) | Benchmark(benchmark_action) | ToggleStepper(ModelResults.Key.t) | StepperAction(ModelResults.Key.t, stepper_action) @@ -120,7 +117,6 @@ let is_edit: t => bool = | ShowBackpackTargets(_) | FontMetrics(_) => false } - | Cut | Undo | Redo | SwitchScratchSlide(_) @@ -135,12 +131,10 @@ let is_edit: t => bool = | SwitchEditor(_) | ExportPersistentData | Save - | Copy | UpdateExplainThisModel(_) | DebugConsole(_) | InitImportAll(_) | InitImportScratchpad(_) - | MoveToNextHole(_) | Benchmark(_) | TAB => false; @@ -176,9 +170,7 @@ let reevaluate_post_update: t => bool = | ShowBackpackTargets(_) | FontMetrics(_) => false } - | MoveToNextHole(_) | Save - | Copy | InitImportAll(_) | InitImportScratchpad(_) | UpdateExplainThisModel(_) @@ -196,7 +188,6 @@ let reevaluate_post_update: t => bool = | SwitchScratchSlide(_) | SwitchDocumentationSlide(_) | Reset - | Cut | Undo | Redo => true; @@ -234,16 +225,12 @@ let should_scroll_to_caret = | SwitchScratchSlide(_) | SwitchDocumentationSlide(_) | Reset - | Copy - | Cut | Undo | Redo - | MoveToNextHole(_) | TAB => true | PerformAction(a) => switch (a) { | Move(_) - | MoveToNextHole(_) | Jump(_) | Select(Resize(_) | Term(_) | Smart | Tile(_)) | Destruct(_) @@ -254,6 +241,8 @@ let should_scroll_to_caret = | MoveToBackpackTarget(_) | Buffer(Set(_) | Clear | Accept) | Paste(_) + | Copy + | Cut | Reparse => true | RecalcStatics | Project(_) From 0318247f6b2e60afa2d2390303312df5cb9dbd36 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 00:06:09 -0400 Subject: [PATCH 090/168] avoid the need for RecalcStatics action --- src/haz3lcore/zipper/Editor.re | 16 ++++++++++ src/haz3lcore/zipper/action/Perform.re | 41 ++++++++++++------------- src/haz3lweb/Editors.re | 23 +++----------- src/haz3lweb/Update.re | 42 ++++++++++++++------------ src/haz3lweb/UpdateAction.re | 2 +- 5 files changed, 63 insertions(+), 61 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 5305dbae7b..64365745f2 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -241,6 +241,22 @@ let new_state = {state, history, read_only: ed.read_only}; }; +let update_statics = (~settings: CoreSettings.t, ed: t): t => { + /* Use this function to force a statics update when (for example) + * changing the statics settings */ + let statics = Meta.mk_statics(~settings, ed.state.zipper); + { + ...ed, + state: { + ...ed.state, + meta: { + ...ed.state.meta, + statics, + }, + }, + }; +}; + let undo = (ed: t) => switch (ed.history) { | ([], _) => None diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 1842dfb504..f82aaff486 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -280,37 +280,34 @@ let rec go_z = Move.to_backpack_target(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) }; -}; - -let go_base = +} +and go_history = (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) - : Action.Result.t(Editor.t) => - /* This function enforces read-only editors and - * is responsible for mainting the action history */ - if (ed.read_only && is_write_action(a)) { - Result.Ok(ed); - } else { - open Result.Syntax; - let Editor.State.{zipper, meta} = ed.state; - Effect.s_clear(); - let+ z = go_z(~settings, ~meta, a, zipper); - Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); - }; - -let go = + : Action.Result.t(Editor.t) => { + open Result.Syntax; + /* This function is responsible for the action history */ + let Editor.State.{zipper, meta} = ed.state; + Effect.s_clear(); + let+ z = go_z(~settings, ~meta, a, zipper); + Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); +} +and go = (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) : Action.Result.t(Editor.t) => /* This function wraps assistant completions. If completions are enabled, * then beginning any action (other than accepting a completion) clears * the completion buffer before performing the action. Conversely, * after any edit action, a new completion is set in the buffer */ - if (settings.assist && settings.statics) { + if (ed.read_only && is_write_action(a)) { + Result.Ok(ed); + } else if (settings.assist && settings.statics) { open Result.Syntax; let* ed = - a == Buffer(Accept) ? Ok(ed) : go_base(~settings, Buffer(Clear), ed); - let* ed = go_base(~settings, a, ed); + a == Buffer(Accept) + ? Ok(ed) : go_history(~settings, Buffer(Clear), ed); + let* ed = go_history(~settings, a, ed); Action.is_edit(a) - ? go_base(~settings, Buffer(Set(TyDi)), ed) : Ok(ed); + ? go_history(~settings, Buffer(Set(TyDi)), ed) : Ok(ed); } else { - go_base(~settings, a, ed); + go_history(~settings, a, ed); }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index f448fee5f3..0c2343a2cb 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -41,24 +41,11 @@ let put_editor = (ed: Editor.t, eds: t): t => Exercises(n, specs, Exercise.put_editor(exercise, ed)) }; -//TODO(andrew): use or lose -// let update_editor = -// ( -// editors: t, -// ~f: Editor.t => Result.t(Zipper.t, 'b), -// ~settings, -// ~action, -// ~err: 'b => Result.t(t, 'c), -// ) -// : Result.t(t, 'c) => { -// let ed = get_editor(editors); -// switch (f(ed)) { -// | Error(e) => err(e) -// | Ok(z) => -// let ed = Editor.new_state(~settings, action, z, ed); -// Ok(put_editor(ed, editors)); -// }; -// }; +let update_editor = (f: Editor.t => Editor.t, editors: t): t => + put_editor(f(get_editor(editors)), editors); + +let update_current_editor_statics = settings => + update_editor(Editor.update_statics(~settings)); let get_zipper = (editors: t): Zipper.t => get_editor(editors).state.zipper; diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 26cd7e00d1..2237c53004 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -222,19 +222,22 @@ let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); + /* If we swtich editors, or change settings which require statics + * when statics was previously off, we may need updated statics */ + let non_edit_action_requiring_statics_refresh = + update_dynamics + && ( + switch (update) { + | PerformAction(_) => false + | _ => true + } + ); let m = - if (update_dynamics - && ( - switch (update) { - //TODO(andrew): explain or make better - | PerformAction(_) => false - | _ => true - } - )) { - print_endline("update_cached_data: performing RecalcStatics"); - switch (perform_action(m, RecalcStatics)) { - | Ok(m) => m - | Error(_) => failwith("ERROR: RecalcStatics failed") + if (non_edit_action_requiring_statics_refresh) { + { + ...m, + editors: + Editors.update_current_editor_statics(m.settings.core, m.editors), }; } else { m; @@ -317,9 +320,9 @@ let ui_state_update = }; }; -let rec apply = - (model: Model.t, update: t, state: State.t, ~schedule_action) - : Result.t(Model.t) => { +let apply = + (model: Model.t, update: t, _state: State.t, ~schedule_action) + : Result.t(Model.t) => { let m: Result.t(Model.t) = switch (update) { | Reset => Ok(Model.reset(model)) @@ -414,13 +417,12 @@ let rec apply = model.editors |> Editors.get_editor |> ((ed: Editor.t) => ed.state.zipper); - let a = + let action: Action.t = Selection.is_buffer(z.selection) - ? PerformAction(Buffer(Accept)) + ? Buffer(Accept) : Zipper.can_put_down(z) - ? PerformAction(Put_down) - : PerformAction(Move(Goal(Piece(Grout, Right)))); - apply(model, a, state, ~schedule_action); + ? Put_down : Move(Goal(Piece(Grout, Right))); + perform_action(model, action); | PerformAction(a) => perform_action(model, a) | Undo => let ed = Editors.get_editor(model.editors); diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index d694e8e5ba..063a59b7b6 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -143,7 +143,6 @@ let reevaluate_post_update: t => bool = | PerformAction(a) => Action.is_edit(a) | Set(s_action) => switch (s_action) { - | Assist | Captions | SecondaryIcons | ContextInspector @@ -159,6 +158,7 @@ let reevaluate_post_update: t => bool = false | Elaborate | Statics + | Assist | Dynamics | InstructorMode | Mode(_) => true From 23d6a78e7b51170b2d8e256bab76bf2a63e18cf7 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 00:11:22 -0400 Subject: [PATCH 091/168] eliminate RecalcStatics. re-evaluate on TAB --- src/haz3lcore/zipper/action/Action.re | 5 ----- src/haz3lcore/zipper/action/Perform.re | 4 ---- src/haz3lweb/UpdateAction.re | 9 ++++----- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 84ccedb9d8..138e615e2e 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -66,7 +66,6 @@ type buffer = [@deriving (show({with_path: false}), sexp, yojson)] type t = - | RecalcStatics /* Could refactor to SetInitCtx(ctx) */ | Reparse | Buffer(buffer) | Paste(string) @@ -105,7 +104,6 @@ module Result = { let is_edit: t => bool = fun - | RecalcStatics => true | Project(_) => true //TODO(andrew): revisit | Buffer(Accept | Clear | Set(_)) | Paste(_) @@ -126,9 +124,6 @@ let is_edit: t => bool = /* Determines whether undo/redo skips action */ let is_historic: t => bool = fun - | RecalcStatics => - /* If we add this to history, we can basically never undo */ - false | Buffer(Clear | Set(_)) | Copy | Move(_) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index f82aaff486..206f73eaef 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -3,7 +3,6 @@ open Zipper; let is_write_action = (a: Action.t) => { switch (a) { - | RecalcStatics | Project(_) => false //TODO(andrew): revisit | Copy | Move(_) @@ -141,9 +140,6 @@ let rec go_z = go_z(~meta, ~settings, Paste(AssistantExpander.trim(completion)), z) } } - | RecalcStatics => - print_endline("RecalcStatics action called"); - Ok(z); | Project(a) => ProjectorPerform.go( Move.jump_to_id, diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 063a59b7b6..343e0c8ca5 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -126,7 +126,8 @@ let is_edit: t => bool = | FinishImportAll(_) | FinishImportScratchpad(_) | ResetCurrentEditor - | Reset => true + | Reset + | TAB => true | UpdateResult(_) | SwitchEditor(_) | ExportPersistentData @@ -135,8 +136,7 @@ let is_edit: t => bool = | DebugConsole(_) | InitImportAll(_) | InitImportScratchpad(_) - | Benchmark(_) - | TAB => false; + | Benchmark(_) => false; let reevaluate_post_update: t => bool = fun @@ -178,8 +178,8 @@ let reevaluate_post_update: t => bool = | UpdateResult(_) | SwitchEditor(_) | DebugConsole(_) - | TAB | Benchmark(_) => false + | TAB | StepperAction(_, StepForward(_) | StepBackward) | ToggleStepper(_) | FinishImportAll(_) @@ -244,7 +244,6 @@ let should_scroll_to_caret = | Copy | Cut | Reparse => true - | RecalcStatics | Project(_) | Unselect(_) | Select(All) => false From bca3bbfdcc1fec22c45b36ca8f4a5dcb658c8423 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 00:59:28 -0400 Subject: [PATCH 092/168] consoldate editor put logic to Editors away from Update --- src/haz3lweb/DebugConsole.re | 7 +++---- src/haz3lweb/Editors.re | 22 +++++++++++++------- src/haz3lweb/Update.re | 40 +++++++++++++++--------------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/haz3lweb/DebugConsole.re b/src/haz3lweb/DebugConsole.re index 1216edba88..b0fbff375b 100644 --- a/src/haz3lweb/DebugConsole.re +++ b/src/haz3lweb/DebugConsole.re @@ -5,9 +5,8 @@ open Haz3lcore; dependency on the model, which is technically against architecture */ let print = ({settings, editors, _}: Model.t, key: string): unit => { - let z = Editors.get_zipper(editors); + let z = Editors.get_editor(editors).state.zipper; let print = str => str |> print_endline; - let settings = settings; let term = z => z |> MakeTerm.from_zip_for_view |> fst; let ctx_init = Editors.get_ctx_init(~settings, editors); switch (key) { @@ -24,8 +23,8 @@ let print = ({settings, editors, _}: Model.t, key: string): unit => { let env_init = Editors.get_env_init(~settings, editors); let (term, _) = MakeTerm.from_zip_for_sem(z); let info_map = Statics.mk(settings.core, ctx_init, term); - let d = Interface.elaborate(~settings=settings.core, info_map, term); - Interface.evaluate(~settings=settings.core, ~env=env_init, d) + Interface.elaborate(~settings=settings.core, info_map, term) + |> Interface.evaluate(~settings=settings.core, ~env=env_init) |> ProgramResult.show |> print; | "F6" => diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 0c2343a2cb..fd4a4754b1 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -41,13 +41,24 @@ let put_editor = (ed: Editor.t, eds: t): t => Exercises(n, specs, Exercise.put_editor(exercise, ed)) }; -let update_editor = (f: Editor.t => Editor.t, editors: t): t => - put_editor(f(get_editor(editors)), editors); +let update = (f: Editor.t => Editor.t, editors: t): t => + editors |> get_editor |> f |> put_editor(_, editors); + +let update_opt = (editors: t, f: Editor.t => option(Editor.t)): option(t) => + editors |> get_editor |> f |> Option.map(put_editor(_, editors)); + +let update_err = + (editors: t, f: Editor.t => Result.t(Editor.t, 'a)): Result.t(t, 'a) => { + open Result.Syntax; + let+ ed = f(get_editor(editors)); + put_editor(ed, editors); +}; let update_current_editor_statics = settings => - update_editor(Editor.update_statics(~settings)); + update(Editor.update_statics(~settings)); -let get_zipper = (editors: t): Zipper.t => get_editor(editors).state.zipper; +let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => + editors |> get_editor |> Editor.map_projectors(f) |> put_editor(_, editors); let get_ctx_init = (~settings as _: Settings.t, editors: t): Ctx.t => switch (editors) { @@ -152,6 +163,3 @@ let switch_example_slide = (editors: t, name: string): option(t) => None | Documentation(_, slides) => Some(Documentation(name, slides)) }; - -let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => - put_editor(editors |> get_editor |> Editor.map_projectors(f), editors); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 2237c53004..0fdb9004a7 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -212,14 +212,6 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => }; }; -let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { - let ed = Editors.get_editor(model.editors); - switch (Haz3lcore.Perform.go(~settings=model.settings.core, a, ed)) { - | Error(err) => Error(FailedToPerform(err)) - | Ok(ed) => Ok({...model, editors: Editors.put_editor(ed, model.editors)}) - }; -}; - let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); /* If we swtich editors, or change settings which require statics @@ -323,6 +315,15 @@ let ui_state_update = let apply = (model: Model.t, update: t, _state: State.t, ~schedule_action) : Result.t(Model.t) => { + let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { + switch ( + Haz3lcore.Perform.go(~settings=model.settings.core, a) + |> Editors.update_err(model.editors) + ) { + | Error(err) => Error(FailedToPerform(err)) + | Ok(editors) => Ok({...model, editors}) + }; + }; let m: Result.t(Model.t) = switch (update) { | Reset => Ok(Model.reset(model)) @@ -408,15 +409,12 @@ let apply = }; | TAB => /* Attempt to act intelligently when TAB is pressed. - * TODO(andrew): Consider more advanced TAB logic. Instead + * TODO: Consider more advanced TAB logic. Instead * of simply moving to next hole, if the backpack is non-empty * but can't immediately put down, move to next position of * interest, which is closet of: nearest position where can * put down, farthest position where can put down, next hole */ - let z = - model.editors - |> Editors.get_editor - |> ((ed: Editor.t) => ed.state.zipper); + let z = Editors.get_editor(model.editors).state.zipper; let action: Action.t = Selection.is_buffer(z.selection) ? Buffer(Accept) @@ -425,19 +423,15 @@ let apply = perform_action(model, action); | PerformAction(a) => perform_action(model, a) | Undo => - let ed = Editors.get_editor(model.editors); - switch (Haz3lcore.Editor.undo(ed)) { + switch (Editors.update_opt(model.editors, Editor.undo)) { | None => Error(CantUndo) - | Some(ed) => - Ok({...model, editors: Editors.put_editor(ed, model.editors)}) - }; + | Some(editors) => Ok({...model, editors}) + } | Redo => - let ed = Editors.get_editor(model.editors); - switch (Haz3lcore.Editor.redo(ed)) { + switch (Editors.update_opt(model.editors, Editor.redo)) { | None => Error(CantRedo) - | Some(ed) => - Ok({...model, editors: Editors.put_editor(ed, model.editors)}) - }; + | Some(editors) => Ok({...model, editors}) + } | Benchmark(Start) => List.iter(schedule_action, Benchmark.actions_1); Benchmark.start(); From cdc137120a25c998e3a804a4e3c4ee055dee221d Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 01:14:10 -0400 Subject: [PATCH 093/168] .. --- src/haz3lweb/Editors.re | 13 ++++++++----- src/haz3lweb/Update.re | 5 ++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index fd4a4754b1..9ecdb8a1ce 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -47,11 +47,14 @@ let update = (f: Editor.t => Editor.t, editors: t): t => let update_opt = (editors: t, f: Editor.t => option(Editor.t)): option(t) => editors |> get_editor |> f |> Option.map(put_editor(_, editors)); -let update_err = - (editors: t, f: Editor.t => Result.t(Editor.t, 'a)): Result.t(t, 'a) => { - open Result.Syntax; - let+ ed = f(get_editor(editors)); - put_editor(ed, editors); +let perform_action = + (~settings: CoreSettings.t, editors: t, a: Action.t) + : UpdateAction.Result.t(t) => { + let ed = Perform.go(~settings, a, get_editor(editors)); + switch (ed) { + | Error(err) => Error(FailedToPerform(err)) + | Ok(ed) => Ok(put_editor(ed, editors)) + }; }; let update_current_editor_statics = settings => diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 0fdb9004a7..b6dce9db7b 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -317,10 +317,9 @@ let apply = : Result.t(Model.t) => { let perform_action = (model: Model.t, a: Action.t): Result.t(Model.t) => { switch ( - Haz3lcore.Perform.go(~settings=model.settings.core, a) - |> Editors.update_err(model.editors) + Editors.perform_action(~settings=model.settings.core, model.editors, a) ) { - | Error(err) => Error(FailedToPerform(err)) + | Error(err) => Error(err) | Ok(editors) => Ok({...model, editors}) }; }; From 0039ae067108966257d93d62f80c5ddf090b5190 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 17:50:09 -0400 Subject: [PATCH 094/168] add float slider --- src/haz3lcore/statics/Statics.re | 4 +- src/haz3lcore/tiles/Piece.re | 9 ++++ src/haz3lcore/zipper/Projector.re | 7 +++ src/haz3lcore/zipper/ProjectorBase.re | 5 +- src/haz3lcore/zipper/projectors/SliderCore.re | 46 +++++-------------- .../zipper/projectors/SliderFCore.re | 35 ++++++++++++++ src/haz3lweb/view/ProjectorView.re | 2 + src/haz3lweb/www/style.css | 12 ++--- src/util/Web.re | 13 ++++++ 9 files changed, 88 insertions(+), 45 deletions(-) create mode 100644 src/haz3lcore/zipper/projectors/SliderFCore.re diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index 1be0626443..aa82c1e76b 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -909,8 +909,8 @@ let mk = }); let mk = (core: CoreSettings.t, ctx, exp) => { //TODO(andrew): document or rm - let exp = - EditorUtil.append_exp(exp, {ids: [Id.ctx_sentinel], term: EmptyHole}); + // let exp = + // EditorUtil.append_exp(exp, {ids: [Id.ctx_sentinel], term: EmptyHole}); print_endline("RETICULATING STATICS"); //TODO(andrew): rm core.statics ? mk(ctx, exp) : Id.Map.empty; }; diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 68c08a0a14..a88e59bce5 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -169,3 +169,12 @@ let mk_tile: (Form.t, list(list(t))) => t = shards: List.mapi((i, _) => i, form.label), children, }); + +let mk_mono = (sort: Sort.t, string: string): t => + string |> Form.mk_atomic(sort) |> mk_tile(_, []); + +let of_mono = (syntax: t): option(string) => + switch (syntax) { + | Tile({label: [l], _}) => Some(l) + | _ => None + }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index c16a57a0d2..9555a17675 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -10,6 +10,7 @@ type kind = | Infer | Checkbox | Slider + | SliderF | TextArea; let to_module = (p: projector): core => @@ -18,6 +19,7 @@ let to_module = (p: projector): core => | Infer(model) => InferCore.mk(model) | Checkbox(model) => CheckboxCore.mk(model) | Slider(model) => SliderCore.mk(model) + | SliderF(model) => SliderFCore.mk(model) | TextArea(model) => TextAreaCore.mk(model) }; @@ -27,6 +29,7 @@ let kind = (p: t): kind => | Infer(_) => Infer | Checkbox(_) => Checkbox | Slider(_) => Slider + | SliderF(_) => SliderF | TextArea(_) => TextArea }; @@ -45,6 +48,7 @@ let init = (f: kind): projector => | Infer => Infer({expected_ty: None}) | Checkbox => Checkbox() | Slider => Slider() + | SliderF => SliderF() | TextArea => TextArea({inside: false}) }; @@ -54,15 +58,18 @@ let name_of_kind = (p: kind): string => | Infer => "type" | Checkbox => "check" | Slider => "slide" + | SliderF => "slidef" | TextArea => "text" }; +/* Needs to be 1-to-1 for menu selection */ let of_name = (p: string): kind => switch (p) { | "fold" => Fold | "type" => Infer | "check" => Checkbox | "slide" => Slider + | "slidef" => SliderF | "text" => TextArea | _ => failwith("Unknown projector kind") }; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 6c491d6664..4a3d0d1fcc 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -5,12 +5,14 @@ open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] type fold = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; +type infer = {expected_ty: option(Typ.t)}; //TODO(andrew): rf [@deriving (show({with_path: false}), sexp, yojson)] type checkbox = unit; [@deriving (show({with_path: false}), sexp, yojson)] type slider = unit; [@deriving (show({with_path: false}), sexp, yojson)] +type sliderf = unit; +[@deriving (show({with_path: false}), sexp, yojson)] type textarea = {inside: bool}; //TODO(andrew): rm [@deriving (show({with_path: false}), sexp, yojson)] @@ -19,6 +21,7 @@ type projector = | Infer(infer) | Checkbox(checkbox) | Slider(slider) + | SliderF(sliderf) | TextArea(textarea); [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 3b250b798e..e2f801907d 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,56 +1,32 @@ -// open Sexplib.Std; -// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; -let of_mono = (syntax: Piece.t): option(string) => - switch (syntax) { - | Tile({label: [l], _}) => Some(l) - | _ => None - }; - -let mk_mono = (sort: Sort.t, string: string): Piece.t => - string |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); - -let state_of = (piece: Piece.t): option(int) => - piece |> of_mono |> Util.OptUtil.and_then(int_of_string_opt); +let put: string => Piece.t = Piece.mk_mono(Exp); -let put = (new_val: string): Piece.t => mk_mono(Exp, new_val); +let get_opt = (piece: Piece.t): option(int) => + piece |> Piece.of_mono |> Util.OptUtil.and_then(int_of_string_opt); -let get = (piece: Piece.t): int => - switch (state_of(piece)) { +let get = (piece: Piece.t): string => + switch (get_opt(piece)) { | None => failwith("ERROR: Slider: not integer literal") - | Some(s) => s + | Some(s) => string_of_int(s) }; let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => - Node.input( - ~attrs=[ - Attr.create("type", "range"), - Attr.create("value", string_of_int(get(info.syntax))), - Attr.on_input((_evt, new_val) => - inject(UpdateSyntax(_ => put(new_val))) - ), - ], - (), + Util.Web.range( + ~attrs=[Attr.on_input((_, v) => inject(UpdateSyntax(_ => put(v))))], + get(info.syntax), ); -let keymap = (_, key: Key.t): option(ProjectorBase.action) => - switch (key) { - | {key: D("Escape"), _} => Some(Remove) - | _ => None - }; - let mk = (model): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] type model = slider; let model = model; - let can_project = p => state_of(p) != None; + let can_project = p => get_opt(p) != None; let placeholder = _ => Inline(10); - // let auto_update = _ => Slider(model); let update = _ => Slider(model); let view = view; - let keymap = keymap; + let keymap = (_, _) => None; }); diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re new file mode 100644 index 0000000000..8d098907f1 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -0,0 +1,35 @@ +open Virtual_dom.Vdom; +open ProjectorBase; + +/* Some decimal places necessary to avoid becoming an int */ +let float_of_float = s => s |> float_of_string |> Printf.sprintf("%.2f"); + +let put = (s: string): Piece.t => s |> float_of_float |> Piece.mk_mono(Exp); + +let get_opt = (piece: Piece.t): option(float) => + piece |> Piece.of_mono |> Util.OptUtil.and_then(float_of_string_opt); + +let get = (piece: Piece.t): float => + switch (get_opt(piece)) { + | None => failwith("ERROR: Slider: not float literal") + | Some(s) => s + }; + +let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + Util.Web.range( + ~attrs=[Attr.on_input((_, v) => inject(UpdateSyntax(_ => put(v))))], + info.syntax |> get |> Printf.sprintf("%.2f"), + ); + +let mk = (model): core => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = slider; + let model = model; + let can_project = p => get_opt(p) != None; + let placeholder = _ => Inline(10); + let update = _ => Slider(model); + let view = view; + let keymap = (_, _) => None; + }); diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 7d53d07ff8..9c9b9b7f61 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -195,6 +195,8 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => | Pat(Bool) => [Checkbox] | Exp(Int) | Pat(Int) => [Slider] + | Exp(Float) + | Pat(Float) => [SliderF] | Exp(String) | Pat(String) => [TextArea] | _ => [] diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index fa05b7bc6d..9b931bb505 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -763,7 +763,6 @@ select { align-items: start; display: flex; border-left: 2px solid #0000; - /* border-right: 2px solid #0000; */ margin-left: -2px; margin-right: -2px; } @@ -771,17 +770,14 @@ select { position: relative; border-right: 2px solid red; animation: 1s blink_border_right step-end infinite; - /* right: 2px; */ } .projector.text .cols.indicated.right { position: relative; border-left: 2px solid red; animation: 1s blink_border_left step-end infinite; - /* right: 2px; */ } .projector.text textarea { - /* filter: sepia(1); */ resize: none; height: 100%; width: 100%; @@ -806,12 +802,14 @@ select { background-color: var(--selection-color); } -/* PROJECTOR: SLIDER */ +/* PROJECTOR: SLIDERS (INT & FLOAT) */ -.projector.slide .projector-wrapper { +.projector.slide .projector-wrapper, +.projector.slidef .projector-wrapper { width: 95%; } -.projector.slide input { +.projector.slide input, +.projector.slidef input { margin: 0; width: 100%; filter: sepia(1); diff --git a/src/util/Web.re b/src/util/Web.re index f3c1e3e67d..9b81f63302 100644 --- a/src/util/Web.re +++ b/src/util/Web.re @@ -12,3 +12,16 @@ let div_if = (p, ats, ns) => p ? div(~attrs=[ats], ns) : div_empty; let span_if = (p, ats, ns) => p ? span(~attrs=[ats], ns) : span([]); let unless = (p, a) => p ? Effect.Many([]) : a; + +let range = (~attrs=[], ~min="0", ~max="100", value) => + Node.input( + ~attrs= + [ + Attr.create("type", "range"), + Attr.create("value", value), + Attr.create("max", max), + Attr.create("min", min), + ] + @ attrs, + (), + ); From d2a20cc36249db5f8dd2fe59b705bffc84ba5078 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 18:41:52 -0400 Subject: [PATCH 095/168] rn infer proj to info. click to switch between expected and self type displays --- src/haz3lcore/zipper/Projector.re | 21 ++--- src/haz3lcore/zipper/ProjectorBase.re | 6 +- src/haz3lcore/zipper/Zipper.re | 2 +- src/haz3lcore/zipper/projectors/FoldCore.re | 7 +- src/haz3lcore/zipper/projectors/InferCore.re | 55 -------------- src/haz3lcore/zipper/projectors/InfoCore.re | 80 ++++++++++++++++++++ src/haz3lweb/Keyboard.re | 2 +- src/haz3lweb/view/Page.re | 26 ++++--- src/haz3lweb/view/ProjectorView.re | 2 +- 9 files changed, 109 insertions(+), 92 deletions(-) delete mode 100644 src/haz3lcore/zipper/projectors/InferCore.re create mode 100644 src/haz3lcore/zipper/projectors/InfoCore.re diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 9555a17675..6672296b0a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -7,7 +7,7 @@ type t = projector; [@deriving (show({with_path: false}), sexp, yojson)] type kind = | Fold - | Infer + | Info | Checkbox | Slider | SliderF @@ -16,7 +16,7 @@ type kind = let to_module = (p: projector): core => switch ((p: projector)) { | Fold(model) => FoldCore.mk(model) - | Infer(model) => InferCore.mk(model) + | Info(model) => InfoCore.mk(model) | Checkbox(model) => CheckboxCore.mk(model) | Slider(model) => SliderCore.mk(model) | SliderF(model) => SliderFCore.mk(model) @@ -26,26 +26,17 @@ let to_module = (p: projector): core => let kind = (p: t): kind => switch (p) { | Fold(_) => Fold - | Infer(_) => Infer + | Info(_) => Info | Checkbox(_) => Checkbox | Slider(_) => Slider | SliderF(_) => SliderF | TextArea(_) => TextArea }; -// let init = (f: kind): core => -// switch (f) { -// | Fold => FoldCore.mk() -// | Infer => InferCore.mk({expected_ty: None}) -// | Checkbox => CheckboxCore.mk() -// | Slider => SliderCore.mk() -// | TextArea => TextAreaCore.mk({inside: false}) -// }; - let init = (f: kind): projector => switch (f) { | Fold => Fold() - | Infer => Infer({expected_ty: None}) + | Info => Info(Expected) | Checkbox => Checkbox() | Slider => Slider() | SliderF => SliderF() @@ -55,7 +46,7 @@ let init = (f: kind): projector => let name_of_kind = (p: kind): string => switch (p) { | Fold => "fold" - | Infer => "type" + | Info => "type" | Checkbox => "check" | Slider => "slide" | SliderF => "slidef" @@ -66,7 +57,7 @@ let name_of_kind = (p: kind): string => let of_name = (p: string): kind => switch (p) { | "fold" => Fold - | "type" => Infer + | "type" => Info | "check" => Checkbox | "slide" => Slider | "slidef" => SliderF diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 4a3d0d1fcc..ed42e5dbfe 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -5,7 +5,9 @@ open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] type fold = unit; [@deriving (show({with_path: false}), sexp, yojson)] -type infer = {expected_ty: option(Typ.t)}; //TODO(andrew): rf +type infer = + | Expected + | Self; [@deriving (show({with_path: false}), sexp, yojson)] type checkbox = unit; [@deriving (show({with_path: false}), sexp, yojson)] @@ -18,7 +20,7 @@ type textarea = {inside: bool}; //TODO(andrew): rm [@deriving (show({with_path: false}), sexp, yojson)] type projector = | Fold(fold) - | Infer(infer) + | Info(infer) | Checkbox(checkbox) | Slider(slider) | SliderF(sliderf) diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 862a1bcc34..32be6b7fb5 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -334,7 +334,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * of the placeholder as e.g. an int for the slider */ p | Some(pr) => - //TODO(andrew): figure out if ci None below will causes problems with eg Infer + //TODO(andrew): figure out if ci None below will causes problems with eg Info Projector.placeholder(pr, {syntax: p, status: None, ci: None}) | None => p }; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index b8ff993594..43d4e49bb0 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,18 +1,15 @@ -open Sexplib.Std; -open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open ProjectorBase; open Virtual_dom.Vdom; open Node; -let mk = (_model: fold): core => +let mk = (_: fold): core => (module { [@deriving (show({with_path: false}), sexp, yojson)] - type model = unit; + type model = fold; let model = (); let can_project = _ => true; let placeholder = _ => Inline(2); - // let auto_update = _ => Fold(); let update = _ => Fold(); let view = (~info as _, ~inject) => div( diff --git a/src/haz3lcore/zipper/projectors/InferCore.re b/src/haz3lcore/zipper/projectors/InferCore.re deleted file mode 100644 index 7c71a51c6d..0000000000 --- a/src/haz3lcore/zipper/projectors/InferCore.re +++ /dev/null @@ -1,55 +0,0 @@ -// open Sexplib.Std; -// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; -open Virtual_dom.Vdom; -open Node; -open ProjectorBase; - -let display_ty = (expected_ty: option(Typ.t)): Typ.t => - switch (expected_ty) { - | Some(expected_ty) => expected_ty - | None => Unknown(Internal) - }; - -let expected_ty = (info: option(Info.t)) => - switch (info) { - | Some(InfoExp({mode, _}) | InfoPat({mode, _})) => Mode.ty_of(mode) - | _ => Unknown(Internal) - }; - -let display = expected_ty => - "⋱ ⇐ " ++ (expected_ty |> display_ty |> Typ.pretty_print); - -let mk = (model: infer): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = infer; - let model = model; - - let can_project = (p: Piece.t): bool => - switch (p) { - | Tile(t) => t.mold.out == Exp || t.mold.out == Pat - | _ => false - }; - - let placeholder = (info: ProjectorBase.info) => - Inline((Some(expected_ty(info.ci)) |> display |> String.length) - 2); - - // let auto_update = ({ci, _}) => { - // print_endline("updating infer projector"); - // Infer({expected_ty: Some(expected_ty(Some(ci)))}); - // }; - let update = _ => Infer(model); - - let view = (~info: ProjectorBase.info, ~inject) => - div( - ~attrs=[Attr.on_double_click(_ => inject(Remove))], - [text(display(Some(expected_ty(info.ci))))], - ); - - let keymap = (_, key: Key.t): option(ProjectorBase.action) => - switch (key) { - | {key: D("Escape"), _} => Some(Remove) - | _ => None - }; - }); diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re new file mode 100644 index 0000000000..ffba1d0608 --- /dev/null +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -0,0 +1,80 @@ +open Virtual_dom.Vdom; +open Node; +open ProjectorBase; + +type inner_action += + | ToggleDisplay; + +let mode = (info: option(Info.t)): option(Mode.t) => + switch (info) { + | Some(InfoExp({mode, _})) + | Some(InfoPat({mode, _})) => Some(mode) + | _ => None + }; + +let expected_ty = (info: option(Info.t)): option(Typ.t) => + switch (mode(info)) { + | Some(mode) => Some(Mode.ty_of(mode)) + | _ => None + }; + +let self_ty = (info: option(Info.t)): option(Typ.t) => + switch (info) { + | Some(InfoExp({self, ctx, _})) => Self.typ_of_exp(ctx, self) + | Some(InfoPat({self, ctx, _})) => Self.typ_of_pat(ctx, self) + | _ => None + }; + +let display_ty = (expected_ty: option(Typ.t)): Typ.t => + switch (expected_ty) { + | Some(expected_ty) => expected_ty + | None => Unknown(Internal) + }; + +let syn_display = info => + "⋱ ⇒ " ++ (info |> self_ty |> display_ty |> Typ.pretty_print); + +let ana_display = info => + "⋱ ⇐ " ++ (info |> expected_ty |> display_ty |> Typ.pretty_print); + +let display = (model: infer, info) => + switch (model) { + | _ when mode(info) == Some(Syn) => syn_display(info) + | Self => syn_display(info) + | Expected => ana_display(info) + }; + +let mk = (model: infer): core => + (module + { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = infer; + let model = model; + + let can_project = (p: Piece.t): bool => + switch (Piece.sort(p)) { + | (Exp | Pat, _) => true + | _ => false + }; + + let placeholder = (info: ProjectorBase.info) => + Inline((display(model, info.ci) |> String.length) - 2); + + let update = (a: inner_action) => + switch (a, model) { + | (ToggleDisplay, Expected) => Info(Self) + | (ToggleDisplay, Self) => Info(Expected) + | _ => Info(model) + }; + + let view = (~info: ProjectorBase.info, ~inject) => + div( + ~attrs=[ + Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay))), + //Attr.on_double_click(_ => inject(Remove)), + ], + [text(display(model, info.ci))], + ); + + let keymap = (_, _): option(_) => None; + }); diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 2c42ce2542..c6ff1951b1 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -110,7 +110,7 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => switch (key) { | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold)))) - | "†" => Some(PerformAction(Project(ToggleIndicated(Infer)))) + | "†" => Some(PerformAction(Project(ToggleIndicated(Info)))) | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox)))) | "ß" => Some(PerformAction(Project(ToggleIndicated(Slider)))) | "∑" => Some(PerformAction(Project(ToggleIndicated(TextArea)))) diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index af02050c33..f0e1589b3a 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -78,21 +78,17 @@ let main_view = {settings, editors, explainThisModel, results, ui_state, _}: Model.t, ) => { let editor = Editors.get_editor(editors); - let common = () => { - let cursor_info = - Indicated.ci_of( - editor.state.zipper, - editor.state.meta.statics.info_map, - ); - let highlights = - ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); - (cursor_info, highlights); - }; let (editors_view, cursor_info) = switch (editors) { | Scratch(idx, _) => let result_key = ScratchSlide.scratch_key(string_of_int(idx)); - let (cursor_info, highlights) = common(); + let cursor_info = + Indicated.ci_of( + editor.state.zipper, + editor.state.meta.statics.info_map, + ); + let highlights = + ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); let view = ScratchMode.view( ~inject, @@ -106,7 +102,13 @@ let main_view = (view, cursor_info); | Documentation(name, _) => let result_key = ScratchSlide.scratch_key(name); - let (cursor_info, highlights) = common(); + let cursor_info = + Indicated.ci_of( + editor.state.zipper, + editor.state.meta.statics.info_map, + ); + let highlights = + ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); let info = SlideContent.get_content(editors) |> Option.map(i => div(~attrs=[Attr.id("slide")], [i])) diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 9c9b9b7f61..e50722e004 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -206,7 +206,7 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => @ ( switch (ci) { | InfoExp(_) - | InfoPat(_) => [Infer] + | InfoPat(_) => [Info] | _ => [] } ); From a15a80f42ed4a6a1556b1322d4f512a2545bcd52 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 11 Jul 2024 20:48:52 -0400 Subject: [PATCH 096/168] projector selection styling --- src/haz3lcore/tiles/Segment.re | 8 ++ src/haz3lcore/zipper/Editor.re | 25 +++++-- src/haz3lcore/zipper/Projector.re | 13 ---- src/haz3lcore/zipper/ProjectorBase.re | 11 +-- src/haz3lcore/zipper/Selection.re | 8 +- .../zipper/projectors/TextAreaCore.re | 6 +- src/haz3lweb/view/Code.re | 3 +- src/haz3lweb/view/Deco.re | 17 +---- src/haz3lweb/view/ProjectorView.re | 73 ++++++++++++------- src/haz3lweb/view/dec/DecUtil.re | 7 +- src/haz3lweb/view/dec/PieceDec.re | 9 ++- src/haz3lweb/www/style.css | 66 ++++++++++------- 12 files changed, 133 insertions(+), 113 deletions(-) diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 9895943d2d..bf1acb79c9 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -766,3 +766,11 @@ let push_left = ((ls: t, rs: t)): (t, t) => | [r, ...rs] => (ls @ [r], rs) | [] => (ls, rs) }; + +let rec ids = (s: t): list(Id.t) => List.concat_map(ids_of_piece, s) +and ids_of_piece = (p: Piece.t): list(Id.t) => + switch (p) { + | Tile(t) => [Piece.id(p), ...ids(List.concat(t.children))] + | Grout(_) + | Secondary(_) => [Piece.id(p)] + }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 64365745f2..bb1bb5d225 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -36,13 +36,13 @@ module Meta = { terms: TermMap.t, tiles: TileMap.t, holes: list(Grout.t), - buffer_ids: list(Id.t), syntax_map: Id.Map.t(Piece.t), }; type t = { col_target: int, touched: Touched.t, + selection_ids: list(Id.t), statics: CachedStatics.t, projected, }; @@ -59,7 +59,6 @@ module Meta = { tiles: TileMap.mk(segment), holes: Segment.holes(segment), measured: Measured.of_segment(segment), - buffer_ids: Selection.buffer_ids(z_projected.z.selection), syntax_map: z_projected.syntax_map, }; }; @@ -71,7 +70,13 @@ module Meta = { let statics = mk_statics(~settings, z); let projected = Projector.Project.go(z, statics.info_map) |> init_projected; - {col_target: 0, touched: Touched.empty, statics, projected}; + { + col_target: 0, + touched: Touched.empty, + selection_ids: Selection.selection_ids(projected.z.selection), + statics, + projected, + }; }; module type S = { @@ -108,7 +113,6 @@ module Meta = { term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), - buffer_ids: Selection.buffer_ids(z_projected.z.selection), syntax_map: z_projected.syntax_map, }; }; @@ -130,14 +134,15 @@ module Meta = { let next = ( - ~effects: list(Effect.t)=[], + ~effects as _: list(Effect.t)=[], ~settings: CoreSettings.t, a: Action.t, z: Zipper.t, meta: t, ) : t => { - let touched = Touched.update(Time.tick(), effects, meta.touched); + //TODO(andrew): remove or reinstate touched/effects + let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); let col_target = switch (a) { | Move(Local(Up | Down)) @@ -152,7 +157,13 @@ module Meta = { | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; - {touched, col_target, projected, statics}; + { + touched, + col_target, + projected, + selection_ids: Selection.selection_ids(projected.z.selection), + statics, + }; }; }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 6672296b0a..9b014f3bbc 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -67,19 +67,6 @@ let of_name = (p: string): kind => let name = (p: t): string => p |> kind |> name_of_kind; -let status_and_id = (z: ZipperBase.t) => - //TODO(andrew): add Selected, Focused (maybe) - switch (Indicated.piece(z)) { - | Some((p, d, _)) => Some((Piece.id(p), Indicated(d))) - | None => None - }; - -let status = (z: ZipperBase.t): option(status) => - switch (status_and_id(z)) { - | Some((_, status)) => Some(status) - | None => None - }; - let shape = (p: t, syntax): shape => { let (module P) = to_module(p); P.placeholder(syntax); diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index ed42e5dbfe..dd23322afe 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -45,8 +45,7 @@ type shape = [@deriving (show({with_path: false}), sexp, yojson)] type status = - | Indicated(Util.Direction.t) - | Selected; + | Indicated(Util.Direction.t); [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; @@ -72,14 +71,6 @@ type info = { ci: option(Info.t), }; -let cls = (indicated: option(status)) => - switch (indicated) { - | Some(Indicated(Left)) => ["indicated", "left"] - | Some(Indicated(Right)) => ["indicated", "right"] - | Some(Selected) => ["selected"] - | None => [] - }; - module type Core = { [@deriving (show({with_path: false}), sexp, yojson)] type model; diff --git a/src/haz3lcore/zipper/Selection.re b/src/haz3lcore/zipper/Selection.re index 20599154c6..826dd64873 100644 --- a/src/haz3lcore/zipper/Selection.re +++ b/src/haz3lcore/zipper/Selection.re @@ -31,13 +31,7 @@ let is_buffer: t => bool = | {mode: Buffer(_), _} => true | _ => false; -let buffer_ids = (sel: t): list(Id.t) => { - /* Collect ids of tokens in buffer for styling purposes. This is - * currently necessary as the selection is not persisted through - * unzipping for display */ - let buffer = is_buffer(sel) ? sel.content : []; - Id.Map.bindings(Measured.of_segment(buffer).tiles) |> List.map(fst); -}; +let selection_ids = (sel: t): list(Id.t) => Segment.ids(sel.content); let empty = mk(Segment.empty); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 7de9bd117f..7d46148ad0 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -64,6 +64,7 @@ let textarea = ); let n_of = (n: int) => + //• [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); @@ -71,9 +72,10 @@ let view = (model: textarea, ~selector, ~info, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[ - Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), + Attr.classes(["cols"] @ (model.inside ? ["inside"] : [])), + // Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), ], - n_of(1 + Util.StringUtil.num_linebreaks(text)) + n_of(Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); }; diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index e48820bfaa..5e8dcc3182 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -172,7 +172,7 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - {projected: {measured, buffer_ids, segment, holes, _}, _}: Editor.Meta.t, + {projected: {z, measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, ) : Node.t => { module Text = @@ -180,6 +180,7 @@ let view = let map = measured; let settings = settings; }); + let buffer_ids = Selection.is_buffer(z.selection) ? selection_ids : []; let code = Text.of_segment(buffer_ids, false, sort, segment); let holes = List.map(of_hole(~measured, ~font_metrics), holes); div( diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 08909322d9..01a5b1f8c1 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -23,13 +23,7 @@ module Deco = (M: { let caret = (z: Zipper.t): list(Node.t) => /* Projectors can override adjacent carets */ - switch ( - ProjectorView.caret( - z, - M.meta.projected.syntax_map, - M.meta.statics.info_map, - ) - ) { + switch (ProjectorView.caret(z, M.meta)) { | Some(caret) => caret | None => base_caret(z) }; @@ -377,14 +371,7 @@ module Deco = (M: { let always = (~inject) => List.concat([ err_holes(), - ProjectorView.view_all( - M.meta.projected.z, - ~syntax_map=M.meta.projected.syntax_map, - ~info_map=M.meta.statics.info_map, - ~inject, - ~font_metrics, - ~measured=M.meta.projected.measured, - ), + ProjectorView.view_all(~meta=M.meta, ~inject, ~font_metrics), ]); let all = (~inject) => diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index e50722e004..2df7ad336a 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -41,21 +41,33 @@ let backing_deco = | Block(_) => div([]) }; +let cls = (indicated: option(status), selected) => + (selected ? ["selected"] : []) + @ ( + switch (indicated) { + | Some(Indicated(Left)) => ["indicated", "left"] + | Some(Indicated(Right)) => ["indicated", "right"] + | None => [] + } + ); + let view_inner = ( ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~status: option(Projector.status), ~info: info, + ~selected: bool, p: Projector.t, view: Node.t, - ) => + ) => { + let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; div( ~attrs=[ Attr.classes( - ["projector", Projector.name(p)] @ Projector.cls(status), + ["projector", Projector.name(p)] @ cls(status, selected), ), - DecUtil.abs_style(measurement, ~font_metrics), + DecUtil.abs_style(measurement, ~fudge, ~font_metrics), ], [ div( @@ -68,24 +80,22 @@ let view_inner = backing_deco(~font_metrics, ~measurement, ~info, p), ], ); +}; let view_setup = ( id: Id.t, - ps: Map.t, - ~syntax_map: Id.Map.t(syntax), - ~info_map: Statics.Map.t, - ~measured: Measured.t, + ~meta: Editor.Meta.t, ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, ~status: option(Projector.status), ) : option(Node.t) => { - let* p = Projector.Map.find(id, ps); - let* syntax = Id.Map.find_opt(id, syntax_map); - let ci = Id.Map.find_opt(id, info_map); + let* p = Projector.Map.find(id, meta.projected.z.projectors); + let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); + let ci = Id.Map.find_opt(id, meta.statics.info_map); let info = {ci, syntax, status}; - let+ measurement = Measured.find_by_id(id, measured); + let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p); let inject = a => handle(id, a) |> inject; view_inner( @@ -93,17 +103,28 @@ let view_setup = ~measurement, ~status, ~info, + ~selected=List.mem(id, meta.selection_ids), p, P.view(~info, ~inject), ); }; +let status_and_id = (z: ZipperBase.t) => + //TODO(andrew): add Selected, Focused (maybe) + switch (Indicated.piece(z)) { + | Some((p, d, _)) => Some((Piece.id(p), Indicated(d))) + | None => None + }; + +let status = (z: ZipperBase.t): option(status) => + switch (status_and_id(z)) { + | Some((_, status)) => Some(status) + | None => None + }; + let view_all = ( - z: Zipper.t, - ~info_map: Statics.Map.t, - ~syntax_map: Id.Map.t(syntax), - ~measured: Measured.t, + ~meta: Editor.Meta.t, ~inject: Action.project => Ui_effect.t(unit), ~font_metrics, ) => @@ -111,20 +132,17 @@ let view_all = ((id, _)) => { view_setup( id, - z.projectors, - ~syntax_map, - ~info_map, - ~measured, + ~meta, ~inject, ~font_metrics, ~status= - switch (Projector.status_and_id(z)) { + switch (status_and_id(meta.projected.z)) { | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) | _ => None }, ) }, - Id.Map.bindings(z.projectors), + Id.Map.bindings(meta.projected.z.projectors), ); let indicated_proj_z = (z: Zipper.t) => { @@ -154,18 +172,17 @@ let id = (editor: Editor.t) => { }; }; -let shape_from_map = (z, syntax_map, info_map): option(shape) => { +let shape_from_map = (z, meta: Editor.Meta.t): option(shape) => { let* id = Indicated.index(z); - let* syntax = Id.Map.find_opt(id, syntax_map); - let ci = Id.Map.find_opt(id, info_map); - let status = Projector.status(z); + let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); + let ci = Id.Map.find_opt(id, meta.statics.info_map); + let status = status(z); let info = {syntax, status, ci}; shape(z, info); }; -let caret = - (z: Zipper.t, syntax_map, info_map: Statics.Map.t): option(list(Node.t)) => - switch (shape_from_map(z, syntax_map, info_map)) { +let caret = (z: Zipper.t, meta: Editor.Meta.t): option(list(Node.t)) => + switch (shape_from_map(z, meta)) { | None => None | Some(Inline(_)) => None | Some(Block(_)) => Some([]) diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 681ddd671d..985e50e5ac 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -66,8 +66,11 @@ let abs_dims = ({origin, last}: Haz3lcore.Measured.measurement): dims => { height: abs(last.row - origin.row + 1), }; -let abs_style = (~font_metrics, measurement): Attr.t => - Attr.create("style", pos_str(~d=abs_dims(measurement), font_metrics)); +let abs_style = (~font_metrics, ~fudge: fdims=fzero, measurement): Attr.t => + Attr.create( + "style", + pos_str(~d=abs_dims(measurement), ~fudge, font_metrics), + ); let code_svg_sized = ( diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 15f5eadeac..3273369c4d 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -72,6 +72,13 @@ let relative_shard = let convex_shard = relative_shard(~shapes=(Convex, Convex)); +let selection_fudge: DecUtil.fdims = { + height: 0.3, + top: 0., + width: 0., + left: 0., +}; + let simple_shard_selected = (~font_metrics, ~shapes, ~measurement: Measured.measurement, ~buffer): t => { let path_cls = [ @@ -82,7 +89,7 @@ let simple_shard_selected = let base_cls = ["tile-selected"]; simple_shard( /* Increase height slightly to avoid leaving spaces between selected lines */ - ~fudge={height: 0.3, top: 0., width: 0., left: 0.}, + ~fudge=selection_fudge, ~font_metrics, ~shapes, ~path_cls, diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 9b931bb505..bbea6917ab 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -680,7 +680,7 @@ select { .projector { position: absolute; - + display: flex; justify-content: center; align-items: center; @@ -740,42 +740,53 @@ select { /* PROJECTOR: TEXTAREA */ .projector.text { - display: flex; - justify-content: left; - align-items: start; } .projector.text .projector-wrapper { height: 100%; width: 100%; - display: flex; - justify-content: start; - align-items: start; -} - -.projector.text .cols { border-radius: 0.1em; - outline: 0.3px solid #a69460; - background-color: #e0d1b7; - color: #f0e7d6; - height: 100%; - width:100%; - align-items: start; - display: flex; border-left: 2px solid #0000; + border-right: 2px solid #0000; margin-left: -2px; margin-right: -2px; } -.projector.text .cols.indicated.left { - position: relative; +.projector.text.indicated.left .projector-wrapper { border-right: 2px solid red; animation: 1s blink_border_right step-end infinite; } -.projector.text .cols.indicated.right { - position: relative; +.projector.text.indicated.right .projector-wrapper { border-left: 2px solid red; animation: 1s blink_border_left step-end infinite; } +.projector.text .projector-wrapper:has(.cols.inside), +.projector.text .projector-wrapper:has(.cols.inside) { + border-color: #0000; + animation: none; +} + +.projector.text .cols { + height: 100%; + width: 100%; + display: flex; + border-radius: 0.1em; + outline: 0.3px solid #a69460; + background-color: #e0d1b7; + color: #f0e7d6; +} + +.projector.text.selected .cols { + background-color: var(--selection-color); + color: #c7b491; +} +.projector.text.selected textarea { + background: repeating-linear-gradient( + var(--selection-color), + var(--selection-color) 1.4em, + #e0d1b7 1.4em, + #e0d1b7 1.46em + ); +} .projector.text textarea { resize: none; @@ -790,11 +801,13 @@ select { border: none; border-radius: 0.1em; outline: 0.3px solid #a69460; - background-color: #f0e7d6; color: #8c7e62; -} -.projector.text textarea { - background: repeating-linear-gradient(#f0e7d6, #f0e7d6 1.4em, #e0d1b7 1.4em, #e0d1b7 1.46em); + background: repeating-linear-gradient( + #f0e7d6, + #f0e7d6 1.4em, + #e0d1b7 1.4em, + #e0d1b7 1.46em + ); } .projector.text textarea::selection { @@ -1392,7 +1405,7 @@ svg.tile-selected { } } -@keyframes blink_border_left{ +@keyframes blink_border_left { from, to { border-left-color: red; @@ -1663,7 +1676,6 @@ svg.tile-selected { #bottom-bar #projectors option { font-size: 1em; color: #807350; - } #bottom-bar #projectors .toggle-switch { From fe6c26a3a2d37c619b9d80fc6926d77b25bd3574 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 12 Jul 2024 01:42:30 -0400 Subject: [PATCH 097/168] fixed bug with statics being called on buffer clear. better selection behavior with mouse --- src/haz3lcore/JsUtil.re | 8 ++ src/haz3lcore/zipper/Editor.re | 22 +--- src/haz3lcore/zipper/ProjectorBase.re | 2 +- src/haz3lcore/zipper/action/Action.re | 8 +- src/haz3lcore/zipper/action/Move.re | 18 +-- src/haz3lcore/zipper/action/Perform.re | 122 +++++++++--------- .../zipper/action/ProjectorPerform.re | 2 +- .../zipper/projectors/CheckboxCore.re | 6 +- src/haz3lcore/zipper/projectors/SliderCore.re | 2 +- .../zipper/projectors/SliderFCore.re | 2 +- .../zipper/projectors/TextAreaCore.re | 16 ++- src/haz3lweb/Keyboard.re | 3 + src/haz3lweb/Main.re | 3 +- src/haz3lweb/Model.re | 2 + src/haz3lweb/Update.re | 3 + src/haz3lweb/UpdateAction.re | 6 +- src/haz3lweb/view/ProjectorView.re | 2 +- 17 files changed, 122 insertions(+), 105 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index 0a01200a47..601f7ba7c8 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -110,6 +110,14 @@ let log = data => { Firebug.console##log(data); }; +let focus = (~site="", id: string) => + try(get_elem_by_id(id)##focus) { + | _ => + print_endline( + "WARNING: Failed to focus in update: " ++ id ++ " site: " ++ site, + ) + }; + let clipboard_shim_id = "clipboard-shim"; let focus_clipboard_shim = () => get_elem_by_id(clipboard_shim_id)##focus; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index bb1bb5d225..2db6945b6c 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -1,6 +1,5 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; -open Util; module CachedStatics = { type t = { @@ -141,14 +140,9 @@ module Meta = { meta: t, ) : t => { + print_endline("Editor.next. Action:" ++ Action.show(a)); //TODO(andrew): remove or reinstate touched/effects let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); - let col_target = - switch (a) { - | Move(Local(Up | Down)) - | Select(Resize(Local(Up | Down))) => meta.col_target - | _ => Zipper.caret_point(meta.projected.measured, meta.projected.z).col - }; let statics = next_statics(~settings, a, z, meta.statics); let z_projected = Projector.Project.go(z, statics.info_map); let projected = @@ -157,6 +151,12 @@ module Meta = { | _ => next_projected(z_projected, ~touched, ~old=meta.projected.measured) }; + let col_target = + switch (a) { + | Move(Local(Up | Down)) + | Select(Resize(Local(Up | Down))) => meta.col_target + | _ => Zipper.caret_point(projected.measured, projected.z).col + }; { touched, col_target, @@ -219,7 +219,6 @@ let init = (~read_only=false, z, ~settings: CoreSettings.t) => { history: History.empty, read_only, }; -// let empty = id => init(~read_only=false, Zipper.init(id)); let update_z = (f: Zipper.t => Zipper.t, ed: t) => { ...ed, @@ -228,13 +227,6 @@ let update_z = (f: Zipper.t => Zipper.t, ed: t) => { zipper: f(ed.state.zipper), }, }; -let put_z = (z: Zipper.t) => update_z(_ => z); - -let update_z_opt = (f: Zipper.t => option(Zipper.t), ed: t) => { - open OptUtil.Syntax; - let+ z = f(ed.state.zipper); - put_z(z, ed); -}; let new_state = ( diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index dd23322afe..b3f255aeed 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -60,7 +60,7 @@ type action = | FocusInternal(string) /* DOM Focus on projector */ | Default /* Defer input to focal DOM element */ | Escape(string, Util.Direction.t) /* Pass key control to parent editor */ - | UpdateSyntax(syntax => syntax) + | SetSyntax(syntax) | UpdateModel(inner_action); /* Externally calculated info to be fed to projectors */ diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 138e615e2e..f265b85831 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -46,7 +46,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = - | UpdateSyntax(Id.t, Piece.t => Piece.t) + | SetSyntax(Id.t, Piece.t) | UpdateModel(Id.t, Projector.t => Projector.t) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) @@ -61,7 +61,6 @@ type agent = [@deriving (show({with_path: false}), sexp, yojson)] type buffer = | Set(agent) - | Clear | Accept; [@deriving (show({with_path: false}), sexp, yojson)] @@ -105,7 +104,7 @@ module Result = { let is_edit: t => bool = fun | Project(_) => true //TODO(andrew): revisit - | Buffer(Accept | Clear | Set(_)) + | Buffer(Accept) | Paste(_) | Cut | Reparse @@ -113,6 +112,7 @@ let is_edit: t => bool = | Destruct(_) | Pick_up | Put_down => true + | Buffer(Set(_)) | Copy | Move(_) | Jump(_) @@ -124,7 +124,7 @@ let is_edit: t => bool = /* Determines whether undo/redo skips action */ let is_historic: t => bool = fun - | Buffer(Clear | Set(_)) + | Buffer(Set(_)) | Copy | Move(_) | Jump(_) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index da00022e16..e351fa6391 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -110,6 +110,7 @@ module Make = (M: Editor.Meta.S) => { let do_towards = ( ~anchor: option(Measured.Point.t)=?, + ~force_progress=true, f: (Direction.t, t) => option(t), goal: Measured.Point.t, z: t, @@ -126,15 +127,14 @@ module Make = (M: Editor.Meta.S) => { Measured.Point.dcomp(d, curr_p.row, goal.row), ) { | (Exact, Exact) => curr - //TODO(andrew): document - //TODO(andrew): pick new goal to get right col - //| (_, Over) => prev - | (_, Over) => - let prev_p = caret_point(prev); - switch (Measured.Point.dcomp(d, prev_p.row, goal.row)) { - | Under => curr - | _ => prev - }; + /* Up/down movement works by setting a goal one row below the current. + * When adjacent to a multiline token (eg livelit), the nearest next + * caret position may be multiple lines down. We must allow this overshoot + * in order to be able to make progress. However, doing so causes flicker + * during mouse-based selection. I don't fully understand why this is, + * but disabling this special case in that case seems to work */ + | (_, Over) when caret_point(prev) == init && force_progress => curr + | (_, Over) => prev | (_, Under) | (Under, Exact) => switch (f(d, curr)) { diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 206f73eaef..671843045c 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -9,7 +9,7 @@ let is_write_action = (a: Action.t) => { | Unselect(_) | Jump(_) | Select(_) => false - | Buffer(Set(_) | Clear | Accept) + | Buffer(Set(_) | Accept) | Cut | Paste(_) | Reparse @@ -22,14 +22,26 @@ let is_write_action = (a: Action.t) => { }; }; -let rec go_z = - ( - ~meta: option(Editor.Meta.t)=?, - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - ) - : Action.Result.t(Zipper.t) => { +let buffer_clear = (z: t): t => + switch (z.selection.mode) { + | Buffer(_) => {...z, selection: Selection.mk([])} + | _ => z + }; + +let buffer_set = (info_map: Statics.Map.t, z: t): t => + switch (TyDi.set_buffer(~info_map, z)) { + | None => z + | Some(z) => z + }; + +let go_z = + ( + ~meta: option(Editor.Meta.t)=?, + ~settings: CoreSettings.t, + a: Action.t, + z: Zipper.t, + ) + : Action.Result.t(Zipper.t) => { let meta = switch (meta) { | Some(m) => m @@ -58,15 +70,16 @@ let rec go_z = that in general it's not safe to call go_z recursively (the meta may change) but as long as we're not relying on anything but the raw zipper we're fine. */ - let settings = CoreSettings.off; + //let settings = CoreSettings.off; let* z = Printer.zipper_of_string(~zipper_init=z, str); - switch (go_z(~settings, Insert(" "), z)) { - | Error(_) => None - | Ok(z) => - switch (go_z(~settings, Destruct(Left), z)) { - | Error(_) => None - | Ok(z) => Some(z) - } + switch (Insert.go(" ", z)) { + | None => None + | Some(z) => z |> Destruct.go(Left) |> Option.map(remold_regrout(Left)) + //|> Result.of_option(~error=Action.Failure.Cant_destruct) + // switch (go_z(~settings, Destruct(Left), z)) { + // | Error(_) => None + // | Ok(z) => Some(z) + // } }; }; @@ -78,7 +91,11 @@ let rec go_z = } | Cut => /* System clipboard handling is done in Page.view handlers */ - go_z(~settings, ~meta, Destruct(Left), z) + switch (Destruct.go(Left, z)) { + | None => Error(Cant_destruct) + | Some(z) => Ok(z) + } + // go_z(~settings, ~meta, Destruct(Left), z) | Copy => /* System clipboard handling itself is done in Page.view handlers. * This doesn't change state but is included here for logging purposes */ @@ -88,17 +105,7 @@ let rec go_z = | None => Error(CantReparse) | Some(z) => Ok(z) } - | Buffer(Clear) => - switch (z.selection.mode) { - | Buffer(_) => Ok({...z, selection: Selection.mk([])}) - | _ => Ok(z) - } - | Buffer(Set(TyDi)) => - let info_map = meta.statics.info_map; - switch (TyDi.set_buffer(~info_map, z)) { - | None => Ok(z) - | Some(z) => Ok(z) - }; + | Buffer(Set(TyDi)) => Ok(buffer_set(meta.statics.info_map, z)) | Buffer(Accept) => switch (z.selection.mode) { | Normal => Ok(z) @@ -112,32 +119,24 @@ let rec go_z = * In such a case, we insert the completion as normal by * pasting, then return to the beginning and advance to the * first hole. This should be revisited if completions are - * refactored to use a more structured buffer format. - * - * Note that calling go_z like this without recalculating - * the meta is iffy; the goal movement only works because - * the paste only changes measurements south of the start */ + * refactored to use a more structured buffer format. */ let start = Zipper.caret_point(M.measured, meta.projected.z); - let rec do_actions = (z, actions: list(Action.t)) => - switch (actions) { - | [] => Ok(z) - | [a, ...tl] => - switch (go_z(~meta, ~settings, a, z)) { - | Error(err) => Error(err) - | Ok(z) => do_actions(z, tl) - } - }; - do_actions( - z, - [ - Paste(AssistantExpander.trim(completion)), - Move(Goal(Point(start))), - Move(Goal(Piece(Grout, Right))), - Move(Local(Left(ByToken))), - ], - ); + let z = { + open OptUtil.Syntax; + let* z = paste(z, completion); + let* z = Move.go(Goal(Point(start)), z); + let* z = Move.go(Goal(Piece(Grout, Right)), z); + Move.go(Local(Left(ByToken)), z); + }; + switch (z) { + | None => Error(CantAccept) + | Some(z) => Ok(z) + }; | Some(completion) => - go_z(~meta, ~settings, Paste(AssistantExpander.trim(completion)), z) + switch (paste(z, AssistantExpander.trim(completion))) { + | None => Error(CantAccept) + | Some(z) => Ok(z) + } } } | Project(a) => @@ -276,8 +275,9 @@ let rec go_z = Move.to_backpack_target(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) }; -} -and go_history = +}; + +let go_history = (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) : Action.Result.t(Editor.t) => { open Result.Syntax; @@ -286,8 +286,9 @@ and go_history = Effect.s_clear(); let+ z = go_z(~settings, ~meta, a, zipper); Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); -} -and go = +}; + +let go = (~settings: CoreSettings.t, a: Action.t, ed: Editor.t) : Action.Result.t(Editor.t) => /* This function wraps assistant completions. If completions are enabled, @@ -298,12 +299,11 @@ and go = Result.Ok(ed); } else if (settings.assist && settings.statics) { open Result.Syntax; - let* ed = - a == Buffer(Accept) - ? Ok(ed) : go_history(~settings, Buffer(Clear), ed); + let ed = a == Buffer(Accept) ? ed : Editor.update_z(buffer_clear, ed); let* ed = go_history(~settings, a, ed); Action.is_edit(a) - ? go_history(~settings, Buffer(Set(TyDi)), ed) : Ok(ed); + ? Ok(Editor.update_z(buffer_set(ed.state.meta.statics.info_map), ed)) + : Ok(ed); } else { go_history(~settings, a, ed); }; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index cdd7f56b08..4b58be3204 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -92,7 +92,7 @@ let go = | false => Error(Action.Failure.Cant_project) | true => Ok(set(id, None, z)) } - | UpdateSyntax(id, f) => Ok(Projector.Syntax.update(f, id, z)) + | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) | UpdateModel(id, f) => Ok({...z, projectors: Map.update(id, Option.map(f), z.projectors)}) }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index be2adc1460..b0e44a0a75 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -30,8 +30,9 @@ let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => ~attrs= [ Attr.create("type", "checkbox"), - Attr.on_input((_, _) => inject(UpdateSyntax(toggle))), - //JsUtil.stop_mousedown_propagation, + Attr.on_input((_, _) => + inject(SetSyntax(put(!get(info.syntax)))) + ), ] @ (get(info.syntax) ? [Attr.checked] : []), (), @@ -51,7 +52,6 @@ let mk = (model): core => let model = model; let can_project = p => state_of(p) != None; let placeholder = _ => Inline(2); - // let auto_update = _: projector => Checkbox(); let update = (_action): projector => Checkbox(); let view = view; let keymap = keymap; diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index e2f801907d..014e6548ee 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -14,7 +14,7 @@ let get = (piece: Piece.t): string => let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(UpdateSyntax(_ => put(v))))], + ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax), ); diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 8d098907f1..2fecc53a5a 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -17,7 +17,7 @@ let get = (piece: Piece.t): float => let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(UpdateSyntax(_ => put(v))))], + ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], info.syntax |> get |> Printf.sprintf("%.2f"), ); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 7d46148ad0..37c473e9ec 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -44,7 +44,7 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); let put = (str: string): ProjectorBase.action => - UpdateSyntax(_ => str |> Form.string_quote |> put); + SetSyntax(str |> Form.string_quote |> put); let textarea = ( @@ -54,17 +54,21 @@ let textarea = ) => Node.textarea( ~attrs=[ + Attr.id("sdfsdf"), Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), - Attr.on_click(_ => inject(FocusInternal(selector))), - Attr.on_mousedown(_ => inject(FocusInternal(selector))), + //Attr.on_click(_ => inject(FocusInternal(selector))), + Attr.on_mousedown(_ => { + //JsUtil.focus("sdfsdf"); + inject(FocusInternal(selector)) + }), Attr.on_input((_, new_text) => inject(put(new_text))), ], [Node.text(text)], ); let n_of = (n: int) => - //• + //·•⬤ [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); @@ -97,9 +101,9 @@ let keymap = // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); switch (key.key, direction) { - | (D("ArrowRight"), Right) when !focussed => + | (D("ArrowRight"), Right) when !focussed && !(key.shift == Down) => Some(FocusInternal(selector)) - | (D("ArrowLeft"), Left) when !focussed => + | (D("ArrowLeft"), Left) when !focussed && !(key.shift == Down) => JsUtil.TextArea.set_caret_to_end(textarea); Some(FocusInternal(selector)); | (D("ArrowRight" | "ArrowDown"), _) when focussed && is_last_pos => diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index c6ff1951b1..e3b7782802 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -73,6 +73,9 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: Mac, shift: Up, meta: Down, ctrl: Up, alt: Up} => switch (key) { + | "e" => + print_endline("ssssss"); + Some(SetMeta(Focus("sdfsdf"))); | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index 6072605161..030ce5cc8c 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -36,7 +36,8 @@ let restart_caret_animation = () => | _ => () }; -let apply = (model, action, state, ~schedule_action): Model.t => { +let apply = (model: Model.t, action, state, ~schedule_action): Model.t => { + JsUtil.focus(~site="apply", model.ui_state.focus); restart_caret_animation(); if (UpdateAction.is_edit(action)) { last_edit_action := JsUtil.timestamp(); diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index fa384d07de..a1b84c2216 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -25,12 +25,14 @@ type ui_state = { font_metrics: FontMetrics.t, show_backpack_targets: bool, mousedown: bool, + focus: string, }; let ui_state_init = { font_metrics: FontMetrics.init, show_backpack_targets: false, mousedown: false, + focus: "code-container", }; type t = { diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index b6dce9db7b..aef5da0696 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -307,6 +307,9 @@ let ui_state_update = switch (update) { | Mousedown => {...ui_state, mousedown: true} | Mouseup => {...ui_state, mousedown: false} + | Focus(focus) => + JsUtil.focus(~site="update", focus); + {...ui_state, focus}; | ShowBackpackTargets(b) => {...ui_state, show_backpack_targets: b} | FontMetrics(font_metrics) => {...ui_state, font_metrics} }; diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 343e0c8ca5..d6f8930333 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -39,6 +39,7 @@ type stepper_action = type set_meta = | Mousedown | Mouseup + | Focus(string) | ShowBackpackTargets(bool) | FontMetrics(FontMetrics.t); @@ -114,6 +115,7 @@ let is_edit: t => bool = switch (meta_action) { | Mousedown | Mouseup + | Focus(_) | ShowBackpackTargets(_) | FontMetrics(_) => false } @@ -167,6 +169,7 @@ let reevaluate_post_update: t => bool = switch (meta_action) { | Mousedown | Mouseup + | Focus(_) | ShowBackpackTargets(_) | FontMetrics(_) => false } @@ -213,6 +216,7 @@ let should_scroll_to_caret = | FontMetrics(_) => true | Mousedown | Mouseup + | Focus(_) | ShowBackpackTargets(_) => false } | UpdateResult(_) @@ -239,7 +243,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) - | Buffer(Set(_) | Clear | Accept) + | Buffer(Set(_) | Accept) | Paste(_) | Copy | Cut diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 2df7ad336a..d6711e4b7d 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -25,7 +25,7 @@ let handle = (id, action: ProjectorBase.action): Action.project => | Escape(selector, Right) => JsUtil.get_elem_by_selector(selector)##blur; Escape(id, Right); - | UpdateSyntax(f) => UpdateSyntax(id, f) + | SetSyntax(f) => SetSyntax(id, f) | UpdateModel(action) => UpdateModel(id, update_model(action)) }; From fcf7b9a07e2f70dfba83002b91eb033fff2d2d78 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 12 Jul 2024 02:40:12 -0400 Subject: [PATCH 098/168] fixed selection flicker bug (but at what cost? watch for complex up/down movement bugs going forward) --- src/haz3lcore/zipper/action/Move.re | 40 ++++++++++++++++------------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index e351fa6391..f278dbef45 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -107,10 +107,18 @@ module Make = (M: Editor.Meta.S) => { }; }; + let anchor_case = + (anchor: Measured.Point.t, d, prev, curr, goal: Measured.Point.t) => { + /* This is for dragging selections */ + let anchor_d: Direction.t = + goal.row < anchor.row || goal.row == anchor.row && goal.col < anchor.col + ? Left : Right; + anchor_d == d ? curr : prev; + }; + let do_towards = ( ~anchor: option(Measured.Point.t)=?, - ~force_progress=true, f: (Direction.t, t) => option(t), goal: Measured.Point.t, z: t, @@ -127,14 +135,17 @@ module Make = (M: Editor.Meta.S) => { Measured.Point.dcomp(d, curr_p.row, goal.row), ) { | (Exact, Exact) => curr - /* Up/down movement works by setting a goal one row below the current. - * When adjacent to a multiline token (eg livelit), the nearest next - * caret position may be multiple lines down. We must allow this overshoot - * in order to be able to make progress. However, doing so causes flicker - * during mouse-based selection. I don't fully understand why this is, - * but disabling this special case in that case seems to work */ - | (_, Over) when caret_point(prev) == init && force_progress => curr - | (_, Over) => prev + // | (_, Over) when caret_point(prev) == init && force_progress => curr + // | (_, Over) => prev + | (_, Over) => + /* Up/down movement works by setting a goal one row below current. + * When adjacent to multiline token (eg livelit), the nearest next + * caret position may be multiple lines down. We must allow this + * overshoot in order to be able to make progress. */ + switch (anchor) { + | None => caret_point(prev) == init ? curr : prev + | Some(anchor) => anchor_case(anchor, d, prev, curr, goal) + } | (_, Under) | (Under, Exact) => switch (f(d, curr)) { @@ -159,19 +170,12 @@ module Make = (M: Editor.Meta.S) => { // default to going over when equal d_prev < d_curr ? prev : curr; } - | Some(anchor) => - let anchor_d = - goal.row < anchor.row - || goal.row == anchor.row - && goal.col < anchor.col - ? Direction.Left : Right; - anchor_d == d ? curr : prev; + | Some(anchor) => anchor_case(anchor, d, prev, curr, goal) } }; }; let res = go(z, z); - Measured.Point.equals(caret_point(res), caret_point(z)) - ? None : Some(res); + Measured.Point.equals(caret_point(res), init) ? None : Some(res); }; let do_vertical = (f: (Direction.t, t) => option(t), d: Direction.t, z: t): option(t) => { From 6ca36ab428f5da6fd2f8a45fd190e935aa4e859f Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 15 Jul 2024 22:21:36 -0400 Subject: [PATCH 099/168] cleanup of core move/select logic --- src/haz3lcore/JsUtil.re | 4 +- src/haz3lcore/zipper/action/Action.re | 1 + src/haz3lcore/zipper/action/Move.re | 103 +++++++++--------- .../zipper/projectors/TextAreaCore.re | 13 ++- 4 files changed, 67 insertions(+), 54 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index 601f7ba7c8..d27875fdad 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -158,7 +158,9 @@ let scroll_cursor_into_view_if_needed = () => caret_elem##scrollIntoView(Js._false); }; }) { - | Assert_failure(_) => () + | Assert_failure(_) => + print_endline("WARNING: caret not found"); + (); }; module Fragment = { diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index f265b85831..c98fd9431c 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -103,6 +103,7 @@ module Result = { let is_edit: t => bool = fun + | Project(FocusInternal(_) | Escape(_)) => false | Project(_) => true //TODO(andrew): revisit | Buffer(Accept) | Paste(_) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index f278dbef45..848bb3577e 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -107,15 +107,19 @@ module Make = (M: Editor.Meta.S) => { }; }; - let anchor_case = - (anchor: Measured.Point.t, d, prev, curr, goal: Measured.Point.t) => { - /* This is for dragging selections */ - let anchor_d: Direction.t = - goal.row < anchor.row || goal.row == anchor.row && goal.col < anchor.col - ? Left : Right; - anchor_d == d ? curr : prev; + let direction_to_from = + (p1: Measured.Point.t, p2: Measured.Point.t): Direction.t => { + let before_row = p1.row < p2.row; + let at_row = p1.row == p2.row; + let before_col = p1.col < p2.col; + before_row || at_row && before_col ? Left : Right; }; + let closer_to_prev = (curr, prev, goal: Measured.Point.t) => + /* Default to true if equal */ + abs(caret_point(prev).col - goal.col) + < abs(caret_point(curr).col - goal.col); + let do_towards = ( ~anchor: option(Measured.Point.t)=?, @@ -125,53 +129,52 @@ module Make = (M: Editor.Meta.S) => { ) : option(t) => { let init = caret_point(z); - let d = - goal.row < init.row || goal.row == init.row && goal.col < init.col - ? Direction.Left : Right; + let d_to_goal = direction_to_from(goal, init); let rec go = (prev: t, curr: t) => { let curr_p = caret_point(curr); - switch ( - Measured.Point.dcomp(d, curr_p.col, goal.col), - Measured.Point.dcomp(d, curr_p.row, goal.row), - ) { - | (Exact, Exact) => curr - // | (_, Over) when caret_point(prev) == init && force_progress => curr - // | (_, Over) => prev - | (_, Over) => - /* Up/down movement works by setting a goal one row below current. - * When adjacent to multiline token (eg livelit), the nearest next - * caret position may be multiple lines down. We must allow this - * overshoot in order to be able to make progress. */ - switch (anchor) { - | None => caret_point(prev) == init ? curr : prev - | Some(anchor) => anchor_case(anchor, d, prev, curr, goal) - } - | (_, Under) - | (Under, Exact) => - switch (f(d, curr)) { - | None => curr + let x_progress = Measured.Point.dcomp(d_to_goal, curr_p.col, goal.col); + let y_progress = Measured.Point.dcomp(d_to_goal, curr_p.row, goal.row); + switch (y_progress, x_progress) { + /* If we're not there yet, keep going */ + | (Under, Over | Exact | Under) + | (Exact, Under) => + switch (f(d_to_goal, curr)) { | Some(next) => go(curr, next) + | None => curr /* Should only occur at start/end of program */ } - | (Over, Exact) => - switch (anchor) { - | None => - /* Special case for when you're (eg) you're trying - to move down, but you're at the right end of a row - and the first position of the next row is further - right than the current row's end. In this case we - want to progress regardless of whether the new - position would be closer or futher from the - goal col */ - is_at_side_of_row(Direction.toggle(d), curr) - ? curr - : { - let d_curr = abs(curr_p.col - goal.col); - let d_prev = abs(caret_point(prev).col - goal.col); - // default to going over when equal - d_prev < d_curr ? prev : curr; - } - | Some(anchor) => anchor_case(anchor, d, prev, curr, goal) - } + /* If we're there, stop */ + | (Exact, Exact) => curr + /* If we've overshot, meaning the exact goal is inaccessible, + * we choose between current and previous (undershot) positions, + * according to some heuristics that ensure that (a) vertical + * keyboard movement will always result in up/down movement + * unless at the beginning/end of the program, and (b) making a + * selection by dragging the mouse makes a consistent decision + * about progress, preventing flicker. */ + | (Over, Over | Exact | Under) + | (Exact, Over) when anchor != None => + /* If we're dragging to make a selection, decide whether or + * not to force progress based on whether we're before or + * after the place where we started dragging */ + direction_to_from(goal, Option.get(anchor)) == d_to_goal + ? curr : prev + | (Over, Over | Exact | Under) => + /* Up/down kb movement works by setting a goal one row + * below the current. When adjacent to a multiline token, + * the nearest next caret position may be multiple lines down. + * We must allow this overshoot in order to make progress. */ + caret_point(prev) == init ? curr : prev + | (Exact, Over) + when is_at_side_of_row(Direction.toggle(d_to_goal), curr) => + /* If you're trying to (eg) move down at the end of a row + * but the first position of the next row is further right + * than the currentrow's end, we want to make progress + * regardless of whether thenew position would be closer + * or further from the goal */ + curr + | (Exact, Over) => + /* Otherwise, we try to just get as close as we can */ + closer_to_prev(curr, prev, goal) ? prev : curr }; }; let res = go(z, z); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 37c473e9ec..19420a62d1 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -55,12 +55,18 @@ let textarea = Node.textarea( ~attrs=[ Attr.id("sdfsdf"), - Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), - Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), + // Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), + // Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), //Attr.on_click(_ => inject(FocusInternal(selector))), Attr.on_mousedown(_ => { //JsUtil.focus("sdfsdf"); - inject(FocusInternal(selector)) + JsUtil.get_elem_by_selector(selector)##focus; + Effect.Ignore; + //inject(FocusInternal(selector)) + // Effect.Many([ + // inject(UpdateModel(SetInside(true))), + // inject(FocusInternal(selector)), + // ]); }), Attr.on_input((_, new_text) => inject(put(new_text))), ], @@ -140,6 +146,7 @@ let mk = (model): core => let update = a => switch (a) { | SetInside(b) => + JsUtil.get_elem_by_selector(selector)##focus; print_endline("setting inside:" ++ string_of_bool(b)); TextArea({inside: b}); | _ => TextArea(model) From 275bd60a2239ab7640c1b5cb52e9821dd10c28b8 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 16 Jul 2024 17:55:36 -0400 Subject: [PATCH 100/168] .. --- src/haz3lcore/zipper/action/Move.re | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 848bb3577e..b909e73ffb 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -145,17 +145,12 @@ module Make = (M: Editor.Meta.S) => { /* If we're there, stop */ | (Exact, Exact) => curr /* If we've overshot, meaning the exact goal is inaccessible, - * we choose between current and previous (undershot) positions, - * according to some heuristics that ensure that (a) vertical - * keyboard movement will always result in up/down movement - * unless at the beginning/end of the program, and (b) making a - * selection by dragging the mouse makes a consistent decision - * about progress, preventing flicker. */ + * we choose between current and previous (undershot) positions */ | (Over, Over | Exact | Under) | (Exact, Over) when anchor != None => /* If we're dragging to make a selection, decide whether or - * not to force progress based on whether we're before or - * after the place where we started dragging */ + * not to force progress based on the relative position of the + * anchor (the position where the drag was started) */ direction_to_from(goal, Option.get(anchor)) == d_to_goal ? curr : prev | (Over, Over | Exact | Under) => From 0fb3003afbe8a060c195eba1f628276bd1661510 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 16 Jul 2024 19:52:08 -0400 Subject: [PATCH 101/168] projectors: switch to using serialized model type. functorize base module over this type --- src/haz3lcore/zipper/Editor.re | 2 +- src/haz3lcore/zipper/Projector.re | 91 ++++--------------- src/haz3lcore/zipper/ProjectorBase.re | 78 +++++++++------- src/haz3lcore/zipper/action/Action.re | 2 +- .../zipper/action/ProjectorPerform.re | 14 ++- .../zipper/projectors/CheckboxCore.re | 26 +++--- src/haz3lcore/zipper/projectors/FoldCore.re | 32 +++---- src/haz3lcore/zipper/projectors/InfoCore.re | 75 +++++++-------- src/haz3lcore/zipper/projectors/SliderCore.re | 34 ++++--- .../zipper/projectors/SliderFCore.re | 34 ++++--- .../zipper/projectors/TextAreaCore.re | 52 +++++------ src/haz3lweb/Editors.re | 3 +- src/haz3lweb/view/ProjectorView.re | 64 ++++++++----- 13 files changed, 237 insertions(+), 270 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 2db6945b6c..a44737c134 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -305,7 +305,7 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let get_projectors = (ed: t) => ed.state.zipper.projectors; -let map_projectors = (f: (Id.t, Projector.t) => Projector.t, ed: t) => +let map_projectors = (f: (Id.t, Projector.entry) => Projector.entry, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 9b014f3bbc..4ec43b6b53 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,75 +1,19 @@ open Util; include ProjectorBase; -[@deriving (show({with_path: false}), sexp, yojson)] -type t = projector; - -[@deriving (show({with_path: false}), sexp, yojson)] -type kind = - | Fold - | Info - | Checkbox - | Slider - | SliderF - | TextArea; - -let to_module = (p: projector): core => - switch ((p: projector)) { - | Fold(model) => FoldCore.mk(model) - | Info(model) => InfoCore.mk(model) - | Checkbox(model) => CheckboxCore.mk(model) - | Slider(model) => SliderCore.mk(model) - | SliderF(model) => SliderFCore.mk(model) - | TextArea(model) => TextAreaCore.mk(model) +let to_module = (kind: kind): core => + switch (kind) { + | Fold => (module CoreOuterMk(FoldCore.M)) + | Info => (module CoreOuterMk(InfoCore.M)) + | Slider => (module CoreOuterMk(SliderCore.M)) + | SliderF => (module CoreOuterMk(SliderFCore.M)) + | Checkbox => (module CoreOuterMk(CheckboxCore.M)) + | TextArea => (module CoreOuterMk(TextAreaCore.M)) }; -let kind = (p: t): kind => - switch (p) { - | Fold(_) => Fold - | Info(_) => Info - | Checkbox(_) => Checkbox - | Slider(_) => Slider - | SliderF(_) => SliderF - | TextArea(_) => TextArea - }; - -let init = (f: kind): projector => - switch (f) { - | Fold => Fold() - | Info => Info(Expected) - | Checkbox => Checkbox() - | Slider => Slider() - | SliderF => SliderF() - | TextArea => TextArea({inside: false}) - }; - -let name_of_kind = (p: kind): string => - switch (p) { - | Fold => "fold" - | Info => "type" - | Checkbox => "check" - | Slider => "slide" - | SliderF => "slidef" - | TextArea => "text" - }; - -/* Needs to be 1-to-1 for menu selection */ -let of_name = (p: string): kind => - switch (p) { - | "fold" => Fold - | "type" => Info - | "check" => Checkbox - | "slide" => Slider - | "slidef" => SliderF - | "text" => TextArea - | _ => failwith("Unknown projector kind") - }; - -let name = (p: t): string => p |> kind |> name_of_kind; - -let shape = (p: t, syntax): shape => { - let (module P) = to_module(p); - P.placeholder(syntax); +let shape = (p: entry, syntax): shape => { + let (module P) = to_module(p.kind); + P.placeholder(p.model, syntax); }; let is_placeholder = (p: Piece.t): bool => { @@ -80,13 +24,13 @@ let is_placeholder = (p: Piece.t): bool => { }; }; -let placeholder_label = (p: t, syntax): list(string) => +let placeholder_label = (p: entry, syntax): list(string) => switch (shape(p, syntax)) { | Inline(width) => [String.make(width, ' ')] | Block({row, col}) => [String.make(row, '\n') ++ String.make(col, ' ')] }; -let placeholder = (p: t, info: info): syntax => +let placeholder = (p: entry, info: info): syntax => Piece.Tile({ id: Piece.id(info.syntax), label: placeholder_label(p, info), @@ -99,11 +43,10 @@ let placeholder = (p: t, info: info): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let create = (k: kind, syntax: syntax): option(t) => { - let p = init(k); - let (module P) = to_module(p); +let create = (kind: kind, syntax: syntax): option(entry) => { + let (module P) = to_module(kind); P.can_project(syntax) && minimum_projection_condition(syntax) - ? Some(p) : None; + ? Some({kind, model: P.init}) : None; }; let piece_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => @@ -249,7 +192,7 @@ module MapPiece = { }; }; -[@deriving (show({with_path: false}), sexp, yojson)] +[@deriving (show({with_path: false}), sexp)] type proj_ret = { z: ZipperBase.t, syntax_map: Id.Map.t(syntax), diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index b3f255aeed..6dc4cf3828 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -3,34 +3,34 @@ open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] -type fold = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type infer = - | Expected - | Self; -[@deriving (show({with_path: false}), sexp, yojson)] -type checkbox = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type slider = unit; -[@deriving (show({with_path: false}), sexp, yojson)] -type sliderf = unit; +type kind = + | Fold + | Info + | Checkbox + | Slider + | SliderF + | TextArea; + +[@deriving (show({with_path: false}), sexp)] +type sexp2 = Sexplib.Sexp.t; +//TODO(andrew): proper serialization +let sexp2_of_yojson = _ => + Sexplib.Sexp.Atom("TODO(andrew): proper serialization"); +let yojson_of_sexp2 = _ => Yojson.Safe.from_string("TODOTODOTODO"); [@deriving (show({with_path: false}), sexp, yojson)] -type textarea = {inside: bool}; //TODO(andrew): rm +type model = sexp2; [@deriving (show({with_path: false}), sexp, yojson)] -type projector = - | Fold(fold) - | Info(infer) - | Checkbox(checkbox) - | Slider(slider) - | SliderF(sliderf) - | TextArea(textarea); +type entry = { + kind, + model, +}; [@deriving (show({with_path: false}), sexp, yojson)] module Map = { open Id.Map; [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(projector); + type t = Id.Map.t(entry); let empty = empty; let find = find_opt; let mem = mem; @@ -52,6 +52,7 @@ type syntax = Piece.t; type inner_action = ..; //TODO(andrew): decide how to rm +// [@deriving (show({with_path: false}), sexp, yojson)] type inner_action += | SetInside(bool); @@ -71,23 +72,36 @@ type info = { ci: option(Info.t), }; -module type Core = { +module type CoreInner = { [@deriving (show({with_path: false}), sexp, yojson)] type model; + let init: model; let can_project: Piece.t => bool; + let view: + (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; + let placeholder: (model, info) => shape; + let update: (model, inner_action) => model; + let keymap: (model, Util.Direction.t, Key.t) => option(action); +}; - let model: model; - // let projector: projector; - - let view: (~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; - let placeholder: info => shape; +module type CoreOuter = { + let init: model; + let can_project: Piece.t => bool; + let view: + (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; + let placeholder: (model, info) => shape; + let update: (model, inner_action) => model; + let keymap: (model, Util.Direction.t, Key.t) => option(action); +}; - //[@deriving (show({with_path: false}), sexp, yojson)] - //type action; - let update: inner_action => projector; - // let auto_update: info => projector; - let keymap: (Util.Direction.t, Key.t) => option(action); +module CoreOuterMk = (C: CoreInner) : CoreOuter => { + let init = C.sexp_of_model(C.init); + let can_project = C.can_project; + let view = m => m |> C.model_of_sexp |> C.view; + let placeholder = m => m |> C.model_of_sexp |> C.placeholder; + let update = (m, a) => C.update(C.model_of_sexp(m), a) |> C.sexp_of_model; + let keymap = (m: Sexplib.Sexp.t) => m |> C.model_of_sexp |> C.keymap; }; -type core = (module Core); +type core = (module CoreOuter); diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index c98fd9431c..ca507a1ddc 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -47,7 +47,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = | SetSyntax(Id.t, Piece.t) - | UpdateModel(Id.t, Projector.t => Projector.t) + | UpdateModel(Id.t, Projector.entry => Projector.entry) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) | FocusInternal(Id.t) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 4b58be3204..949b869327 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -12,7 +12,7 @@ let move_out_of_piece = } }; -let set = (id: Id.t, p: option(t), z: Zipper.t) => { +let set = (id: Id.t, p: option(entry), z: Zipper.t) => { ...z, projectors: Map.update(id, _ => p, z.projectors), }; @@ -38,10 +38,10 @@ let go = syntax_map, z: Zipper.t, ) => { - let crime = (_syntax, b, p) => { + let crime = (_syntax, b, {kind, model}: entry): entry => { //TODO(andrew): remove this crime - let (module P) = Projector.to_module(p); - P.update(SetInside(b)); + let (module P) = Projector.to_module(kind); + {kind, model: P.update(model, SetInside(b))}; //p; }; let set_dispatch = (z: Zipper.t, id, b) => @@ -94,6 +94,10 @@ let go = } | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) | UpdateModel(id, f) => - Ok({...z, projectors: Map.update(id, Option.map(f), z.projectors)}) + Ok({ + ...z, + projectors: + Map.update(id, entry => Option.map(f, entry), z.projectors), + }) }; }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index b0e44a0a75..19fc69c525 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -25,7 +25,7 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => +let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Node.input( ~attrs= [ @@ -38,21 +38,19 @@ let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => (), ); -let keymap = (_, key: Key.t): option(ProjectorBase.action) => +let keymap = (_, _, key: Key.t): option(ProjectorBase.action) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None }; -let mk = (model): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = unit; - let model = model; - let can_project = p => state_of(p) != None; - let placeholder = _ => Inline(2); - let update = (_action): projector => Checkbox(); - let view = view; - let keymap = keymap; - }); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = unit; + let init = (); + let can_project = p => state_of(p) != None; + let placeholder = (_, _) => Inline(2); + let update = (model, _) => model; + let view = view; + let keymap = keymap; +}; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 43d4e49bb0..346aa343cb 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,20 +1,20 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open ProjectorBase; open Virtual_dom.Vdom; open Node; -let mk = (_: fold): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = fold; - let model = (); - let can_project = _ => true; - let placeholder = _ => Inline(2); - let update = _ => Fold(); - let view = (~info as _, ~inject) => - div( - ~attrs=[Attr.on_double_click(_ => inject(Remove))], - [text("⋱")], - ); - let keymap = (_, _): option(ProjectorBase.action) => None; - }); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = unit; + let init = (); + let can_project = _ => true; + let placeholder = (_, _) => Inline(2); + let update = (_, _) => (); + let view = (_, ~info as _, ~inject) => + div( + ~attrs=[Attr.on_double_click(_ => inject(Remove))], + [text("⋱")], + ); + let keymap = (_, _, _): option(action) => None; +}; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index ffba1d0608..740c32ba6c 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -37,44 +37,39 @@ let syn_display = info => let ana_display = info => "⋱ ⇐ " ++ (info |> expected_ty |> display_ty |> Typ.pretty_print); -let display = (model: infer, info) => - switch (model) { - | _ when mode(info) == Some(Syn) => syn_display(info) - | Self => syn_display(info) - | Expected => ana_display(info) - }; - -let mk = (model: infer): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = infer; - let model = model; - - let can_project = (p: Piece.t): bool => - switch (Piece.sort(p)) { - | (Exp | Pat, _) => true - | _ => false - }; - - let placeholder = (info: ProjectorBase.info) => - Inline((display(model, info.ci) |> String.length) - 2); - - let update = (a: inner_action) => - switch (a, model) { - | (ToggleDisplay, Expected) => Info(Self) - | (ToggleDisplay, Self) => Info(Expected) - | _ => Info(model) - }; - - let view = (~info: ProjectorBase.info, ~inject) => - div( - ~attrs=[ - Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay))), - //Attr.on_double_click(_ => inject(Remove)), - ], - [text(display(model, info.ci))], - ); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = + | Expected + | Self; + let init = Expected; + let can_project = (p: Piece.t): bool => + switch (Piece.sort(p)) { + | (Exp | Pat, _) => true + | _ => false + }; + let display = (model, info) => + switch (model) { + | _ when mode(info) == Some(Syn) => syn_display(info) + | Self => syn_display(info) + | Expected => ana_display(info) + }; - let keymap = (_, _): option(_) => None; - }); + let placeholder = (model, info: ProjectorBase.info) => + Inline((display(model, info.ci) |> String.length) - 2); + let update = (model, a: inner_action) => + switch (a, model) { + | (ToggleDisplay, Expected) => Self + | (ToggleDisplay, Self) => Expected + | _ => model + }; + let view = (model, ~info: ProjectorBase.info, ~inject) => + div( + ~attrs=[ + Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay))), + //Attr.on_double_click(_ => inject(Remove)), + ], + [text(display(model, info.ci))], + ); + let keymap = (_, _, _): option(_) => None; +}; diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 014e6548ee..8fe9b69ab4 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,3 +1,5 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; @@ -12,21 +14,17 @@ let get = (piece: Piece.t): string => | Some(s) => string_of_int(s) }; -let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => - Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], - get(info.syntax), - ); - -let mk = (model): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = slider; - let model = model; - let can_project = p => get_opt(p) != None; - let placeholder = _ => Inline(10); - let update = _ => Slider(model); - let view = view; - let keymap = (_, _) => None; - }); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = unit; + let init = (); + let can_project = p => get_opt(p) != None; + let placeholder = (_, _) => Inline(10); + let update = (model, _) => model; + let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + Util.Web.range( + ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], + get(info.syntax), + ); + let keymap = (_, _, _) => None; +}; diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 2fecc53a5a..5d67f031fa 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -1,3 +1,5 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; @@ -15,21 +17,17 @@ let get = (piece: Piece.t): float => | Some(s) => s }; -let view = (~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => - Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], - info.syntax |> get |> Printf.sprintf("%.2f"), - ); - -let mk = (model): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = slider; - let model = model; - let can_project = p => get_opt(p) != None; - let placeholder = _ => Inline(10); - let update = _ => Slider(model); - let view = view; - let keymap = (_, _) => None; - }); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = unit; + let init = (); + let can_project = p => get_opt(p) != None; + let placeholder = (_, _) => Inline(10); + let update = (model, _) => model; + let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + Util.Web.range( + ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], + get(info.syntax) |> Printf.sprintf("%.2f"), + ); + let keymap = (_, _, _) => None; +}; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 19420a62d1..473b5f5602 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,8 +1,11 @@ -// open Sexplib.Std; -// open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; +[@deriving (show({with_path: false}), sexp, yojson)] +type textarea = {inside: bool}; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //TODO(andrew): unhardcode element !!!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -13,9 +16,7 @@ open ProjectorBase; // | SetInside(bool); let selector = ".projector.text textarea"; - // let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; - // let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; let escape_linebreaks: string => string = @@ -122,35 +123,30 @@ let keymap = None; }; }; - let line_lengths = syntax => List.map(String.length, Re.Str.split(Re.Str.regexp("\n"), get(syntax))); - let num_lines = syntax => List.fold_left(max, 0, line_lengths(syntax)); - -let placeholder = info => +let placeholder = (_, info) => Block({ row: Util.StringUtil.num_linebreaks(get(info.syntax)), col: 2 + num_lines(info.syntax) /* +2 for left and right padding */ }); -let mk = (model): core => - (module - { - [@deriving (show({with_path: false}), sexp, yojson)] - type model = textarea; - let model = model; - let can_project = _ => true; - let placeholder = placeholder; - // let auto_update = _ => TextArea(model); - let update = a => - switch (a) { - | SetInside(b) => - JsUtil.get_elem_by_selector(selector)##focus; - print_endline("setting inside:" ++ string_of_bool(b)); - TextArea({inside: b}); - | _ => TextArea(model) - }; - let view = view(model, ~selector); - let keymap = keymap(~selector, model); - }); +module M: CoreInner = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = textarea; + let init = {inside: false}; + let can_project = _ => true; //TODO(andrew): restrict + let placeholder = placeholder; + // let auto_update = _ => TextArea(model); + let update = (model, a) => + switch (a) { + | SetInside(b) => + JsUtil.get_elem_by_selector(selector)##focus; + print_endline("setting inside:" ++ string_of_bool(b)); + {inside: b}; + | _ => model + }; + let view = view(~selector); + let keymap = keymap(~selector); +}; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 9ecdb8a1ce..081c172a95 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -60,7 +60,8 @@ let perform_action = let update_current_editor_statics = settings => update(Editor.update_statics(~settings)); -let map_projectors = (editors: t, f: (Id.t, Projector.t) => Projector.t): t => +let map_projectors = + (editors: t, f: (Id.t, Projector.entry) => Projector.entry): t => editors |> get_editor |> Editor.map_projectors(f) |> put_editor(_, editors); let get_ctx_init = (~settings as _: Settings.t, editors: t): Ctx.t => diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index d6711e4b7d..953bfd0266 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -5,9 +5,31 @@ open Projector; open Util.OptUtil.Syntax; open Util.Web; -let update_model = (action: ProjectorBase.inner_action, p) => { - let (module P) = to_module(p); - P.update(action); +let name = (p: kind): string => + switch (p) { + | Fold => "fold" + | Info => "type" + | Checkbox => "check" + | Slider => "slide" + | SliderF => "slidef" + | TextArea => "text" + }; + +/* Needs to be 1-to-1 for menu selection */ +let of_name = (p: string): kind => + switch (p) { + | "fold" => Fold + | "type" => Info + | "check" => Checkbox + | "slide" => Slider + | "slidef" => SliderF + | "text" => TextArea + | _ => failwith("Unknown projector kind") + }; + +let update_model = (action: ProjectorBase.inner_action, {kind, model}) => { + let (module P) = to_module(kind); + {kind, model: P.update(model, action)}; }; let handle = (id, action: ProjectorBase.action): Action.project => @@ -34,9 +56,9 @@ let backing_deco = ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~info, - p: Projector.t, + entry, ) => - switch (Projector.shape(p, info)) { + switch (Projector.shape(entry, info)) { | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) | Block(_) => div([]) }; @@ -58,14 +80,14 @@ let view_inner = ~status: option(Projector.status), ~info: info, ~selected: bool, - p: Projector.t, + entry: Projector.entry, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; div( ~attrs=[ Attr.classes( - ["projector", Projector.name(p)] @ cls(status, selected), + ["projector", name(entry.kind)] @ cls(status, selected), ), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), ], @@ -77,7 +99,7 @@ let view_inner = ], [view], ), - backing_deco(~font_metrics, ~measurement, ~info, p), + backing_deco(~font_metrics, ~measurement, ~info, entry), ], ); }; @@ -96,7 +118,7 @@ let view_setup = let ci = Id.Map.find_opt(id, meta.statics.info_map); let info = {ci, syntax, status}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); - let (module P) = to_module(p); + let (module P) = to_module(p.kind); let inject = a => handle(id, a) |> inject; view_inner( ~font_metrics, @@ -105,7 +127,7 @@ let view_setup = ~info, ~selected=List.mem(id, meta.selection_ids), p, - P.view(~info, ~inject), + P.view(p.model, ~info, ~inject), ); }; @@ -157,7 +179,7 @@ let indicated_proj_ed = (editor: Editor.t) => let kind = (editor: Editor.t) => { let+ (_, p) = indicated_proj_ed(editor); - Projector.kind(p); + p.kind; }; let shape = (z: Zipper.t, syntax): option(shape) => { @@ -191,11 +213,11 @@ let caret = (z: Zipper.t, meta: Editor.Meta.t): option(list(Node.t)) => let key_handler = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None - | Some((id, p)) => + | Some((id, {kind, model})) => //let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let* (_, d, _) = Indicated.piece(editor.state.zipper); - let (module P) = to_module(p); - let+ action = P.keymap(d, key); + let (module P) = to_module(kind); + let+ action = P.keymap(model, d, key); handle(id, action); }; @@ -209,7 +231,7 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [Checkbox] + | Pat(Bool) => [(Checkbox: Projector.kind)] | Exp(Int) | Pat(Int) => [Slider] | Exp(Float) @@ -219,11 +241,11 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => | _ => [] } ) - @ [Projector.Fold] + @ [(Fold: Projector.kind)] @ ( switch (ci) { | InfoExp(_) - | InfoPat(_) => [Info] + | InfoPat(_) => [(Info: Projector.kind)] | _ => [] } ); @@ -256,7 +278,7 @@ let currently_selected = editor => option_view( switch (kind(editor)) { | None => "Fold" - | Some(k) => Projector.name_of_kind(k) + | Some(k) => name(k) }, ); @@ -267,12 +289,10 @@ let panel = (~inject, editor: Editor.t, ci: Info.t) => { toggle_view(~inject, ci, id(editor), kind(editor) != None), Node.select( ~attrs=[ - Attr.on_change((_, name) => - inject(SetIndicated(Projector.of_name(name))) - ), + Attr.on_change((_, name) => inject(SetIndicated(of_name(name)))), ], applicable_projectors(ci) - |> List.map(Projector.name_of_kind) + |> List.map(name) |> List.map(currently_selected(editor)), ), ], From c570e361fba21963fd224f5e3e23561f6fd30c6c Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 17 Jul 2024 14:50:26 -0400 Subject: [PATCH 102/168] projector focus experiments; not working properly --- src/haz3lcore/statics/Statics.re | 6 +- .../zipper/projectors/TextAreaCore.re | 11 +++ src/haz3lweb/DebugConsole.re | 34 +++---- src/haz3lweb/Editors.re | 11 ++- src/haz3lweb/Update.re | 1 + src/haz3lweb/view/Cell.re | 5 +- src/haz3lweb/view/Page.re | 96 ++++++++++--------- 7 files changed, 87 insertions(+), 77 deletions(-) diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index aa82c1e76b..965067f510 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -907,11 +907,9 @@ let mk = Core.Memo.general(~cache_size_bound=1000, (ctx, e) => { uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) |> snd }); + let mk = (core: CoreSettings.t, ctx, exp) => { - //TODO(andrew): document or rm - // let exp = - // EditorUtil.append_exp(exp, {ids: [Id.ctx_sentinel], term: EmptyHole}); - print_endline("RETICULATING STATICS"); //TODO(andrew): rm + print_endline("RETICULATING SPLINES"); //TODO(andrew): rm core.statics ? mk(ctx, exp) : Id.Map.empty; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 473b5f5602..0aad5c96b4 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -59,6 +59,7 @@ let textarea = // Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), // Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), //Attr.on_click(_ => inject(FocusInternal(selector))), + Attr.on_keydown(_ => Effect.Stop_propagation), Attr.on_mousedown(_ => { //JsUtil.focus("sdfsdf"); JsUtil.get_elem_by_selector(selector)##focus; @@ -79,11 +80,21 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); +let key_handler = (~inject as _, ~dir: Key.dir, evt): Effect.t(unit) => { + open Effect; + let _key = Key.mk(dir, evt); + print_endline("LALALLA TExtcoree...."); + //Ignore; + Prevent_default; +}; + let view = (model: textarea, ~selector, ~info, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[ Attr.classes(["cols"] @ (model.inside ? ["inside"] : [])), + //Attr.on_keypress(key_handler(~inject, ~dir=KeyDown)), + Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), // Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), ], n_of(Util.StringUtil.num_linebreaks(text)) diff --git a/src/haz3lweb/DebugConsole.re b/src/haz3lweb/DebugConsole.re index b0fbff375b..867199b93e 100644 --- a/src/haz3lweb/DebugConsole.re +++ b/src/haz3lweb/DebugConsole.re @@ -5,34 +5,26 @@ open Haz3lcore; dependency on the model, which is technically against architecture */ let print = ({settings, editors, _}: Model.t, key: string): unit => { - let z = Editors.get_editor(editors).state.zipper; - let print = str => str |> print_endline; - let term = z => z |> MakeTerm.from_zip_for_view |> fst; - let ctx_init = Editors.get_ctx_init(~settings, editors); + let {state: {zipper, meta, _}, _}: Editor.t = Editors.get_editor(editors); + let term = meta.statics.term; + let map = meta.statics.info_map; + let print = print_endline; switch (key) { - | "F1" => z |> Zipper.show |> print - | "F2" => z |> Zipper.unselect_and_zip |> Segment.show |> print - | "F3" => z |> term |> TermBase.UExp.show |> print - | "F4" => - z - |> term - |> Statics.mk(settings.core, ctx_init) - |> Statics.Map.show - |> print + | "F1" => zipper |> Zipper.show |> print + | "F2" => zipper |> Zipper.unselect_and_zip |> Segment.show |> print + | "F3" => term |> TermBase.UExp.show |> print + | "F4" => map |> Statics.Map.show |> print | "F5" => - let env_init = Editors.get_env_init(~settings, editors); - let (term, _) = MakeTerm.from_zip_for_sem(z); - let info_map = Statics.mk(settings.core, ctx_init, term); - Interface.elaborate(~settings=settings.core, info_map, term) - |> Interface.evaluate(~settings=settings.core, ~env=env_init) + let env = Editors.get_env_init(~settings, editors); + Interface.elaborate(~settings=settings.core, map, term) + |> Interface.evaluate(~settings=settings.core, ~env) |> ProgramResult.show |> print; | "F6" => - let index = Indicated.index(z); - let map = z |> term |> Statics.mk(settings.core, ctx_init); + let index = Indicated.index(zipper); switch (index) { | Some(index) => - switch (Haz3lcore.Id.Map.find_opt(index, map)) { + switch (Id.Map.find_opt(index, map)) { | Some(ci) => print(Info.show(ci)) | None => print("DEBUG: No CI found for index") } diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 081c172a95..43d1bb4943 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -50,8 +50,15 @@ let update_opt = (editors: t, f: Editor.t => option(Editor.t)): option(t) => let perform_action = (~settings: CoreSettings.t, editors: t, a: Action.t) : UpdateAction.Result.t(t) => { - let ed = Perform.go(~settings, a, get_editor(editors)); - switch (ed) { + let settings = + switch (editors) { + | Exercises(_) => + /* If we're in exercises mode, statics is calculated externally, + * so we set it to off here to disable internal calculation*/ + CoreSettings.off + | _ => settings + }; + switch (Perform.go(~settings, a, get_editor(editors))) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => Ok(put_editor(ed, editors)) }; diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index aef5da0696..7ac64d3bf5 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -308,6 +308,7 @@ let ui_state_update = | Mousedown => {...ui_state, mousedown: true} | Mouseup => {...ui_state, mousedown: false} | Focus(focus) => + print_endline("Update: setting focus=" ++ focus); JsUtil.focus(~site="update", focus); {...ui_state, focus}; | ShowBackpackTargets(b) => {...ui_state, show_backpack_targets: b} diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 553f6e8c14..ed90e77781 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -8,10 +8,7 @@ let get_goal = (~font_metrics: FontMetrics.t, ~target_id, e) => { let goal_y = float_of_int(e##.clientY); Measured.Point.{ row: Float.to_int((goal_y -. rect##.top) /. font_metrics.row_height), - col: - Float.( - to_int(round((goal_x -. rect##.left) /. font_metrics.col_width)) - ), + col: Float.(to_int((goal_x -. rect##.left) /. font_metrics.col_width)), }; }; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index f0e1589b3a..1d5c3d1c7f 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -3,15 +3,17 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => { - let get_selection = (model: Model.t): string => - model.editors |> Editors.get_editor |> Printer.to_string_selection; +let handlers = + ( + ~inject: UpdateAction.t => Ui_effect.t(unit), + _page_id, + editor: Editor.t, + ) => { let key_handler = (~inject, ~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)) : Effect.t(unit) => { open Effect; let key = Key.mk(dir, evt); - let editor = Editors.get_editor(model.editors); switch (ProjectorView.key_handler(editor, key)) { | Some(Remove(id)) when id == Id.invalid => //TODO(andrew): proper no-op (see ProjectorView) @@ -28,24 +30,29 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => } }; }; - let keypress_handler = - (~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)): Effect.t(unit) => { - let key = Key.mk(dir, evt); - let editor = Editors.get_editor(model.editors); - switch (ProjectorView.key_handler(editor, key)) { - | Some(Remove(id)) when id == Id.invalid => - //TODO(andrew): document why this exists - //TODO(andrew): proper no-op (see ProjectorView) - Effect.Ignore - | _ => Effect.Prevent_default - }; - }; + // let keypress_handler = + // (~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)): Effect.t(unit) => { + // let key = Key.mk(dir, evt); + // switch (ProjectorView.key_handler(editor, key)) { + // | Some(Remove(id)) when id == Id.invalid => + // //TODO(andrew): document why this exists + // //TODO(andrew): proper no-op (see ProjectorView) + // Effect.Ignore + // | _ => Effect.Prevent_default + // }; + // }; [ - Attr.on_keypress(keypress_handler(~dir=KeyDown)), + //Attr.on_keypress(keypress_handler(~dir=KeyDown)), Attr.on_keyup(key_handler(~inject, ~dir=KeyUp)), Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), /* safety handler in case mousedown overlay doesn't catch it */ Attr.on_mouseup(_ => inject(SetMeta(Mouseup))), + // Attr.on_mousedown(_ => { + // //TODO(andrew): check if below focus is load bearing + // print_endline("page mousedown; setting focus: page"); + // //Effect.Ignore; + // inject(SetMeta(Focus(page_id))); + // }), Attr.on_blur(_ => { JsUtil.focus_clipboard_shim(); Effect.Ignore; @@ -55,11 +62,11 @@ let handlers = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => Effect.Ignore; }), Attr.on_copy(_ => { - JsUtil.copy(get_selection(model)); + JsUtil.copy(Printer.to_string_selection(editor)); Effect.Ignore; }), Attr.on_cut(_ => { - JsUtil.copy(get_selection(model)); + JsUtil.copy(Printer.to_string_selection(editor)); inject(UpdateAction.PerformAction(Destruct(Left))); }), Attr.on_paste(evt => { @@ -78,17 +85,14 @@ let main_view = {settings, editors, explainThisModel, results, ui_state, _}: Model.t, ) => { let editor = Editors.get_editor(editors); + let cursor_info = + Indicated.ci_of(editor.state.zipper, editor.state.meta.statics.info_map); + let highlights = + ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); let (editors_view, cursor_info) = switch (editors) { | Scratch(idx, _) => let result_key = ScratchSlide.scratch_key(string_of_int(idx)); - let cursor_info = - Indicated.ci_of( - editor.state.zipper, - editor.state.meta.statics.info_map, - ); - let highlights = - ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); let view = ScratchMode.view( ~inject, @@ -102,31 +106,24 @@ let main_view = (view, cursor_info); | Documentation(name, _) => let result_key = ScratchSlide.scratch_key(name); - let cursor_info = - Indicated.ci_of( - editor.state.zipper, - editor.state.meta.statics.info_map, + let view = + ScratchMode.view( + ~inject, + ~ui_state, + ~settings, + ~highlights, + ~results, + ~result_key, + editor, ); - let highlights = - ExplainThis.get_color_map(~settings, ~explainThisModel, cursor_info); let info = SlideContent.get_content(editors) |> Option.map(i => div(~attrs=[Attr.id("slide")], [i])) |> Option.to_list; - let view = - info - @ ScratchMode.view( - ~inject, - ~ui_state, - ~settings, - ~highlights, - ~results, - ~result_key, - editor, - ); - (view, cursor_info); + (info @ view, cursor_info); | Exercises(_, _, exercise) => - //TODO(andrew): make less costly + /* Note the exercises mode uses a seperate path to calculate + * statics and dynamics via stitching together multiple editors */ let stitched_dynamics = Exercise.stitch_dynamic( settings.core, @@ -186,9 +183,16 @@ let main_view = let get_selection = (model: Model.t): string => model.editors |> Editors.get_editor |> Printer.to_string_selection; +let page_id = "page"; + let view = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => div( - ~attrs=Attr.[id("page"), ...handlers(~inject, model)], + ~attrs= + Attr.[ + tabindex(0), + id(page_id), + ...handlers(~inject, page_id, Editors.get_editor(model.editors)), + ], [ FontSpecimen.view("font-specimen"), DecUtil.filters, From 922b777dc48c75c94c1ffa298e80875b1859d0dc Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 17 Jul 2024 20:04:19 -0400 Subject: [PATCH 103/168] projector focus working but overly hardcoded --- src/haz3lcore/zipper/ProjectorBase.re | 5 +- src/haz3lcore/zipper/action/Action.re | 2 +- .../zipper/action/ProjectorPerform.re | 55 ++++----- .../zipper/projectors/TextAreaCore.re | 112 ++++++++---------- src/haz3lweb/view/Cell.re | 9 +- src/haz3lweb/view/Page.re | 9 +- src/haz3lweb/view/ProjectorView.re | 77 +++++++++--- 7 files changed, 143 insertions(+), 126 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 6dc4cf3828..f5868aa6ea 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -52,13 +52,10 @@ type syntax = Piece.t; type inner_action = ..; //TODO(andrew): decide how to rm -// [@deriving (show({with_path: false}), sexp, yojson)] -type inner_action += - | SetInside(bool); type action = | Remove /* Remove projector */ - | FocusInternal(string) /* DOM Focus on projector */ + | FocusInternal(string, Util.Direction.t) /* DOM Focus on projector */ | Default /* Defer input to focal DOM element */ | Escape(string, Util.Direction.t) /* Pass key control to parent editor */ | SetSyntax(syntax) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index ca507a1ddc..4bb318c4df 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -50,7 +50,7 @@ type project = | UpdateModel(Id.t, Projector.entry => Projector.entry) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) - | FocusInternal(Id.t) + | FocusInternal(Id.t, Util.Direction.t) | Escape(Id.t, Direction.t) | Remove(Id.t); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 949b869327..1bf1ae865c 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -35,47 +35,48 @@ let go = primary: (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), a: Action.project, - syntax_map, + _syntax_map, z: Zipper.t, ) => { - let crime = (_syntax, b, {kind, model}: entry): entry => { - //TODO(andrew): remove this crime - let (module P) = Projector.to_module(kind); - {kind, model: P.update(model, SetInside(b))}; - //p; - }; - let set_dispatch = (z: Zipper.t, id, b) => - switch (Id.Map.find_opt(id, syntax_map)) { - | Some(syntax) => - Ok({ - ...z, - projectors: - Map.update(id, Option.map(crime(syntax, b)), z.projectors), - }) - | None => Error(Action.Failure.Cant_project) - }; switch (a) { - | FocusInternal(id) => - /* Note: jumping her normalizes position, so when exiting - * we know we're intially to the left and can move or not accordingly */ + | FocusInternal(id, d) => + //TODO(andrew): document let z = switch (jump_to_id(z, id)) { | Some(z) => z | None => z }; - set_dispatch(z, id, true); - // JsUtil.get_elem_by_selector(selector)##focus; + let z = + d == Left + ? z + : ( + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + } + ); + Ok(z); | Escape(id, Left) => - // JsUtil.get_elem_by_selector(selector)##blur; let z = - switch (primary(ByToken, Right, z)) { + switch (jump_to_id(z, id)) { | Some(z) => z | None => z }; - set_dispatch(z, id, false); + JsUtil.get_elem_by_selector(".projector.text textarea")##blur; + Ok(z); | Escape(id, Right) => - // JsUtil.get_elem_by_selector(selector)##blur; - set_dispatch(z, id, false) + let z = + switch (jump_to_id(z, id)) { + | Some(z) => z + | None => z + }; + let z = + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + }; + JsUtil.get_elem_by_selector(".projector.text textarea")##blur; + Ok(z); | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Action.Failure.Cant_project) diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 0aad5c96b4..636edbb90f 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -4,17 +4,12 @@ open Virtual_dom.Vdom; open ProjectorBase; [@deriving (show({with_path: false}), sexp, yojson)] -type textarea = {inside: bool}; +type textarea = unit; //{inside: bool}; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //TODO(andrew): unhardcode element !!!!!!!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -//TODO(andrew): reinstate -// [@deriving (show({with_path: false}), sexp, yojson)] -// type inner_action += -// | SetInside(bool); - let selector = ".projector.text textarea"; // let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; // let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; @@ -47,6 +42,40 @@ let put = (s: string): Piece.t => s |> mk_mono(Exp); let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); +let key_handler = (~inject, ~selector, direction: Util.Direction.t, evt) => { + print_endline("HANDLER: TextAreaCore"); + let key = Key.mk(KeyDown, evt); + let textarea = JsUtil.TextArea.get(selector); + //TODO(andrew): clean + //IE query focus state FocusInternal side? + // but what if gets unfocussed due to eg refresh? + let pos = JsUtil.TextArea.caret_rel_pos(textarea); + let is_last_pos = pos.rows == Last && pos.cols == Last; + let is_first_pos = pos.rows == First && pos.cols == First; + // print_endline("is_focus:" ++ string_of_bool(is_focus)); + // let rel_pos = JsUtil.TextArea.caret_rel_pos(textarea); + // let pos = JsUtil.TextArea.caret_pos(textarea); + // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); + // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); + switch (key.key, direction) { + | (D("ArrowRight" | "ArrowDown"), _) when is_last_pos => + Effect.Many([ + inject(Escape(selector, Right)), + Effect.Prevent_default, + Effect.Stop_propagation, + ]) + | (D("ArrowLeft" | "ArrowUp"), _) when is_first_pos => + Effect.Many([ + inject(Escape(selector, Left)), + Effect.Prevent_default, + Effect.Stop_propagation, + ]) + | _ => + print_endline("Warning: Not focussed"); + Effect.Stop_propagation; + }; +}; + let textarea = ( ~selector, @@ -56,20 +85,8 @@ let textarea = Node.textarea( ~attrs=[ Attr.id("sdfsdf"), - // Attr.on_blur(_ => inject(UpdateModel(SetInside(false)))), - // Attr.on_focus(_ => inject(UpdateModel(SetInside(true)))), - //Attr.on_click(_ => inject(FocusInternal(selector))), - Attr.on_keydown(_ => Effect.Stop_propagation), - Attr.on_mousedown(_ => { - //JsUtil.focus("sdfsdf"); - JsUtil.get_elem_by_selector(selector)##focus; - Effect.Ignore; - //inject(FocusInternal(selector)) - // Effect.Many([ - // inject(UpdateModel(SetInside(true))), - // inject(FocusInternal(selector)), - // ]); - }), + Attr.on_keydown(key_handler(~selector, Left, ~inject)), + //Attr.on_mousedown(_ => {Effect.Ignore}), Attr.on_input((_, new_text) => inject(put(new_text))), ], [Node.text(text)], @@ -80,7 +97,7 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let key_handler = (~inject as _, ~dir: Key.dir, evt): Effect.t(unit) => { +let _key_handler = (~inject as _, ~dir: Key.dir, evt): Effect.t(unit) => { open Effect; let _key = Key.mk(dir, evt); print_endline("LALALLA TExtcoree...."); @@ -88,13 +105,11 @@ let key_handler = (~inject as _, ~dir: Key.dir, evt): Effect.t(unit) => { Prevent_default; }; -let view = (model: textarea, ~selector, ~info, ~inject) => { +let view = (_model: textarea, ~selector, ~info, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[ - Attr.classes(["cols"] @ (model.inside ? ["inside"] : [])), - //Attr.on_keypress(key_handler(~inject, ~dir=KeyDown)), - Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), + Attr.classes(["cols" /*@ (model.inside ? ["inside"] : [])*/]), // Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), ], n_of(Util.StringUtil.num_linebreaks(text)) @@ -103,36 +118,14 @@ let view = (model: textarea, ~selector, ~info, ~inject) => { }; let keymap = - (~selector, model: textarea, direction: Util.Direction.t, key: Key.t) + ( + ~selector as _, + _model: textarea, + _direction: Util.Direction.t, + _key: Key.t, + ) : option(ProjectorBase.action) => { - let textarea = JsUtil.TextArea.get(selector); - let focussed = model.inside; - //TODO(andrew): make actual focus king? - //IE query focus state FocusInternal side? - // but what if gets unfocussed due to eg refresh? - let pos = JsUtil.TextArea.caret_rel_pos(textarea); - let is_last_pos = pos.rows == Last && pos.cols == Last; - let is_first_pos = pos.rows == First && pos.cols == First; - // print_endline("is_focus:" ++ string_of_bool(is_focus)); - // let rel_pos = JsUtil.TextArea.caret_rel_pos(textarea); - // let pos = JsUtil.TextArea.caret_pos(textarea); - // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); - // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); - switch (key.key, direction) { - | (D("ArrowRight"), Right) when !focussed && !(key.shift == Down) => - Some(FocusInternal(selector)) - | (D("ArrowLeft"), Left) when !focussed && !(key.shift == Down) => - JsUtil.TextArea.set_caret_to_end(textarea); - Some(FocusInternal(selector)); - | (D("ArrowRight" | "ArrowDown"), _) when focussed && is_last_pos => - Some(Escape(selector, Left)) - | (D("ArrowLeft" | "ArrowUp"), _) when focussed && is_first_pos => - Some(Escape(selector, Right)) - | _ when focussed => Some(Default) - | _ => - print_endline("Warning: Not focussed"); - None; - }; + None; }; let line_lengths = syntax => List.map(String.length, Re.Str.split(Re.Str.regexp("\n"), get(syntax))); @@ -146,18 +139,11 @@ let placeholder = (_, info) => module M: CoreInner = { [@deriving (show({with_path: false}), sexp, yojson)] type model = textarea; - let init = {inside: false}; + let init = (); //{inside: false}; let can_project = _ => true; //TODO(andrew): restrict let placeholder = placeholder; // let auto_update = _ => TextArea(model); - let update = (model, a) => - switch (a) { - | SetInside(b) => - JsUtil.get_elem_by_selector(selector)##focus; - print_endline("setting inside:" ++ string_of_bool(b)); - {inside: b}; - | _ => model - }; + let update = (model, _) => model; let view = view(~selector); let keymap = keymap(~selector); }; diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index ed90e77781..ec86f0a043 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -259,14 +259,7 @@ let editor_view = }; let code_text_view = Code.view(~sort, ~font_metrics, ~settings, meta); let deco_view = - deco( - ~inject=a => inject(PerformAction(Project(a))), - ~ui_state, - ~selected, - ~test_results, - ~highlights, - meta, - ); + deco(~inject, ~ui_state, ~selected, ~test_results, ~highlights, meta); let code_view = div( ~attrs=[Attr.id(target_id), Attr.classes(["code-container"])], diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 1d5c3d1c7f..81e293e019 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -15,12 +15,13 @@ let handlers = open Effect; let key = Key.mk(dir, evt); switch (ProjectorView.key_handler(editor, key)) { - | Some(Remove(id)) when id == Id.invalid => - //TODO(andrew): proper no-op (see ProjectorView) - Ignore + // | Some(Remove(id)) when id == Id.invalid => + // //TODO(andrew): proper no-op (see ProjectorView) + // Ignore | Some(action) => Many([ Prevent_default, + // Stop_propagation, inject(Update.PerformAction(Project(action))), ]) | None => @@ -189,7 +190,7 @@ let view = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => div( ~attrs= Attr.[ - tabindex(0), + //tabindex(0), id(page_id), ...handlers(~inject, page_id, Editors.get_editor(model.editors)), ], diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 953bfd0266..fe5383e2e9 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -38,15 +38,12 @@ let handle = (id, action: ProjectorBase.action): Action.project => //TODO(andrew): proper no-op Remove(Id.invalid) | Remove => Remove(id) - | FocusInternal(selector) => + | FocusInternal(selector, d) => JsUtil.get_elem_by_selector(selector)##focus; - Action.(FocusInternal(id)); - | Escape(selector, Left) => + Action.(FocusInternal(id, d)); + | Escape(selector, d) => JsUtil.get_elem_by_selector(selector)##blur; - Escape(id, Left); - | Escape(selector, Right) => - JsUtil.get_elem_by_selector(selector)##blur; - Escape(id, Right); + Escape(id, d); | SetSyntax(f) => SetSyntax(id, f) | UpdateModel(action) => UpdateModel(id, update_model(action)) }; @@ -75,9 +72,11 @@ let cls = (indicated: option(status), selected) => let view_inner = ( + ~inject as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~status: option(Projector.status), + ~id as _, ~info: info, ~selected: bool, entry: Projector.entry, @@ -94,6 +93,10 @@ let view_inner = [ div( ~attrs=[ + // Attr.on_mousedown(_ => { + // print_endline("projector external wrapper mousedown"); + // inject(Update.PerformAction(Jump(TileId(id)))); + // }), JsUtil.stop_mousedown_propagation, Attr.classes(["projector-wrapper"]), ], @@ -108,7 +111,7 @@ let view_setup = ( id: Id.t, ~meta: Editor.Meta.t, - ~inject: Action.project => Ui_effect.t(unit), + ~inject, ~font_metrics, ~status: option(Projector.status), ) @@ -119,15 +122,20 @@ let view_setup = let info = {ci, syntax, status}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); - let inject = a => handle(id, a) |> inject; + //let inject = a => PerformAction(Project(handle(id, a) |> inject)); + view_inner( + ~inject, + ~id, ~font_metrics, ~measurement, ~status, ~info, ~selected=List.mem(id, meta.selection_ids), p, - P.view(p.model, ~info, ~inject), + P.view(p.model, ~info, ~inject=a => + inject(UpdateAction.PerformAction(Project(handle(id, a)))) + ), ); }; @@ -144,12 +152,7 @@ let status = (z: ZipperBase.t): option(status) => | None => None }; -let view_all = - ( - ~meta: Editor.Meta.t, - ~inject: Action.project => Ui_effect.t(unit), - ~font_metrics, - ) => +let view_all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => List.filter_map( ((id, _)) => { view_setup( @@ -213,11 +216,47 @@ let caret = (z: Zipper.t, meta: Editor.Meta.t): option(list(Node.t)) => let key_handler = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None - | Some((id, {kind, model})) => + | Some((id, {kind: _, model: _})) => + print_endline("HANDLER: ProjectorView.key_handler"); //let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); let* (_, d, _) = Indicated.piece(editor.state.zipper); - let (module P) = to_module(kind); - let+ action = P.keymap(model, d, key); + //let (module P) = to_module(kind); + //TODO(andrew): unhardcode element !!!!!!!!!! + let selector = ".projector.text textarea"; + let+ action = + switch (key, d) { + | ( + { + key: D("ArrowRight"), + sys: _, + shift: Up, + meta: Up, + ctrl: Up, + alt: Up, + }, + Right, + ) + when !(key.shift == Down) => + Some(FocusInternal(selector, Left)) + | ( + { + key: D("ArrowLeft"), + sys: _, + shift: Up, + meta: Up, + ctrl: Up, + alt: Up, + }, + Left, + ) + when !(key.shift == Down) => + //TODO(andrew): internalize into textarea + let textarea = JsUtil.TextArea.get(selector); + JsUtil.TextArea.set_caret_to_end(textarea); + Some(FocusInternal(selector, Right)); + | _ => None + }; + //let+ action = P.keymap(model, d, key); handle(id, action); }; From a2ffdee3d8d94cb11030ed009608a61801be042e Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 00:14:49 -0400 Subject: [PATCH 104/168] factored textarea-specific focus/blur logic into generic interface --- src/haz3lcore/zipper/ProjectorBase.re | 15 +-- src/haz3lcore/zipper/action/Perform.re | 9 +- .../zipper/action/ProjectorPerform.re | 5 +- .../zipper/projectors/CheckboxCore.re | 3 +- src/haz3lcore/zipper/projectors/FoldCore.re | 3 +- src/haz3lcore/zipper/projectors/InfoCore.re | 12 ++- src/haz3lcore/zipper/projectors/SliderCore.re | 3 +- .../zipper/projectors/SliderFCore.re | 3 +- .../zipper/projectors/TextAreaCore.re | 94 ++++++------------- src/haz3lweb/Keyboard.re | 3 - src/haz3lweb/view/Page.re | 72 +++++--------- src/haz3lweb/view/ProjectorView.re | 84 +++++------------ 12 files changed, 99 insertions(+), 207 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index f5868aa6ea..403dabcb54 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -1,5 +1,6 @@ open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; +open Util; open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] @@ -55,9 +56,8 @@ type inner_action = ..; type action = | Remove /* Remove projector */ - | FocusInternal(string, Util.Direction.t) /* DOM Focus on projector */ - | Default /* Defer input to focal DOM element */ - | Escape(string, Util.Direction.t) /* Pass key control to parent editor */ + | FocusInternal(Util.Direction.t) /* DOM Focus on projector */ + | Escape(Util.Direction.t) /* Pass key control to parent editor */ | SetSyntax(syntax) | UpdateModel(inner_action); @@ -79,7 +79,8 @@ module type CoreInner = { (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; let placeholder: (model, info) => shape; let update: (model, inner_action) => model; - let keymap: (model, Util.Direction.t, Key.t) => option(action); + let activate: Direction.t => unit; + // let keymap: (model, Util.Direction.t, Key.t) => option(action); }; module type CoreOuter = { @@ -89,7 +90,8 @@ module type CoreOuter = { (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; let placeholder: (model, info) => shape; let update: (model, inner_action) => model; - let keymap: (model, Util.Direction.t, Key.t) => option(action); + let activate: Direction.t => unit; + // let keymap: (model, Util.Direction.t, Key.t) => option(action); }; module CoreOuterMk = (C: CoreInner) : CoreOuter => { @@ -98,7 +100,8 @@ module CoreOuterMk = (C: CoreInner) : CoreOuter => { let view = m => m |> C.model_of_sexp |> C.view; let placeholder = m => m |> C.model_of_sexp |> C.placeholder; let update = (m, a) => C.update(C.model_of_sexp(m), a) |> C.sexp_of_model; - let keymap = (m: Sexplib.Sexp.t) => m |> C.model_of_sexp |> C.keymap; + let activate = C.activate; + // let keymap = (m: Sexplib.Sexp.t) => m |> C.model_of_sexp |> C.keymap; }; type core = (module CoreOuter); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 671843045c..1e76e67d7a 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -139,14 +139,7 @@ let go_z = } } } - | Project(a) => - ProjectorPerform.go( - Move.jump_to_id, - Move.primary, - a, - meta.projected.syntax_map, - z, - ) + | Project(a) => ProjectorPerform.go(Move.jump_to_id, Move.primary, a, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | Jump(jump_target) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 1bf1ae865c..3b01da8b4e 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -35,12 +35,11 @@ let go = primary: (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), a: Action.project, - _syntax_map, z: Zipper.t, ) => { + //TODO(andrew): document switch (a) { | FocusInternal(id, d) => - //TODO(andrew): document let z = switch (jump_to_id(z, id)) { | Some(z) => z @@ -62,7 +61,6 @@ let go = | Some(z) => z | None => z }; - JsUtil.get_elem_by_selector(".projector.text textarea")##blur; Ok(z); | Escape(id, Right) => let z = @@ -75,7 +73,6 @@ let go = | Some(z) => z | None => z }; - JsUtil.get_elem_by_selector(".projector.text textarea")##blur; Ok(z); | SetIndicated(p) => switch (Indicated.for_index(z)) { diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 19fc69c525..6a6091ff03 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -52,5 +52,6 @@ module M: CoreInner = { let placeholder = (_, _) => Inline(2); let update = (model, _) => model; let view = view; - let keymap = keymap; + let activate = _ => (); + // let keymap = keymap; }; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 346aa343cb..2784a37ce8 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -16,5 +16,6 @@ module M: CoreInner = { ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], ); - let keymap = (_, _, _): option(action) => None; + let activate = _ => (); + // let keymap = (_, _, _): option(action) => None; }; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 740c32ba6c..5508f73832 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -42,12 +42,15 @@ module M: CoreInner = { type model = | Expected | Self; + let init = Expected; + let can_project = (p: Piece.t): bool => switch (Piece.sort(p)) { | (Exp | Pat, _) => true | _ => false }; + let display = (model, info) => switch (model) { | _ when mode(info) == Some(Syn) => syn_display(info) @@ -57,19 +60,18 @@ module M: CoreInner = { let placeholder = (model, info: ProjectorBase.info) => Inline((display(model, info.ci) |> String.length) - 2); + let update = (model, a: inner_action) => switch (a, model) { | (ToggleDisplay, Expected) => Self | (ToggleDisplay, Self) => Expected | _ => model }; + let view = (model, ~info: ProjectorBase.info, ~inject) => div( - ~attrs=[ - Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay))), - //Attr.on_double_click(_ => inject(Remove)), - ], + ~attrs=[Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay)))], [text(display(model, info.ci))], ); - let keymap = (_, _, _): option(_) => None; + let activate = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 8fe9b69ab4..5809a47d99 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -26,5 +26,6 @@ module M: CoreInner = { ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax), ); - let keymap = (_, _, _) => None; + let activate = _ => (); + // let keymap = (_, _, _) => None; }; diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 5d67f031fa..4c7ece771b 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -29,5 +29,6 @@ module M: CoreInner = { ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax) |> Printf.sprintf("%.2f"), ); - let keymap = (_, _, _) => None; + let activate = _ => (); + // let keymap = (_, _, _) => None; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 636edbb90f..dee56ed4b5 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,19 +1,9 @@ +open Util; open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; -[@deriving (show({with_path: false}), sexp, yojson)] -type textarea = unit; //{inside: bool}; - -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -//TODO(andrew): unhardcode element !!!!!!!!!! -// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -let selector = ".projector.text textarea"; -// let serialize = a => a |> sexp_of_action_ |> Sexplib.Sexp.to_string; -// let deserialize = a => a |> Sexplib.Sexp.of_string |> action__of_sexp; - let escape_linebreaks: string => string = Re.Str.global_replace(Re.Str.regexp("\n"), "\\n"); @@ -29,8 +19,6 @@ let of_mono = (syntax: Piece.t): option(string) => let mk_mono = (sort: Sort.t, string: string): Piece.t => string |> escape_linebreaks |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); -let state_of = (piece: Piece.t): option(string) => piece |> of_mono; - let get = (piece: Piece.t): string => switch (piece |> of_mono) { | None => failwith("TextArea: not string literal") @@ -43,36 +31,19 @@ let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); let key_handler = (~inject, ~selector, direction: Util.Direction.t, evt) => { - print_endline("HANDLER: TextAreaCore"); + open Effect; let key = Key.mk(KeyDown, evt); - let textarea = JsUtil.TextArea.get(selector); - //TODO(andrew): clean - //IE query focus state FocusInternal side? - // but what if gets unfocussed due to eg refresh? - let pos = JsUtil.TextArea.caret_rel_pos(textarea); + let pos = JsUtil.TextArea.caret_rel_pos(JsUtil.TextArea.get(selector)); let is_last_pos = pos.rows == Last && pos.cols == Last; let is_first_pos = pos.rows == First && pos.cols == First; - // print_endline("is_focus:" ++ string_of_bool(is_focus)); - // let rel_pos = JsUtil.TextArea.caret_rel_pos(textarea); - // let pos = JsUtil.TextArea.caret_pos(textarea); - // print_endline("pos: " ++ JsUtil.TextArea.show_rel_pos(rel_pos)); - // print_endline("pos': " ++ JsUtil.TextArea.show_pos(pos)); switch (key.key, direction) { | (D("ArrowRight" | "ArrowDown"), _) when is_last_pos => - Effect.Many([ - inject(Escape(selector, Right)), - Effect.Prevent_default, - Effect.Stop_propagation, - ]) + JsUtil.get_elem_by_selector(selector)##blur; + Many([inject(Escape(Right)), Prevent_default, Stop_propagation]); | (D("ArrowLeft" | "ArrowUp"), _) when is_first_pos => - Effect.Many([ - inject(Escape(selector, Left)), - Effect.Prevent_default, - Effect.Stop_propagation, - ]) - | _ => - print_endline("Warning: Not focussed"); - Effect.Stop_propagation; + JsUtil.get_elem_by_selector(selector)##blur; + Many([inject(Escape(Left)), Prevent_default, Stop_propagation]); + | _ => Stop_propagation }; }; @@ -84,9 +55,7 @@ let textarea = ) => Node.textarea( ~attrs=[ - Attr.id("sdfsdf"), Attr.on_keydown(key_handler(~selector, Left, ~inject)), - //Attr.on_mousedown(_ => {Effect.Ignore}), Attr.on_input((_, new_text) => inject(put(new_text))), ], [Node.text(text)], @@ -97,39 +66,20 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let _key_handler = (~inject as _, ~dir: Key.dir, evt): Effect.t(unit) => { - open Effect; - let _key = Key.mk(dir, evt); - print_endline("LALALLA TExtcoree...."); - //Ignore; - Prevent_default; -}; - -let view = (_model: textarea, ~selector, ~info, ~inject) => { +let view = (_, ~selector, ~info, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( - ~attrs=[ - Attr.classes(["cols" /*@ (model.inside ? ["inside"] : [])*/]), - // Attr.classes(["cols"] @ (model.inside ? [] : cls(info.status))), - ], + ~attrs=[Attr.classes(["cols"])], n_of(Util.StringUtil.num_linebreaks(text)) @ [textarea(~inject, ~selector, text)], ); }; -let keymap = - ( - ~selector as _, - _model: textarea, - _direction: Util.Direction.t, - _key: Key.t, - ) - : option(ProjectorBase.action) => { - None; -}; let line_lengths = syntax => List.map(String.length, Re.Str.split(Re.Str.regexp("\n"), get(syntax))); + let num_lines = syntax => List.fold_left(max, 0, line_lengths(syntax)); + let placeholder = (_, info) => Block({ row: Util.StringUtil.num_linebreaks(get(info.syntax)), @@ -138,12 +88,22 @@ let placeholder = (_, info) => module M: CoreInner = { [@deriving (show({with_path: false}), sexp, yojson)] - type model = textarea; - let init = (); //{inside: false}; - let can_project = _ => true; //TODO(andrew): restrict + type model = unit; + let init = (); + let can_project = _ => true; //TODO(andrew): restrict somehow let placeholder = placeholder; - // let auto_update = _ => TextArea(model); let update = (model, _) => model; + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + //TODO(andrew): unhardcode element !!!!!!!!!! + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + let selector = ".projector.text textarea"; let view = view(~selector); - let keymap = keymap(~selector); + let activate = (d: Direction.t) => { + JsUtil.get_elem_by_selector(selector)##focus; + switch (d) { + | Left => () + | Right => + JsUtil.TextArea.set_caret_to_end(JsUtil.TextArea.get(selector)) + }; + }; }; diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index e3b7782802..c6ff1951b1 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -73,9 +73,6 @@ let handle_key_event = (k: Key.t): option(Update.t) => { } | {key: D(key), sys: Mac, shift: Up, meta: Down, ctrl: Up, alt: Up} => switch (key) { - | "e" => - print_endline("ssssss"); - Some(SetMeta(Focus("sdfsdf"))); | "z" => Some(Undo) | "d" => now(Select(Term(Current))) | "p" => Some(PerformAction(Pick_up)) diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 81e293e019..749589687e 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -3,57 +3,34 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -let handlers = +let key_handler = ( ~inject: UpdateAction.t => Ui_effect.t(unit), - _page_id, + ~dir: Key.dir, editor: Editor.t, - ) => { - let key_handler = - (~inject, ~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)) - : Effect.t(unit) => { - open Effect; - let key = Key.mk(dir, evt); - switch (ProjectorView.key_handler(editor, key)) { - // | Some(Remove(id)) when id == Id.invalid => - // //TODO(andrew): proper no-op (see ProjectorView) - // Ignore - | Some(action) => - Many([ - Prevent_default, - // Stop_propagation, - inject(Update.PerformAction(Project(action))), - ]) - | None => - switch (Keyboard.handle_key_event(key)) { - | None => Ignore - | Some(action) => Many([Prevent_default, inject(action)]) - } - }; + evt: Js.t(Dom_html.keyboardEvent), + ) + : Effect.t(unit) => { + open Effect; + let key = Key.mk(dir, evt); + switch (ProjectorView.key_handoff(editor, key)) { + | Some(action) => + Many([Prevent_default, inject(PerformAction(Project(action)))]) + | None => + switch (Keyboard.handle_key_event(key)) { + | None => Ignore + | Some(action) => Many([Prevent_default, inject(action)]) + } }; - // let keypress_handler = - // (~dir: Key.dir, evt: Js.t(Dom_html.keyboardEvent)): Effect.t(unit) => { - // let key = Key.mk(dir, evt); - // switch (ProjectorView.key_handler(editor, key)) { - // | Some(Remove(id)) when id == Id.invalid => - // //TODO(andrew): document why this exists - // //TODO(andrew): proper no-op (see ProjectorView) - // Effect.Ignore - // | _ => Effect.Prevent_default - // }; - // }; +}; + +let handlers = + (~inject: UpdateAction.t => Ui_effect.t(unit), editor: Editor.t) => { [ - //Attr.on_keypress(keypress_handler(~dir=KeyDown)), - Attr.on_keyup(key_handler(~inject, ~dir=KeyUp)), - Attr.on_keydown(key_handler(~inject, ~dir=KeyDown)), + Attr.on_keyup(key_handler(~inject, editor, ~dir=KeyUp)), + Attr.on_keydown(key_handler(~inject, editor, ~dir=KeyDown)), /* safety handler in case mousedown overlay doesn't catch it */ Attr.on_mouseup(_ => inject(SetMeta(Mouseup))), - // Attr.on_mousedown(_ => { - // //TODO(andrew): check if below focus is load bearing - // print_endline("page mousedown; setting focus: page"); - // //Effect.Ignore; - // inject(SetMeta(Focus(page_id))); - // }), Attr.on_blur(_ => { JsUtil.focus_clipboard_shim(); Effect.Ignore; @@ -184,15 +161,12 @@ let main_view = let get_selection = (model: Model.t): string => model.editors |> Editors.get_editor |> Printer.to_string_selection; -let page_id = "page"; - let view = (~inject: UpdateAction.t => Ui_effect.t(unit), model: Model.t) => div( ~attrs= Attr.[ - //tabindex(0), - id(page_id), - ...handlers(~inject, page_id, Editors.get_editor(model.editors)), + id("page"), + ...handlers(~inject, Editors.get_editor(model.editors)), ], [ FontSpecimen.view("font-specimen"), diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index fe5383e2e9..b06681f174 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -34,16 +34,9 @@ let update_model = (action: ProjectorBase.inner_action, {kind, model}) => { let handle = (id, action: ProjectorBase.action): Action.project => switch (action) { - | Default => - //TODO(andrew): proper no-op - Remove(Id.invalid) | Remove => Remove(id) - | FocusInternal(selector, d) => - JsUtil.get_elem_by_selector(selector)##focus; - Action.(FocusInternal(id, d)); - | Escape(selector, d) => - JsUtil.get_elem_by_selector(selector)##blur; - Escape(id, d); + | FocusInternal(d) => FocusInternal(id, d) + | Escape(d) => Escape(id, d) | SetSyntax(f) => SetSyntax(id, f) | UpdateModel(action) => UpdateModel(id, update_model(action)) }; @@ -70,13 +63,12 @@ let cls = (indicated: option(status), selected) => } ); -let view_inner = +let view_wrapper = ( ~inject as _, ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~status: option(Projector.status), - ~id as _, ~info: info, ~selected: bool, entry: Projector.entry, @@ -93,6 +85,7 @@ let view_inner = [ div( ~attrs=[ + //TODO(andrew): cleanup (can we just remove the -wrapper?) // Attr.on_mousedown(_ => { // print_endline("projector external wrapper mousedown"); // inject(Update.PerformAction(Jump(TileId(id)))); @@ -111,7 +104,7 @@ let view_setup = ( id: Id.t, ~meta: Editor.Meta.t, - ~inject, + ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, ~status: option(Projector.status), ) @@ -122,25 +115,20 @@ let view_setup = let info = {ci, syntax, status}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); - //let inject = a => PerformAction(Project(handle(id, a) |> inject)); - - view_inner( + let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); + view_wrapper( ~inject, - ~id, ~font_metrics, ~measurement, ~status, ~info, ~selected=List.mem(id, meta.selection_ids), p, - P.view(p.model, ~info, ~inject=a => - inject(UpdateAction.PerformAction(Project(handle(id, a)))) - ), + P.view(p.model, ~info, ~inject=inject_proj), ); }; let status_and_id = (z: ZipperBase.t) => - //TODO(andrew): add Selected, Focused (maybe) switch (Indicated.piece(z)) { | Some((p, d, _)) => Some((Piece.id(p), Indicated(d))) | None => None @@ -213,51 +201,25 @@ let caret = (z: Zipper.t, meta: Editor.Meta.t): option(list(Node.t)) => | Some(Block(_)) => Some([]) }; -let key_handler = (editor: Editor.t, key: Key.t): option(Action.project) => +let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None - | Some((id, {kind: _, model: _})) => - print_endline("HANDLER: ProjectorView.key_handler"); - //let* syntax = Id.Map.find_opt(id, editor.state.meta.projected.syntax_map); + | Some((id, p)) => let* (_, d, _) = Indicated.piece(editor.state.zipper); - //let (module P) = to_module(kind); - //TODO(andrew): unhardcode element !!!!!!!!!! - let selector = ".projector.text textarea"; - let+ action = + let (module P) = to_module(p.kind); + switch (key) { + | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} => switch (key, d) { - | ( - { - key: D("ArrowRight"), - sys: _, - shift: Up, - meta: Up, - ctrl: Up, - alt: Up, - }, - Right, - ) - when !(key.shift == Down) => - Some(FocusInternal(selector, Left)) - | ( - { - key: D("ArrowLeft"), - sys: _, - shift: Up, - meta: Up, - ctrl: Up, - alt: Up, - }, - Left, - ) - when !(key.shift == Down) => - //TODO(andrew): internalize into textarea - let textarea = JsUtil.TextArea.get(selector); - JsUtil.TextArea.set_caret_to_end(textarea); - Some(FocusInternal(selector, Right)); + | (D("ArrowRight"), Right) => + P.activate(Left); + Some(Action.FocusInternal(id, Left)); + | (D("ArrowLeft"), Left) => + P.activate(Right); + Some(FocusInternal(id, Right)); | _ => None - }; - //let+ action = P.keymap(model, d, key); - handle(id, action); + } + | _ => None + }; }; let option_view = (name, n) => @@ -270,7 +232,7 @@ let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [(Checkbox: Projector.kind)] + | Pat(Bool) => [Checkbox] | Exp(Int) | Pat(Int) => [Slider] | Exp(Float) From f6a7c5d88ae8ba1ba7e88b39194645a079333b8b Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 00:27:10 -0400 Subject: [PATCH 105/168] fixed bug with not being able to info project holes --- src/haz3lcore/zipper/projectors/InfoCore.re | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 5508f73832..65d02a8782 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -45,11 +45,13 @@ module M: CoreInner = { let init = Expected; - let can_project = (p: Piece.t): bool => + let can_project = (p: Piece.t): bool => { switch (Piece.sort(p)) { | (Exp | Pat, _) => true + | _ when Piece.is_grout(p) => true /* Grout don't have sorts rn */ | _ => false }; + }; let display = (model, info) => switch (model) { From daa021cf741a7c524637bdba746f6d742ad35737 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 01:28:14 -0400 Subject: [PATCH 106/168] serialized projector action type --- src/haz3lcore/zipper/Projector.re | 14 ++-- src/haz3lcore/zipper/ProjectorBase.re | 75 ++++++++++--------- src/haz3lcore/zipper/action/Action.re | 2 +- .../zipper/action/ProjectorPerform.re | 8 +- .../zipper/projectors/CheckboxCore.re | 8 +- src/haz3lcore/zipper/projectors/FoldCore.re | 7 +- src/haz3lcore/zipper/projectors/InfoCore.re | 16 ++-- src/haz3lcore/zipper/projectors/SliderCore.re | 13 +++- .../zipper/projectors/SliderFCore.re | 13 +++- .../zipper/projectors/TextAreaCore.re | 6 +- src/haz3lweb/view/ProjectorView.re | 31 ++++---- 11 files changed, 112 insertions(+), 81 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 4ec43b6b53..91696ad82c 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,14 +1,14 @@ open Util; include ProjectorBase; -let to_module = (kind: kind): core => +let to_module = (kind: kind): (module Cooked) => switch (kind) { - | Fold => (module CoreOuterMk(FoldCore.M)) - | Info => (module CoreOuterMk(InfoCore.M)) - | Slider => (module CoreOuterMk(SliderCore.M)) - | SliderF => (module CoreOuterMk(SliderFCore.M)) - | Checkbox => (module CoreOuterMk(CheckboxCore.M)) - | TextArea => (module CoreOuterMk(TextAreaCore.M)) + | Fold => (module Cook(FoldCore.M)) + | Info => (module Cook(InfoCore.M)) + | Slider => (module Cook(SliderCore.M)) + | SliderF => (module Cook(SliderFCore.M)) + | Checkbox => (module Cook(CheckboxCore.M)) + | TextArea => (module Cook(TextAreaCore.M)) }; let shape = (p: entry, syntax): shape => { diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 403dabcb54..0aa292e91f 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -12,19 +12,10 @@ type kind = | SliderF | TextArea; -[@deriving (show({with_path: false}), sexp)] -type sexp2 = Sexplib.Sexp.t; -//TODO(andrew): proper serialization -let sexp2_of_yojson = _ => - Sexplib.Sexp.Atom("TODO(andrew): proper serialization"); -let yojson_of_sexp2 = _ => Yojson.Safe.from_string("TODOTODOTODO"); -[@deriving (show({with_path: false}), sexp, yojson)] -type model = sexp2; - [@deriving (show({with_path: false}), sexp, yojson)] type entry = { kind, - model, + model: string, }; [@deriving (show({with_path: false}), sexp, yojson)] @@ -51,15 +42,14 @@ type status = [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; -type inner_action = ..; -//TODO(andrew): decide how to rm - type action = | Remove /* Remove projector */ | FocusInternal(Util.Direction.t) /* DOM Focus on projector */ | Escape(Util.Direction.t) /* Pass key control to parent editor */ - | SetSyntax(syntax) - | UpdateModel(inner_action); + | SetSyntax(syntax) /* Set underlying syntax */ + | UpdateModel(string); /* Set serialized model */ + +type p_action = action; /* Externally calculated info to be fed to projectors */ [@deriving (show({with_path: false}), sexp, yojson)] @@ -69,39 +59,56 @@ type info = { ci: option(Info.t), }; -module type CoreInner = { +module type Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model; - + [@deriving (show({with_path: false}), sexp, yojson)] + type action; let init: model; let can_project: Piece.t => bool; let view: - (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; + ( + model, + ~info: info, + ~go: action => Ui_effect.t(unit), + ~inject: p_action => Ui_effect.t(unit) + ) => + Node.t; let placeholder: (model, info) => shape; - let update: (model, inner_action) => model; + let update: (model, action) => model; let activate: Direction.t => unit; - // let keymap: (model, Util.Direction.t, Key.t) => option(action); }; -module type CoreOuter = { - let init: model; +type serialized_model = string; +type serialized_action = string; +module type Cooked = { + let init: serialized_model; let can_project: Piece.t => bool; let view: - (model, ~info: info, ~inject: action => Ui_effect.t(unit)) => Node.t; - let placeholder: (model, info) => shape; - let update: (model, inner_action) => model; + ( + serialized_model, + ~info: info, + ~go: serialized_action => Ui_effect.t(unit), + ~inject: p_action => Ui_effect.t(unit) + ) => + Node.t; + let placeholder: (serialized_model, info) => shape; + let update: (serialized_model, serialized_action) => serialized_model; let activate: Direction.t => unit; - // let keymap: (model, Util.Direction.t, Key.t) => option(action); }; -module CoreOuterMk = (C: CoreInner) : CoreOuter => { - let init = C.sexp_of_model(C.init); +module Cook = (C: Projector) : Cooked => { + let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; + let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; + let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; + let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; + let init = C.init |> serialize_m; let can_project = C.can_project; - let view = m => m |> C.model_of_sexp |> C.view; - let placeholder = m => m |> C.model_of_sexp |> C.placeholder; - let update = (m, a) => C.update(C.model_of_sexp(m), a) |> C.sexp_of_model; + let view = (m, ~info, ~go, ~inject) => + C.view(deserialize_m(m), ~info, ~go=a => go(serialize_a(a)), ~inject); + let placeholder = m => + m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; + let update = (m, a) => + C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; let activate = C.activate; - // let keymap = (m: Sexplib.Sexp.t) => m |> C.model_of_sexp |> C.keymap; }; - -type core = (module CoreOuter); diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 4bb318c4df..01de646c34 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -47,7 +47,7 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = | SetSyntax(Id.t, Piece.t) - | UpdateModel(Id.t, Projector.entry => Projector.entry) + | UpdateModel(Id.t, string) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) | FocusInternal(Id.t, Util.Direction.t) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 3b01da8b4e..e3b243c843 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -91,11 +91,15 @@ let go = | true => Ok(set(id, None, z)) } | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) - | UpdateModel(id, f) => + | UpdateModel(id, model) => Ok({ ...z, projectors: - Map.update(id, entry => Option.map(f, entry), z.projectors), + Map.update( + id, + entry => Option.map(e => {model, kind: e.kind}, entry), + z.projectors, + ), }) }; }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 6a6091ff03..14f7a7bb7f 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -25,7 +25,8 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); -let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => +let view = + (_, ~info, ~go as _, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => Node.input( ~attrs= [ @@ -44,14 +45,15 @@ let keymap = (_, _, key: Key.t): option(ProjectorBase.action) => | _ => None }; -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let init = (); let can_project = p => state_of(p) != None; let placeholder = (_, _) => Inline(2); let update = (model, _) => model; let view = view; let activate = _ => (); - // let keymap = keymap; }; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 2784a37ce8..3c8854c456 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -4,18 +4,19 @@ open ProjectorBase; open Virtual_dom.Vdom; open Node; -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let init = (); let can_project = _ => true; let placeholder = (_, _) => Inline(2); let update = (_, _) => (); - let view = (_, ~info as _, ~inject) => + let view = (_, ~info as _, ~go as _, ~inject) => div( ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], ); let activate = _ => (); - // let keymap = (_, _, _): option(action) => None; }; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 65d02a8782..604a878908 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -2,9 +2,6 @@ open Virtual_dom.Vdom; open Node; open ProjectorBase; -type inner_action += - | ToggleDisplay; - let mode = (info: option(Info.t)): option(Mode.t) => switch (info) { | Some(InfoExp({mode, _})) @@ -37,12 +34,16 @@ let syn_display = info => let ana_display = info => "⋱ ⇐ " ++ (info |> expected_ty |> display_ty |> Typ.pretty_print); -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = | Expected | Self; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = + | ToggleDisplay; + let init = Expected; let can_project = (p: Piece.t): bool => { @@ -63,16 +64,15 @@ module M: CoreInner = { let placeholder = (model, info: ProjectorBase.info) => Inline((display(model, info.ci) |> String.length) - 2); - let update = (model, a: inner_action) => + let update = (model, a: action) => switch (a, model) { | (ToggleDisplay, Expected) => Self | (ToggleDisplay, Self) => Expected - | _ => model }; - let view = (model, ~info: ProjectorBase.info, ~inject) => + let view = (model, ~info: ProjectorBase.info, ~go, ~inject as _) => div( - ~attrs=[Attr.on_mousedown(_ => inject(UpdateModel(ToggleDisplay)))], + ~attrs=[Attr.on_mousedown(_ => go(ToggleDisplay))], [text(display(model, info.ci))], ); let activate = _ => (); diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 5809a47d99..207ee2a837 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -14,18 +14,25 @@ let get = (piece: Piece.t): string => | Some(s) => string_of_int(s) }; -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let init = (); let can_project = p => get_opt(p) != None; let placeholder = (_, _) => Inline(10); let update = (model, _) => model; - let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + let view = + ( + _, + ~info, + ~go as _, + ~inject: ProjectorBase.action => Ui_effect.t(unit), + ) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax), ); let activate = _ => (); - // let keymap = (_, _, _) => None; }; diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 4c7ece771b..f2e24f26c4 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -17,18 +17,25 @@ let get = (piece: Piece.t): float => | Some(s) => s }; -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let init = (); let can_project = p => get_opt(p) != None; let placeholder = (_, _) => Inline(10); let update = (model, _) => model; - let view = (_, ~info, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + let view = + ( + _, + ~info, + ~go as _, + ~inject: ProjectorBase.action => Ui_effect.t(unit), + ) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax) |> Printf.sprintf("%.2f"), ); let activate = _ => (); - // let keymap = (_, _, _) => None; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index dee56ed4b5..f8d9f2dcc6 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -66,7 +66,7 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let view = (_, ~selector, ~info, ~inject) => { +let view = (_, ~selector, ~info, ~go as _, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[Attr.classes(["cols"])], @@ -86,9 +86,11 @@ let placeholder = (_, info) => col: 2 + num_lines(info.syntax) /* +2 for left and right padding */ }); -module M: CoreInner = { +module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = unit; let init = (); let can_project = _ => true; //TODO(andrew): restrict somehow let placeholder = placeholder; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index b06681f174..d5145bcebe 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -27,20 +27,6 @@ let of_name = (p: string): kind => | _ => failwith("Unknown projector kind") }; -let update_model = (action: ProjectorBase.inner_action, {kind, model}) => { - let (module P) = to_module(kind); - {kind, model: P.update(model, action)}; -}; - -let handle = (id, action: ProjectorBase.action): Action.project => - switch (action) { - | Remove => Remove(id) - | FocusInternal(d) => FocusInternal(id, d) - | Escape(d) => Escape(id, d) - | SetSyntax(f) => SetSyntax(id, f) - | UpdateModel(action) => UpdateModel(id, update_model(action)) - }; - let backing_deco = ( ~font_metrics: FontMetrics.t, @@ -100,6 +86,20 @@ let view_wrapper = ); }; +let handle = (id, action: ProjectorBase.action): Action.project => + switch (action) { + | Remove => Remove(id) + | FocusInternal(d) => FocusInternal(id, d) + | Escape(d) => Escape(id, d) + | SetSyntax(f) => SetSyntax(id, f) + | UpdateModel(sexp) => UpdateModel(id, sexp) + }; + +let update_model = (action, {kind, model}) => { + let (module P) = to_module(kind); + {kind, model: P.update(model, action)}; +}; + let view_setup = ( id: Id.t, @@ -116,6 +116,7 @@ let view_setup = let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); + let go = a => inject_proj(UpdateModel(P.update(p.model, a))); view_wrapper( ~inject, ~font_metrics, @@ -124,7 +125,7 @@ let view_setup = ~info, ~selected=List.mem(id, meta.selection_ids), p, - P.view(p.model, ~info, ~inject=inject_proj), + P.view(p.model, ~info, ~go, ~inject=inject_proj), ); }; From bdb3e1eed29c11d4689cf97e74bdaeb3509ef334 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 01:57:21 -0400 Subject: [PATCH 107/168] focusable projector handoff id no longer hardcoded --- src/haz3lcore/JsUtil.re | 6 +-- src/haz3lcore/zipper/Projector.re | 1 + src/haz3lcore/zipper/ProjectorBase.re | 13 +++++- src/haz3lcore/zipper/Zipper.re | 2 +- .../zipper/projectors/TextAreaCore.re | 42 +++++++++---------- src/haz3lweb/view/ProjectorView.re | 8 ++-- src/haz3lweb/www/style.css | 1 - 7 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index d27875fdad..d3751291ee 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -212,9 +212,9 @@ module TextArea = { cols: rel, }; - let get = (selector: string): Js.t(Dom_html.textAreaElement) => - selector - |> get_elem_by_selector + let get = (id: string): Js.t(Dom_html.textAreaElement) => + id + |> get_elem_by_id |> Dom_html.CoerceTo.textarea |> Js.Opt.get(_, _ => failwith("TextArea.get")); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 91696ad82c..5356e9cc15 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -207,6 +207,7 @@ module Project = { | None => syntax | Some(pr) => let info: info = { + id, syntax, status: None, //TODO(andrew) ci: Id.Map.find_opt(id, info_map), diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 0aa292e91f..58874228ae 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -54,11 +54,19 @@ type p_action = action; /* Externally calculated info to be fed to projectors */ [@deriving (show({with_path: false}), sexp, yojson)] type info = { + id: Id.t, syntax, status: option(status), ci: option(Info.t), }; +let info_init = (p: syntax) => { + id: Piece.id(p), + syntax: p, + status: None, + ci: None, +}; + module type Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model; @@ -76,11 +84,12 @@ module type Projector = { Node.t; let placeholder: (model, info) => shape; let update: (model, action) => model; - let activate: Direction.t => unit; + let activate: ((Id.t, Direction.t)) => unit; }; type serialized_model = string; type serialized_action = string; + module type Cooked = { let init: serialized_model; let can_project: Piece.t => bool; @@ -94,7 +103,7 @@ module type Cooked = { Node.t; let placeholder: (serialized_model, info) => shape; let update: (serialized_model, serialized_action) => serialized_model; - let activate: Direction.t => unit; + let activate: ((Id.t, Direction.t)) => unit; }; module Cook = (C: Projector) : Cooked => { diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 32be6b7fb5..86b8b64bc0 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -335,7 +335,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { p | Some(pr) => //TODO(andrew): figure out if ci None below will causes problems with eg Info - Projector.placeholder(pr, {syntax: p, status: None, ci: None}) + Projector.placeholder(pr, Projector.info_init(p)) | None => p }; let seg = Piece.disassemble(p); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index f8d9f2dcc6..f2e6d4be7a 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -4,6 +4,9 @@ open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Virtual_dom.Vdom; open ProjectorBase; +let of_id = (id: Id.t) => + "id" ++ (id |> Id.to_string |> String.sub(_, 0, 8)); + let escape_linebreaks: string => string = Re.Str.global_replace(Re.Str.regexp("\n"), "\\n"); @@ -30,32 +33,29 @@ let put = (s: string): Piece.t => s |> mk_mono(Exp); let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); -let key_handler = (~inject, ~selector, direction: Util.Direction.t, evt) => { +let key_handler = (id, ~inject, evt) => { open Effect; let key = Key.mk(KeyDown, evt); - let pos = JsUtil.TextArea.caret_rel_pos(JsUtil.TextArea.get(selector)); + let pos = JsUtil.TextArea.caret_rel_pos(JsUtil.TextArea.get(of_id(id))); let is_last_pos = pos.rows == Last && pos.cols == Last; let is_first_pos = pos.rows == First && pos.cols == First; - switch (key.key, direction) { - | (D("ArrowRight" | "ArrowDown"), _) when is_last_pos => - JsUtil.get_elem_by_selector(selector)##blur; + switch (key.key) { + | D("ArrowRight" | "ArrowDown") when is_last_pos => + JsUtil.get_elem_by_id(of_id(id))##blur; Many([inject(Escape(Right)), Prevent_default, Stop_propagation]); - | (D("ArrowLeft" | "ArrowUp"), _) when is_first_pos => - JsUtil.get_elem_by_selector(selector)##blur; + | D("ArrowLeft" | "ArrowUp") when is_first_pos => + JsUtil.get_elem_by_id(of_id(id))##blur; Many([inject(Escape(Left)), Prevent_default, Stop_propagation]); | _ => Stop_propagation }; }; let textarea = - ( - ~selector, - ~inject: ProjectorBase.action => Ui_effect.t(unit), - text: string, - ) => + (id, ~inject: ProjectorBase.action => Ui_effect.t(unit), text: string) => Node.textarea( ~attrs=[ - Attr.on_keydown(key_handler(~selector, Left, ~inject)), + Attr.id(of_id(id)), + Attr.on_keydown(key_handler(id, ~inject)), Attr.on_input((_, new_text) => inject(put(new_text))), ], [Node.text(text)], @@ -66,12 +66,12 @@ let n_of = (n: int) => [Node.text("·")] @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); -let view = (_, ~selector, ~info, ~go as _, ~inject) => { +let view = (_, ~info, ~go as _, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[Attr.classes(["cols"])], n_of(Util.StringUtil.num_linebreaks(text)) - @ [textarea(~inject, ~selector, text)], + @ [textarea(info.id, ~inject, text)], ); }; @@ -95,17 +95,13 @@ module M: Projector = { let can_project = _ => true; //TODO(andrew): restrict somehow let placeholder = placeholder; let update = (model, _) => model; - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - //TODO(andrew): unhardcode element !!!!!!!!!! - // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - let selector = ".projector.text textarea"; - let view = view(~selector); - let activate = (d: Direction.t) => { - JsUtil.get_elem_by_selector(selector)##focus; + let view = view; + let activate = ((id: Id.t, d: Direction.t)) => { + JsUtil.get_elem_by_id(of_id(id))##focus; switch (d) { | Left => () | Right => - JsUtil.TextArea.set_caret_to_end(JsUtil.TextArea.get(selector)) + JsUtil.TextArea.set_caret_to_end(JsUtil.TextArea.get(of_id(id))) }; }; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index d5145bcebe..ecb62b0f5a 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -112,7 +112,7 @@ let view_setup = let* p = Projector.Map.find(id, meta.projected.z.projectors); let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); - let info = {ci, syntax, status}; + let info = {id, ci, syntax, status}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); @@ -191,7 +191,7 @@ let shape_from_map = (z, meta: Editor.Meta.t): option(shape) => { let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); let status = status(z); - let info = {syntax, status, ci}; + let info = {id, syntax, status, ci}; shape(z, info); }; @@ -212,10 +212,10 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} => switch (key, d) { | (D("ArrowRight"), Right) => - P.activate(Left); + P.activate((id, Left)); Some(Action.FocusInternal(id, Left)); | (D("ArrowLeft"), Left) => - P.activate(Right); + P.activate((id, Right)); Some(FocusInternal(id, Right)); | _ => None } diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index bbea6917ab..9acd369727 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -680,7 +680,6 @@ select { .projector { position: absolute; - display: flex; justify-content: center; align-items: center; From bff7a52657f9bcd0e7a30b9d349b745b4175d8f6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 02:13:05 -0400 Subject: [PATCH 108/168] fixed bug where all projectors focusable --- src/haz3lcore/zipper/ProjectorBase.re | 3 +++ .../zipper/projectors/CheckboxCore.re | 1 + src/haz3lcore/zipper/projectors/FoldCore.re | 1 + src/haz3lcore/zipper/projectors/InfoCore.re | 2 ++ src/haz3lcore/zipper/projectors/SliderCore.re | 1 + .../zipper/projectors/SliderFCore.re | 1 + .../zipper/projectors/TextAreaCore.re | 13 ++++++++++--- src/haz3lweb/view/ProjectorView.re | 19 +++---------------- src/haz3lweb/www/style.css | 11 ++++------- 9 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 58874228ae..b1c6e8fca0 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -74,6 +74,7 @@ module type Projector = { type action; let init: model; let can_project: Piece.t => bool; + let can_focus: bool; let view: ( model, @@ -93,6 +94,7 @@ type serialized_action = string; module type Cooked = { let init: serialized_model; let can_project: Piece.t => bool; + let can_focus: bool; let view: ( serialized_model, @@ -113,6 +115,7 @@ module Cook = (C: Projector) : Cooked => { let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; let init = C.init |> serialize_m; let can_project = C.can_project; + let can_focus = C.can_focus; let view = (m, ~info, ~go, ~inject) => C.view(deserialize_m(m), ~info, ~go=a => go(serialize_a(a)), ~inject); let placeholder = m => diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 14f7a7bb7f..213575b35c 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -52,6 +52,7 @@ module M: Projector = { type action = unit; let init = (); let can_project = p => state_of(p) != None; + let can_focus = false; let placeholder = (_, _) => Inline(2); let update = (model, _) => model; let view = view; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 3c8854c456..10ab947338 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -11,6 +11,7 @@ module M: Projector = { type action = unit; let init = (); let can_project = _ => true; + let can_focus = false; let placeholder = (_, _) => Inline(2); let update = (_, _) => (); let view = (_, ~info as _, ~go as _, ~inject) => diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 604a878908..aede970ede 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -54,6 +54,8 @@ module M: Projector = { }; }; + let can_focus = false; + let display = (model, info) => switch (model) { | _ when mode(info) == Some(Syn) => syn_display(info) diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 207ee2a837..f4364e47c8 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -21,6 +21,7 @@ module M: Projector = { type action = unit; let init = (); let can_project = p => get_opt(p) != None; + let can_focus = false; let placeholder = (_, _) => Inline(10); let update = (model, _) => model; let view = diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index f2e24f26c4..052100ce0b 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -24,6 +24,7 @@ module M: Projector = { type action = unit; let init = (); let can_project = p => get_opt(p) != None; + let can_focus = false; let placeholder = (_, _) => Inline(10); let update = (model, _) => model; let view = diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index f2e6d4be7a..3a75cdbf84 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -69,9 +69,15 @@ let n_of = (n: int) => let view = (_, ~info, ~go as _, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( - ~attrs=[Attr.classes(["cols"])], - n_of(Util.StringUtil.num_linebreaks(text)) - @ [textarea(info.id, ~inject, text)], + //TODO(andrew): rm wrapper? + ~attrs=[Attr.classes(["projector-wrapper"])], + [ + Node.div( + ~attrs=[Attr.classes(["cols"])], + n_of(Util.StringUtil.num_linebreaks(text)) + @ [textarea(info.id, ~inject, text)], + ), + ], ); }; @@ -93,6 +99,7 @@ module M: Projector = { type action = unit; let init = (); let can_project = _ => true; //TODO(andrew): restrict somehow + let can_focus = true; let placeholder = placeholder; let update = (model, _) => model; let view = view; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index ecb62b0f5a..fc829128fa 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -67,22 +67,9 @@ let view_wrapper = ["projector", name(entry.kind)] @ cls(status, selected), ), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), + JsUtil.stop_mousedown_propagation, ], - [ - div( - ~attrs=[ - //TODO(andrew): cleanup (can we just remove the -wrapper?) - // Attr.on_mousedown(_ => { - // print_endline("projector external wrapper mousedown"); - // inject(Update.PerformAction(Jump(TileId(id)))); - // }), - JsUtil.stop_mousedown_propagation, - Attr.classes(["projector-wrapper"]), - ], - [view], - ), - backing_deco(~font_metrics, ~measurement, ~info, entry), - ], + [view, backing_deco(~font_metrics, ~measurement, ~info, entry)], ); }; @@ -209,7 +196,7 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => let* (_, d, _) = Indicated.piece(editor.state.zipper); let (module P) = to_module(p.kind); switch (key) { - | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} => + | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} when P.can_focus => switch (key, d) { | (D("ArrowRight"), Right) => P.activate((id, Left)); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 9acd369727..0508dadc21 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -685,11 +685,8 @@ select { align-items: center; color: #c7b480; } -.projector-wrapper { - display: flex; +.projector > * { z-index: 12; - justify-content: center; - align-items: center; } .projector.indicated { z-index: 13; @@ -708,11 +705,11 @@ select { .projector.indicated.fold { color: black; } -.projector.fold .projector-wrapper { +.projector.fold { cursor: pointer; } -/* PROJECTOR: INFER */ +/* PROJECTOR: INFO */ .projector.type { /* opacity: 0.5; */ @@ -724,7 +721,7 @@ select { .projector.type > svg { fill: var(--typ-bg-off-color); } -.projector.type .projector-wrapper div { +.projector.type { cursor: pointer; } From 03fab69d059638a4a37195d8f85174aeb7477596 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 02:49:14 -0400 Subject: [PATCH 109/168] fixed bug with textarea projector crashing if string is empty, and not being right-escapable if one line --- src/haz3lcore/JsUtil.re | 22 +++++++++++++++- .../zipper/projectors/TextAreaCore.re | 7 ++--- src/haz3lweb/www/style.css | 26 ++++++++----------- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index d3751291ee..88d855f9d4 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -249,11 +249,31 @@ module TextArea = { }; let caret_rel_pos = (textarea: t): rel_pos => { + /* precondition: lines nonempty */ let lines = textarea |> lines; let {row, col} = caret_pos(textarea); + let full_row = List.nth(lines, row); { rows: rel(row, List.length(lines) - 1), - cols: rel(col, String.length(List.nth(lines, row))), + cols: rel(col, String.length(full_row)), + }; + }; + + let caret_at_start = (textarea: t): bool => { + switch (textarea |> lines) { + | [] => true + | _ => + let {rows, cols} = caret_rel_pos(textarea); + rows == First && cols == First; + }; + }; + + let caret_at_end = (textarea: t): bool => { + switch (textarea |> lines) { + | [] => true + | lines => + let {rows, cols} = caret_rel_pos(textarea); + rows == Last && cols == Last || rows == First && List.length(lines) == 1; }; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 3a75cdbf84..f01b352102 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -36,9 +36,10 @@ let put = (str: string): ProjectorBase.action => let key_handler = (id, ~inject, evt) => { open Effect; let key = Key.mk(KeyDown, evt); - let pos = JsUtil.TextArea.caret_rel_pos(JsUtil.TextArea.get(of_id(id))); - let is_last_pos = pos.rows == Last && pos.cols == Last; - let is_first_pos = pos.rows == First && pos.cols == First; + let is_last_pos = + JsUtil.TextArea.caret_at_end(JsUtil.TextArea.get(of_id(id))); + let is_first_pos = + JsUtil.TextArea.caret_at_start(JsUtil.TextArea.get(of_id(id))); switch (key.key) { | D("ArrowRight" | "ArrowDown") when is_last_pos => JsUtil.get_elem_by_id(of_id(id))##blur; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 0508dadc21..52fe0f0bf5 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -712,7 +712,6 @@ select { /* PROJECTOR: INFO */ .projector.type { - /* opacity: 0.5; */ color: var(--typ-text-color); } .projector.type:hover { @@ -733,9 +732,20 @@ select { cursor: pointer; } +/* PROJECTOR: SLIDERS (INT & FLOAT) */ + +.projector.slide input, +.projector.slidef input { + margin: 0; + width: 90%; + filter: sepia(1); + cursor: pointer; +} + /* PROJECTOR: TEXTAREA */ .projector.text { + cursor: default; } .projector.text .projector-wrapper { @@ -811,20 +821,6 @@ select { background-color: var(--selection-color); } -/* PROJECTOR: SLIDERS (INT & FLOAT) */ - -.projector.slide .projector-wrapper, -.projector.slidef .projector-wrapper { - width: 95%; -} -.projector.slide input, -.projector.slidef input { - margin: 0; - width: 100%; - filter: sepia(1); - cursor: pointer; -} - /* END PROJECTORS */ .code { From 07c90127c0f70ceed17c82db0e9a1992c7691e28 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 20:34:24 -0400 Subject: [PATCH 110/168] Str regexp purge --- src/haz3lcore/JsUtil.re | 33 ++++----- src/haz3lcore/Measured.re | 16 ++--- src/haz3lcore/dune | 2 +- src/haz3lcore/lang/Form.re | 65 +++++++++-------- src/haz3lcore/statics/MakeTerm.re | 5 +- src/haz3lcore/statics/Var.re | 12 ---- src/haz3lcore/zipper/Projector.re | 8 ++- .../zipper/projectors/TextAreaCore.re | 71 ++++++++++++------- src/haz3lweb/Keyboard.re | 5 +- src/haz3lweb/Update.re | 6 +- src/haz3lweb/dune | 1 - src/haz3lweb/view/Page.re | 3 +- src/util/StringUtil.re | 35 +++++++++ src/util/dune | 2 +- 14 files changed, 152 insertions(+), 112 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index 88d855f9d4..b534b6ea82 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -1,8 +1,8 @@ -open Js_of_ocaml; +open Util; +open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; - +open Js_of_ocaml; open Virtual_dom.Vdom; -open Sexplib.Std; let get_elem_by_id = id => { let doc = Dom_html.document; @@ -219,7 +219,7 @@ module TextArea = { |> Js.Opt.get(_, _ => failwith("TextArea.get")); let lines = (textarea: t): list(string) => - Re.Str.split(Re.Str.regexp("\n"), Js.to_string(textarea##.value)); + StringUtil.to_lines(Js.to_string(textarea##.value)); let caret_pos = (textarea: t): pos => { let rec find_position = (lines, cur_pos, row, col) => { @@ -260,21 +260,22 @@ module TextArea = { }; let caret_at_start = (textarea: t): bool => { - switch (textarea |> lines) { - | [] => true - | _ => - let {rows, cols} = caret_rel_pos(textarea); - rows == First && cols == First; - }; + let {rows, cols} = caret_rel_pos(textarea); + rows == First && cols == First; }; let caret_at_end = (textarea: t): bool => { - switch (textarea |> lines) { - | [] => true - | lines => - let {rows, cols} = caret_rel_pos(textarea); - rows == Last && cols == Last || rows == First && List.length(lines) == 1; - }; + /* precondition: lines nonempty */ + let lines = lines(textarea); + let {rows, cols} = caret_rel_pos(textarea); + rows == Last + && cols == Last + || rows == First + && cols == Last + && List.length(lines) == 1 + || rows == First + && cols == First + && lines == [""]; }; let set_caret_to_end = (textarea: t): unit => { diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index a3abe6bda6..918f1a35fd 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -379,17 +379,11 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let add_shard = (origin, shard, map) => { let token = List.nth(t.label, shard); // Adjustment for multi-line tokens e.g. projector placeholders - let num_lb = StringUtil.num_linebreaks(token); let last = - num_lb == 0 - ? Point.{ - col: origin.col + String.length(token), - row: origin.row, - } - : Point.{ - col: origin.col + String.length(token) - num_lb, - row: origin.row + num_lb, - }; + Point.{ + col: origin.col + StringUtil.max_line_width(token), + row: origin.row + StringUtil.num_linebreaks(token), + }; let map = map |> add_s(t.id, shard, {origin, last}); let row_indent = container_indent + contained_indent; let rec add_n_rows = (n, map) => @@ -403,7 +397,7 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { {indent: row_indent, max_col: origin.col}, ) }; - let map = num_lb == 0 ? map : map |> add_n_rows(num_lb); + let map = map |> add_n_rows(StringUtil.num_linebreaks(token)); (last, map); }; let (last, map) = diff --git a/src/haz3lcore/dune b/src/haz3lcore/dune index efe7805953..3ed6d6a078 100644 --- a/src/haz3lcore/dune +++ b/src/haz3lcore/dune @@ -2,7 +2,7 @@ (library (name haz3lcore) - (libraries util re sexplib unionFind uuidm virtual_dom yojson core) + (libraries util sexplib unionFind uuidm virtual_dom yojson core) (js_of_ocaml (flags (:include js-of-ocaml-flags-%{profile}))) diff --git a/src/haz3lcore/lang/Form.re b/src/haz3lcore/lang/Form.re index 1edcba07a8..72706448ce 100644 --- a/src/haz3lcore/lang/Form.re +++ b/src/haz3lcore/lang/Form.re @@ -1,3 +1,4 @@ +open Util; open Sexplib.Std; open Ppx_yojson_conv_lib.Yojson_conv.Primitives; open Mold; @@ -12,9 +13,8 @@ module P = Precedence; The wrapping functions seen in both of those tables determine the shape, precedence, and expansion behavior of the form. */ -let regexp = (r, s) => - Js_of_ocaml.Regexp.string_match(Js_of_ocaml.Regexp.regexp(r), s, 0) - |> Option.is_some; +let regexp = StringUtil.regexp; +let match = StringUtil.match; /* A label is the textual expression of a form's delimiters */ [@deriving (show({with_path: false}), sexp, yojson)] @@ -73,19 +73,19 @@ let space = " "; issues with using \n. Someone who understands regexps better should fix this. */ let linebreak = "⏎"; -let comment_regexp = "^#[^#⏎]*#$"; /* Multiline comments not supported */ -let is_comment = t => regexp(comment_regexp, t) || t == "#"; +let comment_regexp = regexp("^#[^#⏎]*#$"); /* Multiline comments not supported */ +let is_comment = t => match(comment_regexp, t) || t == "#"; let is_comment_delim = t => t == "#"; let is_secondary = t => - List.mem(t, [space, linebreak]) || regexp(comment_regexp, t); + List.mem(t, [space, linebreak]) || match(comment_regexp, t); /* STRINGS: special-case syntax */ /* is_string: last clause is a somewhat hacky way of making sure there are at most two quotes, in order to prevent merges */ +let string_regexp = regexp("^\"[^⏎]*\"$"); let is_string = t => - regexp("^\"[^⏎]*\"$", t) - && List.length(String.split_on_char('"', t)) < 4; + match(string_regexp, t) && List.length(String.split_on_char('"', t)) < 4; let string_delim = "\""; let empty_string = string_delim ++ string_delim; let is_string_delim = (==)(string_delim); @@ -112,61 +112,66 @@ let keywords = [ "else", ]; let reserved_keywords = ["of", "when", "with", "switch", "match"]; -let is_keyword = regexp("^(" ++ String.concat("|", keywords) ++ ")$"); -let is_reserved_keyword = - regexp("^(" ++ String.concat("|", reserved_keywords) ++ ")$"); +let keyword_regexp = regexp("^(" ++ String.concat("|", keywords) ++ ")$"); +let is_keyword = match(keyword_regexp); /* Potential tokens: These are fallthrough classes which determine * the behavior when inserting a character in contact with a token */ -let is_potential_operand = regexp("^[a-zA-Z0-9_'\\.?]+$"); +let potential_operand_regexp = regexp("^[a-zA-Z0-9_'\\.?]+$"); +let is_potential_operand = match(potential_operand_regexp); /* Anything else is considered a potential operator, as long * as it does not contain any whitespace, linebreaks, comment * delimiters, string delimiters, or the instant expanding paired * delimiters: ()[]| */ -let is_potential_operator = regexp("^[^a-zA-Z0-9_'?\"#⏎\\s\\[\\]\\(\\)]+$"); +let potential_operator_regexp = + regexp("^[^a-zA-Z0-9_'?\"#⏎\\s\\[\\]\\(\\)]+$"); +let is_potential_operator = match(potential_operator_regexp); let is_potential_token = t => is_potential_operand(t) || is_potential_operator(t) || is_string(t) || is_comment(t); -let is_arbitary_int = regexp("^-?\\d+[0-9_]*$"); -let is_arbitary_float = x => - x != "." && x != "-" && regexp("^-?[0-9]*\\.?[0-9]*((e|E)-?[0-9]*)?$", x); -let is_int = str => is_arbitary_int(str) && int_of_string_opt(str) != None; +let int_regexp = regexp("^-?\\d+[0-9_]*$"); +let float_regexp = regexp("^-?[0-9]*\\.?[0-9]*((e|E)-?[0-9]*)?$"); +let is_arbitary_float = x => x != "." && x != "-" && match(float_regexp, x); +let is_int = str => match(int_regexp, str) && int_of_string_opt(str) != None; /* NOTE: The is_arbitary_int check is necessary to prevent minuses from being parsed as part of the int token. */ -let is_bad_int = str => is_arbitary_int(str) && !is_int(str); +let is_bad_int = str => match(int_regexp, str) && !is_int(str); /* NOTE: As well as making is_float disjoint from is_int, the is_arbitary_int also prevents ints over int_max from being cast as floats. The is_arbitary_float check is necessary to prevent minuses from being parsed as part of the float token. */ let is_float = str => - !is_arbitary_int(str) + !match(int_regexp, str) && is_arbitary_float(str) && float_of_string_opt(str) != None; let is_bad_float = str => is_arbitary_float(str) && !is_float(str); let bools = ["true", "false"]; -let is_bool = regexp("^(" ++ String.concat("|", bools) ++ ")$"); +let bool_regexp = regexp("^(" ++ String.concat("|", bools) ++ ")$"); +let is_bool = match(bool_regexp); +let var_regexp = + regexp( + {|(^[a-z_][A-Za-z0-9_']*$)|(^[A-Z][A-Za-z0-9_']*\.[a-z][A-Za-z0-9_']*$)|}, + ); let is_var = str => - !is_bool(str) + !match(bool_regexp, str) && str != "_" //&& !is_keyword(str) - //&& !is_reserved(str) - && regexp( - {|(^[a-z_][A-Za-z0-9_']*$)|(^[A-Z][A-Za-z0-9_']*\.[a-z][A-Za-z0-9_']*$)|}, - str, - ); + && match(var_regexp, str); let is_capitalized_name = regexp("^[A-Z][A-Za-z0-9_]*$"); -let is_ctr = is_capitalized_name; +let is_ctr = match(is_capitalized_name); let base_typs = ["String", "Int", "Float", "Bool"]; -let is_base_typ = regexp("^(" ++ String.concat("|", base_typs) ++ ")$"); -let is_typ_var = str => is_var(str) || is_capitalized_name(str); +let base_typ_regexp = regexp("^(" ++ String.concat("|", base_typs) ++ ")$"); +let is_base_typ = match(base_typ_regexp); +let is_typ_var = str => is_var(str) || match(is_capitalized_name, str); let wild = "_"; -let is_wild = regexp("^" ++ wild ++ "$"); +let wild_regexp = regexp("^" ++ wild ++ "$"); +let is_wild = match(wild_regexp); /* List literals */ let list_start = "["; diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index 58a626ab2b..2bd2868e91 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -300,10 +300,7 @@ and pat_term: unsorted => (UPat.term, list(Id.t)) = { | ([t], []) when Form.is_bool(t) => Bool(bool_of_string(t)) | ([t], []) when Form.is_float(t) => Float(float_of_string(t)) | ([t], []) when Form.is_int(t) => Int(int_of_string(t)) - | ([t], []) when Form.is_string(t) => - let s = Re.Str.string_after(t, 1); - let s = Re.Str.string_before(s, String.length(s) - 1); - String(s); + | ([t], []) when Form.is_string(t) => String(Form.strip_quotes(t)) | ([t], []) when Form.is_var(t) => Var(t) | ([t], []) when Form.is_wild(t) => Wild | ([t], []) when Form.is_ctr(t) => Constructor(t) diff --git a/src/haz3lcore/statics/Var.re b/src/haz3lcore/statics/Var.re index 5630204e2c..763e032d2f 100644 --- a/src/haz3lcore/statics/Var.re +++ b/src/haz3lcore/statics/Var.re @@ -8,18 +8,6 @@ let eq = String.equal; let length = String.length; -let valid_regex = - Re.Str.regexp("^\\([a-zA-Z]\\|_[_a-zA-Z0-9]\\)[_a-zA-Z0-9']*$"); -let is_valid = s => Re.Str.string_match(valid_regex, s, 0); - -/* helper function for guarding options with is_valid */ -let check_valid = (s, result) => - if (is_valid(s)) { - result; - } else { - None; - }; - let is_true = eq("true"); let is_false = eq("false"); diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 5356e9cc15..d31f8be8d5 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -11,9 +11,9 @@ let to_module = (kind: kind): (module Cooked) => | TextArea => (module Cook(TextAreaCore.M)) }; -let shape = (p: entry, syntax): shape => { +let shape = (p: entry, info: info): shape => { let (module P) = to_module(p.kind); - P.placeholder(p.model, syntax); + P.placeholder(p.model, info); }; let is_placeholder = (p: Piece.t): bool => { @@ -27,7 +27,9 @@ let is_placeholder = (p: Piece.t): bool => { let placeholder_label = (p: entry, syntax): list(string) => switch (shape(p, syntax)) { | Inline(width) => [String.make(width, ' ')] - | Block({row, col}) => [String.make(row, '\n') ++ String.make(col, ' ')] + | Block({row, col}) => [ + String.make(row - 1, '\n') ++ String.make(col, ' '), + ] }; let placeholder = (p: entry, info: info): syntax => diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index f01b352102..2f8f3e48a9 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -7,20 +7,17 @@ open ProjectorBase; let of_id = (id: Id.t) => "id" ++ (id |> Id.to_string |> String.sub(_, 0, 8)); -let escape_linebreaks: string => string = - Re.Str.global_replace(Re.Str.regexp("\n"), "\\n"); - -let unescape_linebreaks: string => string = - Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n"); - let of_mono = (syntax: Piece.t): option(string) => switch (syntax) { - | Tile({label: [l], _}) => Some(unescape_linebreaks(l)) + | Tile({label: [l], _}) => Some(StringUtil.unescape_linebreaks(l)) | _ => None }; let mk_mono = (sort: Sort.t, string: string): Piece.t => - string |> escape_linebreaks |> Form.mk_atomic(sort) |> Piece.mk_tile(_, []); + string + |> StringUtil.escape_linebreaks + |> Form.mk_atomic(sort) + |> Piece.mk_tile(_, []); let get = (piece: Piece.t): string => switch (piece |> of_mono) { @@ -34,6 +31,7 @@ let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); let key_handler = (id, ~inject, evt) => { + print_endline("textarea: keydown"); open Effect; let key = Key.mk(KeyDown, evt); let is_last_pos = @@ -41,13 +39,18 @@ let key_handler = (id, ~inject, evt) => { let is_first_pos = JsUtil.TextArea.caret_at_start(JsUtil.TextArea.get(of_id(id))); switch (key.key) { + // | D("Enter") => + // print_endline("textarea: enter"); + // Many([Stop_propagation]); | D("ArrowRight" | "ArrowDown") when is_last_pos => JsUtil.get_elem_by_id(of_id(id))##blur; - Many([inject(Escape(Right)), Prevent_default, Stop_propagation]); + Many([inject(Escape(Right)), Stop_propagation]); | D("ArrowLeft" | "ArrowUp") when is_first_pos => JsUtil.get_elem_by_id(of_id(id))##blur; - Many([inject(Escape(Left)), Prevent_default, Stop_propagation]); - | _ => Stop_propagation + Many([inject(Escape(Left)), Stop_propagation]); + | _ => + JsUtil.focus(of_id(id)); + Stop_propagation; }; }; @@ -57,14 +60,29 @@ let textarea = ~attrs=[ Attr.id(of_id(id)), Attr.on_keydown(key_handler(id, ~inject)), - Attr.on_input((_, new_text) => inject(put(new_text))), + // Attr.on_keyup(_ => { + // print_endline("textarea: on_keyup"); + // Effect.(Many([Stop_propagation])); + // }), + Attr.on_keypress(_ => { + print_endline("textarea: on_keyup"); + JsUtil.focus(of_id(id)); + Effect.(Many([Stop_propagation])); + }), + Attr.on_input((_, new_text) => { + print_endline("textarea: on_input"); + Effect.(Many([inject(put(new_text))])); + }), + // Attr.on_change((_, _) => { + // print_endline("textarea: on_change"); + // Effect.(Many([Stop_propagation, Prevent_default])); + // }), ], [Node.text(text)], ); let n_of = (n: int) => - //·•⬤ - [Node.text("·")] + [Node.text("·")] //·•⬤ @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); let view = (_, ~info, ~go as _, ~inject) => { @@ -75,24 +93,13 @@ let view = (_, ~info, ~go as _, ~inject) => { [ Node.div( ~attrs=[Attr.classes(["cols"])], - n_of(Util.StringUtil.num_linebreaks(text)) + n_of(StringUtil.num_linebreaks(text)) @ [textarea(info.id, ~inject, text)], ), ], ); }; -let line_lengths = syntax => - List.map(String.length, Re.Str.split(Re.Str.regexp("\n"), get(syntax))); - -let num_lines = syntax => List.fold_left(max, 0, line_lengths(syntax)); - -let placeholder = (_, info) => - Block({ - row: Util.StringUtil.num_linebreaks(get(info.syntax)), - col: 2 + num_lines(info.syntax) /* +2 for left and right padding */ - }); - module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; @@ -101,7 +108,17 @@ module M: Projector = { let init = (); let can_project = _ => true; //TODO(andrew): restrict somehow let can_focus = true; - let placeholder = placeholder; + let placeholder = (_, info) => { + let str = Form.strip_quotes(get(info.syntax)); + // print_endline( + // "num-rows:" ++ (str |> StringUtil.num_lines |> string_of_int), + // ); + Block({ + row: StringUtil.num_lines(str), + /* +2 for left and right padding */ + col: 2 + StringUtil.max_line_width(str), + }); + }; let update = (model, _) => model; let view = view; let activate = ((id: Id.t, d: Direction.t)) => { diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index c6ff1951b1..74a8cc3902 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -1,7 +1,8 @@ open Haz3lcore; +open Util; -let is_digit = s => Re.Str.(string_match(regexp("^[0-9]$"), s, 0)); -let is_f_key = s => Re.Str.(string_match(regexp("^F[0-9][0-9]*$"), s, 0)); +let is_digit = s => StringUtil.(match(regexp("^[0-9]$"), s)); +let is_f_key = s => StringUtil.(match(regexp("^F[0-9][0-9]*$"), s)); let handle_key_event = (k: Key.t): option(Update.t) => { let now = (a: Action.t): option(UpdateAction.t) => diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 7ac64d3bf5..fed6d276fc 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -308,9 +308,9 @@ let ui_state_update = | Mousedown => {...ui_state, mousedown: true} | Mouseup => {...ui_state, mousedown: false} | Focus(focus) => - print_endline("Update: setting focus=" ++ focus); - JsUtil.focus(~site="update", focus); - {...ui_state, focus}; + //print_endline("Update: setting focus=" ++ focus); + //JsUtil.focus(~site="update", focus); + {...ui_state, focus} | ShowBackpackTargets(b) => {...ui_state, show_backpack_targets: b} | FontMetrics(font_metrics) => {...ui_state, font_metrics} }; diff --git a/src/haz3lweb/dune b/src/haz3lweb/dune index 7ad8d4eab7..00a73aba0c 100644 --- a/src/haz3lweb/dune +++ b/src/haz3lweb/dune @@ -9,7 +9,6 @@ (name workerServer) (modules WorkerServer) (libraries - str incr_dom virtual_dom.input_widgets util diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 749589687e..783d1879ed 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -48,9 +48,10 @@ let handlers = inject(UpdateAction.PerformAction(Destruct(Left))); }), Attr.on_paste(evt => { + //TODO(andrew): use StringUtil regexp let pasted_text = Js.to_string(evt##.clipboardData##getData(Js.string("text"))) - |> Str.global_replace(Str.regexp("\n[ ]*"), "\n"); + |> Util.StringUtil.trim_leading; Dom.preventDefault(evt); inject(PerformAction(Paste(pasted_text))); }), diff --git a/src/util/StringUtil.re b/src/util/StringUtil.re index 58f80daefa..a67c39fd9b 100644 --- a/src/util/StringUtil.re +++ b/src/util/StringUtil.re @@ -25,6 +25,41 @@ let repeat = (n, s) => String.concat("", List.init(n, _ => s)); let abbreviate = (max_len, s) => String.length(s) > max_len ? String.sub(s, 0, max_len) ++ "..." : s; +type regexp = Js_of_ocaml.Regexp.regexp; + +let regexp: string => regexp = Js_of_ocaml.Regexp.regexp; + +let match = (r: regexp, s: string): bool => + Js_of_ocaml.Regexp.string_match(r, s, 0) |> Option.is_some; + +let replace = Js_of_ocaml.Regexp.global_replace; + +let split = Js_of_ocaml.Regexp.split; + +let trim_leading = replace(regexp("\n[ ]*"), "\n"); + +let to_lines = (s: string): list(string) => split(regexp("\n"), s); + +let line_widths = (s: string): list(int) => + s |> to_lines |> List.map(String.length); + +let max_line_width = (s: string): int => + s |> line_widths |> List.fold_left(max, 0); + +let num_lines = (s: string): int => s |> to_lines |> List.length; + let num_linebreaks = (s: string) => List.init(String.length(s), String.get(s)) |> List.fold_left((acc, c) => c == '\n' ? acc + 1 : acc, 0); + +// let escape_linebreaks: string => string = replace(regexp("\n"), "\\\\n"); + +// let unescape_linebreaks: string => string = replace(regexp("\\\\n"), "\n"); + +//TODO(andrew): figure out why above dont work + +let escape_linebreaks: string => string = + Re.Str.global_replace(Re.Str.regexp("\n"), "\\n"); + +let unescape_linebreaks: string => string = + Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n"); diff --git a/src/util/dune b/src/util/dune index dc4a9c3c2f..3ca3a84400 100644 --- a/src/util/dune +++ b/src/util/dune @@ -1,6 +1,6 @@ (library (name util) - (libraries base ptmap incr_dom) + (libraries re base ptmap incr_dom) (js_of_ocaml (flags (:include js-of-ocaml-flags-%{profile}))) From 5b1a0b962b17fb2b4a13332ac38329e01edff697 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 20:48:32 -0400 Subject: [PATCH 111/168] opam.export revert --- opam.export | 18 +----------------- src/haz3lcore/tiles/Id.re | 3 --- src/haz3lcore/tiles/Piece.re | 1 - 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/opam.export b/opam.export index 8ab9f07013..ed9cfe78d8 100644 --- a/opam.export +++ b/opam.export @@ -55,7 +55,6 @@ installed: [ "bigstringaf.0.9.1" "bin_prot.v0.16.0" "camlp-streams.5.0.1" - "chrome-trace.3.16.0" "cmdliner.1.3.0" "conf-bash.1" "conf-gmp.4" @@ -64,16 +63,12 @@ installed: [ "cppo.1.6.9" "csexp.1.5.2" "diffable.v0.16.0" - "dot-merlin-reader.5.1" "dune.3.16.0" "dune-build-info.3.16.0" "dune-configurator.3.16.0" - "dune-rpc.3.16.0" - "dyn.3.16.0" "either.1.0.0" "ezjs_idb.0.1.1" "ezjs_min.0.3.0" - "fiber.3.7.0" "fieldslib.v0.16.0" "fix.20230505" "fpath.0.7.3" @@ -99,32 +94,24 @@ installed: [ "menhirCST.20231231" "menhirLib.20231231" "menhirSdk.20231231" - "merlin.5.1-502" "merlin-extend.0.6.1" - "merlin-lib.5.1-502" "num.1.5" "ocaml.5.2.0" "ocaml-base-compiler.5.2.0" "ocaml-compiler-libs.v0.17.0" "ocaml-config.3" - "ocaml-index.1.0" - "ocaml-lsp-server.1.18.0~5.2preview" "ocaml-options-vanilla.1" "ocaml-syntax-shims.1.0.0" "ocaml-version.3.6.7" "ocamlbuild.0.14.3" - "ocamlc-loc.3.16.0" "ocamlfind.1.9.6" "ocamlformat.0.26.2" "ocamlformat-lib.0.26.2" - "ocamlformat-rpc-lib.0.26.2" "ocp-indent.1.8.1" "octavius.1.2.2" "ojs.1.1.2" "omd.1.3.2" - "ordering.3.16.0" "parsexp.v0.16.0" - "pp.1.2.0" "ppx_assert.v0.16.0" "ppx_base.v0.16.0" "ppx_bench.v0.16.0" @@ -174,11 +161,9 @@ installed: [ "seq.base" "sexplib.v0.16.0" "sexplib0.v0.16.0" - "spawn.v0.15.1" "splittable_random.v0.16.0" "stdio.v0.16.0" "stdlib-shims.0.3.0" - "stdune.3.16.0" "stored_reversed.v0.16.0" "streamable.v0.16.1" "stringext.1.6.0" @@ -197,9 +182,8 @@ installed: [ "uutf.1.0.3" "variantslib.v0.16.0" "virtual_dom.v0.16.0" - "xdg.3.16.0" "yojson.2.2.2" "zarith.1.13" "zarith_stubs_js.v0.16.1" ] -pinned: "omd.1.3.2" +pinned: "omd.1.3.2" \ No newline at end of file diff --git a/src/haz3lcore/tiles/Id.re b/src/haz3lcore/tiles/Id.re index 8ddcd9ef32..5046dd63c5 100644 --- a/src/haz3lcore/tiles/Id.re +++ b/src/haz3lcore/tiles/Id.re @@ -113,9 +113,6 @@ let invalid: t = let nullary_ap_flag: t = "DEADBEEF-0000-0000-0000-000000000000" |> Uuidm.of_string |> Option.get; -let ctx_sentinel: t = - "DEADBEEF-DEAD-BEEF-DEAD-DEADBEEFDEAD" |> Uuidm.of_string |> Option.get; - let is_nullary_ap_flag = (ids: list(t)) => switch (ids) { | [id] when id == nullary_ap_flag => true diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index a88e59bce5..6eebfaa5a8 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -160,7 +160,6 @@ let replace_id = (id: Id.t, p: t): t => }; let mk_tile: (Form.t, list(list(t))) => t = - //TODO: asserts (form, children) => Tile({ id: Id.mk(), From c9f817bf419ea0932a6900ddb4b8240ea5f9a9e3 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 20 Jul 2024 23:44:58 -0400 Subject: [PATCH 112/168] textarea no longer loses focus on line number changes. adjustments to projector multiline handling. --- src/haz3lcore/JsUtil.re | 15 +++-- src/haz3lcore/statics/Statics.re | 5 +- src/haz3lcore/zipper/projectors/InfoCore.re | 41 +++++++----- .../zipper/projectors/TextAreaCore.re | 22 +++---- src/haz3lweb/view/Deco.re | 3 +- src/haz3lweb/www/style.css | 63 +++++++++++-------- 6 files changed, 82 insertions(+), 67 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index 327d19e3fb..b18ecbc85b 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -266,14 +266,13 @@ module TextArea = { /* precondition: lines nonempty */ let lines = lines(textarea); let {rows, cols} = caret_rel_pos(textarea); - rows == Last - && cols == Last - || rows == First - && cols == Last - && List.length(lines) == 1 - || rows == First - && cols == First - && lines == [""]; + switch (rows, cols, List.rev(lines)) { + | (Last, Last, _) => true + | (Last, First, ["", ..._]) => true + | (First, Last, [_]) => true + | (First, First, [""]) => true + | _ => false + }; }; let set_caret_to_end = (textarea: t): unit => { diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index 965067f510..04455fbbc9 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -909,8 +909,9 @@ let mk = }); let mk = (core: CoreSettings.t, ctx, exp) => { - print_endline("RETICULATING SPLINES"); //TODO(andrew): rm - core.statics ? mk(ctx, exp) : Id.Map.empty; + //print_endline("RETICULATING SPLINES"); + core.statics + ? mk(ctx, exp) : Id.Map.empty; }; let collect_errors = (map: Map.t): list((Id.t, Info.error)) => diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index aede970ede..38777326e3 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -22,18 +22,12 @@ let self_ty = (info: option(Info.t)): option(Typ.t) => | _ => None }; -let display_ty = (expected_ty: option(Typ.t)): Typ.t => +let totalize_ty = (expected_ty: option(Typ.t)): Typ.t => switch (expected_ty) { | Some(expected_ty) => expected_ty | None => Unknown(Internal) }; -let syn_display = info => - "⋱ ⇒ " ++ (info |> self_ty |> display_ty |> Typ.pretty_print); - -let ana_display = info => - "⋱ ⇐ " ++ (info |> expected_ty |> display_ty |> Typ.pretty_print); - module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = @@ -56,15 +50,25 @@ module M: Projector = { let can_focus = false; - let display = (model, info) => + let display_ty = (model, info) => + switch (model) { + | _ when mode(info) == Some(Syn) => info |> self_ty + | Self => info |> self_ty + | Expected => info |> expected_ty + }; + + let display_mode = (model, info): string => switch (model) { - | _ when mode(info) == Some(Syn) => syn_display(info) - | Self => syn_display(info) - | Expected => ana_display(info) + | _ when mode(info) == Some(Syn) => "⇐" + | Self => "⇐" + | Expected => "⇒" }; + let display = (model, info) => + display_ty(model, info) |> totalize_ty |> Typ.pretty_print; + let placeholder = (model, info: ProjectorBase.info) => - Inline((display(model, info.ci) |> String.length) - 2); + Inline((display(model, info.ci) |> String.length) + 5); let update = (model, a: action) => switch (a, model) { @@ -74,8 +78,17 @@ module M: Projector = { let view = (model, ~info: ProjectorBase.info, ~go, ~inject as _) => div( - ~attrs=[Attr.on_mousedown(_ => go(ToggleDisplay))], - [text(display(model, info.ci))], + ~attrs=[ + Attr.class_("info"), + Attr.on_mousedown(_ => go(ToggleDisplay)), + ], + [ + text("⋱ " ++ display_mode(model, info.ci) ++ " "), + div( + ~attrs=[Attr.class_("type")], + [text(display(model, info.ci))], + ), + ], ); let activate = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 0d012bba2d..5856c36097 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -29,8 +29,8 @@ let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); let key_handler = (id, ~inject, evt) => { - print_endline("textarea: keydown"); - open Effect; + open Effect; //print_endline("textarea: keydown"); + let key = Key.mk(KeyDown, evt); let is_last_pos = JsUtil.TextArea.caret_at_end(JsUtil.TextArea.get(of_id(id))); @@ -65,8 +65,10 @@ let textarea = // Effect.(Many([Stop_propagation])); // }), Attr.on_input((_, new_text) => { - print_endline("textarea: on_input"); - Effect.(Many([inject(put(new_text))])); + //print_endline("textarea: on_input"); + Effect.( + Many([inject(put(new_text))]) + ) }), // Attr.on_change((_, _) => { // print_endline("textarea: on_change"); @@ -76,20 +78,15 @@ let textarea = [Node.text(text)], ); -let n_of = (n: int) => - [Node.text("·")] //·•⬤ - @ (List.init(n, _ => [Node.br(), Node.text("·")]) |> List.flatten); - let view = (_, ~info, ~go as _, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( //TODO(andrew): rm wrapper? - ~attrs=[Attr.classes(["projector-wrapper"])], + ~attrs=[Attr.classes(["wrapper"])], [ Node.div( ~attrs=[Attr.classes(["cols"])], - n_of(StringUtil.num_linebreaks(text)) - @ [textarea(info.id, ~inject, text)], + [Node.text("·")] @ [textarea(info.id, ~inject, text)], ), ], ); @@ -105,9 +102,6 @@ module M: Projector = { let can_focus = true; let placeholder = (_, info) => { let str = Form.strip_quotes(get(info.syntax)); - // print_endline( - // "num-rows:" ++ (str |> StringUtil.num_lines |> string_of_int), - // ); Block({ row: StringUtil.num_lines(str), /* +2 for left and right padding */ diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 01a5b1f8c1..fc72b731ad 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -264,7 +264,6 @@ module Deco = (M: { }; let backpack = (z: Zipper.t): list(Node.t) => { - print_endline("Deco.backpack.caret_point"); [ BackpackView.view( ~font_metrics, @@ -371,7 +370,7 @@ module Deco = (M: { let always = (~inject) => List.concat([ err_holes(), - ProjectorView.view_all(~meta=M.meta, ~inject, ~font_metrics), + ProjectorView.view_all(~meta=M.meta, ~inject, ~font_metrics) |> List.rev, ]); let all = (~inject) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 52fe0f0bf5..05d53f6b73 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -698,6 +698,9 @@ select { .projector.indicated > svg { fill: var(--exp-bg-off-color); } +.projector > svg > path { + /* filter: url(#raised-drop-shadow-Exp) !important; */ +} /* PROJECTOR: FOLD */ @@ -711,18 +714,21 @@ select { /* PROJECTOR: INFO */ -.projector.type { +.projector.type .type { color: var(--typ-text-color); } -.projector.type:hover { - opacity: 1; -} -.projector.type > svg { +/* .projector.type > svg { fill: var(--typ-bg-off-color); -} +} */ .projector.type { cursor: pointer; } +.projector.type .info { + display: flex; +} +.projector.type:hover { + color: black; +} /* PROJECTOR: CHECKBOX */ @@ -731,6 +737,9 @@ select { filter: sepia(1); cursor: pointer; } +.projector.check:not(.indicated):not(:hover) > svg { + fill: #0000; +} /* PROJECTOR: SLIDERS (INT & FLOAT) */ @@ -741,6 +750,10 @@ select { filter: sepia(1); cursor: pointer; } +.projector.slide:not(.indicated):not(:hover) > svg, +.projector.slidef:not(.indicated):not(:hover) > svg { + fill: #0000; +} /* PROJECTOR: TEXTAREA */ @@ -748,7 +761,7 @@ select { cursor: default; } -.projector.text .projector-wrapper { +.projector.text .wrapper { height: 100%; width: 100%; border-radius: 0.1em; @@ -757,16 +770,16 @@ select { margin-left: -2px; margin-right: -2px; } -.projector.text.indicated.left .projector-wrapper { +.projector.text.indicated.left .wrapper { border-right: 2px solid red; animation: 1s blink_border_right step-end infinite; } -.projector.text.indicated.right .projector-wrapper { +.projector.text.indicated.right .wrapper { border-left: 2px solid red; animation: 1s blink_border_left step-end infinite; } -.projector.text .projector-wrapper:has(.cols.inside), -.projector.text .projector-wrapper:has(.cols.inside) { +.projector.text .wrapper:has(.cols.inside), +.projector.text .wrapper:has(.cols.inside) { border-color: #0000; animation: none; } @@ -775,28 +788,30 @@ select { height: 100%; width: 100%; display: flex; - border-radius: 0.1em; + border-radius: 0 0.1em 0.1em 0.1em; outline: 0.3px solid #a69460; - background-color: #e0d1b7; - color: #f0e7d6; + color: #fff; + background: repeating-linear-gradient( + #f0e7d6, + #f0e7d6 1.4em, + #add8ff 1.4em, + #add8ff 1.46em + ); } .projector.text.selected .cols { - background-color: var(--selection-color); - color: #c7b491; -} -.projector.text.selected textarea { background: repeating-linear-gradient( var(--selection-color), var(--selection-color) 1.4em, #e0d1b7 1.4em, #e0d1b7 1.46em ); + color: #c7b491; } .projector.text textarea { + outline: none; resize: none; - height: 100%; width: 100%; caret-color: red; padding: 0; @@ -805,15 +820,9 @@ select { font-family: "Source Code Pro", monospace; font-size: inherit; border: none; - border-radius: 0.1em; - outline: 0.3px solid #a69460; color: #8c7e62; - background: repeating-linear-gradient( - #f0e7d6, - #f0e7d6 1.4em, - #e0d1b7 1.4em, - #e0d1b7 1.46em - ); + background: none; + box-shadow: inset 1px 0 0 #ff8ea88a; } .projector.text textarea::selection { From e9ef13a1281217fcef6ea484eac350d79118b7c9 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 21 Jul 2024 00:11:48 -0400 Subject: [PATCH 113/168] jump to textarea; caret hiding while textarea focused. slightly glitchy jump (historicity?) --- src/haz3lcore/JsUtil.re | 6 ------ src/haz3lweb/view/ProjectorView.re | 11 +++++++++-- src/haz3lweb/www/style.css | 11 +++++++---- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re index b18ecbc85b..257ca52157 100644 --- a/src/haz3lcore/JsUtil.re +++ b/src/haz3lcore/JsUtil.re @@ -183,12 +183,6 @@ module Fragment = { }; }; -let stop_mousedown_propagation = - Attr.on_mousedown(evt => { - Js_of_ocaml.Dom_html.stopPropagation(evt); - Virtual_dom.Vdom.Effect.Ignore; - }); - module TextArea = { type t = Js.t(Dom_html.textAreaElement); diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index fc829128fa..6431567316 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -51,7 +51,7 @@ let cls = (indicated: option(status), selected) => let view_wrapper = ( - ~inject as _, + ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~status: option(Projector.status), @@ -66,8 +66,15 @@ let view_wrapper = Attr.classes( ["projector", name(entry.kind)] @ cls(status, selected), ), + Attr.on_mousedown(_ => + Effect.( + Many([ + Stop_propagation, + inject(PerformAction(Jump(TileId(info.id)))), + ]) + ) + ), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), - JsUtil.stop_mousedown_propagation, ], [view, backing_deco(~font_metrics, ~measurement, ~info, entry)], ); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 05d53f6b73..4c87638fff 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -778,12 +778,15 @@ select { border-left: 2px solid red; animation: 1s blink_border_left step-end infinite; } -.projector.text .wrapper:has(.cols.inside), -.projector.text .wrapper:has(.cols.inside) { +.projector.text.indicated:has(textarea:focus) .wrapper { border-color: #0000; animation: none; } +.projector.text.indicated:has(textarea:focus) .cols { + color: red; +} + .projector.text .cols { height: 100%; width: 100%; @@ -793,8 +796,8 @@ select { color: #fff; background: repeating-linear-gradient( #f0e7d6, - #f0e7d6 1.4em, - #add8ff 1.4em, + #f0e7d6 1.41em, + #add8ff 1.41em, #add8ff 1.46em ); } From 31552e2cd6675d29bf61d973bf99b788630780e3 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 21 Jul 2024 01:21:01 -0400 Subject: [PATCH 114/168] refactored deco so as not to not force redraw each decoration type when another is. this was the root of a lot of problematic focus behavior --- .../zipper/action/ProjectorPerform.re | 25 +++++- src/haz3lweb/view/Cell.re | 25 ++++-- src/haz3lweb/view/Deco.re | 76 +++++++++---------- src/haz3lweb/view/ProjectorView.re | 38 +++++----- src/haz3lweb/www/style.css | 4 - 5 files changed, 98 insertions(+), 70 deletions(-) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index e3b243c843..6e8f6a981a 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -29,6 +29,14 @@ let add_or_remove = (id: Id.t, z: Zipper.t, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; +//TODO(andrew): dupe, rm +let indicated_proj_z = (z: Zipper.t) => { + open Util.OptUtil.Syntax; + let* id = Indicated.index(z); + let+ projector = Projector.Map.find(id, z.projectors); + (id, projector); +}; + let go = ( jump_to_id, @@ -86,10 +94,19 @@ let go = add_or_remove(Piece.id(piece), z, p, piece, d, rel) } | Remove(id) => - switch (Map.mem(id, z.projectors)) { - | false => Error(Action.Failure.Cant_project) - | true => Ok(set(id, None, z)) - } + let p = indicated_proj_z(z) |> Option.map(snd); + switch (p) { + | Some(p) => + let (module P) = to_module(p.kind); + P.activate((id, Left)); + Error(Action.Failure.Cant_project); + | None => Error(Action.Failure.Cant_project) + }; + // | Remove(id) => + // switch (Map.mem(id, z.projectors)) { + // | false => Error(Action.Failure.Cant_project) + // | true => Ok(set(id, None, z)) + // } | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) | UpdateModel(id, model) => Ok({ diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index ec86f0a043..4896882e52 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -115,7 +115,16 @@ let deco = let ui_state = ui_state; let meta = meta; }); - let decos = selected ? Deco.all(~inject) : Deco.always(~inject); + let decos = selected ? Deco.all() : Deco.always(); + let decos = + decos + @ [ + ProjectorView.view_all( + ~meta, + ~inject, + ~font_metrics=ui_state.font_metrics, + ), + ]; let decos = switch (test_results) { | None => decos @@ -257,17 +266,21 @@ let editor_view = | None => editor.state.meta | Some(statics) => {...editor.state.meta, statics} }; + let mousedown_overlay = + selected && mousedown + ? [mousedown_overlay(~inject, ~font_metrics, ~target_id)] : []; let code_text_view = Code.view(~sort, ~font_metrics, ~settings, meta); let deco_view = deco(~inject, ~ui_state, ~selected, ~test_results, ~highlights, meta); + let code_view = div( ~attrs=[Attr.id(target_id), Attr.classes(["code-container"])], - [code_text_view] @ deco_view @ Option.to_list(overlayer), + [code_text_view] + @ deco_view + @ Option.to_list(overlayer) + @ mousedown_overlay, ); - let mousedown_overlay = - selected && mousedown - ? [mousedown_overlay(~inject, ~font_metrics, ~target_id)] : []; let on_mousedown = locked ? _ => @@ -292,7 +305,7 @@ let editor_view = Attr.classes(["cell-item"]), Attr.on_mousedown(on_mousedown), ], - Option.to_list(caption) @ mousedown_overlay @ [code_view], + Option.to_list(caption) @ [code_view], ), ] @ (footer |> Option.to_list |> List.concat), diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index fc72b731ad..e2821a2f08 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -1,5 +1,6 @@ open Virtual_dom.Vdom; open Util; +open Util.Web; open Haz3lcore; module Deco = (M: { @@ -10,7 +11,7 @@ module Deco = (M: { let tile = id => Id.Map.find(id, M.meta.projected.tiles); - let base_caret = (z: Zipper.t): list(Node.t) => { + let base_caret = (z: Zipper.t): Node.t => { let origin = Zipper.caret_point(M.meta.projected.measured, z); let shape = Zipper.caret_direction(z); let side = @@ -18,10 +19,10 @@ module Deco = (M: { | Some((_, side, _)) => side | _ => Right }; - [CaretDec.view(~font_metrics, ~profile={side, origin, shape})]; + CaretDec.view(~font_metrics, ~profile={side, origin, shape}); }; - let caret = (z: Zipper.t): list(Node.t) => + let caret = (z: Zipper.t): Node.t => /* Projectors can override adjacent carets */ switch (ProjectorView.caret(z, M.meta)) { | Some(caret) => caret @@ -263,20 +264,19 @@ module Deco = (M: { }; }; - let backpack = (z: Zipper.t): list(Node.t) => { - [ - BackpackView.view( - ~font_metrics, - ~origin=Zipper.caret_point(M.meta.projected.measured, z), - z, - ), - ]; - }; + let backpack = (z: Zipper.t): Node.t => + BackpackView.view( + ~font_metrics, + ~origin=Zipper.caret_point(M.meta.projected.measured, z), + z, + ); - let targets' = (backpack, seg) => { - M.ui_state.show_backpack_targets && Backpack.restricted(backpack) - ? targets(backpack, seg) : []; - }; + let backpack_targets = (backpack, seg) => + div_c( + "backpack-targets", + M.ui_state.show_backpack_targets && Backpack.restricted(backpack) + ? targets(backpack, seg) : [], + ); let term_decoration = ( @@ -349,33 +349,31 @@ module Deco = (M: { ); }; - let err_holes = () => - List.map(term_highlight(~clss=["err-hole"]), M.meta.statics.error_ids); + let errors = () => + div_c( + "errors", + List.map( + term_highlight(~clss=["err-hole"]), + M.meta.statics.error_ids, + ), + ); - let indication_deco = (z: Zipper.t) => + let indication = (z: Zipper.t) => switch (ProjectorView.indicated_proj_z(z)) { - | Some(_) => [] /* projector indication handled internally */ - | None => indicated_piece_deco(z) + | Some(_) => Node.div([]) /* projector indication handled internally */ + | None => div_c("indication", indicated_piece_deco(z)) }; - let active = (zipper, sel_seg) => - List.concat([ - caret(zipper), - indication_deco(zipper), - selected_pieces(zipper), - backpack(zipper), - targets'(zipper.backpack, sel_seg), - ]); + let selection = (z: Zipper.t) => div_c("selects", selected_pieces(z)); - let always = (~inject) => - List.concat([ - err_holes(), - ProjectorView.view_all(~meta=M.meta, ~inject, ~font_metrics) |> List.rev, - ]); + let always = () => [errors()]; - let all = (~inject) => - List.concat([ - active(M.meta.projected.z, M.meta.projected.segment), - always(~inject), - ]); + let all = () => [ + caret(M.meta.projected.z), + indication(M.meta.projected.z), + selection(M.meta.projected.z), + backpack(M.meta.projected.z), + backpack_targets(M.meta.projected.z.backpack, M.meta.projected.segment), + errors(), + ]; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 6431567316..dba01a0bad 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -71,6 +71,7 @@ let view_wrapper = Many([ Stop_propagation, inject(PerformAction(Jump(TileId(info.id)))), + inject(PerformAction(Project(Remove(info.id)))), ]) ) ), @@ -136,21 +137,24 @@ let status = (z: ZipperBase.t): option(status) => }; let view_all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => - List.filter_map( - ((id, _)) => { - view_setup( - id, - ~meta, - ~inject, - ~font_metrics, - ~status= - switch (status_and_id(meta.projected.z)) { - | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) - | _ => None - }, - ) - }, - Id.Map.bindings(meta.projected.z.projectors), + div_c( + "projectors", + List.filter_map( + ((id, _)) => { + view_setup( + id, + ~meta, + ~inject, + ~font_metrics, + ~status= + switch (status_and_id(meta.projected.z)) { + | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) + | _ => None + }, + ) + }, + Id.Map.bindings(meta.projected.z.projectors) |> List.rev, + ), ); let indicated_proj_z = (z: Zipper.t) => { @@ -189,11 +193,11 @@ let shape_from_map = (z, meta: Editor.Meta.t): option(shape) => { shape(z, info); }; -let caret = (z: Zipper.t, meta: Editor.Meta.t): option(list(Node.t)) => +let caret = (z: Zipper.t, meta: Editor.Meta.t): option(Node.t) => switch (shape_from_map(z, meta)) { | None => None | Some(Inline(_)) => None - | Some(Block(_)) => Some([]) + | Some(Block(_)) => Some(div([])) }; let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 4c87638fff..a7a2c18f6c 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -923,10 +923,6 @@ select { vector-effect: non-scaling-stroke; } -.selection { - position: relative; -} - .selection-box { position: absolute; z-index: var(--selection-box-z); From 2f8dc9d983c4031605911647ae26ea228497bfe8 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 21 Jul 2024 01:52:00 -0400 Subject: [PATCH 115/168] fix copy/paste/cut for textarea --- .../zipper/projectors/TextAreaCore.re | 48 +++++++------------ src/haz3lweb/view/Page.re | 1 - 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 5856c36097..f44c4638ab 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -28,22 +28,20 @@ let put = (s: string): Piece.t => s |> mk_mono(Exp); let put = (str: string): ProjectorBase.action => SetSyntax(str |> Form.string_quote |> put); -let key_handler = (id, ~inject, evt) => { - open Effect; //print_endline("textarea: keydown"); +let is_last_pos = id => + JsUtil.TextArea.caret_at_end(JsUtil.TextArea.get(of_id(id))); +let is_first_pos = id => + JsUtil.TextArea.caret_at_start(JsUtil.TextArea.get(of_id(id))); +let key_handler = (id, ~inject, evt) => { + open Effect; let key = Key.mk(KeyDown, evt); - let is_last_pos = - JsUtil.TextArea.caret_at_end(JsUtil.TextArea.get(of_id(id))); - let is_first_pos = - JsUtil.TextArea.caret_at_start(JsUtil.TextArea.get(of_id(id))); + switch (key.key) { - // | D("Enter") => - // print_endline("textarea: enter"); - // Many([Stop_propagation]); - | D("ArrowRight" | "ArrowDown") when is_last_pos => + | D("ArrowRight" | "ArrowDown") when is_last_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; Many([inject(Escape(Right)), Stop_propagation]); - | D("ArrowLeft" | "ArrowUp") when is_first_pos => + | D("ArrowLeft" | "ArrowUp") when is_first_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; Many([inject(Escape(Left)), Stop_propagation]); | _ => Stop_propagation @@ -56,24 +54,15 @@ let textarea = ~attrs=[ Attr.id(of_id(id)), Attr.on_keydown(key_handler(id, ~inject)), - // Attr.on_keyup(_ => { - // print_endline("textarea: on_keyup"); - // Effect.(Many([Stop_propagation])); - // }), - // Attr.on_keyup(_ => { - // print_endline("textarea: on_keyup"); - // Effect.(Many([Stop_propagation])); - // }), - Attr.on_input((_, new_text) => { - //print_endline("textarea: on_input"); - Effect.( - Many([inject(put(new_text))]) - ) - }), - // Attr.on_change((_, _) => { - // print_endline("textarea: on_change"); - // Effect.(Many([Stop_propagation, Prevent_default])); - // }), + Attr.on_input((_, new_text) => + Effect.(Many([inject(put(new_text))])) + ), + /* Note: adding these handlers below because + * currently these are handled on page level. + * unnecesary maybe if we move handling down */ + Attr.on_copy(_ => Effect.Stop_propagation), + Attr.on_cut(_ => Effect.Stop_propagation), + Attr.on_paste(_ => Effect.Stop_propagation), ], [Node.text(text)], ); @@ -81,7 +70,6 @@ let textarea = let view = (_, ~info, ~go as _, ~inject) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( - //TODO(andrew): rm wrapper? ~attrs=[Attr.classes(["wrapper"])], [ Node.div( diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index 783d1879ed..c439425a36 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -48,7 +48,6 @@ let handlers = inject(UpdateAction.PerformAction(Destruct(Left))); }), Attr.on_paste(evt => { - //TODO(andrew): use StringUtil regexp let pasted_text = Js.to_string(evt##.clipboardData##getData(Js.string("text"))) |> Util.StringUtil.trim_leading; From dc39a4dd33aa9a21e9dba5b2e2458348aa29168b Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 21 Jul 2024 02:14:00 -0400 Subject: [PATCH 116/168] added projectors slide to docs --- src/haz3lweb/Init.ml | 524 ++++++++++++++++++++++++++++++++++++- src/haz3lweb/www/style.css | 3 +- 2 files changed, 524 insertions(+), 3 deletions(-) diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index e4e2e2bb31..a717dea51f 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -28,7 +28,7 @@ let startup : PersistentData.t = instructor_mode = true; benchmark = false; explainThis = - { show = true; show_feedback = false; highlight = NoHighlight }; + { show = false; show_feedback = false; highlight = NoHighlight }; mode = Exercises; }; scratch = @@ -145,7 +145,7 @@ let startup : PersistentData.t = ], [ ("scratch_0", Evaluation) ] ); documentation = - ( "Programming Expressively", + ( "Projectors", [ ( "Casting", { @@ -11439,6 +11439,525 @@ let startup : PersistentData.t = test 2 + 2 == 5 end;\n\n\ 2 + 2"; } ); + ( "Projectors", + { + zipper = + "((selection((focus Left)(content())(mode \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ + 6d57dde6-dedb-4193-8367-8939f9b7f6b2)(content(Comment\"# \ + Below are two fold projectors: Simple & Info \ + #\"))))(Secondary((id \ + 38f13118-6bc6-4162-8907-ddb1a942dc2d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dc707c96-79b1-4526-a66e-6136b507fdb8)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 8d80e7d2-79df-4b4e-8518-9f41c4cbcb60)(content(Whitespace\" \ + \"))))(Tile((id \ + 175520a7-098f-4d6f-9483-299e6a95c358)(label(folds))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 5ddc0bda-829a-4cda-aa74-ed26cf0a87d7)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + f9b1771d-ba6e-4f4a-8d0f-43ebe4246a04)(content(Whitespace\" \ + \"))))(Tile((id \ + 59030dfd-2230-42c4-a2be-e300c627bfc6)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + f2fdca8d-f0de-498e-b8da-7f4acf7182f0)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + fe701554-a951-47bb-b11a-dbef142c6aec)(content(Whitespace\" \ + \"))))(Tile((id \ + f4dc1c7f-8b06-44c5-9b52-430478f31d0b)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 36fb688b-56e5-4956-ad62-69c96e400bdf)(content(Whitespace\" \ + \"))))(Tile((id \ + bcecf64c-90f2-4df4-b5bb-c9019a49b20d)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 235cbff0-5607-4ed9-82b3-5f9ee65061f1)(content(Whitespace\" \ + \")))))((Secondary((id \ + 494dc41b-e83b-480a-8398-5bd9e6bc8740)(content(Whitespace\" \ + \"))))(Grout((id 8935d807-0b39-468f-9ada-eaa0124d2f4d)(shape \ + Convex)))(Secondary((id \ + 26c18402-aec3-4998-8e69-26f9292f7e59)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 19d3c93d-ba0a-4420-abc5-5a4a76f863e5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2e8148b6-8fd8-4416-a03b-db9b3fb1088c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2a1f67a1-880b-470d-a952-37ff37ed2439)(content(Comment\"# \ + Three base types have inline livelits #\"))))(Secondary((id \ + 3fb88a68-cf88-46fb-b238-86e9b8a9954e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e910ed34-02ea-4e69-a5f0-8754c94dd048)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 0994b9e7-b4d3-4532-8f8a-b29f88f1423a)(content(Whitespace\" \ + \"))))(Tile((id \ + d7572849-d4ab-41c0-ae0a-584d31b878af)(label(guard))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + e3b4c946-d4a1-43eb-9a7a-7dc97f111856)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + f3820fe7-91a6-4232-9610-8eaacd0008c0)(content(Whitespace\" \ + \"))))(Tile((id \ + 141eac0a-de77-4a72-9a28-e0d997e1c10b)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f12b8fef-14b1-420e-b0ee-f7bc7f87aac8)(content(Whitespace\" \ + \")))))((Secondary((id \ + c9f7a615-6962-4273-9439-60a2b1305461)(content(Whitespace\" \ + \"))))(Tile((id \ + d3c0d680-bfde-4279-adba-79b3a4a64d61)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + d7a4ec3d-3e1d-4471-af0f-fbe26925041e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + eac9883c-b913-4a3b-a3ad-04d7f80df919)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f013d7a-1829-4d42-832f-79241473aa8b)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 81be0355-7832-4553-a742-fb61b488cb1a)(content(Whitespace\" \ + \"))))(Tile((id \ + d0bd7838-a427-4f72-bc2b-d137030d4ca3)(label(phase))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + a22da0d7-5999-4a57-a398-979ebb2fe682)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a47bcfd4-e6b7-4eca-9f85-38f1e5e6c109)(content(Whitespace\" \ + \"))))(Tile((id \ + 431a404b-c52d-4e11-81ff-732dde7bf942)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + da3a6608-0bff-48ef-bb86-9aed4853c789)(content(Whitespace\" \ + \")))))((Secondary((id \ + b8da7817-275c-4915-8e03-983998f51b80)(content(Whitespace\" \ + \"))))(Tile((id \ + 9f5fefb9-9cf6-430f-a507-17d7fdf96788)(label(60))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + f1adc445-664e-4d8b-91d7-9c8622a63792)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 91ae68fb-7743-4328-b251-21c5f11bfeb3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 30cee712-1204-48d9-9efc-949a87819972)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 5a6b408d-f769-41b6-bb22-e733ad4ca98e)(content(Whitespace\" \ + \"))))(Tile((id \ + 4ec8b506-d376-45c4-9120-12f2cd994e06)(label(float))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 70efa900-4a47-4e28-8fef-8065ef34e2cd)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + cb0c8366-ad34-4348-9735-243bfc6278cf)(content(Whitespace\" \ + \"))))(Tile((id \ + 2e7403b8-e4bd-4c4a-94ab-c7adb97426ed)(label(Float))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + a3359874-326e-43e2-8af6-4437013efabb)(content(Whitespace\" \ + \")))))((Secondary((id \ + 86e2f9ed-b6e4-4738-b071-2e36b608b902)(content(Whitespace\" \ + \"))))(Tile((id \ + d59f30c5-c4e0-4182-be6a-666baba654ea)(label(55.00))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + f2b7fe69-0757-4bed-9e7c-730225e64bc3)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 9ba63df4-25b7-459a-ad02-eaee7f6c4459)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8089e622-2048-4f62-bd02-d7c10a9850ef)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 02a23871-c9de-4342-a2b1-5471de100b9e)(content(Comment\"# \ + Inline error decorations #\"))))(Secondary((id \ + 6cdbe887-aa46-424e-91c5-66d30e9170dd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fbece650-1e89-41ca-aaf8-43dc0025bd8e)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + fa75dfd4-7ba9-4170-85c5-b92078ef5ea4)(content(Whitespace\" \ + \"))))(Tile((id \ + 9241e4dd-92ce-481a-9574-93b3155b6b91)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 65be95aa-a6cd-4cc0-8a34-33919a9f2293)(label(a))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 5b541706-78dd-4c32-81bc-c7be32e7572a)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Tile((id \ + b9f6fcde-289c-45f2-b9d4-3d0135f07640)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + d3f084fb-44ab-4bab-9663-d90b8626daf1)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + de16a5bd-2800-43d1-8309-eba789709771)(content(Whitespace\" \ + \"))))(Tile((id \ + aa5f9143-3c81-4c64-aec6-f17eb71a742e)(label(f))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 0be9678d-c931-49a9-90ff-2d4df59123a7)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7ddf445a-875b-412b-a1e7-2b7d711e1b49)(content(Whitespace\" \ + \"))))(Tile((id \ + fd597605-4507-41d3-9577-db3f39079bc9)(label(Float))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 74e6702a-76ee-41b2-a487-fb9cc9ae7d9b)(content(Whitespace\" \ + \")))))((Secondary((id \ + c3ce78ea-3675-4bed-964e-e464eb35664d)(content(Whitespace\" \ + \"))))(Tile((id \ + eecb808d-a186-45fb-8d0a-0c09e9dd87bc)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + bbf0fcd0-334a-4169-8e3e-51508225ad5d)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + a23f625a-0115-4fde-9450-31f81b763935)(content(Whitespace\" \ + \"))))(Tile((id \ + 432c81db-6a1e-4004-9568-cb79e7e879df)(label(45))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + ff0da802-0af3-4c8a-a6ab-8764d6157a68)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 455f3773-b7c7-428f-9b0a-41bfda38e704)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ed5febe8-551b-4a9c-8ead-3cfb1a2c46e2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + eca88f41-ffc1-40c6-b817-67fcba0187d7)(content(Comment\"# \ + Strings get a multiline view #\"))))(Secondary((id \ + 3319c676-d73c-41ad-9719-18c4c4593a5e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3db2a667-a0ef-4898-b396-910811f90129)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 1cf125cd-8ded-4d6c-9807-eb8d7ce621b2)(content(Whitespace\" \ + \"))))(Tile((id \ + 7bec43f7-2af7-4b75-971e-66d30e0fd097)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + d82a62e4-8090-43e6-b92d-3a795dffe7bd)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e6ce38bb-71db-4616-9ab0-8ba9a74f9632)(content(Whitespace\" \ + \"))))(Tile((id \ + e6286324-15af-433d-98c1-0943d17f02e0)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 9ac3c343-82b1-45cc-9230-1a4f3fafa91b)(content(Whitespace\" \ + \")))))((Secondary((id \ + 8c3d0554-ee07-4809-b732-12bd477756b5)(content(Whitespace\" \ + \"))))(Tile((id \ + 38e62114-d7b9-4ed8-a11b-376858934196)(label(\"\\\"\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 73187de5-e0c9-48eb-80d8-8e97ee7e87f2)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0692e9c9-1c78-42e9-b1f8-46f69ef31a29)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9bc6c55e-2dfc-4c1b-9d87-e49c725d2015)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + b8ff50e8-3ac5-4ef9-a0c7-d772066172f3)(content(Whitespace\" \ + \"))))(Tile((id \ + 66e8b83e-29ac-434c-92d3-f36959b6aa33)(label(__))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 054baa08-b84b-4a87-8e7b-028d3c7776a4)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 565a16b1-5654-449d-9e8c-510f066e6ac4)(content(Whitespace\" \ + \"))))(Tile((id \ + 4a6c2724-d58f-4005-ad77-ae3dbd3ae53b)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 38f67f6c-0bb0-4613-9bbc-1ce44ef1066f)(content(Whitespace\" \ + \")))))((Secondary((id \ + d5469435-38f8-4e0b-b4d0-96ba8038e904)(content(Whitespace\" \ + \"))))(Tile((id \ + 4bc49445-a368-4d5f-98ae-846cada6427a)(label(\"\\\"\\\\n\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + e681efe2-df51-438a-a79d-fb2334da1faf)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 35c356b6-ba26-4681-9a8e-610ff5e93bec)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f192a10b-4dd8-44f6-9744-2a07e8a2d67d)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + e92e5a3c-9990-4fb3-a937-18062160dffc)(content(Whitespace\" \ + \"))))(Tile((id \ + e1c39821-f4f9-400f-8127-4c4acded9420)(label(___))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 5a350df3-2e80-41da-a048-606bcb80f5cf)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 6678e7a0-de15-44d5-a9d1-24b4b7036136)(content(Whitespace\" \ + \"))))(Tile((id \ + 760c4003-e15e-4499-9591-2d2ba559ac04)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 0b129a48-4726-4e05-ab5f-5ed45fefff5f)(content(Whitespace\" \ + \")))))((Secondary((id \ + f284313f-b976-465a-ac9f-ae6b311ff727)(content(Whitespace\" \ + \"))))(Tile((id \ + f98e35be-44d9-4973-8e3f-8739dbddbcf9)(label(\"\\\"a\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 60e0eb5c-606d-451e-bcb8-e005974b38a2)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 911050e4-a1aa-43f6-a1eb-b15b73d7db71)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 324cbe08-46bd-47b1-98a7-c47706a266f6)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + daf66cc5-2d0c-4b5f-aff4-2ebf806fe44d)(content(Whitespace\" \ + \"))))(Tile((id \ + 4f640faf-3a08-4604-8841-a97486da7713)(label(____))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + e6df7bff-b468-42eb-9fbf-ea2be3b64065)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 43ada1ab-57f3-4b7d-b8b3-6ef7832242a8)(content(Whitespace\" \ + \"))))(Tile((id \ + cc047085-9fcf-4844-96e0-0bed354c9f62)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 423ee039-187c-422f-bc42-d25bcb27318a)(content(Whitespace\" \ + \")))))((Secondary((id \ + fca3b089-b6ff-4138-af21-644cea4037a0)(content(Whitespace\" \ + \"))))(Tile((id \ + fe38a3b6-6401-4631-add3-f0339bd92210)(label(\"\\\"shift\\\\n\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 5bd7de77-052f-43d2-8890-bf6c95180b4f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 6076f23c-27cd-4208-890a-3524bff66887)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2f6061c4-ade3-481b-b4e4-ece5c15f8ae0)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 63fba73e-a406-4911-8349-4d83dfa2562a)(content(Whitespace\" \ + \"))))(Tile((id \ + d4863515-fd12-4386-a78b-19c77f5f7f0e)(label(_____))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 56f6acf9-96ee-4a4c-bc2a-156e02d0695d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e9744883-effc-4c6b-93d4-3af468077c9a)(content(Whitespace\" \ + \"))))(Tile((id \ + 5703b8ab-cc7c-4dbd-a253-4cacc09ee4a9)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + fc013ff9-7425-42b7-a177-050de7fe8718)(content(Whitespace\" \ + \")))))((Secondary((id \ + 67a75070-d2c3-4948-ab74-f89723d15335)(content(Whitespace\" \ + \"))))(Tile((id \ + fcfc4a5d-d131-4e19-8641-05887df4f8b4)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c1ecd5fd-ed41-4d3e-ad81-60410f43e168)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + d1d31f54-403d-4310-8891-8b260bfca128)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6307c4fe-42be-4597-be40-b67eede1be87)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + ca10cb6c-3a85-483a-babc-2538be70ca21)(content(Whitespace\" \ + \"))))(Tile((id \ + 848a2578-929b-4ee3-a3dc-63e177ee4e23)(label(______))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 6acf4c1a-3004-4569-bfa6-43ae1054e13b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 807f20fa-288f-4efd-9ece-9999e3ec6278)(content(Whitespace\" \ + \"))))(Tile((id \ + 12d895fe-8086-482c-9de6-a8e894781071)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + d3ae9cb2-38d7-49bf-ac3d-4ece4bb2e582)(content(Whitespace\" \ + \")))))((Secondary((id \ + 13756412-074e-432f-9e92-294a50e2cf94)(content(Whitespace\" \ + \"))))(Tile((id \ + 009307fa-71af-4f48-9fd2-369aad11ff71)(label(\"\\\"a\\\\n \ + shift\\\\n malicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 8523e073-2f94-4efe-8c8f-842304a63480)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4044f0fb-fd18-44ae-be39-83d2a97850e8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 48f4642f-93dc-488b-ac24-9898e33dc0ef)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6d05067f-f605-48aa-88b9-b2c04b98382b)(content(Comment\"# \ + Multiline error decorations#\"))))(Secondary((id \ + 4c5a46f7-cce7-469d-b078-ecd00a4372f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7f3b97a4-21b5-4868-bcaf-8fdd1f635847)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + f3c247c6-1a84-42c9-a432-972c8fa7fc0d)(content(Whitespace\" \ + \"))))(Tile((id \ + 75a94ce7-5fc7-4a38-81d1-2d40a2364116)(label(box))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 3bda9989-c9ac-4586-8b94-83bae9a27e6f)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a1d9f0c3-0d5d-4987-804c-5b6767a6eae9)(content(Whitespace\" \ + \"))))(Tile((id \ + c67269cc-fdde-42a1-8cc6-eb1556db7e95)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + e53399f5-23a1-4a09-9be7-34a5d91f9ad9)(content(Whitespace\" \ + \")))))((Secondary((id \ + 34a19d5c-430a-45a4-bd9e-e74c7f95a410)(content(Whitespace\" \ + \"))))(Tile((id \ + 522742b5-5981-4a1c-9a74-105e020fad85)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0f4d62eb-9dbf-45d0-9315-552fddc00f72)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 24f235aa-6504-48c4-9239-81748c3f40d8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + be0b7f86-2083-4695-8f92-792c33973d1f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 674e2927-c316-41c9-b5fa-1b57bdc9821a)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 79ca5ddb-92af-468a-a702-f834fab0d6d8)(content(Whitespace\" \ + \"))))(Tile((id \ + d886a161-7377-4404-8099-b36a6e886bc8)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + a86181d3-9ec4-49a1-9b5c-50320a340c54)(content(Whitespace\" \ + \"))))(Tile((id \ + 1eb5901a-15b6-4f19-bccd-5ae7595b4902)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 00651def-bd47-44f6-a20f-84332cbf546d)(content(Whitespace\" \ + \"))))(Tile((id \ + 43f38665-0173-4e2b-8084-616dd14d7095)(label(79))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 2c618423-bba5-45b9-b229-b79b4883571b)(content(Whitespace\" \ + \"))))(Tile((id \ + 30f684d2-4ee8-4480-af2a-8b97b23f97b2)(label(<))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 6311cdb0-2150-431f-9f5f-1a709085fefc)(content(Whitespace\" \ + \"))))(Tile((id \ + 891695d6-a7e7-4aa0-8725-673929d05531)(label(int_of_float))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 492af390-9094-4823-93c2-252b8790678a)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 862881a7-ccc8-4fec-9935-65a21984520d)(label(60.00))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + e824e1b8-80af-4763-a35d-ea05c6450ca4)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 9481ed01-c619-4b88-8ae1-8b9458c28168)(content(Whitespace\" \ + \"))))(Tile((id \ + 2405abba-b962-404b-ad10-8b4710791048)(label(______))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + bc613398-7d1c-43fa-bdeb-e03bd9fb5e02)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cc8f5c0d-64d4-453c-9379-3a0f0b194c51)(content(Whitespace\" \ + \"))))(Tile((id \ + e03b8f9d-030d-4e98-9e7f-bc55ecf20876)(label(\"\\\"its: \ + \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 044f8f77-35ff-41f3-80d7-c6335b96edb9)(content(Whitespace\" \ + \"))))(Tile((id \ + 5989bbe1-ee64-42e9-953c-96d695e7c0ac)(label(++))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 6a2232cf-0eb2-4bd6-b73a-64abc2d4b74f)(content(Whitespace\" \ + \"))))(Tile((id \ + 6e6e48db-9b72-4a69-bd8e-77c66bccbc6b)(label(_____))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b5b527fd-3e8e-4651-872d-f8144c944061)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3629f4dc-30d5-49fb-aff6-93d3246f7205)(content(Whitespace\" \ + \"))))(Secondary((id \ + d6644add-22e0-44ad-a434-5d175e65e30e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 092c05bd-4a34-42d5-ad57-7a5e2ad70ac6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + baa84041-2788-479a-abe3-5cc7ce38f534)(content(Whitespace\" \ + \")))))))(ancestors())))(caret \ + Outer)(projectors((009307fa-71af-4f48-9fd2-369aad11ff71((kind \ + TextArea)(model\"()\")))(38e62114-d7b9-4ed8-a11b-376858934196((kind \ + TextArea)(model\"()\")))(432c81db-6a1e-4004-9568-cb79e7e879df((kind \ + Slider)(model\"()\")))(43f38665-0173-4e2b-8084-616dd14d7095((kind \ + Slider)(model\"()\")))(4bc49445-a368-4d5f-98ae-846cada6427a((kind \ + TextArea)(model\"()\")))(522742b5-5981-4a1c-9a74-105e020fad85((kind \ + TextArea)(model\"()\")))(59030dfd-2230-42c4-a2be-e300c627bfc6((kind \ + Fold)(model\"()\")))(862881a7-ccc8-4fec-9935-65a21984520d((kind \ + SliderF)(model\"()\")))(891695d6-a7e7-4aa0-8725-673929d05531((kind \ + Fold)(model\"()\")))(8935d807-0b39-468f-9ada-eaa0124d2f4d((kind \ + Info)(model \ + Expected)))(9f5fefb9-9cf6-430f-a507-17d7fdf96788((kind \ + Slider)(model\"()\")))(d3c0d680-bfde-4279-adba-79b3a4a64d61((kind \ + Checkbox)(model\"()\")))(d59f30c5-c4e0-4182-be6a-666baba654ea((kind \ + SliderF)(model\"()\")))(d886a161-7377-4404-8099-b36a6e886bc8((kind \ + Checkbox)(model\"()\")))(eecb808d-a186-45fb-8d0a-0c09e9dd87bc((kind \ + Checkbox)(model\"()\")))(f98e35be-44d9-4973-8e3f-8739dbddbcf9((kind \ + TextArea)(model\"()\")))(fcfc4a5d-d131-4e19-8641-05887df4f8b4((kind \ + TextArea)(model\"()\")))(fe38a3b6-6401-4631-add3-f0339bd92210((kind \ + TextArea)(model\"()\"))))))"; + backup_text = + "# Below are two fold projectors: Simple & Info #\n\ + let folds: (Int -> Bool) = in\n\n\ + # Three base types have inline livelits #\n\ + let guard: Bool = true in\n\ + let phase: Int = 60 in\n\ + let float: Float = 55.00 in\n\n\ + # Inline error decorations #\n\ + let (a:Int, f: Float) = true, 45 in\n\n\ + # Strings get a multiline view #\n\ + let _: String = \"\" in\n\ + let __: String = \"\\n\" in\n\ + let ___: String = \"a\" in\n\ + let ____: String = \"shift\\n\" in\n\ + let _____: String = \"\\nmalicious\" in\n\ + let ______: String = \"a\\n shift\\n malicious\" in\n\n\ + # Multiline error decorations#\n\ + let box: Int = \"\\nmalicious\" in\n\n\ + if true && 79 < int_of_float(60.00)\n\ + then ______ else \"its: \" ++ _____ \n\ + \ "; + } ); ( "Types & static errors", { zipper = @@ -17048,5 +17567,6 @@ let startup : PersistentData.t = [ ("scratch_Basic Reference", Evaluation); ("scratch_Programming Expressively", Evaluation); + ("scratch_Projectors", Evaluation); ] ); } diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index a7a2c18f6c..60591800b5 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -699,7 +699,7 @@ select { fill: var(--exp-bg-off-color); } .projector > svg > path { - /* filter: url(#raised-drop-shadow-Exp) !important; */ + /* filter: url(#raised-drop-shadow-Exp) !important; */ } /* PROJECTOR: FOLD */ @@ -826,6 +826,7 @@ select { color: #8c7e62; background: none; box-shadow: inset 1px 0 0 #ff8ea88a; + overflow: hidden; /* hack: scrolls in chrome without this? */ } .projector.text textarea::selection { From e05f11894b2279793f63a029e10a0d0eb79b7cf6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 00:19:20 -0400 Subject: [PATCH 117/168] chunk shard style backing for block projectors. generalized textarea backing style to block projectors in general. fixed init.ml docs issues that were previously broken by reparse eg eval --- src/haz3lcore/zipper/action/Action.re | 1 + .../zipper/action/ProjectorPerform.re | 12 +- src/haz3lweb/Init.ml | 5290 ++++++++++------- src/haz3lweb/dune | 2 +- src/haz3lweb/view/Deco.re | 33 +- src/haz3lweb/view/ProjectorView.re | 22 +- src/haz3lweb/view/dec/DecUtil.re | 4 +- src/haz3lweb/view/dec/PieceDec.re | 62 + src/haz3lweb/www/style.css | 69 +- src/util/dune | 2 +- 10 files changed, 3360 insertions(+), 2137 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index f8b5127dd5..8f122e8288 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -50,6 +50,7 @@ type project = | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) | FocusInternal(Id.t, Util.Direction.t) + | Activate(Id.t) | Escape(Id.t, Direction.t) | Remove(Id.t); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 6e8f6a981a..75d66df386 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -93,7 +93,7 @@ let go = | Some((piece, d, rel)) => add_or_remove(Piece.id(piece), z, p, piece, d, rel) } - | Remove(id) => + | Activate(id) => let p = indicated_proj_z(z) |> Option.map(snd); switch (p) { | Some(p) => @@ -102,11 +102,11 @@ let go = Error(Action.Failure.Cant_project); | None => Error(Action.Failure.Cant_project) }; - // | Remove(id) => - // switch (Map.mem(id, z.projectors)) { - // | false => Error(Action.Failure.Cant_project) - // | true => Ok(set(id, None, z)) - // } + | Remove(id) => + switch (Map.mem(id, z.projectors)) { + | false => Error(Action.Failure.Cant_project) + | true => Ok(set(id, None, z)) + } | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) | UpdateModel(id, model) => Ok({ diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index a717dea51f..44479c985f 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -38,14 +38,658 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 27df84bb-b653-475f-9e4c-8d35ae0a6d33)(content(Whitespace\" \ + bf55461b-033f-43d1-b6da-27c10c213813)(content(Comment\"# \ + PROJECTORS #\"))))(Secondary((id \ + e098d2d5-046e-4c89-92cb-578b19937d9e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 63c09322-1c5f-464a-8cad-d18f9b89c661)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f005a4b3-1215-46da-bb69-b4ba80d3b215)(content(Comment\"# Some \ + kinds of syntax have dedicated GUIs. \ + #\"))))(Secondary((id \ + 99b70603-66d5-4639-aa9b-b43dee1cbec2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1ee1e8c0-6aba-4eab-b66f-636823e5a4e8)(content(Comment\"# The \ + menu at the bottom left shows which GUIs \ + #\"))))(Secondary((id \ + 14e1e998-352c-4a0c-b841-453e9b53c173)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 498d6ac4-e1be-4bb9-a34e-292b712d3e2d)(content(Comment\"# (if \ + any) are applicable to the current term \ + #\"))))(Secondary((id \ + 8d86e54f-bf4c-4083-8064-2b2cc8213b0d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6cf459f4-d2ab-4fb6-9ccd-b7bdf11332e9)(content(Comment\"# \ + indicated by the caret. \ + #\"))))(Secondary((id \ + 22078138-3eb1-4d82-a065-6cf4efcf650b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e8441807-2e12-45ea-bd3c-7310c29f55e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6189e770-4a3c-4865-8318-db732c97ae55)(content(Comment\"# Fold \ + projectors cover terms with abstractions. \ + #\"))))(Secondary((id \ + bb768d63-d4b0-4692-bb08-d44f4f8b49ed)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b448bdd6-945d-43cd-8bdf-1d4b925488d1)(content(Comment\"# 1. A \ + simple fold roles up any term, replacing \ + #\"))))(Secondary((id \ + 7ae00ecc-713e-4569-91c8-2b95c982b7dc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + df74c8e6-e684-48b2-9645-fa3ac39f2321)(content(Comment\"# it \ + with ... until it is expanded again. \ + #\"))))(Secondary((id \ + d7bb6d4a-5b4c-405c-930d-3c5a876f3d41)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 551dabf1-bf90-4061-b622-5e509e6e4f38)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7bfca1ff-5ce6-4c12-a78a-86a699e8dfb4)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + bd3529f5-9b3a-4c11-b6ce-dda813e0fb12)(content(Whitespace\" \ + \"))))(Tile((id \ + 9cf96ad2-ebca-4a57-8552-efac7177e6d6)(label(fold))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + fddad1a7-251c-4557-89a8-e4ab674677a9)(content(Whitespace\" \ + \")))))((Secondary((id \ + d5318305-ade6-4c55-87c3-66fee19e03d5)(content(Whitespace\" \ + \"))))(Tile((id \ + 44567071-4f8e-4c42-9d9c-e67c7855dd77)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + ab128650-72bc-4c5c-bc3c-17e6ad51a81c)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 8b7bc2db-cf6e-40a5-82c8-be3a11866150)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4f879f8e-6cda-45a1-9a95-2fc8a8f648c1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 81a5b8d5-bc01-493f-8c7d-645540f2c736)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 3a4b2745-4e63-4560-921e-c4cdbda17552)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 8d37fa5d-10d5-4534-a396-3c9b9e6d1aa1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4786c0c1-c6af-446b-a14b-d347ac58d430)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 84e53a2e-ece8-4d6e-9b88-60c305064e8e)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + f8cb8a86-f40b-472e-9c79-41c72b5a5380)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 966f9b94-9042-4555-9559-2b8d31b6dca0)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + d638f071-3373-454f-ab7a-e3f807d2a26e)(label(\"()\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(Secondary((id \ + 437072ef-1a10-454b-aa7d-69c6b8aabb2d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + ac562e3f-6d57-454f-809b-3b4a4dea90b4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f6087b46-5280-408e-8618-d682587f8522)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7da3277d-2510-48eb-8985-54f02e53142a)(content(Comment\"# 2. A \ + semantic fold covers a term with a property: \ + #\"))))(Secondary((id \ + 6ef1a5eb-53e1-4dff-aa31-780506ff447c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9df325c2-436d-4234-965a-7b3449e3e233)(content(Comment\"# \ + Click to toggle inferred & synthesized types \ + #\"))))(Secondary((id \ + 33b6a395-b5da-4ac7-97bb-268fb12c804b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 04185330-1edc-4e4d-be3e-1092df66cc74)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d887ee56-f82b-48cf-82ab-467c9baf402c)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 7d8bafa4-edf9-42a6-9fb8-f8bc7b35e2a1)(content(Whitespace\" \ + \"))))(Tile((id \ + d666d484-8652-4be5-b7bd-371c7a3b30d2)(label(folds))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + e7af10b2-bd04-4afc-a5c7-0e99bb020859)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + cee1670d-0f18-45be-a7b1-b3be4f15ad73)(content(Whitespace\" \ + \"))))(Tile((id \ + 8f0882d0-cfab-4488-a2f8-5d9380774d73)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 24cb2e53-f836-4a5b-8d2b-6b2c513f084b)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e36fd936-518f-4fe7-902d-d4828602d402)(content(Whitespace\" \ + \"))))(Tile((id \ + 284ef493-bf58-46f2-8b39-ff57e4b1b617)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort Typ))((shape(Concave \ + 6))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4427eabc-5119-4b12-b4ed-b0c21f921ad6)(content(Whitespace\" \ + \"))))(Tile((id \ + bb5ceb72-956d-4e60-9e60-1f4455014432)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 40040726-dbff-4b42-83a7-cbf6fbf702bf)(content(Whitespace\" \ + \")))))((Secondary((id \ + e664dca1-6b6b-43df-92c5-ce0b47bdb5d3)(content(Whitespace\" \ + \"))))(Grout((id 9082db6a-3383-4a57-b3bd-9ab54b90478e)(shape \ + Convex)))(Secondary((id \ + ebb3d015-fffe-4485-9bcb-b19791b5ad3c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 918b829b-2205-4701-a649-cca45eef92f4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 45376ae5-fc43-4210-97b3-7a9e0b1b99f4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0e0d3f24-3e45-4a08-9e11-57e099b25b60)(content(Comment\"# \ + Projectors on literal data are called livelits. \ + #\"))))(Secondary((id \ + 37a79098-c967-402b-bf91-ab4b629dc21f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8b076343-a3af-45ed-89ff-3d0767790f0e)(content(Comment\"# Three \ + base types literals use inline views: \ + #\"))))(Secondary((id \ + efb4a7a7-3b10-4b9a-867c-9a66f7287dfe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1d5b50ce-19ef-4aa2-b3cb-3eb7fc64e8ee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a18674df-4b6a-4c84-b7f4-87c03f381e31)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 97f07be8-f98a-415d-b336-e7fe26e35fc7)(content(Whitespace\" \ + \"))))(Tile((id \ + 1d58f652-c3f9-4c6c-b99a-c802af5f6784)(label(guard))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + ac204c96-278f-4702-b972-fe41e8017b71)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 3ece060c-beaf-448c-b598-c798bd1fb080)(content(Whitespace\" \ + \"))))(Tile((id \ + b17d0141-6b78-4f08-9c3f-b46b343293ee)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 11f0955b-a96f-40ad-aed4-6913bdb69a6c)(content(Whitespace\" \ + \")))))((Secondary((id \ + 8153f573-1082-4d52-b385-8658f14147f7)(content(Whitespace\" \ + \"))))(Tile((id \ + f4f1d912-c312-4809-9d84-3cd729a50e40)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 9e2139ea-9055-4718-b544-a68f5017d28b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c1ccf339-4fef-4a94-9e5e-b5ccf1e142f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 11b25da0-6db8-47d8-9b71-17fb13a30887)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 8f84e448-40f0-4d06-9105-ec3183494ebd)(content(Whitespace\" \ + \"))))(Tile((id \ + 35cc6b95-3222-4789-ac68-ae279d3d58ec)(label(phase))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + f2482f4d-d157-4b49-bb8c-ad7dc265fd7b)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 28cbb49c-2124-4897-9732-f8aa7a698d4e)(content(Whitespace\" \ + \"))))(Tile((id \ + 97202a86-9a46-49f8-a560-13c3a3cd73bc)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ae0a9a22-aa5b-4ae5-afa5-66e57f241d0a)(content(Whitespace\" \ + \")))))((Secondary((id \ + 509f12aa-cf92-41d2-ae41-0d9d766735b0)(content(Whitespace\" \ + \"))))(Tile((id \ + 15a3dabb-c4ee-41c9-adce-a04d217a118e)(label(44))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 70c3f042-ed70-4c04-be8e-05f984583035)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cb3a42f1-d906-4d15-821d-c0457d1083f0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5525c76a-a6c1-4e41-9d14-ccd2690dacd1)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + c5249efb-0d1f-497f-9bdf-e46cf350e482)(content(Whitespace\" \ + \"))))(Tile((id \ + 37a12141-5277-4e94-bfb0-1faeaf325a64)(label(float))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + c3886630-7e8e-4b5d-8300-d973d222bf70)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 45d02f72-da15-44b6-b02e-a5162666a07d)(content(Whitespace\" \ + \"))))(Tile((id \ + 3eecc80d-1a01-4364-9d05-01553c3ae59d)(label(Float))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8b9b5395-e8d6-44f6-a1a4-8e80baa39b78)(content(Whitespace\" \ + \")))))((Secondary((id \ + d58a9df6-b04d-4117-9b98-73f2ebc090f4)(content(Whitespace\" \ + \"))))(Tile((id \ + fccb7933-86a8-4d60-b885-234abd132b90)(label(79.00))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 123dd104-7a4f-4c5e-9240-32d4c04b6bf6)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + ee855910-ba64-4f1a-99d5-017cedd6ae85)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e324c3b6-6bb3-40d3-a2b4-4cf272306ff5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 328c6682-1c08-4aab-a05d-7ab232e8c70e)(content(Comment\"# Inline \ + error decorations (same as for tokens) #\"))))(Secondary((id \ + 576032f7-84a4-414f-9b15-0f091f538b6e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf78e9e0-232e-4da2-9b07-01ba791b9383)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 94ea22f4-35cb-45c8-bd43-8977de4760d3)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 821509aa-6469-41bf-ba4e-23e6712f6d15)(content(Whitespace\" \ + \"))))(Tile((id \ + 9ffcc05b-a3c2-469a-87a3-2f70e619bb03)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 545fee50-3ebd-491e-ac90-65058cc90c4e)(label(a))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + a170578b-ae1c-431e-816e-07dcddac29a0)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Tile((id \ + b0d23be0-4fab-467a-ad85-6f5184d31365)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Tile((id \ + 79b0945d-4df7-45ec-be85-d287c3273ce2)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort Pat))((shape(Concave \ + 15))(sort Pat))))))(shards(0))(children())))(Secondary((id \ + dafa0103-79be-48e0-aac9-63966ff5b014)(content(Whitespace\" \ + \"))))(Tile((id \ + 9c0563fa-f824-4ae5-ac1f-9fc75e0b7e9d)(label(f))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 1a182b4d-1891-420b-bfce-6b7793bfcaa3)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 649ef1f6-c81d-4743-8e36-1a7b615d35c7)(content(Whitespace\" \ + \"))))(Tile((id \ + 94aaaf87-3e34-4ac2-99fc-4b8b85a55400)(label(Float))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 6c6ee1f9-823d-4077-a183-3572210f7803)(content(Whitespace\" \ + \")))))((Secondary((id \ + 96496c4d-eec0-4a6e-a82f-06e44ad10f9c)(content(Whitespace\" \ + \"))))(Tile((id \ + fe9aaa1c-473b-4de7-b8f6-8e76ada94f1a)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 22c1a26d-c217-4da3-ad15-837c9ffd3467)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort Exp))((shape(Concave \ + 15))(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 3daf019d-f290-481e-ac80-ef35cb2ec7fd)(content(Whitespace\" \ + \"))))(Tile((id \ + 4e85dfc9-08a3-4790-a681-c752eb512780)(label(28))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c7ca7822-6292-4cfe-88c1-4639f6178f6c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 09072f7a-f9c1-4115-bcc3-63f6992ca758)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 83fa32e9-6a11-44ea-90ce-8b90af9e4eba)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a608c49-93fc-4cd8-84fd-e9a827156c9e)(content(Comment\"# The \ + String base type get a multiline view: #\"))))(Secondary((id \ + 18665233-028b-4f1a-b37f-8f9a4ddf0d9b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 727addbe-c792-45e7-a99a-ddc52d790583)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + af3ebbab-5c85-4573-a2d5-fcce429f53f7)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 7158ccc1-a928-4a59-96a6-6bc9b775855e)(content(Whitespace\" \ + \"))))(Tile((id \ + cbbe2c5e-1e28-4213-9aad-0664b6bce817)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 7895d806-35ca-4f20-a650-7726a345462e)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 2c6409ba-f92f-401e-831b-6c0287cdbe23)(content(Whitespace\" \ + \"))))(Tile((id \ + 0fe96735-f003-416d-beb5-cfa6a7cc7e92)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c8ede035-c9fa-4cb6-8472-e50c663c707f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 3b2e0893-f2c1-4090-b86c-d54ffeb38367)(content(Whitespace\" \ + \"))))(Tile((id \ + b7f2f293-0186-4272-b358-c52d22b4bca4)(label(\"\\\"a\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 5d8829e0-6392-42d5-8a5a-b69090f77d70)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 20b698b3-0a27-4aa8-a6f2-42f0c6c4771c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 29f3f0d1-7d41-488c-beec-45a4ae29fe4b)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + c90454a7-0176-4f4a-ae8d-31c3d02e6e1b)(content(Whitespace\" \ + \"))))(Tile((id \ + 572f08fb-1b50-4bac-9fe8-7b219c22fddc)(label(__))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 1a4e2586-5e23-4747-996b-545e14d7aa8d)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + daeaf97e-c450-4286-ad38-2eaf5077c46f)(content(Whitespace\" \ + \"))))(Tile((id \ + 2f4a9017-a6bd-4039-98f3-2931f819b090)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 01bf64e3-31dd-41e9-bdca-2c6074d8dbb6)(content(Whitespace\" \ + \")))))((Secondary((id \ + 8632b375-6f55-461f-85e8-1576e0395169)(content(Whitespace\" \ + \"))))(Tile((id \ + 9874058f-1a2d-4d55-a864-7c18e851219a)(label(\"\\\"\\\\n\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4c54745b-6990-4d49-b8c8-954752e31a8f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + cdc918e3-f69f-4449-bba7-1223610b4f25)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 684d40ea-cac8-428e-a28e-09166c8f64ea)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 42be8063-4c3b-4ddc-9a10-1ee2d871930b)(content(Whitespace\" \ + \"))))(Tile((id \ + 4a3502dc-eb20-4bd4-86c1-b81b17da3b56)(label(___))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 837e727b-2e5a-4475-aa21-a4cb6ffe1181)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 75fcb4ef-d3c6-4b2b-820e-b33093026280)(content(Whitespace\" \ + \"))))(Tile((id \ + 1f6f9bb9-e99d-4762-80ee-ff4672c5d92e)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 74f1dd6a-c4b0-4693-8bbe-d392cac8af6f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 3688eaa6-6c65-4150-bbc6-8d5d10b29653)(content(Whitespace\" \ + \"))))(Tile((id \ + be90d682-69a8-4d88-b6e8-2e598508d07d)(label(\"\\\"a\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4dd25af6-b9c7-4bf5-96a9-68804aa4e32c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c0537d94-4c10-488f-8131-28390b1a9044)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e5747904-8e62-450d-92a6-24e33eef1b98)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 46f548a9-dc70-4079-9ac1-e04fcef8325a)(content(Whitespace\" \ + \"))))(Tile((id \ + d9e31c14-91f1-4669-8f35-580ba96005dc)(label(____))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + dd5f9e26-e6a5-411a-8b9a-646bf7e1dd56)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 636ec5f1-8224-4f50-8ae5-8a00336c2154)(content(Whitespace\" \ + \"))))(Tile((id \ + 32a16566-2e00-49fa-af1e-8b12bc29188c)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 03fc1512-8526-4b7d-8351-87a55a464e9f)(content(Whitespace\" \ + \")))))((Secondary((id \ + 47cdba0a-786c-41b6-b582-3aa7dca80b01)(content(Whitespace\" \ + \"))))(Tile((id \ + d07452c2-a421-4bb8-88c8-48c1d0b9c0c6)(label(\"\\\"d\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 1beb033b-f54b-47bd-9c79-0452aed00820)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 53f14ce5-fcc7-4402-9503-c3300510539c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d47d24e1-08c2-4437-ae32-cde10f35836b)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + b7e4a56c-e3ec-4d8a-b6b3-8011d81a9b06)(content(Whitespace\" \ + \"))))(Tile((id \ + 395260a5-12fa-43a2-8c9c-6a6e06eef6f2)(label(_____))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 087114b8-e5fc-450c-9e26-f9f28b1e585c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 95b1868a-3b07-41e5-9ef3-784862e5d5b7)(content(Whitespace\" \ + \"))))(Tile((id \ + 9c355212-19ba-4d85-86a0-75b9ef803777)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 297ac918-1f36-4c2e-8518-c77caca90c57)(content(Whitespace\" \ + \")))))((Secondary((id \ + 280eb2c8-643f-4d4d-9f3b-df33caa945c0)(content(Whitespace\" \ + \"))))(Tile((id \ + deda51f8-a793-4c73-9ed5-c6ec959935b5)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 052b371a-cf53-4c02-9501-10e4097d93b1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 237f85ed-28f9-4b71-92d4-edb0e52a525e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a2cdbd5c-7be0-4e93-8aa1-fdaafd567ee5)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 6d312329-c3dd-4e08-8213-b8111c668d93)(content(Whitespace\" \ + \"))))(Tile((id \ + 0799ec44-b23d-4bd6-9ca6-3642e5ffdf12)(label(______))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + a08f9196-ffe6-4118-a176-af08a557e104)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 5fb53f8a-2dda-4ea2-885b-eba67f595c0c)(content(Whitespace\" \ + \"))))(Tile((id \ + 9d99c82b-4138-44d7-86c7-c51b1919d0ee)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + da1b8a72-ad06-40e1-bc01-9603eabac342)(content(Whitespace\" \ + \")))))((Secondary((id \ + c75406d6-b682-4fa6-b902-4c1e13b19891)(content(Whitespace\" \ + \"))))(Tile((id \ + a328bad6-82a6-49fc-bdd3-f2cd47dfa037)(label(\"\\\"a\\\\n \ + shift\\\\n malicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4cb885a0-8e13-4db2-9cb6-a946c824ff94)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f371c438-e3be-481b-bcbc-0452d8b92d20)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 89cb3965-7bce-40cc-8570-d04edc45e458)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b0104054-5798-4787-9825-c0dbcf4ba7f4)(content(Comment\"# \ + Multiline error decorations #\"))))(Secondary((id \ + 02a3b380-8c00-4e4d-a7a2-e86100f65413)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 147df1eb-f184-4b86-95b1-afc4d00ecdeb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 11296497-3af1-4faa-afe1-2c52d7e6adf1)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + ed508733-fa94-49ee-95c0-f293ef1dc34b)(content(Whitespace\" \ + \"))))(Tile((id \ + e3daf182-c65e-4d0f-aadb-aaec5c918930)(label(box))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ + Pat))))))(shards(0))(children())))(Tile((id \ + 9e491069-ae8b-4201-a74e-f38be8602628)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ + 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 477b81fe-d002-4fe5-8434-c1a04f9f04b2)(content(Whitespace\" \ + \"))))(Tile((id \ + f4054bae-1125-4c6b-9fb2-71535754533b)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 849d996f-37ea-4eee-b475-0f07e991ea11)(content(Whitespace\" \ + \")))))((Secondary((id \ + d41ae062-74b6-41b3-acf8-7acfee819ede)(content(Whitespace\" \ + \"))))(Tile((id \ + e9542f88-6218-4c8a-9d0e-8912cb2af367)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + e7933e6a-d02e-4810-b098-3fe0b4211da4)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + b0484d9f-435a-4c0b-bbad-f35b002f7077)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 45c825b7-43ca-4ead-b66f-b5f1ae0fdfe4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7765adc4-a910-4aa7-b049-d95cbea2c519)(content(Comment\"# \ + ERRATA: \ + #\"))))(Secondary((id \ + 6b2502ae-6aa7-4f79-af57-11e9f42c6622)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 30112b9c-c3c8-44ad-9d40-37b38770a67e)(content(Comment\"# The \ + bottom toggle can also be used to remove \ + #\"))))(Secondary((id \ + ab4e5359-153c-41db-846f-d65a5a1f9bf4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3a8cf61e-a2a9-4639-9bfa-7b8eadfdc6cc)(content(Comment\"# \ + projectors. Currently only bidelmited terms can \ + #\"))))(Secondary((id \ + 82a41fe5-55ba-46f4-9347-dc40e37fec92)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 75bec90b-a2e6-4240-b6d7-1416007bae80)(content(Comment\"# \ + projected, so some may have to be parenthesized. \ + #\"))))(Secondary((id \ + be353873-d8bb-4ccb-bc5e-6bbb0475bb36)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 7a201b6a-fa16-4974-af1a-47f178db1966)(content(Comment\"# \ + Projectors are persistent across sessions, but \ + #\"))))(Secondary((id \ + 591f7cec-1fa1-4a9b-adab-4ee9f961b955)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 082b513c-b03b-4acc-b719-35968c611f52)(content(Comment\"# \ + currently are lost on cut/copy. Both these \ + #\"))))(Secondary((id \ + cd7e6533-ef30-40d3-b0ed-1564c938150c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a7d7365c-dff2-410c-8e5b-1236be2a704e)(content(Comment\"# \ + restrictions will be removed in a future update. \ + #\"))))(Secondary((id \ + a8185d3a-e316-4101-9713-1c1f50a5fd84)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e562c0ea-2d81-4a46-9ec1-0b06ce1685ac)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8fbbd6f2-973c-424b-bef2-855f600c727c)(content(Comment\"# \ + Projectors playfround #\"))))(Secondary((id \ + f88b238c-2f66-4324-8844-4619bda670cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b12c9df1-b44b-4797-bd01-f60b266599fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ab0093cb-d3d7-4ce2-8afb-c222eb6729a6)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 4e854ee4-6b18-497e-80bb-ae89ee38b41d)(content(Whitespace\" \ + \"))))(Tile((id \ + 07783d82-8dac-458f-83fa-71f6e69cd209)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + a9c3ea8f-77cd-4bd4-9903-3ed2d02ff8e1)(content(Whitespace\" \ + \"))))(Tile((id \ + 1a78a317-ee30-4599-ad60-67d72a66f72c)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort Exp))((shape(Concave \ + 10))(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 6945d8f7-a328-4e48-9d4c-c6b78fc233e8)(content(Whitespace\" \ + \"))))(Tile((id \ + 0a440294-202f-4cc5-bcb4-5ff0125c1fef)(label(79))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 31b14770-96b7-4aa4-b176-07f776013d98)(content(Whitespace\" \ + \"))))(Tile((id \ + eb92ae4a-8353-4a5e-922b-5e116e90be99)(label(<))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort Exp))((shape(Concave \ + 9))(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 4c7b94b7-54cd-4740-88db-721a09eb4b0f)(content(Whitespace\" \ + \"))))(Tile((id \ + 5bb9c867-b369-4d4b-970b-da300cc02515)(label(int_of_float))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + c29cc48d-1629-477a-843d-8a6b8172e142)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 9948829d-fcf7-45eb-aafe-ed217a8d7076)(label(60.00))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + f4ef5db4-3d57-44ae-81c4-0a31272bd18a)(content(Whitespace\" \ \"))))(Secondary((id \ - 13407fab-2a62-46d5-b541-352b37ffedc9)(content(Whitespace\" \ + 039d4ed0-263f-42f8-a09c-2eb4026ad14c)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + a8a875dc-718f-4867-a557-6a17bf7de921)(content(Whitespace\" \ + \"))))(Tile((id \ + 22aaf8b0-134b-4425-bcf9-d0ed63e05d40)(label(______))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + afa89cd0-c3b6-468f-a331-330ede229363)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 18bfc8af-9eea-4cde-a20e-ff8b20e9de58)(content(Whitespace\" \ + \"))))(Tile((id \ + 957c50a5-e89d-4cd0-a244-987980f4eb21)(label(\"\\\"its: \ + \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 1a8fbbee-903f-43f8-88c4-212483c429b7)(content(Whitespace\" \ + \"))))(Tile((id \ + c65cc809-d3c9-4fcd-ad5f-2a3483e33bc7)(label(++))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort Exp))((shape(Concave \ + 6))(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 945f4532-eeb5-40b0-a492-b776f02a36c3)(content(Whitespace\" \ + \"))))(Tile((id \ + 0707d39e-9a05-4e00-8fae-95b99b11376e)(label(box))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + c0d9e645-cbc4-4c33-92dd-700b24dadbd9)(content(Whitespace\" \ \"))))(Secondary((id \ - 3ac7d870-0bd4-40d2-a4a1-33bfcf55c366)(content(Whitespace\" \ - \")))))((Grout((id f8cc8f12-7375-4c7a-8a63-beaa19d85a2b)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + cad86941-2772-491c-8fe6-0c94745e21bb)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5122eb62-5788-4fb7-8253-59fd8a6877a8)(content(Whitespace\" \ + \"))))(Secondary((id \ + 167a6ec0-7387-4986-868f-58ca30d73669)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 644c7995-ae11-422a-8014-9a001a017cb9)(content(Whitespace\" \ + \")))))))(ancestors())))(caret(Inner 0 \ + 32))(projectors((07783d82-8dac-458f-83fa-71f6e69cd209((kind \ + Checkbox)(model\"()\")))(0a440294-202f-4cc5-bcb4-5ff0125c1fef((kind \ + Slider)(model\"()\")))(15a3dabb-c4ee-41c9-adce-a04d217a118e((kind \ + Slider)(model\"()\")))(28b98d62-d7a6-42c7-bfdd-92df5989b9bf((kind \ + Info)(model \ + Expected)))(3f0c70df-dd39-4efe-a415-eb90a1f4e818((kind \ + Fold)(model\"()\")))(44567071-4f8e-4c42-9d9c-e67c7855dd77((kind \ + Fold)(model\"()\")))(4e85dfc9-08a3-4790-a681-c752eb512780((kind \ + Slider)(model\"()\")))(59d7623e-3a8d-47b0-ab14-1b3da3af67fd((kind \ + Info)(model \ + Expected)))(5bb9c867-b369-4d4b-970b-da300cc02515((kind \ + Fold)(model\"()\")))(8f0882d0-cfab-4488-a2f8-5d9380774d73((kind \ + Fold)(model\"()\")))(9082db6a-3383-4a57-b3bd-9ab54b90478e((kind \ + Info)(model \ + Expected)))(9874058f-1a2d-4d55-a864-7c18e851219a((kind \ + TextArea)(model\"()\")))(9948829d-fcf7-45eb-aafe-ed217a8d7076((kind \ + SliderF)(model\"()\")))(a328bad6-82a6-49fc-bdd3-f2cd47dfa037((kind \ + TextArea)(model\"()\")))(b7f2f293-0186-4272-b358-c52d22b4bca4((kind \ + TextArea)(model\"()\")))(be90d682-69a8-4d88-b6e8-2e598508d07d((kind \ + TextArea)(model\"()\")))(d07452c2-a421-4bb8-88c8-48c1d0b9c0c6((kind \ + TextArea)(model\"()\")))(deda51f8-a793-4c73-9ed5-c6ec959935b5((kind \ + TextArea)(model\"()\")))(e9542f88-6218-4c8a-9d0e-8912cb2af367((kind \ + TextArea)(model\"()\")))(f4f1d912-c312-4809-9d84-3cd729a50e40((kind \ + Checkbox)(model\"()\")))(fccb7933-86a8-4d60-b885-234abd132b90((kind \ + SliderF)(model\"()\")))(fe9aaa1c-473b-4de7-b8f6-8e76ada94f1a((kind \ + Checkbox)(model\"()\"))))))"; + backup_text = + "# PROJECTORS #\n\n\ + # Some kinds of syntax have dedicated GUIs. #\n\ + # The menu at the bottom left shows which GUIs #\n\ + # (if any) are applicable to the current term #\n\ + # indicated by the caret. #\n\n\ + # Fold projectors cover terms with abstractions. #\n\ + # 1. A simple fold roles up any term, replacing #\n\ + # it with ... until it is expanded again. #\n\n\ + let fold = (((((((((((()))))))))))) in\n\n\ + # 2. A semantic fold covers a term with a property: #\n\ + # Click to toggle inferred & synthesized types #\n\n\ + let folds: (Int -> Bool) = in\n\n\ + # Projectors on literal data are called livelits. #\n\ + # Three base types literals use inline views: #\n\n\ + let guard: Bool = true in\n\ + let phase: Int = 44 in\n\ + let float: Float = 79.00 in\n\n\ + # Inline error decorations (same as for tokens) #\n\n\ + let (a:Int, f: Float) = true, 28 in\n\n\ + # The String base type get a multiline view: #\n\n\ + let _: String = \"a\" in\n\ + let __: String = \"\\n\" in\n\ + let ___: String = \"a\" in\n\ + let ____: String = \"d\" in\n\ + let _____: String = \"\\nmalicious\" in\n\ + let ______: String = \"a\\n shift\\n malicious\" in\n\n\ + # Multiline error decorations #\n\n\ + let box: Int = \"\\nmalicious\" in\n\n\ + # ERRATA: #\n\ + # The bottom toggle can also be used to remove #\n\ + # projectors. Currently only bidelmited terms can #\n\ + # projected, so some may have to be parenthesized. #\n\ + # Projectors are persistent across sessions, but #\n\ + # currently are lost on cut/copy. Both these #\n\ + # restrictions will be removed in a future update. #\n\n\ + # Projectors playfround #\n\n\ + if true && 79 < int_of_float(60.00) \n\ + then ______ else \"its: \" ++ box \n\ + \ "; }; { zipper = @@ -143,15 +787,15 @@ let startup : PersistentData.t = backup_text = " "; }; ], - [ ("scratch_0", Evaluation) ] ); + [ ("scratch_0", Evaluation); ("scratch_1", Evaluation) ] ); documentation = - ( "Projectors", + ( "Basic Reference", [ ( "Casting", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ 4513e0b2-70cf-4541-9ca2-8797759b23ca)(content(Comment\"# \ Internal Regression Tests: Function literal casting \ #\"))))(Secondary((id \ @@ -912,14 +1556,10 @@ let startup : PersistentData.t = d855252f-8692-4697-914e-bd3bbf08b9b3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - a81f21c3-014d-4bee-aad3-22111d271eb1)(label(\";\"))(mold((out \ + f00ba289-17f8-4581-8899-3b6429f52b5d)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 55806e21-f6f8-4166-a40d-abf7fca387af)(content(Whitespace\" \ - \"))))(Secondary((id \ - 15b1047a-5e4d-4bc7-9aac-664b010b219d)(content(Comment \ - #ERR#))))(Secondary((id \ e2b286b8-a540-40c8-95d7-e3b7561c2be5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 607644e8-6ef9-44eb-9851-09f6a87dbc82)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ @@ -6460,8 +7100,7 @@ let startup : PersistentData.t = 40618bbb-cda3-483f-9799-f66777e8fec2)(content(Whitespace\" \ \"))))(Secondary((id \ 94f5a2c3-7ba6-40dc-9242-ed582dea46ac)(content(Whitespace\" \ - \")))))((Grout((id \ - 81bb6c1b-2172-4115-971f-d156eccb7acb)(shape \ + \"))))(Grout((id 81bb6c1b-2172-4115-971f-d156eccb7acb)(shape \ Convex))))))(ancestors())))(caret Outer)(projectors()))"; backup_text = "# Internal Regression Tests: Function literal casting #\n\ @@ -6475,7 +7114,7 @@ let startup : PersistentData.t = let f: = fun b: Bool -> b && true in f(true);\n\ let f: -> = fun b -> b && true in f(true);\n\ let f: -> = fun b: -> b && true in f(true);\n\ - let f: -> = fun b: Bool -> b && true in f(true); #ERR#\n\ + let f: -> = fun b: Bool -> b && true in f(true);\n\ let f: Bool -> = fun b -> b && true in f(true);\n\ let f: Bool -> = fun b: -> b && true in f(true);\n\ let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ @@ -6546,7 +7185,7 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ 89e33248-1bc7-474b-8cc1-52f14e3e707a)(content(Comment\"# \ Internal Regression Tests: ADT Statics #\"))))(Secondary((id \ 454449e8-3659-42c5-a25e-6d1d6155d5a0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -6564,22 +7203,16 @@ let startup : PersistentData.t = e4e6500c-a7a7-488c-a2ab-6457b37c07a4)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - eb7a40e6-c374-4b1e-8635-73f7e9638420)(shape \ + 2))(children(((Secondary((id \ + b051cd5a-8265-40be-9ea0-df8f23a86856)(content(Whitespace\" \ + \"))))(Grout((id eb7a40e6-c374-4b1e-8635-73f7e9638420)(shape \ Convex)))(Secondary((id \ a4c96856-06b0-4f22-94ad-c1a12aa21acd)(content(Whitespace\" \ - \"))))(Secondary((id \ - c46a43b1-f059-4cff-8b93-98d6a088ebe1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3c8d1cd2-d58b-4c90-9bda-6819b71f5993)(content(Whitespace\" \ - \")))))((Grout((id \ - 2a226a3d-e11a-4751-9bda-80c03315b18d)(shape \ + \")))))((Secondary((id \ + 63bcba84-a27d-46b3-8c65-575af3b55211)(content(Whitespace\" \ + \"))))(Grout((id 2a226a3d-e11a-4751-9bda-80c03315b18d)(shape \ Convex)))(Secondary((id \ d110a090-41b4-438b-85a9-980720f1b566)(content(Whitespace\" \ - \"))))(Secondary((id \ - 40133c92-2461-4b2e-8d6e-1a466021540f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0cce4077-2709-4f68-8c87-e596ef4f1107)(content(Whitespace\" \ \")))))))))(Secondary((id \ 8d281563-ca03-4ef5-82c7-ef46c0ccdb6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ a5af0ca8-4063-4a44-b68b-b0c0e00bd328)(label(type = \ @@ -6705,22 +7338,17 @@ let startup : PersistentData.t = Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ 99606fb6-88d6-4fc5-870f-6a5850d37eb0)(shape \ - Convex)))(Secondary((id \ - 93e4ed49-b2b1-48be-98bb-970f18cd4945)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Convex))))))))(Secondary((id \ 4f336c71-34f8-40c8-b567-8d6ef36ea809)(content(Whitespace\" \ \"))))(Tile((id \ 708d6f03-55cb-464b-b88e-e0a8150fe1d6)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7efc08c0-8655-4d19-8ef5-a13798e574c2)(shape \ + Typ))))))(shards(0))(children())))(Secondary((id \ + aeef33aa-96ee-4d0f-bfbf-825cb1935157)(content(Whitespace\" \ + \"))))(Grout((id 7efc08c0-8655-4d19-8ef5-a13798e574c2)(shape \ Convex)))(Secondary((id \ 4543b862-6cd4-4844-bed6-f2e3c09d42c4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 48deb597-0118-4b24-925e-9d5866b39d9f)(content(Whitespace\" \ - \"))))(Secondary((id \ - bdb8e8b5-e361-4b88-8d90-784217577a2e)(content(Whitespace\" \ \")))))))))(Secondary((id \ 96f6afab-3951-4eff-a4a3-a2bfe653f246)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 133867b0-6488-4d53-8a3e-eac9ea123c3a)(label(type = \ @@ -6829,14 +7457,11 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ f8b520c6-f264-4076-9649-17a864a4b86f)(content(Whitespace\" \ - \")))))((Grout((id \ - 8a941955-fd4c-4e66-b139-0474d6d02d66)(shape \ + \")))))((Secondary((id \ + 18019111-20f2-4478-ac3e-184d498baa90)(content(Whitespace\" \ + \"))))(Grout((id 8a941955-fd4c-4e66-b139-0474d6d02d66)(shape \ Convex)))(Secondary((id \ df256ea3-7ffe-4af3-8e07-436da632b54e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5b85bc2c-b39c-4766-8c73-86e61c131d5c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 276c4b02-c984-4019-a43c-0fb22e42c460)(content(Whitespace\" \ \")))))))))(Secondary((id \ 4e52dd2a-a324-4b26-92b5-cb43d228c19f)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -6857,22 +7482,16 @@ let startup : PersistentData.t = d78cad4b-9cb1-4187-a2b4-3daf04450c52)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 4fe172c4-68be-4570-8516-1cba23643c8d)(shape \ - Convex)))(Secondary((id \ - 67439ffa-f8c4-47fe-b519-e4e2170b0ba8)(content(Whitespace\" \ - \"))))(Secondary((id \ - bc09892d-51f0-4c7b-a25d-a1f8d346376d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Exp))))))(shards(0))(children())))(Secondary((id \ + aaa31511-4997-4f57-a00a-99af63c3232a)(content(Whitespace\" \ + \"))))(Grout((id 4fe172c4-68be-4570-8516-1cba23643c8d)(shape \ + Convex))))))))(Secondary((id \ d315fa5f-9cf2-4a6d-9493-f0de67fedb89)(content(Whitespace\" \ - \")))))((Grout((id \ - 44bb8352-d0bf-4933-bac3-d227bae5dec7)(shape \ + \")))))((Secondary((id \ + 524646d5-63ba-4ee8-bd04-58dc3f03993b)(content(Whitespace\" \ + \"))))(Grout((id 44bb8352-d0bf-4933-bac3-d227bae5dec7)(shape \ Convex)))(Secondary((id \ - 84ea582b-1547-4d08-b776-ac84dcb6786f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 25a50e72-913a-48a7-a298-7d19a54ff746)(content(Whitespace\" \ - \"))))(Secondary((id \ - a9e30a2c-3899-4977-8467-0cdff6a05dcc)(content(Whitespace\" \ + 04ab24da-9785-4a74-9f0a-027cab3c0579)(content(Whitespace\" \ \")))))))))(Secondary((id \ fc5706bb-edcd-4bc8-9618-4fdca8c7377d)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -6882,14 +7501,11 @@ let startup : PersistentData.t = 92eb8b7a-cae8-4111-be52-6530b229a36f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - e2a03ab3-180b-4d31-9278-cbe499404aed)(shape \ + 2))(children(((Secondary((id \ + 638612b7-e75b-434f-9dd7-52e6f4afa84f)(content(Whitespace\" \ + \"))))(Grout((id e2a03ab3-180b-4d31-9278-cbe499404aed)(shape \ Convex)))(Secondary((id \ be085a86-4c10-429a-9172-df2d77c0f85c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1e0ee740-e633-4246-a7a4-9f4a5d2b3a76)(content(Whitespace\" \ - \"))))(Secondary((id \ - 10dc8f28-f0f9-407b-94d6-b6327a6ad407)(content(Whitespace\" \ \")))))((Secondary((id \ 3d2eaf9e-22e8-428d-8670-36e50d66d2fc)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6945,14 +7561,11 @@ let startup : PersistentData.t = Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ 436efcc2-d901-4cc8-88b6-2528b5df5c9c)(content(Whitespace\" \ - \")))))((Grout((id \ - 4e7f6907-2a35-4077-ae80-a4097862ca2e)(shape \ + \")))))((Secondary((id \ + 6498302c-6a53-4ea8-ae45-a3def6ce9f93)(content(Whitespace\" \ + \"))))(Grout((id 4e7f6907-2a35-4077-ae80-a4097862ca2e)(shape \ Convex)))(Secondary((id \ 1494fed6-37ff-43dd-b1d1-b4afba3d8c46)(content(Whitespace\" \ - \"))))(Secondary((id \ - 036ce76f-9c9c-4aaa-a8c8-6064a15cc4b1)(content(Whitespace\" \ - \"))))(Secondary((id \ - d43d8b3d-9311-427f-8613-830da33b4a91)(content(Whitespace\" \ \")))))))))(Secondary((id \ 6a8bf3d1-33f7-49c4-b75f-3aea2421be31)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -8682,18 +9295,18 @@ let startup : PersistentData.t = folks\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2e1afed6-18e2-4976-8197-f9e384a1035f)(content(Whitespace\"\\226\\143\\142\")))))()))(ancestors())))(caret \ + 2e1afed6-18e2-4976-8197-f9e384a1035f)(content(Whitespace\"\\226\\143\\142\")))))))(ancestors())))(caret \ Outer)(projectors()))"; backup_text = "# Internal Regression Tests: ADT Statics #\n\ # All commented lines should show errors as described #\n\ # No other lines should show errors #\n\n\ #type definitions: no errors#\n\ - type = in\n\ + type = in\n\ type SingleNull = +One in\n\ type Single = +F(Int) in\n\ type GoodSum = A + B + C(Int) in\n\ - type Partial = Ok( ) + in\n\ + type Partial = Ok( ) + in\n\ type DoubleAlias = GoodSum in\n\ type VerticalLeading =\n\ + A\n\ @@ -8701,11 +9314,11 @@ let startup : PersistentData.t = + C(Bool->Bool) \n\ in\n\n\ #incorrect or incomplete type definitions#\n\ - type badTypeName = in #err: invalid type name#\n\ - type ( , ) = in #err: invalid type name#\n\ - type = badTypeToken in #err: invalid type token#\n\ + type badTypeName = in #err: invalid type name#\n\ + type ( , ) = in #err: invalid type name#\n\ + type = badTypeToken in #err: invalid type token#\n\ type NotASum = NotInSum(Bool) in #err: cons not in sum#\n\ - type Bool = in #err: shadows base type#\n\ + type Bool = in #err: shadows base type#\n\ type Dupes =\n\ + Guy(Bool) #no err#\n\ + Guy(Int) #err: already used#\n\ @@ -8771,2591 +9384,3085 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack(((focus Left)(content((Tile((id \ - 898b788a-c202-4dc7-8fcc-959dbce9343b)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 6ffe6741-0e0e-4ae2-a2a3-762c2988802a)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 6ffe6741-0e0e-4ae2-a2a3-762c2988802a)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort \ - Exp))))))(shards(2))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - a66c1ccf-c466-48f4-9b53-05d4cd2ff858)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(2))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - a7fd7b96-5b73-44b3-a101-25bbde636a82)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 22218377-66ea-4ccd-9406-d795632e050a)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 8458cc3d-0e55-4dff-a802-45cdbd6c6e6e)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 8da75dab-1cc6-440f-ae07-aba613afdcd1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 5a12865f-f5c5-4621-9a3a-20c96223f51f)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(2))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 3048eb54-6471-46c7-a6c6-f94ea21eecae)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - d605557b-9181-4c6f-8273-b97adebada28)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 57bdd0c1-98d8-45a3-91fa-5ff836b7f467)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - ef4ed478-6ed6-4fdd-9b7f-9f5490c2cb1d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 29381834-acff-4a2b-92ba-82d72e6e36c7)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(2))(children())))))(mode \ - Normal))))(relatives((siblings(((Secondary((id \ - 433ed036-e591-4228-b54c-c7dd6647f072)(content(Comment\"# \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ + 207fd4a9-6af2-4a30-98f9-178342ca5712)(content(Comment\"# \ Hazel Language Quick Reference #\"))))(Secondary((id \ - e51120cb-8511-4e2c-af4c-3942b941d515)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 04509f24-9365-4c3c-b5fa-2a692987a6ce)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 672f7be1-efb5-4c0b-9c94-4f02bb3b1232)(content(Comment\"# \ + f7b5c9a7-d81b-4d71-994b-4a4b447534c0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e372f3c8-a924-49f3-b30f-a8d2312040d0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c07bd6c8-7aa0-4235-96ff-a4d7b987e158)(content(Comment\"# \ Empty holes stand for missing expressions, patterns, or types \ #\"))))(Secondary((id \ - c268deee-e3f1-45ab-a9e0-63b2ae08fdd1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ff42b6af-8d49-4885-9387-c4ce1b5a662b)(label(let = \ + 30705f80-1b48-4bd1-b3c2-d8f5e456072a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f9948af7-8baa-4f75-b350-de13c33e10a2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8e57f5eb-89a2-413a-a74c-9330c606fe0d)(content(Whitespace\" \ + 98f9a2f5-85c4-44af-8c3d-54e891626ca8)(content(Whitespace\" \ \"))))(Tile((id \ - 875b779a-80cb-466a-a09c-04a8fcea72f1)(label(empty_hole))(mold((out \ + 60662333-8427-4791-85fe-42be81709674)(label(empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 75b922c7-e22b-44b9-81c2-cd9aaf8d370d)(content(Whitespace\" \ - \")))))((Grout((id \ - b87ec030-b871-437e-ba8e-dd401bc11f70)(shape \ + 39c2be21-a236-4d01-983a-30b2629f4904)(content(Whitespace\" \ + \")))))((Secondary((id \ + 57f695f6-8ed7-48ca-a660-3fe9609f5168)(content(Whitespace\" \ + \"))))(Grout((id 5d80b65d-6fba-4664-b5d8-1d0bdbad04e5)(shape \ Convex)))(Secondary((id \ - 58f13e4e-bc7e-4e8e-b839-911ae17d8cb4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 811bb7ce-0fa6-4519-a75a-d4aebab2abb3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 26ff6edd-cb84-4e67-84bf-dce183f9200c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8b6b8a6f-b8e7-484f-b150-85d8b0995723)(content(Whitespace\" \ + 2712e2d5-6c20-4dc5-add9-807f1cfd21b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 06999021-63eb-4da4-991b-d369dcd1dcce)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 24b5790b-eaf0-4559-baf8-78758bef73e9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8727ce3f-144b-4dde-8066-95baf94eeb36)(content(Comment\"# \ + 1e7dcb71-43b7-4c48-a47e-689b5cf3bc6d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c1ba26c7-fa67-4d0f-8af5-845b393a1d01)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5e0cb0fe-7ca1-4a51-b1bb-0adeb619b595)(content(Comment\"# \ Integers #\"))))(Secondary((id \ - c8fb4645-bbb6-4652-9ca5-c8529b4d02b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 83356035-9b83-4d29-bca8-0508f099d2b4)(label(let = \ + e3ab45c2-677e-4bd1-a3ce-4a6d8ca497bd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9396ec12-ef33-4f02-81ca-5c575df7966b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f208f506-1492-4eaa-bf14-f1525e7705a4)(content(Whitespace\" \ + 1cb2441a-e677-4286-9422-ff0b2f3fdfeb)(content(Whitespace\" \ \"))))(Tile((id \ - b10602fa-2c8f-4eeb-a028-e84cd14cb0bc)(label(int_lits))(mold((out \ + 8bc2b18f-4681-49dd-acb9-fdbd94292a4c)(label(int_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0029d694-7da9-43b3-b762-f804c12fa811)(content(Whitespace\" \ + a52a9fcd-a9ce-4a1c-a94b-087717254c99)(content(Whitespace\" \ \"))))(Tile((id \ - 04601fce-402d-4a7f-aad3-7176e9749c83)(label(:))(mold((out \ + 420b868b-9936-4f98-9e8c-a89830ef1f2c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b5ea460e-e499-4317-94cb-652f69d369ca)(content(Whitespace\" \ + 34a762f3-be6c-4a53-8a63-7ccca601cba3)(content(Whitespace\" \ \"))))(Tile((id \ - ac6d47c8-c81a-4e0f-8cf2-07e14cf51dce)(label(Int))(mold((out \ + f1ea8a48-ea29-4fcf-b00c-f318453c2413)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1136bc98-faac-4183-b90c-e7a175391952)(content(Whitespace\" \ + 44be4ae5-db37-4561-86c4-a906dceed0ac)(content(Whitespace\" \ \")))))((Secondary((id \ - 2bf20b15-a0f9-4aa2-b59e-193259a2589f)(content(Whitespace\" \ + 76831265-2bd2-44ae-92ac-b00b22c3ed81)(content(Whitespace\" \ \"))))(Tile((id \ - 275693c3-786f-4e83-94a9-e7b9d8e163fc)(label(1))(mold((out \ + 82ccf1fd-40a4-427d-b7d1-f13eb124edf5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4adae436-255a-42d3-b9d6-2479b89dd52d)(content(Whitespace\" \ + 208958e8-8677-4bce-842f-201880b359fe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f75afd68-deed-4bb2-8e2a-eb6f11d87b88)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f1c3ff8a-c7bc-4480-afb5-0af8c19a8ef7)(label(let = \ + cb0e7d7c-e2cb-40d5-bd38-3ae797539b76)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8b7c80aa-a3e2-4560-be6b-c833c729a696)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 66b2ace6-70e8-4fdd-8a05-1950e4722067)(content(Whitespace\" \ + 7e1ca287-c772-4db4-80e1-819783d1776e)(content(Whitespace\" \ \"))))(Tile((id \ - fc23708d-b76a-4ae6-8f2d-5f03a10e3356)(label(negation))(mold((out \ + 2d09a43a-71a9-4977-b140-d2eb2dad6bf7)(label(negation))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 54d00367-7e9e-41a5-b6e9-c2123ea7b244)(content(Whitespace\" \ + 7894176b-e88f-461d-9d93-e90f0ebbb004)(content(Whitespace\" \ \")))))((Secondary((id \ - 0a77d34c-ae6f-46c6-a303-37b594a2c5e5)(content(Whitespace\" \ + 66d9ebb4-5273-4047-95bf-f648210ebd2e)(content(Whitespace\" \ \"))))(Tile((id \ - 199cdd07-3d07-499a-805d-0c431b07d58c)(label(-))(mold((out \ + 349d921a-d249-425d-ba30-2fad5d571420)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ - b0274edc-f0ff-43ae-a99e-9fd2997a010a)(label(1))(mold((out \ + beecf9e7-12b7-4aeb-b573-4f17d4929b0e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b42449af-253b-48f3-baf3-0cf367ed9189)(content(Whitespace\" \ + ccdeca29-9665-4fe7-9478-8bac111d093d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 40f4f9c6-30da-4623-8601-b5cf1f761487)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ee95c383-46c1-4c87-a3bc-9a54f0ba092e)(label(let = \ + 1a638419-a6d5-4e20-9ef5-3f84c3e5e393)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 155f4090-d116-47a1-b89e-4d6ea129c555)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 13787692-012e-4b9e-9d9d-d959d56b2a10)(content(Whitespace\" \ + 5e1f3677-1dca-431b-aca0-17d6fea58f1f)(content(Whitespace\" \ \"))))(Tile((id \ - c8c3c627-3f2c-4532-b91e-086f515bab72)(label(arithmetic))(mold((out \ + 6991d998-2f87-445e-a1c1-0a0215731cbb)(label(arithmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b0d02aec-764d-4713-af29-a2aab56399a7)(content(Whitespace\" \ + 13cae4d5-4d15-446d-b4b5-3d8e670405da)(content(Whitespace\" \ \")))))((Secondary((id \ - 65486a18-42de-4dae-99d6-65121e14e01b)(content(Whitespace\" \ + ed25c10f-4dfe-48c9-a365-e43bc2cab313)(content(Whitespace\" \ \"))))(Tile((id \ - fa38abfd-d749-4ddb-9dea-9d5f53d73a98)(label(1))(mold((out \ + 7a11856b-615d-4930-baeb-a7cc6f6c1827)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 35bfbf1a-e97b-448a-a198-e9f3d6c53ce5)(label(*))(mold((out \ + 66b5a5f0-56a5-4929-bcb6-7e174c6f449a)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 17cdc469-91e0-48f4-93f8-f50a7434d999)(label(2))(mold((out \ + 849fd467-325b-43a5-9801-a94dc1c1e34a)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7469e0fc-7224-406f-85af-e09f4a28448b)(content(Whitespace\" \ + c02998a8-b8a3-45f5-a21c-99d582030c1e)(content(Whitespace\" \ \"))))(Tile((id \ - 1fb5c27f-2e08-4271-9a2b-9990c2ce9a23)(label(+))(mold((out \ + 55dc2548-7322-4151-b170-4b422770f6fb)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 61a1886b-3286-47de-acb3-e689a1a06e37)(content(Whitespace\" \ + 4af04b41-15d5-440c-853f-f6b3736277bc)(content(Whitespace\" \ \"))))(Tile((id \ - d03e6dc5-c789-462f-a5c3-47d2d35d11cc)(label(8))(mold((out \ + 9955a9c0-1797-4bb2-9376-634ca43fa473)(label(8))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 905dc43d-9e3a-4ad4-aeb0-efa6f60313c0)(label(/))(mold((out \ + 73f1e0de-00bd-4b18-88da-b8ce1bacc240)(label(/))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - fcb2741f-5893-46d1-a65f-1a454f54dcda)(label(4))(mold((out \ + 5703df85-29fa-40a8-95df-a7b64cc78f6f)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4f2c84ef-7b33-4e92-b034-ad01cd973a40)(content(Whitespace\" \ + d4d14a4a-8335-4909-8c28-85dcbcd2d370)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a6720e8e-b080-4fcf-9cc9-7837b356bc4e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 29381834-acff-4a2b-92ba-82d72e6e36c7)(label(let = \ + c6feb110-e1bb-466b-a557-533434561ceb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b72beb29-607d-4ab8-b628-8edf406791ad)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 82ae415e-3d57-4d12-8600-9e3f0b557551)(content(Whitespace\" \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + f3d270bf-10a7-49ca-b07c-7b0a46cdf028)(content(Whitespace\" \ \"))))(Tile((id \ - b9d51b59-e926-47ba-96d0-73a12a096bc0)(label(int_comparison))(mold((out \ + 5c825d3c-e03a-4f9c-8882-abf26c0eb2c0)(label(int_comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1e94576d-6751-4c38-904d-9908edf249ac)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a1b7211c-bb1b-433d-8426-218741fd8a60)(content(Whitespace\" \ + e0572717-5492-4b74-a9c4-8ba9a8c593c3)(content(Whitespace\" \ + \")))))((Secondary((id \ + b93f88b5-8331-408b-b637-db279c0a0c77)(content(Whitespace\" \ \"))))(Tile((id \ - ef4ed478-6ed6-4fdd-9b7f-9f5490c2cb1d)(label(\"(\"\")\"))(mold((out \ + 62032269-5f26-4c5f-a414-1892878fb641)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a780e3c1-39dc-405f-b6ee-e9262d05cfe0)(label(10))(mold((out \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 89b48472-52f6-4292-af98-4a3ad706cb47)(label(10))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 794cb259-80d6-4577-85f4-6a52a0071455)(content(Whitespace\" \ + 339fa799-7728-4eff-9255-75e750a1d340)(content(Whitespace\" \ \"))))(Tile((id \ - b7200d81-8b51-42b5-9f64-e88201589b83)(label(==))(mold((out \ + 4d8ebcab-2ca3-41d7-aee1-09a0a77f05fd)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8194682b-e336-47c4-9f5d-b346147297ef)(content(Whitespace\" \ + 229b1f48-0eef-43cc-8121-3e6803ccf0f4)(content(Whitespace\" \ \"))))(Tile((id \ - 46bc82ae-6ab2-4089-a062-277c19068f94)(label(10))(mold((out \ + 8dfdc2ea-f476-4559-825d-ef3d9315643e)(label(10))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - db841846-34f3-4af6-a9d9-36f0a44a46e3)(label(,))(mold((out \ + 4d9ed71a-30cf-4fd4-a641-323d02b39b0a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8393cc22-17aa-4fc2-8448-80339950b9a8)(content(Whitespace\" \ + fc07f2a7-cbfb-426d-ae9b-a899e37349f2)(content(Whitespace\" \ \"))))(Tile((id \ - e03ae39e-baf1-4f25-9f74-e9027bc1d3e1)(label(1))(mold((out \ + 07f8480b-eb5b-4e06-b330-5391ffadbbb0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79aa4d47-b783-4664-ae48-953405c77ec4)(content(Whitespace\" \ + a81877f1-0706-4355-a2be-f73a8ae35c5c)(content(Whitespace\" \ \"))))(Tile((id \ - 01d23b60-d11d-4d16-a2b4-d9e6f46052c4)(label(<))(mold((out \ + 8baa9216-b73c-462b-97c0-e007b640c29b)(label(<))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 997d8106-5288-4472-9cf2-948769f01bad)(content(Whitespace\" \ + b9c2dc9c-2b5b-4dea-84b4-5aacba1f2e13)(content(Whitespace\" \ \"))))(Tile((id \ - e26c0c74-6580-405c-816c-51fb2e0a9f28)(label(2))(mold((out \ + ceb42690-8b9d-4657-acf1-808342625dcc)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 47694204-8c2c-4219-a7d8-ac128cc06530)(label(,))(mold((out \ + 39560303-1b8b-4b84-b793-8058db5d5267)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ff4fa465-8b82-4d32-859e-445e90402bcc)(content(Whitespace\" \ + 91151128-546c-4d8e-8436-3030e43bb956)(content(Whitespace\" \ \"))))(Tile((id \ - 09bd34cb-70a8-435d-b717-26c0c59ef309)(label(2))(mold((out \ + 5f959316-ad9e-4156-a5d1-e8992191d24d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bea2d1fa-e34c-4056-94dd-f6e58a885c63)(content(Whitespace\" \ + 593aedf0-8172-43d8-8f93-e4d99854451c)(content(Whitespace\" \ \"))))(Tile((id \ - 650cacb8-4c53-41b7-b2d9-809b0be74ddb)(label(<=))(mold((out \ + f0b044bc-8011-41e9-bf5e-5a1b5661d318)(label(<=))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 41ce072b-6a81-431b-948a-77b41e92923a)(content(Whitespace\" \ + 80ab1291-e199-4ba7-b299-d2cb2ed0e10d)(content(Whitespace\" \ \"))))(Tile((id \ - 5374fda9-14e1-4f9c-9088-6328b20ecb9c)(label(3))(mold((out \ + 72800a85-0bcd-4b90-a961-417e409ff1e4)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4a0ff8d7-801f-40f5-ba92-5042088e0a97)(label(,))(mold((out \ + 69339a67-19c5-486c-adbd-75d12fd7dc3c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4518b00a-4f5d-41aa-8470-79eb17962b98)(content(Whitespace\" \ + 67043910-c17d-4c1b-bda7-04cbc416a535)(content(Whitespace\" \ \"))))(Tile((id \ - faeaf83c-dda9-470e-b921-5f2b45ca1f4f)(label(3))(mold((out \ + 83291e0a-1a7a-4985-89cd-c5f1d7eed6a6)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ba798bf4-6dbd-4aea-9485-7d51dbdf5f42)(content(Whitespace\" \ + dca85870-9dee-45a4-bc20-6756d84a8b14)(content(Whitespace\" \ \"))))(Tile((id \ - 57bdd0c1-98d8-45a3-91fa-5ff836b7f467)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 404e4cf0-b880-4dce-b932-1d2d13679d07)(shape \ - Concave)))(Tile((id \ - 0ae58bec-8c52-4d1b-acc6-05b9d94bd702)(label(2))(mold((out \ + d6a8e149-d3e5-4f16-a175-3a5528444584)(label(>))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 7596fa7a-ffd1-426e-9d45-b1b637e7fba6)(content(Whitespace\" \ + \"))))(Tile((id \ + 051d35b5-02b3-4e04-8d92-71ddce4b3dea)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 08fd2bce-e1f9-4906-ac9d-aa43992fae22)(label(,))(mold((out \ + 79f2d6e4-dfc1-422d-9c82-7f75d844d0a4)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 27238b37-7527-4bdf-8852-3c74f462fb16)(content(Whitespace\" \ + f2b4d97d-c628-4691-969c-0c8955bc693b)(content(Whitespace\" \ \"))))(Tile((id \ - 31f34141-2a87-4068-8c28-356f0b85d94a)(label(2))(mold((out \ + 7c1e2a57-7df7-470b-87ba-a7c55a839f85)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b5b941fa-6336-4f3d-bf5a-9b0dda51cb2c)(content(Whitespace\" \ + 85e42d8d-c6a0-4018-be01-b3bf1d1a4659)(content(Whitespace\" \ \"))))(Tile((id \ - d605557b-9181-4c6f-8273-b97adebada28)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Tile((id \ - d139fefb-0d6f-4830-96c3-3f5ee289340d)(label(=))(mold((out \ - Any)(in_())(nibs(((shape(Concave 0))(sort \ - Any))((shape(Concave 0))(sort \ - Any))))))(shards(0))(children())))(Secondary((id \ - ea69af8e-ba13-4a3b-bf27-7574fa40475f)(content(Whitespace\" \ + 55adba71-6687-4bc5-b9a0-74384e635fcb)(label(>=))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + ca61a6b5-f37c-4ebb-b0da-bf157456d368)(content(Whitespace\" \ \"))))(Tile((id \ - cef8b3a4-6494-4d17-a21a-3a59f85ed879)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3048eb54-6471-46c7-a6c6-f94ea21eecae)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - f179b161-129a-44d8-ba73-ca8bdcd93744)(shape \ - Concave)))(Tile((id \ - c8ec443c-29f4-4a19-9626-42750b1e4e8c)(label(in))(mold((out \ + 5953648a-b797-49a9-9f08-886a517667b8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cc567019-7762-496e-b5d3-e3f6259c9629)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bbf8c4e7-06d9-485f-9f78-3122a681f499)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5916089c-270d-4ac6-81d1-7c9ccb1a0899)(content(Comment\"# \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 79ffdf93-f09c-4a06-ab35-168ae341c602)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 3117c02e-5fc3-4d7a-8101-e19ecf28ff22)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d9edc580-dc69-46d2-ad32-ffef5beb985a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7f9b37b5-20cd-460b-8d98-4ebdd86416f5)(content(Comment\"# \ Floating Point Numbers #\"))))(Secondary((id \ - 6f60225c-b43a-4c35-a23f-61b581e50e5d)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ - c0b14999-3dae-4754-a481-5473c3a472d6)(shape \ - Concave)))(Tile((id \ - 377de96b-722c-4c35-999b-5149c41c2956)(label(let = \ + b8b571cb-8cb0-4b07-ad12-efc8d6a515b3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8a82322c-eb18-49dd-a09b-ce211550c7fe)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e4a329c5-124a-459d-8b71-5cda87cf29dc)(content(Whitespace\" \ + 575fca78-61a8-4940-8d1e-1b414cce6ad9)(content(Whitespace\" \ \"))))(Tile((id \ - e85892af-9f7f-4618-883c-2a9980fd209c)(label(float_lits))(mold((out \ + 5ba4428b-1aa2-4fb0-875e-6a0536db6478)(label(float_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6d5460ff-090c-4d5a-a354-090c9a930344)(content(Whitespace\" \ + e356f959-c5ea-48ca-9e41-46ef9a5f721d)(content(Whitespace\" \ \"))))(Tile((id \ - 8fa0e8c0-df90-4cc4-aa29-523211f1e558)(label(:))(mold((out \ + 2571ad04-0bb4-486d-afb9-2016124fa962)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1958eec1-ad7e-46b6-8276-aad0a98a3064)(content(Whitespace\" \ + 117ff930-ee1d-4b34-a8bb-7784b7b0052d)(content(Whitespace\" \ \"))))(Tile((id \ - e5158f04-299b-4025-820a-06e58dbae884)(label(Float))(mold((out \ + 7f694343-b027-4331-8fe7-78c81436948b)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b82c1490-4d85-4477-a0c3-d6a7e3f58818)(content(Whitespace\" \ + 84f88e27-4c61-4e92-a9de-bd5828cc21fc)(content(Whitespace\" \ \")))))((Secondary((id \ - 07c973e3-9323-4817-b5c0-32c83c1af4e3)(content(Whitespace\" \ + 737fc67a-ef7b-4859-a124-562c52237ed8)(content(Whitespace\" \ \"))))(Tile((id \ - 9759ef0f-1367-4de9-bbed-801eac329972)(label(1.5))(mold((out \ + 93faecd4-37f9-4579-b14d-662729192eaf)(label(1.5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 77fd4759-dcd2-4526-b1bb-099c0b07eac3)(content(Whitespace\" \ + adc9a045-ed56-4e32-ab87-b6a7064c3dd7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6c15f98c-d8d9-46b2-bb0a-6c94aec1712a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - eb6e3d68-1cc8-466e-b5bf-e5a547900367)(label(let = \ + 97c54af8-ebb3-4ea5-b498-48bf59d30785)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 76a6d873-c4c3-4d01-8cae-14808d2c0bec)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 23eed771-2bdc-47e8-ba4c-f91eedee96a2)(content(Whitespace\" \ + 600dfb53-ecb2-4b72-80fc-56dd9a18c4e3)(content(Whitespace\" \ \"))))(Tile((id \ - f654e4de-6907-4fd0-ae52-d846a0d7f798)(label(float_artih))(mold((out \ + f3f013b8-3208-48f1-8022-42c597f07659)(label(float_artih))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d8e65c25-a123-42cc-a293-31a5f4ee96d2)(content(Whitespace\" \ + f3c861e8-5f44-4fc7-b9f7-9dee56cc5a22)(content(Whitespace\" \ \")))))((Secondary((id \ - d402f9de-8b49-47af-85e3-3eeb1bb80d56)(content(Whitespace\" \ + 181ea8da-df0d-4fec-9506-692894194143)(content(Whitespace\" \ \"))))(Tile((id \ - 8c5dbc3a-bfb3-44d3-9375-6dbd898620a4)(label(1.))(mold((out \ + 3927100f-186d-4b2c-a8d8-fe70936e2d97)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9b08797d-14a8-43e3-aa86-04d985120e63)(content(Whitespace\" \ + 646c5843-2499-4e00-88c0-b43699459070)(content(Whitespace\" \ \"))))(Tile((id \ - a4c4cd0d-8b68-4c9f-89ab-7490985fad61)(label(*.))(mold((out \ + 2618e8d3-5e45-4724-a86e-dc152119d5b7)(label(*.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - de6c6712-b664-4c6d-9dc6-10c82ba3e942)(content(Whitespace\" \ + d45c6065-5325-4df2-80ab-56bff7b423f5)(content(Whitespace\" \ \"))))(Tile((id \ - 73109667-23bc-4083-b983-f800c5b3d538)(label(2.))(mold((out \ + 5a58bf54-18bd-4dab-bd92-c3c996240cc8)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 670b26a3-5a4a-49b9-8a46-f08049ca541a)(content(Whitespace\" \ + 4ec35692-99fd-40c3-aea8-5e2efc0b320d)(content(Whitespace\" \ \"))))(Tile((id \ - 95357573-b9ac-4e6a-bf24-0296baf56bb4)(label(+.))(mold((out \ + 6702d774-546e-45e5-bb45-c3204871e563)(label(+.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 64836d6e-594b-4cfd-b79d-2ccfb44ee0dc)(content(Whitespace\" \ + 081eca38-9b19-4ff7-b321-266707b62dac)(content(Whitespace\" \ \"))))(Tile((id \ - 2b2cab6a-33c3-4bee-9558-68e0f0c55740)(label(8.))(mold((out \ + f08cd29d-f4bd-4ade-9421-8beb111837be)(label(8.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a61f81fa-1af7-455b-8d28-7e2119a84bb9)(content(Whitespace\" \ + c0479a6c-b629-4342-a139-c3d3452c9c44)(content(Whitespace\" \ \"))))(Tile((id \ - f61530a7-88d2-4df8-9616-f97b4e1d82a9)(label(/.))(mold((out \ + cfbcda5d-fbd8-446e-8bdf-32a2e5997846)(label(/.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4c020dfc-9325-4cbe-9e15-957e085040fb)(content(Whitespace\" \ + 2097ebb1-efc4-485e-9364-537e37500537)(content(Whitespace\" \ \"))))(Tile((id \ - f69ec725-d3d1-4d97-831e-385937453c83)(label(4.))(mold((out \ + 78835537-fb05-4d1d-bc15-820f563ed950)(label(4.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9682543-70bd-4763-bd08-d0027301a6ca)(content(Whitespace\" \ + 51ad770c-0823-43e6-8bc6-593567d3c099)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dc46703c-dcb1-4cfb-bbd6-086df3ec33a3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5a12865f-f5c5-4621-9a3a-20c96223f51f)(label(let = \ + cabd7f96-ad32-496b-9c94-ecbb25e0e1f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5bb9c199-cf94-41e8-932e-d883acf18478)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 267e82fd-dea1-4fa1-bf5b-4b0bb0406429)(content(Whitespace\" \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d504e6d0-e6f0-48bf-b054-62f8ebdd889c)(content(Whitespace\" \ \"))))(Tile((id \ - 1f0ab83d-87a0-412a-adf9-6adcc23ce656)(label(float_comparison))(mold((out \ + d724f010-7866-49c7-a3e6-034a4c654e5c)(label(float_comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5a385a9b-b6e6-4f73-8241-3fd6c984c19a)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 56e28481-0378-4eb8-8d18-59c0d4ebd91f)(content(Whitespace\" \ + 9efc3aa5-881b-4d0b-a7dd-2f2a16338a57)(content(Whitespace\" \ + \")))))((Secondary((id \ + b0d9a10d-8c17-4c16-bc89-eab6a1c0eb6f)(content(Whitespace\" \ \"))))(Tile((id \ - 8da75dab-1cc6-440f-ae07-aba613afdcd1)(label(\"(\"\")\"))(mold((out \ + 73d8d368-1bd1-45e0-b17b-a7bc4949d025)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 528b6ce7-e33b-4530-b7d0-37b7748c1299)(label(10.))(mold((out \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + d9671cd2-042f-4f92-80fe-4c5c011ad4b5)(label(10.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 65bbe624-7653-443b-b058-61badfe32b28)(content(Whitespace\" \ + 6705d49c-4648-49ad-b563-a0bb1ea696e4)(content(Whitespace\" \ \"))))(Tile((id \ - 3172c5f9-6bf8-4fed-b0cd-c7e878d50b7a)(label(==.))(mold((out \ + ed6c0b59-04e9-4bfc-a8e8-b0a8a60b75d5)(label(==.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 27cd272f-8676-4b10-9964-b4203a6f928f)(label(10.))(mold((out \ + f58f0729-e53d-4649-8666-fd87478e43dc)(label(10.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 70c6bacf-b99c-4a8d-8f5d-ced464784d14)(label(,))(mold((out \ + 9a8c4484-5ab6-415d-9e50-073a1a8eeb20)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 32b09127-f7ae-4aea-ae25-8442e031a4b0)(content(Whitespace\" \ + 070f5b50-d292-4364-85d5-58f96489bf11)(content(Whitespace\" \ \"))))(Tile((id \ - e23c0966-fb27-4a57-af5d-0ba5a8c2989b)(label(1.))(mold((out \ + a33094f4-6992-4e5f-9519-2b0e6b90b4dc)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e107aade-855d-46de-87a0-28acf28f5e97)(content(Whitespace\" \ + 5dcec4c7-ebf4-4690-96f3-3232e69e162d)(content(Whitespace\" \ \"))))(Tile((id \ - aa0393d8-85ad-4276-baa7-9efe7821d017)(label(<.))(mold((out \ + a53011df-5e75-473d-91de-7a0bc970e104)(label(<.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 7a0beff9-bdcf-4f2b-a597-73da76344cf9)(label(2.))(mold((out \ + e8edb9c3-5e25-4660-9870-2cf347ca81e2)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e5453084-ecc5-425e-8c76-82868424105e)(label(,))(mold((out \ + 9bdf8254-6f8c-4260-add4-f47339d80d20)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 08b6d86f-342f-48f4-a826-35d9d8415120)(content(Whitespace\" \ + 0b62c353-f1a1-4a4f-b7d9-d0edc64c9989)(content(Whitespace\" \ \"))))(Tile((id \ - 113957e2-1a9d-4721-b31b-ccba82853d2e)(label(2.))(mold((out \ + ed828589-c83e-4521-93b5-2fdbdf55f279)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 82e4d1ec-23b0-4c67-a57a-8d08f3b80bbd)(content(Whitespace\" \ + 1adab2a7-9bd5-43dc-969c-837192ff91c6)(content(Whitespace\" \ \"))))(Tile((id \ - c04abf90-3d0e-43e1-8c8c-29d9f490ed60)(label(<=.))(mold((out \ + 5f4f47f8-10d8-4f98-89a5-b1bd7c436961)(label(<=.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - a36acb4b-da86-479e-9820-22c0334f9702)(label(3.))(mold((out \ + c66c3a22-c8e0-42ea-9aa9-5c0309e0213f)(label(3.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6855ab0e-bcb3-496d-96f2-27239449fbc7)(label(,))(mold((out \ + 4d034bbc-c1c6-424e-8a04-59f207733539)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 88fed412-4414-4cf2-90c5-a38301ec2be3)(content(Whitespace\" \ + 3d38fa3a-bd12-4ce3-9db8-254740581743)(content(Whitespace\" \ \"))))(Tile((id \ - a9103663-22a9-4258-b92b-65f29e914006)(label(3.))(mold((out \ + e9cacab9-a274-4ec7-8ee4-1bb6c80c236d)(label(3.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d1f6eff3-e74c-4f46-8856-c380fda5aa36)(content(Whitespace\" \ + e210338a-c6b7-4041-be33-3386dc9b3e43)(content(Whitespace\" \ \"))))(Tile((id \ - 8458cc3d-0e55-4dff-a802-45cdbd6c6e6e)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 389f0c83-e0f4-4f2b-8278-33dac519eb66)(shape \ - Concave)))(Tile((id \ - 12e88f32-cc51-4a24-9c15-d2ced511d002)(label(.2.))(mold((out \ - Any)(in_())(nibs(((shape Convex)(sort Any))((shape \ - Convex)(sort Any))))))(shards(0))(children())))(Tile((id \ - 93fe0ebb-0aae-46dc-9a1e-f023e7d08ac2)(label(,))(mold((out \ + 357ce2b1-81db-4771-9c08-bdded2aa5378)(label(>.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 9a445cb8-e779-4b68-8e54-7f0269af716e)(label(2.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3f59b02e-9d8a-4984-b045-68cda384337c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 48eda0b6-2b27-487e-9e73-c0ca148ef217)(content(Whitespace\" \ + ac889fef-9a95-41d5-8d78-0d107e02ea32)(content(Whitespace\" \ \"))))(Tile((id \ - fd192fed-a191-4849-9b64-796251d36d0e)(label(2.))(mold((out \ + 7d234fbd-f096-4072-80e5-5ffecf244310)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 970c7981-7c71-44ef-8f40-142a8c797d58)(content(Whitespace\" \ + 3fb62987-97dd-453b-87bc-3e39f9d6bf58)(content(Whitespace\" \ \"))))(Tile((id \ - 22218377-66ea-4ccd-9406-d795632e050a)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Tile((id \ - 821968b3-17ef-4498-9336-d4e977bdab8a)(label(=.))(mold((out \ - Any)(in_())(nibs(((shape(Concave 0))(sort \ - Any))((shape(Concave 0))(sort \ - Any))))))(shards(0))(children())))(Tile((id \ - 2de0c362-1707-4c7b-87d7-599ccc0496cc)(label(1.))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a7fd7b96-5b73-44b3-a101-25bbde636a82)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 2aca9b2e-e542-42b1-9e39-9ba3bbdfa8d9)(shape \ - Concave)))(Tile((id \ - bd15f267-77bf-4f4c-a8ea-6fa436e66847)(label(in))(mold((out \ + a6deb25b-d3d1-4adb-a661-75818fa41884)(label(>=.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + b8f0d4a6-9ddc-44ab-a8c6-0a4a78a26dcd)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8436d467-851d-42f8-b8ee-aa050f618310)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 84b201c5-103e-4e33-bb85-633b17a4c880)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 151b7650-6c85-4846-a800-fbc7d980cc8e)(content(Comment\"# \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + f5fb67a4-d077-4a8c-8697-52bef3b9460e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f6ba0272-b704-4d22-bacd-2ed1411d151c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c3e19fec-c0b6-4b21-b518-ad64802bd8ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cd93b804-a462-4830-92a0-4b5f37ac06d5)(content(Comment\"# \ Booleans #\"))))(Secondary((id \ - 2887c227-ace3-4f85-b176-f8e52ba20592)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ - 4c9d171f-3faf-491d-b5e8-9f8d4ecf65fa)(shape \ - Concave)))(Tile((id \ - 09c1881d-cbd2-4367-96d4-77fde64127d1)(label(let = \ + 1f5040d9-e38d-49e3-81f2-e256bbb18b45)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b48406f1-3c2f-4113-a39a-4204bf67aca3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fe0cfce3-caf7-4693-83ec-9db292815299)(content(Whitespace\" \ + 0f6f0103-b901-4fae-b8f7-469a45c82c66)(content(Whitespace\" \ \"))))(Tile((id \ - 8afc915a-e876-44e5-b0f0-7840f0d3e0b7)(label(booleans))(mold((out \ + b1de8c74-b715-49dc-ba63-4fc95afad59d)(label(booleans))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a67a18e4-6030-46bd-acc1-ed80f8f13541)(content(Whitespace\" \ + 6ba2e50a-0464-4516-8967-4abf76966724)(content(Whitespace\" \ \"))))(Tile((id \ - 8cd8f8b4-81f0-49f4-91bf-de2345fa0a04)(label(:))(mold((out \ + 7809611b-91f5-4364-8a3a-358bc5407bdf)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b5b4eeb0-fb0b-494d-a0ce-643f230c0768)(content(Whitespace\" \ + e27590c3-d05d-434d-8d00-ff628a7a34d7)(content(Whitespace\" \ \"))))(Tile((id \ - 7e948f7d-87f0-455e-b7ee-cb2cb53e01f6)(label(\"(\"\")\"))(mold((out \ + 5e643527-fc88-4463-8603-2e95a90b7c46)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4bd39432-df8e-4c7d-abab-b4e748b1c19e)(label(Bool))(mold((out \ + feae9349-01c6-4742-8475-1b8593067375)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ef7e376b-4953-4e3f-9c4e-61e216f97a5b)(label(,))(mold((out \ + 3802ecf1-32c7-4fb0-90c9-d9ccb647d155)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 81aeac30-b76b-47b5-93be-a5dc27304f25)(content(Whitespace\" \ + 42f8e183-44d4-4d8d-8d8c-40420f161183)(content(Whitespace\" \ \"))))(Tile((id \ - 640915d5-7681-4611-9515-c4e5fa2d6c88)(label(Bool))(mold((out \ + 3d4347dd-eebe-448d-a3d1-f8bfc130f041)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6cfb6507-38dc-46eb-b5fe-e5c8d9400260)(content(Whitespace\" \ + 1e12ec66-6154-4ba6-a2b3-b4f149ecede8)(content(Whitespace\" \ \")))))((Secondary((id \ - e8b47722-1855-4bc3-a3b1-7481e43cdeda)(content(Whitespace\" \ + a884d63e-96d4-4678-8770-fcb06d919141)(content(Whitespace\" \ \"))))(Tile((id \ - 40d1f2e7-7ed1-46ef-93f3-581dfc199810)(label(\"(\"\")\"))(mold((out \ + 415d1e4b-60f9-43aa-a585-27c6f49624b7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c0923bc8-3837-4eb5-836f-5bf094546519)(label(true))(mold((out \ + e6cff93e-fc15-449a-b216-139159a233c3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4df92425-6f7e-4a4e-af57-f60151d92036)(label(,))(mold((out \ + c9f58ea4-0a2b-4d67-9f44-151c3703eb71)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d838b12f-7989-45df-bbfb-a86b7dea8e3e)(content(Whitespace\" \ + 3e9d1f84-95e0-4518-9b15-4450debf05c1)(content(Whitespace\" \ \"))))(Tile((id \ - 7a1ef094-3a83-42f7-95ef-6c4201fbe4b9)(label(false))(mold((out \ + 1c11e54b-0c58-4cb8-aaa0-5677d267b4a0)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d7d4ac58-2c63-424e-909a-5644eb30a441)(content(Whitespace\" \ + 61ce52a6-905e-46e0-9e3e-7b6006b36d7e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 75da304c-210c-4a42-bd4e-153ab12501ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a66c1ccf-c466-48f4-9b53-05d4cd2ff858)(label(let = \ + 81230d83-e2b5-40e2-a10f-f84b08ca966d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 45fa29bf-e543-4a8f-9fc0-02f00a32a735)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 9b604cd5-9ec4-47e1-a509-1541cf6d4039)(content(Whitespace\" \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + bee77d49-534c-40cc-86b8-b9fcf848e880)(content(Whitespace\" \ \"))))(Tile((id \ - 13368a0f-c26f-4d0e-aef0-7625678ec8d0)(label(conditionals))(mold((out \ + d12e830b-5596-4231-b117-98c5cf748a76)(label(conditionals))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0ed77f9c-84ed-48fa-bbe0-bc44cd0f5b70)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 41263d1b-2fde-4456-8aad-d13e7bc33b88)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a912a7d4-01ee-42bd-8a65-75d6e5253841)(label(let = \ + b5034bd8-06ae-49b0-bf91-0d1e6c6bfd2e)(content(Whitespace\" \ + \")))))((Secondary((id \ + 6f063fd9-a397-4210-984f-3c97f840cce2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d2b0be8c-983b-4cc5-ae7e-a5c9802b06fd)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2bf459fa-1eee-4759-a6fa-e36230d3f3bb)(content(Whitespace\" \ + \"))))(Tile((id \ + 41c23690-2223-4b36-a495-b8e2e57b6472)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 40fb63cf-68c6-4475-b935-8b499621eb44)(content(Whitespace\" \ + b86589cb-a92d-4b5b-916c-62a85eaf77f3)(content(Whitespace\" \ \"))))(Tile((id \ - 917ab717-c546-44ca-a8d6-00a9b8d62a45)(label(\"(\"\")\"))(mold((out \ + b3eb0c6b-b36e-4d2e-91a7-69a3835e15b9)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - d685e96c-0a9f-426c-90e7-3e3555659ec6)(label(x))(mold((out \ + a052de75-c435-42a6-aa70-a06a05e4e311)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b86b565a-d2cb-49fc-8e82-97b2b72071a6)(label(,))(mold((out \ + 2c799359-7ef4-4cf4-b913-e2361a715399)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c7778866-7961-4003-b9d1-d95ec27f15de)(content(Whitespace\" \ + fa4a512b-49c2-44da-8f2f-3f1be55a3b82)(content(Whitespace\" \ \"))))(Tile((id \ - 64e5fc35-0813-4210-8f82-dc51f1a2bd90)(label(y))(mold((out \ + 549bbaa6-e7b7-4d62-b67c-5b0ee560aca2)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 7a7d8982-7f8d-4371-9cbb-1e5ca287d566)(content(Whitespace\" \ + 33c1c044-0607-4ff0-8e3d-62135d0aa3ac)(content(Whitespace\" \ \")))))((Secondary((id \ - 07b24910-c9bb-4a3f-bbe1-8db4aea8a39c)(content(Whitespace\" \ + c2792e37-4dbd-448a-8221-e051cb290248)(content(Whitespace\" \ \"))))(Tile((id \ - 50a354b7-52c3-4174-8319-03eee4c07ce9)(label(\"(\"\")\"))(mold((out \ + 44d0978d-44bd-4400-9be2-fb35bdee6f32)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - beccdc7c-5436-4621-922e-c75b99c55a41)(label(2))(mold((out \ + fcfbe372-52bb-45cd-bbb8-854c255ee13e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0a27ee91-fbeb-40cc-9e94-f4c6e98e4dca)(content(Whitespace\" \ + f255ebee-e082-4ccc-b2ea-103d4110c846)(content(Whitespace\" \ \"))))(Tile((id \ - d979f6fb-053e-4ee3-a03c-048a308f48fd)(label(+))(mold((out \ + 1b9a700b-6127-4091-9322-50665adab0c9)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a3346084-888f-4cbf-bca9-6270e7d2f16e)(content(Whitespace\" \ + 411beadf-83cc-4576-a7b3-c44c7b4f1f38)(content(Whitespace\" \ \"))))(Tile((id \ - 5cebcb2e-4265-4c2c-bf1e-ac31cb9e54f4)(label(2))(mold((out \ + 336191ee-e24d-4649-8922-5a0a7fdb67ab)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9b2854a9-a24c-405a-9bc9-b05d05fd3298)(label(,))(mold((out \ + d170162e-f657-48fd-9561-7e0955e61248)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7011bff8-2603-467e-a517-f27eb09b8a8d)(content(Whitespace\" \ + 7194054b-e2db-4792-be22-7ebf67f77cf9)(content(Whitespace\" \ \"))))(Tile((id \ - 58de9178-5636-4ac9-8dce-b4123ad78b90)(label(3))(mold((out \ + 26e0b293-31e0-4f99-8a63-3af46bb5ee8d)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cf903426-adfe-44db-bb23-6ea149122bda)(content(Whitespace\" \ + d17e5e6b-069c-49de-b586-9c9a6c3532a2)(content(Whitespace\" \ \"))))(Tile((id \ - 82e9e865-fec2-46b7-9b93-33a7fda691bf)(label(+))(mold((out \ + 610f12b6-1882-440b-b3a9-a0058d48b9a9)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 015c2401-deca-4686-962f-840c2f74d8eb)(content(Whitespace\" \ + ac107a39-1f65-4191-9c97-2e33df913b94)(content(Whitespace\" \ \"))))(Tile((id \ - 1338b42c-9103-4a58-8aa1-d165a5970df7)(label(3))(mold((out \ + ff9f4b9e-6026-4571-b100-0293c4fee1c6)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 1cd4bed7-b45c-4ecd-baa8-32cd51dcb403)(content(Whitespace\" \ + 7fc97137-63dc-424f-9497-9df76cda009c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 921fd058-077f-479d-ba81-9a1d2c01c80b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6ffe6741-0e0e-4ae2-a2a3-762c2988802a)(label(if then \ + ea72461c-41bd-49ce-8bb1-b2f604bc7d22)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 86e529f5-1a91-4ee6-85ca-80dd0b5e8cd9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9ee6768a-8c6e-4a94-8a4a-d1aa720e0d8a)(content(Whitespace\" \ + \"))))(Tile((id \ + 00be2224-1044-474f-8936-874e8f9edbaa)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 8a736b05-bc11-4c17-ae12-273c29911093)(content(Whitespace\" \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 4aa39e45-9b5f-4a55-b78c-8a993007f207)(content(Whitespace\" \ \"))))(Tile((id \ - 265fa614-2aec-42a9-9fef-de4195ec8acb)(label(y))(mold((out \ + 32725ca2-49a5-40b3-a164-dc0daec9ae5c)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 47602d04-beb5-46f8-81b3-e8d7810ba7a2)(content(Whitespace\" \ + c3638d4c-7539-4142-a4ab-976ea6d5efea)(content(Whitespace\" \ \"))))(Tile((id \ - 898b788a-c202-4dc7-8fcc-959dbce9343b)(label(@< >))(mold((out \ - Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - ea02d37f-04a0-4d38-9262-191860db22af)(shape \ - Concave)))(Tile((id \ - 0548b078-20b0-431c-8e08-07e4a557aeaf)(label(x))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Grout((id \ - c2b91165-b256-4bf7-9200-0d1b93e48b03)(shape \ - Concave)))(Tile((id \ - a595a078-9055-4a37-8387-5450ae0ddabe)(label(then))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Grout((id \ - 35ad5f98-ec69-4623-b3c1-b1823642baea)(shape \ - Concave)))(Tile((id \ - 69224cde-ed30-4773-b827-92c8844eae3c)(label(1))(mold((out \ + 19ba2476-15b5-4f78-aaac-b398b17f4d5f)(label(>))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 56fea472-4a27-427b-89f6-f9a9a40ab46b)(content(Whitespace\" \ + \"))))(Tile((id \ + fd550554-c1a0-4445-9790-e8e34924dcf9)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b840a3d2-aaae-4756-bc5d-944374d9ee3e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 29e21430-0e0b-48f0-ba7d-c51ee531f0be)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ - defb4ecf-a4f1-4b73-8d3d-bd86a05fbdda)(shape \ - Concave)))(Tile((id \ - 7879b775-7f1e-4577-b079-d27af4528736)(label(else))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Grout((id \ - 11ca8229-eb30-4b5a-ba5b-b903fce039d7)(shape \ - Concave)))(Tile((id \ - 46a95018-2e35-4ad7-92c6-5e20d74f07a4)(label(2))(mold((out \ + e63c41c0-699a-477a-a690-897e892da2f5)(content(Whitespace\" \ + \")))))((Secondary((id \ + 235139e7-3699-4fa1-b0df-2c6fb05bcde4)(content(Whitespace\" \ + \"))))(Tile((id \ + e617c8da-d400-4551-9368-d0bdfb90ae42)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2c4b02b0-d660-4061-b5f8-3e2fdf12953e)(content(Whitespace\" \ + 34b4d133-81eb-44f3-88de-4b965dc6c4b0)(content(Whitespace\" \ \"))))(Secondary((id \ - 89e13cc0-94fa-490f-b268-03f1cabd0fbe)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ - 88940fc2-27cd-42f4-8be6-be48fc2b85a6)(shape \ - Concave)))(Tile((id \ - 266056a1-043f-4c10-aa9b-3d961be28e82)(label(in))(mold((out \ + 470b277a-68be-4e5d-9c99-887422918e94)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 21fd4845-3e7d-4ed3-958b-0f404f93ea6b)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0b17f363-0ab1-499e-bfbe-ff46801b3254)(content(Whitespace\" \ + \"))))(Tile((id \ + 57f1cb75-cd8a-48ec-b49f-9224450a5afd)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5b4c65f3-117f-4e87-8217-141ce032af2e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ac53f921-8f9e-4c6f-819b-dca8b4aa4fbd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e2ee5411-4f85-4ba0-885d-621e48e60f2d)(content(Comment\"# \ + ba28a8d9-5dfd-4812-9d93-e93725bc9b58)(content(Whitespace\" \ + \"))))(Secondary((id \ + db3651a1-192b-4f0f-a00f-0804a2a96d84)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 91776b8d-c572-415e-a7d9-ab960196c253)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8ab702ff-78f0-4bff-aa19-af07c4cd8e72)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e05f5269-b993-4163-a926-ed0ccb553efc)(content(Comment\"# \ Tuples #\"))))(Secondary((id \ - b70baaa3-1ec6-4bbc-ae25-b4fbc89fb89f)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ - df3d1b61-b1c6-4c3d-9901-32db47722b35)(shape \ - Concave)))(Tile((id \ - b35d3961-578d-4e24-8872-49e182185cb3)(label(let = \ + d7cd3bb6-71de-4469-9bcf-12621e23a1ca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 58863593-cf0d-457a-8bbd-c61c7e21fd11)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 606f56d8-eab7-4052-8450-2ef4da0296f5)(content(Whitespace\" \ + a165e436-14f9-4021-ab13-9df8150f6aac)(content(Whitespace\" \ \"))))(Tile((id \ - ac565a0f-42af-4338-88ce-27e3fcfc0e3b)(label(tuples))(mold((out \ + 577b05cf-024c-4ed9-8b31-edff260b4a3a)(label(tuples))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 63cf4c89-094e-4356-9daf-253dbb2d945c)(content(Whitespace\" \ + 5625f7d8-59c7-42c7-8a29-a0362257b3ac)(content(Whitespace\" \ \"))))(Tile((id \ - c3fb11af-eb28-436a-9035-f50cbda57e68)(label(:))(mold((out \ + aa280e8d-849f-4d5b-b986-c284f21ef91b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3d17eb52-54af-4247-bc56-186682be78f4)(content(Whitespace\" \ + 442c198e-1fff-423b-9085-78d29babfa61)(content(Whitespace\" \ \"))))(Tile((id \ - 38a89077-b558-4681-88e5-e7d813cbf853)(label(\"(\"\")\"))(mold((out \ + b715f97b-9bb3-466f-b360-f85adbf2951b)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a8bad4c7-e301-47e7-a949-bdb1ba738f73)(label(Int))(mold((out \ + 8dff018f-7e5a-4e40-ba5c-8505f4b900b0)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ad6fe333-c320-4816-81d5-5624ab781ee3)(label(,))(mold((out \ + 8ccb984c-99a9-496d-96e4-bda03375688f)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 747c22c8-761c-484d-b5a4-d5f7373c165f)(content(Whitespace\" \ + 621f2629-d9fa-41c5-b78a-b883195433f6)(content(Whitespace\" \ \"))))(Tile((id \ - b9f57138-6643-4f8f-aa25-80feff3f007b)(label(Bool))(mold((out \ + 9df1dfde-58d7-41c7-8715-b2170f3aa32d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ed6eac45-1dbf-406b-8498-5e1494d559bb)(label(,))(mold((out \ + dd372155-f13a-4876-8848-a164c2b606e1)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 749a43ae-b919-4191-91fa-62c439bc3043)(content(Whitespace\" \ + 0ef4ee1b-cf45-44fa-8939-34d099b3d25e)(content(Whitespace\" \ \"))))(Tile((id \ - e1b56d0a-8cb4-4a48-9ed2-6aed629f0100)(label(\"(\"\")\"))(mold((out \ + bd72d5b1-e889-4ed5-b6af-5604db8c4091)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d0ffbdcd-c70b-4fc0-b659-c96363c3a104)(label(Bool))(mold((out \ + ac30773a-1df4-4f2a-ae87-4ecdb2d8e70a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3a412a54-77dd-49f8-86e0-02b68313371b)(label(,))(mold((out \ + 03a7f4f5-c23f-4193-a90a-08d46e14a527)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5f94666f-599e-4026-b887-29e265117fbf)(content(Whitespace\" \ + 29857a62-b7f1-4c22-890e-e8652a2777aa)(content(Whitespace\" \ \"))))(Tile((id \ - abfbdc5d-9894-4f9e-a7f9-2c2d9158ff99)(label(Int))(mold((out \ + 0aaeeb74-508f-4840-9259-cd14326d9ed8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - dc7965d4-7564-4835-9627-9d5d418e62d3)(content(Whitespace\" \ + b6fd53d0-c6ee-4ff0-b9bd-798a1b14de3a)(content(Whitespace\" \ \")))))((Secondary((id \ - fb9d937c-3ae4-483d-9663-5c1c261787f8)(content(Whitespace\" \ + f6a0f515-f51a-4139-97cb-9c6b3d5d3d39)(content(Whitespace\" \ \"))))(Tile((id \ - 0be4243a-f36a-4ea9-b990-257a02cc7459)(label(\"(\"\")\"))(mold((out \ + 8cd245b6-8753-4f90-bc3f-c7a68d5c698e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fc2bd5cd-0278-4911-8f0b-0822da1f731b)(label(1))(mold((out \ + e992ec5a-f518-40b0-8061-1f80d1fcc106)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a29be00f-22ff-4623-b7ec-d7dbe93399c6)(label(,))(mold((out \ + a34227c2-963b-427d-a383-aa082ac0c5c8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 54882d02-ff39-4ab2-9c18-cfbdef53ffce)(content(Whitespace\" \ + 32fc8f63-5a40-4262-b68b-2f8758501a60)(content(Whitespace\" \ \"))))(Tile((id \ - 41bff595-8899-48d5-9fe2-7744905850ec)(label(true))(mold((out \ + c927e79f-1c84-4026-96f6-8116142309cb)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a4766123-e1db-4309-ba6d-1fbd39036677)(label(,))(mold((out \ + d7e639b9-b502-4a41-a9f9-215e490c4a9e)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 84c0e4c5-6979-467b-ae4c-d437efd1e1ab)(content(Whitespace\" \ + 7004b69e-6e66-47d1-abd3-54789ab6de2e)(content(Whitespace\" \ \"))))(Tile((id \ - aa1d70ab-0425-4711-8cc1-3f98058bc3b5)(label(\"(\"\")\"))(mold((out \ + fc9cd11b-9446-4191-ac24-e8b24cf5f868)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab9c0dd2-7bf2-43df-a777-22d7d3b2748f)(label(false))(mold((out \ + 7f268778-faba-4bd4-8bc6-abcd75014e39)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 662ace36-0d83-484f-9941-ffb2154e202c)(label(,))(mold((out \ + d89b1cb2-a770-403d-8626-75e49f47d6a1)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e2ce1a68-5919-41d4-8911-c16ef5bfcad5)(content(Whitespace\" \ + 234e7486-0bdc-48c7-9aae-c860f0c2b095)(content(Whitespace\" \ \"))))(Tile((id \ - 1021a524-a2c0-4502-abd7-6f6e043c1fb5)(label(3))(mold((out \ + d089512d-fc64-45db-8443-810150ccbfe2)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - e832a5ed-6625-41ed-9761-9930c938ab7a)(content(Whitespace\" \ + 57ccdfc8-8061-4ee1-941e-e49fdd1b4b9d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d5a5bff5-2479-4150-9fd1-e663778beaa4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 562c92c4-236a-49d0-acc8-74781aa578a6)(label(let = \ + f80c080e-ff86-46da-b371-428de61d6ec9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 72e1ecb2-0150-478f-8418-c5a0e201082f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 742de0b3-82ea-41b6-9602-31c58cd7f52a)(content(Whitespace\" \ + f712aa69-4773-4ccc-aeba-a2303a3e799c)(content(Whitespace\" \ \"))))(Tile((id \ - 71d415a2-c4bb-4ec9-a6ce-a408b8f95bf3)(label(\"(\"\")\"))(mold((out \ + 80e88a87-792c-40fc-a7d4-993601038b02)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 878ab0d3-f558-4bf8-869d-1ef2c9767938)(label(a))(mold((out \ + 2969f835-8051-46cd-b5fc-5389e36d0fe5)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 136062de-d96a-41d1-ba42-79cef463e765)(label(,))(mold((out \ + 94d006ee-1328-47cb-bd53-4efe6a346e1b)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - cec68ff3-0ea0-48a6-acd8-dd680be3298d)(content(Whitespace\" \ + 71661bb8-43ab-40db-b81c-582bf13bda34)(content(Whitespace\" \ \"))))(Tile((id \ - c284b3be-a5c6-4843-aa42-d1f8a1971fe4)(label(b))(mold((out \ + ec9ef33e-5f03-4f6b-8b81-c230dbc40db5)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6087d826-33ac-45b7-a732-5a3f2b30c172)(label(,))(mold((out \ + 7e23f18c-30f2-4a75-aa8c-35dc78c689ba)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 37348283-2080-4343-af57-38aeb87aa804)(content(Whitespace\" \ + aa409778-a628-4544-b020-da6d4e5f180e)(content(Whitespace\" \ \"))))(Tile((id \ - 1b5540f5-158b-4a70-a4bf-36255284bf57)(label(\"(\"\")\"))(mold((out \ + f7f623ca-82cf-4ee2-a3bc-93806b54baa9)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1818bdac-4d66-4589-8963-108c6585ad76)(label(c))(mold((out \ + 9dfe686d-a736-4dc6-be0b-3ac654d5a1ea)(label(c))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 28daeedf-604f-4485-a111-90562027bbf9)(label(,))(mold((out \ + 9e7a35b8-39ae-4cf0-acb3-e5a590fdbedb)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - cfd7c55e-af33-4249-b0f4-272aad77bb1a)(content(Whitespace\" \ + 09890a96-3acc-474f-bb4e-4842f85aef55)(content(Whitespace\" \ \"))))(Tile((id \ - 5307705f-0549-4274-80f9-0fd87d65a143)(label(d))(mold((out \ + b009677a-6608-4c2b-9c2b-b128e63d91a7)(label(d))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children())))))))))))))(Secondary((id \ - 91acea35-48a9-4589-a6bd-e799c3e27ec4)(content(Whitespace\" \ + ed277330-23de-4809-a991-15ab00cb04cf)(content(Whitespace\" \ \")))))((Secondary((id \ - 75599b17-6e3f-4970-9d69-43df397f8296)(content(Whitespace\" \ + 20d0c61c-5a29-4d92-bbfa-e1e6b02d19aa)(content(Whitespace\" \ \"))))(Tile((id \ - a69fd7dc-d52c-49c4-8d46-87b8bf6b8890)(label(tuples))(mold((out \ + 6231abcf-9c70-43e4-98c9-299200ed1265)(label(tuples))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - efd86ceb-ff6d-4ad3-a1d8-4eb4cfe37529)(content(Whitespace\" \ + 2a5ad763-ac53-407d-a145-74e998f11f9a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cc992ca1-382f-45cb-983a-801131db150b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - eb36e1a6-be1f-4536-bb91-e41e1acdb6a2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e4b95e03-c795-409f-ae29-23db9823c3c1)(content(Comment\"# \ + d1faa776-6092-4ee9-af5a-4e7748cf3b31)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8ad44fe8-05a4-474d-9f7c-8e9e8b24df35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 53e4366c-12e8-4976-a33a-bcaca2991d89)(content(Comment\"# \ Functions #\"))))(Secondary((id \ - 2ce4e372-8250-4159-849b-762a3b5bbbbc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9618d6a5-d886-4a68-a3ee-abf51321e1e2)(label(let = \ + 26d402e6-be96-49e8-9141-a03ee8b80724)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 24bcb8c8-62ca-493f-a39c-ed5e0d96fb77)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d2cdab77-8a15-4f19-a0f4-53e73a42c44a)(content(Whitespace\" \ + 0a923a3c-b147-4c16-88f4-31dd115e4b7e)(content(Whitespace\" \ \"))))(Tile((id \ - e1de297c-06c8-4ec0-b416-50a537da63ef)(label(y))(mold((out \ + fbe19f0e-1326-42ab-9888-cdc4acc68d63)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 83895d66-81fb-4130-a2f0-0de2bd499849)(content(Whitespace\" \ + e534a787-6585-45b9-bed9-3bedaef42592)(content(Whitespace\" \ \"))))(Tile((id \ - 07745d3b-8793-4ff9-a1fc-be4681da5a27)(label(:))(mold((out \ + cf59e7f9-957b-434c-8534-5bd96cc70c2e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a5b7223-4abb-426c-b7d1-327ca1a22937)(content(Whitespace\" \ + d33996cf-f17b-4caa-8ae2-654f042dfbc4)(content(Whitespace\" \ \"))))(Tile((id \ - 572e1a77-a1eb-421c-a443-61cf0515ecca)(label(\"(\"\")\"))(mold((out \ + a4c93c5f-561f-4e41-a8fe-5878e6c3b2bd)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 7b64c9e1-0220-455f-8d8f-684694ebda37)(label(Int))(mold((out \ + 99302602-072e-4faf-b6b7-a379384071c2)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ac57024c-4a52-46d0-b89d-65d0606b3fd9)(label(,))(mold((out \ + 33fe9e57-7925-487d-9bad-0c752d10b30d)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 171ac2e8-593f-4419-b8e5-a1bad60a6e96)(content(Whitespace\" \ + 9e4d1819-12e2-4000-b37e-cb79a0e3f45c)(content(Whitespace\" \ \"))))(Tile((id \ - 8252a6b3-9ab6-4d2c-ae00-35865f3b72ce)(label(Int))(mold((out \ + a9ef5b6b-fc6c-4966-bce0-096a6d5c5381)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e30abad0-7f27-40b2-97f6-89ad4c30c95f)(label(,))(mold((out \ + 3d1fceef-c8be-4c7c-9879-42a29b672abd)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 92a84afd-a236-4ffe-84ce-d24e3fb3998d)(content(Whitespace\" \ + 4615022e-4c5f-4c5c-8263-963bd23b2845)(content(Whitespace\" \ \"))))(Tile((id \ - d2510136-435b-4a86-a448-cca62b08e7a4)(label(Int))(mold((out \ + 8b02ad79-26d9-4c33-8dac-4f8516c60925)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - bd3895b8-b972-4889-80f0-9290a6ead276)(content(Whitespace\" \ + 624da2fd-881c-40c8-82c5-86f4595f288a)(content(Whitespace\" \ \"))))(Tile((id \ - 580a29bb-df33-49a7-839c-0167faf2778e)(label(->))(mold((out \ + 655863a8-237e-4bcf-98e7-c43e222d3365)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bccb5bcd-f46f-4528-b642-74ef5365d772)(content(Whitespace\" \ + 4c232083-70aa-4dca-9c5c-cf75e7e84ae5)(content(Whitespace\" \ \"))))(Tile((id \ - 88bcea0c-d2b2-40a9-843d-4601bb50e755)(label(Int))(mold((out \ + 0524abe1-224f-47a6-a990-553150c8f827)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c4c3ece1-6f13-49e4-9c10-fe7e4dc5fe5c)(content(Whitespace\" \ + 73c59415-b115-4fec-9af9-0c3b901ff99f)(content(Whitespace\" \ \")))))((Secondary((id \ - 801e8727-05ee-435e-9bfe-9dd0af50dd75)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d5840f70-1e0c-4d10-9a7b-b54e03fe8804)(label(fun \ + 3c9d9243-60fe-4673-abf7-1df5aa193dfa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b7a0d5a5-cb1b-47ca-a054-9c462c34d7a6)(content(Whitespace\" \ + \"))))(Secondary((id \ + cfcdd82a-c432-4d3a-bb93-4fd95a0c5c48)(content(Whitespace\" \ + \"))))(Tile((id \ + 8369bf13-cc66-466a-ad2b-c52d15f9cd6c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 100b01f5-0959-402c-b412-6ab97d080d06)(content(Whitespace\" \ + 886f0dfd-ff4c-4455-828d-ff51155492ee)(content(Whitespace\" \ \"))))(Tile((id \ - 7f5de859-4539-414a-9108-d06e0d810d6f)(label(\"(\"\")\"))(mold((out \ + c8f488ad-d7b5-4a61-8c6d-eac31691e1cf)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - a3295d4a-9988-4c61-9b71-d353c4f72ef1)(label(m))(mold((out \ + 8eb443d4-a23b-494b-b659-dacf8aacf828)(label(m))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9d7950e4-61b1-40b2-8def-ee3985bc4cb8)(label(,))(mold((out \ + 9e35ef65-aa4e-4f7e-981a-ecc587ef4822)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - f11677af-1114-4bff-a120-e0aace40e511)(content(Whitespace\" \ + 307a102e-ba64-45c4-b844-9a5aa6ccc520)(content(Whitespace\" \ \"))))(Tile((id \ - 7611e6c9-4c3d-47be-b385-2c328b0103ec)(label(x))(mold((out \ + 4a8299ea-bcfc-4aee-a838-214cd6c97d55)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6f22c39a-5a3d-47af-8f48-a68e1e55da91)(label(,))(mold((out \ + adcc6b6d-bd32-4f95-9207-e93f9123b90f)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - eb0b14bb-f652-40f9-85e2-e0d6b4f2e250)(content(Whitespace\" \ + 725f35f0-9f14-42d4-af58-48494abdd3bb)(content(Whitespace\" \ \"))))(Tile((id \ - 900b5806-0243-4f24-b132-50eaceb15883)(label(b))(mold((out \ + 5730f5d9-656e-4f8a-a391-ca78fc65e366)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 3f9ac33b-ecbd-42b6-9052-a5f3149cf108)(content(Whitespace\" \ + 9676c69c-e775-4807-9416-2f5859fc83af)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5a13501e-0983-4edc-a40b-ede3edb5f793)(content(Whitespace\" \ + 5f0b73fa-c8e9-4575-a038-7fc760a57692)(content(Whitespace\" \ \"))))(Tile((id \ - 897edb48-7cd3-4a91-b15a-464019ee991e)(label(m))(mold((out \ + 07d37aa4-7547-457d-8f3f-1567c81ef2bf)(label(m))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 132c2732-a525-466c-838b-f71b21528bc0)(content(Whitespace\" \ + cb668b66-f9ea-4bda-a07d-4097d9409806)(content(Whitespace\" \ \"))))(Tile((id \ - 95c70750-abad-4cbc-9660-d9b1cf318b96)(label(*))(mold((out \ + 37764c33-2e7e-4c4d-bc9b-52f30aa49c46)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aefdc1d0-17ee-4840-a160-5c4d0003d503)(content(Whitespace\" \ + 502565c3-c715-445a-b21b-a36ac104b8ae)(content(Whitespace\" \ \"))))(Tile((id \ - b2acb597-ee2f-4d47-9f9f-48c48bc22c78)(label(x))(mold((out \ + 14b40d1b-478f-43e5-99fe-ea7e9f32ee87)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - db2fe55b-02b5-4d29-83f6-f7e410035dd9)(content(Whitespace\" \ + 3bc517b0-33e3-4e1c-9b88-b1ed2952366c)(content(Whitespace\" \ \"))))(Tile((id \ - 0550f425-ea90-4f9d-a7e3-e348d1c4ee5f)(label(+))(mold((out \ + e2b76739-1a02-4136-b34a-b231fd7ddef8)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 02fef1b0-73ca-472b-b7bc-87bb84e11a30)(content(Whitespace\" \ + 2409b7fb-0ffa-4251-ac12-f26a8c256962)(content(Whitespace\" \ \"))))(Tile((id \ - 47f7031b-17e5-4f65-897d-96a8ea2ed417)(label(b))(mold((out \ + dd807b11-1430-4cde-8bfa-4d0f5a6e3c92)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3628c03a-ace9-4ee7-ad7f-bdd601e63ce0)(content(Whitespace\" \ + 8e3c8f19-ab1e-4cd1-8e1a-2efdc1a4c5bf)(content(Whitespace\" \ \"))))(Secondary((id \ - 1b1f747c-f19c-455a-802b-bb4ac9b6e771)(content(Whitespace\" \ - \"))))(Secondary((id \ - 887a0b7d-fc9c-4a55-a52d-ec1f45675008)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 1999e818-0cfd-4515-99f2-35e344706cb3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2e554f80-370f-40f2-8f9b-9424b98dfeda)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4c5f575e-de64-419e-a604-448e06cf80ae)(content(Comment\"# \ + 9fe5b103-f94a-4ce9-9ec9-b9bbd0b0b529)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + a93a5b8a-695f-4f46-8e9f-53437d2ac117)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 72a9a9fb-d181-4904-bb91-b49512e289bd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0250d6b4-f3e8-46e9-9ee0-0b80a0f593f9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bcf7b081-e9fa-42f4-af06-dca918e425ec)(content(Comment\"# \ Recursive Functions (arrow type annotation required) \ #\"))))(Secondary((id \ - 5204b0b4-7fa9-491f-b600-5353370ebe9a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 95a04bf7-f002-488d-820e-560b16ff85ad)(label(let = \ + 3a98270e-a970-4b6e-aa0e-78b22afb3e01)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 58f425b6-3901-4cbc-9f4e-341291b4cc45)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cc065718-dd73-4819-95bb-ac2b12d4b570)(content(Whitespace\" \ + ac30af97-531c-48d0-a7ca-bfb89a6aa5ed)(content(Whitespace\" \ \"))))(Tile((id \ - 76b4697c-0c7f-4a9d-9723-41352790e52f)(label(double_recursively))(mold((out \ + 6e1c8a2e-68e0-40df-b258-f7ad055b2483)(label(double_recursively))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3c2d818f-4ee0-406f-8400-cbdb0080d024)(content(Whitespace\" \ + 0131899a-ecc2-425b-8c32-03e309537add)(content(Whitespace\" \ \"))))(Tile((id \ - 87621d2b-c5c1-4014-a282-21e9e8900559)(label(:))(mold((out \ + 20f93d12-5cf3-4c8a-b639-94d162dc0770)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 49829b3a-8c93-41e1-be83-99f408d50c59)(content(Whitespace\" \ + 5336148f-8ca6-4d3b-9e39-64c763d92b4a)(content(Whitespace\" \ \"))))(Tile((id \ - ea22af54-c548-40ef-976f-a68c786e689f)(label(Int))(mold((out \ + 7fd60598-b5f9-4596-a28c-7330176bd966)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ca5db796-bf08-4943-a68e-d7e19369e741)(content(Whitespace\" \ + 7a812427-7e49-4031-83a7-ecb3912c2fcf)(content(Whitespace\" \ \"))))(Tile((id \ - 94add33f-bc88-43c9-8e6d-e0813bd31705)(label(->))(mold((out \ + b3864368-f3f7-4300-a539-d6cea4cbe46d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f83dc517-11cb-4957-b128-0abf83f90eb3)(content(Whitespace\" \ + 1b0feff6-a3f7-48ab-8b63-01bd0e2fe2b5)(content(Whitespace\" \ \"))))(Tile((id \ - af9377f8-1ce9-45a0-b694-67f9dd06f8eb)(label(Int))(mold((out \ + 8097c5e4-210e-4481-9ba8-f134a396da57)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 76950016-81cd-47d8-80e0-e67f955a51e1)(content(Whitespace\" \ + 49949f6e-43c1-4333-9115-3d509bafb176)(content(Whitespace\" \ \")))))((Secondary((id \ - 01c4a686-cc64-4d36-96fc-0c91708e2ddb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 64c206a0-db40-4b5a-a134-a5297dc59ce8)(label(fun \ + da601bd4-4a93-4440-8308-cdc30e39e337)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b6142dfd-bd70-4a7c-9051-bc3a9c7a6c75)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3bd390c9-032f-4b12-a694-1452d501af90)(content(Whitespace\" \ + 584e68dc-aa00-46ac-8d9a-3c65a1dc34f6)(content(Whitespace\" \ \"))))(Tile((id \ - 134a9169-c036-449c-a032-aea90954e397)(label(n))(mold((out \ + fced37d6-3d39-4a12-8069-1dff9dba3204)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f92b26e5-3c0a-442b-b375-9a57686fae15)(content(Whitespace\" \ + ff6d9d83-ff3d-45c6-8d56-f12c6a7576dd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bf4cc69d-87e5-4c1b-bc8b-fef706b6dd42)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5ad86704-2e12-4544-b0f0-f0588c66468b)(label(if then \ + 6ec56bca-eb53-4248-9aa3-78dee45ff098)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a86d9fea-a2a9-4a08-a113-90dcd901f89d)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e9db2fac-809c-46a1-bc89-559d54fba76d)(content(Whitespace\" \ + b04d8f08-928f-4e56-bc4b-6272d4e7a836)(content(Whitespace\" \ \"))))(Tile((id \ - 090f85ea-0a8c-44d9-b43e-fc0cf1d8692d)(label(n))(mold((out \ + d229b78a-73c9-4e09-8540-e66b29539fdc)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1902674d-e659-491b-ad54-3addb8bd79d0)(content(Whitespace\" \ + a7f90d59-d22d-4b72-a651-1ce6ea84607d)(content(Whitespace\" \ \"))))(Tile((id \ - ae446612-3a87-4794-8bfd-a2de67d9ac88)(label(==))(mold((out \ + 9ecfc806-e9ac-44c2-ad63-014356164f8e)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7293b220-2491-4559-a9d1-5df58353d7bb)(content(Whitespace\" \ + 5870369b-a13b-47c7-8b02-cd3b9ede735e)(content(Whitespace\" \ \"))))(Tile((id \ - 398b3087-b0c0-462f-ad48-2ff167181c2d)(label(0))(mold((out \ + 17c54ddd-7451-4005-aaec-3b1531bdb4b2)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 276f2a79-ebfd-4532-b1bc-e3adb7257110)(content(Whitespace\" \ + 1325b819-a850-4c37-9c9c-8297fc739c88)(content(Whitespace\" \ \")))))((Secondary((id \ - bccc257a-23a7-4381-8961-58d157dbbf25)(content(Whitespace\" \ + 44dd7966-2024-4e2c-8e7d-bb2baac00657)(content(Whitespace\" \ \"))))(Tile((id \ - c8e2a4fc-697b-4300-aeb7-8bd45c80e5d4)(label(0))(mold((out \ + dc116c57-d349-4b6e-b9c2-a2117c1ebe17)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 52d5bedf-f5de-4eb0-8a0e-0ef1514fb575)(content(Whitespace\" \ - \"))))(Secondary((id \ - 63c77324-e36a-4190-874f-202324946431)(content(Whitespace\" \ + 38b62dac-f8b5-494a-9316-6a5cd31e79c8)(content(Whitespace\" \ \"))))(Secondary((id \ - 02c20515-a6fe-4ead-8d15-5ec2c6a3bddc)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 08ad4560-d007-4e54-a156-793729fe4979)(content(Whitespace\" \ + 6b3865f9-4e3a-4c4d-803c-fbfe39e430c1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 0b712267-97b1-45a9-ad14-5ac637e1aa13)(content(Whitespace\" \ \"))))(Tile((id \ - ca6ea1b8-7353-4275-9a07-1d5ec8c5c0a8)(label(double_recursively))(mold((out \ + b7b97d51-2bc1-4261-96b1-1ec5bfba7aa0)(label(double_recursively))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee20ea0e-9863-40c2-9251-88fe4094bb0e)(label(\"(\"\")\"))(mold((out \ + 7a6de9e3-2833-4542-9073-755b6792b7f6)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab4ee551-f263-4f54-917f-c23d6ed86434)(label(n))(mold((out \ + 6ce13d39-bb63-40c8-b718-b42914a27fb8)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - be1a13d8-1606-4adc-9317-42ae0a800334)(content(Whitespace\" \ + 1bb742f6-75dd-45a3-bcaa-b174908bfcaf)(content(Whitespace\" \ \"))))(Tile((id \ - e4306177-5dc0-4dec-914d-56339b8e5e25)(label(-))(mold((out \ + 5bb76fe6-4b6a-445c-9033-12d9a65da939)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a0fc1669-6f62-4826-a802-052a0dbe4697)(content(Whitespace\" \ + 766c7916-ff02-410e-adb8-b7e06619857d)(content(Whitespace\" \ \"))))(Tile((id \ - 3303b06f-aae6-4cd8-9c7a-154a307d11c1)(label(1))(mold((out \ + 2c0a2a52-d28d-451d-a28b-5da648820120)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 47e13bfb-00d1-4195-b754-4bf0be3ae656)(content(Whitespace\" \ + 32bae59f-8ca9-48eb-ba54-b55b52348473)(content(Whitespace\" \ \"))))(Tile((id \ - 7825e903-07c5-4109-b967-0f68641c594f)(label(+))(mold((out \ + 11f5639a-3598-4a55-bb5e-3c56bcadf3b2)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b43ae7af-d44f-49af-a2b8-7b6e81b4bfcb)(content(Whitespace\" \ + 36f50e18-e56d-4274-8c8b-7388125d6449)(content(Whitespace\" \ \"))))(Tile((id \ - 643afe0e-fa98-4422-861a-4b6364ca865c)(label(2))(mold((out \ + dd93277b-595d-4b7f-928c-b1484e3278db)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 467245b0-39aa-45de-9c75-f9f818a81115)(content(Whitespace\" \ + 7d4f7d30-3db9-460a-a8b5-f6ac8d52f291)(content(Whitespace\" \ \"))))(Secondary((id \ - 0e38064d-6673-49ef-be97-af84182bc5ee)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6a322a71-2b4e-4386-bf5c-4023c42a6757)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - eb2c1ffc-d273-4e6c-90ba-eb434e9bdb46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 91cce06a-8014-458c-9fe1-c6ea4753f84d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 23e4c624-72d7-4c61-b8cb-08344ef1367c)(content(Comment\"# \ + 67a8f4ed-bce3-45d6-bb16-6dea87232ed4)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 6d09f946-48aa-4dfb-8754-5a03fe9dbce9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 475e6f6f-dd86-4038-924d-6e3398187780)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4cdef99d-e23a-438a-b934-5b7d414c22b6)(content(Comment\"# \ Mutual Recursion (bind tuples of functions) \ #\"))))(Secondary((id \ - 374ce76e-796e-42f3-b324-02373b386b26)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 32f82943-2afa-4aee-8fa6-71da1c2179a7)(label(let = \ + aacf6a03-1d8a-4ec9-8188-277c8ac600aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ffdaac7b-545c-4969-b530-32af9e589794)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 77be0442-b4dd-408a-90c8-dbac43513ad8)(content(Whitespace\" \ + 0ea465df-7593-4cc0-8f98-adeb800b8d6f)(content(Whitespace\" \ \"))))(Tile((id \ - 2a607cba-2834-4274-bb35-6e747bdf2fef)(label(\"(\"\")\"))(mold((out \ + b9df8aaf-4aff-4990-970a-88ae63feea35)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 039328c8-f020-417a-8f2e-bb971b8233dd)(label(even))(mold((out \ + f66b421a-2ce8-4f73-ab7d-d3bf44223e4c)(label(even))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f7183250-b8dc-4d36-a30a-1c1647d62d5a)(content(Whitespace\" \ + 4f8852a9-e2af-4125-ad77-b5dc73c52aeb)(content(Whitespace\" \ \"))))(Tile((id \ - 67fbf938-715c-4cd3-b810-5980844f904f)(label(:))(mold((out \ + 11796501-297d-43e2-8f12-71f92c4a46a4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cceaecaa-7cb9-4c59-9c08-6254576dced8)(content(Whitespace\" \ + f66c10a7-8a49-4207-97aa-62ab77f24318)(content(Whitespace\" \ \"))))(Tile((id \ - e4831943-a747-4a09-aea8-c275e0790c8f)(label(Int))(mold((out \ + d1170bbf-b3a9-42d1-9ae6-967efef34905)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1f2b3d24-c680-4577-b4de-b5f96a51a38f)(content(Whitespace\" \ + 2500f0c1-a7a3-4a55-81bf-35ad323a7198)(content(Whitespace\" \ \"))))(Tile((id \ - e1541a08-cb84-49b1-99d0-9e7af61798e7)(label(->))(mold((out \ + 665c778d-df5a-4ecb-a8f0-838bcd5f78df)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - efe95448-e2de-410f-964f-9505fdebd161)(content(Whitespace\" \ + 3612d5db-888e-4b15-a093-a0593471c9f3)(content(Whitespace\" \ \"))))(Tile((id \ - 5473ab42-39f0-4973-a796-a77a97b9fa78)(label(Bool))(mold((out \ + 3d0ceb68-c144-4f04-97f3-2963e9b7b274)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 209495ec-8592-40c2-b061-4fce09c6ccbf)(label(,))(mold((out \ + 9fe3f210-1f66-4981-9820-2c662989d0fd)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - fa74815b-8bc1-47db-835b-b273ef74e603)(content(Whitespace\" \ + c4c392f2-9a61-42d0-8612-268eb4cdaa2a)(content(Whitespace\" \ \"))))(Tile((id \ - 52c417bc-733f-43ee-9ce2-abe25530a7c3)(label(odd))(mold((out \ + 33016517-c951-4746-8b49-0bde4cf77a46)(label(odd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e57858af-70d2-4348-9066-78ff2dcdf17b)(content(Whitespace\" \ + 56eb04f9-bb42-46e6-bafa-abf47222cd4e)(content(Whitespace\" \ \"))))(Tile((id \ - c1a06f4f-3008-4797-b4b3-77dd01457b21)(label(:))(mold((out \ + 06292b71-a9ff-409e-a0de-673cb686592e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7a081884-e38a-42d7-981a-e41d94d81060)(content(Whitespace\" \ + 9db16c80-61de-4fc1-ac3a-a2168e362124)(content(Whitespace\" \ \"))))(Tile((id \ - 40794218-2257-4047-8b64-20a8523aa0d1)(label(Int))(mold((out \ + 406c9d55-c4b4-4294-8133-7068158a12b7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6312e87a-4876-42c8-9c6d-e247945c36f9)(content(Whitespace\" \ + 657bce5c-9bc6-4d94-a01c-92ff2293bf49)(content(Whitespace\" \ \"))))(Tile((id \ - f40cab8e-abe1-430d-a9df-3bb822a096bf)(label(->))(mold((out \ + fe0e0f92-6671-434e-9ada-aec42b9f3d76)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - db6e987d-228f-4bde-8559-0468e6154d3e)(content(Whitespace\" \ + 639f85de-c646-4617-b99e-2c58778f0e76)(content(Whitespace\" \ \"))))(Tile((id \ - b1a99a50-f8f5-4578-ac1b-5cc411b6b844)(label(Bool))(mold((out \ + f104f0a8-5a3c-4e2b-8c65-310b0663a751)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c206025b-6261-484d-b63d-baa90608c647)(content(Whitespace\" \ + c0a0f384-d96e-4b66-851e-0e6b3e7aa3c3)(content(Whitespace\" \ \")))))((Secondary((id \ - 406a70db-afb7-4864-89d9-084aa5c049bf)(content(Whitespace\" \ + 9ba152d5-7580-4088-976a-75cb68bce790)(content(Whitespace\" \ \"))))(Secondary((id \ - f95e3637-d772-4248-8138-961129907cac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d0cc9e94-9bb0-498b-952e-ef70885d20a3)(label(\"(\"\")\"))(mold((out \ + 4f870c35-2c29-4636-b328-8c161ad0a59b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dd44379d-a615-4dad-8604-6b8a8c9b2cd1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c75105b0-0e77-4d15-b499-97a9f8f1f4ed)(label(fun \ + 97cf11ea-0f4c-468a-8868-45147007f006)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c0a6645a-6b8d-4608-bf88-2536e9e1b6b8)(content(Whitespace\" \ + d22db80d-4761-40b2-9992-eefb50c9d7db)(content(Whitespace\" \ \"))))(Tile((id \ - e0d83491-50dc-4e96-8ecb-1ac9bda7e81d)(label(n))(mold((out \ + f1fbf06d-b783-48cc-9507-6465a8f1c1cd)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0c338716-647f-4271-8bee-4c15b05eaeb6)(content(Whitespace\" \ + 286769d4-fce3-4d8b-bcef-8c247e4a25e0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aae9e555-0bdf-4bc5-8e5b-4bc41fc46aab)(content(Whitespace\" \ + 03bbb21f-6234-4d64-86f2-1cd43f6800c5)(content(Whitespace\" \ \"))))(Tile((id \ - a6713c9e-f90b-47fa-bb39-d17d217c570d)(label(if then \ + 80286335-8be0-48dc-84e3-f21272a0acbd)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2fbb437a-1a0c-4fdf-bec3-d88c0d4fa9b3)(content(Whitespace\" \ + 04f3a99d-a732-419f-95a7-9456f1dfe28d)(content(Whitespace\" \ \"))))(Tile((id \ - 53f27dee-88d7-4e02-921c-4ff46aee2fc3)(label(n))(mold((out \ + 20dd315b-b126-4bf9-b66b-15571be097b8)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6fa8cbf1-5a9e-47c4-a8c6-2d7bcd8918c5)(content(Whitespace\" \ + 587b86ab-9b16-45f9-a069-d29da8ff5e4b)(content(Whitespace\" \ \"))))(Tile((id \ - 24ad991a-176a-4a41-af91-4a34f7fc2b10)(label(==))(mold((out \ + 73266223-08dd-4320-9f86-f5ae0472372d)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ab256d5a-59cb-4e8c-b0b1-220894e302be)(content(Whitespace\" \ + 33f87f8d-a711-42c9-ad31-1d3e10a4ec11)(content(Whitespace\" \ \"))))(Tile((id \ - 8a965720-4d46-4d00-b3dc-4c405ef7268f)(label(0))(mold((out \ + d5c7c1a0-0b69-4cfa-af68-71b882a85849)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a5ae0d55-7b30-49cd-84ff-d5cd401259e1)(content(Whitespace\" \ + aaa31e7f-9581-4b76-b151-83703bab8692)(content(Whitespace\" \ \")))))((Secondary((id \ - 67c7e1e4-5184-4b8f-bc76-6d0900a1be89)(content(Whitespace\" \ + 95270875-038b-4d94-b1ee-7b0d2b0ddcff)(content(Whitespace\" \ \"))))(Tile((id \ - 7470bb70-fbf6-4909-aa76-1eb8f94ef66a)(label(true))(mold((out \ + b61ba6c7-76ac-4091-9cec-9a781ddcffb8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffdfb498-0a9d-4cd9-acfa-91ed4bf58394)(content(Whitespace\" \ + 4fa5638a-405c-4d5c-b99c-e89650656ae0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 464aa269-bf36-4532-8479-1f2a5f6e782e)(content(Whitespace\" \ + 07a5efca-db53-482c-a7f8-a98a80a15363)(content(Whitespace\" \ \"))))(Tile((id \ - 0600137e-230f-4246-b764-1d5a84462d09)(label(odd))(mold((out \ + 0bf60610-c57f-4e35-9e54-984bb045149f)(label(odd))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c7d5a41f-d3e7-459a-bfb0-475b151ae7d7)(label(\"(\"\")\"))(mold((out \ + 7c9b716f-8505-466d-b6ae-620f1516bf07)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab47b877-6e25-4d2a-91e3-b284f3c60cda)(label(n))(mold((out \ + b0f2cfac-7b1e-4aff-b392-0e396586760d)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cbf0b4a5-0033-4f05-a38f-196cd409f8df)(content(Whitespace\" \ + 89bbef18-1ce1-4894-8bc1-420f56510788)(content(Whitespace\" \ \"))))(Tile((id \ - f79f11e3-c7f7-42b3-9323-2a5952b3797c)(label(-))(mold((out \ + 0b563243-1efa-48dc-87f8-555e04cc4199)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4981c511-ebe6-4dfa-b274-9d545bd66b23)(content(Whitespace\" \ + 258f97d8-5714-4cb1-8fd9-7819c5531cc5)(content(Whitespace\" \ \"))))(Tile((id \ - 119ebcf0-cab6-4a42-b427-c4a79e33155a)(label(1))(mold((out \ + cff30700-5a5b-49d4-bc49-ac5b6ec84483)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 56bbafac-ed94-48ed-b7df-0489613163c5)(label(,))(mold((out \ + 9101c7e2-846b-40d8-a832-a4a6c7bd0959)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1f03940d-aed9-40b9-9f71-ad0633c8c57f)(content(Whitespace\" \ + a73f7a1c-9b77-4140-b715-08728829da31)(content(Whitespace\" \ \"))))(Secondary((id \ - 93391fbb-3ded-4b3b-bb64-b504baa6b1ca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 36ec55d2-7320-4d51-9707-ef301891df38)(label(fun \ + a5307103-94f8-4990-bb78-fd954fc0160a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6b07d6dc-e3dc-4d12-b859-2620bea81ed1)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d7fc0553-0518-4bfd-ab4d-4ae78bb387c5)(content(Whitespace\" \ + 45fcc03d-0b15-4512-990f-d6fb13baf552)(content(Whitespace\" \ \"))))(Tile((id \ - ba02a0a1-686d-477c-a215-8219d356728a)(label(n))(mold((out \ + 686be96b-0ed6-47b4-aa03-e771e6edfac9)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5de3bcb0-f883-4304-82ef-7b49bcc27bcb)(content(Whitespace\" \ + c4870658-3571-475e-ae36-044abfc4ea23)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 951e37d8-f05d-488a-a9b9-4d78c147a29a)(content(Whitespace\" \ + 13002f6b-7b2a-410e-9de9-90c144fe8c65)(content(Whitespace\" \ \"))))(Tile((id \ - 46c4e371-da53-44c1-a14c-b6b1aeb1310c)(label(if then \ + 93aef954-9d0c-4a06-8c39-9d1d61741ce1)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6737af11-53ec-4d6e-a951-948beaf0f134)(content(Whitespace\" \ + 1462070d-9e30-41b3-83aa-0bfa5285c8cf)(content(Whitespace\" \ \"))))(Tile((id \ - 22171d5f-09ac-47ab-ba2b-874055677a19)(label(n))(mold((out \ + fec12099-5265-4b1b-af5f-5ff029413ab9)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3c85fcb7-5b58-4ffe-bdda-cbb55074687a)(content(Whitespace\" \ + cd29d61b-6959-4d86-ba94-55c24151ca51)(content(Whitespace\" \ \"))))(Tile((id \ - e11cb486-316d-4501-93ed-1b141ee48bba)(label(==))(mold((out \ + a759f95a-c777-4a95-94a4-454979880ffe)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bb073359-f8cb-49e4-beaf-e8472427f719)(content(Whitespace\" \ + 3cc08a7a-a8fa-4208-ad3a-6c1c8a8844b8)(content(Whitespace\" \ \"))))(Tile((id \ - a2f00d45-89db-4e40-96ac-4a83007628a5)(label(0))(mold((out \ + e1877f9a-f1fe-4af0-bad8-f3d59d8cca3b)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ce66644a-a3ec-43ed-be21-b429384c5039)(content(Whitespace\" \ + d7c6e25b-c46a-4b70-a6fc-ab0a6f9e7bd4)(content(Whitespace\" \ \")))))((Secondary((id \ - 6886bb46-03c4-442b-9180-7dbec7b3a4cf)(content(Whitespace\" \ + 8457346c-faee-4792-83ab-586a18f1086c)(content(Whitespace\" \ \"))))(Tile((id \ - 7d5c1d58-c709-4a56-90d0-5a0e5f18381e)(label(false))(mold((out \ + 1b161c1c-165c-4eab-b8a8-524d36f3ed7f)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2da3688d-f5cd-49bf-8ecd-7b32d8b9149c)(content(Whitespace\" \ + 182646d3-e1c5-4672-9ae5-940b4c8aa8e4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 99f9e783-076a-4851-b0b5-b284f392a457)(content(Whitespace\" \ + dfb2ded3-3d5f-4c07-856e-11cb44241a39)(content(Whitespace\" \ \"))))(Tile((id \ - d71de38c-1597-4843-8ec4-a9a84e24dc55)(label(even))(mold((out \ + e659460f-7638-42bf-8426-009a2f0ad80e)(label(even))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3e74ce63-09f5-43e5-bd02-c8dea5475dbd)(label(\"(\"\")\"))(mold((out \ + 86a0a7b9-1672-41d8-a361-23bbdd5f6afc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8ce5cbcf-6d7d-4664-b918-7c48cb50ee87)(label(n))(mold((out \ + af7eefc6-3f83-460b-ba53-ed5b4119c5e0)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 041737a5-082f-45c8-b191-1ece3cd6f36e)(content(Whitespace\" \ + b6ec9376-feff-461f-87d2-12131de46018)(content(Whitespace\" \ \"))))(Tile((id \ - 5c54d8fc-45ec-48ec-b6c3-ec42308eb954)(label(-))(mold((out \ + 245a143a-66be-4545-8479-f4e017041317)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 60527c32-483e-4394-a47e-f100fe6afe71)(content(Whitespace\" \ + bb9f09d2-b37d-4829-bb0e-89daa32d6de9)(content(Whitespace\" \ \"))))(Tile((id \ - e3bd1d1b-8052-4ea0-8da5-01c26e340d14)(label(1))(mold((out \ + 584e4cbf-bf24-4c45-b907-8a98305070b9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 14a612e5-e8fb-48c7-a97a-2e4461b2cfd8)(content(Whitespace\" \ + f71965e9-142d-4eaf-8614-a113bc2e11de)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 408ca4f9-9cd6-4687-be29-f3e2ecaea8a8)(content(Whitespace\" \ + 18284195-741f-400d-95a2-c4b03b3af4f8)(content(Whitespace\" \ \"))))(Secondary((id \ - 1e4071ae-72d3-4279-be86-5aa019b15e86)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0cccd6cd-1efd-457b-bbb4-76490794c780)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3899ce91-24c2-4cb4-91bf-18b1a721fb55)(content(Comment\"# \ + 441b067d-f2c0-4046-a33f-55ad4bd10c32)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f35748c8-f14c-40e0-8017-858934cafb79)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b73aa1ef-e325-4e6f-bb09-2f0dce345f0b)(content(Comment\"# \ Lists #\"))))(Secondary((id \ - 4ca6294a-5e9c-4ee4-8b08-a720097c24cf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d5650ca4-1cca-4165-8fc5-f6f6d24750ac)(label(let = \ + 228ed902-3179-40e5-a20c-43cfca5c15d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ae10883d-7d33-434e-a062-6f31419f8c22)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 224ba952-e5d8-4a69-b9d7-abba1ecc9022)(content(Whitespace\" \ + de7642b4-e633-4d7e-ac21-1a1bdab90efc)(content(Whitespace\" \ \"))))(Tile((id \ - 58e5e84a-a28a-4c4b-a322-1d59cab05718)(label(empty_list))(mold((out \ + f3fc13ec-5b37-4cd4-b258-933c70fb7242)(label(empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 43442ccf-3c8d-47b9-88bf-55b028ef20f4)(content(Whitespace\" \ + 673227f7-9b95-4ea2-a87c-1b5eb8eee3e5)(content(Whitespace\" \ \"))))(Tile((id \ - 236fb6d2-a04b-42c5-accc-2aa3efccaa0d)(label(:))(mold((out \ + 61be96f9-b25b-48c4-a6de-198c53cc570f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dfaa4e8b-f89c-4c12-a1c0-338055c6402e)(content(Whitespace\" \ - \"))))(Tile((id 2a6cfdc1-2183-446b-ad13-58c76b930737)(label([ \ + ad59e82a-d430-47c8-b64b-d71abea47e16)(content(Whitespace\" \ + \"))))(Tile((id 5511581d-d481-4347-bc2e-6e0cd1484545)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 80f81a68-d05a-4b1f-8099-e44dd50bd938)(label(Int))(mold((out \ + c5a4a471-8d21-4169-b84e-b7345fc89746)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - cab07d71-d63b-49c5-b239-f4a700e51c5a)(content(Whitespace\" \ + 284e946c-ec8c-4512-b2d8-1792556db214)(content(Whitespace\" \ \")))))((Secondary((id \ - 14406c3c-35b0-4966-8d30-e85b7097f726)(content(Whitespace\" \ + 7bff5c9d-1952-4a3f-ae08-cf9394b3e7de)(content(Whitespace\" \ \"))))(Tile((id \ - 40e079aa-eee3-44b2-a068-5ec916859dfb)(label([]))(mold((out \ + d037dea1-5b70-4042-968b-35fb40bf082b)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a2cc8163-64bf-4f8d-a5c0-bf9e6e5f7ccc)(content(Whitespace\" \ + 2d14437a-6842-4fc1-88d4-0531636e2883)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b3c5e5fb-9a20-4364-acaa-6dda0bad94ba)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2b699dc5-8e75-45df-b3eb-1281452b8b22)(label(let = \ + 0f451b6b-edf5-45ab-bd36-d5003840504f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 24524764-5151-4d27-b657-3b87d0908025)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a78d98ea-de94-4a3f-add5-5cffb9b31965)(content(Whitespace\" \ + a4422f32-2290-4813-80e0-2d6073c8d6f9)(content(Whitespace\" \ \"))))(Tile((id \ - fb42e754-36fd-4e79-ba49-d7c8950cfdac)(label(non_empty_list))(mold((out \ + 56da3743-643c-40f9-8ad3-f01991f9597b)(label(non_empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1b100939-f242-4f49-800d-9191d1563246)(content(Whitespace\" \ + fc42f3ec-127b-4548-8605-8d5462bc8f53)(content(Whitespace\" \ \"))))(Tile((id \ - c348b3d7-84e1-47e7-82d9-0978846405a7)(label(:))(mold((out \ + a3b5c679-f8cb-4e10-b4d7-556fa735f4ee)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0f9a1a56-d369-481a-95df-87786a2ca537)(content(Whitespace\" \ - \"))))(Tile((id df07dcb2-f274-4c8e-855c-2d2823171406)(label([ \ + 4cb8c9c5-59f2-402d-bce9-4a52ea038688)(content(Whitespace\" \ + \"))))(Tile((id 43032bec-31d8-4314-852f-8dab17b845db)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 7135a314-7ca8-42a4-9972-0db9c86f5e8b)(label(Int))(mold((out \ + 49c7eedf-8256-4441-b367-329eebd0cf6c)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 971fcb55-c7b4-4072-9dd6-817508671447)(content(Whitespace\" \ + 78c462dc-4d4f-4498-aec2-28fd227b5f56)(content(Whitespace\" \ \")))))((Secondary((id \ - e526f6f4-63c0-4b84-b881-e8dc6782cff1)(content(Whitespace\" \ + b6d8bb78-3d52-4165-aace-077279a2c61b)(content(Whitespace\" \ \"))))(Tile((id \ - 6b35d843-12dc-4dfa-9e72-a8ce6581df55)(label(1))(mold((out \ + ce4a57a6-cd2d-46c6-9a27-a12e48312bed)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 73434792-1d3a-44fe-88d3-53b1838b1ecb)(label(::))(mold((out \ + 5564fe00-8842-44ec-b1d5-82e5e5a16b1b)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 3989903a-aaa1-4d49-9098-fc0e0b6cf2e4)(label(2))(mold((out \ + a5c46f84-f7ab-4b4f-b817-eb5a7f8acc58)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5384caf2-58c3-4103-a899-4364aaca97bf)(label(::))(mold((out \ + 5e6be7ab-1575-4575-b607-eea8d9d038d8)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 962c7f3a-9713-4152-95b8-80f38d62a517)(label(3))(mold((out \ + 4fe2a011-bf1b-4961-a6fc-3d864c703551)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 96308888-78a9-4f8e-8d53-e625340efe37)(label(::))(mold((out \ + e5e6678d-cb6b-4694-866e-2a7f872cd878)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 9682f8a5-9be0-4017-bcae-12008d04445f)(label([]))(mold((out \ + b5e972f3-2b54-4bf5-929a-a6a1a908dc02)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - df91de1d-ac80-49dc-abf3-d72087618a39)(content(Whitespace\" \ + df8b8b58-393a-4ed6-ada3-e9bf71d3c164)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5c554a0c-02eb-44fc-a477-910a3b842741)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8d1ecd57-52ea-45d8-b555-9938af762267)(label(let = \ + 12267698-5c48-4945-a14d-2bf966b432c1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0676c88c-60bc-4d10-86c6-c66c165c2550)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 73a178dd-6cf5-41be-b824-536bdc18144f)(content(Whitespace\" \ + 2c7137b5-207d-41b8-a095-36390e33d63a)(content(Whitespace\" \ \"))))(Tile((id \ - 88370e87-f2fa-418a-b319-220d60f92750)(label(list_literals))(mold((out \ + 992e7a67-2d4c-4f27-bd5f-e6718fa5593a)(label(list_literals))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7bb2ab0a-20e0-4b93-8010-d607cb78f4a3)(content(Whitespace\" \ + 6d8549a9-ee7e-4800-9dda-bf5f8a7b2093)(content(Whitespace\" \ \"))))(Tile((id \ - f01647f5-6d7d-433b-9272-4777fb30bf73)(label(:))(mold((out \ + 8a1d5270-cb51-422c-94d9-84570332576f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bd1ceabb-ef3d-4a85-ba8a-8e655e408d15)(content(Whitespace\" \ - \"))))(Tile((id db28e289-85ba-46e5-ab14-869ea2a6122c)(label([ \ + 911222a0-ed6d-4903-a481-09feef910a50)(content(Whitespace\" \ + \"))))(Tile((id 74b13f89-db62-4be9-92b4-8a77de2d9994)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 2e9f65c3-ec15-4034-bf5a-9c58747b54d2)(label(Int))(mold((out \ + 0d2a4408-a02d-4692-adc1-64ae07d48699)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 313493b7-181c-42e9-9698-4d45ab971f45)(content(Whitespace\" \ + f3ba4230-e7eb-447d-b64d-5176c7b520b4)(content(Whitespace\" \ \")))))((Secondary((id \ - 087d45c5-6911-4213-870f-dacde57c2312)(content(Whitespace\" \ - \"))))(Tile((id c2e98392-c3d6-45ce-8f8b-f02a44360891)(label([ \ + 859b1eef-8c83-44cd-bef7-009b86a12138)(content(Whitespace\" \ + \"))))(Tile((id a10768f2-9812-467b-ac72-9f12eb10ae0d)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 2dc51d96-83ba-4b6b-a510-69b174a9575a)(label(1))(mold((out \ + 1587bb1a-9d40-4721-b382-63b2c357b867)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3d425238-56ec-4b70-a37c-9d448836038b)(label(,))(mold((out \ + 831c2c50-c72a-4bef-aadb-1da20622b432)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 54fdfe93-cb6c-4f40-bfd8-04d697ddbf6e)(content(Whitespace\" \ + 0899e99d-f7ea-45ea-9100-7e3392fa8aa7)(content(Whitespace\" \ \"))))(Tile((id \ - e4b98b8d-17a6-410c-81fd-e6c18eb79c20)(label(2))(mold((out \ + fe065d92-806e-42bf-8c0b-c08e74896f56)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0ff2c0b5-1552-483b-8b39-32115d502840)(label(,))(mold((out \ + 1e3f2a01-66b8-4e24-bd52-30527ecb9951)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 27203ab4-4113-439a-8f7b-c0b951260ba7)(content(Whitespace\" \ + 03816591-bcda-49a6-ba37-9c2fa44a4c8e)(content(Whitespace\" \ \"))))(Tile((id \ - 78edc697-0528-400a-8826-95ddde9dcf49)(label(3))(mold((out \ + 704da7a4-5e93-49c3-937a-66994e82d487)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 293d9fc7-53d8-432b-819a-2111424e6d50)(content(Whitespace\" \ + b3d4ea40-4660-4433-9398-e163e24a14c6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 62012d3e-58d5-4c2c-8df1-88d5f908d132)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c11c3992-ecdd-43c5-bc5a-854098d75ee0)(label(let = \ + 65440b42-28a5-40f5-bea2-ae10a76c00da)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8edbc6b1-c56d-445a-a447-181fc6c820e9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8632a569-10a9-4356-ae86-1520bff9e4c1)(content(Whitespace\" \ + cb829536-56b5-41d2-8191-770744d127fd)(content(Whitespace\" \ \"))))(Tile((id \ - c3e56873-319e-44a3-821f-a3faf7f65976)(label(length))(mold((out \ + a58ec129-c4c8-4414-92b5-e61b0a87452d)(label(length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 81297121-5b75-4fad-93b6-5f3b64efba3d)(content(Whitespace\" \ + 3e19eb3f-0693-4bb3-b36d-243234d4e5f3)(content(Whitespace\" \ \"))))(Tile((id \ - 432f4e3b-c4e8-46a8-b3a9-2ae3702e4452)(label(:))(mold((out \ + 821dedd6-59ba-46b1-aac0-7e5f3996b941)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c2b1925e-536c-4e63-8fd6-b27a6733deff)(content(Whitespace\" \ - \"))))(Tile((id bdf45557-136f-486e-9398-188fb150598c)(label([ \ + c3e02149-fbbd-40b7-9a4b-c6756f04d481)(content(Whitespace\" \ + \"))))(Tile((id b927f1f0-cbb4-4eee-b6d5-0deb5927b9f4)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 1c1cc011-c897-4ecd-92c9-773d0eb9abf7)(label(Int))(mold((out \ + ef15ad6b-4499-4da8-af25-40ebf818b5ff)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - b4309400-7b68-4134-95e0-81a26ebcf2eb)(content(Whitespace\" \ + dac4bc97-94ea-4c7d-a5e5-d1fead54ea32)(content(Whitespace\" \ \"))))(Tile((id \ - d3da0c7c-9476-4890-a303-a167649c0767)(label(->))(mold((out \ + c3ff9729-31f3-4d22-ab1d-2743ca028da7)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b7fcea5c-763c-40fe-baa8-e37d8e2bf396)(content(Whitespace\" \ + 2060fe61-7825-42fa-a3fe-3cef42c3c7fc)(content(Whitespace\" \ \"))))(Tile((id \ - 8148490a-4d02-4203-a0ce-468a832327f0)(label(Int))(mold((out \ + 31e81881-16bb-4ef3-b1b5-0906d04972e5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1e447d88-6d69-4773-9cb8-d5817080bad6)(content(Whitespace\" \ + b8c635a5-57e4-40f8-a5e5-05aae161c7ce)(content(Whitespace\" \ \")))))((Secondary((id \ - 9a77852c-599f-4bf6-a734-10f8de83a05e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3bc46cca-a108-4171-a463-13c340f7e566)(label(fun \ + 3f345d7f-d8fd-4966-9249-988c8c8f6012)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 97a8ae2a-be62-472a-9e68-7cf2abaa602b)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fef3ab42-3cf8-469a-9af6-077e674740ff)(content(Whitespace\" \ + f0c02721-0ec7-4bb4-9b69-76679b9c3d71)(content(Whitespace\" \ \"))))(Tile((id \ - 4505b4e3-63f6-4919-b297-c1a36c73d5b6)(label(xs))(mold((out \ + 7c179cea-b832-4b9e-a7cb-0c6a25af2027)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 451b73bf-7949-4315-8bb1-6da40ab8eb79)(content(Whitespace\" \ + 1a1418d4-16e8-48e2-9e6b-7734e0f8f9f5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 73e97107-afe1-4134-8e70-982810f352ea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8201e823-43da-40db-91fb-e9241add0aba)(label(case \ + 69231ac1-bfa3-4c3b-bbef-fe16d5d996bd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 364df27a-f0fd-42d8-a30a-7392c7b2aecc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 67cb4ca4-eb4f-4332-987f-f877edc681d4)(content(Whitespace\" \ + \"))))(Tile((id \ + 08364735-5c04-4ed1-88b1-b36a1c8e9a6e)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3ea3d70e-c07e-4f3c-8faf-5579131c917d)(content(Whitespace\" \ + 3e0ff3c4-9941-45d6-8c3b-c38aa42f2d40)(content(Whitespace\" \ \"))))(Tile((id \ - f96e7f00-99cd-4f54-b99e-3287c07da28e)(label(xs))(mold((out \ + b89ed8c3-ba96-428e-b6da-b1caf0778219)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1af50bb3-0f03-4ac2-8983-67c2a1e55728)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d94e439e-72c6-44c6-b025-68984d072075)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + e003f812-d037-47c4-9d7f-a353477bbc09)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + de5f6e9e-c6f1-4a3a-bc29-9c1ef4f0e987)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3bb627ca-0bda-4c44-90d4-0872db644bb8)(content(Whitespace\" \ + \"))))(Tile((id e5a12177-6a4c-4304-a575-513c4c7d9ed3)(label(| \ + =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d24e6c14-4c26-4c47-ab41-5f4749cb9f01)(content(Whitespace\" \ + 413a7ebe-6162-4c14-878d-f5bb90677116)(content(Whitespace\" \ \"))))(Tile((id \ - 1fc05ece-914a-4c05-912d-9efbb570bcd2)(label([]))(mold((out \ + fe218713-c49e-4e02-91a7-b8a51ae40d3d)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0029175f-be6b-4110-a4f1-775018df4d91)(content(Whitespace\" \ + 2630efc6-eb30-4e1d-9be7-0738d5203c47)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 477259e6-ef7b-4268-b2ea-57d26512264e)(content(Whitespace\" \ + 14e50082-15a3-4248-8335-7745ab820dfc)(content(Whitespace\" \ \"))))(Tile((id \ - ebd8fb4c-4c45-4e91-94d1-834b34a40edd)(label(0))(mold((out \ + ce2c57e4-5078-4902-bcff-be7065ca0199)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9d746689-680a-44dd-a5b4-5169f4a4fe94)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c22771d8-9d6f-4612-ad50-3ac0e49609b7)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + 0967ddcd-ab6b-4378-bbbd-66c0b5aea91d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + de81ced0-4ff4-48da-b0ce-b5f7567bd6f4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 16455149-0376-4548-a25d-235833319077)(content(Whitespace\" \ + \"))))(Tile((id 741f27f1-8038-4ca9-a385-792624864dfb)(label(| \ + =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - da20dc45-7121-49ed-aacf-207df323d545)(content(Whitespace\" \ + 03fb7921-9714-42d6-a7cf-bee0167da2a2)(content(Whitespace\" \ \"))))(Tile((id \ - ce850b5c-d2dd-41d7-8142-f133b43e7c15)(label(hd))(mold((out \ + 43e52583-4e3c-4662-a22a-bbd170fbf0c9)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1e5827e8-485c-4018-92b1-4a5829b495fd)(label(::))(mold((out \ + bbb75b7c-6cd3-4d68-bc7c-3c2dee546ecc)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 4976c911-2a0d-4035-b4cc-63a1d759ad21)(label(tl))(mold((out \ + e91c325c-5469-4bd5-91c4-4b80e6b19a42)(label(tl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f6377554-aa5a-486d-b2ea-d07f9a0904c9)(content(Whitespace\" \ + 21a586f6-68c8-4b34-9766-d6beefa2159e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a9780333-d884-4b2d-9be8-c517456acfed)(content(Whitespace\" \ + cbee2c0a-f86c-4108-9f4d-8af7d6931952)(content(Whitespace\" \ \"))))(Tile((id \ - e35a583c-c0e5-44de-acff-e4f1622c1d49)(label(1))(mold((out \ + 8d4b30fa-66d3-456d-801a-55db03868eaf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6a428bbb-1cba-4b51-b1cc-fd89d5cfb9b9)(content(Whitespace\" \ + cc79c1b4-1ada-48a8-bcde-678dfdd4dda7)(content(Whitespace\" \ \"))))(Tile((id \ - f9816ec4-63f3-44f0-8a23-8ce2e552b6ee)(label(+))(mold((out \ + 147ca493-c190-495d-9eab-8cf75a437d14)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a3240dac-5da8-4f5a-809a-06f200214070)(content(Whitespace\" \ + a99dd3da-c3ca-4303-8991-bfc7a50c834d)(content(Whitespace\" \ \"))))(Tile((id \ - 62239ef5-354a-46b8-8d20-e35e0168afd4)(label(length))(mold((out \ + e98199e8-c7cb-415b-a2cd-c9a6c5c1aaa4)(label(length))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1caf04f0-0c1c-446f-9dc9-176db4367574)(label(\"(\"\")\"))(mold((out \ + 4f860950-f8d9-40cd-abf5-16ee26533ae5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ca83a1ce-a0e6-4673-a322-8446a12d4dda)(label(tl))(mold((out \ + 35bc5268-6043-41c7-83ba-0dbe20a2576d)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a10c1321-edb0-48ce-9022-6de3fa32b62d)(content(Whitespace\" \ - \"))))(Secondary((id \ - f9579761-1b41-4a75-b018-0974fc736495)(content(Whitespace\" \ + ff104c0d-7841-4252-ba74-8163c09080d9)(content(Whitespace\" \ \"))))(Secondary((id \ - 49119e09-183f-4841-9dc2-d65d3fec8511)(content(Whitespace\" \ + 4833d747-28c4-4b70-8342-484e6a2b4a86)(content(Whitespace\" \ \"))))(Secondary((id \ - 8bbf3e43-dd44-407d-9ef1-7c7318a6f646)(content(Whitespace\" \ + e61e9333-12b1-4d9f-a556-ad688c8ec485)(content(Whitespace\" \ \"))))(Secondary((id \ - a583e1c3-1c91-4b26-ab8c-f6343dc5bac8)(content(Whitespace\" \ + 84c420bb-f917-40c9-8408-45a745d2267a)(content(Whitespace\" \ \"))))(Secondary((id \ - d63eea3d-1f51-4337-995e-49069bf4bc8b)(content(Whitespace\" \ + 933896dd-16c6-4356-bb53-38ebe7cbbc75)(content(Whitespace\" \ \"))))(Secondary((id \ - e4e967ac-30a4-4db2-a2cd-3138eecb7464)(content(Whitespace\" \ + ad2a7541-a522-48ce-a113-57f467e0f526)(content(Whitespace\" \ \"))))(Secondary((id \ - 8e089a09-9e72-4568-b256-11f334c09748)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 134daeea-9a8c-4b7b-b093-36f4d9d9ae69)(content(Whitespace\" \ + 5dbf3ee7-10bb-4204-88b9-229ef715fdf1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 1d4c3639-3f8b-42b5-8ee5-52d7eb56c4ca)(content(Whitespace\" \ \"))))(Secondary((id \ - 28995a18-1a6c-4cfc-83af-952e3917daa4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 74c4ee80-81af-453c-8fc4-3cd61914ac19)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 6a4d2b02-0192-4e18-a967-23b8240b77d5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4355f42b-e276-4c71-be58-138a0f98890d)(label(let = \ + d660485a-69bd-4f85-8844-b9a5da20c24c)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 21755f8e-e6d5-48ca-816c-83721084a45b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5265395a-48df-41fa-a47b-fd087aba48e7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7cc027ac-3d7f-4ddd-b561-3f4b46b619ea)(content(Whitespace\" \ + 4cf95683-d47f-4b77-b19e-42b6bd60d074)(content(Whitespace\" \ \"))))(Tile((id \ - b8f5c315-2de7-427e-ba98-6cbd2fe959bd)(label(has_at_least_two_elements))(mold((out \ + c70fa345-d459-41e4-942e-6580beac0180)(label(has_at_least_two_elements))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bdc99838-6111-4e7a-9373-ae61587ecf77)(content(Whitespace\" \ + bd861aa4-0fff-4e5d-b628-426d1ef9362c)(content(Whitespace\" \ \"))))(Tile((id \ - 340454bb-4a6b-4c8a-873d-f95781128657)(label(:))(mold((out \ + 04efadd0-84d9-4b10-8be7-46af1f64b0f4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5a4b20e3-c79c-4fde-b276-54a14308fdec)(content(Whitespace\" \ - \"))))(Tile((id 1c6cc786-a597-48a3-b7fa-ef5535451b84)(label([ \ + f8d745c6-99ce-40ae-9cc5-171bc573ac2d)(content(Whitespace\" \ + \"))))(Tile((id 88e2138b-5697-4a7e-bcdb-c2ea6ced15ed)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - d69241f0-41a6-4b1b-b8b8-d49e54d24750)(label(Int))(mold((out \ + 4508debf-eac6-48c1-83c8-0f089ab2352b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 157eb551-df22-45b7-8a9f-ef4c48c01f4e)(content(Whitespace\" \ + 81547a5b-d3c0-46a4-85c8-4f9dbd836d74)(content(Whitespace\" \ \"))))(Tile((id \ - f1147462-7289-4844-8ed9-f1874ce55f0a)(label(->))(mold((out \ + 2f9dccbe-7979-4e40-90a5-6b83821e9bc8)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - eda99a7e-7bfc-4e79-ae11-8b36fd934402)(content(Whitespace\" \ + dc51f76b-e7b2-455c-8fab-80a8d00c5904)(content(Whitespace\" \ \"))))(Tile((id \ - 390a64a3-00fd-490d-9c9a-b8353b5b4326)(label(Bool))(mold((out \ + 6975e3d1-8dc7-4a1e-9f32-1aad6a290ba6)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b1ace131-227d-42d2-8dc3-ae5383c9b3eb)(content(Whitespace\" \ + 4a8dd0aa-6080-41ed-9486-19b58ccaca72)(content(Whitespace\" \ \")))))((Secondary((id \ - 4dd56a62-d548-42a9-903e-ccf311ad7fb5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - af16ad32-7ac1-4aa9-b39b-b4e6033d0c2e)(label(fun \ + 42cb9847-149f-4ef1-baf0-cc37f41481b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 094afae9-371c-4308-9bac-8aa11f203ea5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c0445b1f-9585-4a9b-ade5-468f272fd041)(content(Whitespace\" \ + a7ebdab0-b33d-4d5a-a697-c05ff2cf5e5b)(content(Whitespace\" \ \"))))(Tile((id \ - b059f1ad-2531-4ef3-8667-b7be06cd1dec)(label(xs))(mold((out \ + 33297030-81aa-4db8-9c17-f6dff5cd69ec)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2582738c-cfb6-4595-9acf-9506757fbecb)(content(Whitespace\" \ + 05b343a7-b67a-4686-8c0f-092abeaf4998)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7eb53a98-35fb-4a54-9c83-dca59b1eb399)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd5a639a-610f-4a23-81f9-80353baa950c)(label(case \ + 9a66f8b3-fb86-4319-9d86-b70acdb045b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 27b59ebd-d224-43d9-af16-aa43b49a5627)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ffdf112d-aeed-4cc2-95dc-adb66ed6a8c7)(content(Whitespace\" \ + 7c71a079-e1f8-4352-ad0b-b09859269a46)(content(Whitespace\" \ \"))))(Tile((id \ - 4034ecaf-0e0a-4476-939e-80bc0f632096)(label(xs))(mold((out \ + 657ac93a-3238-4628-b635-53a797966a50)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7b0684ac-1150-4b8a-bbdb-ca32eab7f5bd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d8caa0db-a70b-4b93-a2a2-491fcb704327)(label(| =>))(mold((out \ + f1b0d64f-82d8-421f-978d-38e46184484e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 57184b37-b5ea-4cc2-900f-effee2aed3d4)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a87f574d-d3fb-4b2c-8829-abf6922836b0)(content(Whitespace\" \ + e815e70d-c2d0-4013-85cb-c49f50989529)(content(Whitespace\" \ \"))))(Tile((id \ - 11a93e1e-723c-4173-9c7b-cbb515b5872f)(label([]))(mold((out \ + b4948c09-6c17-448f-8b75-54eb0dca20b8)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 60430af0-c8c9-4ba6-8b4a-85fa56cdae4c)(content(Whitespace\" \ + 89991e1e-59cf-412b-a53e-b716939d16d4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fd93a9f0-db9f-439c-b45f-7ee47a6c2cef)(content(Whitespace\" \ + 5e1316dd-6d19-4e81-b336-01efa2a319db)(content(Whitespace\" \ \"))))(Tile((id \ - 4193f913-3889-4559-a456-f421c4bc54d8)(label(false))(mold((out \ + 7381b72c-cefc-4f1a-a298-ed6902815506)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16d33e7d-ff97-4aad-91a3-1ea6c9011ee0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a3631d64-9f9d-4e3d-b7f5-42cd197614cf)(label(| =>))(mold((out \ + 77cbf89a-ce22-4d7f-9625-12dfed499650)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 49f3ccbc-1b59-4ecf-aedd-c04282eea04b)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5b34bff8-6f19-4e94-a5ba-a98178990802)(content(Whitespace\" \ + f9961fd7-385b-4927-a47e-8badfc0ab6b8)(content(Whitespace\" \ \"))))(Tile((id \ - d9f516bd-a7d9-4b13-b945-e8e774e96954)(label(hd))(mold((out \ + 1de1ee08-3980-4942-8915-e95bfa526e4c)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ae813503-1ca6-4afa-8eea-229293d25636)(label(::))(mold((out \ + 8bc0e132-969b-4a50-bb3f-ce6fe98a5627)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 91e49e39-5358-4fa6-a716-1e58a8491ce6)(label([]))(mold((out \ + fce2cfa8-f90a-4a86-9042-7c9cbc13b726)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0ad96468-8941-4e0f-9bb1-bf47b1b5bbf2)(content(Whitespace\" \ + c398bc01-e87e-4cce-afd7-dda8b951c446)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8f6ad6f-4661-4411-8599-c1e2630d810f)(content(Whitespace\" \ + ea95eed4-da19-4ab2-9c1a-21f22124a567)(content(Whitespace\" \ \"))))(Tile((id \ - d9c856eb-52af-437e-b873-e081289f95ff)(label(false))(mold((out \ + e3629de0-43da-469c-a903-7c2ec78879e9)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - aac68854-c1f6-48ba-9c58-ab3d0f52841d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 803c91f1-36d9-4946-8ecc-b6cf51cb9a6c)(label(| =>))(mold((out \ + c6669a9b-e74b-40f0-8aa4-711960ca3594)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0ba0798b-4b87-43d0-8fe2-eea014acc9ce)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 84fd3ece-1f3b-4bd9-abb4-5ffadf94d435)(content(Whitespace\" \ + 328e67ab-532a-4ab7-a6e7-20bc9506551d)(content(Whitespace\" \ \"))))(Tile((id \ - 569a8812-ddd3-47ea-b463-5abd9b55804a)(label(a))(mold((out \ + b5a65a5d-9bd7-4b69-abfb-7b9aac8a5313)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 43fa8c33-284d-4a40-9478-7408f28f6042)(label(::))(mold((out \ + a45323b5-b3da-4b0b-a559-a3565079490c)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 0a70777e-01ba-444a-954a-f0f2548f7658)(label(b))(mold((out \ + 7173ea8e-c735-4cec-b854-968cab645a8d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9ec5d087-34ed-46a4-9870-74220a456615)(label(::))(mold((out \ + 16dd24b5-50c9-4262-8d84-6e5c7ce2f2a9)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - fc93aa79-d7f0-4839-8cfc-7d57386257fc)(label([]))(mold((out \ + 23b967ee-b090-485e-8f28-7aa249098c7b)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5acf5657-1a2f-4730-9833-23353b117350)(content(Whitespace\" \ + 95966712-72e3-4751-a4c7-903c304c7537)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5fd35e0b-2642-4fe7-a98a-45b3f98f23ad)(content(Whitespace\" \ + 9fd054a9-8845-44d3-b547-8cf8a6da4380)(content(Whitespace\" \ \"))))(Tile((id \ - 5dd0416a-7dc0-42af-9597-f8e8b9adc453)(label(true))(mold((out \ + 3982586c-7891-44ab-9d3a-f881a1cd9f05)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b86a3bf6-5bea-4529-bbcf-daabb63c0cf1)(content(Whitespace\" \ + 40cc9646-8c95-4944-a747-9f1fc15aa8ec)(content(Whitespace\" \ \"))))(Secondary((id \ - c7bc038a-a8df-4ecd-b419-5fc79ff5e3de)(content(Whitespace\" \ + ae10bb5b-3983-482f-8953-12b3c80dc73e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ea3a90c0-7124-4233-b5f9-a2c923c810cf)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 57190bad-08bd-4912-af9c-3416af20fd8c)(content(Whitespace\" \ \"))))(Secondary((id \ - 6770c32e-a048-4cc2-8112-fb4f05d13ce3)(content(Whitespace\" \ + 3b760be1-3252-49f1-90f1-99e6c30042b0)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 51c35b6c-6035-4e6a-ad2d-7e5c35523094)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9b25d1e4-8db5-42dd-8d32-84016d0f6070)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3eb23e54-36a0-47b5-9521-10855edd7cc7)(content(Comment\"# \ + Algebraic data Types #\"))))(Secondary((id \ + 97b76a41-7fe9-4c05-8823-547464b69f52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c6a68c00-8b01-4722-9aa5-049c0ce99872)(label(type = \ + in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + d1571915-1559-40f1-8d8e-ed24040956ec)(content(Whitespace\" \ + \"))))(Tile((id \ + 2c138d6b-a3fc-46cf-91ab-bce50087b037)(label(Exp))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 138371d1-9d15-4a35-8af6-eb1edd8d400a)(content(Whitespace\" \ + \")))))((Secondary((id \ + a981287a-390a-42a1-a4d4-37dabc41410c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1e43d6e9-a5c6-4ad6-a7b0-58a143723098)(content(Whitespace\" \ \"))))(Secondary((id \ - 8cd164a1-76c9-41f3-8094-ad38a10a4808)(content(Whitespace\" \ + de5ae1e4-abab-40fe-8070-407d3b0bf109)(content(Whitespace\" \ + \"))))(Tile((id \ + e72b3747-067c-4f64-ad27-92a483dd30a7)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ + 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 356aeb17-6143-4172-9cd1-34e0edc27b3e)(content(Whitespace\" \ + \"))))(Tile((id \ + 4631828b-98a4-4adb-acde-60dec10289ed)(label(Var))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + eb4f5b8e-4cf6-4a61-9f7b-b75f95db3db8)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 4af2c4e9-4212-420c-a1af-6a730d626ce6)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + d04e2f93-d088-41d4-b4d7-165bd8ae9d3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ad92dffc-21fc-4679-9f2e-fcef4437c67d)(content(Whitespace\" \ \"))))(Secondary((id \ - cab8b0e2-b180-409b-a1ea-26e0519a2e46)(content(Whitespace\" \ + aac7ec81-c72f-4883-855e-d41a9eccb33f)(content(Whitespace\" \ \"))))(Secondary((id \ - ed8bc4f2-375a-49a5-b1cc-52d1b8516c41)(content(Whitespace\" \ + 9b2c26a1-0b07-42a7-b978-c1c58ddff716)(content(Whitespace\" \ \"))))(Secondary((id \ - 7ed49b97-cfa7-45c3-8c8d-61ffdfa9921f)(content(Whitespace\" \ + 58b50bc2-0d35-4dc0-b2e4-f4f65146aaed)(content(Whitespace\" \ + \"))))(Tile((id \ + 84bb0d48-c60e-492f-9974-39608462d37e)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 6591f018-220b-4578-b83a-a2dd93538706)(content(Whitespace\" \ + \"))))(Tile((id \ + bf83cfb1-34fc-45ed-9cad-da9b1e70ef46)(label(Lam))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + d7a21532-d413-4b7d-8951-fc2a2c7ef1e3)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 84c4b277-d143-422d-94c1-a41b0c32f8e1)(label(String))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + b4560da6-0e43-4ca1-b0b0-1e07a4cad797)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8e10e7c8-a0df-42ec-a637-d4112afeb0eb)(content(Whitespace\" \ + \"))))(Tile((id \ + 3cccc626-9e27-41f2-8e3a-5ed948a6ba22)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 85f43748-c420-4f25-b2ab-9d88979be42a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d82f12dd-8ba3-4736-8004-b967b3fd81e8)(content(Whitespace\" \ \"))))(Secondary((id \ - 0d055f9c-a14d-4ce2-bd3f-581b0c342fdc)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - fcb5cfd2-82c9-4e27-b736-cf53744cbb36)(content(Whitespace\" \ + 4cf068cd-4b83-4ebd-8b9d-ba1093d62755)(content(Whitespace\" \ \"))))(Secondary((id \ - e47a45bb-43c0-46fa-bd51-6cbea9477664)(content(Whitespace\" \ + 3978b757-87fd-42ef-a24a-22b4f2787564)(content(Whitespace\" \ \"))))(Secondary((id \ - 7cb9c309-8c41-4e2e-b466-e6e89df9e97e)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 04680ac2-f32a-4f00-b3fa-e18fa84cd5b2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5f5a2d15-2d7e-4dbd-aa3b-bea6dc72e72b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0e1b1cc5-e2e3-4929-b27a-94bd52169132)(content(Comment\"# \ - Polymorphic Functions #\"))))(Secondary((id \ - 035f8c53-b278-4419-a7bd-12f2a5260598)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4c1bb766-67bc-466e-9994-ae786a2d7a2b)(label(let = \ + 38f7cab1-8341-4da1-9fe1-9143ef654beb)(content(Whitespace\" \ + \"))))(Tile((id \ + 86b97a89-5b67-4d3e-8fb3-1a90b14cbf3f)(label(+))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 11))(sort \ + Typ))((shape(Concave 11))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 3de6cbd4-8245-40f9-95a4-4f80df52adb4)(content(Whitespace\" \ + \"))))(Tile((id \ + b59701f3-e236-4a45-803d-16dbcbf051fe)(label(Ap))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + d56e4876-a01f-4798-8256-b0ee41620b09)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + ea5e82c6-57c5-40a4-9be6-bd8eb42b9e48)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 0d95a50f-1912-4fc9-a073-19cde3199387)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + db93a1a8-e49c-4aa5-8ebc-c6f1031e5e8f)(content(Whitespace\" \ + \"))))(Tile((id \ + fc420d41-b7de-4a3c-a561-3f2737bd19c2)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 9fceefac-7f2a-44d7-970a-fdad51aaac3f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 27e8ba41-e39a-492a-900f-e7ea032fba52)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d476076b-2192-4ac4-b08e-3900f3bc24a7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3ff6fd7d-2f30-44ed-911b-66b666d492c8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 52f3d363-d200-41bc-b6ab-e4896fe035f2)(content(Whitespace\" \ + cd8dd934-f512-4c07-ae0e-a0f78cbeed5b)(content(Whitespace\" \ \"))))(Tile((id \ - 8b41067d-402e-40e7-9e94-281402b7a5e6)(label(poly_id))(mold((out \ + 8f2b5367-5b2c-4279-923a-b433f408ba49)(label(exp_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ef8fcb41-13d7-4465-b9e1-1c2d968de72b)(content(Whitespace\" \ - \"))))(Tile((id \ - 826a8939-13d8-48e7-9736-b5a5411f6911)(label(:))(mold((out \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 9310d2cb-ff84-49ce-b4d6-ad3f9e49b4fc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f93a3125-e7a7-4d27-8063-5ebf4a185ba6)(content(Whitespace\" \ - \"))))(Tile((id \ - 5b87b4f8-5118-471a-98c5-c6a15c5ebf3b)(label(forall \ - ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ - Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ - 1))(children(((Secondary((id \ - d6d3eb5a-3005-4dd7-9b21-43b01128875b)(content(Whitespace\" \ + d4dcba8e-9037-46a3-a1b8-7b967791b7bf)(content(Whitespace\" \ \"))))(Tile((id \ - 1750f45f-de21-43a6-971b-589005686bcf)(label(a))(mold((out \ - TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ - Convex)(sort \ - TPat))))))(shards(0))(children())))(Secondary((id \ - abe79aeb-ebe3-42c7-bb7e-bb72a20fb10d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - b8dac9e8-9343-40b9-9957-d8648d16d1c1)(content(Whitespace\" \ + 915f0a86-3c26-4efb-9ef0-06687ec9bb01)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + ba69ec27-add5-4406-8ae0-790ef2c657be)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + ebd056b9-0902-482f-9cb2-ed30a61f2575)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a975ad88-1c5e-47a0-993e-b4f2bf336d74)(content(Whitespace\" \ \"))))(Tile((id \ - 724d01f0-f0cb-4c6a-aa8f-65d59cb6182e)(label(a))(mold((out \ + 617ef4f5-1b5e-4484-bbdc-f092c9424e39)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3a9e6e2d-5932-495e-920a-b8084782284a)(content(Whitespace\" \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 9c498af2-374d-49c8-a1dc-5b0bcb180172)(content(Whitespace\" \ \"))))(Tile((id \ - 52674099-f284-4e9c-a671-5d64aad3127f)(label(->))(mold((out \ + 66f17c5d-b25d-42a9-96cc-db303a57be21)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a34965d-b2fd-43b0-a6cd-1ee550fbd15b)(content(Whitespace\" \ + a6fae7c2-f725-43ee-a87f-5ee7388445be)(content(Whitespace\" \ \"))))(Tile((id \ - 84a51787-99c5-4bd5-a7c8-fe5053221b49)(label(a))(mold((out \ + 2031c5af-e21f-4857-854e-3ce448c13a29)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 66f20986-c3c6-4aef-b9ef-a617b741b144)(content(Whitespace\" \ + 25ab0e07-2e18-4fb1-b4d6-5c9a2bd62979)(content(Whitespace\" \ \")))))((Secondary((id \ - bc1694e7-11d3-41f6-983a-c1a61dcddcae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 72e79d56-9ac3-4875-9cee-00ada7177a3c)(label(typfun \ - ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - ad3eed85-1173-42d1-8294-8965c8d965af)(content(Whitespace\" \ - \"))))(Tile((id \ - a506ffc2-6f7d-46b7-95ba-2cca70868481)(label(a))(mold((out \ - TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ - Convex)(sort \ - TPat))))))(shards(0))(children())))(Secondary((id \ - 9b4eb280-45b3-4a8c-9112-60872c6969b9)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 80221242-1f8e-49f8-a612-1634f7c13dde)(content(Whitespace\" \ - \"))))(Tile((id \ - eec7a501-3e5d-4e68-939d-1ac4106a73f1)(label(fun \ + c098dc3a-e273-4f7b-8a08-12325e681a72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6856b6ff-01ec-44a1-a424-ab3b31602649)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b9296c2f-cf05-4ca4-bb01-fd2f723f997a)(content(Whitespace\" \ + d046885f-65f0-4175-81ea-5f46cc6b8399)(content(Whitespace\" \ \"))))(Tile((id \ - 96f72d68-2015-40e5-8899-bf81c034064a)(label(x))(mold((out \ + 55ffd275-9870-4291-b529-d6ef1f13cb10)(label(es))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f5dff36e-465c-43e0-bc36-82dff78d7361)(content(Whitespace\" \ - \"))))(Tile((id \ - cbe11b75-c0de-4d7b-8613-9c86df7f3613)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 2c0ede7e-59fa-481f-b7ae-bcb1ff2d616c)(content(Whitespace\" \ - \"))))(Tile((id \ - c046a0e5-ce3f-48e7-9952-5e82f9dd6288)(label(a))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b96e6399-49ac-4941-81fa-24392f568ab9)(content(Whitespace\" \ + 2e5c9834-9623-45f4-a278-e79b39cdcd72)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 706086f9-be41-4606-9cc2-66ec26997428)(content(Whitespace\" \ + cdd16dfd-9d5d-474e-b5d4-f5700b6392aa)(content(Whitespace\" \ + \"))))(Tile((id \ + 775e9639-82d6-4367-b2fb-464ee98b155c)(label(case \ + end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 7f05fbc9-d56a-4491-b615-978ba1c53d8a)(content(Whitespace\" \ \"))))(Tile((id \ - 93317eeb-4157-4c17-ba56-685eb73fa48c)(label(x))(mold((out \ + 28abc66e-2b9a-400b-9cae-bee0efe708b5)(label(es))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 180a0dbe-7c3b-41bc-895e-2402b2fdec8a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7f88a7b5-e3c7-4f92-bf4f-dcbc8e385149)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - d5bff5f4-cbeb-4eac-a789-dafb61aadad9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - faca7af0-1899-40dc-8f6b-2cd73b3ce925)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 6c671442-dd7d-47de-86ab-9c83eccb6c91)(content(Whitespace\" \ + f5402a9b-c581-4f2b-adae-e4484817ab7f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a1204bdd-f46c-4b05-a2cf-c468fd4d4a83)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 18c63e88-fa31-413e-b92b-fa7d7c63b224)(content(Whitespace\" \ \"))))(Tile((id \ - 603d040a-8cb3-417a-86c4-ac686b564aef)(label(apply_both))(mold((out \ + bcb9a61b-2270-4baa-8589-224fce9e87d7)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 88f7e34e-9894-40bc-9033-e81fa9a53178)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 126ae8a6-1b8c-4920-b8fd-23a6e381e2a3)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + ff5b63d5-203f-4be7-a10c-8cd20cff350c)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + 04618319-74a3-4bdf-9ad0-689ca3f18852)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + f5a9f073-2796-43e9-8b31-5a663d7375e9)(content(Whitespace\" \ + \"))))(Tile((id \ + 8a0c4f9d-6960-44da-bb62-3f34fdfa962e)(label(Var))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 017996fd-f7b2-46ad-9f67-3e764759a0a3)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 132a73f7-3da4-45c4-acef-065a9558a986)(label(y))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 3a150d65-4664-4d0b-ab8c-0b00ecf6184a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c281b06d-c1aa-4a4a-a43b-3e03de298ee4)(content(Whitespace\" \ + \"))))(Tile((id \ + 05e5ff5d-5dab-4654-af16-71532427b041)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 4169c9cd-e49a-470e-b7e9-5aec116f507f)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4770a22d-6851-4b17-ac37-27940b4c5174)(content(Whitespace\" \ + \"))))(Tile((id \ + 7c341b34-91b8-4a53-83c5-ce3543d406fe)(label(y))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c8d49c08-33f8-46f0-af49-986b023d800e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bbebf0dc-22d4-45b7-9c33-12ea88236448)(content(Whitespace\" \ + \"))))(Secondary((id \ + 85b7f4a7-5ef0-4d54-a23c-8ba79ef1b8a5)(content(Whitespace\" \ + \"))))(Tile((id b6a8d547-f7f5-4ecf-8547-9f3168d002c0)(label(| \ + =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 113e9d3e-4419-4630-8f81-2f13b5875bcc)(content(Whitespace\" \ + \"))))(Tile((id \ + 0f466b10-1506-4a52-a0b8-629a8621f348)(label(Lam))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + e8308f60-1f55-4794-8f40-b0f38c59106a)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 37ab0926-942c-43c5-bdac-654bbd27e81a)(label(x1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 17aa91ad-4c57-40d1-984b-6ae9dc9d61ce)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 25c085bb-62bd-46c1-93bb-9cbeb94c9360)(content(Whitespace\" \ + \"))))(Tile((id \ + a366fd85-f010-415d-979f-e3adba5ebfca)(label(e1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + 47feb313-ff57-458a-98d3-8941c5a4853f)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 29ed3be8-4ca5-4332-a904-091aebff0c47)(content(Whitespace\" \ + \"))))(Tile((id \ + cca1243e-47c6-474f-b9cd-28fc1581ccbe)(label(Lam))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 1c4d1794-e0c6-4a0e-ad41-be71e8acaca9)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + a4bb1b0b-54e8-436f-924d-d212bee337ef)(label(x2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + d73ac96f-5ae2-481c-b9e1-ac95fa6d793c)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + df942099-3866-4814-ae31-192d1bdd05f0)(content(Whitespace\" \ + \"))))(Tile((id \ + 062d1ce2-9525-4334-aea0-447d037ab810)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + c2533d7a-585c-4983-b7e9-f64648b85a30)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + bb40f7f3-9bfe-494e-bb4a-c37cba63df8f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + afcf2c84-2c1b-4593-a7e4-4862ce5239cd)(label(x1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 2d0a52bc-6339-45e1-80a0-e22c792bf0b0)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 52e51e67-af52-4f1e-a80f-c866eb12f98e)(content(Whitespace\" \ + \"))))(Tile((id \ + f0bc6ac1-e2b4-4a24-8e17-382f5a6c24ce)(label(x2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0808c2ef-3617-456f-acca-ec6e3b1f1b85)(content(Whitespace\" \ + \"))))(Tile((id \ + 2cc9d91d-b239-4279-b2e3-368d29f92aee)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 9e156604-e7f1-4fc8-95b2-b666e205329d)(content(Whitespace\" \ + \"))))(Tile((id \ + 19beded0-d470-468b-9c07-21a1b1c4153a)(label(exp_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + c3f9fe12-cc9d-478a-85b5-8a576b9aaf3b)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + b28a7e62-e7a0-4c5e-80a2-f3d9375f1493)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + a9579ebf-69e4-4683-918e-fe3a847e1cf2)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 379502fc-f6cd-42a7-a5ad-87cc9a53fb5a)(content(Whitespace\" \ + \"))))(Tile((id \ + 79534ecd-68f8-40c3-94e6-158c520e1bb4)(label(e2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 59056ebf-7109-406a-ae06-e2bdd6c91b7c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3431c094-b565-4aa1-b225-45cb0f1c5b92)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + c89f70da-923d-47b8-8067-3966ae0d6708)(content(Whitespace\" \ + \"))))(Tile((id \ + 852eb701-a4a9-4f98-9f59-9f15554718f5)(label(Ap))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + c46637af-fbad-4cd7-9106-76ff3b6a7974)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + e1b5355d-f779-4764-83ae-027e50157f62)(label(e1))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 249f20e6-4556-49a8-8344-2f3ec92139f5)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 0cadaf5c-fc04-4a92-b5f2-a5d286f71ed1)(content(Whitespace\" \ + \"))))(Tile((id \ + 4cc06d1c-2884-4fb3-ae73-e8a8b7b0878f)(label(e2))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ + 927a44f1-7768-414a-b550-b815e379d7e1)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 8c683626-c44f-494f-94b9-a107a934a415)(content(Whitespace\" \ + \"))))(Tile((id \ + 8f464a90-291a-45cd-98d8-1af6203a228a)(label(Ap))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 0b6285ee-7e82-4e98-8e2f-92499e9f0762)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + b5ae1798-438b-4fd9-81d7-28ef075ebb15)(label(e3))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 5c685b5d-8ea1-43f4-8a04-88fd62cc71ea)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 7cbe4ffa-4db5-4a17-aaf9-1d6134f8b07f)(content(Whitespace\" \ + \"))))(Tile((id \ + 65bfd6a9-1713-42e9-aa34-d6b1c4359ab4)(label(e4))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 9ec97e81-e00a-499f-838c-a9e0d835518c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 2341e9d2-1649-475c-a553-cc1eeb546430)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cb880a9d-56ad-4ef6-8fd6-21c2bb16f703)(label(exp_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + fa218c65-b3e4-40ee-bd83-bf4b577074d2)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 8390c6c2-6b7d-4dad-99a3-f54220580a43)(label(e1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + a349c406-62d5-4c99-b8bb-66df3e14e2b4)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 062221e3-e10f-4763-a30c-1f9943a609fe)(content(Whitespace\" \ + \"))))(Tile((id \ + a383bd27-b3df-46e0-a9a2-e2202885172a)(label(e3))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 663402d5-d307-4c6e-9a17-f512bdad54c7)(content(Whitespace\" \ + \"))))(Tile((id \ + b9a7d200-cf57-46a3-be75-be9f0d8814cd)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + dd59b20f-d55f-4317-a1b4-617858b49e24)(content(Whitespace\" \ + \"))))(Tile((id \ + 83d72ebf-f407-4fa7-9ebf-5bfe83bf24d2)(label(exp_equal))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + db523698-c224-4dfb-8c0c-eef884537326)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + c92d439b-0709-4618-ab04-ad09abb45294)(label(e2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + f410d8e7-20fe-4cdd-8456-860e27578b4e)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 4adee34f-36e1-43b0-bf36-f5229fa12e44)(content(Whitespace\" \ + \"))))(Tile((id \ + df8056b7-f259-44ef-9cb1-bba4895fdf87)(label(e4))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + f06ca057-5fd0-4f1e-9fdc-f0f40a9958bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4296f516-d59e-4841-b10e-511e59d2cedf)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 69b50ede-03f9-4320-a83f-1c5bebd3fd2d)(content(Whitespace\" \ + \"))))(Tile((id \ + e6bf9f85-b4f8-4993-9e66-4dc8c1287e31)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 25b0b7ad-154d-4a9e-8384-0695b197c862)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 27be5ef9-1f5d-4695-aa25-3e5b3d642f41)(content(Whitespace\" \ + \"))))(Tile((id \ + 1b28968a-f760-48bc-9258-7a09de737135)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 66c56991-9d96-4042-a8e0-9b16ecebb05e)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 9c2026d7-b415-48ca-8601-a353118432e0)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 971b24d6-846b-4a0d-9333-196d67a5a503)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 41962403-3570-4e16-9ff4-1736137a5cd7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6d6a355c-b30c-4761-9668-d0ad57f074a0)(content(Comment\"# \ + Polymorphic Functions #\"))))(Secondary((id \ + 21905b9a-a6f9-40ac-b2ba-93ee1519a867)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b3d1516a-6289-4357-8fcb-cd31a7417d3d)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 5b8e28da-aba0-477e-8ac3-2c914ee5872b)(content(Whitespace\" \ + \"))))(Tile((id \ + 24ba6503-9f9d-4a45-a61d-d651796b076e)(label(poly_id))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 9ef89114-519d-4b79-823f-2b05dad5484d)(content(Whitespace\" \ + \"))))(Tile((id \ + 86ff7c62-8a0b-4425-a223-b7ac16c8c63c)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 3c302621-20eb-44f6-8536-f816d5da4934)(content(Whitespace\" \ + \"))))(Tile((id \ + e8ce28cd-9851-4be6-9780-4360b3ddb0e5)(label(forall \ + ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ + Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ + 1))(children(((Secondary((id \ + 91b433a1-24d8-4758-b965-bd4163d1c67a)(content(Whitespace\" \ + \"))))(Tile((id \ + 1d4669e0-cbb6-4944-af0e-1c22d741a180)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 7254a615-a7a8-48a1-ab11-6779c0b71271)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 647cb177-f75f-4275-93c8-2a1ffafdcd4f)(content(Whitespace\" \ + \"))))(Tile((id \ + 19c49e0f-33a6-4085-a85b-a177d307a3a6)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + e305cb06-a4c9-4567-b53e-da97948cc664)(content(Whitespace\" \ + \"))))(Tile((id \ + 6ddee43d-97bc-421f-8f01-c54b59224b17)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 6))(sort \ + Typ))((shape(Concave 6))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + be7f44ca-2476-428a-9e0d-93f41a966d4f)(content(Whitespace\" \ + \"))))(Tile((id \ + f94def93-71b2-43ab-9214-de44941316cb)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 15c59c17-9886-4131-b1e9-f75c36da22af)(content(Whitespace\" \ + \")))))((Secondary((id \ + 20fa807d-f003-4c5c-b8ba-c85a751988c4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4023c428-e69e-46cc-9967-fd9b322373a2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8f162f53-d7a6-4465-b639-15df68db977e)(content(Whitespace\" \ + \"))))(Tile((id \ + 4bc17fc3-f298-4dda-8b28-d7e8b0b9371b)(label(typfun \ + ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + cee843ec-33e6-4a68-834d-32ae4b681de7)(content(Whitespace\" \ + \"))))(Tile((id \ + dbd2bb66-b044-4c28-aabb-f13a5611d67a)(label(a))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + 777a2a3f-f230-41bc-be78-9950f83dbe30)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + fc6108e4-b29a-426b-ad7f-b077cfa57301)(content(Whitespace\" \ + \"))))(Tile((id \ + 3efd1f3d-4d36-421f-8f51-ca1679588976)(label(fun \ + ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + c0db07e4-bdf2-44b0-8cf0-5db24f495fe3)(content(Whitespace\" \ + \"))))(Tile((id \ + a9c2455d-fc98-44d4-9176-95c40d8b0b1d)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + b38d2193-cd18-43cb-9040-0c1bf9e2a2c1)(content(Whitespace\" \ \"))))(Tile((id \ - 04d39de8-8e48-4178-92fd-7c55de92bf96)(label(:))(mold((out \ + 77573c7e-7bb7-4ac6-a478-833a4619c577)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5e645304-77ff-4fad-ad3b-c30b4a8c74a9)(content(Whitespace\" \ + b6b9a9d9-2ca7-4011-b278-12b08d33b5d5)(content(Whitespace\" \ + \"))))(Tile((id \ + def39d28-d1a1-41fc-b5b1-4ee59a258b9b)(label(a))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 049974eb-7207-4b1c-a87e-15c88cac7859)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 68d5508a-6bab-438a-b042-750232afe51b)(content(Whitespace\" \ + \"))))(Tile((id \ + e3be5166-2d7e-49c8-9352-00ad0a05eb7a)(label(x))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + cf559632-8e94-4b3d-95ee-397f79d2f861)(content(Whitespace\" \ + \"))))(Secondary((id \ + b1c3f390-b004-4c77-9b27-890ba14aa9fd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3f701bd6-acdc-4193-80c8-5017260fa6be)(content(Whitespace\" \ + \"))))(Secondary((id \ + a88f8001-3c06-4f4f-8ea9-dcb956a9a7e3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6c1bcf7d-c9f4-44c6-9c46-7caa29d2295a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f429d62b-a042-4491-9aa9-55439fd6173e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ec872627-dea0-4928-94ba-8442d3808ff9)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6f309af4-3e7e-4d80-be48-e94109383c48)(content(Whitespace\" \ + \"))))(Secondary((id \ + ae98c574-de1a-4d49-87c4-d8159b99571b)(content(Whitespace\" \ + \"))))(Secondary((id \ + a0596b24-11bc-4ec1-b102-e6e87b533895)(content(Whitespace\" \ + \"))))(Secondary((id \ + df7379c9-96c0-44e1-a299-64cb458e962d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 94be0f5d-7028-4887-8010-feaef81e8db0)(content(Whitespace\" \ + \"))))(Tile((id \ + 1a6be598-d3a2-437d-9483-1c414752ea47)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + e18ba221-97bf-43b1-a006-00e222b8ea19)(content(Whitespace\" \ \"))))(Tile((id \ - 3b25a484-b28e-43af-a80e-7e8365bd5819)(label(forall \ + 5c8719df-a29a-44c9-949e-56c5bf1b3c08)(label(apply_both))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + e5749389-d6d2-423e-b491-044d2b19bd03)(content(Whitespace\" \ + \"))))(Tile((id \ + e806bd56-05b2-47c5-8c6c-1d1067184696)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + fa40e26f-bc91-44cc-9856-cec20a912bf8)(content(Whitespace\" \ + \"))))(Tile((id \ + e7c20431-342f-4d76-9fab-e558e5234cdd)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - c1ff3499-4998-4268-918c-9020f75e17be)(content(Whitespace\" \ + 7e1226b3-e7fd-4304-8850-a7e18d432e16)(content(Whitespace\" \ \"))))(Tile((id \ - f63d3d41-02bf-44b7-b1a5-0317c4adad4c)(label(a))(mold((out \ + 700e3c27-501e-4b4e-953d-408843253b83)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 3b55cc9b-e918-4f8b-b38a-37307aaee620)(content(Whitespace\" \ + c27c2c90-6de7-4698-af81-7fd7156df1f1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4e603c8f-e99e-4c75-a3bf-531d2edb6670)(content(Whitespace\" \ + fa32d46a-b496-4211-aa6e-a7f1b1291fdf)(content(Whitespace\" \ \"))))(Tile((id \ - e65cb872-89d7-47e5-afd6-4c0d4b637e45)(label(forall \ + 72290de7-e529-49ec-9a05-da716bc19f29)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - e452b34e-bcfc-41cb-ade3-fae0fd973cb1)(content(Whitespace\" \ + 74003f70-6511-4276-bb0c-f29378988bdb)(content(Whitespace\" \ \"))))(Tile((id \ - 0c1b74a7-78f4-494b-abbc-8e5e7e8ed80b)(label(b))(mold((out \ + 2e89feb6-6e16-4754-959d-b924c6814394)(label(b))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - dd2bc5b5-65db-434c-bc3d-49a11f81a941)(content(Whitespace\" \ + 0e8af3ef-31ee-40ba-bf0f-ca84e94c2393)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a8a51091-f40f-4b8c-968b-3cfc9add5552)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 291f72b2-e4ce-414c-a6a4-bf4416fc44ad)(label(\"(\"\")\"))(mold((out \ + e7cdea39-6178-4c56-8756-dc8ff55aaed9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4ba8bb93-ddc1-4ba2-b716-a3d25a45a821)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4e411c8d-0613-4bca-81c9-ad961eea4c66)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5810c6df-7edd-40f2-ab26-316c3abef2cd)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3d9d43ef-a4c8-4558-9c3d-6321c67d0eb9)(content(Whitespace\" \ + \"))))(Secondary((id \ + fa2dd1b5-af69-4e4b-a24f-523c15c4fbdb)(content(Whitespace\" \ + \"))))(Secondary((id \ + affc9c94-bbf1-4018-91e1-06a24466a927)(content(Whitespace\" \ + \"))))(Tile((id \ + 81f0604c-ead8-4781-943e-063c54c13ddb)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - add31760-2b28-4e58-8bc6-9f74fc312809)(label(forall \ + c5b9a343-9802-4bb1-b016-c572dc42edf9)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 44616a18-392d-42b2-b3d9-f7812a96c278)(content(Whitespace\" \ + ddea8d53-3400-443e-8d70-bd38431fa369)(content(Whitespace\" \ \"))))(Tile((id \ - bb439ee2-ff72-4b03-aa57-008b8121af75)(label(c))(mold((out \ + e907d57c-b477-4744-b0c1-a5939f1cac8d)(label(c))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 7213ede9-a906-456b-88ee-65b83dec12a3)(content(Whitespace\" \ + 300d687f-39f5-4a42-a916-5c5c39dedb3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 53252b4a-f877-418e-9076-4fceca7148da)(content(Whitespace\" \ + 638d6964-980f-41f8-94e0-3510a97b38c3)(content(Whitespace\" \ \"))))(Tile((id \ - fd170ce8-5465-4fca-8041-c1a09bdc81f9)(label(c))(mold((out \ + 791406d0-15e8-4738-9de7-ac6e7c0712d4)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d52334be-a2b2-441a-9bef-7abab7219cd5)(content(Whitespace\" \ + c5890724-3d93-4da5-981c-de4c26a3bbae)(content(Whitespace\" \ \"))))(Tile((id \ - 37254076-da7b-480c-8504-591701845b02)(label(->))(mold((out \ + c2d044ec-9450-4fbd-b63c-a15bf6a61418)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 75826177-4417-4a5a-904f-ed8b9d69886b)(content(Whitespace\" \ + f7f742b3-db5d-496f-bc80-2e66f22f36ac)(content(Whitespace\" \ \"))))(Tile((id \ - 8ec0362e-896a-4d88-9b82-5f77aa55e88e)(label(c))(mold((out \ + 4ee07ef1-9c2f-4a4c-8006-b4ba21fce45e)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 96527918-267c-43c4-8367-4686952579b4)(content(Whitespace\" \ + ef2eba03-e2e1-491e-a53a-05751ea1a052)(content(Whitespace\" \ \"))))(Tile((id \ - 4289fedc-8917-4875-a9aa-fc1dc157603f)(label(->))(mold((out \ + 3d0c7625-8e86-49e2-b066-b558a4f6a100)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dc400b09-8cff-4960-9815-cf03a10cd313)(content(Whitespace\" \ + a49b4172-22fb-4502-8a2f-bfc064b95c38)(content(Whitespace\" \ \"))))(Tile((id \ - f97e5298-f46f-4aba-b588-72da6a4481b3)(label(\"(\"\")\"))(mold((out \ + baa2a430-0774-4caf-895f-873d5c1e8314)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - df016fb5-7899-46f1-9ae1-ee05527221b7)(label(\"(\"\")\"))(mold((out \ + 21e63e6c-ee32-4911-a596-9eabf9f15d3e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - caedc4a7-e936-42fa-a81e-e14b9af0c99a)(label(a))(mold((out \ + 7149dfbf-faca-42dd-a9a8-6b7ac9a3510e)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0c253c8e-0b81-4881-9d44-1c9311e2fe94)(label(,))(mold((out \ + c2273d8c-16d6-4e07-a524-0428ef184d34)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 74a87bd6-e1c3-48fc-852c-fa747d9a1260)(content(Whitespace\" \ + 1698dab5-dd69-47e8-adb0-e8c498d05ca4)(content(Whitespace\" \ \"))))(Tile((id \ - 87926cf4-eff1-4fe0-825b-1d4530a3f099)(label(b))(mold((out \ + 6dfc6dc6-f204-40eb-bd04-2767d86b73a7)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 34ba4614-a2b9-4d51-887c-7b64c0388c0e)(content(Whitespace\" \ + 49fe5923-e586-45e2-bad4-beacb36f27c5)(content(Whitespace\" \ \"))))(Tile((id \ - a3a49d69-eed7-4e2e-ab6d-4a0b02448f29)(label(->))(mold((out \ + a7f3dd27-7917-4f32-b680-c20d74110529)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6fb05060-10ee-44a3-aedb-c899740fe127)(content(Whitespace\" \ + 522303df-0ae0-42b2-b8d6-9593900b289b)(content(Whitespace\" \ \"))))(Tile((id \ - e8d20b1e-e810-4341-8ba8-ac69e4c05b20)(label(\"(\"\")\"))(mold((out \ + 0a1528e0-9e92-4202-9360-1dc078c85533)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 187de841-2392-4f78-8005-50904363f669)(label(a))(mold((out \ + 6183595a-cfad-4279-90da-73de5c63045f)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 50eae1f9-bb25-4772-865c-87b85114fdca)(label(,))(mold((out \ + 335f1e78-2738-4219-86d1-55f41fe7c63b)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5d663210-348e-45de-87ad-dcf16a5b37dc)(content(Whitespace\" \ + 57f1b625-61b5-4597-a946-9b1f52e4b541)(content(Whitespace\" \ \"))))(Tile((id \ - c0a98663-4a4c-4bc6-81c8-7fb50d85d262)(label(b))(mold((out \ + 17578625-5832-411c-bc53-60a0158c93c8)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 2ce264f7-8078-4e31-95c0-4c431c1ad9af)(content(Whitespace\" \ + 23032708-8f4b-4330-9e79-56c7b604656a)(content(Whitespace\" \ \")))))((Secondary((id \ - c9b69e4b-4f14-4ec5-8cc6-527cadfea1c7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3e3ba2c6-d258-48e0-8ef0-0244be21a24f)(label(typfun \ + ecbb892f-9a9a-47f1-af09-a80bc57b1ff9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c2a4d6fe-e3f2-4a8c-887f-07f238c5013d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 31d6bf24-5ff3-4c6a-aa06-d8dfb0073d1b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3819feb6-8c41-4c2c-bdee-1373305cd742)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1ad8685a-5f05-4a8c-9d8f-43995189ca16)(content(Whitespace\" \ + \"))))(Tile((id \ + 6ceba9d5-8233-4d5e-858b-816190623301)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 23ab0274-c237-41c9-878e-7eaf0c3630cf)(content(Whitespace\" \ + b5e6b75b-cf21-47e0-af42-4fd796ca491c)(content(Whitespace\" \ \"))))(Tile((id \ - 75539bc3-2662-46d5-87b3-2c373f7444a1)(label(a))(mold((out \ + 3e171e44-65a8-4182-a0eb-af0d55cb22fd)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 8c225c58-05dd-44b9-a077-e043dac92119)(content(Whitespace\" \ + 5d422ee8-fc19-42bd-b04e-15fd45ac89f5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b3931594-f2b1-40ef-ae01-6be4ccfa2251)(content(Whitespace\" \ + f8b796ea-c37d-4099-b7cb-0816cb2d2e3d)(content(Whitespace\" \ \"))))(Tile((id \ - b8803d9c-b91c-452f-8ef4-53dc8ad76179)(label(typfun \ + 3e0ac016-0530-432b-b91c-6c27be2076fe)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 30ee8777-4215-40f2-946b-381ae4939918)(content(Whitespace\" \ + 40809fcb-af51-4f66-8e95-973afaa4cc6b)(content(Whitespace\" \ \"))))(Tile((id \ - c7cb6018-9e8e-4ba3-8c8f-cdcbe426e7ea)(label(b))(mold((out \ + 4bda2e12-e619-4fa7-aa3a-78db78a17612)(label(b))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 54f43afa-b06d-4d32-a7e9-81581a1b20e8)(content(Whitespace\" \ + 0c385d39-545b-4eed-bb72-a76f20ceae13)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1d74f384-d764-451d-aed6-f8c7aa2880cd)(content(Whitespace\" \ + 0eb3670c-8d81-4e14-bb78-d34613128e54)(content(Whitespace\" \ \"))))(Tile((id \ - 85af1e30-a292-4291-ae09-e45bc7f26bf0)(label(fun \ + 7cfc26a4-f49f-4a09-af5b-25818b7496b3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d4b25224-6022-4b0e-bef4-e21d18a0a4c7)(content(Whitespace\" \ + baae879f-fd48-4c17-8b65-59238b80ff79)(content(Whitespace\" \ \"))))(Tile((id \ - cd079566-8b98-4eb3-bb08-67b1c1b7e64b)(label(f))(mold((out \ + c80afa8b-2d72-47d5-925e-32d21e3a197d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 51eb75cc-98c9-499e-808d-1e0d1ace3801)(content(Whitespace\" \ + 9baf2fcf-75dd-4e42-b633-a0a5045f1eed)(content(Whitespace\" \ \"))))(Tile((id \ - 7851bb5c-79a1-43e3-acfc-df9eb6687e7d)(label(:))(mold((out \ + 03463e7c-a515-42e4-bd24-a8e163876a8c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8b64e94b-e0eb-4437-8aac-eb3c4aeee75d)(content(Whitespace\" \ + 22638aca-27d9-4511-9789-590b4c79079c)(content(Whitespace\" \ \"))))(Tile((id \ - 42c0e3a1-5023-4eaa-8b46-021adebdffc2)(label(forall \ + 91ac4f01-b4d8-428e-9e91-61b9082b7311)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 8065a16b-ef88-4709-b3ea-a5d7d16902e3)(content(Whitespace\" \ + 13a9e88b-79ee-4f72-ada7-9c94e7fd2f82)(content(Whitespace\" \ \"))))(Tile((id \ - 87ef1bc2-8387-4e54-b078-c3d82e20da2c)(label(c))(mold((out \ + a8533dd8-607a-46e8-be24-93150f3f6be4)(label(c))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - f57743a1-7180-4729-b870-d36ec04b4516)(content(Whitespace\" \ + 0709b18f-2d26-413b-8102-474edcca2870)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e6ffd0b9-14f6-4eed-8e28-2f2682a42ab7)(content(Whitespace\" \ + f498dbe1-c41d-4c5d-b901-ab497d603ecc)(content(Whitespace\" \ \"))))(Tile((id \ - 03512151-7223-4a41-afca-3c25943f7b66)(label(\"(\"\")\"))(mold((out \ + 4588dbf1-6168-4a4e-9198-2d75624565a8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - fa2eeb7c-33bc-4c59-a169-3813827885f0)(label(c))(mold((out \ + 3ceb4e96-dd18-411f-9a30-345d0fa2acd9)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d8f95a47-d1f9-4679-bed8-722c3431a794)(content(Whitespace\" \ + 71e7bbbf-2dce-4b71-a29b-d2b0d814938c)(content(Whitespace\" \ \"))))(Tile((id \ - b8267832-4188-4e7c-a765-e2267110681f)(label(->))(mold((out \ + a198872a-9b3a-4960-8049-7e76fc979b2f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3cae47a4-75a5-4af2-96ec-81ed3f69c1b8)(content(Whitespace\" \ + bc85bed6-0b9f-45ed-a8e6-a7f5f083110e)(content(Whitespace\" \ \"))))(Tile((id \ - 6c19eb10-d3ce-4b8a-a26e-25964e2e6635)(label(c))(mold((out \ + d164411b-4f2f-4a20-941a-dfd67453a3f5)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 781b2a24-eae5-4210-8650-65b6aeb7af4c)(content(Whitespace\" \ + 99a0047e-4230-4e71-9e6f-c3f17f7b5272)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b9efce8a-cc83-49c1-ab11-003ba549c008)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0fcc4421-e2ae-4acd-a98e-600381d759f3)(label(fun \ + 0f2f472a-9399-4706-acce-c9a6a1d417d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 77861bd4-d59e-465b-844b-dd81a4e8cbfe)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 23ff30c8-d96d-4e72-a687-5c3221af9659)(content(Whitespace\" \ + 0ad60cad-1311-4a2f-b2f9-1b3f06d61bc5)(content(Whitespace\" \ \"))))(Tile((id \ - f0030642-eebf-4831-9207-c1620edde324)(label(\"(\"\")\"))(mold((out \ + a0fe5e4f-897e-49fd-8281-eaaec43dd461)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 5c7aaf35-69cc-4291-a14b-feb3e0178f78)(label(x))(mold((out \ + 5535941c-450d-4f60-936d-0e879eb05d57)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7feccabf-3e89-4e9e-9588-1d03b49f0849)(label(,))(mold((out \ + 9c04d0e4-dd16-406b-a490-f217b0b8908b)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 8b072199-7f98-4687-bf15-3d4c611c107b)(content(Whitespace\" \ + 1e890653-2a77-4fa8-a88e-5e90eb35f360)(content(Whitespace\" \ \"))))(Tile((id \ - b72fd085-3ed8-41e8-99b7-ba42d934463e)(label(y))(mold((out \ + 1f02e9cd-39a9-4e1d-8ab6-8839c9bc0d40)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - cedf0650-2844-493a-b0c2-2c8c54bd1e53)(content(Whitespace\" \ + 1582438e-360e-4db9-9569-300fa112a7ed)(content(Whitespace\" \ \"))))(Tile((id \ - 1bd982e5-6560-4d8b-bb39-b2749b6eabbf)(label(:))(mold((out \ + f7d9f1cb-3276-495b-8efe-5df553b3a7fe)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b2834874-9b8f-44b3-9052-8742aa6bbf97)(content(Whitespace\" \ + 7942526f-689c-4ef0-a25a-c0322e5b1671)(content(Whitespace\" \ \"))))(Tile((id \ - 642b0241-480d-4ed4-a742-9f3e5c9a938b)(label(\"(\"\")\"))(mold((out \ + 4452a803-8664-4a53-b9c7-08c6ff51eca4)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 8568f78a-3ab8-4eec-999b-d0865756e249)(label(a))(mold((out \ + a0aede4d-f0e5-426d-8a27-679fae46da01)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9e9c36ca-451f-47a6-81a5-45f2ec69f738)(label(,))(mold((out \ + c1e1d9c7-88c1-40d2-a35c-46a20aafaea9)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4bad9424-1f77-4732-935b-23c23a9a76b7)(content(Whitespace\" \ + c2614c12-9623-4a15-a6df-ad08454a6778)(content(Whitespace\" \ \"))))(Tile((id \ - 5716b4fe-4957-4916-9054-09dec38520a9)(label(b))(mold((out \ + 2618a285-c4f7-4162-beee-392581a0db95)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 61232846-9323-4b5d-81cc-0e5956186025)(content(Whitespace\" \ + 6e79655a-55ed-4521-af63-8637600af0c9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 72f69831-eafd-4eca-a77b-8ad0df9243f3)(content(Whitespace\" \ + cc5ff0c1-5d35-4adb-96b0-f5f3e02b5809)(content(Whitespace\" \ \"))))(Tile((id \ - c163a535-20fd-4f4e-967f-6e0b897f2f8e)(label(\"(\"\")\"))(mold((out \ + 71a73c4a-2bd7-427d-9cd6-9a4ed30163d5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f0270ee7-c899-4a46-a79d-0cb7aaba6ac9)(label(f))(mold((out \ + 0971d7fe-b35d-4b94-a091-e4b4630d94c9)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e8ecfa90-8e3d-4bea-8fc4-23c565bda888)(label(@< >))(mold((out \ + 1c0f9309-f717-49f8-a4a1-a8fdf3090ca0)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a1dac598-09ea-49f1-9ea7-d1515488a7fb)(label(a))(mold((out \ + c8d3b901-ac16-4a1f-8962-874c2e3c2cd4)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 0484403b-b0f5-435f-9e75-b6fd0ed77e86)(label(\"(\"\")\"))(mold((out \ + f95a0a93-f3b8-422b-8db4-490425dfef84)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ade401f4-4edf-42db-8e58-ac0c477f606e)(label(x))(mold((out \ + ef46ea90-6791-4d69-9dda-1acc34ac4f1f)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 30dd88cf-eaa5-414c-b3f6-59e5d704932c)(label(,))(mold((out \ + b0d5eebc-dc12-4565-9d04-eda76fe813ae)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c3908a3c-7bbd-44da-9ac4-8129d2b9bfc5)(content(Whitespace\" \ + e9205adb-ba87-4e82-b9b9-09a9678c2828)(content(Whitespace\" \ \"))))(Tile((id \ - 65622211-e2bc-4b7e-8a36-665df63db646)(label(f))(mold((out \ + f26167a3-9c4d-4660-a38b-3c42b64cf5ff)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7cf82fe0-6b30-456e-baac-a874eacaf6c5)(label(@< >))(mold((out \ + 58636026-9be7-41d5-85a3-a9485bf5593c)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8f6c1368-df10-4f35-ba11-c9b5425318c3)(label(b))(mold((out \ + 7c291208-3c61-4179-8751-083e803d636e)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 65efbf43-52da-4406-99c5-dc93fe360dee)(label(\"(\"\")\"))(mold((out \ + 9b97c064-3b13-47bc-ad37-43f9343f2677)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9771417a-bb21-4e95-8ac3-e9decee456b5)(label(y))(mold((out \ + d0883c1b-544b-4fe6-99a7-0872e7bc3871)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 12a7a053-92e7-48ea-a934-e8a0f177de30)(content(Whitespace\" \ + 1dcc5d9a-83a6-49da-b93f-ea38e1eeef78)(content(Whitespace\" \ + \"))))(Secondary((id \ + 444f5201-f358-4216-993f-53f907ef942f)(content(Whitespace\" \ \"))))(Secondary((id \ - 2d6598d8-5a81-4c1b-99d0-d44648d9b52d)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - ac19f6fe-afbb-435a-99d9-a5acb22ae197)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9d45c900-68da-4c6e-a3ac-6d0405e47519)(label(let = \ + 2609d6c0-0050-4991-9e29-d8a358b7f160)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + b014cb7a-084a-4c39-863f-e0a39063f87b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 628373bd-968d-42cc-8c75-2344db6c7e45)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0ec43e9b-f126-4de5-b023-7aacd7996f89)(content(Whitespace\" \ + \"))))(Tile((id \ + c72a4e9e-3777-47c5-8e00-56b52a581a09)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dd93f535-b848-4e5c-a756-c50e411bf0f2)(content(Whitespace\" \ + bfe7596b-67d9-4452-b436-d3b1ef2b9f28)(content(Whitespace\" \ \"))))(Tile((id \ - 403f0de5-bf1f-4a40-bee8-2262db450126)(label(list_length))(mold((out \ + 2c80afa2-e80d-4998-9f4e-1cffdb7339fd)(label(list_length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d66cbb56-3fcb-4bac-a4dd-7f96382ffbad)(content(Whitespace\" \ + b8acf8c6-c472-4c87-9b43-e93b602c176b)(content(Whitespace\" \ \"))))(Tile((id \ - 63f1ffd9-3a9f-4f3a-9ead-0d7b445b6974)(label(:))(mold((out \ + 2e9fa642-9dc2-4bf7-a63b-206d7f1ef6ef)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7b5520f2-be87-4599-87a6-8e3f615c19ef)(content(Whitespace\" \ + 0c314942-efeb-4d99-b242-a60c68cf852a)(content(Whitespace\" \ \"))))(Tile((id \ - 36db496e-49ca-417e-85f6-e5e05d6719e3)(label(forall \ + 3c3a1b7a-043a-4cfa-ac0d-0116b464d139)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - c5c07e47-15fc-4860-8a01-e407ebecb0ac)(content(Whitespace\" \ + eb1386ff-5e7d-4a2e-9d46-fa09b79c7429)(content(Whitespace\" \ \"))))(Tile((id \ - 2e83c7ce-9270-4328-99a3-896813679243)(label(a))(mold((out \ + 0c518f2e-0c22-4813-bc0e-8532c479794a)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - d51ce8f7-7ac6-42e1-a47a-7a71ebe3bd3a)(content(Whitespace\" \ + 8ea8b573-5e9d-44a4-83d5-207ac1b661de)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5d9c7181-e18d-47f2-9f6a-2c18ff025a09)(content(Whitespace\" \ - \"))))(Tile((id 91e76b5c-0a4c-46ee-8787-5bcb4dd6a712)(label([ \ + a4ef5319-4baa-44a4-8f2b-6f2704f237b8)(content(Whitespace\" \ + \"))))(Tile((id dc2467cb-027c-4241-9b5a-28726b9267ba)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 1f63e9e4-f571-4d83-8d9c-73da8955664b)(label(a))(mold((out \ + 92f422a8-3924-4b3e-a563-92625b4a01bd)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 5caa23d7-25da-4b82-a34b-6677a28d2146)(content(Whitespace\" \ + 796d1f0e-2a44-45a4-932d-0ae6d898a97d)(content(Whitespace\" \ \"))))(Tile((id \ - 3cf89faa-e705-454b-9e32-25bab2b73323)(label(->))(mold((out \ + b0f6cb9c-aaf0-44b7-a66f-d9d4ad80d835)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6aa37b3e-a254-4938-8193-1793f3702165)(content(Whitespace\" \ + c6891a10-0036-46ca-9b23-0f762cccc2dd)(content(Whitespace\" \ \"))))(Tile((id \ - 93a91669-02e2-4447-ab54-68b3c7637bd3)(label(Int))(mold((out \ + d95d4644-7ed4-4cb8-a1fe-9b78b4a3e98c)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e1a809d5-62e5-4c40-bca8-3e8b3cf9aa8f)(content(Whitespace\" \ + 97d341bc-1ba7-4643-b54d-ce398cf99eea)(content(Whitespace\" \ \")))))((Secondary((id \ - f3f37776-ca37-44e7-9978-a9c121b1af93)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9ab664c8-b71f-4a19-b6c6-016cd0194b82)(label(typfun \ + 0114fff0-b21a-43b2-bd8c-48ec8adcb59a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c3d2d43b-a2a1-425a-b1ec-513861324357)(content(Whitespace\" \ + \"))))(Secondary((id \ + 567c1088-ea26-402c-bc17-a5e0f7730df2)(content(Whitespace\" \ + \"))))(Secondary((id \ + f5977801-496f-4cb5-b996-3912730f5c44)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1ff474bf-92b2-4631-81cb-f9687233cdf7)(content(Whitespace\" \ + \"))))(Tile((id \ + 615a6d30-91d6-4a56-b2e3-89a5df9ddc6a)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5baa273e-1ea4-430e-8799-6991ff08fb3d)(content(Whitespace\" \ + b0aed573-0eac-48c5-b594-1b7da6e94335)(content(Whitespace\" \ \"))))(Tile((id \ - bab4faa3-5158-491c-876d-246f5b3f43b7)(label(a))(mold((out \ + 1e4a0083-e594-47c4-8840-d8968c8060c7)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 23767041-1d30-4676-8605-1e61ac42a6a3)(content(Whitespace\" \ + fe7cb769-ec5a-4799-90b2-703b0371a6a9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d543fc29-bf21-44a8-b196-928dc754c3d9)(content(Whitespace\" \ + 2042c67e-bf1d-4160-b984-ae76bd32cb88)(content(Whitespace\" \ \"))))(Tile((id \ - 85dff2fd-d0ca-422a-b66a-8813e0d92d49)(label(fun \ + 943e587a-b4b4-49a3-ba89-127c889cdac5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6be9f243-d2d8-4ebe-b34a-0b4e577cb7c1)(content(Whitespace\" \ + 90913c27-15f5-459b-b8d6-1548449acb8a)(content(Whitespace\" \ \"))))(Tile((id \ - 065752d4-cad1-480f-abfd-b7fc28aee522)(label(l))(mold((out \ + df36292d-fb6c-483e-bcfa-d8903cc22bae)(label(l))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c317a531-7f23-469c-9985-4eec64b481ec)(content(Whitespace\" \ + 7b08ff1b-c1b8-4075-a857-a663a3e8bfac)(content(Whitespace\" \ \"))))(Tile((id \ - f82843b0-431e-4276-9cba-f1933590da76)(label(:))(mold((out \ + 184a6f46-674a-4327-8344-dfef32b5347b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a5ca76f7-35f1-4cce-a63a-e98828637aeb)(content(Whitespace\" \ - \"))))(Tile((id 65bd1e2d-0aa1-4955-aff1-319571310601)(label([ \ + 5391766d-2f09-4819-a19e-f08563e9af41)(content(Whitespace\" \ + \"))))(Tile((id b84e8bd7-e78a-4cef-8090-5f2f40da6676)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - a7f625ae-958a-4075-8e03-43819845c70e)(label(a))(mold((out \ + b7ff4370-87c6-4f16-8bb2-02d1faa36a14)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 848838d9-422f-496d-82b3-5110909c93e5)(content(Whitespace\" \ + c1ce3f5f-6e59-4eaf-910c-1aad6fc76d4b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0a5548a2-2f4d-417e-8292-f7f7c24e3ae1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 242b891b-e717-4e8b-a028-a250540a8e01)(label(case \ + 6901e5a1-733b-406c-8da4-88fc8c446159)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0a553b65-1a0a-44e5-af58-8e2132a79a8b)(content(Whitespace\" \ + \"))))(Secondary((id \ + d12bad31-aecc-489e-b8ef-5438b7aa4fd2)(content(Whitespace\" \ + \"))))(Secondary((id \ + c0e2e5c6-569d-4279-80b5-e5c96737ac74)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6b014277-2512-4f55-8278-a5b5edf55544)(content(Whitespace\" \ + \"))))(Secondary((id \ + 243805d6-b7c2-4859-95e9-cdde927898de)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9d69861c-eaf7-406b-9364-50306cf99ed4)(content(Whitespace\" \ + \"))))(Tile((id \ + 30392d27-d4cc-468e-a118-8afd2536f1cf)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6b65a730-a9d1-404a-85b1-7d43a5746cf9)(content(Whitespace\" \ + 3de7660d-993f-47e4-9198-e2eb9ff6c23c)(content(Whitespace\" \ \"))))(Tile((id \ - c72a59c6-8e05-4859-b3a9-94253e58485c)(label(l))(mold((out \ + df36ee16-d2a1-4b9f-b96e-5c12b0eebba2)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e81f2058-5085-4244-a3a2-01191f11ea67)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ec896176-22e0-4b1d-ab35-6568eb97c7ba)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + 7bff881d-64f9-4a97-94b6-80d512275508)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 588e69c3-c751-471f-ad82-cc63033ce9ad)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0b134686-7ba7-4d42-9db2-116def627b67)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3b544719-593f-419a-ae1f-fda226b18baf)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5048ccc3-0827-4c7b-8ead-0fcedf0b4f48)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0c34991f-4b0e-47a8-86a3-ea7d7cef63e2)(content(Whitespace\" \ + \"))))(Secondary((id \ + e1aa9064-d97e-4f78-87d2-ff9d968382c0)(content(Whitespace\" \ + \"))))(Tile((id 4ec2373f-2309-447b-a32e-78aa2fb8ff91)(label(| \ + =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 86fec68a-6a5b-4cb0-bc0b-6081896547cd)(content(Whitespace\" \ + f14d180c-a8d1-4e18-afa4-b08087b7dac8)(content(Whitespace\" \ \"))))(Tile((id \ - 407dffa3-042a-46f1-923d-1bc189a89316)(label([]))(mold((out \ + b4ae924a-11d4-4f32-97ad-cf3328fe4600)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a34ded1f-5c79-4ba4-a288-107f88eef11e)(content(Whitespace\" \ + af6667f7-0d6f-49f8-ac87-77ca75f4e792)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5f944945-7226-41f6-9bd0-dfe2a70523e4)(content(Whitespace\" \ + 9dd338cb-01b7-44bc-9315-ce880c8608a5)(content(Whitespace\" \ \"))))(Tile((id \ - c97989b1-1c49-4cfc-82f1-b581ba6b83de)(label(0))(mold((out \ + b13d4e14-43e8-4ddc-ba98-ffade553be34)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 54ca7607-5ba5-4cfe-a7d3-4df36220b5fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 968eea76-9e8a-4a6d-86e3-a9b9794bcf5d)(label(| =>))(mold((out \ - Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + afd92b67-adbe-4e08-b9b5-9c6c97f813ee)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5ab58e72-da6b-401b-ad6f-e30afeee440d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 28839103-9cc4-41c3-aac7-edb67d8998ed)(content(Whitespace\" \ + \"))))(Secondary((id \ + 16f1c878-2ce8-4b42-85df-29ea80a4fd99)(content(Whitespace\" \ + \"))))(Secondary((id \ + bdc51dd4-b581-492c-a5a5-63cd40a0e6a2)(content(Whitespace\" \ + \"))))(Secondary((id \ + ff13ad81-d99f-48fe-904a-03f79ea9a29f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8ed26213-e5af-43ce-91eb-2d4260746f33)(content(Whitespace\" \ + \"))))(Tile((id 2dbd3d96-b70b-4479-868a-79355b651e86)(label(| \ + =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 1ea0e127-e359-4dec-aca9-76c698e4d492)(content(Whitespace\" \ + f2db281d-f277-47e1-8973-c500bf37ecd9)(content(Whitespace\" \ \"))))(Tile((id \ - 9af7fafe-f792-42b5-ae51-0147bdcdbbd4)(label(hd))(mold((out \ + ef39c864-f57e-4bca-859b-94fbc20b1f86)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cba21cc6-8663-4c13-8d7e-14e6bc982dac)(label(::))(mold((out \ + bf5f14a8-5e88-4f57-a2ed-5f03e3d8902c)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 1bb936e2-f3e2-4de1-808c-a3dacd7ab1d8)(label(tl))(mold((out \ + 2373cb1f-d6a3-4a28-a745-f7e94b29dbec)(label(tl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 05b871f7-6627-40c4-90b4-766801b96320)(content(Whitespace\" \ + 099e7937-c5b9-403f-8fec-34601a3aa617)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5ee5e886-d7d6-4472-8a39-5532d95ad8cf)(content(Whitespace\" \ + 4f4dec84-a47e-4d48-92a3-a5477c48f292)(content(Whitespace\" \ \"))))(Tile((id \ - 3a170818-668c-4811-92a2-331754f8082b)(label(1))(mold((out \ + 00a9b0b7-4108-4156-80f5-bdb7fdbeee7f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f5b30c83-cfe2-4f2e-a3e8-d13c1a76e986)(content(Whitespace\" \ + 9ac6f48c-436d-4fd4-a1b7-305ad47651b3)(content(Whitespace\" \ \"))))(Tile((id \ - 211f9123-d614-4aa9-a97d-7e3377e86202)(label(+))(mold((out \ + 3cfeebbf-f2ab-41ce-949d-d051206b2d27)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e8de7340-7c0a-463b-a69b-9679917a0ad0)(content(Whitespace\" \ + 6d3885c8-0167-4abe-92a0-d9d0ad3e4f43)(content(Whitespace\" \ \"))))(Tile((id \ - 841be9e8-a972-49cb-8903-2f2a5d7c54fd)(label(list_length))(mold((out \ + 2d754ac2-8396-48fa-b841-4ae8df670060)(label(list_length))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2a55b977-8ad2-4c5b-a97c-40b0c9cd8eeb)(label(@< >))(mold((out \ + 00be2680-19b2-4aa0-9d76-9b56e409e84d)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ad441c8c-1c72-4ff6-978d-f941a62bb720)(label(a))(mold((out \ + 04689cb7-2794-450b-b92a-6782e666e8c4)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 85d7b8c4-c920-490f-83c0-1ee2595c577f)(label(\"(\"\")\"))(mold((out \ + d6d2ae5e-ec0a-4eae-b9af-ac3f547fd57b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bc327652-195c-45eb-9411-f5e84054df9d)(label(tl))(mold((out \ + fae1a526-0717-4ee8-ad0d-4e8edfe5f7b3)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - eb12bf2c-a847-4fd1-a3bd-db6186a6b0d5)(content(Whitespace\" \ + bc0265c2-df2e-4631-bd66-94583037bfba)(content(Whitespace\" \ \"))))(Secondary((id \ - 7ca1da87-a635-463b-8252-ea491aacb9fd)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 7b644b3d-6cfa-4962-94d6-bf57646af4b7)(content(Whitespace\" \ + 816b6790-9e7a-4f32-96e3-86ae3cb5ea93)(content(Whitespace\" \ \"))))(Secondary((id \ - 75c0dc1e-ebde-4a61-aec8-efd108bcb9d9)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - c92f4179-81c3-4497-995e-3de0cb6df508)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e000a596-6d7a-4ce9-bef2-ff85bbcaea15)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 81be26d2-b132-42c1-b4f9-a4bf813ee4f3)(content(Comment\"# \ + c3b7adc6-5e31-47df-bd9f-3cbf21053ff9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b91c40f4-f1b5-437c-9c87-0932d99e5e16)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2b6c50fe-ac4d-4e53-a9ce-dacd00254107)(content(Whitespace\" \ + \"))))(Secondary((id \ + 54fd18c5-32d3-4f30-93ef-8f29be4fd84f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 4ce98eac-dac0-4f29-90f3-6dfd7310aace)(content(Whitespace\" \ + \"))))(Secondary((id \ + fe62b60a-b7e5-47d9-b19b-59650fdd7006)(content(Whitespace\" \ + \"))))(Secondary((id \ + 25b4619c-eaca-4d5e-9155-bbb461a761c6)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 4b8b041a-3fa5-45f4-ba98-d15bb725d5ec)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3f4dc1f0-c066-4517-91db-c5844867bac3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5bac1963-9f38-46e9-be75-2f48ab8bb60f)(content(Comment\"# \ Strings #\"))))(Secondary((id \ - 1c25aef1-8466-4360-9d28-ced9ff0abe47)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 63a5ad6d-f316-411f-8994-21cb41e3515a)(label(let = \ + 58d0303f-dbed-4d71-a635-b3f71b315662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3b2375a4-9840-4972-a92d-c0f964cb6351)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dae981b3-ed30-4952-a939-b118440c3823)(content(Whitespace\" \ + 61720862-c165-48d8-9a8a-9ad72afa0c9c)(content(Whitespace\" \ \"))))(Tile((id \ - a5c77b67-e10e-449e-a251-a7c191dd487b)(label(string_lits))(mold((out \ + 7b23bc56-617a-4e9b-89d1-ad1be135992d)(label(string_lits))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 41a94b00-a78a-4e0b-977d-7a6cb2db3e48)(content(Whitespace\" \ + 8a47815e-a397-47ee-bf9f-c835967f2080)(content(Whitespace\" \ \")))))((Secondary((id \ - d35160fe-22f3-4c65-926f-a3f078ac885a)(content(Whitespace\" \ + dfb7186c-be93-4396-8c31-ced29be57b4d)(content(Whitespace\" \ \"))))(Tile((id \ - ffa78f6a-7f9f-4739-a695-5b5a50328990)(label(\"\\\"Hello, \ + 9ecdcb27-fa35-4428-bc63-259c4b5183b2)(label(\"\\\"Hello, \ world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1a8cdfd1-e79f-4d35-a058-3c87efc997c2)(content(Whitespace\" \ + 95a23dfd-ae14-409b-a054-96f13d1ae86a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b5e5b3bf-b86b-4bfb-8aa1-ab371ab1d92b)(content(Whitespace\" \ + 270cafd1-3df9-46e1-84ac-580804ae9be3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 90d039e1-dde6-4e76-9c6a-41b6d0254fc1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bdc12c15-9190-45db-b10f-e72872c9df74)(content(Whitespace\" \ \"))))(Secondary((id \ - 0fba393d-eeb5-4835-97fc-d359663911fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9249adf1-4a35-4d09-b3a2-9f839beca7e2)(label(let = \ + 3d37db42-b16f-46e6-ab09-d81e86b1c52a)(content(Whitespace\" \ + \"))))(Tile((id \ + 31f46c5b-d0af-404f-8105-7d55785547fe)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2d84698c-cac3-4b9f-af80-c4cf897c1060)(content(Whitespace\" \ + 490a6dc2-b99c-4445-b0c1-e3026217ff97)(content(Whitespace\" \ \"))))(Tile((id \ - 0ebbb9d9-16a5-4159-ba1b-bafc4cf848c2)(label(string_equality))(mold((out \ + 2fffb892-9451-45d2-bd0a-fd8ebab7d9f2)(label(string_equality))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 089cc1a2-9ba9-46d0-9b37-0efa717e25e0)(content(Whitespace\" \ + 99e6499c-8bd0-4039-9d66-0d9c2e29abc9)(content(Whitespace\" \ \")))))((Secondary((id \ - dd2fa5d9-d8a9-4565-a7a8-60a73ddb2860)(content(Whitespace\" \ + be643d58-b116-47be-bd9f-3fcaa00f364d)(content(Whitespace\" \ \"))))(Tile((id \ - 8bea814f-3d94-4918-9ff4-55c2f646f640)(label(string_lits))(mold((out \ + 4b77359a-bf0c-4360-8de8-771361fa361e)(label(string_lits))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 53f72ff6-494b-42fb-a167-bd2a71c74a55)(label($==))(mold((out \ + bde501da-55cf-4911-bb2d-c87b9af7b347)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4b283101-6cec-454a-9354-7719aafba6e4)(content(Whitespace\" \ + c478c74a-ca3c-4058-b48e-282fd8ce486d)(content(Whitespace\" \ \"))))(Tile((id \ - 1fabc52b-bf17-43cb-9b7f-de5e94005496)(label(\"\\\"Hello, \ + 7da11274-3153-4429-884c-559197ad7117)(label(\"\\\"Hello, \ world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9d736b2f-ebb4-4116-b5f3-d10cafcd8cb7)(content(Whitespace\" \ + f9f77b62-b1d3-4d44-882e-730ba1a6a892)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 89ab7a55-a6e6-4c2a-b703-57627bcfd62d)(content(Whitespace\" \ + 61566670-6990-4d40-b6b6-2d622215e596)(content(Whitespace\" \ + \"))))(Secondary((id \ + ac58a86f-b5f6-4163-bfc7-673d64f765eb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d22c4388-a3b6-4d43-b623-d440a30df564)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3c093ad8-b415-471e-945c-c5caaa383ccb)(content(Whitespace\" \ \"))))(Secondary((id \ - d765ebba-293a-4496-b0e0-a6781bdb2181)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8e438991-6abf-44b8-a5a9-d7fd4ffd7b71)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d67e9efb-69cb-4955-90d4-bcdbbde5ac56)(content(Comment\"# \ + 99ae3409-0035-4de1-981f-966810ae11a9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3e8436b3-b083-4cfa-aac6-cd13178cace6)(content(Comment\"# \ Non-empty holes are the red dotted boxes around errors \ #\"))))(Secondary((id \ - 7c730fb7-91e4-4479-8427-4a47950ee90d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fb685057-83ec-4f55-911d-ee177fc5d1b7)(content(Comment\"# (you \ + 4890ee54-410a-4ad0-a38a-d18f8d55d45c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0687380d-4f3f-4234-9acd-6be3a404a2b1)(content(Comment\"# (you \ can still run programs with non-empty holes) \ #\"))))(Secondary((id \ - 01d45a83-2f1a-433a-b741-5d216dab1020)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - df9df89d-198a-4ab5-b18e-56c874402f27)(label(let = \ + 1e681c69-9f8a-411e-a86d-e681dd538943)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e0a03d34-85fb-4ac1-8059-396d6273a220)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9acb5af1-6e41-4352-8a3f-eb0a3491a27d)(content(Whitespace\" \ + 9f4799f3-308d-43bd-8e02-4aa925badd7b)(content(Whitespace\" \ \"))))(Tile((id \ - 21dbe027-4c35-4d2f-bf21-ccfd15802734)(label(non_empty_hole))(mold((out \ + 70a55fac-bcf3-4a3f-8db6-fc0120f4f9db)(label(non_empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7052ad7e-f8a1-444a-94ee-60595447c9b6)(content(Whitespace\" \ + 3a65e973-39b4-4b13-9d24-3b4e09ee8ee9)(content(Whitespace\" \ \"))))(Tile((id \ - 736a272c-b742-4ddf-bb9a-ec1f6baba15a)(label(:))(mold((out \ + c5d8bdc9-99e3-4606-a9ba-5d4bdf304a44)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - caebd505-8c02-4415-b5de-de8e56eaa51c)(content(Whitespace\" \ + bfdde046-0436-437b-ba25-5965d9feca97)(content(Whitespace\" \ \"))))(Tile((id \ - 3a5df1c3-9651-41e7-be28-bf91285a5412)(label(Int))(mold((out \ + ad09d06a-a228-4afe-8747-87f1aedd6a05)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 14524e4a-2b50-4665-a52c-532afbc5a6ff)(content(Whitespace\" \ + 4c4462dc-bf0e-443a-94f4-78cc909f9721)(content(Whitespace\" \ \")))))((Secondary((id \ - f4e5cb09-cde2-41bb-88f1-1aca59e20040)(content(Whitespace\" \ + 22750d6c-077e-454e-a21e-f7b81220ba77)(content(Whitespace\" \ \"))))(Tile((id \ - de7283f4-913e-4275-a4b1-3c979ce567a9)(label(true))(mold((out \ + 95dea374-fe49-4a0a-9568-01b7dd8e92f3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b0304380-087c-4ed3-b303-ba74db17c442)(content(Whitespace\" \ + d51038da-be51-40b0-9a7d-851099c87b87)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f1ce0419-f738-4fec-8ffe-e7b74981b9dd)(content(Whitespace\" \ + 84901d00-68bd-4994-b2a6-507756ae50b2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 41d9e44a-d87d-4320-88a5-690dfb111d58)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b3063e79-7dc9-45e2-b629-dd64f9b7301b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8ea89d98-1823-4e0c-88f9-1b0dac119547)(content(Whitespace\" \ \"))))(Secondary((id \ - 9cd7a256-0701-4615-a272-12befc6c1bd1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0069ef21-ba63-4d65-9e46-71f93f60ed59)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9e922321-33da-48e3-8c3a-5c0d1265c0cb)(content(Comment\"# \ + ceb1ab9f-f1c3-46ab-99e2-0a558fd79d40)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0f703037-7029-49d0-8947-d5334e5b8fab)(content(Whitespace\" \ + \"))))(Secondary((id \ + 255581b0-f36f-450e-830a-f5ff172113fd)(content(Whitespace\" \ + \"))))(Secondary((id \ + c77ff520-8252-487f-8249-e17140382001)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5a731951-3f77-497d-8dd4-99545da35208)(content(Whitespace\" \ + \"))))(Secondary((id \ + 41764688-3e37-4dcd-a328-95a760c5d9b6)(content(Comment\"# \ Tests, separated by semicolons #\"))))(Secondary((id \ - 280509ea-4093-4ea1-80b5-426a0a1bb227)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f32c2d9c-3f1d-435e-ae9a-de85896fca28)(label(test \ + 6908534e-dad3-49f2-a4f8-86020fc6130a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 07143109-1ce5-49bc-9fba-a287ee7ffea3)(content(Whitespace\" \ + \"))))(Secondary((id \ + b12572c9-962d-4bad-90db-7ad86e65e4ed)(content(Whitespace\" \ + \"))))(Secondary((id \ + 590e340f-6f2f-46da-bf3f-82e41acefbda)(content(Whitespace\" \ + \"))))(Secondary((id \ + ae6c12ca-f95f-43fc-9078-1331ac7c4916)(content(Whitespace\" \ + \"))))(Tile((id \ + 88fa8f3c-f0e7-4f2a-b6e1-11f84110ffed)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d8b7f7eb-8bb6-406b-bfcf-3d26cce11690)(content(Whitespace\" \ + 77744eec-e785-4af4-a60d-b5ff30311048)(content(Whitespace\" \ \"))))(Tile((id \ - f2eb7799-eaee-4740-a515-91fb3f5df7e2)(label(2))(mold((out \ + e418acd3-b340-49b6-aa00-c96543fad236)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 72bfa4ce-51aa-4f9a-ad23-04fb689d405b)(content(Whitespace\" \ + 6d8a95ca-9a42-47bd-a9fe-3b930e5514cc)(content(Whitespace\" \ \"))))(Tile((id \ - 0992f254-0ea1-4031-993e-3fe356d5169d)(label(+))(mold((out \ + 6aa06670-f933-4653-ab43-2268122bf729)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 908ced17-95ff-435f-9ecc-d781dc7874dd)(content(Whitespace\" \ + 8b1977a4-cdc8-4986-b327-be4dab2139d2)(content(Whitespace\" \ \"))))(Tile((id \ - 1a57609a-e50f-4235-91de-319c3494159e)(label(2))(mold((out \ + 33f69485-b63e-4b4b-9e86-822064f0b586)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 83a1b644-2aec-4afd-938d-9aa1bebd2bb6)(content(Whitespace\" \ + b93db22d-b0cc-469e-baa3-b76838fa4ceb)(content(Whitespace\" \ \"))))(Tile((id \ - fb258482-98ff-4de8-b800-51029145920b)(label(==))(mold((out \ + 219e200f-ad52-4f54-988f-9efe5cf5696a)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 93f2caf0-d25f-4d7a-8240-8e9876fc4030)(content(Whitespace\" \ + 1dc41bd4-2649-42ae-accb-16d878df8631)(content(Whitespace\" \ \"))))(Tile((id \ - c110f099-821c-4f37-8a51-feb2a3d32de9)(label(4))(mold((out \ + 99cf96d4-a20c-4c80-b4ed-32da36451398)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1999e76f-b7f2-4ad0-a1b0-317804c184cf)(content(Whitespace\" \ + 81e9b19c-6baa-44b9-ad02-f64483df8b45)(content(Whitespace\" \ \")))))))))(Tile((id \ - 2cd95b66-8184-4323-a0cb-720c7952e8d7)(label(\";\"))(mold((out \ + 6cb8b87d-3920-4a2c-9f6f-0f014d125a6d)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ab2fd3f6-82a8-4e67-84aa-701000cf287e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 34e04924-3437-419d-b833-1cd42c103f83)(label(test \ + 5623770c-b70a-4935-a6b2-ce8fbaa8c6e4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1efd3f69-b83d-44fe-9c80-4fdd8f9c25a5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 220a8954-d971-44dc-b598-cf469d39f2f4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 580581db-c192-43cf-8a52-b947d0bad22f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 50309097-e003-447a-8e7c-0c512fc5e0d1)(content(Whitespace\" \ + \"))))(Tile((id \ + 04b4f2ed-61be-4a15-947d-4c20498e122d)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 37d1a1b3-7a20-4213-bd2b-278c4028235c)(content(Whitespace\" \ + 9a3052c0-6574-4c5c-b2ed-fe0b867185ad)(content(Whitespace\" \ \"))))(Tile((id \ - 11eef838-d4ca-4072-a841-306e988ccdc6)(label(3))(mold((out \ + 98a95902-4575-4485-9359-9cd9de6d6db0)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3ae85d38-a185-4be6-b590-4cfc6fe62ace)(content(Whitespace\" \ + d4da9780-1d09-41ee-8d42-9b96b45cabfe)(content(Whitespace\" \ \"))))(Tile((id \ - 0f87dbe5-4162-425a-8cc8-20eef237cf12)(label(+))(mold((out \ + 592ad4bc-9ee6-48d1-a96a-1d14330bebd5)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 63d53fd7-f95f-4165-b8c6-95813a12cca5)(content(Whitespace\" \ + 0ce57269-3491-461c-9e95-8e8b0d4a10c8)(content(Whitespace\" \ \"))))(Tile((id \ - 59aff442-6297-4ecd-8706-bf1444141acb)(label(3))(mold((out \ + 5d24cee7-542e-4d93-8fe2-8ab635372fc6)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fe547cc5-a678-40db-950e-5e6b877f0e8a)(content(Whitespace\" \ + 7313bcf4-de8a-4e0c-a138-9961561f403a)(content(Whitespace\" \ \"))))(Tile((id \ - 113fbb74-688f-4ddb-8e50-d426adbaba34)(label(==))(mold((out \ + 28675a70-eee0-44a8-8347-00cbc4d7546f)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 611820f6-d903-494a-ae14-c1513a933077)(content(Whitespace\" \ + 24d648e1-0409-4e54-90d7-55141b0fa75d)(content(Whitespace\" \ \"))))(Tile((id \ - 8ea484d5-52f8-49cc-85f9-c1f18c5d0bd5)(label(6))(mold((out \ + c9b12223-09de-4701-bbff-974c17a30cdb)(label(6))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 023a862d-ccf5-4313-b415-c5b247beec58)(content(Whitespace\" \ + ded5d4da-d7d9-4ed7-8934-661d185a2586)(content(Whitespace\" \ \")))))))))(Tile((id \ - 7c3238d8-bb89-448c-859c-082a1ebeae7a)(label(\";\"))(mold((out \ + 55d79da7-e1da-4b97-9d63-7a747264494b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1f0aaaf1-4d41-41de-aca7-4d2252f790d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cf07ce1f-9c51-4dee-ab73-f105e2cbec15)(label(test \ + 5cbccfd5-cadd-427f-b5bc-6cfff9ce04e0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c7664484-8bbb-42a0-b0e6-b371520a4519)(content(Whitespace\" \ + \"))))(Secondary((id \ + cca0f31c-b1fb-4c0c-81b7-eff729a73794)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2fa94075-6cc5-4dac-bf9b-02aebaa7ebf6)(content(Whitespace\" \ + \"))))(Secondary((id \ + b1a22630-8885-4245-8612-f21251ba5bd7)(content(Whitespace\" \ + \"))))(Tile((id \ + db9a0538-900f-433e-827c-02b963833458)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 99e448a2-9c36-4a61-9300-242b253f16de)(content(Whitespace\" \ + dcd0187b-fc56-44f5-be6c-6e0501d735bb)(content(Whitespace\" \ \"))))(Tile((id \ - 4697d878-1b11-470e-8e98-72237b4310a1)(label(2))(mold((out \ + 658f1349-d280-47e6-b76d-db2bfab4e92e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 61f75f40-709b-46cd-b78d-a320bc8414de)(content(Whitespace\" \ + dc329ada-5d12-40e1-b1e6-48c3f0444050)(content(Whitespace\" \ \"))))(Tile((id \ - 44cdc0f6-d8c3-416e-9e2f-8236bc659cb3)(label(+))(mold((out \ + 6b01ef73-cfe7-4493-b31d-cfb92c46b78a)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a11fda10-6b67-466d-88f7-8d4f603dcbe1)(content(Whitespace\" \ + d13432c5-c670-4801-96b5-de6bc44b0875)(content(Whitespace\" \ \"))))(Tile((id \ - 1c3902ea-ec1d-4dd7-993a-a1ce47acdbdd)(label(2))(mold((out \ + 5b4c7010-fd9c-4963-a01f-614e3993c9bb)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b22a5955-9a61-425f-bdb8-0a9409c2709a)(content(Whitespace\" \ + f9d4fb7f-9685-4af6-a138-751a2ee6d8f8)(content(Whitespace\" \ \"))))(Tile((id \ - a5b0713d-be19-4706-9a3b-ed9983d7251d)(label(==))(mold((out \ + db5c1539-3758-4648-89b1-839e4adbaef7)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5ff4f9b1-1b5d-41ba-a079-61d7ed7fa901)(content(Whitespace\" \ + e8c1bcbe-b61c-4c9e-a590-2c5e99cec323)(content(Whitespace\" \ \"))))(Tile((id \ - 3ed88b6b-f9e6-4268-9dd4-b87028337406)(label(5))(mold((out \ + 9aa46b83-ae1b-43ba-a113-0c3245a368c5)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 56b09308-0d91-484b-9d37-5fb1f60aa364)(content(Whitespace\" \ + 142c3764-a337-422b-8d55-ceb69387770d)(content(Whitespace\" \ \")))))))))(Tile((id \ - dbf09c9c-e2f7-4e55-bfbe-e9d66efe53ea)(label(\";\"))(mold((out \ + cbf13608-9803-468b-9c9b-66a146e8cc10)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 01b2d627-b6e7-4574-91d5-2345dfba957e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 49a233c2-ccc2-4cdd-9bf0-701112f86240)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 06a8b0f4-4b4b-441d-ae1b-45f8df09c7df)(label(2))(mold((out \ + 5c62fcd1-81e3-4c01-8414-7033079b0804)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cc9675bf-e36a-49e1-a696-cd382856dff1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2d6065b8-b51e-4853-85ff-2941dc799c6d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 460cde98-3cf7-4229-8b39-53dd253045d8)(content(Whitespace\" \ + \"))))(Secondary((id \ + 536b2b4d-7c22-4949-a718-386b98a6039c)(content(Whitespace\" \ + \"))))(Secondary((id \ + a1ef8654-e7f0-4579-8fde-3db994bd6fd9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c74d7cbb-167b-4b38-85bc-2de8b78de9b7)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1bdc7160-97a6-4d7c-8bbd-f3e6f3f76c49)(content(Whitespace\" \ + 25eea2a4-f1a8-40ef-ba42-6875f18135e3)(content(Whitespace\" \ \"))))(Tile((id \ - 256c7b46-926b-4a6d-ae23-4dc63a2951ff)(label(+))(mold((out \ + 7b254427-cde0-4698-893c-17a77935d078)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5b9b6164-2655-4f4f-9823-0af8bbc1f9a8)(content(Whitespace\" \ + 2dd8ea4d-225a-46d0-9f5f-a9e0f6b33f0f)(content(Whitespace\" \ \"))))(Tile((id \ - 812d1ab8-0802-40a8-8f7c-21a4b2c012a5)(label(2))(mold((out \ + 4576997b-1ed3-4563-a37a-989fd5b21539)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ Outer)(projectors()))"; backup_text = "# Hazel Language Quick Reference #\n\n\ # Empty holes stand for missing expressions, patterns, or \ types #\n\ - let empty_hole = in\n\n\ + let empty_hole = in\n\n\ # Integers #\n\ let int_lits : Int = 1 in\n\ let negation = -1 in\n\ @@ -11363,30 +12470,30 @@ let startup : PersistentData.t = let int_comparison = (10 == 10, 1 < 2, 2 <= 3, 3 > 2, 2 >= 1) \ in\n\n\ # Floating Point Numbers #\n\ - \ let float_lits : Float = 1.5 in\n\ + let float_lits : Float = 1.5 in\n\ let float_artih = 1. *. 2. +. 8. /. 4. in\n\ - let float_comparison = (10. ==.10., 1. <.2., 2. <=.3., 3. > \ - .2., 2. >=.1.) in\n\n\ + let float_comparison = (10. ==.10., 1. <.2., 2. <=.3., 3. \ + >.2., 2. >=.1.) in\n\n\ # Booleans #\n\ - \ let booleans : (Bool, Bool) = (true, false) in\n\ + let booleans : (Bool, Bool) = (true, false) in\n\ let conditionals =\n\ - let (x, y) = (2 + 2, 3 + 3) in\n\ - if y > x then 1 \n\ + \ let (x, y) = (2 + 2, 3 + 3) in\n\ + \ if y > x then 1 \n\ \ else 2 \n\ - \ in\n\n\ + in\n\n\ # Tuples #\n\ - \ let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, \ - 3)) in\n\ + let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, 3)) \ + in\n\ let (a, b, (c, d)) = tuples in\n\n\ # Functions #\n\ let y : (Int, Int, Int) -> Int =\n\ - fun (m, x, b) -> m * x + b \n\ - in\n\n\ + \ fun (m, x, b) -> m * x + b \n\ + in\n\n\n\ # Recursive Functions (arrow type annotation required) #\n\ let double_recursively : Int -> Int =\n\ fun n ->\n\ - if n == 0 then 0 \n\ - else double_recursively(n - 1) + 2 \n\ + if n == 0 then 0 \n\ + else double_recursively(n - 1) + 2 \n\ in\n\n\ # Mutual Recursion (bind tuples of functions) #\n\ let (even : Int -> Bool, odd : Int -> Bool) = \n\ @@ -11398,45 +12505,61 @@ let startup : PersistentData.t = let list_literals : [Int] = [1, 2, 3] in\n\ let length : [Int] -> Int =\n\ fun xs ->\n\ - case xs\n\ - | [] => 0\n\ - | hd::tl => 1 + length(tl) \n\ - end \n\ + \ case xs\n\ + \ | [] => 0\n\ + \ | hd::tl => 1 + length(tl) \n\ + end \n\ in\n\ let has_at_least_two_elements : [Int] -> Bool =\n\ fun xs ->\n\ case xs\n\ | [] => false\n\ | hd::[] => false\n\ - | a::b::[] => true \n\ - end \n\ + | a::b::[] => true \n\ + \ end \n\ in\n\n\ + # Algebraic data Types #\n\ + type Exp =\n\ + \ + Var(String)\n\ + \ + Lam(String, Exp)\n\ + \ + Ap(Exp, Exp) in\n\n\ + let exp_equal: (Exp, Exp) -> Bool =\n\ + fun es -> case es\n\ + | Var(x), Var(y) => x$== y\n\ + \ | Lam(x1, e1), Lam(x2, e2) =>\n\ + x1$== x2 && exp_equal(e1, e2)\n\ + | Ap(e1, e2), Ap(e3, e4) =>\n\ + exp_equal(e1, e3) && exp_equal(e2, e4)\n\ + | _ => false end in\n\n\ # Polymorphic Functions #\n\ let poly_id : forall a -> a -> a =\n\ - typfun a -> fun x : a -> x \n\ + \ typfun a -> fun x : a -> x \n\ + \ in\n\ + \ let apply_both : forall a -> forall b ->\n\ + \ (forall c -> c -> c) -> ((a, b) -> (a, b)) =\n\ + \ typfun a -> typfun b -> fun f : forall c -> (c -> c) ->\n\ + fun (x, y) : (a, b) -> (f@(x), f@(y)) \n\ in\n\ - let apply_both : forall a -> forall b ->\n\ - (forall c -> c -> c) -> ((a, b) -> (a, b)) =\n\ - typfun a -> typfun b -> fun f : forall c -> (c -> c) ->\n\ - fun (x, y) : (a, b) -> (f@(x), f@(y)) \n\ - in\n\ - let list_length : forall a -> [a] -> Int =\n\ - typfun a -> fun l : [a] ->\n\ - case l\n\ - | [] => 0\n\ - | hd::tl => 1 + list_length@(tl) \n\ - end \n\ + \ let list_length : forall a -> [a] -> Int =\n\ + \ typfun a -> fun l : [a] ->\n\ + \ case l\n\ + \ | [] => 0\n\ + \ | hd::tl => 1 + list_length@(tl) \n\ + \ end \n\ in\n\n\ # Strings #\n\ let string_lits = \"Hello, world!\" in \n\ - let string_equality = string_lits$== \"Hello, world!\" in \n\n\ + \ let string_equality = string_lits$== \"Hello, world!\" in \n\ + \ \n\ # Non-empty holes are the red dotted boxes around errors #\n\ # (you can still run programs with non-empty holes) #\n\ - let non_empty_hole : Int = true in \n\n\ - # Tests, separated by semicolons #\n\ - test 2 + 2 == 4 end;\n\ - test 3 + 3 == 6 end;\n\ - test 2 + 2 == 5 end;\n\n\ + let non_empty_hole : Int = true in \n\ + \ \n\ + \ # Tests, separated by semicolons #\n\ + \ test 2 + 2 == 4 end;\n\ + \ test 3 + 3 == 6 end;\n\ + \ test 2 + 2 == 5 end;\n\ + \ \n\ 2 + 2"; } ); ( "Projectors", @@ -11444,525 +12567,704 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 6d57dde6-dedb-4193-8367-8939f9b7f6b2)(content(Comment\"# \ - Below are two fold projectors: Simple & Info \ + 280b7b4b-b943-4996-80e5-cdb5abd066a1)(content(Comment\"# \ + PROJECTORS #\"))))(Secondary((id \ + 766f1c8f-7857-4dbc-bf8f-64354e9ae6db)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ba63231e-2089-4526-a518-779a53eb584f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f7a53c70-80bd-4c47-9fce-8253de57ff18)(content(Comment\"# Some \ + kinds of syntax have dedicated GUIs. \ + #\"))))(Secondary((id \ + 93781f86-8990-4f1b-ae8f-c01314579727)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4bd3ff73-690c-443e-b0e7-35c95ea2181d)(content(Comment\"# The \ + menu at the bottom left shows which GUIs \ + #\"))))(Secondary((id \ + 8d1883a0-0e1e-4cca-acf5-184bdd52e5da)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b9bd5d24-df0b-4c30-bd27-9c1721db39b0)(content(Comment\"# (if \ + any) are applicable to the current term \ + #\"))))(Secondary((id \ + a624994d-af3b-4043-a0f8-3f39bcbb925f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b4273de7-e9ce-4798-bee0-e524a5c61f95)(content(Comment\"# \ + indicated by the caret. \ + #\"))))(Secondary((id \ + 5e496bc7-b23d-496c-a96e-123d295277c2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b68d1612-63b3-48ef-a28b-77d88c0582cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 00402a1e-72d0-41c7-9cc2-cd95ed469787)(content(Comment\"# Fold \ + projectors cover terms with abstractions. \ + #\"))))(Secondary((id \ + 978c8b35-e5f9-4dca-9460-cd4eac5b8111)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7b6a6697-9f1f-442f-8705-6e6840cadb80)(content(Comment\"# 1. A \ + simple fold roles up any term, replacing \ + #\"))))(Secondary((id \ + 7a5aa2ff-9c8d-4982-960c-d87c9e46b513)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fbf2618a-324e-47ed-9f91-aa1b511f0a69)(content(Comment\"# \ + it with ... until it is expanded again. \ + #\"))))(Secondary((id \ + a831e29d-cae2-4fd2-a4b5-5060bfebf766)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8a2e26ae-278e-4bfe-af6e-238630e04ada)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5e2cfb81-cbcc-4d1c-9c2e-c6d6f8ebe534)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + c4fb52f8-000d-4bc4-8166-5ffa254d7c1a)(content(Whitespace\" \ + \"))))(Tile((id \ + cecbbf14-d168-4734-bf64-dbb3c2b36939)(label(fold))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 23813631-1200-4261-a425-8c9e24b61900)(content(Whitespace\" \ + \")))))((Secondary((id \ + 35d8b40b-6450-4ced-849c-cb1900d650d4)(content(Whitespace\" \ + \"))))(Tile((id \ + 2945304f-410e-4c9e-8bef-8dbc37fa52ea)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 07430b2e-df7c-4279-b71c-cf218fbfa822)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 0f3bce5d-b744-4202-a3b4-501bce254cb9)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 5bff7cde-221d-4c2d-8b00-6643566bd9c7)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + c0d204a9-c497-4162-a7c8-364ea067255f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 410bac0e-1f28-4397-be70-14370200763f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2f4553a6-bcfe-40f6-9aa6-d0ebdd1fbdc2)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + a43bd734-2881-4b05-b5ba-c2edf273d4b8)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 7885c8da-7be9-45de-8bed-50eb1adc354d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 84954b03-8fcf-4144-b9aa-de5ba758a525)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 77a0b4d4-2d4c-4bd3-84ff-bba42abb69dd)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 2b0b66e2-64e7-410d-a10f-f061938be285)(label(\"()\"))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(Secondary((id \ + a36475f6-d8c0-4560-b9b1-32c50ae03e44)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0d42c14c-2a2c-4418-89d9-a488e5970c19)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d9346ab6-c129-44b1-b8f7-555da8036997)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ae3579bd-d7a9-47b4-8bcb-c37878dc92a0)(content(Comment\"# 2. A \ + semantic fold covers a term with a property: \ + #\"))))(Secondary((id \ + c6eff3bc-2910-4bd6-bf10-be121a9d361c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 276e6c8b-09f7-4819-8a52-de19f6372852)(content(Comment\"# \ + Click to toggle inferred & synthesized types \ #\"))))(Secondary((id \ - 38f13118-6bc6-4162-8907-ddb1a942dc2d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dc707c96-79b1-4526-a66e-6136b507fdb8)(label(let = \ + 67498fd2-30b6-44ea-9a9b-b9548acfece2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b5beec34-3f84-4026-b1d7-4162502d8f78)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ee4ca68b-1662-44db-aee0-23a9ef8a589f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8d80e7d2-79df-4b4e-8518-9f41c4cbcb60)(content(Whitespace\" \ + 0a84de08-707a-4054-bdfe-2f6053dd72dc)(content(Whitespace\" \ \"))))(Tile((id \ - 175520a7-098f-4d6f-9483-299e6a95c358)(label(folds))(mold((out \ + 3c52b2b5-5144-44dd-a698-4cadf330c295)(label(folds))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5ddc0bda-829a-4cda-aa74-ed26cf0a87d7)(label(:))(mold((out \ + 6db2b3ee-50ca-4a88-add5-be4c2019412e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f9b1771d-ba6e-4f4a-8d0f-43ebe4246a04)(content(Whitespace\" \ + ba46f14e-1478-409e-bfe5-29769c84748b)(content(Whitespace\" \ \"))))(Tile((id \ - 59030dfd-2230-42c4-a2be-e300c627bfc6)(label(\"(\"\")\"))(mold((out \ + 1a1e3b78-a600-4569-9859-ea95d7328e35)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f2fdca8d-f0de-498e-b8da-7f4acf7182f0)(label(Int))(mold((out \ + 49883be7-eb2c-4c04-bb5e-4f49038e1588)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fe701554-a951-47bb-b11a-dbef142c6aec)(content(Whitespace\" \ + 529e44b0-2b0c-40b6-817b-51e53e3f5b86)(content(Whitespace\" \ \"))))(Tile((id \ - f4dc1c7f-8b06-44c5-9b52-430478f31d0b)(label(->))(mold((out \ + 2bbaae92-0510-418a-b44b-4990f0130c8f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 36fb688b-56e5-4956-ad62-69c96e400bdf)(content(Whitespace\" \ + 618f9a66-b151-46a8-a848-6fedd59fde17)(content(Whitespace\" \ \"))))(Tile((id \ - bcecf64c-90f2-4df4-b5bb-c9019a49b20d)(label(Bool))(mold((out \ + 70d91831-a709-4b72-a413-b3f6116c9786)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 235cbff0-5607-4ed9-82b3-5f9ee65061f1)(content(Whitespace\" \ + 1351b6ac-e6b9-4661-9dde-0a70f3faaa9a)(content(Whitespace\" \ \")))))((Secondary((id \ - 494dc41b-e83b-480a-8398-5bd9e6bc8740)(content(Whitespace\" \ - \"))))(Grout((id 8935d807-0b39-468f-9ada-eaa0124d2f4d)(shape \ + 1043a9df-4b7b-46e0-aafa-eb42eb4a76ca)(content(Whitespace\" \ + \"))))(Grout((id 68f1e62e-a9ea-49ee-8b23-4c8934f9bdca)(shape \ Convex)))(Secondary((id \ - 26c18402-aec3-4998-8e69-26f9292f7e59)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 19d3c93d-ba0a-4420-abc5-5a4a76f863e5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2e8148b6-8fd8-4416-a03b-db9b3fb1088c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2a1f67a1-880b-470d-a952-37ff37ed2439)(content(Comment\"# \ - Three base types have inline livelits #\"))))(Secondary((id \ - 3fb88a68-cf88-46fb-b238-86e9b8a9954e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e910ed34-02ea-4e69-a5f0-8754c94dd048)(label(let = \ + c6bd410a-0619-45ac-afeb-fbec4841eb3f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 7626d7be-0125-4562-9d5c-789f6662aa54)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fb2c0cb0-f97b-43e4-853d-d9fd06e9a056)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b883396f-5f50-4b3f-84e9-054fa50dd391)(content(Comment\"# \ + Projectors on literal data are called livelits. \ + #\"))))(Secondary((id \ + 547bda6a-4a5d-4584-985f-6631b54bfaec)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a720cb86-a73a-4e6f-92b1-294ff4d96e6e)(content(Comment\"# \ + Three base types literals use inline views: \ + #\"))))(Secondary((id \ + b1e3cb0a-cbeb-410a-a88d-a30c5ec3e2cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cce01246-ec26-419d-824b-0deb82f56a65)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 83a82bce-96b7-40bf-904b-45b94576b533)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0994b9e7-b4d3-4532-8f8a-b29f88f1423a)(content(Whitespace\" \ + 0cf3d18a-7e60-4397-ac79-1fda65e74203)(content(Whitespace\" \ \"))))(Tile((id \ - d7572849-d4ab-41c0-ae0a-584d31b878af)(label(guard))(mold((out \ + 46da3e9e-5e21-4ec8-a39a-f8e9f4a7c3a0)(label(guard))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e3b4c946-d4a1-43eb-9a7a-7dc97f111856)(label(:))(mold((out \ + c2439a0f-7a55-413a-8155-213f94d73c5a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f3820fe7-91a6-4232-9610-8eaacd0008c0)(content(Whitespace\" \ + 2502d279-371a-40c9-b0b8-4d959887bc5e)(content(Whitespace\" \ \"))))(Tile((id \ - 141eac0a-de77-4a72-9a28-e0d997e1c10b)(label(Bool))(mold((out \ + 70653dae-ea88-4917-9f03-b9a3cfb3d73b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f12b8fef-14b1-420e-b0ee-f7bc7f87aac8)(content(Whitespace\" \ + fb86db7a-948a-405f-b53c-a25cf5f01849)(content(Whitespace\" \ \")))))((Secondary((id \ - c9f7a615-6962-4273-9439-60a2b1305461)(content(Whitespace\" \ + 86922ad1-1a63-4407-85a7-99b70be40fd7)(content(Whitespace\" \ \"))))(Tile((id \ - d3c0d680-bfde-4279-adba-79b3a4a64d61)(label(true))(mold((out \ + e442c25d-463b-4706-a43f-393a37010a8e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d7a4ec3d-3e1d-4471-af0f-fbe26925041e)(content(Whitespace\" \ + 59100198-9b0d-449c-b56e-4e5ad29354a0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eac9883c-b913-4a3b-a3ad-04d7f80df919)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f013d7a-1829-4d42-832f-79241473aa8b)(label(let = \ + ac3a595e-a0bd-4437-9822-8368184bdc94)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 26566629-5133-42ce-bc09-1f693eb1022a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 81be0355-7832-4553-a742-fb61b488cb1a)(content(Whitespace\" \ + b920c3cd-bbc7-4f0a-9542-407e62c87faa)(content(Whitespace\" \ \"))))(Tile((id \ - d0bd7838-a427-4f72-bc2b-d137030d4ca3)(label(phase))(mold((out \ + 812de672-73b0-42df-be0a-f5d9d6c5075c)(label(phase))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a22da0d7-5999-4a57-a398-979ebb2fe682)(label(:))(mold((out \ + a12bd57e-fca5-4d8e-aa90-a8473f09f756)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a47bcfd4-e6b7-4eca-9f85-38f1e5e6c109)(content(Whitespace\" \ + 6bf29a13-826c-4607-8307-4c98f11ce27c)(content(Whitespace\" \ \"))))(Tile((id \ - 431a404b-c52d-4e11-81ff-732dde7bf942)(label(Int))(mold((out \ + 4e030864-2e72-494c-8a3c-0f80cc75491e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - da3a6608-0bff-48ef-bb86-9aed4853c789)(content(Whitespace\" \ + 79357eb1-b5e7-417f-8022-6ce8ee465205)(content(Whitespace\" \ \")))))((Secondary((id \ - b8da7817-275c-4915-8e03-983998f51b80)(content(Whitespace\" \ + 1f740563-096f-447f-95f9-5ae8df0a9c0b)(content(Whitespace\" \ \"))))(Tile((id \ - 9f5fefb9-9cf6-430f-a507-17d7fdf96788)(label(60))(mold((out \ + f5ebef37-c9e2-43cf-867e-f150c01f04e9)(label(44))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f1adc445-664e-4d8b-91d7-9c8622a63792)(content(Whitespace\" \ + 2cbdbb93-0799-4f0c-b2f6-db814d71a4c9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 91ae68fb-7743-4328-b251-21c5f11bfeb3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 30cee712-1204-48d9-9efc-949a87819972)(label(let = \ + ea2bb344-8a45-487a-97bd-2a3843db5b73)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1dc9ff7a-58df-47ec-b759-f9349010a68d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5a6b408d-f769-41b6-bb22-e733ad4ca98e)(content(Whitespace\" \ + 57997e4a-e8c2-4386-9e06-786d05e4b630)(content(Whitespace\" \ \"))))(Tile((id \ - 4ec8b506-d376-45c4-9120-12f2cd994e06)(label(float))(mold((out \ + 9e080b3b-d60d-4870-8fa9-1d82acd49079)(label(float))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 70efa900-4a47-4e28-8fef-8065ef34e2cd)(label(:))(mold((out \ + b72854ba-89a7-4eda-89f6-c50cc80b7c46)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cb0c8366-ad34-4348-9735-243bfc6278cf)(content(Whitespace\" \ + add215ee-692e-48d8-bc93-6e9865febdc4)(content(Whitespace\" \ \"))))(Tile((id \ - 2e7403b8-e4bd-4c4a-94ab-c7adb97426ed)(label(Float))(mold((out \ + 2e10542c-4337-485e-b07b-e49ba226b515)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a3359874-326e-43e2-8af6-4437013efabb)(content(Whitespace\" \ + 359cc723-833f-4011-9d2c-d434f1e348cd)(content(Whitespace\" \ \")))))((Secondary((id \ - 86e2f9ed-b6e4-4738-b071-2e36b608b902)(content(Whitespace\" \ + c463b59e-b70a-4dd4-8ee8-b51b1970632e)(content(Whitespace\" \ \"))))(Tile((id \ - d59f30c5-c4e0-4182-be6a-666baba654ea)(label(55.00))(mold((out \ + ae2f057e-f44f-4f3b-9fe7-b32acb7881fa)(label(79.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f2b7fe69-0757-4bed-9e7c-730225e64bc3)(content(Whitespace\" \ + 25142929-c5e9-4f93-a3aa-306725561306)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9ba63df4-25b7-459a-ad02-eaee7f6c4459)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8089e622-2048-4f62-bd02-d7c10a9850ef)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 02a23871-c9de-4342-a2b1-5471de100b9e)(content(Comment\"# \ - Inline error decorations #\"))))(Secondary((id \ - 6cdbe887-aa46-424e-91c5-66d30e9170dd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fbece650-1e89-41ca-aaf8-43dc0025bd8e)(label(let = \ + 82c12081-b144-4bf9-b46a-f4d83dc2875d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 25bf6d5f-03e4-4aa7-a428-c031caef715a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1e16ae63-8b4a-4f01-9ea7-1e549409a70a)(content(Comment\"# \ + Inline error decorations (same as for tokens) \ + #\"))))(Secondary((id \ + f40c4d9b-87f2-4628-8f86-c0591c56183e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a69a9b53-5e7c-420a-942d-a4a960dcb3a8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c97ed5c7-4f87-4d67-9abe-548c077959e8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fa75dfd4-7ba9-4170-85c5-b92078ef5ea4)(content(Whitespace\" \ + 8b363368-f90b-4003-8193-c6d3636762e4)(content(Whitespace\" \ \"))))(Tile((id \ - 9241e4dd-92ce-481a-9574-93b3155b6b91)(label(\"(\"\")\"))(mold((out \ + d0f6f1d9-d59c-45e1-bcce-0a645bbfc9ca)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 65be95aa-a6cd-4cc0-8a34-33919a9f2293)(label(a))(mold((out \ + e02342a5-d205-445f-8f43-30b04f8cdeec)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5b541706-78dd-4c32-81bc-c7be32e7572a)(label(:))(mold((out \ + 033d035f-d0f0-4d3f-bc6a-30443e136342)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - b9f6fcde-289c-45f2-b9d4-3d0135f07640)(label(Int))(mold((out \ + 01e70002-1425-44ff-b2aa-6b82fda66a31)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d3f084fb-44ab-4bab-9663-d90b8626daf1)(label(,))(mold((out \ + c1fdfe0a-bb00-4071-9f9f-ab26980893e1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - de16a5bd-2800-43d1-8309-eba789709771)(content(Whitespace\" \ + 06c48451-d284-4c04-9dae-638a9c45021e)(content(Whitespace\" \ \"))))(Tile((id \ - aa5f9143-3c81-4c64-aec6-f17eb71a742e)(label(f))(mold((out \ + 93cb7452-5382-42ea-8528-271b34d752a9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0be9678d-c931-49a9-90ff-2d4df59123a7)(label(:))(mold((out \ + d161607d-84e4-441d-9ef7-f131c57c7071)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7ddf445a-875b-412b-a1e7-2b7d711e1b49)(content(Whitespace\" \ + e483d261-9d3b-4a37-9244-9955499ff701)(content(Whitespace\" \ \"))))(Tile((id \ - fd597605-4507-41d3-9577-db3f39079bc9)(label(Float))(mold((out \ + dce2f146-2b00-4696-b7b6-4808b97c9cc4)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 74e6702a-76ee-41b2-a487-fb9cc9ae7d9b)(content(Whitespace\" \ + cd47235b-b8bb-4ef7-87f0-67fc20e9cd02)(content(Whitespace\" \ \")))))((Secondary((id \ - c3ce78ea-3675-4bed-964e-e464eb35664d)(content(Whitespace\" \ + caa6545b-2662-4f4b-b3e6-419d89d6eeaf)(content(Whitespace\" \ \"))))(Tile((id \ - eecb808d-a186-45fb-8d0a-0c09e9dd87bc)(label(true))(mold((out \ + 7bc7eb1c-f0ee-48b0-a0cd-aca0aae535ac)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bbf0fcd0-334a-4169-8e3e-51508225ad5d)(label(,))(mold((out \ + 5d0f275b-fbca-4f59-a5b6-c310f7e6ed1f)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a23f625a-0115-4fde-9450-31f81b763935)(content(Whitespace\" \ + b466818e-7b04-4b3c-846c-4109fbba2066)(content(Whitespace\" \ \"))))(Tile((id \ - 432c81db-6a1e-4004-9568-cb79e7e879df)(label(45))(mold((out \ + ec1558b2-04e6-4323-87ea-2dbfd87a485b)(label(28))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ff0da802-0af3-4c8a-a6ab-8764d6157a68)(content(Whitespace\" \ + 6e45a7c7-f161-47cd-a62f-9c16ab76ebf2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 455f3773-b7c7-428f-9b0a-41bfda38e704)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ed5febe8-551b-4a9c-8ead-3cfb1a2c46e2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - eca88f41-ffc1-40c6-b817-67fcba0187d7)(content(Comment\"# \ - Strings get a multiline view #\"))))(Secondary((id \ - 3319c676-d73c-41ad-9719-18c4c4593a5e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3db2a667-a0ef-4898-b396-910811f90129)(label(let = \ + 88f8d592-8b65-44b5-9b10-1174dbc37836)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 39f9992e-3311-4961-9351-722ca50e0b77)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 96a2bf4b-407e-46fb-8248-4d19bbddc48f)(content(Comment\"# The \ + String base type get a multiline view: #\"))))(Secondary((id \ + 9d1a4033-0dc8-46f8-97da-7d28862984f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9c4e9570-ce0a-433e-912f-51e3fe93806a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3b58d58f-1404-4186-abfa-e9af3020898d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1cf125cd-8ded-4d6c-9807-eb8d7ce621b2)(content(Whitespace\" \ + 0442afe8-f16d-4248-bfc1-550681fedf8a)(content(Whitespace\" \ \"))))(Tile((id \ - 7bec43f7-2af7-4b75-971e-66d30e0fd097)(label(_))(mold((out \ + 30ac0494-d544-4779-a7a0-f7cc11594c74)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d82a62e4-8090-43e6-b92d-3a795dffe7bd)(label(:))(mold((out \ + 9fd3d279-4019-4090-96a3-bcf11ea663d0)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e6ce38bb-71db-4616-9ab0-8ba9a74f9632)(content(Whitespace\" \ + 5cdef717-1253-4c2e-b375-28db0a248387)(content(Whitespace\" \ \"))))(Tile((id \ - e6286324-15af-433d-98c1-0943d17f02e0)(label(String))(mold((out \ + c24bfad3-4709-47c6-96da-5e8f373d3082)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 9ac3c343-82b1-45cc-9230-1a4f3fafa91b)(content(Whitespace\" \ + 3534c867-5e84-4634-907e-14d4844d9c7e)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c3d0554-ee07-4809-b732-12bd477756b5)(content(Whitespace\" \ + 32c28ea5-2319-478a-b9e4-6f904e97fc56)(content(Whitespace\" \ \"))))(Tile((id \ - 38e62114-d7b9-4ed8-a11b-376858934196)(label(\"\\\"\\\"\"))(mold((out \ + dbb0eaf5-a0cd-4246-b48f-d6cd9d2ee199)(label(\"\\\"\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 73187de5-e0c9-48eb-80d8-8e97ee7e87f2)(content(Whitespace\" \ + c16f028a-fe90-4c41-8955-caf524387e22)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0692e9c9-1c78-42e9-b1f8-46f69ef31a29)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9bc6c55e-2dfc-4c1b-9d87-e49c725d2015)(label(let = \ + 3900df20-0ada-4bd7-a60e-ea3385b8f2f3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c868db32-19a4-43c9-b4f8-feded97a287c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b8ff50e8-3ac5-4ef9-a0c7-d772066172f3)(content(Whitespace\" \ + 944e1d5c-655d-411c-837c-e59fb49fa4ee)(content(Whitespace\" \ \"))))(Tile((id \ - 66e8b83e-29ac-434c-92d3-f36959b6aa33)(label(__))(mold((out \ + 6464f407-1284-4ebe-a8d5-522b90af7aa6)(label(__))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 054baa08-b84b-4a87-8e7b-028d3c7776a4)(label(:))(mold((out \ + 0591c330-d99b-4117-b294-ea8d071944e6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 565a16b1-5654-449d-9e8c-510f066e6ac4)(content(Whitespace\" \ + b6a706cd-592e-4f32-a85c-1780b3a522e9)(content(Whitespace\" \ \"))))(Tile((id \ - 4a6c2724-d58f-4005-ad77-ae3dbd3ae53b)(label(String))(mold((out \ + e06cdc24-21a5-4bc7-a59a-515e3bb7dfb5)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 38f67f6c-0bb0-4613-9bbc-1ce44ef1066f)(content(Whitespace\" \ + 4d3406a1-e1e0-4f3b-81c3-48f317d5784a)(content(Whitespace\" \ \")))))((Secondary((id \ - d5469435-38f8-4e0b-b4d0-96ba8038e904)(content(Whitespace\" \ + 8ee75ddc-3f31-45c2-ab17-209bdfe2ce9c)(content(Whitespace\" \ \"))))(Tile((id \ - 4bc49445-a368-4d5f-98ae-846cada6427a)(label(\"\\\"\\\\n\\\"\"))(mold((out \ + 8c312c27-d8d4-4c06-8b58-ec5aea9826da)(label(\"\\\"\\\\n\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e681efe2-df51-438a-a79d-fb2334da1faf)(content(Whitespace\" \ + b54b3fba-81d7-4fb7-9fe9-61a3e2d37b4a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 35c356b6-ba26-4681-9a8e-610ff5e93bec)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f192a10b-4dd8-44f6-9744-2a07e8a2d67d)(label(let = \ + 0aece2f5-5a93-4582-8da8-e411338d82c4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d2f691ce-98f7-4304-b7b0-fe046096161e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e92e5a3c-9990-4fb3-a937-18062160dffc)(content(Whitespace\" \ + 396fe533-9201-40a9-adcb-25ecfc76bddf)(content(Whitespace\" \ \"))))(Tile((id \ - e1c39821-f4f9-400f-8127-4c4acded9420)(label(___))(mold((out \ + 81eafa69-5133-49ea-bdef-586f0c1126ab)(label(___))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5a350df3-2e80-41da-a048-606bcb80f5cf)(label(:))(mold((out \ + bd3687d6-811a-4859-80d7-0be40e722a12)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6678e7a0-de15-44d5-a9d1-24b4b7036136)(content(Whitespace\" \ + 23adbcb1-cdc3-45be-b646-5ad4a02a8a71)(content(Whitespace\" \ \"))))(Tile((id \ - 760c4003-e15e-4499-9591-2d2ba559ac04)(label(String))(mold((out \ + 9c25b20f-711e-44f5-a5ad-02a4689bd1bb)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0b129a48-4726-4e05-ab5f-5ed45fefff5f)(content(Whitespace\" \ + 3a7aec4b-410d-44b0-ab7c-b28d6a65abfe)(content(Whitespace\" \ \")))))((Secondary((id \ - f284313f-b976-465a-ac9f-ae6b311ff727)(content(Whitespace\" \ + ef6fcfc7-5b05-4fdc-a1c7-27e022e925bd)(content(Whitespace\" \ \"))))(Tile((id \ - f98e35be-44d9-4973-8e3f-8739dbddbcf9)(label(\"\\\"a\\\"\"))(mold((out \ + 3978bb74-9aef-4b41-adc7-3155736506a6)(label(\"\\\"a\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 60e0eb5c-606d-451e-bcb8-e005974b38a2)(content(Whitespace\" \ + 3de95bf9-c6a7-41d2-bdcb-03dcb4843831)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 911050e4-a1aa-43f6-a1eb-b15b73d7db71)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 324cbe08-46bd-47b1-98a7-c47706a266f6)(label(let = \ + ec27f395-d4b7-49b5-934e-df4f6665e218)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a561592a-05d4-45e0-8b1f-30c831da93d9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - daf66cc5-2d0c-4b5f-aff4-2ebf806fe44d)(content(Whitespace\" \ + 8bec02a1-aa58-4aee-a2bc-f8cbac12abde)(content(Whitespace\" \ \"))))(Tile((id \ - 4f640faf-3a08-4604-8841-a97486da7713)(label(____))(mold((out \ + ba2bd340-923a-4447-bd50-02fe2942d3d2)(label(____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e6df7bff-b468-42eb-9fbf-ea2be3b64065)(label(:))(mold((out \ + 4f0d613a-6c27-45f8-b4cb-eb1d62cf40a6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 43ada1ab-57f3-4b7d-b8b3-6ef7832242a8)(content(Whitespace\" \ + a0233234-fc25-435b-964c-454959058d98)(content(Whitespace\" \ \"))))(Tile((id \ - cc047085-9fcf-4844-96e0-0bed354c9f62)(label(String))(mold((out \ + 880ecfd9-ee2a-4d49-a5dd-66075cf44033)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 423ee039-187c-422f-bc42-d25bcb27318a)(content(Whitespace\" \ + 4f8eeaa7-6276-448b-9361-82ceb5a6e2b9)(content(Whitespace\" \ \")))))((Secondary((id \ - fca3b089-b6ff-4138-af21-644cea4037a0)(content(Whitespace\" \ + b38d98bb-99ff-46ad-99a3-fd0c09be43d7)(content(Whitespace\" \ \"))))(Tile((id \ - fe38a3b6-6401-4631-add3-f0339bd92210)(label(\"\\\"shift\\\\n\\\"\"))(mold((out \ + c11e3d78-6865-42fa-8d6e-722631ca2d99)(label(\"\\\"shift\\\\n\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5bd7de77-052f-43d2-8890-bf6c95180b4f)(content(Whitespace\" \ + 5a110fb5-8c8c-4d3f-992b-e6912e6d92de)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6076f23c-27cd-4208-890a-3524bff66887)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2f6061c4-ade3-481b-b4e4-ece5c15f8ae0)(label(let = \ + e1367d1a-ecd0-40bf-9405-5f412986ee82)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 87257fca-b797-4b34-912e-2c3e4d0c67ea)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 63fba73e-a406-4911-8349-4d83dfa2562a)(content(Whitespace\" \ + 180e802f-3412-4eea-be87-135a281e123c)(content(Whitespace\" \ \"))))(Tile((id \ - d4863515-fd12-4386-a78b-19c77f5f7f0e)(label(_____))(mold((out \ + c0364155-ddb7-403a-8496-13e61829b44c)(label(_____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 56f6acf9-96ee-4a4c-bc2a-156e02d0695d)(label(:))(mold((out \ + 31dc976d-88e0-4023-8ac9-4a077c3a60b6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e9744883-effc-4c6b-93d4-3af468077c9a)(content(Whitespace\" \ + 244b5c44-880a-44d5-841a-d56a473caaf3)(content(Whitespace\" \ \"))))(Tile((id \ - 5703b8ab-cc7c-4dbd-a253-4cacc09ee4a9)(label(String))(mold((out \ + 3867134b-4739-4dd2-a981-a21fae4cae0b)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fc013ff9-7425-42b7-a177-050de7fe8718)(content(Whitespace\" \ + 6fcad9f0-90e0-4b8e-b2a2-60967ef0c3a4)(content(Whitespace\" \ \")))))((Secondary((id \ - 67a75070-d2c3-4948-ab74-f89723d15335)(content(Whitespace\" \ + ff9b2e68-d6f2-49d6-a2d9-c61e4e5f9de7)(content(Whitespace\" \ \"))))(Tile((id \ - fcfc4a5d-d131-4e19-8641-05887df4f8b4)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + 5a99a998-ee50-40bb-85d5-4e97a05ad9d1)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c1ecd5fd-ed41-4d3e-ad81-60410f43e168)(content(Whitespace\" \ + 9e4579d1-74f4-4929-bdcb-bb2cc974bb9b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d1d31f54-403d-4310-8891-8b260bfca128)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6307c4fe-42be-4597-be40-b67eede1be87)(label(let = \ + cc4afe48-537b-4598-8398-b8c01139365c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2f1d48e4-1a68-40a2-a878-8d2d24c18979)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ca10cb6c-3a85-483a-babc-2538be70ca21)(content(Whitespace\" \ + 012855b9-ee9a-4bcc-a890-5883b47f4988)(content(Whitespace\" \ \"))))(Tile((id \ - 848a2578-929b-4ee3-a3dc-63e177ee4e23)(label(______))(mold((out \ + 4b3ea6c6-4fd0-4613-bdfb-7ee8e8afe630)(label(______))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6acf4c1a-3004-4569-bfa6-43ae1054e13b)(label(:))(mold((out \ + db3f8786-fbb3-4301-9c9a-6d5e77e16e7b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 807f20fa-288f-4efd-9ece-9999e3ec6278)(content(Whitespace\" \ + 72a2e5f5-ea83-462f-af2f-9ce637be7334)(content(Whitespace\" \ \"))))(Tile((id \ - 12d895fe-8086-482c-9de6-a8e894781071)(label(String))(mold((out \ + 6f8d0fcb-ec46-487b-aefd-62e28ae15659)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d3ae9cb2-38d7-49bf-ac3d-4ece4bb2e582)(content(Whitespace\" \ + f553e9b4-58f7-4c8b-9463-6ebfd5d2d3ed)(content(Whitespace\" \ \")))))((Secondary((id \ - 13756412-074e-432f-9e92-294a50e2cf94)(content(Whitespace\" \ + ac557ad9-180d-4078-812a-439809ffa638)(content(Whitespace\" \ \"))))(Tile((id \ - 009307fa-71af-4f48-9fd2-369aad11ff71)(label(\"\\\"a\\\\n \ + 34f66214-5bab-4857-9224-17a900def84f)(label(\"\\\"a\\\\n \ shift\\\\n malicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8523e073-2f94-4efe-8c8f-842304a63480)(content(Whitespace\" \ + 0366152f-94c7-4c5e-a271-074507242998)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4044f0fb-fd18-44ae-be39-83d2a97850e8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 48f4642f-93dc-488b-ac24-9898e33dc0ef)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6d05067f-f605-48aa-88b9-b2c04b98382b)(content(Comment\"# \ - Multiline error decorations#\"))))(Secondary((id \ - 4c5a46f7-cce7-469d-b078-ecd00a4372f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7f3b97a4-21b5-4868-bcaf-8fdd1f635847)(label(let = \ + 769846e6-36b0-43ac-8e38-b5e23b0d9004)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e1f4597c-2baf-4508-b176-7c9854e97c49)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 81faed74-c356-4027-875f-45d40db1cb84)(content(Comment\"# \ + Multiline error decorations #\"))))(Secondary((id \ + fd699eec-99a7-481d-ab8b-06d2458da98f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ca82c3fc-4f4d-440f-a68b-a8fa27592863)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5301bec-64d4-4aec-b53b-fc2a84e0aa99)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f3c247c6-1a84-42c9-a432-972c8fa7fc0d)(content(Whitespace\" \ + a068066c-3810-4b83-8bf4-13b7b431c4b2)(content(Whitespace\" \ \"))))(Tile((id \ - 75a94ce7-5fc7-4a38-81d1-2d40a2364116)(label(box))(mold((out \ + 6a1e5631-0205-4dcf-9dd1-860aec38e3d0)(label(box))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3bda9989-c9ac-4586-8b94-83bae9a27e6f)(label(:))(mold((out \ + abd42811-2b53-43f6-a3ba-b5e74447953c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a1d9f0c3-0d5d-4987-804c-5b6767a6eae9)(content(Whitespace\" \ + 4c8df25d-e349-4533-a8de-b0a4c1f19aa9)(content(Whitespace\" \ \"))))(Tile((id \ - c67269cc-fdde-42a1-8cc6-eb1556db7e95)(label(Int))(mold((out \ + b4e5f09b-2b19-4ba5-a73e-9a28f14f25eb)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e53399f5-23a1-4a09-9be7-34a5d91f9ad9)(content(Whitespace\" \ + 55a1df2f-527d-41af-8277-01a0d9f54cba)(content(Whitespace\" \ \")))))((Secondary((id \ - 34a19d5c-430a-45a4-bd9e-e74c7f95a410)(content(Whitespace\" \ + 66d77f00-873b-4e87-b073-19ec495401f4)(content(Whitespace\" \ \"))))(Tile((id \ - 522742b5-5981-4a1c-9a74-105e020fad85)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + 96b6d8d7-1559-46b2-b35b-edc986f476b0)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0f4d62eb-9dbf-45d0-9315-552fddc00f72)(content(Whitespace\" \ + aed1a8b5-43d5-4a8f-a2f0-a7de13c9a525)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 24f235aa-6504-48c4-9239-81748c3f40d8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - be0b7f86-2083-4695-8f92-792c33973d1f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 674e2927-c316-41c9-b5fa-1b57bdc9821a)(label(if then \ + 2f2450b3-ff78-457d-adf4-6456ca3bbff5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b49d503e-2d0f-46c9-949d-97295ff365f3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9a4f5a7d-ddd5-4b3d-9a6b-d939be419611)(content(Comment\"# \ + ERRATA: \ + #\"))))(Secondary((id \ + 6a0cb44d-ca96-4e18-82f4-b79ee88b2e50)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e78825f2-70c9-4d58-be69-a7bef7f58cb0)(content(Comment\"# The \ + bottom toggle can also be used to remove \ + #\"))))(Secondary((id \ + 6549a7fa-c69d-47b9-bb99-85875c347753)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2761b913-de2e-42c9-9011-a72426aff2c8)(content(Comment\"# \ + projectors. Currently only bidelmited terms can \ + #\"))))(Secondary((id \ + 9cb7117e-da9a-4102-a7b5-f19cad00ea69)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1ffeb118-7484-4516-bbc4-c70a3895e847)(content(Comment\"# \ + projected, so some may have to be parenthesized. \ + #\"))))(Secondary((id \ + 02854a8c-6ac2-4a79-ba86-9cc8c2faae6b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ae464fce-c593-41ae-be1c-2363f02b4444)(content(Comment\"# \ + Projectors are persistent across sessions, but \ + #\"))))(Secondary((id \ + a8e5b122-e5a3-474c-8f85-f133bb4b7f03)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 410e5672-5fb6-4ee6-9f88-f6bdbcac5aec)(content(Comment\"# \ + currently are lost on cut/copy. Both these \ + #\"))))(Secondary((id \ + 9d4b4526-d849-4266-85d7-7aa121011e9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + db752575-e20e-43c2-92a8-5288127f05f7)(content(Comment\"# \ + restrictions will be removed in a future update. \ + #\"))))(Secondary((id \ + 952107b5-deb1-403c-9bc7-3ace08817811)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 291fd742-e902-4301-aeca-de67388bf7d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e79829a6-bfcd-4212-8e44-e096d5e2cd9b)(content(Comment\"# \ + Projectors playfround #\"))))(Secondary((id \ + 8a0bedc7-36e2-4aec-97ee-89b259d63f86)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + beab0865-ec41-4882-9307-445255718618)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + aa8a55bf-2508-4307-b50f-01dcda89f553)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 79ca5ddb-92af-468a-a702-f834fab0d6d8)(content(Whitespace\" \ + decb0764-c3e8-4d71-ab53-138c734329df)(content(Whitespace\" \ \"))))(Tile((id \ - d886a161-7377-4404-8099-b36a6e886bc8)(label(true))(mold((out \ + b5089f93-7ffc-4827-8a6d-4c90bc81edf8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a86181d3-9ec4-49a1-9b5c-50320a340c54)(content(Whitespace\" \ + 519e184a-9744-4264-bcf8-f53dcfaef2cb)(content(Whitespace\" \ \"))))(Tile((id \ - 1eb5901a-15b6-4f19-bccd-5ae7595b4902)(label(&&))(mold((out \ + fc28bbb2-243f-4df3-a864-1d3d76b3b96d)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 00651def-bd47-44f6-a20f-84332cbf546d)(content(Whitespace\" \ + 05038a7a-116c-4486-a10f-707032135aff)(content(Whitespace\" \ \"))))(Tile((id \ - 43f38665-0173-4e2b-8084-616dd14d7095)(label(79))(mold((out \ + 8a38360f-50ab-412e-aeca-395fa5f3061f)(label(33))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2c618423-bba5-45b9-b229-b79b4883571b)(content(Whitespace\" \ + 1dec1cda-e010-4aae-a254-4625e8fc2801)(content(Whitespace\" \ \"))))(Tile((id \ - 30f684d2-4ee8-4480-af2a-8b97b23f97b2)(label(<))(mold((out \ + dcaad0a5-9ed7-494a-93b9-f675f38bf433)(label(<))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6311cdb0-2150-431f-9f5f-1a709085fefc)(content(Whitespace\" \ + 75c5ecf6-7342-44b7-8305-5c37611704b6)(content(Whitespace\" \ \"))))(Tile((id \ - 891695d6-a7e7-4aa0-8725-673929d05531)(label(int_of_float))(mold((out \ + 25cece41-f9c6-4b2d-992e-22cb39e726d3)(label(int_of_float))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 492af390-9094-4823-93c2-252b8790678a)(label(\"(\"\")\"))(mold((out \ + 1634bcf6-ff01-4301-ad47-f25bd3017a74)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 862881a7-ccc8-4fec-9935-65a21984520d)(label(60.00))(mold((out \ + efbe2f5e-cff3-40e7-9153-b89faa3bc3aa)(label(73.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e824e1b8-80af-4763-a35d-ea05c6450ca4)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 9481ed01-c619-4b88-8ae1-8b9458c28168)(content(Whitespace\" \ + df201b1c-83c5-4208-a46f-81e6a76c7436)(content(Whitespace\" \ + \"))))(Secondary((id \ + c6a4add5-df8c-4b27-a01c-1b82c74ec5b3)(content(Whitespace\" \ + \"))))(Secondary((id \ + daf62ff8-2e36-49c1-bed1-3bab883fbf7a)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 71fadfb9-7aa0-48a4-96fa-ced42195b6ab)(content(Whitespace\" \ \"))))(Tile((id \ - 2405abba-b962-404b-ad10-8b4710791048)(label(______))(mold((out \ + bd61e7af-e7da-43e9-9281-62b96f6758d4)(label(______))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bc613398-7d1c-43fa-bdeb-e03bd9fb5e02)(content(Whitespace\" \ + bbf12f95-2c00-4d83-9426-f22c27ed7c7f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cc8f5c0d-64d4-453c-9379-3a0f0b194c51)(content(Whitespace\" \ + e0e78fdf-9502-47d0-85fa-9c8b8ac657f4)(content(Whitespace\" \ \"))))(Tile((id \ - e03b8f9d-030d-4e98-9e7f-bc55ecf20876)(label(\"\\\"its: \ + 094ca6e0-0599-45c7-b9e2-b3fff0ae1bcc)(label(\"\\\"its: \ \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 044f8f77-35ff-41f3-80d7-c6335b96edb9)(content(Whitespace\" \ + 4079d8de-834d-424d-a4bb-acd7f99df4fa)(content(Whitespace\" \ \"))))(Tile((id \ - 5989bbe1-ee64-42e9-953c-96d695e7c0ac)(label(++))(mold((out \ + 2b916cf5-a0a3-4118-b7e1-1c6b24c8a8ba)(label(++))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6a2232cf-0eb2-4bd6-b73a-64abc2d4b74f)(content(Whitespace\" \ + 5e5552d1-81f9-42a3-bd86-728309a1d9ab)(content(Whitespace\" \ \"))))(Tile((id \ - 6e6e48db-9b72-4a69-bd8e-77c66bccbc6b)(label(_____))(mold((out \ + e4645cd3-3cea-4174-992a-4baad88c3c06)(label(box))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b5b527fd-3e8e-4651-872d-f8144c944061)(content(Whitespace\" \ + e65c1946-9aba-4514-bab9-d500af3b659d)(content(Whitespace\" \ \"))))(Secondary((id \ - 3629f4dc-30d5-49fb-aff6-93d3246f7205)(content(Whitespace\" \ + 22318444-30f4-4ae4-8f23-76a28c027c36)(content(Whitespace\" \ \"))))(Secondary((id \ - d6644add-22e0-44ad-a434-5d175e65e30e)(content(Whitespace\" \ + 9ca42fff-9ec3-4899-9dd5-228d06b7603e)(content(Whitespace\" \ \"))))(Secondary((id \ - 092c05bd-4a34-42d5-ad57-7a5e2ad70ac6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - baa84041-2788-479a-abe3-5cc7ce38f534)(content(Whitespace\" \ + 38282408-d04b-4de2-984c-d704a3b6be10)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 29f988a3-ab77-4546-b62a-3c5bec85624a)(content(Whitespace\" \ \")))))))(ancestors())))(caret \ Outer)(projectors((009307fa-71af-4f48-9fd2-369aad11ff71((kind \ + TextArea)(model\"()\")))(1a1e3b78-a600-4569-9859-ea95d7328e35((kind \ + Fold)(model\"()\")))(25cece41-f9c6-4b2d-992e-22cb39e726d3((kind \ + Fold)(model\"()\")))(2945304f-410e-4c9e-8bef-8dbc37fa52ea((kind \ + Fold)(model\"()\")))(34f66214-5bab-4857-9224-17a900def84f((kind \ TextArea)(model\"()\")))(38e62114-d7b9-4ed8-a11b-376858934196((kind \ + TextArea)(model\"()\")))(3978bb74-9aef-4b41-adc7-3155736506a6((kind \ TextArea)(model\"()\")))(432c81db-6a1e-4004-9568-cb79e7e879df((kind \ Slider)(model\"()\")))(43f38665-0173-4e2b-8084-616dd14d7095((kind \ Slider)(model\"()\")))(4bc49445-a368-4d5f-98ae-846cada6427a((kind \ TextArea)(model\"()\")))(522742b5-5981-4a1c-9a74-105e020fad85((kind \ TextArea)(model\"()\")))(59030dfd-2230-42c4-a2be-e300c627bfc6((kind \ - Fold)(model\"()\")))(862881a7-ccc8-4fec-9935-65a21984520d((kind \ + Fold)(model\"()\")))(5a99a998-ee50-40bb-85d5-4e97a05ad9d1((kind \ + TextArea)(model\"()\")))(68f1e62e-a9ea-49ee-8b23-4c8934f9bdca((kind \ + Info)(model \ + Expected)))(7bc7eb1c-f0ee-48b0-a0cd-aca0aae535ac((kind \ + Checkbox)(model\"()\")))(862881a7-ccc8-4fec-9935-65a21984520d((kind \ SliderF)(model\"()\")))(891695d6-a7e7-4aa0-8725-673929d05531((kind \ Fold)(model\"()\")))(8935d807-0b39-468f-9ada-eaa0124d2f4d((kind \ Info)(model \ - Expected)))(9f5fefb9-9cf6-430f-a507-17d7fdf96788((kind \ - Slider)(model\"()\")))(d3c0d680-bfde-4279-adba-79b3a4a64d61((kind \ + Expected)))(8a38360f-50ab-412e-aeca-395fa5f3061f((kind \ + Slider)(model\"()\")))(8c312c27-d8d4-4c06-8b58-ec5aea9826da((kind \ + TextArea)(model\"()\")))(96b6d8d7-1559-46b2-b35b-edc986f476b0((kind \ + TextArea)(model\"()\")))(9f5fefb9-9cf6-430f-a507-17d7fdf96788((kind \ + Slider)(model\"()\")))(ae2f057e-f44f-4f3b-9fe7-b32acb7881fa((kind \ + SliderF)(model\"()\")))(b5089f93-7ffc-4827-8a6d-4c90bc81edf8((kind \ + Checkbox)(model\"()\")))(c11e3d78-6865-42fa-8d6e-722631ca2d99((kind \ + TextArea)(model\"()\")))(d3c0d680-bfde-4279-adba-79b3a4a64d61((kind \ Checkbox)(model\"()\")))(d59f30c5-c4e0-4182-be6a-666baba654ea((kind \ SliderF)(model\"()\")))(d886a161-7377-4404-8099-b36a6e886bc8((kind \ - Checkbox)(model\"()\")))(eecb808d-a186-45fb-8d0a-0c09e9dd87bc((kind \ - Checkbox)(model\"()\")))(f98e35be-44d9-4973-8e3f-8739dbddbcf9((kind \ + Checkbox)(model\"()\")))(dbb0eaf5-a0cd-4246-b48f-d6cd9d2ee199((kind \ + TextArea)(model\"()\")))(e442c25d-463b-4706-a43f-393a37010a8e((kind \ + Checkbox)(model\"()\")))(ec1558b2-04e6-4323-87ea-2dbfd87a485b((kind \ + Slider)(model\"()\")))(eecb808d-a186-45fb-8d0a-0c09e9dd87bc((kind \ + Checkbox)(model\"()\")))(efbe2f5e-cff3-40e7-9153-b89faa3bc3aa((kind \ + SliderF)(model\"()\")))(f5ebef37-c9e2-43cf-867e-f150c01f04e9((kind \ + Slider)(model\"()\")))(f98e35be-44d9-4973-8e3f-8739dbddbcf9((kind \ TextArea)(model\"()\")))(fcfc4a5d-d131-4e19-8641-05887df4f8b4((kind \ TextArea)(model\"()\")))(fe38a3b6-6401-4631-add3-f0339bd92210((kind \ TextArea)(model\"()\"))))))"; backup_text = - "# Below are two fold projectors: Simple & Info #\n\ + "# PROJECTORS #\n\n\ + # Some kinds of syntax have dedicated GUIs. #\n\ + # The menu at the bottom left shows which GUIs #\n\ + # (if any) are applicable to the current term #\n\ + # indicated by the caret. #\n\n\ + # Fold projectors cover terms with abstractions. #\n\ + # 1. A simple fold roles up any term, replacing #\n\ + # it with ... until it is expanded again. #\n\n\ + let fold = (((((((((((()))))))))))) in\n\n\ + # 2. A semantic fold covers a term with a property: #\n\ + # Click to toggle inferred & synthesized types #\n\n\ let folds: (Int -> Bool) = in\n\n\ - # Three base types have inline livelits #\n\ + # Projectors on literal data are called livelits. #\n\ + # Three base types literals use inline views: #\n\n\ let guard: Bool = true in\n\ - let phase: Int = 60 in\n\ - let float: Float = 55.00 in\n\n\ - # Inline error decorations #\n\ - let (a:Int, f: Float) = true, 45 in\n\n\ - # Strings get a multiline view #\n\ + let phase: Int = 44 in\n\ + let float: Float = 79.00 in\n\n\ + # Inline error decorations (same as for tokens) #\n\n\ + let (a:Int, f: Float) = true, 28 in\n\n\ + # The String base type get a multiline view: #\n\n\ let _: String = \"\" in\n\ let __: String = \"\\n\" in\n\ let ___: String = \"a\" in\n\ let ____: String = \"shift\\n\" in\n\ let _____: String = \"\\nmalicious\" in\n\ let ______: String = \"a\\n shift\\n malicious\" in\n\n\ - # Multiline error decorations#\n\ + # Multiline error decorations #\n\n\ let box: Int = \"\\nmalicious\" in\n\n\ - if true && 79 < int_of_float(60.00)\n\ - then ______ else \"its: \" ++ _____ \n\ + # ERRATA: #\n\ + # The bottom toggle can also be used to remove #\n\ + # projectors. Currently only bidelmited terms can #\n\ + # projected, so some may have to be parenthesized. #\n\ + # Projectors are persistent across sessions, but #\n\ + # currently are lost on cut/copy. Both these #\n\ + # restrictions will be removed in a future update. #\n\n\ + # Projectors playfround #\n\n\ + if true && 33 < int_of_float(73.00) \n\ + then ______ else \"its: \" ++ box \n\ \ "; } ); ( "Types & static errors", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ 5712047c-e3e9-423a-8beb-0aebc3fe726b)(content(Comment\"# \ Internal Regression Tests: Type errors #\"))))(Secondary((id \ 25719d37-0273-4700-881d-7c4acd6022d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -12039,8 +13341,8 @@ let startup : PersistentData.t = \")))))))))(Secondary((id \ 34b71af6-4d47-42a1-a334-26143b01ce4d)(content(Whitespace\" \ \"))))(Secondary((id \ - b37eaa85-ad06-4b39-9219-2f5d38f8bbef)(content(Comment \ - #err#))))(Secondary((id \ + 09ed9d4d-3488-4c61-b0de-d84048921b61)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ 4b3a8054-ec88-40f2-938b-585ad4dc7ef9)(content(Whitespace\" \ \"))))(Secondary((id \ a0e8ad90-fa46-4d6d-a834-8cbed02e24e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -12048,14 +13350,11 @@ let startup : PersistentData.t = 4139997f-e29b-470f-ad5c-8192ada59d2c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - 81e178c8-13fe-4b3d-bb5f-ef85dc332141)(shape \ + 2))(children(((Secondary((id \ + b62d4e1e-4e3f-4284-b4f5-0e46e3822413)(content(Whitespace\" \ + \"))))(Grout((id 81e178c8-13fe-4b3d-bb5f-ef85dc332141)(shape \ Convex)))(Secondary((id \ 787f1759-c418-496d-87a7-d34b2538e547)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4be76a6c-6c31-4491-9c61-9193e50c76cd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 18c743c2-9e88-4d16-b9dd-451738c94506)(content(Whitespace\" \ \")))))((Secondary((id \ b6b53f3c-8d88-41f2-b691-81356e9caf10)(content(Whitespace\" \ \"))))(Tile((id \ @@ -12146,16 +13445,11 @@ let startup : PersistentData.t = 2206d924-81b9-44b6-b725-f4a8e4aaa9e3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - b2b029ca-235d-4c68-9f5c-551c00c15263)(shape \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 733ce9a3-299d-43a7-8a25-5dd76f196ef4)(content(Whitespace\" \ + \"))))(Grout((id b2b029ca-235d-4c68-9f5c-551c00c15263)(shape \ Convex)))(Secondary((id \ b4703344-736d-4172-9401-47bf1ee8ebd0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7d049859-f11a-4d7d-91bd-a7adef84d287)(content(Whitespace\" \ - \"))))(Secondary((id \ - cd86e243-ae10-470a-9eaa-1b83c6b55872)(content(Whitespace\" \ - \"))))(Secondary((id \ - f84fb626-3a33-4922-b065-e08a8a37117d)(content(Whitespace\" \ \")))))((Secondary((id \ 0d34a4c5-a931-4279-838b-482019c0e874)(content(Whitespace\" \ \"))))(Tile((id \ @@ -12392,15 +13686,10 @@ let startup : PersistentData.t = bf3901f7-d8c2-4b87-b353-d348f4de685c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 09e1cd05-28f6-4e0b-a3d0-8071f1d28c5b)(shape \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 6a615115-3cab-4892-86d1-a305d1b2f992)(content(Whitespace\" \ + \"))))(Grout((id 09e1cd05-28f6-4e0b-a3d0-8071f1d28c5b)(shape \ Convex)))(Secondary((id \ - f41c6f36-0d79-4928-a9d2-a9a5f9a02a69)(content(Whitespace\" \ - \"))))(Secondary((id \ - b5f23e7f-7b34-46b9-a81c-8d7bf46e7e51)(content(Whitespace\" \ - \"))))(Secondary((id \ - 78bd4530-1249-440b-9f14-df6f13159d05)(content(Whitespace\" \ - \"))))(Secondary((id \ e70a5c62-5f9f-4196-848b-0b83b5e61901)(content(Whitespace\" \ \")))))))))(Secondary((id \ c5636dc5-714c-41cf-8f4f-b4964fe82a88)(content(Whitespace\" \ @@ -12466,16 +13755,11 @@ let startup : PersistentData.t = 421bf5ab-64da-4005-bb31-4cf97fd66cea)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 8ff1d0ba-dbab-4964-9dfe-3eaea376500d)(shape \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 234c02df-31e0-46e1-8cd9-871cf50653a5)(content(Whitespace\" \ + \"))))(Grout((id 8ff1d0ba-dbab-4964-9dfe-3eaea376500d)(shape \ Convex)))(Secondary((id \ 683cc5f3-68a0-4073-8d8e-77f04849b9be)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7caa205d-f9f9-4385-9f91-4451279baf4a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 63984ab9-75b4-4834-838b-7830296acc20)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2aa2a312-7043-4122-b5bf-aa7737e635e4)(content(Whitespace\" \ \")))))))))(Secondary((id \ 4452c438-712b-47d0-97e3-6ad0c66a851e)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -12531,6 +13815,8 @@ let startup : PersistentData.t = \")))))))))(Secondary((id \ 4a78edd8-7cc5-43e7-a5a2-06fd22e09992)(content(Whitespace\" \ \"))))(Secondary((id \ + 75394c13-0dbc-4c27-b74d-00628415ecd8)(content(Comment\"#2x \ + err#\"))))(Secondary((id \ d6536aaf-a29f-4dd1-b71d-319a5018d79f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ f0ae930d-5ce5-4bc7-90fc-a1766418be73)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ @@ -12580,7 +13866,7 @@ let startup : PersistentData.t = \")))))))))(Secondary((id \ 6ea51883-d3e4-4ce0-9426-3084aa0b135c)(content(Whitespace\" \ \"))))(Secondary((id \ - b9c5b7d9-5b68-43d1-82de-93fc01844f74)(content(Comment\"#2x \ + e5c82c63-a627-40cd-95b4-253918fbde11)(content(Comment\"#3x \ err#\"))))(Secondary((id \ 312d8673-95fb-4923-b89f-12d832987894)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -12709,19 +13995,15 @@ let startup : PersistentData.t = a4bbbc61-ebf3-49a2-9edb-15d0f609eb63)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ - 1))(children(((Grout((id \ - f8c3c2c8-9c73-435f-b109-0736b22bc9fe)(shape \ + 1))(children(((Secondary((id \ + 3f49ca87-30ae-471a-b7fd-6f000e536dd9)(content(Whitespace\" \ + \"))))(Grout((id f8c3c2c8-9c73-435f-b109-0736b22bc9fe)(shape \ Convex)))(Secondary((id \ ea1a354e-a8be-4e20-a96e-1df9fbccb3cd)(content(Whitespace\" \ - \"))))(Secondary((id \ - f89423dd-31dd-40f2-8a8a-74575d7dd4d5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 28466780-871e-4c41-aa99-93a0575d10c6)(content(Whitespace\" \ - \")))))))))(Grout((id \ - 729899f1-6cd9-4ef6-9439-d629666e7dc5)(shape \ + \")))))))))(Secondary((id \ + cc59ab4f-b3f9-4427-af9f-3705e250021c)(content(Whitespace\" \ + \"))))(Grout((id 729899f1-6cd9-4ef6-9439-d629666e7dc5)(shape \ Convex)))(Secondary((id \ - 23bc685b-79cd-4e18-9571-f8642bf6e477)(content(Whitespace\" \ - \"))))(Secondary((id \ 6eb0a2f1-7e6d-4e7b-b88f-b9f68080a2a1)(content(Whitespace\" \ \")))))))))(Tile((id \ cc355deb-6f6d-409c-943e-8ae6d9c2e6dc)(label(\"(\"\")\"))(mold((out \ @@ -12768,11 +14050,10 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 6c5fe730-0978-4a61-839c-bbff0fcf0dac)(content(Whitespace\" \ - \")))))))))(Grout((id \ - bd8224a1-6098-4410-8558-2c26616ce875)(shape \ + \")))))))))(Secondary((id \ + 1cc96f69-ae59-4fb7-ab8e-07f5d46d2a49)(content(Whitespace\" \ + \"))))(Grout((id bd8224a1-6098-4410-8558-2c26616ce875)(shape \ Convex)))(Secondary((id \ - e06d82ca-8151-4542-8139-c6db4194b714)(content(Whitespace\" \ - \"))))(Secondary((id \ 180923a8-ecf8-4fe5-a277-18ac7043d8ea)(content(Whitespace\" \ \")))))))))(Tile((id \ b332e54b-ed33-4501-abf5-006cb0be58dd)(label(\"(\"\")\"))(mold((out \ @@ -12821,19 +14102,15 @@ let startup : PersistentData.t = bae24720-e50f-4d92-8658-fbfb6e71a68a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 00b3ddce-e18f-4efd-b984-ac788c9e89e3)(shape \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7b75d4c1-39ac-4c42-aa17-2054413deec9)(content(Whitespace\" \ + \"))))(Grout((id 00b3ddce-e18f-4efd-b984-ac788c9e89e3)(shape \ Convex)))(Secondary((id \ - 4c1708a5-fd9b-4a7a-9733-575020d28d74)(content(Whitespace\" \ - \"))))(Secondary((id \ - b879a426-b238-4c6d-a4a6-9855abeeea56)(content(Whitespace\" \ - \"))))(Secondary((id \ fbc5bd8d-fce5-4ec0-8eab-40748b0b38de)(content(Whitespace\" \ - \")))))))))(Grout((id \ - 567e2173-0949-4e39-9ba2-4bb179b5c90a)(shape \ + \")))))))))(Secondary((id \ + 3e7f97f5-6952-4f26-969b-08be73843a98)(content(Whitespace\" \ + \"))))(Grout((id 567e2173-0949-4e39-9ba2-4bb179b5c90a)(shape \ Convex)))(Secondary((id \ - a6d8e3cc-08ba-419e-bd98-07aff49595ac)(content(Whitespace\" \ - \"))))(Secondary((id \ 1a8dd4f4-a29f-46b7-800a-4c65ddb53a45)(content(Whitespace\" \ \")))))))))(Tile((id \ 56e51ba2-0b94-4e23-a2d5-700863a7cba7)(label(\"(\"\")\"))(mold((out \ @@ -12889,12 +14166,11 @@ let startup : PersistentData.t = Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 11719b57-87e8-47b8-b9ba-2101b70dc410)(content(Whitespace\" \ - \")))))))))(Grout((id \ - 1b56cddd-338c-4229-8f47-87f282c8cd4a)(shape \ + \")))))))))(Secondary((id \ + 9035dd5c-668f-4fad-bd04-8939a22ef056)(content(Whitespace\" \ + \"))))(Grout((id 1b56cddd-338c-4229-8f47-87f282c8cd4a)(shape \ Convex)))(Secondary((id \ 8860fd0a-0333-4146-ab70-15801fcfd7f9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 05288be9-b62e-4392-ab23-53b9f85a6285)(content(Whitespace\" \ \")))))))))(Tile((id \ 0261001a-22a6-4579-941e-fa697e608d18)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ @@ -13000,13 +14276,10 @@ let startup : PersistentData.t = 117e1a3b-efda-49fa-a2b5-3fda0fccb60f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 43c44d38-10ee-4fac-9bba-4b1e54a5cad7)(shape \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 785fcd91-c046-42db-bb2f-9d75d98976f0)(content(Whitespace\" \ + \"))))(Grout((id 43c44d38-10ee-4fac-9bba-4b1e54a5cad7)(shape \ Convex)))(Secondary((id \ - 179abc48-6e04-4009-91e9-eb8866ef9bb1)(content(Whitespace\" \ - \"))))(Secondary((id \ - ae4287a5-b463-4d8a-afde-d9bec66496bc)(content(Whitespace\" \ - \"))))(Secondary((id \ 8f269907-6535-4e08-b51b-9091c5d9d441)(content(Whitespace\" \ \")))))((Secondary((id \ d555a4a0-0b6e-454d-9762-c119366591de)(content(Whitespace\" \ @@ -13064,21 +14337,18 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 0d707e62-a533-4dcf-8c58-234a04abede3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 74967d24-9dc1-4351-ab9a-50b96437d5ee)(content(Whitespace\" \ \"))))(Grout((id 0a083e34-4118-4771-9f7e-4a96bab5e133)(shape \ - Convex)))(Tile((id \ + Convex)))(Secondary((id \ + 4ea0e61f-5db1-4fae-94a0-b206dfcae9b3)(content(Whitespace\" \ + \"))))(Tile((id \ 85eb2e99-1220-4a46-98a3-5f2b34050242)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - f2e751fe-876f-4533-8463-abc68f0d53b2)(shape \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c773ff50-6dd9-417f-b9e5-01af2a434b1a)(content(Whitespace\" \ + \"))))(Grout((id f2e751fe-876f-4533-8463-abc68f0d53b2)(shape \ Convex)))(Secondary((id \ aa56d842-4a1e-414f-ac0c-9b7d818689f9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 44f0b9ce-60cb-44ce-a4f9-4321a4acc6e1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8510a26a-8889-4828-9f02-a9a3ba561a04)(content(Whitespace\" \ \")))))((Secondary((id \ 773e1734-2619-4307-a0ca-5b2d37e3d703)(content(Whitespace\" \ \"))))(Tile((id \ @@ -13135,10 +14405,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 9abd94ac-c981-477b-b931-bfa8edbb948d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9e6529c3-72a0-4ccd-a40f-6d2abd16f4e4)(content(Whitespace\" \ \"))))(Grout((id d8a7e43c-e62d-4a68-9392-34c3d520ee76)(shape \ - Convex)))(Tile((id \ + Convex)))(Secondary((id \ + c2ecf45c-d54d-4312-bd7c-1876d09ac852)(content(Whitespace\" \ + \"))))(Tile((id \ 1329720c-273a-4269-ad71-1a28f3fd2535)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ @@ -13209,10 +14479,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 0cc42648-ef8c-4e16-b848-703d20f09d88)(content(Whitespace\" \ - \"))))(Secondary((id \ - c0ce46b9-d2a5-4119-908c-0d75dc673224)(content(Whitespace\" \ \"))))(Grout((id 0aabbfea-3979-4116-aa53-0e38d5e3ab9a)(shape \ - Convex)))(Tile((id \ + Convex)))(Secondary((id \ + 044415e2-5065-486a-a23c-e28304373b07)(content(Whitespace\" \ + \"))))(Tile((id \ 12685639-fb4d-4ae1-aacb-f7ee76b44e48)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ @@ -13278,9 +14548,7 @@ let startup : PersistentData.t = Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ 3841372b-09b8-4d63-898e-875a34b3214b)(shape \ - Convex)))(Secondary((id \ - 5cd847c6-0ce3-4aae-9087-708fd1d0879a)(content(Whitespace\" \ - \")))))))))(Tile((id \ + Convex))))))))(Tile((id \ 4abfdc18-3c1a-41aa-aa78-0d6377a2a70f)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ @@ -13428,14 +14696,11 @@ let startup : PersistentData.t = 25e07714-af67-45f2-8ddb-4ad8108248b2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - e1829670-10d4-43b0-ba59-73377143bbc0)(shape \ + 2))(children(((Secondary((id \ + 6ba75e3a-464a-4e7f-8213-73f73c1f4635)(content(Whitespace\" \ + \"))))(Grout((id e1829670-10d4-43b0-ba59-73377143bbc0)(shape \ Convex)))(Secondary((id \ c035c830-c090-4d8c-9b5a-b81ddcf483e2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7fe0ec74-af5f-4739-818e-d41629c99d06)(content(Whitespace\" \ - \"))))(Secondary((id \ - c95d445d-4d5a-4f7f-99aa-d0dfb2878255)(content(Whitespace\" \ \")))))((Secondary((id \ ad38a685-38f4-48ec-b1be-08dbf34962c0)(content(Whitespace\" \ \"))))(Tile((id 1235b1a2-6c74-4117-ba60-632df4438912)(label([ \ @@ -13532,10 +14797,6 @@ let startup : PersistentData.t = 4f805da3-bb11-4abd-80de-3f32590bba4e)(shape \ Convex)))(Secondary((id \ 9bd7ec55-b904-47b7-b5e8-7071ac0fcffc)(content(Whitespace\" \ - \"))))(Secondary((id \ - d8e5852b-4b88-4577-9547-80ae37bdc695)(content(Whitespace\" \ - \"))))(Secondary((id \ - f9850a4d-5e37-4942-a052-41cee4edb1ac)(content(Whitespace\" \ \")))))((Secondary((id \ cc52ebf6-8415-40fe-aff1-c0f76074243d)(content(Whitespace\" \ \"))))(Tile((id 7f4f0b94-04e7-40e4-9b50-187c48f41466)(label([ \ @@ -13588,9 +14849,7 @@ let startup : PersistentData.t = Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Grout((id \ 6adf8caf-e8c9-4693-b6f5-e3ce2ec3f28a)(shape \ - Convex)))(Secondary((id \ - 57f44fe2-18cb-401f-a3ad-d0ad42c667ea)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Convex))))))))(Secondary((id \ 34e5d96f-59dc-4c14-9bba-f0168d0cffd4)(content(Whitespace\" \ \")))))((Secondary((id \ 29a44afb-3ecc-4b0c-9fe7-fcd55d232c0e)(content(Whitespace\" \ @@ -13822,44 +15081,44 @@ let startup : PersistentData.t = bbd01a32-cb8d-47b3-8c84-e077c869a585)(label(\"\\\"BYE\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ Outer)(projectors()))"; backup_text = "# Internal Regression Tests: Type errors #\n\ # Each line should show errors or not as indicated #\n\n\ let _ = unbound in #err#\n\ let Undefined = Undefined in # 2x err# \n\ - let true = 2 in #err# \n\n\ - let = if true then 1 else 1. in #err# \n\ + let true = 2 in #2x err# \n\n\ + let = if true then 1 else 1. in #err# \n\ let _ = if true then 1 else 1. in #err#\n\ - let _: = if true then 1 else 1. in\n\ + let _: = if true then 1 else 1. in\n\ let _: Int = if true then 1 else 1. in #err#\n\ let _: Fake = if true then 1 else true in #err#\n\ let _, _ = if true then 1 else 1. in #2x err#\n\ - let _, _ = (if true then 1 else 1.), in #err#\n\ - let _: , _ = (if true then 1 else 1.), in \n\ - let [_] = [(if true then 1 else 1.)] in \n\ - let [_] = (if true then 1 else 1.) in #2x err# \n\n\ + let _, _ = (if true then 1 else 1.), in #err#\n\ + let _: , _ = (if true then 1 else 1.), in \n\ + let [_] = [(if true then 1 else 1.)] in #2x err#\n\ + let [_] = (if true then 1 else 1.) in #3x err# \n\n\ ( )(if true then 1 else 1.);\n\ 1(if true then 1 else 1.); #err#\n\ (1)(if true then 1 else 1.); #err#\n\ - (fun -> )(if true then 1 else 1.);\n\ + (fun -> )(if true then 1 else 1.);\n\ (fun _ -> )(if true then 1 else 1.);\n\ - (fun _: -> )(if true then 1 else 1.);\n\ + (fun _: -> )(if true then 1 else 1.);\n\ (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ let _ = fun x -> if true then 1 else 1. in #err#\n\ - let _: = fun x -> if true then 1 else 1. in\n\ - let _: -> = fun x -> if true then 1 else 1. in\n\ + let _: = fun x -> if true then 1 else 1. in\n\ + let _: -> = fun x -> if true then 1 else 1. in\n\ let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ let _: -> [ ] = fun x -> if true then 1 else 1. in #2x \ err#\n\n\ - ( )::[(if true then 1 else 1.)];\n\ + ( )::[(if true then 1 else 1.)];\n\ 1::[(if true then 1 else 1.)]; #err#\n\ (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ - let = [1, 1., true] in #err: inconsistent#\n\ + let = [1, 1., true] in #err: inconsistent#\n\ let _ = [1, 1., true] in #err: inconsistent#\n\ - let _: = [1, 1., true] in \n\ - let _: [ ] = [1, 1., true] in\n\ + let _: = [1, 1., true] in \n\ + let _: [ ] = [1, 1., true] in\n\ let _: [Int] = [1, 1., true] in #2x err#\n\n\ let _: [Int] = 1::[2] in\n\ let _: [Int] = 1.0::[2] in #err#\n\ @@ -13870,119 +15129,7 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack(((focus Left)(content((Tile((id \ - b88aa814-3348-4d9a-bb7b-87b83a5b89d7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 487d3abf-e70f-4887-8046-f02cac6cb2bb)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - f761ab95-af19-4c2f-91b1-e8b1f96a9c14)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 25c83503-5f8a-45e3-a35c-bb85f2c941cf)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 62ea7b02-8d85-4e7e-b7b0-2ff1b8083b4b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 96080ecb-74e5-4e8e-af68-63ee8aeef5c8)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 44072989-144d-45ea-9ab3-51bccee14678)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 1a1e5183-343b-40f6-a989-49ce75e55a96)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - ce9cf06e-4146-455b-9bcf-d58798d189b1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 137ab8b8-acd4-4669-b8b0-0981cd8e38fb)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - a4330d8f-ce4a-4a77-8b24-56e8dfcf2461)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 24cfe539-f6af-4863-8111-78265a29f465)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - f01fa49c-e3d2-46b2-8d63-14e7224303eb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - 4ee9e1bb-2b95-4aab-b22a-e14cc7e4a5c9)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 6ec84ba3-dfa5-4209-868d-1e2e0260cb94)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))))(mode \ - Normal))((focus Left)(content((Tile((id \ - c0ca4224-219e-427e-9415-f1f34cd9897c)(label(test \ - end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 04537911-d2b3-4bf5-9d40-5eda36555783)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - c649db7e-abb7-4d29-a4b8-6a917a76c6c6)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 2927f4e8-9b6e-45a0-a750-43e1f57cd52d)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - a77a91f3-be7a-4254-8b0a-30963f3b9c61)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 9b1b141b-5d1d-46b5-8581-f361375e5c31)(label(case \ - end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 2dea2c00-978f-4220-bdd7-fc268b2a8086)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(1))(children())))))(mode Normal))((focus \ - Left)(content((Tile((id \ - 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(2))(children())))))(mode \ - Normal))))(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ fdd8583e-681a-479a-b82c-70150ec064e1)(content(Comment\"# \ Lambda Calculus via evaluation by substitution \ #\"))))(Secondary((id \ @@ -15001,754 +16148,708 @@ let startup : PersistentData.t = 40d86858-c6d5-4f3c-80b2-baf99f974c1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 57e3ef8c-1c35-4297-8089-11f73f032a4b)(content(Comment\"# \ Evaluation by substitution #\"))))(Secondary((id \ - ba1f3bb8-f734-47ff-8b87-05b235e70fc2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 134a410c-56f7-42c1-9ee8-c95933b4f02d)(label(let = \ + ba1f3bb8-f734-47ff-8b87-05b235e70fc2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6c59ac73-6216-414b-a9c2-2d6ed43b6cc7)(content(Comment\"# \ + Evaluation by substitution #\"))))(Secondary((id \ + 6fd3d856-8e61-4ffb-9f1b-3de94fdb88d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5816794-b99b-4def-8401-6ac055c048e9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - a69460c3-667f-4179-ad87-12a955f3b37b)(content(Whitespace\" \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + b9dae5b2-f1bb-4e69-b8da-b2489b61e0f9)(content(Whitespace\" \ \"))))(Tile((id \ - 2dea2c00-978f-4220-bdd7-fc268b2a8086)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Grout((id \ - 504d7bb9-20da-4c90-9534-c7e482c803c2)(shape \ - Convex)))(Tile((id \ - fe186128-a343-490d-85d6-a65f00596352)(label(:))(mold((out \ + c8830b54-c03c-4fcf-a211-cfca308d97b1)(label(go))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 67637dd3-f621-43d5-bc4b-21ad44dc7362)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8529a871-5f63-4063-a268-efa4275a3b0e)(content(Whitespace\" \ + 2626a9a9-4198-4a86-b8f2-3500e9cb711a)(content(Whitespace\" \ \"))))(Tile((id \ - 4c3c23b6-453f-438d-bda9-c54e11eb6acc)(label(Exp))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cee23988-7c4d-472d-9d03-49193e44c6e8)(content(Whitespace\" \ + 46fc6260-3a83-41ee-866b-c4cc8cd1111e)(label(Exp))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + bb64600d-2705-451d-8aa5-6262e7b636ba)(content(Whitespace\" \ \"))))(Tile((id \ - 08eff29d-3d25-4d39-b2cb-15fa31175737)(label(->))(mold((out \ + a78ed931-8037-4114-ac34-be1ade56048c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dfe0f84d-ebc0-47ee-9b99-fe69595d7865)(content(Whitespace\" \ - \"))))(Tile((id \ - 991b6b4d-afb8-4080-a4f7-e2391d097a8f)(label(Result))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cc1ac093-4609-41cf-bcf7-0936b925e527)(content(Whitespace\" \ + 9681c2d9-0161-4d99-bfdb-e18e3e1bc9de)(content(Whitespace\" \ \"))))(Tile((id \ - b454082f-310a-43f6-92e8-2023295e5d00)(label(=))(mold((out \ - Any)(in_())(nibs(((shape(Concave 0))(sort \ - Any))((shape(Concave 0))(sort \ - Any))))))(shards(0))(children())))(Secondary((id \ - aed6b7f1-7475-4f11-a0a1-671cdac46688)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a3c447c9-fdf3-4687-a594-d2e08f28dfeb)(label(fun \ + 82eee8dc-99a3-4c3e-b156-048d82ff8d5f)(label(Result))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c5fbf234-e043-4a7d-945d-5bb0dc258873)(content(Whitespace\" \ + \")))))((Secondary((id \ + ed833e4a-3313-4534-a282-4acfd67e4c2b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3403c2b5-b387-4466-97e1-d72fa1ecda86)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e01238f2-d698-494e-bc7e-425ba4bc8f32)(content(Whitespace\" \ + bbff0fa9-4834-4255-9aea-cec151b04b4c)(content(Whitespace\" \ \"))))(Tile((id \ - bbf50d92-7dd1-4b6e-9bb3-d8f6cec230d1)(label(e))(mold((out \ + 70a5a767-8ebb-4e95-9f03-4c1faa1ec61d)(label(e))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 12c5fb3d-efc6-42c2-885f-51f61e74819c)(content(Whitespace\" \ + 6fde9f47-c44c-48c0-9f17-7e8fecc6ec00)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4b3d7ce6-00a6-46c2-9648-6304789b69d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9b1b141b-5d1d-46b5-8581-f361375e5c31)(label(case \ + 461010ea-59b8-4ee4-a732-d77490818a3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ef9037be-faca-4799-9551-302a142c752b)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c53a231d-bf30-4e8a-83f1-d3d4a6eb01e1)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + a57457b9-c3e8-4de9-8b9d-97499f1bed88)(content(Whitespace\" \ \"))))(Tile((id \ - 2e7fe577-93e7-475d-99dd-431445c5e354)(label(e))(mold((out \ + ba896d6a-c822-44a5-b995-be0c1d761b71)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d8383b81-13a8-401d-a11c-ebe68c525c58)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c973035c-3ea4-4286-a4f7-e58cdfe9fa95)(label(| =>))(mold((out \ + e4b9e9e3-0313-4142-96f5-f070c4a80d70)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cc704393-5dd7-4cf7-b560-563d566fa55d)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 275c43cd-1b36-4553-b8b0-aa8e4fa46fa3)(content(Whitespace\" \ + e895213d-b36b-4d2f-bae9-d9c185752c71)(content(Whitespace\" \ \"))))(Tile((id \ - a0a6cdcf-b5da-4e9f-973e-84d7b4a08494)(label(Var))(mold((out \ + 96bbdf9f-e0f5-400c-8afc-7ee2d2d7d7fe)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 093347d4-0dbf-4b8a-b367-41713c84536b)(label(\"(\"\")\"))(mold((out \ + d3abb9b8-e69f-4801-b723-cd32c6615f72)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 0daaacae-958d-4dd7-af51-83fd0cb626d8)(label(n))(mold((out \ + 93f7d776-7055-48c0-96ec-e577ab1f7326)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 0ce81b52-c0d8-4acc-837b-9d32bfd0c0ea)(content(Whitespace\" \ + 85cc2b53-f588-4b7a-8998-148557183a03)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1d83ca97-016b-499c-84ea-b3a8bb806750)(content(Whitespace\" \ + fd193778-0b3d-4304-bf66-495f36204e9b)(content(Whitespace\" \ \"))))(Tile((id \ - c3634472-05cf-4c5c-b913-f14a9e5cc769)(label(Error))(mold((out \ + 259d2183-3516-4eec-9a66-4acaffacb15d)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f09d1916-fa47-4d9a-8f77-c33ff712ae38)(label(\"(\"\")\"))(mold((out \ + af80c54a-2168-4098-b7ec-dcdf436391dc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0d8288cc-c0a9-440f-a889-6a75109d0c3d)(label(\"\\\"Free \ + 8c2871ad-1927-4cbf-95f8-e236b8e5014c)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6c81c8e9-4d9f-44bc-a5a5-4b2d3748f200)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b091ed2d-bf15-4912-b7a1-130d9f070d2e)(label(| =>))(mold((out \ + a7c14b76-668d-4735-b6cb-fd5584c19b72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 563e3159-5703-4282-b834-dedab2d10848)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b3dba565-ac47-4ce2-9ee9-2d7c09390978)(content(Whitespace\" \ + 0ee724d9-8a47-413f-8216-ee4184863734)(content(Whitespace\" \ \"))))(Tile((id \ - 96f489ef-143e-4d52-ab91-3ba010381a2f)(label(Lam))(mold((out \ + be27def7-6a2f-46cc-b6af-0dd5f9b55a43)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 27f5147f-345f-49b4-80ab-9807e8c36250)(label(\"(\"\")\"))(mold((out \ + cab30b35-7846-4d9d-9392-ad6c3d1b89a1)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 4613c115-0949-42d8-8322-08f880acf8c3)(label(x))(mold((out \ + 31314485-5fd5-4a00-a8f5-953d7fcad2ff)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c89ab053-4c92-48d1-9bce-0c4c6dc7e20f)(label(,))(mold((out \ + 1a288c4e-0924-4998-b996-c71b86b9b6f0)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 85f45e4a-9397-447f-8736-90983ea6217d)(content(Whitespace\" \ + 638db553-9091-437b-ba06-e0c0acd7773c)(content(Whitespace\" \ \"))))(Tile((id \ - 4b46a104-652f-4dce-a534-90cbffea72b2)(label(body))(mold((out \ + 16e812e7-d529-4cb2-80fe-dbb581ecb435)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 57ec8c92-c009-4b6f-accc-0d6f03acf689)(content(Whitespace\" \ + d72d86d5-7c36-4142-bb12-0b764da43ac6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9749a2c6-6dd6-401f-84b1-cd84e3e77d2e)(content(Whitespace\" \ + b9de2e7a-1513-4ab7-99a5-332a67f8035f)(content(Whitespace\" \ \"))))(Tile((id \ - 4df6b9cb-10b3-4354-ab67-43520b015d45)(label(Ok))(mold((out \ + 3b75d7b6-7e4a-45c0-86f4-1ab495361118)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 69780fac-0d7b-459f-8857-fd08cff36c5a)(label(\"(\"\")\"))(mold((out \ + 6698cb11-bd0a-4cb4-8f9e-cd104bc5ad3f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 29c9df7b-81cb-4752-8d28-5f6474ced8bd)(label(Lam))(mold((out \ + 31b8b482-95f8-433d-b9c5-08e4547f7cea)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 08024dcf-dc8d-450e-a5aa-11e051461ce1)(label(\"(\"\")\"))(mold((out \ + 3b873fb5-098b-4d83-8a9e-bb35e8fe4aba)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - dcf9af0a-a532-4cac-961b-ed4ba53bd66e)(label(x))(mold((out \ + 12757c74-ac0b-4e2e-a257-7c6536a5253d)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9745a4ea-25ef-4a5b-b317-2e0313ad0013)(label(,))(mold((out \ + 797fd0b4-5db4-4688-a9c3-0e2526c9eeee)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2bdcbf11-be1a-4def-8af0-23968a1b5200)(content(Whitespace\" \ + 3c973366-7f34-4998-a8c9-7b9b4d2dbfcf)(content(Whitespace\" \ \"))))(Tile((id \ - 0ac0f6aa-db40-4f22-a3e9-aeb5a53b8d61)(label(body))(mold((out \ + e2c8fc80-7fa8-46dd-a878-ecd2dd111791)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - a6305a92-679f-4e04-9efe-58426a5c25ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 32755da2-374b-47c8-a5f6-8ccce5cddf42)(label(| =>))(mold((out \ + fa2484cd-6929-4b16-a472-0364b11f9e72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 631a2bb6-52a0-47cf-a86b-b0bdecf8e3c7)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 78eb6d0e-5a8c-4147-912d-a62d610104ed)(content(Whitespace\" \ + 2cbb78c7-17b5-4378-95dd-586a55926304)(content(Whitespace\" \ \"))))(Tile((id \ - d5ce7da8-8dca-4e12-b288-b7e7184a1b3d)(label(Ap))(mold((out \ + eda7aa5c-9f3b-427b-beaa-67e8f93a7b73)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 773aeeaa-bfbb-4a13-873b-4e57610ba813)(label(\"(\"\")\"))(mold((out \ + 5a8a88a4-02bf-478f-b781-9858d7553651)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 873be169-1ef0-4027-9424-30ed00780a5b)(label(e1))(mold((out \ + efd2c12d-31d3-466d-b6c9-687b099aa86a)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 94d0e70d-4bfa-404d-bdef-ac9f9aab6fcb)(label(,))(mold((out \ + 2fe116b5-f64c-492d-b02c-cfa2ec68a295)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - ed5a21e7-4d69-49e6-b28d-0b2d7c99c1e0)(label(e2))(mold((out \ + 20eb5a27-ba46-4425-a295-8e0ef1f12eff)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 29bbc37f-7550-4931-b256-85a1cbf6b1c7)(content(Whitespace\" \ + 469b4586-a675-4096-9fff-fb1c27fcf2ba)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fcdb598b-74cf-467c-8f59-63011fb9953a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a77a91f3-be7a-4254-8b0a-30963f3b9c61)(label(case \ + a1097862-e3eb-4ae0-ae15-457d75864534)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a6e5644c-5640-4680-a5a6-f074bba4a6e8)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - b3d0d0af-3261-482e-84a0-16b80a3ab486)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + fe79657b-a3f7-4dbc-b4db-11558831b94e)(content(Whitespace\" \ \"))))(Tile((id \ - 2927f4e8-9b6e-45a0-a750-43e1f57cd52d)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - a5deadac-e478-44a0-8e58-8da72b85e64b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 21945605-63af-4196-8333-f8650781a4e2)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 42e86943-109c-4707-9481-f0d995855955)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6e1907b4-0432-4df1-8383-7231e9fa82a0)(label(e1))(mold((out \ + bd2f1cb3-e9e8-420c-aa3e-92d332a90e90)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 69fccc01-7b46-4c35-9d1b-b376e94bc027)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4e6a365e-783e-44df-9604-5ab4fee970c6)(label(| =>))(mold((out \ + 70bfa6c4-9e27-4565-8f79-aecdf1ff4844)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9b262423-fffb-4d1c-a99f-2d1a3018dbfb)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 83d765ac-f574-4bb2-9442-84f08fcd0854)(content(Whitespace\" \ + ab18dc57-b60c-40b8-84b9-9352227993a5)(content(Whitespace\" \ \"))))(Tile((id \ - 3988da6d-d9cc-45e1-9643-60955da97c5f)(label(Ok))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6af331fc-d1ce-4479-92cc-273c5d1e6b40)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a10f18cd-5344-4b39-b61f-5a534909396c)(label(Lam))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d2bf9eeb-79a8-4eb3-8ec8-d863a8545ff4)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - db272986-8b95-4f77-b59c-2cab82121b3f)(label(x))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e61d6d9e-20dc-496a-8beb-0e320b8ef1b4)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f52b7287-c6c8-4a60-9d7d-72cbdacb854c)(content(Whitespace\" \ + 635d535b-ab67-4f15-92b0-8b84b594a271)(label(Ok))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + e0572490-0b5e-449f-952a-c24d3784c2d8)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + adde2067-0554-4be2-bae5-55b50b7f7049)(label(Lam))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + eccf4acc-90e5-4167-ac74-f937a55e9109)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 53c99f00-095d-4cba-a9b9-a8e6b140096b)(label(x))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + bfaa630e-15c2-49ea-8f83-79a22d83c91b)(label(,))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 15))(sort \ + Pat))((shape(Concave 15))(sort \ + Pat))))))(shards(0))(children())))(Secondary((id \ + 7078a79a-4de1-422b-992d-dfef383913f2)(content(Whitespace\" \ \"))))(Tile((id \ - a6230176-d042-4e0c-a0e5-b55650deefe4)(label(body))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + abafb7f2-8735-47be-a3a0-76d378914438)(label(body))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ - d83384bb-f2f7-4167-83f8-52b37b932274)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c649db7e-abb7-4d29-a4b8-6a917a76c6c6)(label(case \ + Pat))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ + 234542cf-aa94-4b59-9295-b6f0330b3d88)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9a10f086-5802-48d2-b6b1-106a44b1ab95)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 4ee7b4d8-7b0b-4f6b-a94b-dc6df6690f52)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 41212237-4c04-4dc8-afc3-bb30be4d2e21)(content(Whitespace\" \ \"))))(Tile((id \ - 04537911-d2b3-4bf5-9d40-5eda36555783)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 5d1cc75b-f5ac-4a47-bba2-0831c724892d)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 594ab7ab-9dd4-46ff-8c66-20cee405020d)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 3278a946-2a05-4e67-a79f-d72704219c05)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ba7a99d4-6e44-453c-9d4d-2d988ff0a0f2)(label(e2))(mold((out \ + 1d662566-cec7-41d0-a431-c64e30ceceb3)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b42fae89-17d4-485c-8f41-7f9640b738bb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0d80368b-18b2-44fe-a92e-9408583abc55)(label(| =>))(mold((out \ + 776d0819-9903-4357-970e-7c3ee8ac0f79)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + abc35498-fd39-4d4a-8f8b-cadb8a0f90e9)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 96b4517b-6722-42c2-bf70-765c00c616cf)(content(Whitespace\" \ + e8cc0d8b-a6f5-4ce5-8d87-bbc3398cef21)(content(Whitespace\" \ \"))))(Tile((id \ - 5b0d9ff5-4bd8-4cf3-9e92-aa9cd009cd1b)(label(Error))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 99e762bc-06d2-4964-88b3-2daf6f84e986)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7d42828d-6570-4184-96eb-3e58f43a6625)(label(err))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + 5263fafa-c903-4e4b-a427-f713b0b0773c)(label(Error))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 55fc3d5b-45eb-47a5-ba84-6c4c035a2183)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 264a1c30-73b4-4d55-83ab-0fbafdca75e4)(label(err))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a31e06b9-1a1e-44ec-af9e-c0f6d3b19a53)(content(Whitespace\" \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 2a5a8d54-90c8-4c77-aaba-a78e5a1b79d9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8421d32c-3977-4108-b7ba-9d27f806c4f7)(content(Whitespace\" \ + 24465f4c-2416-4452-9eab-0a16fc08a4b4)(content(Whitespace\" \ \"))))(Tile((id \ - a7bd323d-f9dc-4163-b6ff-f5a7a0b6fcaf)(label(Error))(mold((out \ + 1fb7ca84-9cd8-4098-bbc7-6bf6215b591c)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 95206643-fea8-4656-b431-55189d09a120)(label(\"(\"\")\"))(mold((out \ + f6b4c319-31e0-4b8a-9f49-b2692654b5ec)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 482befdd-a796-4162-9b72-71394e0775af)(label(err))(mold((out \ + c8e36181-fb57-4c62-80d5-bea111a15135)(label(err))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6ebf66c0-f868-4171-bc9b-7c8b0e12bd80)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 766eae28-d0e4-402b-a571-5b695e6c901f)(label(| =>))(mold((out \ + 66e3f749-c63a-4d79-b815-752e17743e6d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f184b9ff-efa3-4ac3-95da-78d17b87ecb0)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 86f65de1-27b4-4f4b-bf54-0f5b69bf2065)(content(Whitespace\" \ + fe6f3526-d3e4-499f-93b1-240c9a28293f)(content(Whitespace\" \ \"))))(Tile((id \ - 6714c29b-7a44-4822-adbe-2563584c0f71)(label(Ok))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cdddf749-a707-43af-8f4a-762da3a449a9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 59797ce4-c51c-435b-9a0a-216844d5d133)(label(arg))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + 41741f6a-52a0-4fa1-ad87-d7bef47a1760)(label(Ok))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + 5e3112fa-c1b1-45ec-811a-40ad0622cb67)(label(\"(\"\")\"))(mold((out \ + Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ + 4d348a5f-1b37-4ae2-80d4-1a0ee20f0ddc)(label(arg))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f817396f-09e0-45e7-a4cb-a131291b2d4c)(content(Whitespace\" \ + Pat))))))(shards(0))(children()))))))))(Secondary((id \ + 3aa6e2a9-6fe0-4653-bdd4-fcb54661f097)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7d98d56b-caab-4c2f-8c2c-04c3378c6c20)(content(Whitespace\" \ + f514dfc5-6cfc-4c9e-ae39-8c1ed43f3b28)(content(Whitespace\" \ \"))))(Tile((id \ - ab042364-5fd0-4837-b51d-ed1acad58e46)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 \ - 1))(children(((Tile((id \ - b9eccf11-dd4d-43c6-abd2-e2aabaf892c9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + 0374f3a2-0104-41f5-ab3f-a353260f0f22)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 38a4fd05-5759-4d39-9f2a-fa83919a6e38)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7fa1bed8-4353-42b0-8180-b1b9a03d521b)(label(subst))(mold((out \ + f3c1c0f1-a961-4d88-8485-0c9315ee83ff)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6d09302e-1eb8-435d-8a4d-47c8ef1f1b90)(label(\"(\"\")\"))(mold((out \ + 555f55ac-894d-44bb-8266-c1a9682c468e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fa33f767-b6ac-4307-9f24-1ecba14ea90d)(label(arg))(mold((out \ + d0a09e33-b49b-44bb-bde0-2badc0c7d9d2)(label(arg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bf74e370-f4cc-49a2-a7ba-4a099a79c84a)(label(,))(mold((out \ + 447cace9-0fa3-4fff-b531-b3cbc849435d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e02bd12c-157d-4e7f-a0ec-3ae5cc0a1222)(content(Whitespace\" \ + bf8a262a-5bb7-4138-ad1a-813e1c465fc0)(content(Whitespace\" \ \"))))(Tile((id \ - fe1686bc-0eda-4913-984a-309788d2c60d)(label(x))(mold((out \ + 6b3f6aff-04a4-46e1-a8a4-f41504c15c0c)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c20f6115-6012-4e8b-8c25-31b573908376)(label(,))(mold((out \ + 4046df92-b37b-4122-950e-25e7188e90a0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4e558bda-5486-4e7f-af07-f14a40cfb619)(content(Whitespace\" \ + 98137c97-221b-4717-acf1-928e65eae632)(content(Whitespace\" \ \"))))(Tile((id \ - 196d597a-5d3e-4fb2-b471-29e578674fb0)(label(body))(mold((out \ + 1f77ed77-d070-44fd-bb6e-c42f5ed962cf)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))))))(Grout((id \ - eb4019c6-b76a-4002-ac16-efff924c7031)(shape \ - Concave)))(Tile((id \ - b52ba3cc-cb19-4772-ab94-b852a30d5846)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c26d297e-1bdc-4d21-9dc7-37c5ffebcc62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 52457af3-876d-42e8-8253-b1e2bd5f3eca)(label(| =>))(mold((out \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + a7ee3f99-4ca8-4ebe-9f54-40785e5cb780)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + a6a50b08-3fcc-4937-b8ea-de67015bc941)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0442bb30-bbc4-4c21-b116-4c25b717a8f7)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9fda1185-0e6e-4a5b-b2ca-e049a19c5c92)(content(Whitespace\" \ + f5254011-e85c-4fb6-9309-d6dd51db7449)(content(Whitespace\" \ \"))))(Tile((id \ - a6f1dec3-a12c-4398-8912-bb15bb310546)(label(_))(mold((out \ + e1fe9dcf-1af4-4370-b3f9-52b7fb8c02f6)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 93fde5a2-d440-4c66-8a99-7b9451801410)(content(Whitespace\" \ + 0218bc96-de86-4e1b-b004-fc6f4ee34359)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e7d14f23-0824-464b-a4a6-89a8fa2c43a2)(content(Whitespace\" \ + d95e5e33-8e1d-4826-92d0-a2edbb1334a6)(content(Whitespace\" \ \"))))(Tile((id \ - f1008fe9-b0ad-4d26-8d77-df2c44cc8ffb)(label(Error))(mold((out \ + 93ebb889-6470-47b8-bed9-038bb6067fd1)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - de432272-f63d-4ed3-9fcc-d282a868754f)(label(\"(\"\")\"))(mold((out \ + e431732a-ff7e-4c2d-8577-70f31df6dd2a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 715f8f3f-cd2c-40fd-a79b-8d55e766a809)(label(\"\\\"Not a \ + 0f49e3db-4e8c-4485-b9ce-566cb07ed83b)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Grout((id \ - 6d5fe342-943a-4eb2-ba5f-cf1483a14b0f)(shape \ - Concave)))(Tile((id \ - dee51936-8716-43a2-833b-b110a41ce3f3)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Grout((id \ - b8b4f1fe-2904-497e-bba8-d8cbaf0c63c9)(shape \ - Concave)))(Tile((id \ - 347c3d6f-3183-498a-8d95-c90f84f30cd5)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 453fb194-a1e6-4381-b510-3cfc4a3ef12e)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + e8674c94-d93a-4807-a026-054226eaedb0)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 55467e2b-a040-47b0-878b-eaa6c51b19c9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 853929f9-cda6-4d86-a444-fa0002fa7f64)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ee55010c-768e-46d7-9264-d1d1f3b8cde9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c0ca4224-219e-427e-9415-f1f34cd9897c)(label(test \ + 7a8d6ec5-05b8-47e8-9b2f-cf106cd2c69c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 45b92fd9-afec-481c-aa1c-11675cfeb305)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e8234637-28bf-449c-a58a-a21f3740669d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1e8a79f2-5adf-45b3-ad8e-8f294ada7e04)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 74950d4d-36c0-452f-ad57-14e3145c15af)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 6094ebbc-987f-4b3a-ba3b-d4590f5d5122)(content(Whitespace\" \ \"))))(Tile((id \ - ff7b8d66-07e1-4bd9-82eb-876e95eb5ef9)(label(result_equal))(mold((out \ + a5a6fb47-d197-4169-81ef-3913fd7d121e)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6ec84ba3-dfa5-4209-868d-1e2e0260cb94)(label(\"(\"\")\"))(mold((out \ + 90259ca4-811d-4e5e-82ca-d8b9038f350d)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + 08c57702-d6ab-41ae-963b-889b16006a39)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a0648b0b-05b2-4b5f-a507-9707f77104d9)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + f9ec2ee8-0fc3-421c-90c3-e97df74b1fea)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f624a85c-5f2e-46a8-8e45-21635fc640b4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4ee9e1bb-2b95-4aab-b22a-e14cc7e4a5c9)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - fba821f2-2af9-4828-a370-94cfa94be0a3)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2276cd49-4002-4b26-9d63-c3852bb89153)(label(Var))(mold((out \ + a90263ed-b3c8-4b97-a32a-3b1703eae933)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a432ca67-f008-4301-a67a-963c5a8a104b)(label(\"(\"\")\"))(mold((out \ + 7df28413-cbe4-4d9b-892d-735862802f01)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e45299e3-3a7a-458d-aad2-3ba9228cb65f)(label(\"\\\"yo\\\"\"))(mold((out \ + 93c72da1-185b-419e-9a6f-a2647aa684f4)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 66a71ea7-c5aa-409a-8acd-b7b3d9c262e0)(label(,))(mold((out \ + 1a7c34d9-f50d-457e-a793-4ecf1c232a83)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 80f7c7f2-ec3f-4fa8-89f1-1968e4212236)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 14a94e6f-e2d4-4476-a5ed-483b916dfe20)(label(Error))(mold((out \ + 003ab1fd-9832-45d1-b4bc-71507ae7efa0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 70b27edd-711f-4a47-b37c-ce94ad2eb672)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f389c646-e080-4d39-8c16-84071712f5fc)(label(\"(\"\")\"))(mold((out \ + 45121480-ee6d-4407-acaf-f9d2a7a05f74)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 646e668f-be4f-46c6-8eac-fd115e1c90e7)(label(\"\\\"Free \ + 52856d4d-6cfd-48a7-b67c-67a48dca192a)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Tile((id \ - f01fa49c-e3d2-46b2-8d63-14e7224303eb)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 3eeaf2e0-00a5-4c28-93af-b512bafda555)(shape \ - Concave)))(Tile((id \ - f8b5db20-eff9-40a5-ad72-c299b0a10578)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b3e597ae-59cd-443c-a751-7a644809bc54)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + b1664e5f-802e-4cd9-ae37-2a17ababbdde)(content(Whitespace\" \ + \")))))))))(Tile((id \ + c6b8cce8-f0a7-4d81-817f-76c332c61202)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 67c91b70-4934-4233-91ed-ffc100daa927)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7a3020e6-c8b6-4db4-9f25-7ec7d6dbd511)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 24cfe539-f6af-4863-8111-78265a29f465)(label(test \ + 7a10df4a-f107-4a90-b690-efde0cee5118)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b98db53f-b82b-494f-bc54-162c5dbb4e38)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0151d06d-26cd-4a4e-a1f7-4595e62b963b)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f683e1e5-76a1-4e54-82cf-240cc7660748)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 2be0afaf-0ea0-417a-8b85-13917589fa61)(content(Whitespace\" \ \"))))(Tile((id \ - ce3031ac-1d89-4148-803d-d05707462ae9)(label(result_equal))(mold((out \ + 7485c363-bd50-417d-b2a2-f4e9c04642e1)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a4330d8f-ce4a-4a77-8b24-56e8dfcf2461)(label(\"(\"\")\"))(mold((out \ + 2895db6a-2296-47be-8070-ebae8674c840)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + a15c093f-7ae0-4576-a671-111ce31e8316)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0d09c652-1c89-4c6a-8f21-6dc56e3c800c)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 570331d6-cc2d-442f-8fba-d2c5bf958fd0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9675cf30-b73b-4e0d-bf78-6735eac23c1b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 137ab8b8-acd4-4669-b8b0-0981cd8e38fb)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - c572acd7-dccd-4ed5-abb5-f2da9d078542)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 537de2c5-0598-4028-a97c-81fedb243caa)(label(Ap))(mold((out \ + 902d3c61-293b-4559-9d99-c192329f5e5f)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1f20e64c-aa60-43d1-b137-bec3c4cb4234)(label(\"(\"\")\"))(mold((out \ + f984d7d1-d685-4799-b320-884c762200f8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 481ffa47-3479-4fd4-aef0-ec4e05cc3c61)(label(Var))(mold((out \ + cd2912c6-c409-4fda-aab8-35956cdd26f5)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6d5fe24c-1cca-4efd-b6dc-ffc6858aa1f2)(label(\"(\"\")\"))(mold((out \ + ea59c66f-6572-4ca8-aeac-bcd270388fbd)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 98792c20-dd96-4ce7-8d17-add9541b28d0)(label(\"\\\"no\\\"\"))(mold((out \ + 51a16fb1-c1ef-466a-a33f-ffb7cb80cf33)(label(\"\\\"no\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 98b65b81-6539-4b24-9500-855528e16682)(label(,))(mold((out \ + b4d9c33f-afad-4030-9e81-ea65a3139dd4)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3724d856-b083-4bec-80d0-6058a7ae455e)(content(Whitespace\" \ + a80fc258-b58e-4978-9e8b-2bdd4d4a68f7)(content(Whitespace\" \ \"))))(Tile((id \ - ec9b0349-f5e8-4f8e-93a4-a1e0f2db7fcd)(label(Lam))(mold((out \ + a0af3a35-0d79-4b9c-9592-a4216f0afd34)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ddea437e-54ab-40dd-b951-4d946f9c43bf)(label(\"(\"\")\"))(mold((out \ + 46c8174b-eec5-4ef7-8b69-a0322825a218)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d5e303b4-6e50-496f-bea0-af9af0184d07)(label(\"\\\"bro\\\"\"))(mold((out \ + 1ddfd455-7913-4134-80df-0b22160d61f0)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fda258b9-0b99-4c39-9b90-8fe568848e1b)(label(,))(mold((out \ + ac5e7f7b-60a9-485b-badb-7e1c8fb7a403)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1ac874fc-c4e2-4438-9006-a3cb9e5ee8f8)(content(Whitespace\" \ + 1924204a-227d-466c-ad74-d58628946239)(content(Whitespace\" \ \"))))(Tile((id \ - 4174eed5-c0d5-4c61-8e6f-cad8c934a03a)(label(Var))(mold((out \ + 37f924a4-e678-4bb6-a7c4-7bc7859475d4)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a2e177e3-0d65-49d8-8f62-fa60cbdf0fa7)(label(\"(\"\")\"))(mold((out \ + 5d9ffe55-e724-4f81-9852-3a952f6ee39e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c270175c-8fb8-402a-9836-8ab7bd7149af)(label(\"\\\"bro\\\"\"))(mold((out \ + 08d893d2-8e40-4460-af5c-706f6d3811ae)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 4d39626a-14df-44e2-a033-a394a222095e)(label(,))(mold((out \ + 8979711e-777a-494e-8f10-a26eb35e7ee1)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - edd7fc69-dd7b-47db-a1e1-f11973db7a00)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3a369da7-a363-4900-b89f-35aacd302e90)(label(Error))(mold((out \ + 868414a7-f682-4dc2-ac82-5d4836fca682)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d0cd5b04-b38b-4b42-9379-3157c07ad1dd)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 04a787ed-35e9-498e-9557-d8c3bd6eafdc)(label(\"(\"\")\"))(mold((out \ + 230bec03-8de0-4f59-a6de-e2cfca4cb421)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bcd0433d-3102-49ee-b628-d265aac1138c)(label(\"\\\"Not a \ + 49ad20d7-f3c2-47de-b0ff-870a6be8c8d4)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Tile((id \ - ce9cf06e-4146-455b-9bcf-d58798d189b1)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 301ffd0d-3c10-4afd-8ea9-bf25fe71c1c9)(shape \ - Concave)))(Tile((id \ - affb46fa-aab9-4bfa-9c81-cc48a2b4db10)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4e753e38-3cda-49ae-8d2f-2bd72ed46121)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ + 84194f1b-3ec9-4047-afaf-cc110e1535d7)(content(Whitespace\" \ + \")))))))))(Tile((id \ + e9f0314f-b20e-4087-9bba-b23644d30076)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 761fc46f-0804-4b4d-90f0-b086c3a76e72)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bbe28995-9f42-45e7-8043-58aee3af0d9b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1a1e5183-343b-40f6-a989-49ce75e55a96)(label(test \ + 942c0f5e-b689-4bb8-8fc0-7a4c0cd62c0c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5d1dbc4a-da22-417d-87ae-d5bf3974ae05)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 237abbf2-5347-4efd-9e42-ac87987b30ea)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - d015a34b-8478-4fdb-97f0-e50554cd44e8)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + cfc0eaf8-a2c8-417c-b9b1-25c24430ac7f)(content(Whitespace\" \ \"))))(Tile((id \ - 9faa6b55-ac48-4534-b1d3-cfa0152be78e)(label(result_equal))(mold((out \ + 75994931-1e08-4310-a5d6-e5725ef06311)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 44072989-144d-45ea-9ab3-51bccee14678)(label(\"(\"\")\"))(mold((out \ + 5109b948-0e5f-448b-b955-7ac829c3afd1)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + 07f5536a-509a-4c5d-ac1d-fc9898764ed5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1ed95fba-a9f3-4d96-ae6d-8f9fdd3ae5ac)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 8c82afd5-a7f7-4d9f-8af7-0758b6b0dfc0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ef556df3-2bca-466a-811e-25b911c70aaa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 96080ecb-74e5-4e8e-af68-63ee8aeef5c8)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 7b91818e-f335-4f73-b6c4-8c1c7fd0274f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 01767806-64eb-4d9a-aadb-8ae55864f787)(label(Lam))(mold((out \ + b0e4f88f-7a5d-42ff-ac82-a2e00db35470)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 192937aa-d047-4157-9c72-b4e8ba5b5fd5)(label(\"(\"\")\"))(mold((out \ + b43c70aa-3882-4631-af74-fdbbb08ec450)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8b548288-530f-48ef-92fd-e0ad74daf482)(label(\"\\\"yo\\\"\"))(mold((out \ + 89d67f29-9084-4e15-b211-5c66d99c4fc3)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2a080ccc-406b-481f-b122-67d18412f3f7)(label(,))(mold((out \ + 158b4637-5f89-40bf-abff-a3191fbc3bbe)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2bddedf8-84e9-40f1-8b5b-bc7dce1b83ed)(content(Whitespace\" \ + 3b9c9dcc-09a4-4afa-b571-63577837dde0)(content(Whitespace\" \ \"))))(Tile((id \ - 61ff61b0-9f58-4599-9deb-34232b93e8d9)(label(Var))(mold((out \ + f9e0908b-7fa0-418c-b050-19bcd78ccf09)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6f0bd9aa-a2c4-4db3-a0eb-87693dbbb0f7)(label(\"(\"\")\"))(mold((out \ + 01ff76a3-9d39-4782-9d03-bc02f98577ae)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28d7fbbd-8d0f-4a57-b18f-42c8444c74f7)(label(\"\\\"yo\\\"\"))(mold((out \ + 251c79d1-3b6f-4655-9baa-25be3fdf5e81)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - ce1d238e-4741-4f4d-bd3d-19965c15cda6)(label(,))(mold((out \ + eccc83ca-6bf2-4fa4-a569-9b6fd9801d96)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b1d22a00-684a-4838-af8a-d9b365c97e41)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a6eba58d-9f49-496a-9c1b-6f83fbbaac4d)(label(Ok))(mold((out \ + 51df95ee-9959-4c38-853d-0b9815f2d1d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 78675b1a-1ebb-48cf-82bf-e428913d42a7)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 98dd541e-c9fe-4fa4-be89-aafb0b7e1a01)(label(\"(\"\")\"))(mold((out \ + d7751996-48a9-451c-87a9-c662dc3931b0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0830c92a-0af7-46c9-924a-800686724ca6)(label(Lam))(mold((out \ + 7a1ddecd-15dd-4afd-a2a8-bc61e688f2e6)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0a213faa-3104-4cba-9af2-7f7fcf852ee8)(label(\"(\"\")\"))(mold((out \ + 8989861a-8871-4e45-a02e-49827d163dd3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab883086-f48f-4037-927e-00d0345830ce)(label(\"\\\"yo\\\"\"))(mold((out \ + 30acbec3-ad58-4358-b9a7-040a4dcb4f77)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b4a47b75-6412-4046-af36-ca4874288b8b)(label(,))(mold((out \ + d153a0f1-f2ba-469b-8f79-d628aea52843)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7062d81b-2a80-4de8-9eeb-147f8d3344f7)(content(Whitespace\" \ + 2d0ef5f6-d129-407a-8540-48655fac6119)(content(Whitespace\" \ \"))))(Tile((id \ - d4a21313-06f9-4ad3-a13e-81858ec73e41)(label(Var))(mold((out \ + cb93abd5-576a-41f4-b3e1-f48a09a8a6d0)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d486dc82-0a8e-472e-b697-9742883c0eca)(label(\"(\"\")\"))(mold((out \ + 7c96c433-be79-45b7-a15b-d98400b69007)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 10d60f2e-37f7-4785-9554-6967360d6ac9)(label(\"\\\"yo\\\"\"))(mold((out \ + dacc91ee-d7b9-46dd-8cb4-2f02552027a9)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - 62ea7b02-8d85-4e7e-b7b0-2ff1b8083b4b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 838edc3f-8fbe-45b0-b03c-4b743031ec06)(shape \ - Concave)))(Tile((id \ - 102f8aec-1598-441f-912b-f6cf46197364)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3a6955e8-1fbb-4865-b383-f347e5857bb0)(label(\";\"))(mold((out \ + Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ + 8d0107b5-1304-4692-82ad-53469ecf438b)(content(Whitespace\" \ + \")))))))))(Tile((id \ + a8014788-bd37-4b74-9744-4b3dccb4f929)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e08e0393-0645-42e1-af75-ab1a4530a02c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 41cc1c6f-2c09-4561-ad70-8d306db08237)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25c83503-5f8a-45e3-a35c-bb85f2c941cf)(label(test \ + 44000c59-c8c4-4384-8c85-832b1ca9e937)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3faee02d-d7c3-4a6c-9031-ee27360a5555)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ae80b8c9-efdc-4936-b58f-c4adf62acce8)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - e6963dad-7c44-42c1-bdb5-bb196e2a4008)(content(Whitespace\" \ + Exp))((shape Convex)(sort Exp))))))(shards(0 \ + 1))(children(((Secondary((id \ + 80a4ffda-5aea-40a5-a869-a9f441ec8fcf)(content(Whitespace\" \ \"))))(Tile((id \ - 10f1bc9e-3a97-4f90-9f64-a729a73b53ed)(label(result_equal))(mold((out \ + 10309356-b905-4d26-a104-925ec9be1324)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f761ab95-af19-4c2f-91b1-e8b1f96a9c14)(label(\"(\"\")\"))(mold((out \ + 2e0d58fe-0762-406f-b31d-3d1e7e8956e0)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ + 6d550f3f-b227-4653-967c-a3a1ddaa8766)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + df7ce05c-2a6e-4d02-bf4e-0739e936bc6b)(label(go))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 5b02ecd7-25eb-4905-aa52-53769ca4e589)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6ffcf83b-3865-49f8-bd61-a2d13fc7ce8b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 487d3abf-e70f-4887-8046-f02cac6cb2bb)(label(eval \ - in))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 96c0c1c9-7a57-4919-88b5-7b39fefd8c1a)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84123832-a7a7-4c32-8f40-a77d568ab55a)(label(Ap))(mold((out \ + 328826bb-1afb-4dbd-83f5-c7c69193ca45)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - eb4e88f2-5041-4c17-8917-f853e35d6188)(label(\"(\"\")\"))(mold((out \ + 2585d4c6-94e1-41c0-bc38-958200e47166)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0a3c11a9-aff8-48c7-91f2-d6c3e1d38df1)(label(Lam))(mold((out \ + be9e6bc2-fa06-4be7-bc0d-6a88f20b7462)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5e5213ca-a6fc-43bc-b78a-46f2e10eeb56)(label(\"(\"\")\"))(mold((out \ + 016ff999-eb93-429d-82db-de9e3b5d54a7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e6eb80fa-d461-4248-a68f-7121cbae934b)(label(\"\\\"yo\\\"\"))(mold((out \ + b0364c5b-cd95-456b-ab09-bbac75701c5c)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 60d8d65b-72c8-4c0a-95ac-6867f850b386)(label(,))(mold((out \ + 72dc8733-aa8a-4dd9-9549-07b64b7899c5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - db6ea9f1-8bac-48b6-819e-b638e08e7e96)(content(Whitespace\" \ + d7c0267b-b574-4cf0-9869-bf068fbfdba0)(content(Whitespace\" \ \"))))(Tile((id \ - 77624c5d-b604-4801-9e75-c6efa2bd65d1)(label(Var))(mold((out \ + ccb35eea-85b5-4521-bd5a-9e855cd6948b)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 65e33466-598b-48bb-97a0-9c9465b777d1)(label(\"(\"\")\"))(mold((out \ + d77c4bfd-da0a-441c-b66e-bdda91c25b80)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5d7bb14d-a762-4966-bd16-2a01c0a9fcde)(label(\"\\\"yo\\\"\"))(mold((out \ + fdd79951-cc44-4e10-97bc-f6cab6a88947)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - ea1e82c2-b0a8-424b-8c1d-6dd611b94628)(label(,))(mold((out \ + a4692af1-4104-4acf-ad10-091dea271d54)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ab5e08e-e6a1-4b77-8233-024be9b989e9)(content(Whitespace\" \ + 75271912-ffef-4c9f-a2a3-b9adf1c5b957)(content(Whitespace\" \ \"))))(Tile((id \ - 32221315-8494-4287-8a8a-2d6d2de3c46e)(label(Lam))(mold((out \ + 2ea5d37d-4ca6-44dd-b907-1635e1b6cf66)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 51626a7c-6e12-4fe9-85ad-b70e3afc9f62)(label(\"(\"\")\"))(mold((out \ + b42b9fe6-7f5b-4083-bdde-0542f512248a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f9fda7b8-36c2-48a1-a531-75959821dbbc)(label(\"\\\"bro\\\"\"))(mold((out \ + 39dd7498-15f8-4fd9-b4b0-955d31f8f511)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 22219302-bb2f-4638-b515-6abaf093bd0b)(label(,))(mold((out \ + f8572b4b-ee71-4acf-8cd8-5cd56ec2ec38)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e536b6cf-ba43-4f96-bc89-a8c4d96de268)(content(Whitespace\" \ + beb02b44-3d46-4eca-bf0e-bb2a8db51024)(content(Whitespace\" \ \"))))(Tile((id \ - a95cf59d-83bb-4fea-83c0-f4aad013ffda)(label(Var))(mold((out \ + 67f5a924-04fe-4ea6-81f2-233fef16c285)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bcf33ffe-03fe-4654-a35e-1a503dab2339)(label(\"(\"\")\"))(mold((out \ + 5c2be202-b2b9-4ef5-8b61-75546d6140d0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 559e3d55-2efc-4cc4-955d-379ef9f7249a)(label(\"\\\"bro\\\"\"))(mold((out \ + 580a3ad3-7908-4142-99b5-2a15edfd82b0)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 3a480eec-68f7-4a27-86f9-7c75295cda21)(label(,))(mold((out \ + b822c800-3312-485f-8aaa-95df1e94d95b)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - eb279abe-a7a6-4090-8eff-6b1d920eee89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1744cba3-21c2-4614-83a4-265a9cd38966)(label(Ok))(mold((out \ + 1c58b5f2-2a81-464e-8a0d-81ee0a095acd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 597c3d97-a29c-4ac9-bd09-572a9c969973)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 38582671-6318-4aeb-98b2-f059df8f17b9)(label(\"(\"\")\"))(mold((out \ + 5eb946a0-3d3b-4c5a-a666-72368009318d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 120e0db4-f3c8-4459-9c36-da9feb92f833)(label(Lam))(mold((out \ + 348f0580-d617-4e56-94e5-40315ebc8177)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ae71201f-8af4-41a7-8018-df01c3fed607)(label(\"(\"\")\"))(mold((out \ + 4d002dab-e9a3-4342-983d-f89d8adf9790)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ff427ec3-b6e6-4a94-bab3-4dc20dce41b5)(label(\"\\\"bro\\\"\"))(mold((out \ + 1e18c60c-8cc2-4888-9a82-de4abb2e8009)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 746e5359-6dd5-4bcc-8a02-fd4e148ff718)(label(,))(mold((out \ + bec1f96e-270b-4b38-ac23-f91a922ecb9d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f44183a9-3965-4cb7-9365-4ad8609e30ea)(content(Whitespace\" \ + 05be8227-cbdb-436e-a30a-1f07128600fa)(content(Whitespace\" \ \"))))(Tile((id \ - f3567477-6c77-45b1-9d18-1ec90f8f4038)(label(Var))(mold((out \ + ac143494-1d0a-44ee-8ec4-eb67fa980bd4)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 89817bb1-bfed-4c35-90ad-86abf6188045)(label(\"(\"\")\"))(mold((out \ + 53049946-13b9-4533-90a9-9ae50158b5f4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c33649bc-83a0-4d4e-918a-6f7f1b32ca5e)(label(\"\\\"bro\\\"\"))(mold((out \ + d8925efb-88d4-44b2-b35b-7123979599cd)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - b88aa814-3348-4d9a-bb7b-87b83a5b89d7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(1))(children())))(Grout((id \ - 22a799fd-4697-4309-8926-6f1c9767e7e0)(shape \ - Concave)))(Tile((id \ - 72a61fe2-a2ef-4e93-93f8-99f84c85d3cb)(label(end))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ - Outer)(projectors()))"; + Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ + bd33c025-a7f7-4b24-b2f7-e8a2db44419b)(content(Whitespace\" \ + \"))))))))))))(ancestors())))(caret Outer)(projectors()))"; backup_text = "# Lambda Calculus via evaluation by substitution #\n\n\ # An Expression is a variable, function, or application #\n\ @@ -15788,36 +16889,37 @@ let startup : PersistentData.t = | Error(e1), Error(e2) => e1$== e2\n\ | _ => false end in\n\n\ # Evaluation by substitution #\n\ - let eval : Exp -> Result =\n\ + # Evaluation by substitution #\n\ + let go: Exp -> Result =\n\ fun e ->\n\ case e\n\ | Var(n) => Error(\"Free Variable\")\n\ | Lam(x, body) => Ok(Lam(x, body))\n\ | Ap(e1,e2) =>\n\ - case eval(e1)\n\ + case go(e1)\n\ | Ok(Lam(x, body))=>\n\ - case eval(e2)\n\ + case go(e2)\n\ | Error(err) => Error(err)\n\ - | Ok(arg) => eval(subst(arg, x, body)) end\n\ + | Ok(arg) => go(subst(arg, x, body)) end\n\ | _ => Error(\"Not a Function\") end end in\n\n\ test result_equal(\n\ - eval(Var(\"yo\")),\n\ + go(Var(\"yo\")),\n\ Error(\"Free Variable\")) end;\n\n\ test result_equal(\n\ - eval(Ap(Var(\"no\"), Lam(\"bro\", Var(\"bro\")))),\n\ + go(Ap(Var(\"no\"), Lam(\"bro\", Var(\"bro\")))),\n\ Error(\"Not a Function\")) end;\n\n\ test result_equal(\n\ - eval(Lam(\"yo\", Var(\"yo\"))),\n\ + go(Lam(\"yo\", Var(\"yo\"))),\n\ Ok(Lam(\"yo\", Var(\"yo\")))) end;\n\n\ test result_equal(\n\ - eval(Ap(Lam(\"yo\", Var(\"yo\")), Lam(\"bro\", Var(\"bro\")))),\n\ + go(Ap(Lam(\"yo\", Var(\"yo\")), Lam(\"bro\", Var(\"bro\")))),\n\ Ok(Lam(\"bro\", Var(\"bro\")))) end"; } ); ( "Polymorphism", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ 651cf426-87e8-4630-b2c1-0dd01f8136e3)(content(Comment\"# \ Polymorphism #\"))))(Secondary((id \ 7bf3ea0c-2409-48ec-9cbd-c4db9dd8ceb1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -17396,7 +18498,7 @@ let startup : PersistentData.t = e52d4b40-a703-48f9-b88a-81e3204309c0)(label(ex5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children())))))))))()))(ancestors())))(caret \ + Exp))))))(shards(0))(children())))))))))))(ancestors())))(caret \ Outer)(projectors()))"; backup_text = "# Polymorphism #\n\n\ @@ -17565,8 +18667,22 @@ let startup : PersistentData.t = } ); ], [ + ("scratch_ADT Dynamics", Evaluation); + ("scratch_ADT Statics", Evaluation); ("scratch_Basic Reference", Evaluation); + ("scratch_Booleans and Types", Evaluation); + ("scratch_Casting", Evaluation); + ("scratch_Composing Arithmetic Expressions", Evaluation); + ("scratch_Compositionality", Evaluation); + ("scratch_Computing Equationally", Evaluation); + ("scratch_Conditional Expressions", Evaluation); + ("scratch_Functions", Evaluation); + ("scratch_Polymorphism", Evaluation); ("scratch_Programming Expressively", Evaluation); ("scratch_Projectors", Evaluation); + ("scratch_Scope", Evaluation); + ("scratch_Shadowing", Evaluation); + ("scratch_Types & static errors", Evaluation); + ("scratch_Variables", Evaluation); ] ); } diff --git a/src/haz3lweb/dune b/src/haz3lweb/dune index 00a73aba0c..1dccf62b8d 100644 --- a/src/haz3lweb/dune +++ b/src/haz3lweb/dune @@ -92,7 +92,7 @@ (flags (:standard))))) (rule - (write-file js-of-ocaml-flags-dev "(:standard)")) + (write-file js-of-ocaml-flags-dev "(:standard --debuginfo --noinline)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index e2821a2f08..176ab79e30 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -25,7 +25,7 @@ module Deco = (M: { let caret = (z: Zipper.t): Node.t => /* Projectors can override adjacent carets */ switch (ProjectorView.caret(z, M.meta)) { - | Some(caret) => caret + | Some(_caret) => base_caret(z) //caret | None => base_caret(z) }; @@ -349,14 +349,35 @@ module Deco = (M: { ); }; - let errors = () => + let errors_of_tile = (id: Id.t) => { + let tiles = + Id.Map.find(id, M.meta.projected.terms) + |> Term.ids + |> List.map(id => { + let t = tile(id); + ( + id, + t.mold, + Measured.find_shards( + ~msg="Deco.errors_of_tile", + t, + M.meta.projected.measured, + ), + ); + }); + div_c( + "errors-piece", + List.concat_map(PieceDec.simple_shards_errors(~font_metrics), tiles), + ); + }; + + let errors = () => { div_c( "errors", - List.map( - term_highlight(~clss=["err-hole"]), - M.meta.statics.error_ids, - ), + //List.concat_map(PieceDec.simple_shards_errors(~font_metrics), tiles), + List.map(errors_of_tile, M.meta.statics.error_ids), ); + }; let indication = (z: Zipper.t) => switch (ProjectorView.indicated_proj_z(z)) { diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index dba01a0bad..03bb147b2d 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -31,16 +31,21 @@ let backing_deco = ( ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~info, - entry, + ~shape: shape, ) => - switch (Projector.shape(entry, info)) { + switch (shape) { | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) - | Block(_) => div([]) + | Block(_) => PieceDec.convex_shard(~font_metrics, ~measurement) }; -let cls = (indicated: option(status), selected) => +let cls = (indicated: option(status), selected: bool, shape: shape) => (selected ? ["selected"] : []) + @ ( + switch (shape) { + | Inline(_) => ["inline"] + | Block(_) => ["block"] + } + ) @ ( switch (indicated) { | Some(Indicated(Left)) => ["indicated", "left"] @@ -61,23 +66,24 @@ let view_wrapper = view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; + let shape = Projector.shape(entry, info); div( ~attrs=[ Attr.classes( - ["projector", name(entry.kind)] @ cls(status, selected), + ["projector", name(entry.kind)] @ cls(status, selected, shape), ), Attr.on_mousedown(_ => Effect.( Many([ Stop_propagation, inject(PerformAction(Jump(TileId(info.id)))), - inject(PerformAction(Project(Remove(info.id)))), + inject(PerformAction(Project(Activate(info.id)))), ]) ) ), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), ], - [view, backing_deco(~font_metrics, ~measurement, ~info, entry)], + [view, backing_deco(~font_metrics, ~measurement, ~shape)], ); }; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 985e50e5ac..ba7668d5c1 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -3,8 +3,8 @@ open Node; open Util; let tip_width = 0.32; -let concave_adj = 0.25; -let convex_adj = (-0.13); +let concave_adj = 0.15; //0.25; +let convex_adj = 0.; //(-0.13); let shadow_adj = 0.015; let caret_adjust = (side: Direction.t, shape: option(Direction.t)) => diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 3273369c4d..0b0416b532 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -38,6 +38,17 @@ let simple_shard_path = ((l, r): Nibs.shapes, length: int): list(Path.cmd) => ], ); +let chonky_shard_path = + ((l, r): Nibs.shapes, length: int, height: int): list(Path.cmd) => + List.flatten( + Path.[ + [m(~x=0, ~y=0), h(~x=length), v(~y=height)], + r_hook(r), + [h(~x=0), v(~y=1)], + l_hook(l), + ], + ); + let simple_shard = ( ~font_metrics, @@ -49,6 +60,31 @@ let simple_shard = measurement: Measured.measurement, ) : t => + DecUtil.code_svg_sized( + ~font_metrics, + ~measurement, + ~base_cls, + ~path_cls, + ~fudge, + ~absolute, + chonky_shard_path( + shapes, + measurement.last.col - measurement.origin.col, + measurement.last.row - measurement.origin.row, + ), + ); + +let _simple_shard = + ( + ~font_metrics, + ~shapes, + ~path_cls, + ~base_cls, + ~fudge=DecUtil.fzero, + ~absolute=true, + measurement: Measured.measurement, + ) + : t => DecUtil.code_svg_sized( ~font_metrics, ~measurement, @@ -114,6 +150,32 @@ let simple_shard_indicated = simple_shard(~font_metrics, ~shapes, ~path_cls, ~base_cls, measurement); }; +let simple_shard_error = + (~font_metrics, ~shapes, ~measurement: Measured.measurement): t => { + let path_cls = ["tile-path", "error"]; + let base_cls = ["tile-error"]; + simple_shard( + ~fudge=selection_fudge, + ~font_metrics, + ~shapes, + ~path_cls, + ~base_cls, + measurement, + ); +}; + +let simple_shards_errors = + (~font_metrics: FontMetrics.t, (_, mold, shards)): list(t) => + List.map( + ((index, measurement)) => + simple_shard_error( + ~font_metrics, + ~shapes=Mold.nib_shapes(~index, mold), + ~measurement, + ), + shards, + ); + let simple_shards_indicated = (~font_metrics: FontMetrics.t, ~caret: (Id.t, int), (id, mold, shards)) : list(t) => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 60591800b5..e9bce4c2b3 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -685,20 +685,27 @@ select { align-items: center; color: #c7b480; } -.projector > * { +.projector > *:not(svg) { z-index: 12; } -.projector.indicated { - z-index: 13; -} .projector > svg { - z-index: 1; + z-index: 4; fill: #f0e7d6; } +.projector.block > svg { + stroke-width: 0.5px; + stroke: #c7b480; +} .projector.indicated > svg { fill: var(--exp-bg-off-color); } +.projector.selected > svg, +.projector.selected.indicated > svg, +.projector.block.selected.indicated > svg { + fill: var(--selection-color); +} .projector > svg > path { + vector-effect: non-scaling-stroke; /* filter: url(#raised-drop-shadow-Exp) !important; */ } @@ -770,46 +777,44 @@ select { margin-left: -2px; margin-right: -2px; } -.projector.text.indicated.left .wrapper { - border-right: 2px solid red; - animation: 1s blink_border_right step-end infinite; -} -.projector.text.indicated.right .wrapper { - border-left: 2px solid red; - animation: 1s blink_border_left step-end infinite; -} -.projector.text.indicated:has(textarea:focus) .wrapper { - border-color: #0000; - animation: none; + +/* turn of caret when a block projector is focused */ +#caret:has(~ .projectors .projector.block *:focus) { + display: none; } -.projector.text.indicated:has(textarea:focus) .cols { +.projector.text.indicated .cols, +.projector.text:has(textarea:focus) .cols { color: red; } +.projector.text.indicated > svg { + fill: rgb(255, 249, 240); + stroke: #868686; +} + .projector.text .cols { height: 100%; width: 100%; display: flex; border-radius: 0 0.1em 0.1em 0.1em; - outline: 0.3px solid #a69460; - color: #fff; + /* color: #fff; */ background: repeating-linear-gradient( - #f0e7d6, - #f0e7d6 1.41em, + #0000, + #0000 1.41em, #add8ff 1.41em, #add8ff 1.46em ); } .projector.text.selected .cols { + color: #c7b491; background: repeating-linear-gradient( - var(--selection-color), - var(--selection-color) 1.4em, - #e0d1b7 1.4em, - #e0d1b7 1.46em + #0000, + #0000 1.41em, + rgba(200, 138, 24, 0.3) 1.41em, + rgba(200, 138, 24, 0.3) 1.46em ); - color: #c7b491; } .projector.text textarea { @@ -1843,6 +1848,18 @@ svg.tile-selected { white-space: normal; } +.tile-error { + z-index: var(--err-hole-z); +} +.tile-path.error { + fill: #ff00000a; + stroke: #ff000087; + stroke-width: 0.75px; + vector-effect: non-scaling-stroke; + stroke-dasharray: 1,1; + stroke-linecap: butt; +} + .highlight-blue { background-color: rgb(255 0 255 / 20%); } diff --git a/src/util/dune b/src/util/dune index 3ca3a84400..683dd0aa7c 100644 --- a/src/util/dune +++ b/src/util/dune @@ -8,7 +8,7 @@ (pps ppx_let ppx_sexp_conv ppx_deriving.show ppx_yojson_conv))) (rule - (write-file js-of-ocaml-flags-dev "(:standard --debuginfo --noinline)")) + (write-file js-of-ocaml-flags-dev "(:standard)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) From 0508433daa4a499175341fc8bbfbe2b28c69531a Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 00:43:58 -0400 Subject: [PATCH 118/168] add missing forms to basic reference --- src/haz3lweb/Init.ml | 1153 ++++++++++++++++++------------------------ 1 file changed, 502 insertions(+), 651 deletions(-) diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 44479c985f..165a63c3e9 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -9409,7 +9409,214 @@ let startup : PersistentData.t = Convex)))(Secondary((id \ 2712e2d5-6c20-4dc5-add9-807f1cfd21b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ + ee46415a-4436-44b9-8f2c-46ccc7beae00)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1ff46ad9-8a47-461e-acab-1099b29cb067)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e9906d23-c102-4410-a4d7-583428a1678d)(content(Comment\"# \ + Non-empty holes are the red boxes around type errors \ + #\"))))(Secondary((id \ + 69da6284-4a39-4eee-8bd6-7f6fc5b22bbe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7e19037f-9b36-4aa2-93e0-01f8070754b5)(content(Comment\"# (you \ + can still run programs with non-empty holes) \ + #\"))))(Secondary((id \ + 44cbafd2-1d29-400f-93f2-111efc843008)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8eff151a-8916-4848-99be-3190371af0dc)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 59fb6202-8ba4-4844-a2b4-d8baab2030f6)(content(Whitespace\" \ + \"))))(Tile((id \ + fd8181bc-8a1e-482b-9533-757029991ced)(label(non_empty_hole))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 1e223321-649c-421e-ad23-c9f94b4a1d15)(content(Whitespace\" \ + \"))))(Tile((id \ + c00f8699-3ba5-4dc3-bc8b-3638091c4eaa)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d020291a-9b7b-4565-8cc0-4071bc596978)(content(Whitespace\" \ + \"))))(Tile((id \ + beb21e29-6073-4ec6-8041-03ffac7e6d3d)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 8e811260-8743-4a46-8650-ac8cf5fe2242)(content(Whitespace\" \ + \")))))((Secondary((id \ + 5565cff6-7aa5-4570-97fe-87ea5db04a99)(content(Whitespace\" \ + \"))))(Tile((id \ + 8402b685-1190-4375-b80f-daaee78f8fd3)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 21946d35-ec5a-47e1-9d37-d3ae1c59167a)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 001dbc33-9c9d-4256-8d60-fa36ec544d5b)(content(Whitespace\" \ + \"))))(Secondary((id \ 1e7dcb71-43b7-4c48-a47e-689b5cf3bc6d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ed47902d-3585-43f0-b4c6-da24b43a7a84)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0921d43c-222f-4430-b02b-ac9b5e5b62aa)(content(Comment\"# \ + Booleans #\"))))(Secondary((id \ + a118ac60-b876-43e3-971d-af7e59ad4adc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d42dbc07-5fee-4843-af05-20971ff0973f)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + f30482b1-564c-4724-9d9b-15d520512362)(content(Whitespace\" \ + \"))))(Tile((id \ + b398531a-dec7-4856-848c-22ba9773fd9d)(label(booleans))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ + f0f29b5f-47ec-42aa-a7cd-16dcccfc83bf)(label(:))(mold((out \ + Pat)(in_())(nibs(((shape(Concave 12))(sort \ + Pat))((shape(Concave 12))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 64c2a538-8d4e-408f-8cd8-e652708e1c3a)(content(Whitespace\" \ + \"))))(Tile((id \ + 232deac9-7a43-4ce7-8b31-f78e1da21c34)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 9416ed4a-8eb8-422b-9a3e-f963f19e1883)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 20b0d42e-bee5-4ce5-b8b8-6f747b8254ba)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 6bba2033-16e1-4b0a-a47b-fe69af3b1178)(content(Whitespace\" \ + \"))))(Tile((id \ + c4bb20d0-fb43-47c3-8cd6-b17313b25466)(label(Bool))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 28bf9856-2401-4236-842e-19b91844e74d)(content(Whitespace\" \ + \")))))((Secondary((id \ + 48e7c1d4-1eb4-4d2a-b2b3-d6152956c888)(content(Whitespace\" \ + \"))))(Tile((id \ + 171fbd19-896a-4379-8bda-ee4155d0b808)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + bf7f2526-0139-4ed1-b451-f6ae54f80127)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 7e382b55-6546-444c-a231-5ff7a501e587)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + b70331a3-e153-4c9f-80f2-4a6f92c49867)(content(Whitespace\" \ + \"))))(Tile((id \ + 33d0fa71-7853-402b-8ea4-8608462882e7)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + 4509e2d2-147a-4f77-88f6-b859643697b4)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + dd2f6dc4-a574-4813-bb2a-f747a835a36c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5b89bcd4-80e8-4869-97cf-bd6ab45d4ca5)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + b772b6b8-7437-448c-a6bf-673e4c85034d)(content(Whitespace\" \ + \"))))(Tile((id \ + 472fa7b6-b977-4453-9785-51180e3d496e)(label(boolean_ops))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + d343b3c5-ba4a-47b4-984d-f1156c602b05)(content(Whitespace\" \ + \")))))((Secondary((id \ + e80a22dc-dc49-4fe1-b011-d5f9ca3e6f51)(content(Whitespace\" \ + \"))))(Tile((id \ + 4ab2ac33-cb60-4097-9c66-a29ad457796f)(label(\"(\"\")\"))(mold((out \ + Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + b18607b9-699a-4011-b7d4-4e259f82fff8)(label(!))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ + 5))(sort Exp))))))(shards(0))(children())))(Tile((id \ + e7f3e63b-e924-47f4-b72c-48df8289e29a)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + cd044043-edfa-4b2d-8334-88968cf369db)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 48bcc286-7c9f-45b8-be45-ccbf141522fd)(content(Whitespace\" \ + \"))))(Tile((id \ + 0ee0ede0-c4dd-4390-96b4-ff9d65249367)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 573963b7-e7d1-4a19-bed4-8eb384b86911)(content(Whitespace\" \ + \"))))(Tile((id \ + 3611f1d6-a646-49dd-97a1-9b1bcb5f7ff7)(label(&&))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 10))(sort \ + Exp))((shape(Concave 10))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 0c6262a3-c3e3-4d3e-ae95-44f678e8e91e)(content(Whitespace\" \ + \"))))(Tile((id \ + 51f089de-03d6-4d4e-b57f-791702220404)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + cb9e83a7-6e79-4a56-9f58-8511417ece6f)(label(,))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 15))(sort \ + Exp))((shape(Concave 15))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + d19a65bd-03a8-49d9-a958-72a976b0cac5)(content(Whitespace\" \ + \"))))(Tile((id \ + 3c11a3d4-3eb8-4b4e-aa60-cd8df0e12b8b)(label(false))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 3e809b37-016e-430c-a5f3-e97a929e5e11)(content(Whitespace\" \ + \"))))(Tile((id \ + 721e18d9-6633-4c68-91c5-2a8a7189429e)(label(||))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 11))(sort \ + Exp))((shape(Concave 11))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 2e895fed-6081-42a5-9466-ff9e698879ef)(content(Whitespace\" \ + \"))))(Tile((id \ + 6b0ba2e1-76d9-4233-9ed1-1ea5164fb83a)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ + dac59081-e211-44c6-8733-49f689f1b730)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 8dca965d-d922-4fd8-82bf-fa5847705a63)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cb8a127e-063a-4439-842a-52af7b681d25)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 679715e4-2a7d-49eb-b3c5-31ec2f562341)(content(Whitespace\" \ + \"))))(Tile((id \ + bbd2fe8a-df87-40a2-bc90-aa1db1e27f87)(label(conditional))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 3476babb-7c42-4a79-8383-789bc7c70101)(content(Whitespace\" \ + \")))))((Secondary((id \ + fa28d2f9-dd9b-4acb-9ee1-4f277cda9ee4)(content(Whitespace\" \ + \"))))(Tile((id \ + 0303d18b-9631-4ca4-b117-9df27d062054)(label(if then \ + else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 6726b7da-295b-4212-8160-54a77aa4d11a)(content(Whitespace\" \ + \"))))(Tile((id \ + 6530360e-011c-40e8-b8f8-1fd1ab700226)(label(!))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ + 5))(sort Exp))))))(shards(0))(children())))(Tile((id \ + d922f3e5-20e2-47dd-922c-6d2f3c555026)(label(true))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 0e1f90e3-a641-45f5-bce0-926433cbf3d0)(content(Whitespace\" \ + \")))))((Secondary((id \ + 7a758eba-6b55-4bcd-b5ca-1694e1ff04c6)(content(Whitespace\" \ + \"))))(Tile((id \ + 68ba51a5-2d7d-4c02-81b6-f98ee67a324b)(label(1))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 24bedb15-a7a7-4367-9ebe-7fe55b09e9bc)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 67b81047-852f-4b43-8581-3dead7738240)(content(Whitespace\" \ + \"))))(Tile((id \ + 19a42349-5e06-45f3-bb62-7c6e676fa1f7)(label(2))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 5ba94d8a-e2c9-4d57-98f2-df320ffa814f)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 29e76402-83ac-43b0-b8e3-b58e3ddb8b2f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ c1ba26c7-fa67-4d0f-8af5-845b393a1d01)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 5e0cb0fe-7ca1-4a51-b1bb-0adeb619b595)(content(Comment\"# \ Integers #\"))))(Secondary((id \ @@ -9420,11 +9627,9 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 1cb2441a-e677-4286-9422-ff0b2f3fdfeb)(content(Whitespace\" \ \"))))(Tile((id \ - 8bc2b18f-4681-49dd-acb9-fdbd94292a4c)(label(int_lits))(mold((out \ + 9991cb5c-16db-490b-baf7-5d588fd0cd04)(label(int_literal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a52a9fcd-a9ce-4a1c-a94b-087717254c99)(content(Whitespace\" \ - \"))))(Tile((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ 420b868b-9936-4f98-9e8c-a89830ef1f2c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ @@ -9450,17 +9655,17 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 7e1ca287-c772-4db4-80e1-819783d1776e)(content(Whitespace\" \ \"))))(Tile((id \ - 2d09a43a-71a9-4977-b140-d2eb2dad6bf7)(label(negation))(mold((out \ + f9ebacb2-2597-4363-a002-a676d119daa8)(label(int_negation))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 7894176b-e88f-461d-9d93-e90f0ebbb004)(content(Whitespace\" \ \")))))((Secondary((id \ - 66d9ebb4-5273-4047-95bf-f648210ebd2e)(content(Whitespace\" \ + 206d3b4d-6d82-4a3d-b3c5-8b2b684527c1)(content(Whitespace\" \ \"))))(Tile((id \ - 349d921a-d249-425d-ba30-2fad5d571420)(label(-))(mold((out \ + 8dd733e2-2c01-41f7-b99e-4485382640f8)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ - beecf9e7-12b7-4aeb-b573-4f17d4929b0e)(label(1))(mold((out \ + ea980e62-6d82-4dfd-be17-103774bfd056)(label(int_literal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ ccdeca29-9665-4fe7-9478-8bac111d093d)(content(Whitespace\" \ @@ -9472,21 +9677,21 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 5e1f3677-1dca-431b-aca0-17d6fea58f1f)(content(Whitespace\" \ \"))))(Tile((id \ - 6991d998-2f87-445e-a1c1-0a0215731cbb)(label(arithmetic))(mold((out \ + 491f9f4e-96a6-4b5a-919b-0c53e4a223b3)(label(int_arithmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 13cae4d5-4d15-446d-b4b5-3d8e670405da)(content(Whitespace\" \ \")))))((Secondary((id \ ed25c10f-4dfe-48c9-a365-e43bc2cab313)(content(Whitespace\" \ \"))))(Tile((id \ - 7a11856b-615d-4930-baeb-a7cc6f6c1827)(label(1))(mold((out \ + cc9fdb45-57a2-453d-9bf0-d4faf4fd1b8d)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 66b5a5f0-56a5-4929-bcb6-7e174c6f449a)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 849fd467-325b-43a5-9801-a94dc1c1e34a)(label(2))(mold((out \ + 2a96d1c9-3291-4cd7-a82d-792f93a8871c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ c02998a8-b8a3-45f5-a21c-99d582030c1e)(content(Whitespace\" \ @@ -9497,14 +9702,32 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 4af04b41-15d5-440c-853f-f6b3736277bc)(content(Whitespace\" \ \"))))(Tile((id \ - 9955a9c0-1797-4bb2-9376-634ca43fa473)(label(8))(mold((out \ + 9099be7a-56cf-43cb-ab53-94b49679e21f)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 73f1e0de-00bd-4b18-88da-b8ce1bacc240)(label(/))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 5703df85-29fa-40a8-95df-a7b64cc78f6f)(label(4))(mold((out \ + 8b7d1d1a-0d20-48e9-bd27-58b93e965b3d)(label(3))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + b9a543a2-aa15-40f1-8142-76636c926443)(content(Whitespace\" \ + \"))))(Tile((id \ + fe98a704-6743-4a6c-8f44-86371881beb6)(label(-))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 9a1a3d40-2520-498c-a1c2-98f9208eea45)(content(Whitespace\" \ + \"))))(Tile((id \ + c4f98272-e8aa-45a4-92fb-b91c57d1e4fd)(label(4))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ + 5dc8ea2f-0f3a-4f04-bfd3-9e9e40130a2d)(label(**))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 4))(sort \ + Exp))((shape(Concave 4))(sort \ + Exp))))))(shards(0))(children())))(Tile((id \ + 8eaaa137-93c0-499a-babb-2b244d8bd484)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ d4d14a4a-8335-4909-8c28-85dcbcd2d370)(content(Whitespace\" \ @@ -9521,12 +9744,11 @@ let startup : PersistentData.t = Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ e0572717-5492-4b74-a9c4-8ba9a8c593c3)(content(Whitespace\" \ \")))))((Secondary((id \ - b93f88b5-8331-408b-b637-db279c0a0c77)(content(Whitespace\" \ - \"))))(Tile((id \ + d4e0a7c7-aa78-412c-b03b-b28c58d17003)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 62032269-5f26-4c5f-a414-1892878fb641)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 89b48472-52f6-4292-af98-4a3ad706cb47)(label(10))(mold((out \ + c2f9e5d6-d8c1-49fc-b9de-9d826c311798)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 339fa799-7728-4eff-9255-75e750a1d340)(content(Whitespace\" \ @@ -9537,7 +9759,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 229b1f48-0eef-43cc-8121-3e6803ccf0f4)(content(Whitespace\" \ \"))))(Tile((id \ - 8dfdc2ea-f476-4559-825d-ef3d9315643e)(label(10))(mold((out \ + 50481612-12f2-46d3-b2d5-2e1400f733a3)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 4d9ed71a-30cf-4fd4-a641-323d02b39b0a)(label(,))(mold((out \ @@ -9546,7 +9768,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ fc07f2a7-cbfb-426d-ae9b-a899e37349f2)(content(Whitespace\" \ \"))))(Tile((id \ - 07f8480b-eb5b-4e06-b330-5391ffadbbb0)(label(1))(mold((out \ + cc69871a-9dee-45c1-a77b-06940159fbef)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ a81877f1-0706-4355-a2be-f73a8ae35c5c)(content(Whitespace\" \ @@ -9557,7 +9779,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ b9c2dc9c-2b5b-4dea-84b4-5aacba1f2e13)(content(Whitespace\" \ \"))))(Tile((id \ - ceb42690-8b9d-4657-acf1-808342625dcc)(label(2))(mold((out \ + c00528ff-d666-41a3-94aa-e00c92fc2ac6)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 39560303-1b8b-4b84-b793-8058db5d5267)(label(,))(mold((out \ @@ -9566,7 +9788,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 91151128-546c-4d8e-8436-3030e43bb956)(content(Whitespace\" \ \"))))(Tile((id \ - 5f959316-ad9e-4156-a5d1-e8992191d24d)(label(2))(mold((out \ + 9692db25-4c4d-4ac9-aeeb-bd1a35710121)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 593aedf0-8172-43d8-8f93-e4d99854451c)(content(Whitespace\" \ @@ -9577,7 +9799,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 80ab1291-e199-4ba7-b299-d2cb2ed0e10d)(content(Whitespace\" \ \"))))(Tile((id \ - 72800a85-0bcd-4b90-a961-417e409ff1e4)(label(3))(mold((out \ + 15ab2436-825a-4bbb-b84e-91c1bef056c0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 69339a67-19c5-486c-adbd-75d12fd7dc3c)(label(,))(mold((out \ @@ -9586,7 +9808,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 67043910-c17d-4c1b-bda7-04cbc416a535)(content(Whitespace\" \ \"))))(Tile((id \ - 83291e0a-1a7a-4985-89cd-c5f1d7eed6a6)(label(3))(mold((out \ + 29771d39-43fa-4b80-afc7-735d74b594de)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ dca85870-9dee-45a4-bc20-6756d84a8b14)(content(Whitespace\" \ @@ -9597,7 +9819,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 7596fa7a-ffd1-426e-9d45-b1b637e7fba6)(content(Whitespace\" \ \"))))(Tile((id \ - 051d35b5-02b3-4e04-8d92-71ddce4b3dea)(label(2))(mold((out \ + d0208682-2d4b-4b50-92ec-ac35899e511d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 79f2d6e4-dfc1-422d-9c82-7f75d844d0a4)(label(,))(mold((out \ @@ -9606,7 +9828,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ f2b4d97d-c628-4691-969c-0c8955bc693b)(content(Whitespace\" \ \"))))(Tile((id \ - 7c1e2a57-7df7-470b-87ba-a7c55a839f85)(label(2))(mold((out \ + adfc1f57-88cb-4291-81cb-0f6ea32b827e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 85e42d8d-c6a0-4018-be01-b3bf1d1a4659)(content(Whitespace\" \ @@ -9634,11 +9856,9 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 575fca78-61a8-4940-8d1e-1b414cce6ad9)(content(Whitespace\" \ \"))))(Tile((id \ - 5ba4428b-1aa2-4fb0-875e-6a0536db6478)(label(float_lits))(mold((out \ + ac47b842-19df-4a98-a55f-7484e8cec666)(label(float_literal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e356f959-c5ea-48ca-9e41-46ef9a5f721d)(content(Whitespace\" \ - \"))))(Tile((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ 2571ad04-0bb4-486d-afb9-2016124fa962)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ @@ -9650,9 +9870,9 @@ let startup : PersistentData.t = Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 84f88e27-4c61-4e92-a9de-bd5828cc21fc)(content(Whitespace\" \ \")))))((Secondary((id \ - 737fc67a-ef7b-4859-a124-562c52237ed8)(content(Whitespace\" \ + 01bbd90b-f3bf-4722-8423-ef466ceda13c)(content(Whitespace\" \ \"))))(Tile((id \ - 93faecd4-37f9-4579-b14d-662729192eaf)(label(1.5))(mold((out \ + 7521c074-1e04-4467-9650-9f884c1033e3)(label(0.1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ adc9a045-ed56-4e32-ab87-b6a7064c3dd7)(content(Whitespace\" \ @@ -9664,25 +9884,25 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 600dfb53-ecb2-4b72-80fc-56dd9a18c4e3)(content(Whitespace\" \ \"))))(Tile((id \ - f3f013b8-3208-48f1-8022-42c597f07659)(label(float_artih))(mold((out \ + 1cf88027-656d-42db-9d9b-487fdca2aa99)(label(float_artihmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ f3c861e8-5f44-4fc7-b9f7-9dee56cc5a22)(content(Whitespace\" \ \")))))((Secondary((id \ 181ea8da-df0d-4fec-9506-692894194143)(content(Whitespace\" \ \"))))(Tile((id \ - 3927100f-186d-4b2c-a8d8-fe70936e2d97)(label(1.))(mold((out \ + f30ab82c-0132-4ea5-81a5-9b93d4502b6d)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 646c5843-2499-4e00-88c0-b43699459070)(content(Whitespace\" \ + 392863eb-a1d9-463b-b923-32f0c4001bea)(content(Whitespace\" \ \"))))(Tile((id \ - 2618e8d3-5e45-4724-a86e-dc152119d5b7)(label(*.))(mold((out \ + c1e17368-90be-4cad-9f21-7152505de93c)(label(*.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d45c6065-5325-4df2-80ab-56bff7b423f5)(content(Whitespace\" \ + d16aacf9-3cd5-49a5-9bda-8adf1f412daf)(content(Whitespace\" \ \"))))(Tile((id \ - 5a58bf54-18bd-4dab-bd92-c3c996240cc8)(label(2.))(mold((out \ + d907df40-2b4b-4f41-a291-2c07dd2b4770)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 4ec35692-99fd-40c3-aea8-5e2efc0b320d)(content(Whitespace\" \ @@ -9693,7 +9913,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 081eca38-9b19-4ff7-b321-266707b62dac)(content(Whitespace\" \ \"))))(Tile((id \ - f08cd29d-f4bd-4ade-9421-8beb111837be)(label(8.))(mold((out \ + 814513b7-0d32-4583-be98-c907fe6484c6)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ c0479a6c-b629-4342-a139-c3d3452c9c44)(content(Whitespace\" \ @@ -9704,10 +9924,32 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 2097ebb1-efc4-485e-9364-537e37500537)(content(Whitespace\" \ \"))))(Tile((id \ - 78835537-fb05-4d1d-bc15-820f563ed950)(label(4.))(mold((out \ + 08a289d3-b7e4-4ffb-8815-b6c7abe288a9)(label(3.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 4d45acc0-d1c3-4386-99bc-db5d41514d1f)(content(Whitespace\" \ + \"))))(Tile((id \ + 1c2c845a-8450-4c86-a4bf-c0b0dc78be82)(label(-.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 71ac633f-c4e0-4b42-bdee-e091602dfcdf)(content(Whitespace\" \ + \"))))(Tile((id \ + b4ce92c0-084e-4a5e-8ea2-1677d2c9ac55)(label(4.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 51ad770c-0823-43e6-8bc6-593567d3c099)(content(Whitespace\" \ + 0f3cf883-5872-41ab-b9f6-a9fb06afe76b)(content(Whitespace\" \ + \"))))(Tile((id \ + 16d0d409-5b0b-4e5d-8ce9-6657b72664f9)(label(**.))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 4))(sort \ + Exp))((shape(Concave 4))(sort \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 2487f3ce-0dfa-488c-9591-d4b339b693b2)(content(Whitespace\" \ + \"))))(Tile((id \ + 4c6dedad-d00d-41da-b46b-5b744f2389cb)(label(5.))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + 66b8d67f-8e9f-476c-99f4-1bb7982b6068)(content(Whitespace\" \ \")))))))))(Secondary((id \ cabd7f96-ad32-496b-9c94-ecbb25e0e1f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 5bb9c199-cf94-41e8-932e-d883acf18478)(label(let = \ @@ -9721,290 +9963,202 @@ let startup : PersistentData.t = Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 9efc3aa5-881b-4d0b-a7dd-2f2a16338a57)(content(Whitespace\" \ \")))))((Secondary((id \ - b0d9a10d-8c17-4c16-bc89-eab6a1c0eb6f)(content(Whitespace\" \ - \"))))(Tile((id \ - 73d8d368-1bd1-45e0-b17b-a7bc4949d025)(label(\"(\"\")\"))(mold((out \ + a2a58c49-ff08-4896-8f7f-c01b7c07a43a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc47d88d-e183-4630-b9b9-23cf93735b2b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d9671cd2-042f-4f92-80fe-4c5c011ad4b5)(label(10.))(mold((out \ + bc9c3842-6db2-410e-9493-e5164b89a90e)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6705d49c-4648-49ad-b563-a0bb1ea696e4)(content(Whitespace\" \ + 43a4cdc9-2d36-452f-b233-a75291ff70db)(content(Whitespace\" \ \"))))(Tile((id \ - ed6c0b59-04e9-4bfc-a8e8-b0a8a60b75d5)(label(==.))(mold((out \ + e8d7e802-a7ef-4572-a175-1074592a187c)(label(==.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - f58f0729-e53d-4649-8666-fd87478e43dc)(label(10.))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 708ba35f-4db7-456c-847b-e0b56cbd7e53)(content(Whitespace\" \ + \"))))(Tile((id \ + 0b3707b7-59a3-4b48-8b72-8b41e2d32820)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9a8c4484-5ab6-415d-9e50-073a1a8eeb20)(label(,))(mold((out \ + b33bea76-6c53-4d04-b422-2d6460306c03)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 070f5b50-d292-4364-85d5-58f96489bf11)(content(Whitespace\" \ + 2028eb1d-82bc-491e-9ba9-a323d1740b91)(content(Whitespace\" \ \"))))(Tile((id \ - a33094f4-6992-4e5f-9519-2b0e6b90b4dc)(label(1.))(mold((out \ + 632564b3-9301-4d27-a56c-e731fb165b48)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5dcec4c7-ebf4-4690-96f3-3232e69e162d)(content(Whitespace\" \ + 8d8a426c-ce69-4be3-bade-edebd5248618)(content(Whitespace\" \ \"))))(Tile((id \ - a53011df-5e75-473d-91de-7a0bc970e104)(label(<.))(mold((out \ + b5321f93-642c-4308-a4f5-df4b49bc0df1)(label(<.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - e8edb9c3-5e25-4660-9870-2cf347ca81e2)(label(2.))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 61b044ab-4f4d-477e-9632-4f99071f93e8)(content(Whitespace\" \ + \"))))(Tile((id \ + 71201312-7efb-4281-ba91-391d0b744f4c)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9bdf8254-6f8c-4260-add4-f47339d80d20)(label(,))(mold((out \ + 5ef5c78b-1212-416b-94c1-4b49d5f9a08e)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0b62c353-f1a1-4a4f-b7d9-d0edc64c9989)(content(Whitespace\" \ + dc89d14b-14ce-4b79-aefb-43c9eeb1a128)(content(Whitespace\" \ \"))))(Tile((id \ - ed828589-c83e-4521-93b5-2fdbdf55f279)(label(2.))(mold((out \ + d8500152-212b-4025-a4d7-e336f274451a)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1adab2a7-9bd5-43dc-969c-837192ff91c6)(content(Whitespace\" \ + 868162d0-7fc7-4832-a90b-1437db77e0b7)(content(Whitespace\" \ \"))))(Tile((id \ - 5f4f47f8-10d8-4f98-89a5-b1bd7c436961)(label(<=.))(mold((out \ + 33446b75-7fe0-4d7b-902f-af6d941d5e21)(label(<=.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - c66c3a22-c8e0-42ea-9aa9-5c0309e0213f)(label(3.))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + 1bd7585d-a5d7-4d71-b9bf-30be366d6334)(content(Whitespace\" \ + \"))))(Tile((id \ + 13316a4e-9c03-449f-a41e-8ff6d1b3ace7)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4d034bbc-c1c6-424e-8a04-59f207733539)(label(,))(mold((out \ + 57d06fff-a1ae-4d0d-9acc-9511f295a89f)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3d38fa3a-bd12-4ce3-9db8-254740581743)(content(Whitespace\" \ + cfb24e7b-eb23-4b90-8bbb-a681dd8234a1)(content(Whitespace\" \ \"))))(Tile((id \ - e9cacab9-a274-4ec7-8ee4-1bb6c80c236d)(label(3.))(mold((out \ + 18676db8-7c8e-4145-9209-7b7b860fb265)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e210338a-c6b7-4041-be33-3386dc9b3e43)(content(Whitespace\" \ + 3290432f-3624-4e81-8cef-f0064486be66)(content(Whitespace\" \ \"))))(Tile((id \ - 357ce2b1-81db-4771-9c08-bdded2aa5378)(label(>.))(mold((out \ + c5690382-7e3b-4e33-b87f-deeac0a8a08a)(label(>.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 9a445cb8-e779-4b68-8e54-7f0269af716e)(label(2.))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + e7edc52a-4926-44d9-a508-38fd3ba42949)(content(Whitespace\" \ + \"))))(Tile((id \ + 45d14db0-242c-4cc6-b36e-c1f638672c96)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3f59b02e-9d8a-4984-b045-68cda384337c)(label(,))(mold((out \ + 1388157b-3b50-45af-ba42-efd4566c611c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ac889fef-9a95-41d5-8d78-0d107e02ea32)(content(Whitespace\" \ + 8afcd4f2-d1d7-469f-a7a9-1cce52bf57b9)(content(Whitespace\" \ \"))))(Tile((id \ - 7d234fbd-f096-4072-80e5-5ffecf244310)(label(2.))(mold((out \ + 8337b04a-6155-4d42-bdcc-9fa835068cde)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3fb62987-97dd-453b-87bc-3e39f9d6bf58)(content(Whitespace\" \ + 4f50c520-c2ba-448d-9af2-7219798a59d9)(content(Whitespace\" \ \"))))(Tile((id \ - a6deb25b-d3d1-4adb-a661-75818fa41884)(label(>=.))(mold((out \ + adb37a00-651d-4bf4-98a7-abbe3764bce8)(label(>=.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - b8f0d4a6-9ddc-44ab-a8c6-0a4a78a26dcd)(label(1.))(mold((out \ + Exp))))))(shards(0))(children())))(Secondary((id \ + b152ba44-ab21-459e-9612-8ec886dab1e9)(content(Whitespace\" \ + \"))))(Tile((id \ + 4b4d12ba-8757-4ddd-9cc2-b98aa45a90f6)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ f5fb67a4-d077-4a8c-8697-52bef3b9460e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f6ba0272-b704-4d22-bacd-2ed1411d151c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c3e19fec-c0b6-4b21-b518-ad64802bd8ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cd93b804-a462-4830-92a0-4b5f37ac06d5)(content(Comment\"# \ - Booleans #\"))))(Secondary((id \ - 1f5040d9-e38d-49e3-81f2-e256bbb18b45)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b48406f1-3c2f-4113-a39a-4204bf67aca3)(label(let = \ + 54af4100-094f-465b-80d8-df7c7b38a624)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 05d96dc0-56e7-4ae5-84dc-ad939e394490)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 505c312b-b8c0-4b5e-acbb-7f8232cbde59)(content(Comment\"# \ + Strings #\"))))(Secondary((id \ + ab67f534-05b4-41b6-a42f-472055a95090)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e9fa826a-f697-4db4-b816-f8a807827806)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0f6f0103-b901-4fae-b8f7-469a45c82c66)(content(Whitespace\" \ + 3b51cb8c-03b9-427b-a56c-e67ee93fca5b)(content(Whitespace\" \ \"))))(Tile((id \ - b1de8c74-b715-49dc-ba63-4fc95afad59d)(label(booleans))(mold((out \ + 0b57487c-41f1-4109-a79e-ad51a9016fd2)(label(string_lit))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6ba2e50a-0464-4516-8967-4abf76966724)(content(Whitespace\" \ - \"))))(Tile((id \ - 7809611b-91f5-4364-8a3a-358bc5407bdf)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - e27590c3-d05d-434d-8d00-ff628a7a34d7)(content(Whitespace\" \ - \"))))(Tile((id \ - 5e643527-fc88-4463-8603-2e95a90b7c46)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - feae9349-01c6-4742-8475-1b8593067375)(label(Bool))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3802ecf1-32c7-4fb0-90c9-d9ccb647d155)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 15))(sort \ - Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 42f8e183-44d4-4d8d-8d8c-40420f161183)(content(Whitespace\" \ - \"))))(Tile((id \ - 3d4347dd-eebe-448d-a3d1-f8bfc130f041)(label(Bool))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1e12ec66-6154-4ba6-a2b3-b4f149ecede8)(content(Whitespace\" \ + f6ab39f4-9eee-43cb-a757-981c074c4315)(content(Whitespace\" \ \")))))((Secondary((id \ - a884d63e-96d4-4678-8770-fcb06d919141)(content(Whitespace\" \ + c6dc0dcf-6e03-4ff8-8f9e-2743f4a404cd)(content(Whitespace\" \ \"))))(Tile((id \ - 415d1e4b-60f9-43aa-a585-27c6f49624b7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e6cff93e-fc15-449a-b216-139159a233c3)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c9f58ea4-0a2b-4d67-9f44-151c3703eb71)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ + 8267f843-78e0-4038-b4aa-8cf4ba98f5b3)(label(\"\\\"Hello, \ + world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3e9d1f84-95e0-4518-9b15-4450debf05c1)(content(Whitespace\" \ - \"))))(Tile((id \ - 1c11e54b-0c58-4cb8-aaa0-5677d267b4a0)(label(false))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 61ce52a6-905e-46e0-9e3e-7b6006b36d7e)(content(Whitespace\" \ + b3113855-8eea-4d03-90af-b83c08863e77)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 81230d83-e2b5-40e2-a10f-f84b08ca966d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 45fa29bf-e543-4a8f-9fc0-02f00a32a735)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - bee77d49-534c-40cc-86b8-b9fcf848e880)(content(Whitespace\" \ - \"))))(Tile((id \ - d12e830b-5596-4231-b117-98c5cf748a76)(label(conditionals))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b5034bd8-06ae-49b0-bf91-0d1e6c6bfd2e)(content(Whitespace\" \ - \")))))((Secondary((id \ - 6f063fd9-a397-4210-984f-3c97f840cce2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d2b0be8c-983b-4cc5-ae7e-a5c9802b06fd)(content(Whitespace\" \ + 9ef2276b-76ba-462e-b8d4-fb379c45bdb6)(content(Whitespace\" \ \"))))(Secondary((id \ - 2bf459fa-1eee-4759-a6fa-e36230d3f3bb)(content(Whitespace\" \ - \"))))(Tile((id \ - 41c23690-2223-4b36-a495-b8e2e57b6472)(label(let = \ + 836ebd53-7512-4eee-b628-bd080b44e717)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7d0e10a5-2f81-4809-9efb-9885e173872c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b86589cb-a92d-4b5b-916c-62a85eaf77f3)(content(Whitespace\" \ - \"))))(Tile((id \ - b3eb0c6b-b36e-4d2e-91a7-69a3835e15b9)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - a052de75-c435-42a6-aa70-a06a05e4e311)(label(x))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2c799359-7ef4-4cf4-b913-e2361a715399)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 15))(sort \ - Pat))((shape(Concave 15))(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - fa4a512b-49c2-44da-8f2f-3f1be55a3b82)(content(Whitespace\" \ + 9fded58e-a584-4a50-9019-05f21bfcf1fb)(content(Whitespace\" \ \"))))(Tile((id \ - 549bbaa6-e7b7-4d62-b67c-5b0ee560aca2)(label(y))(mold((out \ + 90724c25-6331-4caa-808a-aee075c46eb2)(label(string_equality))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort \ - Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 33c1c044-0607-4ff0-8e3d-62135d0aa3ac)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + fb10fa30-3929-42e9-93bd-3cb0e8c643e6)(content(Whitespace\" \ \")))))((Secondary((id \ - c2792e37-4dbd-448a-8221-e051cb290248)(content(Whitespace\" \ + fb15574e-433b-45a0-abd6-0ff6785bc1d6)(content(Whitespace\" \ \"))))(Tile((id \ - 44d0978d-44bd-4400-9be2-fb35bdee6f32)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fcfbe372-52bb-45cd-bbb8-854c255ee13e)(label(2))(mold((out \ + 669e47f2-eb59-4a70-84f4-f843da7de7c1)(label(string_lit))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f255ebee-e082-4ccc-b2ea-103d4110c846)(content(Whitespace\" \ + 5b4f1b93-4e72-4c72-a07f-f2f5aaa87433)(content(Whitespace\" \ \"))))(Tile((id \ - 1b9a700b-6127-4091-9322-50665adab0c9)(label(+))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + 696847be-a8fa-4b94-b8c7-d6e6d839b20d)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 411beadf-83cc-4576-a7b3-c44c7b4f1f38)(content(Whitespace\" \ + 7c23d898-9dc6-4526-bc28-799169e68c3e)(content(Whitespace\" \ \"))))(Tile((id \ - 336191ee-e24d-4649-8922-5a0a7fdb67ab)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d170162e-f657-48fd-9561-7e0955e61248)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ + d82379ab-7edf-453c-96fa-0ba5db6f1eec)(label(\"\\\"Hello, \ + world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7194054b-e2db-4792-be22-7ebf67f77cf9)(content(Whitespace\" \ + 2216ff15-0bf3-40c1-8c77-6c87119f0f7c)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + f0db9ea3-de04-4b9f-b7c0-bdb3baac2b6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2faf9314-3569-45c6-9ec8-a29673e399f0)(label(let = \ + in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ + Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ + 2))(children(((Secondary((id \ + 82946363-3bee-457d-882c-4d414226f971)(content(Whitespace\" \ + \"))))(Tile((id \ + 734c5736-f9ae-4e51-8c9f-e246b73b5230)(label(string_concatenation))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + b190c511-cae5-418d-a79e-d736cf714f19)(content(Whitespace\" \ + \"))))(Secondary((id \ + e2db09fd-c637-4d7a-a132-4c1abb8caf6b)(content(Whitespace\" \ + \")))))((Secondary((id \ + 41acdc3d-b19c-4fab-bc5c-7bf8d8f1f650)(content(Whitespace\" \ \"))))(Tile((id \ - 26e0b293-31e0-4f99-8a63-3af46bb5ee8d)(label(3))(mold((out \ + 58256bb7-7215-4520-8f91-0de8cbd80a03)(label(string_lit))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d17e5e6b-069c-49de-b586-9c9a6c3532a2)(content(Whitespace\" \ + 929ff7a3-eaff-4c08-a87b-c92d2cb166bb)(content(Whitespace\" \ \"))))(Tile((id \ - 610f12b6-1882-440b-b3a9-a0058d48b9a9)(label(+))(mold((out \ + ad102f15-f853-439b-bc8f-9255b7c4c458)(label(++))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ac107a39-1f65-4191-9c97-2e33df913b94)(content(Whitespace\" \ + 5cec5d63-79ec-472c-95fb-f0f595626ed7)(content(Whitespace\" \ \"))))(Tile((id \ - ff9f4b9e-6026-4571-b100-0293c4fee1c6)(label(3))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 7fc97137-63dc-424f-9497-9df76cda009c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - ea72461c-41bd-49ce-8bb1-b2f604bc7d22)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 86e529f5-1a91-4ee6-85ca-80dd0b5e8cd9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9ee6768a-8c6e-4a94-8a4a-d1aa720e0d8a)(content(Whitespace\" \ - \"))))(Tile((id \ - 00be2224-1044-474f-8936-874e8f9edbaa)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 4aa39e45-9b5f-4a55-b78c-8a993007f207)(content(Whitespace\" \ - \"))))(Tile((id \ - 32725ca2-49a5-40b3-a164-dc0daec9ae5c)(label(y))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c3638d4c-7539-4142-a4ab-976ea6d5efea)(content(Whitespace\" \ - \"))))(Tile((id \ - 19ba2476-15b5-4f78-aaac-b398b17f4d5f)(label(>))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + 7415cc4e-dfe5-4c35-b6ad-ade710ee2fe1)(label(\"\\\" \ + Goodbye.\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 56fea472-4a27-427b-89f6-f9a9a40ab46b)(content(Whitespace\" \ - \"))))(Tile((id \ - fd550554-c1a0-4445-9790-e8e34924dcf9)(label(x))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e63c41c0-699a-477a-a690-897e892da2f5)(content(Whitespace\" \ - \")))))((Secondary((id \ - 235139e7-3699-4fa1-b0df-2c6fb05bcde4)(content(Whitespace\" \ - \"))))(Tile((id \ - e617c8da-d400-4551-9368-d0bdfb90ae42)(label(1))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 34b4d133-81eb-44f3-88de-4b965dc6c4b0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 470b277a-68be-4e5d-9c99-887422918e94)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 21fd4845-3e7d-4ed3-958b-0f404f93ea6b)(content(Whitespace\" \ + 17695860-85d9-44f0-bf5f-cf9ec6ecc2c9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0b17f363-0ab1-499e-bfbe-ff46801b3254)(content(Whitespace\" \ - \"))))(Tile((id \ - 57f1cb75-cd8a-48ec-b49f-9224450a5afd)(label(2))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ba28a8d9-5dfd-4812-9d93-e93725bc9b58)(content(Whitespace\" \ - \"))))(Secondary((id \ - db3651a1-192b-4f0f-a00f-0804a2a96d84)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 91776b8d-c572-415e-a7d9-ab960196c253)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f6ba0272-b704-4d22-bacd-2ed1411d151c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 8ab702ff-78f0-4bff-aa19-af07c4cd8e72)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e05f5269-b993-4163-a926-ed0ccb553efc)(content(Comment\"# \ - Tuples #\"))))(Secondary((id \ + ff9a7e18-0120-4af2-a442-82dea2d8ce95)(content(Comment\"# \ + Tuples (Destructure these with let expresions) \ + #\"))))(Secondary((id \ d7cd3bb6-71de-4469-9bcf-12621e23a1ca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 58863593-cf0d-457a-8bbd-c61c7e21fd11)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ @@ -10062,8 +10216,7 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ b6fd53d0-c6ee-4ff0-b9bd-798a1b14de3a)(content(Whitespace\" \ \")))))((Secondary((id \ - f6a0f515-f51a-4139-97cb-9c6b3d5d3d39)(content(Whitespace\" \ - \"))))(Tile((id \ + 57e40c6b-cdab-4b07-b546-57ad105f1705)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8cd245b6-8753-4f90-bc3f-c7a68d5c698e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -10158,8 +10311,9 @@ let startup : PersistentData.t = \")))))))))(Secondary((id \ d1faa776-6092-4ee9-af5a-4e7748cf3b31)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 8ad44fe8-05a4-474d-9f7c-8e9e8b24df35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 53e4366c-12e8-4976-a33a-bcaca2991d89)(content(Comment\"# \ - Functions #\"))))(Secondary((id \ + 552e3dc5-bf75-45f1-b40a-578460736659)(content(Comment\"# \ + Functions (Take a single argument which can be a tuple) \ + #\"))))(Secondary((id \ 26d402e6-be96-49e8-9141-a03ee8b80724)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 24bcb8c8-62ca-493f-a39c-ed5e0d96fb77)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ @@ -10216,11 +10370,7 @@ let startup : PersistentData.t = Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 73c59415-b115-4fec-9af9-0c3b901ff99f)(content(Whitespace\" \ \")))))((Secondary((id \ - 3c9d9243-60fe-4673-abf7-1df5aa193dfa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b7a0d5a5-cb1b-47ca-a054-9c462c34d7a6)(content(Whitespace\" \ - \"))))(Secondary((id \ - cfcdd82a-c432-4d3a-bb93-4fd95a0c5c48)(content(Whitespace\" \ - \"))))(Tile((id \ + 3c9d9243-60fe-4673-abf7-1df5aa193dfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8369bf13-cc66-466a-ad2b-c52d15f9cd6c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ @@ -10282,13 +10432,11 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 8e3c8f19-ab1e-4cd1-8e1a-2efdc1a4c5bf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9fe5b103-f94a-4ce9-9ec9-b9bbd0b0b529)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + \")))))))))(Secondary((id \ a93a5b8a-695f-4f46-8e9f-53437d2ac117)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 72a9a9fb-d181-4904-bb91-b49512e289bd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 0250d6b4-f3e8-46e9-9ee0-0b80a0f593f9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bcf7b081-e9fa-42f4-af06-dca918e425ec)(content(Comment\"# \ - Recursive Functions (arrow type annotation required) \ + 1bf6a1ba-58e3-4d42-b170-b4a12639398d)(content(Comment\"# \ + Recursive Functions (Arrow type annotation required) \ #\"))))(Secondary((id \ 3a98270e-a970-4b6e-aa0e-78b22afb3e01)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 58f425b6-3901-4cbc-9f4e-341291b4cc45)(label(let = \ @@ -10402,8 +10550,7 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 7d4f7d30-3db9-460a-a8b5-f6ac8d52f291)(content(Whitespace\" \ - \"))))(Secondary((id \ - 67a8f4ed-bce3-45d6-bb16-6dea87232ed4)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + \")))))))))(Secondary((id \ 6d09f946-48aa-4dfb-8754-5a03fe9dbce9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 475e6f6f-dd86-4038-924d-6e3398187780)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 4cdef99d-e23a-438a-b934-5b7d414c22b6)(content(Comment\"# \ @@ -10823,11 +10970,7 @@ let startup : PersistentData.t = Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 1a1418d4-16e8-48e2-9e6b-7734e0f8f9f5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 69231ac1-bfa3-4c3b-bbef-fe16d5d996bd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 364df27a-f0fd-42d8-a30a-7392c7b2aecc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 67cb4ca4-eb4f-4332-987f-f877edc681d4)(content(Whitespace\" \ - \"))))(Tile((id \ + 69231ac1-bfa3-4c3b-bbef-fe16d5d996bd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 08364735-5c04-4ed1-88b1-b36a1c8e9a6e)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -10837,12 +10980,9 @@ let startup : PersistentData.t = b89ed8c3-ba96-428e-b6da-b1caf0778219)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e003f812-d037-47c4-9d7f-a353477bbc09)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - de5f6e9e-c6f1-4a3a-bc29-9c1ef4f0e987)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3bb627ca-0bda-4c44-90d4-0872db644bb8)(content(Whitespace\" \ - \"))))(Tile((id e5a12177-6a4c-4304-a575-513c4c7d9ed3)(label(| \ - =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + e003f812-d037-47c4-9d7f-a353477bbc09)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e5a12177-6a4c-4304-a575-513c4c7d9ed3)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ 413a7ebe-6162-4c14-878d-f5bb90677116)(content(Whitespace\" \ @@ -10857,12 +10997,9 @@ let startup : PersistentData.t = ce2c57e4-5078-4902-bcff-be7065ca0199)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0967ddcd-ab6b-4378-bbbd-66c0b5aea91d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - de81ced0-4ff4-48da-b0ce-b5f7567bd6f4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 16455149-0376-4548-a25d-235833319077)(content(Whitespace\" \ - \"))))(Tile((id 741f27f1-8038-4ca9-a385-792624864dfb)(label(| \ - =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + 0967ddcd-ab6b-4378-bbbd-66c0b5aea91d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 741f27f1-8038-4ca9-a385-792624864dfb)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ 03fb7921-9714-42d6-a7cf-bee0167da2a2)(content(Whitespace\" \ @@ -10916,8 +11053,7 @@ let startup : PersistentData.t = \"))))(Secondary((id \ 5dbf3ee7-10bb-4204-88b9-229ef715fdf1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ 1d4c3639-3f8b-42b5-8ee5-52d7eb56c4ca)(content(Whitespace\" \ - \"))))(Secondary((id \ - d660485a-69bd-4f85-8844-b9a5da20c24c)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + \")))))))))(Secondary((id \ 21755f8e-e6d5-48ca-816c-83721084a45b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 5265395a-48df-41fa-a47b-fd087aba48e7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ @@ -11056,12 +11192,11 @@ let startup : PersistentData.t = ea3a90c0-7124-4233-b5f9-a2c923c810cf)(content(Whitespace\" \ \")))))))))(Secondary((id \ 57190bad-08bd-4912-af9c-3416af20fd8c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3b760be1-3252-49f1-90f1-99e6c30042b0)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + \")))))))))(Secondary((id \ 51c35b6c-6035-4e6a-ad2d-7e5c35523094)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 9b25d1e4-8db5-42dd-8d32-84016d0f6070)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3eb23e54-36a0-47b5-9521-10855edd7cc7)(content(Comment\"# \ - Algebraic data Types #\"))))(Secondary((id \ + 5ce4c2bb-97fb-4517-8552-09d78324ab83)(content(Comment\"# \ + Algebraic Data Types #\"))))(Secondary((id \ 97b76a41-7fe9-4c05-8823-547464b69f52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ c6a68c00-8b01-4722-9aa5-049c0ce99872)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ @@ -11075,11 +11210,7 @@ let startup : PersistentData.t = TPat))))))(shards(0))(children())))(Secondary((id \ 138371d1-9d15-4a35-8af6-eb1edd8d400a)(content(Whitespace\" \ \")))))((Secondary((id \ - a981287a-390a-42a1-a4d4-37dabc41410c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1e43d6e9-a5c6-4ad6-a7b0-58a143723098)(content(Whitespace\" \ - \"))))(Secondary((id \ - de5ae1e4-abab-40fe-8070-407d3b0bf109)(content(Whitespace\" \ - \"))))(Tile((id \ + c74dab91-dd43-4a99-b2e4-f84878d42927)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ e72b3747-067c-4f64-ad27-92a483dd30a7)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ @@ -11095,15 +11226,7 @@ let startup : PersistentData.t = Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - d04e2f93-d088-41d4-b4d7-165bd8ae9d3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ad92dffc-21fc-4679-9f2e-fcef4437c67d)(content(Whitespace\" \ - \"))))(Secondary((id \ - aac7ec81-c72f-4883-855e-d41a9eccb33f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9b2c26a1-0b07-42a7-b978-c1c58ddff716)(content(Whitespace\" \ - \"))))(Secondary((id \ - 58b50bc2-0d35-4dc0-b2e4-f4f65146aaed)(content(Whitespace\" \ - \"))))(Tile((id \ + d04e2f93-d088-41d4-b4d7-165bd8ae9d3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 84bb0d48-c60e-492f-9974-39608462d37e)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ @@ -11129,15 +11252,7 @@ let startup : PersistentData.t = Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 85f43748-c420-4f25-b2ab-9d88979be42a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d82f12dd-8ba3-4736-8004-b967b3fd81e8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4cf068cd-4b83-4ebd-8b9d-ba1093d62755)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3978b757-87fd-42ef-a24a-22b4f2787564)(content(Whitespace\" \ - \"))))(Secondary((id \ - 38f7cab1-8341-4da1-9fe1-9143ef654beb)(content(Whitespace\" \ - \"))))(Tile((id \ + 85f43748-c420-4f25-b2ab-9d88979be42a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 86b97a89-5b67-4d3e-8fb3-1a90b14cbf3f)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ @@ -11223,8 +11338,7 @@ let startup : PersistentData.t = Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 2e5c9834-9623-45f4-a278-e79b39cdcd72)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cdd16dfd-9d5d-474e-b5d4-f5700b6392aa)(content(Whitespace\" \ - \"))))(Tile((id \ + e71d4326-045a-4d84-b7f4-c0ac5715fa33)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 775e9639-82d6-4367-b2fb-464ee98b155c)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -11282,12 +11396,9 @@ let startup : PersistentData.t = 7c341b34-91b8-4a53-83c5-ce3543d406fe)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c8d49c08-33f8-46f0-af49-986b023d800e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bbebf0dc-22d4-45b7-9c33-12ea88236448)(content(Whitespace\" \ - \"))))(Secondary((id \ - 85b7f4a7-5ef0-4d54-a23c-8ba79ef1b8a5)(content(Whitespace\" \ - \"))))(Tile((id b6a8d547-f7f5-4ecf-8547-9f3168d002c0)(label(| \ - =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + c8d49c08-33f8-46f0-af49-986b023d800e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b6a8d547-f7f5-4ecf-8547-9f3168d002c0)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ 113e9d3e-4419-4630-8f81-2f13b5875bcc)(content(Whitespace\" \ @@ -11510,9 +11621,7 @@ let startup : PersistentData.t = \"))))(Tile((id \ 24ba6503-9f9d-4a45-a61d-d651796b076e)(label(poly_id))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9ef89114-519d-4b79-823f-2b05dad5484d)(content(Whitespace\" \ - \"))))(Tile((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ 86ff7c62-8a0b-4425-a223-b7ac16c8c63c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ @@ -11549,11 +11658,7 @@ let startup : PersistentData.t = Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 15c59c17-9886-4131-b1e9-f75c36da22af)(content(Whitespace\" \ \")))))((Secondary((id \ - 20fa807d-f003-4c5c-b8ba-c85a751988c4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4023c428-e69e-46cc-9967-fd9b322373a2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8f162f53-d7a6-4465-b639-15df68db977e)(content(Whitespace\" \ - \"))))(Tile((id \ + 214c1174-a5af-4f1f-aa21-2b43305d59c3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 4bc17fc3-f298-4dda-8b28-d7e8b0b9371b)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ @@ -11596,27 +11701,9 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ cf559632-8e94-4b3d-95ee-397f79d2f861)(content(Whitespace\" \ - \"))))(Secondary((id \ - b1c3f390-b004-4c77-9b27-890ba14aa9fd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3f701bd6-acdc-4193-80c8-5017260fa6be)(content(Whitespace\" \ - \"))))(Secondary((id \ - a88f8001-3c06-4f4f-8ea9-dcb956a9a7e3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6c1bcf7d-c9f4-44c6-9c46-7caa29d2295a)(content(Whitespace\" \ \")))))))))(Secondary((id \ f429d62b-a042-4491-9aa9-55439fd6173e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ec872627-dea0-4928-94ba-8442d3808ff9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6f309af4-3e7e-4d80-be48-e94109383c48)(content(Whitespace\" \ - \"))))(Secondary((id \ - ae98c574-de1a-4d49-87c4-d8159b99571b)(content(Whitespace\" \ - \"))))(Secondary((id \ - a0596b24-11bc-4ec1-b102-e6e87b533895)(content(Whitespace\" \ - \"))))(Secondary((id \ - df7379c9-96c0-44e1-a299-64cb458e962d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 94be0f5d-7028-4887-8010-feaef81e8db0)(content(Whitespace\" \ - \"))))(Tile((id \ + 7913a665-6dc5-4b1d-9ed7-d7000473bfe4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 1a6be598-d3a2-437d-9483-1c414752ea47)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ @@ -11625,15 +11712,12 @@ let startup : PersistentData.t = \"))))(Tile((id \ 5c8719df-a29a-44c9-949e-56c5bf1b3c08)(label(apply_both))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e5749389-d6d2-423e-b491-044d2b19bd03)(content(Whitespace\" \ - \"))))(Tile((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ e806bd56-05b2-47c5-8c6c-1d1067184696)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - fa40e26f-bc91-44cc-9856-cec20a912bf8)(content(Whitespace\" \ - \"))))(Tile((id \ + 2ecb2f93-c7d9-410f-9f37-799519cb8478)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ e7c20431-342f-4d76-9fab-e558e5234cdd)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ @@ -11660,18 +11744,7 @@ let startup : PersistentData.t = TPat))))))(shards(0))(children())))(Secondary((id \ 0e8af3ef-31ee-40ba-bf0f-ca84e94c2393)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e7cdea39-6178-4c56-8756-dc8ff55aaed9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4ba8bb93-ddc1-4ba2-b716-a3d25a45a821)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4e411c8d-0613-4bca-81c9-ad961eea4c66)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5810c6df-7edd-40f2-ab26-316c3abef2cd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3d9d43ef-a4c8-4558-9c3d-6321c67d0eb9)(content(Whitespace\" \ - \"))))(Secondary((id \ - fa2dd1b5-af69-4e4b-a24f-523c15c4fbdb)(content(Whitespace\" \ - \"))))(Secondary((id \ - affc9c94-bbf1-4018-91e1-06a24466a927)(content(Whitespace\" \ + 1c77ad00-e350-428a-8c1e-8091f973a6ea)(content(Whitespace\" \ \"))))(Tile((id \ 81f0604c-ead8-4781-943e-063c54c13ddb)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ @@ -11758,15 +11831,7 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ 23032708-8f4b-4330-9e79-56c7b604656a)(content(Whitespace\" \ \")))))((Secondary((id \ - ecbb892f-9a9a-47f1-af09-a80bc57b1ff9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c2a4d6fe-e3f2-4a8c-887f-07f238c5013d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 31d6bf24-5ff3-4c6a-aa06-d8dfb0073d1b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3819feb6-8c41-4c2c-bdee-1373305cd742)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1ad8685a-5f05-4a8c-9d8f-43995189ca16)(content(Whitespace\" \ - \"))))(Tile((id \ + 495c89f6-fe75-4902-8ddb-f65597dc43be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 6ceba9d5-8233-4d5e-858b-816190623301)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ @@ -11793,8 +11858,7 @@ let startup : PersistentData.t = TPat))))))(shards(0))(children())))(Secondary((id \ 0c385d39-545b-4eed-bb72-a76f20ceae13)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0eb3670c-8d81-4e14-bb78-d34613128e54)(content(Whitespace\" \ - \"))))(Tile((id \ + 5f424130-4226-4bf2-b6de-81f3e32d81ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7cfc26a4-f49f-4a09-af5b-25818b7496b3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ @@ -11938,15 +12002,9 @@ let startup : PersistentData.t = Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ 1dcc5d9a-83a6-49da-b93f-ea38e1eeef78)(content(Whitespace\" \ - \"))))(Secondary((id \ - 444f5201-f358-4216-993f-53f907ef942f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2609d6c0-0050-4991-9e29-d8a358b7f160)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - b014cb7a-084a-4c39-863f-e0a39063f87b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 628373bd-968d-42cc-8c75-2344db6c7e45)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0ec43e9b-f126-4de5-b023-7aacd7996f89)(content(Whitespace\" \ - \"))))(Tile((id \ + \")))))))))(Secondary((id \ + 2677caf9-0001-4e08-8ad3-150dde7bb7d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b014cb7a-084a-4c39-863f-e0a39063f87b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ c72a4e9e-3777-47c5-8e00-56b52a581a09)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ @@ -11955,9 +12013,7 @@ let startup : PersistentData.t = \"))))(Tile((id \ 2c80afa2-e80d-4998-9f4e-1cffdb7339fd)(label(list_length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b8acf8c6-c472-4c87-9b43-e93b602c176b)(content(Whitespace\" \ - \"))))(Tile((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ 2e9fa642-9dc2-4bf7-a63b-206d7f1ef6ef)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ @@ -11998,15 +12054,7 @@ let startup : PersistentData.t = Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 97d341bc-1ba7-4643-b54d-ce398cf99eea)(content(Whitespace\" \ \")))))((Secondary((id \ - 0114fff0-b21a-43b2-bd8c-48ec8adcb59a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c3d2d43b-a2a1-425a-b1ec-513861324357)(content(Whitespace\" \ - \"))))(Secondary((id \ - 567c1088-ea26-402c-bc17-a5e0f7730df2)(content(Whitespace\" \ - \"))))(Secondary((id \ - f5977801-496f-4cb5-b996-3912730f5c44)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1ff474bf-92b2-4631-81cb-f9687233cdf7)(content(Whitespace\" \ - \"))))(Tile((id \ + 0114fff0-b21a-43b2-bd8c-48ec8adcb59a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 615a6d30-91d6-4a56-b2e3-89a5df9ddc6a)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ @@ -12047,19 +12095,7 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children()))))))))(Secondary((id \ c1ce3f5f-6e59-4eaf-910c-1aad6fc76d4b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6901e5a1-733b-406c-8da4-88fc8c446159)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0a553b65-1a0a-44e5-af58-8e2132a79a8b)(content(Whitespace\" \ - \"))))(Secondary((id \ - d12bad31-aecc-489e-b8ef-5438b7aa4fd2)(content(Whitespace\" \ - \"))))(Secondary((id \ - c0e2e5c6-569d-4279-80b5-e5c96737ac74)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6b014277-2512-4f55-8278-a5b5edf55544)(content(Whitespace\" \ - \"))))(Secondary((id \ - 243805d6-b7c2-4859-95e9-cdde927898de)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9d69861c-eaf7-406b-9364-50306cf99ed4)(content(Whitespace\" \ - \"))))(Tile((id \ + c0564f45-5ce4-4320-8e5b-5d146050e2b1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 30392d27-d4cc-468e-a118-8afd2536f1cf)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -12069,20 +12105,9 @@ let startup : PersistentData.t = df36ee16-d2a1-4b9f-b96e-5c12b0eebba2)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7bff881d-64f9-4a97-94b6-80d512275508)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 588e69c3-c751-471f-ad82-cc63033ce9ad)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0b134686-7ba7-4d42-9db2-116def627b67)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3b544719-593f-419a-ae1f-fda226b18baf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5048ccc3-0827-4c7b-8ead-0fcedf0b4f48)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0c34991f-4b0e-47a8-86a3-ea7d7cef63e2)(content(Whitespace\" \ - \"))))(Secondary((id \ - e1aa9064-d97e-4f78-87d2-ff9d968382c0)(content(Whitespace\" \ - \"))))(Tile((id 4ec2373f-2309-447b-a32e-78aa2fb8ff91)(label(| \ - =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + a344dee3-f3fd-46fd-94a1-0aa47c17ca2c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4ec2373f-2309-447b-a32e-78aa2fb8ff91)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ f14d180c-a8d1-4e18-afa4-b08087b7dac8)(content(Whitespace\" \ @@ -12097,20 +12122,9 @@ let startup : PersistentData.t = b13d4e14-43e8-4ddc-ba98-ffade553be34)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - afd92b67-adbe-4e08-b9b5-9c6c97f813ee)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5ab58e72-da6b-401b-ad6f-e30afeee440d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 28839103-9cc4-41c3-aac7-edb67d8998ed)(content(Whitespace\" \ - \"))))(Secondary((id \ - 16f1c878-2ce8-4b42-85df-29ea80a4fd99)(content(Whitespace\" \ - \"))))(Secondary((id \ - bdc51dd4-b581-492c-a5a5-63cd40a0e6a2)(content(Whitespace\" \ - \"))))(Secondary((id \ - ff13ad81-d99f-48fe-904a-03f79ea9a29f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8ed26213-e5af-43ce-91eb-2d4260746f33)(content(Whitespace\" \ - \"))))(Tile((id 2dbd3d96-b70b-4479-868a-79355b651e86)(label(| \ - =>))(mold((out Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ + afd92b67-adbe-4e08-b9b5-9c6c97f813ee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2dbd3d96-b70b-4479-868a-79355b651e86)(label(| =>))(mold((out \ + Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ f2db281d-f277-47e1-8973-c500bf37ecd9)(content(Whitespace\" \ @@ -12157,152 +12171,14 @@ let startup : PersistentData.t = Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ bc0265c2-df2e-4631-bd66-94583037bfba)(content(Whitespace\" \ - \"))))(Secondary((id \ - 816b6790-9e7a-4f32-96e3-86ae3cb5ea93)(content(Whitespace\" \ - \"))))(Secondary((id \ - c3b7adc6-5e31-47df-bd9f-3cbf21053ff9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b91c40f4-f1b5-437c-9c87-0932d99e5e16)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2b6c50fe-ac4d-4e53-a9ce-dacd00254107)(content(Whitespace\" \ - \"))))(Secondary((id \ - 54fd18c5-32d3-4f30-93ef-8f29be4fd84f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 4ce98eac-dac0-4f29-90f3-6dfd7310aace)(content(Whitespace\" \ - \"))))(Secondary((id \ - fe62b60a-b7e5-47d9-b19b-59650fdd7006)(content(Whitespace\" \ - \"))))(Secondary((id \ - 25b4619c-eaca-4d5e-9155-bbb461a761c6)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 4b8b041a-3fa5-45f4-ba98-d15bb725d5ec)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3f4dc1f0-c066-4517-91db-c5844867bac3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5bac1963-9f38-46e9-be75-2f48ab8bb60f)(content(Comment\"# \ - Strings #\"))))(Secondary((id \ - 58d0303f-dbed-4d71-a635-b3f71b315662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3b2375a4-9840-4972-a92d-c0f964cb6351)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 61720862-c165-48d8-9a8a-9ad72afa0c9c)(content(Whitespace\" \ - \"))))(Tile((id \ - 7b23bc56-617a-4e9b-89d1-ad1be135992d)(label(string_lits))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8a47815e-a397-47ee-bf9f-c835967f2080)(content(Whitespace\" \ - \")))))((Secondary((id \ - dfb7186c-be93-4396-8c31-ced29be57b4d)(content(Whitespace\" \ - \"))))(Tile((id \ - 9ecdcb27-fa35-4428-bc63-259c4b5183b2)(label(\"\\\"Hello, \ - world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 95a23dfd-ae14-409b-a054-96f13d1ae86a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 270cafd1-3df9-46e1-84ac-580804ae9be3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 90d039e1-dde6-4e76-9c6a-41b6d0254fc1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bdc12c15-9190-45db-b10f-e72872c9df74)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3d37db42-b16f-46e6-ab09-d81e86b1c52a)(content(Whitespace\" \ - \"))))(Tile((id \ - 31f46c5b-d0af-404f-8105-7d55785547fe)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 490a6dc2-b99c-4445-b0c1-e3026217ff97)(content(Whitespace\" \ - \"))))(Tile((id \ - 2fffb892-9451-45d2-bd0a-fd8ebab7d9f2)(label(string_equality))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 99e6499c-8bd0-4039-9d66-0d9c2e29abc9)(content(Whitespace\" \ - \")))))((Secondary((id \ - be643d58-b116-47be-bd9f-3fcaa00f364d)(content(Whitespace\" \ - \"))))(Tile((id \ - 4b77359a-bf0c-4360-8de8-771361fa361e)(label(string_lits))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bde501da-55cf-4911-bb2d-c87b9af7b347)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c478c74a-ca3c-4058-b48e-282fd8ce486d)(content(Whitespace\" \ - \"))))(Tile((id \ - 7da11274-3153-4429-884c-559197ad7117)(label(\"\\\"Hello, \ - world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ - Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f9f77b62-b1d3-4d44-882e-730ba1a6a892)(content(Whitespace\" \ + 33ccd830-af95-4a8e-a340-734d009783ac)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 61566670-6990-4d40-b6b6-2d622215e596)(content(Whitespace\" \ - \"))))(Secondary((id \ - ac58a86f-b5f6-4163-bfc7-673d64f765eb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d22c4388-a3b6-4d43-b623-d440a30df564)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3c093ad8-b415-471e-945c-c5caaa383ccb)(content(Whitespace\" \ - \"))))(Secondary((id \ - 99ae3409-0035-4de1-981f-966810ae11a9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3e8436b3-b083-4cfa-aac6-cd13178cace6)(content(Comment\"# \ - Non-empty holes are the red dotted boxes around errors \ - #\"))))(Secondary((id \ - 4890ee54-410a-4ad0-a38a-d18f8d55d45c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0687380d-4f3f-4234-9acd-6be3a404a2b1)(content(Comment\"# (you \ - can still run programs with non-empty holes) \ - #\"))))(Secondary((id \ - 1e681c69-9f8a-411e-a86d-e681dd538943)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e0a03d34-85fb-4ac1-8059-396d6273a220)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 9f4799f3-308d-43bd-8e02-4aa925badd7b)(content(Whitespace\" \ - \"))))(Tile((id \ - 70a55fac-bcf3-4a3f-8db6-fc0120f4f9db)(label(non_empty_hole))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3a65e973-39b4-4b13-9d24-3b4e09ee8ee9)(content(Whitespace\" \ - \"))))(Tile((id \ - c5d8bdc9-99e3-4606-a9ba-5d4bdf304a44)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - bfdde046-0436-437b-ba25-5965d9feca97)(content(Whitespace\" \ - \"))))(Tile((id \ - ad09d06a-a228-4afe-8747-87f1aedd6a05)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4c4462dc-bf0e-443a-94f4-78cc909f9721)(content(Whitespace\" \ - \")))))((Secondary((id \ - 22750d6c-077e-454e-a21e-f7b81220ba77)(content(Whitespace\" \ - \"))))(Tile((id \ - 95dea374-fe49-4a0a-9568-01b7dd8e92f3)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d51038da-be51-40b0-9a7d-851099c87b87)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 84901d00-68bd-4994-b2a6-507756ae50b2)(content(Whitespace\" \ - \"))))(Secondary((id \ 41d9e44a-d87d-4320-88a5-690dfb111d58)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b3063e79-7dc9-45e2-b629-dd64f9b7301b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8ea89d98-1823-4e0c-88f9-1b0dac119547)(content(Whitespace\" \ - \"))))(Secondary((id \ ceb1ab9f-f1c3-46ab-99e2-0a558fd79d40)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0f703037-7029-49d0-8947-d5334e5b8fab)(content(Whitespace\" \ - \"))))(Secondary((id \ - 255581b0-f36f-450e-830a-f5ff172113fd)(content(Whitespace\" \ - \"))))(Secondary((id \ - c77ff520-8252-487f-8249-e17140382001)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5a731951-3f77-497d-8dd4-99545da35208)(content(Whitespace\" \ - \"))))(Secondary((id \ 41764688-3e37-4dcd-a328-95a760c5d9b6)(content(Comment\"# \ Tests, separated by semicolons #\"))))(Secondary((id \ - 6908534e-dad3-49f2-a4f8-86020fc6130a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 07143109-1ce5-49bc-9fba-a287ee7ffea3)(content(Whitespace\" \ - \"))))(Secondary((id \ - b12572c9-962d-4bad-90db-7ad86e65e4ed)(content(Whitespace\" \ - \"))))(Secondary((id \ - 590e340f-6f2f-46da-bf3f-82e41acefbda)(content(Whitespace\" \ - \"))))(Secondary((id \ - ae6c12ca-f95f-43fc-9078-1331ac7c4916)(content(Whitespace\" \ - \"))))(Tile((id \ + 6908534e-dad3-49f2-a4f8-86020fc6130a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 88fa8f3c-f0e7-4f2a-b6e1-11f84110ffed)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -12340,15 +12216,7 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5623770c-b70a-4935-a6b2-ce8fbaa8c6e4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1efd3f69-b83d-44fe-9c80-4fdd8f9c25a5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 220a8954-d971-44dc-b598-cf469d39f2f4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 580581db-c192-43cf-8a52-b947d0bad22f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 50309097-e003-447a-8e7c-0c512fc5e0d1)(content(Whitespace\" \ - \"))))(Tile((id \ + 5623770c-b70a-4935-a6b2-ce8fbaa8c6e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 04b4f2ed-61be-4a15-947d-4c20498e122d)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -12386,15 +12254,7 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5cbccfd5-cadd-427f-b5bc-6cfff9ce04e0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c7664484-8bbb-42a0-b0e6-b371520a4519)(content(Whitespace\" \ - \"))))(Secondary((id \ - cca0f31c-b1fb-4c0c-81b7-eff729a73794)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2fa94075-6cc5-4dac-bf9b-02aebaa7ebf6)(content(Whitespace\" \ - \"))))(Secondary((id \ - b1a22630-8885-4245-8612-f21251ba5bd7)(content(Whitespace\" \ - \"))))(Tile((id \ + 5cbccfd5-cadd-427f-b5bc-6cfff9ce04e0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ db9a0538-900f-433e-827c-02b963833458)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ @@ -12433,16 +12293,16 @@ let startup : PersistentData.t = Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 5c62fcd1-81e3-4c01-8414-7033079b0804)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cc9675bf-e36a-49e1-a696-cd382856dff1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2d6065b8-b51e-4853-85ff-2941dc799c6d)(content(Whitespace\" \ - \"))))(Secondary((id \ + 0fa3b26c-1fba-4272-b989-8d4a46288fd8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 436dfbcc-88ed-4417-9873-b88b775ddedb)(content(Comment\"# The \ + value of the program is shown at the bottom \ + #\"))))(Secondary((id \ 460cde98-3cf7-4229-8b39-53dd253045d8)(content(Whitespace\" \ \"))))(Secondary((id \ 536b2b4d-7c22-4949-a718-386b98a6039c)(content(Whitespace\" \ \"))))(Secondary((id \ a1ef8654-e7f0-4579-8fde-3db994bd6fd9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c74d7cbb-167b-4b38-85bc-2de8b78de9b7)(label(2))(mold((out \ + b3f05f8b-7f09-4de7-8961-9a9c6b3fce28)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 25eea2a4-f1a8-40ef-ba42-6875f18135e3)(content(Whitespace\" \ @@ -12463,38 +12323,40 @@ let startup : PersistentData.t = # Empty holes stand for missing expressions, patterns, or \ types #\n\ let empty_hole = in\n\n\ + # Non-empty holes are the red boxes around type errors #\n\ + # (you can still run programs with non-empty holes) #\n\ + let non_empty_hole : Int = true in \n\n\ + # Booleans #\n\ + let booleans: (Bool, Bool) = (true, false) in\n\ + let boolean_ops = (!true, true && false, false || true) in\n\ + let conditional = if !true then 1 else 2 in\n\n\ # Integers #\n\ - let int_lits : Int = 1 in\n\ - let negation = -1 in\n\ - let arithmetic = 1*2 + 8/4 in\n\ - let int_comparison = (10 == 10, 1 < 2, 2 <= 3, 3 > 2, 2 >= 1) \ - in\n\n\ + let int_literal: Int = 1 in\n\ + let int_negation = -int_literal in\n\ + let int_arithmetic = 0*1 + 2/3 - 4**5 in\n\ + let int_comparison =\n\ + (0 == 0, 0 < 1, 1 <= 1, 2 > 1, 1 >= 1) in\n\n\ # Floating Point Numbers #\n\ - let float_lits : Float = 1.5 in\n\ - let float_artih = 1. *. 2. +. 8. /. 4. in\n\ - let float_comparison = (10. ==.10., 1. <.2., 2. <=.3., 3. \ - >.2., 2. >=.1.) in\n\n\ - # Booleans #\n\ - let booleans : (Bool, Bool) = (true, false) in\n\ - let conditionals =\n\ - \ let (x, y) = (2 + 2, 3 + 3) in\n\ - \ if y > x then 1 \n\ - \ else 2 \n\ - in\n\n\ - # Tuples #\n\ - let tuples : (Int, Bool, (Bool, Int)) = (1, true, (false, 3)) \ - in\n\ + let float_literal: Float = 0.1 in\n\ + let float_artihmetic = 0. *. 1. +. 2. /. 3. -. 4. **. 5. in\n\ + let float_comparison =\n\ + (0. ==. 0., 0. <. 1., 1. <=. 1., 2. >. 1., 1. >=. 1.) in\n\n\ + # Strings #\n\ + let string_lit = \"Hello, world!\" in \n\ + let string_equality = string_lit $== \"Hello, world!\" in\n\ + let string_concatenation = string_lit ++ \" Goodbye.\" in\n\n\ + # Tuples (Destructure these with let expresions) #\n\ + let tuples : (Int, Bool, (Bool, Int)) =\n\ + (1, true, (false, 3)) in\n\ let (a, b, (c, d)) = tuples in\n\n\ - # Functions #\n\ + # Functions (Take a single argument which can be a tuple) #\n\ let y : (Int, Int, Int) -> Int =\n\ - \ fun (m, x, b) -> m * x + b \n\ - in\n\n\n\ - # Recursive Functions (arrow type annotation required) #\n\ + fun (m, x, b) -> m * x + b in\n\n\ + # Recursive Functions (Arrow type annotation required) #\n\ let double_recursively : Int -> Int =\n\ fun n ->\n\ if n == 0 then 0 \n\ - else double_recursively(n - 1) + 2 \n\ - in\n\n\ + else double_recursively(n - 1) + 2 in\n\n\ # Mutual Recursion (bind tuples of functions) #\n\ let (even : Int -> Bool, odd : Int -> Bool) = \n\ (fun n -> if n == 0 then true else odd(n - 1), \n\ @@ -12505,61 +12367,50 @@ let startup : PersistentData.t = let list_literals : [Int] = [1, 2, 3] in\n\ let length : [Int] -> Int =\n\ fun xs ->\n\ - \ case xs\n\ - \ | [] => 0\n\ - \ | hd::tl => 1 + length(tl) \n\ - end \n\ - in\n\ + case xs\n\ + | [] => 0\n\ + | hd::tl => 1 + length(tl) \n\ + end in\n\ let has_at_least_two_elements : [Int] -> Bool =\n\ fun xs ->\n\ case xs\n\ | [] => false\n\ | hd::[] => false\n\ | a::b::[] => true \n\ - \ end \n\ - in\n\n\ - # Algebraic data Types #\n\ + \ end in\n\n\ + # Algebraic Data Types #\n\ type Exp =\n\ - \ + Var(String)\n\ - \ + Lam(String, Exp)\n\ - \ + Ap(Exp, Exp) in\n\n\ + + Var(String)\n\ + + Lam(String, Exp)\n\ + + Ap(Exp, Exp) in\n\n\ let exp_equal: (Exp, Exp) -> Bool =\n\ - fun es -> case es\n\ + fun es ->\n\ + case es\n\ | Var(x), Var(y) => x$== y\n\ - \ | Lam(x1, e1), Lam(x2, e2) =>\n\ + | Lam(x1, e1), Lam(x2, e2) =>\n\ x1$== x2 && exp_equal(e1, e2)\n\ | Ap(e1, e2), Ap(e3, e4) =>\n\ exp_equal(e1, e3) && exp_equal(e2, e4)\n\ | _ => false end in\n\n\ # Polymorphic Functions #\n\ - let poly_id : forall a -> a -> a =\n\ - \ typfun a -> fun x : a -> x \n\ - \ in\n\ - \ let apply_both : forall a -> forall b ->\n\ - \ (forall c -> c -> c) -> ((a, b) -> (a, b)) =\n\ - \ typfun a -> typfun b -> fun f : forall c -> (c -> c) ->\n\ - fun (x, y) : (a, b) -> (f@(x), f@(y)) \n\ - in\n\ - \ let list_length : forall a -> [a] -> Int =\n\ - \ typfun a -> fun l : [a] ->\n\ - \ case l\n\ - \ | [] => 0\n\ - \ | hd::tl => 1 + list_length@(tl) \n\ - \ end \n\ - in\n\n\ - # Strings #\n\ - let string_lits = \"Hello, world!\" in \n\ - \ let string_equality = string_lits$== \"Hello, world!\" in \n\ - \ \n\ - # Non-empty holes are the red dotted boxes around errors #\n\ - # (you can still run programs with non-empty holes) #\n\ - let non_empty_hole : Int = true in \n\ - \ \n\ - \ # Tests, separated by semicolons #\n\ - \ test 2 + 2 == 4 end;\n\ - \ test 3 + 3 == 6 end;\n\ - \ test 2 + 2 == 5 end;\n\ - \ \n\ + let poly_id: forall a -> a -> a =\n\ + typfun a -> fun x : a -> x in\n\n\ + let apply_both:\n\ + forall a -> forall b -> (forall c -> c -> c) -> ((a, b) -> \ + (a, b)) =\n\ + typfun a -> typfun b ->\n\ + fun f : forall c -> (c -> c) ->\n\ + fun (x, y) : (a, b) -> (f@(x), f@(y)) in\n\n\ + let list_length: forall a -> [a] -> Int =\n\ + typfun a -> fun l : [a] ->\n\ + case l\n\ + | [] => 0\n\ + | hd::tl => 1 + list_length@(tl) end in\n\n\ + # Tests, separated by semicolons #\n\ + test 2 + 2 == 4 end;\n\ + test 3 + 3 == 6 end;\n\ + test 2 + 2 == 5 end;\n\n\ + # The value of the program is shown at the bottom # \n\ 2 + 2"; } ); ( "Projectors", @@ -13120,7 +12971,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children())))(Secondary((id \ 05038a7a-116c-4486-a10f-707032135aff)(content(Whitespace\" \ \"))))(Tile((id \ - 8a38360f-50ab-412e-aeca-395fa5f3061f)(label(33))(mold((out \ + 8a38360f-50ab-412e-aeca-395fa5f3061f)(label(23))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ 1dec1cda-e010-4aae-a254-4625e8fc2801)(content(Whitespace\" \ @@ -13137,7 +12988,7 @@ let startup : PersistentData.t = 1634bcf6-ff01-4301-ad47-f25bd3017a74)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - efbe2f5e-cff3-40e7-9153-b89faa3bc3aa)(label(73.00))(mold((out \ + efbe2f5e-cff3-40e7-9153-b89faa3bc3aa)(label(51.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ @@ -13256,7 +13107,7 @@ let startup : PersistentData.t = # currently are lost on cut/copy. Both these #\n\ # restrictions will be removed in a future update. #\n\n\ # Projectors playfround #\n\n\ - if true && 33 < int_of_float(73.00) \n\ + if true && 23 < int_of_float(51.00) \n\ then ______ else \"its: \" ++ box \n\ \ "; } ); From 53e299fe93ab8e1f4678682cd2cd381543991376 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 00:47:34 -0400 Subject: [PATCH 119/168] fix bug with paste not removing leading whitespace --- src/util/StringUtil.re | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/util/StringUtil.re b/src/util/StringUtil.re index a67c39fd9b..3e71a03b5a 100644 --- a/src/util/StringUtil.re +++ b/src/util/StringUtil.re @@ -36,8 +36,6 @@ let replace = Js_of_ocaml.Regexp.global_replace; let split = Js_of_ocaml.Regexp.split; -let trim_leading = replace(regexp("\n[ ]*"), "\n"); - let to_lines = (s: string): list(string) => split(regexp("\n"), s); let line_widths = (s: string): list(int) => @@ -52,10 +50,12 @@ let num_linebreaks = (s: string) => List.init(String.length(s), String.get(s)) |> List.fold_left((acc, c) => c == '\n' ? acc + 1 : acc, 0); -// let escape_linebreaks: string => string = replace(regexp("\n"), "\\\\n"); +// let escape_linebreaks: string => string = replace(regexp("\n"), "\\n"); // let unescape_linebreaks: string => string = replace(regexp("\\\\n"), "\n"); +//let trim_leading = replace(regexp("\n[ ]*"), "\n"); + //TODO(andrew): figure out why above dont work let escape_linebreaks: string => string = @@ -63,3 +63,5 @@ let escape_linebreaks: string => string = let unescape_linebreaks: string => string = Re.Str.global_replace(Re.Str.regexp("\\\\n"), "\n"); + +let trim_leading = Re.Str.global_replace(Re.Str.regexp("\n[ ]*"), "\n"); From 09af21a3838242ef871a42183208a869f9b910b6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 01:01:32 -0400 Subject: [PATCH 120/168] fix issue with projector panel showing everything as foldable --- src/haz3lcore/zipper/action/Indicated.re | 4 +- src/haz3lweb/view/CursorInspector.re | 2 +- src/haz3lweb/view/ProjectorView.re | 161 +++++++++++++---------- src/haz3lweb/www/style.css | 3 + 4 files changed, 97 insertions(+), 73 deletions(-) diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index bc15b33e4e..a8039c007a 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -90,6 +90,8 @@ let index = (z: ZipperBase.t): option(Id.t) => | Some((p, _, _)) => Some(Piece.id(p)) }; +let piece'' = piece'(~no_ws=true, ~ign=Piece.is_secondary); + let ci_of = (z: ZipperBase.t, info_map: Statics.Map.t): option(Statics.Info.t) => /* This version takes into accounts Secondary, while accounting for the @@ -98,7 +100,7 @@ let ci_of = * Secondary. But if this doesn't succeed, then we create a 'virtual' * info map entry representing the Secondary notation, which takes on * some of the semantic context of a nearby 'proxy' term */ - switch (piece'(~no_ws=true, ~ign=Piece.is_secondary, z)) { + switch (piece''(z)) { | Some((p, _, _)) => Id.Map.find_opt(Piece.id(p), info_map) | None => let sibs = ZipperBase.sibs_with_sel(z); diff --git a/src/haz3lweb/view/CursorInspector.re b/src/haz3lweb/view/CursorInspector.re index 8401de5271..42be60bcc2 100644 --- a/src/haz3lweb/view/CursorInspector.re +++ b/src/haz3lweb/view/CursorInspector.re @@ -290,7 +290,7 @@ let view = | Some(ci) => bar_view([ inspector_view(~inject, ~settings, ci), - ProjectorView.panel( + ProjectorView.Panel.view( ~inject=a => inject(PerformAction(Project(a))), editor, ci, diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 03bb147b2d..4f012b0f3a 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -227,80 +227,99 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => }; }; -let option_view = (name, n) => - option( - ~attrs=n == name ? [Attr.create("selected", "selected")] : [], - [text(n)], - ); +module Panel = { + let option_view = (name, n) => + option( + ~attrs=n == name ? [Attr.create("selected", "selected")] : [], + [text(n)], + ); -let applicable_projectors = (ci: Info.t): list(Projector.kind) => - ( - switch (Info.cls_of(ci)) { - | Exp(Bool) - | Pat(Bool) => [Checkbox] - | Exp(Int) - | Pat(Int) => [Slider] - | Exp(Float) - | Pat(Float) => [SliderF] - | Exp(String) - | Pat(String) => [TextArea] - | _ => [] - } - ) - @ [(Fold: Projector.kind)] - @ ( - switch (ci) { - | InfoExp(_) - | InfoPat(_) => [(Info: Projector.kind)] - | _ => [] - } - ); + let applicable_projectors = (ci: Info.t): list(Projector.kind) => + ( + switch (Info.cls_of(ci)) { + | Exp(Bool) + | Pat(Bool) => [Checkbox] + | Exp(Int) + | Pat(Int) => [Slider] + | Exp(Float) + | Pat(Float) => [SliderF] + | Exp(String) + | Pat(String) => [TextArea] + | _ => [] + } + ) + @ [(Fold: Projector.kind)] + @ ( + switch (ci) { + | InfoExp(_) + | InfoPat(_) => [(Info: Projector.kind)] + | _ => [] + } + ); -let toggle_projector = (active, id, ci): Action.project => - active || applicable_projectors(ci) == [] - ? Remove(id) : SetIndicated(List.hd(applicable_projectors(ci))); + let toggle_projector = (active, id, ci): Action.project => + active || applicable_projectors(ci) == [] + ? Remove(id) : SetIndicated(List.hd(applicable_projectors(ci))); -let toggle_view = (~inject, ci, id, active: bool) => - div( - ~attrs=[ - clss(["toggle-switch"] @ (active ? ["active"] : [])), - Attr.on_click(_ => inject(toggle_projector(active, id, ci))), - ], - [ - div( - ~attrs=[clss(["toggle-knob"])], - [ - Node.create( - "img", - ~attrs=[Attr.src("img/noun-fold-1593402.svg")], - [], - ), - ], - ), - ], - ); + let toggle_view = (~inject, ci, id, active: bool, might_project) => + div( + ~attrs=[ + clss( + ["toggle-switch"] + @ (active ? ["active"] : []) + @ (might_project ? [] : ["inactive"]), + ), + Attr.on_click(_ => inject(toggle_projector(active, id, ci))), + ], + [ + div( + ~attrs=[clss(["toggle-knob"])], + [ + Node.create( + "img", + ~attrs=[Attr.src("img/noun-fold-1593402.svg")], + [], + ), + ], + ), + ], + ); -let currently_selected = editor => - option_view( - switch (kind(editor)) { - | None => "Fold" - | Some(k) => name(k) - }, - ); + let currently_selected = editor => + option_view( + switch (kind(editor)) { + | None => "Fold" + | Some(k) => name(k) + }, + ); -let panel = (~inject, editor: Editor.t, ci: Info.t) => { - div( - ~attrs=[Attr.id("projectors")], - [ - toggle_view(~inject, ci, id(editor), kind(editor) != None), - Node.select( - ~attrs=[ - Attr.on_change((_, name) => inject(SetIndicated(of_name(name)))), - ], - applicable_projectors(ci) - |> List.map(name) - |> List.map(currently_selected(editor)), - ), - ], - ); + let view = (~inject, editor: Editor.t, ci: Info.t) => { + let might_project = + switch (Indicated.piece''(editor.state.zipper)) { + | Some((p, _, _)) => Projector.minimum_projection_condition(p) + | None => false + }; + div( + ~attrs=[Attr.id("projectors")], + [ + toggle_view( + ~inject, + ci, + id(editor), + kind(editor) != None, + might_project, + ), + Node.select( + ~attrs=[ + Attr.on_change((_, name) => + inject(SetIndicated(of_name(name))) + ), + ], + (might_project ? applicable_projectors(ci) : []) + |> List.map(name) + |> List.map(currently_selected(editor)), + ), + ], + ); + }; }; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index e9bce4c2b3..1a6658587c 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -1690,6 +1690,9 @@ svg.tile-selected { display: flex; align-items: center; } +#bottom-bar #projectors .toggle-switch.inactive { + opacity: 40%; +} #bottom-bar #projectors .toggle-knob { width: 2em; From 454b0f99392310aa4f073c75dd24f51258075c4b Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 01:28:30 -0400 Subject: [PATCH 121/168] cleanup --- src/haz3lcore/zipper/Editor.re | 18 +---- src/haz3lcore/zipper/EditorUtil.re | 7 -- src/haz3lcore/zipper/Projector.re | 2 +- src/haz3lcore/zipper/Zipper.re | 4 +- src/haz3lcore/zipper/action/Perform.re | 92 +++++++++++--------------- 5 files changed, 43 insertions(+), 80 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index d0c96cf43f..7c0367c13e 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -14,7 +14,7 @@ module CachedStatics = { }; let mk = (~settings: CoreSettings.t, z: Zipper.t): t => { - //TODO(andrew): allow pass-in of init ctx + // Modify here to allow passing in an initial context let ctx_init = Builtins.ctx_init; let term = MakeTerm.from_zip_for_sem(z) |> fst; let info_map = Statics.mk(settings, ctx_init, term); @@ -140,7 +140,7 @@ module Meta = { ) : t => { print_endline("Editor.next. Action:" ++ Action.show(a)); - //TODO(andrew): remove or reinstate touched/effects + // Effects disabled below; if nothing breaks due to this then rip them out let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); let statics = next_statics(~settings, a, z, meta.statics); let z_projected = Projector.Project.go(z, statics.info_map); @@ -302,22 +302,8 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; }; -let get_projectors = (ed: t) => ed.state.zipper.projectors; - let map_projectors = (f: (Id.t, Projector.entry) => Projector.entry, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, ); - -//TODO(andrew): use or lose -let get_projected_piece = (ed: t, id: Id.t): option(Piece.t) => { - /* Assumes for the moment that the projected thing is either - * a tile or a grout (not secondary or segment) */ - switch (Id.Map.find_opt(id, ed.state.meta.projected.tiles)) { - | Some(tile) => Some(Tile(tile)) - | None => - List.find_opt((g: Grout.t) => g.id == id, ed.state.meta.projected.holes) - |> Option.map(g => Piece.Grout(g)) - }; -}; diff --git a/src/haz3lcore/zipper/EditorUtil.re b/src/haz3lcore/zipper/EditorUtil.re index 107ec25bfa..996ec6f4ac 100644 --- a/src/haz3lcore/zipper/EditorUtil.re +++ b/src/haz3lcore/zipper/EditorUtil.re @@ -1,10 +1,3 @@ -// let editor_of_code = (~read_only=false, code: CodeString.t) => { -// switch (Printer.zipper_of_string(code)) { -// | None => None -// | Some(z) => Some(Editor.init(~read_only, z)) -// }; -// }; - let rec append_exp = (e1: TermBase.UExp.t, e2: TermBase.UExp.t) => { switch (e1.term) { | EmptyHole diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index d31f8be8d5..b519248841 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -17,7 +17,7 @@ let shape = (p: entry, info: info): shape => { }; let is_placeholder = (p: Piece.t): bool => { - //TODO: Revisit + // Eventually placeholders should be more principled switch (p) { | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 | _ => false diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 86b8b64bc0..3ccef45ddb 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -333,9 +333,7 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { * below call, resulting in trying to interpret the syntax * of the placeholder as e.g. an int for the slider */ p - | Some(pr) => - //TODO(andrew): figure out if ci None below will causes problems with eg Info - Projector.placeholder(pr, Projector.info_init(p)) + | Some(pr) => Projector.placeholder(pr, Projector.info_init(p)) | None => p }; let seg = Piece.disassemble(p); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 1e76e67d7a..914ea8b3fe 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -63,26 +63,43 @@ let go_z = let paste = (z: Zipper.t, str: string): option(Zipper.t) => { open Util.OptUtil.Syntax; - /* HACK(andrew): The two perform calls are a hack to - deal with the fact that pasting something like "let a = b in" - won't trigger the barfing of the "in"; to trigger this, we - insert a space, and then we immediately delete it. Note - that in general it's not safe to call go_z recursively - (the meta may change) but as long as we're not relying - on anything but the raw zipper we're fine. */ - //let settings = CoreSettings.off; let* z = Printer.zipper_of_string(~zipper_init=z, str); - switch (Insert.go(" ", z)) { - | None => None - | Some(z) => z |> Destruct.go(Left) |> Option.map(remold_regrout(Left)) - //|> Result.of_option(~error=Action.Failure.Cant_destruct) - // switch (go_z(~settings, Destruct(Left), z)) { - // | Error(_) => None - // | Ok(z) => Some(z) - // } - }; + /* HACK(andrew): Insert/Destruct below is a hack to deal + with the fact that pasting something like "let a = b in" + won't trigger the barfing of the "in"; to trigger this, + we insert a space, and then we immediately delete it */ + let* z = Insert.go(" ", z); + let+ z = Destruct.go(Left, z); + remold_regrout(Left, z); }; + let buffer_accept = (z): option(Zipper.t) => + switch (z.selection.mode) { + | Normal => None + | Buffer(Unparsed) => + switch (TyDi.get_buffer(z)) { + | None => None + | Some(completion) when String.contains(completion, ' ') => + /* Slightly hacky. We assume that if a completion string has + * spaces in it, that means it will have a hole in it. This + * is a non-essential invariant currently maintained in TyDi. + * In such a case, we insert the completion as normal by + * pasting, then return to the beginning and advance to the + * first hole. This should be revisited if completions are + * refactored to use a more structured buffer format. */ + let start = Zipper.caret_point(M.measured, meta.projected.z); + let z = { + open OptUtil.Syntax; + let* z = paste(z, completion); + let* z = Move.go(Goal(Point(start)), z); + let* z = Move.go(Goal(Piece(Grout, Right)), z); + Move.go(Local(Left(ByToken)), z); + }; + z; + | Some(completion) => paste(z, AssistantExpander.trim(completion)) + } + }; + switch (a) { | Paste(clipboard) => switch (paste(z, clipboard)) { @@ -95,7 +112,6 @@ let go_z = | None => Error(Cant_destruct) | Some(z) => Ok(z) } - // go_z(~settings, ~meta, Destruct(Left), z) | Copy => /* System clipboard handling itself is done in Page.view handlers. * This doesn't change state but is included here for logging purposes */ @@ -107,50 +123,20 @@ let go_z = } | Buffer(Set(TyDi)) => Ok(buffer_set(meta.statics.info_map, z)) | Buffer(Accept) => - switch (z.selection.mode) { - | Normal => Ok(z) - | Buffer(Unparsed) => - switch (TyDi.get_buffer(z)) { - | None => Error(CantAccept) - | Some(completion) when String.contains(completion, ' ') => - /* Slightly hacky. We assume that if a completion string has - * spaces in it, that means it will have a hole in it. This - * is a non-essential invariant currently maintained in TyDi. - * In such a case, we insert the completion as normal by - * pasting, then return to the beginning and advance to the - * first hole. This should be revisited if completions are - * refactored to use a more structured buffer format. */ - let start = Zipper.caret_point(M.measured, meta.projected.z); - let z = { - open OptUtil.Syntax; - let* z = paste(z, completion); - let* z = Move.go(Goal(Point(start)), z); - let* z = Move.go(Goal(Piece(Grout, Right)), z); - Move.go(Local(Left(ByToken)), z); - }; - switch (z) { - | None => Error(CantAccept) - | Some(z) => Ok(z) - }; - | Some(completion) => - switch (paste(z, AssistantExpander.trim(completion))) { - | None => Error(CantAccept) - | Some(z) => Ok(z) - } - } + switch (buffer_accept(z)) { + | None => Error(CantAccept) + | Some(z) => Ok(z) } | Project(a) => ProjectorPerform.go(Move.jump_to_id, Move.primary, a, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | Jump(jump_target) => - open OptUtil.Syntax; - let idx = Indicated.index(z); let statics = meta.statics.info_map; - ( switch (jump_target) { | BindingSiteOfIndicatedVar => + open OptUtil.Syntax; let* idx = idx; let* ci = Id.Map.find_opt(idx, statics); let* binding_id = Info.get_binding_site(ci); @@ -289,7 +275,7 @@ let go = * the completion buffer before performing the action. Conversely, * after any edit action, a new completion is set in the buffer */ if (ed.read_only && is_write_action(a)) { - Result.Ok(ed); + Ok(ed); } else if (settings.assist && settings.statics) { open Result.Syntax; let ed = a == Buffer(Accept) ? ed : Editor.update_z(buffer_clear, ed); From 2c96e1009bebb11fab190dd5f7ee3fad517d6643 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 14:34:58 -0400 Subject: [PATCH 122/168] fix bug with mouse movement not targeting correctly rounded side of character on horizontal axis. Cleanup of projector focus actions --- src/haz3lcore/zipper/ProjectorBase.re | 14 +++--- src/haz3lcore/zipper/action/Action.re | 7 ++- .../zipper/action/ProjectorPerform.re | 44 +++++++++---------- .../zipper/projectors/CheckboxCore.re | 2 +- src/haz3lcore/zipper/projectors/FoldCore.re | 2 +- src/haz3lcore/zipper/projectors/InfoCore.re | 2 +- src/haz3lcore/zipper/projectors/SliderCore.re | 2 +- .../zipper/projectors/SliderFCore.re | 2 +- .../zipper/projectors/TextAreaCore.re | 2 +- src/haz3lweb/view/Cell.re | 5 ++- src/haz3lweb/view/ProjectorView.re | 17 ++++--- src/haz3lweb/www/style.css | 2 +- 12 files changed, 51 insertions(+), 50 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 778231347d..fb0678699d 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -41,11 +41,11 @@ type status = type syntax = Piece.t; type action = - | Remove /* Remove projector */ - | FocusInternal(Util.Direction.t) /* DOM Focus on projector */ - | Escape(Util.Direction.t) /* Pass key control to parent editor */ + | Remove /* Remove projector entirely */ + | Focus(option(Util.Direction.t)) /* Pass focus to projector */ + | Escape(Util.Direction.t) /* Pass focus to parent editor */ | SetSyntax(syntax) /* Set underlying syntax */ - | UpdateModel(string); /* Set serialized model */ + | SetModel(string); /* Set projector model */ type p_action = action; @@ -83,7 +83,7 @@ module type Projector = { Node.t; let placeholder: (model, info) => shape; let update: (model, action) => model; - let activate: ((Id.t, Direction.t)) => unit; + let focus: ((Id.t, Direction.t)) => unit; }; type serialized_model = string; @@ -103,7 +103,7 @@ module type Cooked = { Node.t; let placeholder: (serialized_model, info) => shape; let update: (serialized_model, serialized_action) => serialized_model; - let activate: ((Id.t, Direction.t)) => unit; + let focus: ((Id.t, Direction.t)) => unit; }; module Cook = (C: Projector) : Cooked => { @@ -120,5 +120,5 @@ module Cook = (C: Projector) : Cooked => { m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; let update = (m, a) => C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; - let activate = C.activate; + let focus = C.focus; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 8f122e8288..7387f95e0c 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -46,11 +46,10 @@ type select = [@deriving (show({with_path: false}), sexp, yojson)] type project = | SetSyntax(Id.t, Piece.t) - | UpdateModel(Id.t, string) + | SetModel(Id.t, string) | SetIndicated(Projector.kind) | ToggleIndicated(Projector.kind) - | FocusInternal(Id.t, Util.Direction.t) - | Activate(Id.t) + | Focus(Id.t, option(Util.Direction.t)) | Escape(Id.t, Direction.t) | Remove(Id.t); @@ -103,7 +102,7 @@ module Result = { let is_edit: t => bool = fun - | Project(FocusInternal(_) | Escape(_)) => false + | Project(Focus(_) | Escape(_)) => false | Project(_) => true //TODO(andrew): revisit | Buffer(Accept) | Paste(_) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 75d66df386..7f8bf7f3d9 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -45,24 +45,33 @@ let go = a: Action.project, z: Zipper.t, ) => { - //TODO(andrew): document switch (a) { - | FocusInternal(id, d) => + | Focus(id, d) => let z = switch (jump_to_id(z, id)) { | Some(z) => z | None => z }; - let z = - d == Left - ? z - : ( - switch (primary(ByToken, Right, z)) { - | Some(z) => z - | None => z - } - ); - Ok(z); + switch (d) { + | None => + let p = indicated_proj_z(z) |> Option.map(snd); + switch (p) { + | Some(p) => + let (module P) = to_module(p.kind); + P.focus((id, Left)); + Ok(z); + | None => Error(Action.Failure.Cant_project) + }; + | Some(Left) => Ok(z) + | Some(Right) => + let z = + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + }; + Ok(z); + }; + | Escape(id, Left) => let z = switch (jump_to_id(z, id)) { @@ -93,22 +102,13 @@ let go = | Some((piece, d, rel)) => add_or_remove(Piece.id(piece), z, p, piece, d, rel) } - | Activate(id) => - let p = indicated_proj_z(z) |> Option.map(snd); - switch (p) { - | Some(p) => - let (module P) = to_module(p.kind); - P.activate((id, Left)); - Error(Action.Failure.Cant_project); - | None => Error(Action.Failure.Cant_project) - }; | Remove(id) => switch (Map.mem(id, z.projectors)) { | false => Error(Action.Failure.Cant_project) | true => Ok(set(id, None, z)) } | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) - | UpdateModel(id, model) => + | SetModel(id, model) => Ok({ ...z, projectors: diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index e1549bb3ba..12261a4010 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -55,5 +55,5 @@ module M: Projector = { let placeholder = (_, _) => Inline(2); let update = (model, _) => model; let view = view; - let activate = _ => (); + let focus = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index e87b0fa3ba..f4fe6250d4 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -18,5 +18,5 @@ module M: Projector = { ~attrs=[Attr.on_double_click(_ => inject(Remove))], [text("⋱")], ); - let activate = _ => (); + let focus = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 38777326e3..67fac38ad5 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -90,5 +90,5 @@ module M: Projector = { ), ], ); - let activate = _ => (); + let focus = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 3b73f15b36..726ba89e63 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -34,5 +34,5 @@ module M: Projector = { ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax), ); - let activate = _ => (); + let focus = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 2727270c40..17dac069da 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -37,5 +37,5 @@ module M: Projector = { ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], get(info.syntax) |> Printf.sprintf("%.2f"), ); - let activate = _ => (); + let focus = _ => (); }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index f44c4638ab..b753b9d446 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -98,7 +98,7 @@ module M: Projector = { }; let update = (model, _) => model; let view = view; - let activate = ((id: Id.t, d: Direction.t)) => { + let focus = ((id: Id.t, d: Direction.t)) => { JsUtil.get_elem_by_id(of_id(id))##focus; switch (d) { | Left => () diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 4896882e52..43c1f6a8ee 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -8,7 +8,10 @@ let get_goal = (~font_metrics: FontMetrics.t, ~target_id, e) => { let goal_y = float_of_int(e##.clientY); Measured.Point.{ row: Float.to_int((goal_y -. rect##.top) /. font_metrics.row_height), - col: Float.(to_int((goal_x -. rect##.left) /. font_metrics.col_width)), + col: + Float.( + to_int(round((goal_x -. rect##.left) /. font_metrics.col_width)) + ), }; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 4f012b0f3a..d2c1bfddc0 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -76,8 +76,7 @@ let view_wrapper = Effect.( Many([ Stop_propagation, - inject(PerformAction(Jump(TileId(info.id)))), - inject(PerformAction(Project(Activate(info.id)))), + inject(PerformAction(Project(Focus(info.id, None)))), ]) ) ), @@ -90,10 +89,10 @@ let view_wrapper = let handle = (id, action: ProjectorBase.action): Action.project => switch (action) { | Remove => Remove(id) - | FocusInternal(d) => FocusInternal(id, d) + | Focus(d) => Focus(id, d) | Escape(d) => Escape(id, d) | SetSyntax(f) => SetSyntax(id, f) - | UpdateModel(sexp) => UpdateModel(id, sexp) + | SetModel(sexp) => SetModel(id, sexp) }; let update_model = (action, {kind, model}) => { @@ -117,7 +116,7 @@ let view_setup = let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); - let go = a => inject_proj(UpdateModel(P.update(p.model, a))); + let go = a => inject_proj(SetModel(P.update(p.model, a))); view_wrapper( ~inject, ~font_metrics, @@ -216,11 +215,11 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} when P.can_focus => switch (key, d) { | (D("ArrowRight"), Right) => - P.activate((id, Left)); - Some(Action.FocusInternal(id, Left)); + P.focus((id, Left)); + Some(Action.Focus(id, Some(Left))); | (D("ArrowLeft"), Left) => - P.activate((id, Right)); - Some(FocusInternal(id, Right)); + P.focus((id, Right)); + Some(Focus(id, Some(Right))); | _ => None } | _ => None diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 1a6658587c..b5a6e37ae7 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -798,7 +798,7 @@ select { width: 100%; display: flex; border-radius: 0 0.1em 0.1em 0.1em; - /* color: #fff; */ + color: #fff; background: repeating-linear-gradient( #0000, #0000 1.41em, From 203c66073d03a200b073468fcc88943f7ab4454b Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 16:20:20 -0400 Subject: [PATCH 123/168] simplify projector focus logic --- src/haz3lcore/zipper/ProjectorBase.re | 4 +- src/haz3lcore/zipper/action/Perform.re | 16 ++++- .../zipper/action/ProjectorPerform.re | 68 +++++++------------ .../zipper/projectors/TextAreaCore.re | 7 +- src/haz3lweb/view/ProjectorView.re | 8 +-- 5 files changed, 44 insertions(+), 59 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index fb0678699d..66d51f2ab5 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -83,7 +83,7 @@ module type Projector = { Node.t; let placeholder: (model, info) => shape; let update: (model, action) => model; - let focus: ((Id.t, Direction.t)) => unit; + let focus: ((Id.t, option(Direction.t))) => unit; }; type serialized_model = string; @@ -103,7 +103,7 @@ module type Cooked = { Node.t; let placeholder: (serialized_model, info) => shape; let update: (serialized_model, serialized_action) => serialized_model; - let focus: ((Id.t, Direction.t)) => unit; + let focus: ((Id.t, option(Direction.t))) => unit; }; module Cook = (C: Projector) : Cooked => { diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 914ea8b3fe..86f345dd99 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -28,7 +28,7 @@ let buffer_clear = (z: t): t => | _ => z }; -let buffer_set = (info_map: Statics.Map.t, z: t): t => +let set_buffer = (info_map: Statics.Map.t, z: t): t => switch (TyDi.set_buffer(~info_map, z)) { | None => z | Some(z) => z @@ -121,7 +121,7 @@ let go_z = | None => Error(CantReparse) | Some(z) => Ok(z) } - | Buffer(Set(TyDi)) => Ok(buffer_set(meta.statics.info_map, z)) + | Buffer(Set(TyDi)) => Ok(set_buffer(meta.statics.info_map, z)) | Buffer(Accept) => switch (buffer_accept(z)) { | None => Error(CantAccept) @@ -281,7 +281,17 @@ let go = let ed = a == Buffer(Accept) ? ed : Editor.update_z(buffer_clear, ed); let* ed = go_history(~settings, a, ed); Action.is_edit(a) - ? Ok(Editor.update_z(buffer_set(ed.state.meta.statics.info_map), ed)) + ? { + //TODO(andrew): fix completion bug + // let _ = + // switch (go_history(~settings, Buffer(Set(TyDi)), ed)) { + // | Error(err) => Error(err) + // | Ok(ed) => Ok(ed) + // }; + Ok( + Editor.update_z(set_buffer(ed.state.meta.statics.info_map), ed), + ); + } : Ok(ed); } else { go_history(~settings, a, ed); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 7f8bf7f3d9..bd774d7dba 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -44,7 +44,8 @@ let go = (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), a: Action.project, z: Zipper.t, - ) => { + ) + : result(ZipperBase.t, Action.Failure.t) => { switch (a) { | Focus(id, d) => let z = @@ -52,18 +53,22 @@ let go = | Some(z) => z | None => z }; - switch (d) { - | None => - let p = indicated_proj_z(z) |> Option.map(snd); - switch (p) { - | Some(p) => - let (module P) = to_module(p.kind); - P.focus((id, Left)); - Ok(z); - | None => Error(Action.Failure.Cant_project) + switch (indicated_proj_z(z)) { + | Some((_, p)) => + let (module P) = to_module(p.kind); + P.focus((id, d)); + Ok(z); + | None => Error(Cant_project) + }; + | Escape(id, d) => + let z = + switch (jump_to_id(z, id)) { + | Some(z) => z + | None => z }; - | Some(Left) => Ok(z) - | Some(Right) => + switch (d) { + | Left => Ok(z) + | Right => let z = switch (primary(ByToken, Right, z)) { | Some(z) => z @@ -71,52 +76,25 @@ let go = }; Ok(z); }; - - | Escape(id, Left) => - let z = - switch (jump_to_id(z, id)) { - | Some(z) => z - | None => z - }; - Ok(z); - | Escape(id, Right) => - let z = - switch (jump_to_id(z, id)) { - | Some(z) => z - | None => z - }; - let z = - switch (primary(ByToken, Right, z)) { - | Some(z) => z - | None => z - }; - Ok(z); | SetIndicated(p) => switch (Indicated.for_index(z)) { - | None => Error(Action.Failure.Cant_project) + | None => Error(Cant_project) | Some((piece, d, rel)) => add(Piece.id(piece), z, p, piece, d, rel) } | ToggleIndicated(p) => switch (Indicated.for_index(z)) { - | None => Error(Action.Failure.Cant_project) + | None => Error(Cant_project) | Some((piece, d, rel)) => add_or_remove(Piece.id(piece), z, p, piece, d, rel) } | Remove(id) => switch (Map.mem(id, z.projectors)) { - | false => Error(Action.Failure.Cant_project) + | false => Error(Cant_project) | true => Ok(set(id, None, z)) } - | SetSyntax(id, p) => Ok(Projector.Syntax.update(_ => p, id, z)) + | SetSyntax(id, syntax) => Ok(Projector.Syntax.update(_ => syntax, id, z)) | SetModel(id, model) => - Ok({ - ...z, - projectors: - Map.update( - id, - entry => Option.map(e => {model, kind: e.kind}, entry), - z.projectors, - ), - }) + let update = entry => Option.map(e => {model, kind: e.kind}, entry); + Ok({...z, projectors: Map.update(id, update, z.projectors)}); }; }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index b753b9d446..48acf8e1be 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -98,11 +98,12 @@ module M: Projector = { }; let update = (model, _) => model; let view = view; - let focus = ((id: Id.t, d: Direction.t)) => { + let focus = ((id: Id.t, d: option(Direction.t))) => { JsUtil.get_elem_by_id(of_id(id))##focus; switch (d) { - | Left => () - | Right => + | None + | Some(Left) => () + | Some(Right) => JsUtil.TextArea.set_caret_to_end(JsUtil.TextArea.get(of_id(id))) }; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index d2c1bfddc0..e49d878800 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -214,12 +214,8 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => switch (key) { | {key, sys: _, shift: Up, meta: Up, ctrl: Up, alt: Up} when P.can_focus => switch (key, d) { - | (D("ArrowRight"), Right) => - P.focus((id, Left)); - Some(Action.Focus(id, Some(Left))); - | (D("ArrowLeft"), Left) => - P.focus((id, Right)); - Some(Focus(id, Some(Right))); + | (D("ArrowRight"), Right) => Some(Action.Focus(id, Some(Left))) + | (D("ArrowLeft"), Left) => Some(Focus(id, Some(Right))) | _ => None } | _ => None From fd9be58fa2751bb391ca646d12474800216aa5b4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 18:57:30 -0400 Subject: [PATCH 124/168] projector docs and cleanup --- src/haz3lcore/zipper/Editor.re | 3 +- src/haz3lcore/zipper/Projector.re | 15 ++-- src/haz3lcore/zipper/ProjectorBase.re | 75 +++++++++++++++---- .../zipper/action/ProjectorPerform.re | 4 +- src/haz3lweb/Editors.re | 2 +- src/haz3lweb/Keyboard.re | 4 - src/haz3lweb/view/ProjectorView.re | 40 +++++----- src/haz3lweb/www/style.css | 12 +-- src/util/StringUtil.re | 4 +- 9 files changed, 94 insertions(+), 65 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 7c0367c13e..3f48363b1c 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -302,7 +302,8 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; }; -let map_projectors = (f: (Id.t, Projector.entry) => Projector.entry, ed: t) => +let map_projectors = + (f: (Id.t, Projector.Map.entry) => Projector.Map.entry, ed: t) => update_z( z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, ed, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index b519248841..58da2c4f25 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -11,7 +11,7 @@ let to_module = (kind: kind): (module Cooked) => | TextArea => (module Cook(TextAreaCore.M)) }; -let shape = (p: entry, info: info): shape => { +let shape = (p: Map.entry, info: info): shape => { let (module P) = to_module(p.kind); P.placeholder(p.model, info); }; @@ -24,7 +24,7 @@ let is_placeholder = (p: Piece.t): bool => { }; }; -let placeholder_label = (p: entry, syntax): list(string) => +let placeholder_label = (p: Map.entry, syntax): list(string) => switch (shape(p, syntax)) { | Inline(width) => [String.make(width, ' ')] | Block({row, col}) => [ @@ -32,7 +32,7 @@ let placeholder_label = (p: entry, syntax): list(string) => ] }; -let placeholder = (p: entry, info: info): syntax => +let placeholder = (p: Map.entry, info: info): syntax => Piece.Tile({ id: Piece.id(info.syntax), label: placeholder_label(p, info), @@ -45,7 +45,7 @@ let placeholder = (p: entry, info: info): syntax => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -let create = (kind: kind, syntax: syntax): option(entry) => { +let create = (kind: kind, syntax: syntax): option(Map.entry) => { let (module P) = to_module(kind); P.can_project(syntax) && minimum_projection_condition(syntax) ? Some({kind, model: P.init}) : None; @@ -208,12 +208,7 @@ module Project = { switch (Map.find(id, projectors)) { | None => syntax | Some(pr) => - let info: info = { - id, - syntax, - status: None, //TODO(andrew) - ci: Id.Map.find_opt(id, info_map), - }; + let info: info = {id, syntax, ci: Id.Map.find_opt(id, info_map)}; syntax_map := Id.Map.add(id, syntax, syntax_map^); placeholder(pr, info); }; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 66d51f2ab5..7c3cdcffca 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -1,6 +1,13 @@ open Util; open Virtual_dom.Vdom; +/* This module, along with ZipperBase, exists to resolve + * cyclic dependencies between Zipper and Projector. All + * projector functionality should be added to Projector.re + * or above unless it would create such a cycle */ + +/* Enumeration of different kinds of projectors. This is + * used as a key when adding new projectors to an editor. */ [@deriving (show({with_path: false}), sexp, yojson)] type kind = | Fold @@ -10,17 +17,19 @@ type kind = | SliderF | TextArea; -[@deriving (show({with_path: false}), sexp, yojson)] -type entry = { - kind, - model: string, -}; - +/* The projector map is store alongside the zipper and + * maps syntax UUIDs to instantiated projectors. This + * is how projector placement and models are persisted */ [@deriving (show({with_path: false}), sexp, yojson)] module Map = { - open Id.Map; + [@deriving (show({with_path: false}), sexp, yojson)] + type entry = { + kind, + model: string, + }; [@deriving (show({with_path: false}), sexp, yojson)] type t = Id.Map.t(entry); + open Id.Map; let empty = empty; let find = find_opt; let mem = mem; @@ -28,15 +37,15 @@ module Map = { let update = update; }; +/* Projectors currently have two options for placeholder + * shapes: A inline display of a given length, or a block + * display with given length & height. Both of these can + * depend on the projector model and info package */ [@deriving (show({with_path: false}), sexp, yojson)] type shape = | Inline(int) | Block(Measured.Point.t); -[@deriving (show({with_path: false}), sexp, yojson)] -type status = - | Indicated(Util.Direction.t); - [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; @@ -54,25 +63,42 @@ type p_action = action; type info = { id: Id.t, syntax, - status: option(status), + //status: option(status), ci: option(Info.t), }; let info_init = (p: syntax) => { id: Piece.id(p), syntax: p, - status: None, + //status: None, ci: None, }; module type Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model; + /* The internal model type of the projector which will + * be serialized and persisted. Use `unit` if you don't + * need other state beyond the underlying syntax */ [@deriving (show({with_path: false}), sexp, yojson)] type action; + /* An internal action type to be used in actions which + * update the model. Use `unit` if the basic projector + * actions (type `action`) above suffice */ let init: model; + /* Initial state of the model */ let can_project: Piece.t => bool; + /* A predicate determining if the given underlying + * syntax (currently limited to convex pieces) is + * supported by this projector. This is used to gate + * adding the projector */ let can_focus: bool; + /* Does this projector have internal position states, + * overriding the editor caret & keyboard handlers? + * If yes, the focus method will be called when this + * projector is either clicked on or if left/right + * is pressed when the caret is to the immediate + * right/left of the projector */ let view: ( model, @@ -81,14 +107,37 @@ module type Projector = { ~inject: p_action => Ui_effect.t(unit) ) => Node.t; + /* Renders a DOM view for the projector, given the + * model, an info packet (see info type for details), + * and has two callbacks: inject calls global projector + * actions (see action type above), and go calls this + * projector's local update function. */ let placeholder: (model, info) => shape; + /* How much space should be left in the code view for + * this projector? This determines how the base code + * view is laid out, including how movement around the + * projector works. In principle this could be derived + * from the view, but this is awkward to do so for now + * projector writers are responsible for keeping these + * in sync with each other. */ let update: (model, action) => model; + /* Update the local projector model given an action */ let focus: ((Id.t, option(Direction.t))) => unit; + /* Does whatever needs to be done to give a projector + * keyboard focus. Right now this is only for side + * effects but could be extended in the future to + * take/return the model if the projector needs to + * maintain a complex internal position state */ }; +/* Projector model and action are serialized so that + * they may be used by the Editor without it having + * specialized knowledge of projector internals */ type serialized_model = string; type serialized_action = string; +/* A cooked projector is the same as the base module + * signature except model & action are serialized */ module type Cooked = { let init: serialized_model; let can_project: Piece.t => bool; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index bd774d7dba..b58dd59af8 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -12,7 +12,7 @@ let move_out_of_piece = } }; -let set = (id: Id.t, p: option(entry), z: Zipper.t) => { +let set = (id: Id.t, p: option(Map.entry), z: Zipper.t) => { ...z, projectors: Map.update(id, _ => p, z.projectors), }; @@ -94,7 +94,7 @@ let go = } | SetSyntax(id, syntax) => Ok(Projector.Syntax.update(_ => syntax, id, z)) | SetModel(id, model) => - let update = entry => Option.map(e => {model, kind: e.kind}, entry); + let update = entry => Option.map(e => Map.{model, kind: e.kind}, entry); Ok({...z, projectors: Map.update(id, update, z.projectors)}); }; }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 481c4a89df..d0a960905d 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -66,7 +66,7 @@ let update_current_editor_statics = settings => update(Editor.update_statics(~settings)); let map_projectors = - (editors: t, f: (Id.t, Projector.entry) => Projector.entry): t => + (editors: t, f: (Id.t, Projector.Map.entry) => Projector.Map.entry): t => editors |> get_editor |> Editor.map_projectors(f) |> put_editor(_, editors); let get_ctx_init = (~settings as _: Settings.t, editors: t): Ctx.t => diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index 74a8cc3902..75bb51a7ac 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -111,10 +111,6 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => switch (key) { | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold)))) - | "†" => Some(PerformAction(Project(ToggleIndicated(Info)))) - | "ç" => Some(PerformAction(Project(ToggleIndicated(Checkbox)))) - | "ß" => Some(PerformAction(Project(ToggleIndicated(Slider)))) - | "∑" => Some(PerformAction(Project(ToggleIndicated(TextArea)))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index e49d878800..a7034441c9 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -38,7 +38,7 @@ let backing_deco = | Block(_) => PieceDec.convex_shard(~font_metrics, ~measurement) }; -let cls = (indicated: option(status), selected: bool, shape: shape) => +let cls = (indicated: option(list(string)), selected: bool, shape: shape) => (selected ? ["selected"] : []) @ ( switch (shape) { @@ -48,8 +48,7 @@ let cls = (indicated: option(status), selected: bool, shape: shape) => ) @ ( switch (indicated) { - | Some(Indicated(Left)) => ["indicated", "left"] - | Some(Indicated(Right)) => ["indicated", "right"] + | Some(indicated) => indicated | None => [] } ); @@ -59,10 +58,10 @@ let view_wrapper = ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, - ~status: option(Projector.status), ~info: info, + ~indication: option(list(string)), ~selected: bool, - entry: Projector.entry, + entry: Map.entry, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; @@ -70,7 +69,7 @@ let view_wrapper = div( ~attrs=[ Attr.classes( - ["projector", name(entry.kind)] @ cls(status, selected, shape), + ["projector", name(entry.kind)] @ cls(indication, selected, shape), ), Attr.on_mousedown(_ => Effect.( @@ -95,7 +94,7 @@ let handle = (id, action: ProjectorBase.action): Action.project => | SetModel(sexp) => SetModel(id, sexp) }; -let update_model = (action, {kind, model}) => { +let update_model = (action, {kind, model}: Map.entry): Map.entry => { let (module P) = to_module(kind); {kind, model: P.update(model, action)}; }; @@ -106,13 +105,13 @@ let view_setup = ~meta: Editor.Meta.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, - ~status: option(Projector.status), + ~indication: option(list(string)), ) : option(Node.t) => { let* p = Projector.Map.find(id, meta.projected.z.projectors); let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); - let info = {id, ci, syntax, status}; + let info = {id, ci, syntax}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); @@ -121,7 +120,7 @@ let view_setup = ~inject, ~font_metrics, ~measurement, - ~status, + ~indication, ~info, ~selected=List.mem(id, meta.selection_ids), p, @@ -129,15 +128,10 @@ let view_setup = ); }; -let status_and_id = (z: ZipperBase.t) => +let indication = (z: ZipperBase.t) => switch (Indicated.piece(z)) { - | Some((p, d, _)) => Some((Piece.id(p), Indicated(d))) - | None => None - }; - -let status = (z: ZipperBase.t): option(status) => - switch (status_and_id(z)) { - | Some((_, status)) => Some(status) + | Some((p, Left, _)) => Some((Piece.id(p), ["indicated", "left"])) + | Some((p, Right, _)) => Some((Piece.id(p), ["indicated", "right"])) | None => None }; @@ -151,9 +145,10 @@ let view_all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => ~meta, ~inject, ~font_metrics, - ~status= - switch (status_and_id(meta.projected.z)) { - | Some((ind_id, ind_d)) when ind_id == id => Some(ind_d) + ~indication= + switch (indication(meta.projected.z)) { + | Some((ind_id, indication)) when ind_id == id => + Some(indication) | _ => None }, ) @@ -193,8 +188,7 @@ let shape_from_map = (z, meta: Editor.Meta.t): option(shape) => { let* id = Indicated.index(z); let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); - let status = status(z); - let info = {id, syntax, status, ci}; + let info = {id, syntax, ci}; shape(z, info); }; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index b5a6e37ae7..aacac6a6a6 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -701,12 +701,11 @@ select { } .projector.selected > svg, .projector.selected.indicated > svg, -.projector.block.selected.indicated > svg { +.projector.block.selected.indicated > svg { fill: var(--selection-color); } .projector > svg > path { vector-effect: non-scaling-stroke; - /* filter: url(#raised-drop-shadow-Exp) !important; */ } /* PROJECTOR: FOLD */ @@ -724,9 +723,6 @@ select { .projector.type .type { color: var(--typ-text-color); } -/* .projector.type > svg { - fill: var(--typ-bg-off-color); -} */ .projector.type { cursor: pointer; } @@ -803,7 +799,7 @@ select { #0000, #0000 1.41em, #add8ff 1.41em, - #add8ff 1.46em + #add8ff 1.45em /* line-height */ ); } @@ -813,7 +809,7 @@ select { #0000, #0000 1.41em, rgba(200, 138, 24, 0.3) 1.41em, - rgba(200, 138, 24, 0.3) 1.46em + rgba(200, 138, 24, 0.3) 1.45em /* line-height */ ); } @@ -1859,7 +1855,7 @@ svg.tile-selected { stroke: #ff000087; stroke-width: 0.75px; vector-effect: non-scaling-stroke; - stroke-dasharray: 1,1; + stroke-dasharray: 1, 1; stroke-linecap: butt; } diff --git a/src/util/StringUtil.re b/src/util/StringUtil.re index 3e71a03b5a..2214dcce75 100644 --- a/src/util/StringUtil.re +++ b/src/util/StringUtil.re @@ -51,10 +51,8 @@ let num_linebreaks = (s: string) => |> List.fold_left((acc, c) => c == '\n' ? acc + 1 : acc, 0); // let escape_linebreaks: string => string = replace(regexp("\n"), "\\n"); - // let unescape_linebreaks: string => string = replace(regexp("\\\\n"), "\n"); - -//let trim_leading = replace(regexp("\n[ ]*"), "\n"); +// let trim_leading = replace(regexp("\n[ ]*"), "\n"); //TODO(andrew): figure out why above dont work From b449fd9a8cb20226e381dfdc914221a36c9de274 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 19:55:56 -0400 Subject: [PATCH 125/168] projector documentation --- src/haz3lcore/zipper/Projector.re | 55 ++++-- src/haz3lcore/zipper/ProjectorBase.re | 29 ++- src/haz3lcore/zipper/action/Action.re | 18 +- .../zipper/projectors/CheckboxCore.re | 9 +- src/haz3lcore/zipper/projectors/SliderCore.re | 2 +- .../zipper/projectors/SliderFCore.re | 2 +- .../zipper/projectors/TextAreaCore.re | 8 +- src/haz3lweb/view/Cell.re | 6 +- src/haz3lweb/view/Deco.re | 9 +- src/haz3lweb/view/ProjectorView.re | 166 +++++++++--------- 10 files changed, 164 insertions(+), 140 deletions(-) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 58da2c4f25..ed09697ae6 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,6 +1,12 @@ open Util; include ProjectorBase; +/* See ProjectorBase for an introduction */ + +/* After adding a new projector module, add it here so that + * it can be instantiated. The first-class module created by + * this function must be reified whenever projector methods + * are to be called; see `shape` below for an example */ let to_module = (kind: kind): (module Cooked) => switch (kind) { | Fold => (module Cook(FoldCore.M)) @@ -16,14 +22,12 @@ let shape = (p: Map.entry, info: info): shape => { P.placeholder(p.model, info); }; -let is_placeholder = (p: Piece.t): bool => { - // Eventually placeholders should be more principled - switch (p) { - | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 - | _ => false - }; -}; - +/* A projector is replaced by a placeholder in the underlying + * editor for view purposes. This projector is an all-whitespace + * monotile. Currently there is no explicit notion of placeholders + * in the zipper; a tile consisting of any number of whitespaces + * is considered a placeholder. This could be made more principled. + * Note that a placeholder retains the UUID of the underlying. */ let placeholder_label = (p: Map.entry, syntax): list(string) => switch (shape(p, syntax)) { | Inline(width) => [String.make(width, ' ')] @@ -41,28 +45,47 @@ let placeholder = (p: Map.entry, info: info): syntax => children: [], }); +/* Must be in-sync with placeholder_label / placeholder above */ +let is_placeholder = (p: Piece.t): bool => + switch (p) { + | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 + | _ => false + }; + /* Currently projection is limited to convex pieces */ let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); +/* Add a new projector, gated on the predicated on the syntax */ let create = (kind: kind, syntax: syntax): option(Map.entry) => { let (module P) = to_module(kind); P.can_project(syntax) && minimum_projection_condition(syntax) ? Some({kind, model: P.init}) : None; }; -let piece_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => +/* Is a piece of syntax currently projected? */ +let syntax_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => switch (syntax) { | Some(p) when Map.mem(Piece.id(p), ps) => Map.mem(Piece.id(p), ps) ? Some(Piece.id(p)) : None | _ => None }; +/* Is neighboring syntax currently projected? */ let neighbor_is = (ps, s: Siblings.t): (option(Id.t), option(Id.t)) => ( - piece_is(ps, Siblings.left_neighbor(s)), - piece_is(ps, Siblings.right_neighbor(s)), + syntax_is(ps, Siblings.left_neighbor(s)), + syntax_is(ps, Siblings.right_neighbor(s)), ); +/* This handles the logic for selecting around projectors. + * This amounts to simply selecting over the projected syntax + * as if it were atomic instead of selecting into it. In principle, + * this should work the same as if the projected syntax was replaced + * by its placeholder, the selection was made on that projections, + * and then the placeholder was replaced by former syntax. In an + * updated syntax model, it should maybe work this way, or else + * projected syntax should be represented in the zipper in + * a more first-class way */ module Select = { let skip_grow_left = ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { @@ -111,8 +134,8 @@ module Select = { let selection_sides_is = (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( - piece_is(projectors, ListUtil.hd_opt(s.content)), - piece_is(projectors, ListUtil.last_opt(s.content)), + syntax_is(projectors, ListUtil.hd_opt(s.content)), + syntax_is(projectors, ListUtil.last_opt(s.content)), ); let shrink = @@ -124,6 +147,7 @@ module Select = { }; }; +/* See Select description above */ module Move = { let go = (d: Direction.t, z: ZipperBase.t): option(ZipperBase.t) => switch (d, neighbor_is(z.projectors, z.relatives.siblings)) { @@ -200,6 +224,10 @@ type proj_ret = { syntax_map: Id.Map.t(syntax), }; +/* Creates a projected version of the zipper for the view. + * This replaces all projected pieces of syntax with their + * corresponding placeholders. For convience, it also returns + * a map from projector/syntax ids to the corresponding syntax */ module Project = { let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); @@ -225,6 +253,7 @@ module Project = { }; }; +/* Updates the underlying piece of syntax for a projector */ module Syntax = { let update_piece = (f, id: Id.t, syntax: syntax) => id == Piece.id(syntax) ? f(syntax) : syntax; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 7c3cdcffca..6726e8470a 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -46,34 +46,31 @@ type shape = | Inline(int) | Block(Measured.Point.t); +/* The type of syntax which a projector can replace. + * Right now projectors can replace a single piece */ [@deriving (show({with_path: false}), sexp, yojson)] type syntax = Piece.t; -type action = +/* Global actions available to handlers in all projectors */ +type external_action = | Remove /* Remove projector entirely */ - | Focus(option(Util.Direction.t)) /* Pass focus to projector */ | Escape(Util.Direction.t) /* Pass focus to parent editor */ - | SetSyntax(syntax) /* Set underlying syntax */ - | SetModel(string); /* Set projector model */ + | SetSyntax(syntax); /* Set underlying syntax */ -type p_action = action; - -/* Externally calculated info to be fed to projectors */ +/* External info fed to all projectors. Eventually + * dynamic information will be added here. Projector + * position and dimensions in base editor could be + * added here if needed */ [@deriving (show({with_path: false}), sexp, yojson)] type info = { id: Id.t, syntax, - //status: option(status), ci: option(Info.t), }; -let info_init = (p: syntax) => { - id: Piece.id(p), - syntax: p, - //status: None, - ci: None, -}; +let info_init = (p: syntax) => {id: Piece.id(p), syntax: p, ci: None}; +/* To add a new projector, implement this module signature */ module type Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model; @@ -104,7 +101,7 @@ module type Projector = { model, ~info: info, ~go: action => Ui_effect.t(unit), - ~inject: p_action => Ui_effect.t(unit) + ~inject: external_action => Ui_effect.t(unit) ) => Node.t; /* Renders a DOM view for the projector, given the @@ -147,7 +144,7 @@ module type Cooked = { serialized_model, ~info: info, ~go: serialized_action => Ui_effect.t(unit), - ~inject: p_action => Ui_effect.t(unit) + ~inject: external_action => Ui_effect.t(unit) ) => Node.t; let placeholder: (serialized_model, info) => shape; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 7387f95e0c..003134be2b 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -43,15 +43,19 @@ type select = | Tile(rel) | Term(rel); +/* This type defines the top-level actions used to manage + * projectors,as distinguished from ProjectorBase.external_action, + * which defines the actions available internally to all projectors, + * and from each projector's own internal action type */ [@deriving (show({with_path: false}), sexp, yojson)] type project = - | SetSyntax(Id.t, Piece.t) - | SetModel(Id.t, string) - | SetIndicated(Projector.kind) - | ToggleIndicated(Projector.kind) - | Focus(Id.t, option(Util.Direction.t)) - | Escape(Id.t, Direction.t) - | Remove(Id.t); + | SetIndicated(Projector.kind) /* Project syntax at caret */ + | ToggleIndicated(Projector.kind) /* Un/Project syntax at caret */ + | Remove(Id.t) /* Remove projector at Id */ + | SetSyntax(Id.t, Piece.t) /* Set underlying syntax */ + | SetModel(Id.t, string) /* Set serialized projector model */ + | Focus(Id.t, option(Util.Direction.t)) /* Pass control to projector */ + | Escape(Id.t, Direction.t); /* Pass control to parent editor */ [@deriving (show({with_path: false}), sexp, yojson)] type agent = diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 12261a4010..da4efb16f5 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -25,7 +25,12 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); let view = - (_, ~info, ~go as _, ~inject: ProjectorBase.action => Ui_effect.t(unit)) => + ( + _, + ~info, + ~go as _, + ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + ) => Node.input( ~attrs= [ @@ -38,7 +43,7 @@ let view = (), ); -let keymap = (_, _, key: Key.t): option(ProjectorBase.action) => +let keymap = (_, _, key: Key.t): option(ProjectorBase.external_action) => switch (key) { | {key: D("Escape"), _} => Some(Remove) | _ => None diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 726ba89e63..f22f579a61 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -28,7 +28,7 @@ module M: Projector = { _, ~info, ~go as _, - ~inject: ProjectorBase.action => Ui_effect.t(unit), + ~inject: ProjectorBase.external_action => Ui_effect.t(unit), ) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 17dac069da..c6726feada 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -31,7 +31,7 @@ module M: Projector = { _, ~info, ~go as _, - ~inject: ProjectorBase.action => Ui_effect.t(unit), + ~inject: ProjectorBase.external_action => Ui_effect.t(unit), ) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 48acf8e1be..23b2969156 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -25,7 +25,7 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); -let put = (str: string): ProjectorBase.action => +let put = (str: string): ProjectorBase.external_action => SetSyntax(str |> Form.string_quote |> put); let is_last_pos = id => @@ -49,7 +49,11 @@ let key_handler = (id, ~inject, evt) => { }; let textarea = - (id, ~inject: ProjectorBase.action => Ui_effect.t(unit), text: string) => + ( + id, + ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + text: string, + ) => Node.textarea( ~attrs=[ Attr.id(of_id(id)), diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 43c1f6a8ee..63cc265dfe 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -122,11 +122,7 @@ let deco = let decos = decos @ [ - ProjectorView.view_all( - ~meta, - ~inject, - ~font_metrics=ui_state.font_metrics, - ), + ProjectorView.all(~meta, ~inject, ~font_metrics=ui_state.font_metrics), ]; let decos = switch (test_results) { diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 176ab79e30..0571416ba9 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -11,7 +11,7 @@ module Deco = (M: { let tile = id => Id.Map.find(id, M.meta.projected.tiles); - let base_caret = (z: Zipper.t): Node.t => { + let caret = (z: Zipper.t): Node.t => { let origin = Zipper.caret_point(M.meta.projected.measured, z); let shape = Zipper.caret_direction(z); let side = @@ -22,13 +22,6 @@ module Deco = (M: { CaretDec.view(~font_metrics, ~profile={side, origin, shape}); }; - let caret = (z: Zipper.t): Node.t => - /* Projectors can override adjacent carets */ - switch (ProjectorView.caret(z, M.meta)) { - | Some(_caret) => base_caret(z) //caret - | None => base_caret(z) - }; - type shard_data = (Measured.measurement, Nibs.shapes); let sel_shard_svg = diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index a7034441c9..c37f7e52bd 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -2,9 +2,13 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; open Projector; +open Util; open Util.OptUtil.Syntax; open Util.Web; +/* A friendly name for each projector. This is used + * both for identifying a projector in the CSS and for + * selecting projectors in the projector panel menu */ let name = (p: kind): string => switch (p) { | Fold => "fold" @@ -15,7 +19,9 @@ let name = (p: kind): string => | TextArea => "text" }; -/* Needs to be 1-to-1 for menu selection */ +/* This must be updated and kept 1-to-1 with the above + * name function in order to be able to select the + * projector in the projector panel menu */ let of_name = (p: string): kind => switch (p) { | "fold" => Fold @@ -27,6 +33,9 @@ let of_name = (p: string): kind => | _ => failwith("Unknown projector kind") }; +/* Projectors get a default backing decoration similar + * to token decorations. This can be made transparent + * in the CSS if no backing is wanted */ let backing_deco = ( ~font_metrics: FontMetrics.t, @@ -34,11 +43,13 @@ let backing_deco = ~shape: shape, ) => switch (shape) { - | Inline(_) => PieceDec.convex_shard(~font_metrics, ~measurement) + | Inline(_) | Block(_) => PieceDec.convex_shard(~font_metrics, ~measurement) }; -let cls = (indicated: option(list(string)), selected: bool, shape: shape) => +/* Adds attributes to a projector UI to support + * custom styling when selected or indicated */ +let status = (indicated: option(Direction.t), selected: bool, shape: shape) => (selected ? ["selected"] : []) @ ( switch (shape) { @@ -48,64 +59,66 @@ let cls = (indicated: option(list(string)), selected: bool, shape: shape) => ) @ ( switch (indicated) { - | Some(indicated) => indicated + | Some(d) => ["indicated", Direction.show(d)] | None => [] } ); +/* Wraps the view function for a projector, absolutely positioning + * relative to the syntax, adding a default backing decoration, and + * adding fallthrough handlers where appropriate*/ let view_wrapper = ( ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics: FontMetrics.t, ~measurement: Measured.measurement, ~info: info, - ~indication: option(list(string)), + ~indication: option(Direction.t), ~selected: bool, entry: Map.entry, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; let shape = Projector.shape(entry, info); + let focus = (id, _) => + Effect.( + Many([ + Stop_propagation, + inject(PerformAction(Project(Focus(id, None)))), + ]) + ); div( ~attrs=[ Attr.classes( - ["projector", name(entry.kind)] @ cls(indication, selected, shape), - ), - Attr.on_mousedown(_ => - Effect.( - Many([ - Stop_propagation, - inject(PerformAction(Project(Focus(info.id, None)))), - ]) - ) + ["projector", name(entry.kind)] + @ status(indication, selected, shape), ), + Attr.on_mousedown(focus(info.id)), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), ], [view, backing_deco(~font_metrics, ~measurement, ~shape)], ); }; -let handle = (id, action: ProjectorBase.action): Action.project => +/* Dispatches projector external actions to editor-level actions */ +let handle = (id, action: ProjectorBase.external_action): Action.project => switch (action) { | Remove => Remove(id) - | Focus(d) => Focus(id, d) | Escape(d) => Escape(id, d) | SetSyntax(f) => SetSyntax(id, f) - | SetModel(sexp) => SetModel(id, sexp) }; -let update_model = (action, {kind, model}: Map.entry): Map.entry => { - let (module P) = to_module(kind); - {kind, model: P.update(model, action)}; -}; - -let view_setup = +/* Extracts projector-instance-specific metadata necessary to + * render the view, instantiates appropriate action handlers, + * renders the view, and then wraps it so as to position it + * correctly with respect to the underyling editor */ +let setup_view = ( id: Id.t, ~meta: Editor.Meta.t, ~inject: UpdateAction.t => Ui_effect.t(unit), ~font_metrics, - ~indication: option(list(string)), + ~indication: option(Direction.t), ) : option(Node.t) => { let* p = Projector.Map.find(id, meta.projected.z.projectors); @@ -115,7 +128,8 @@ let view_setup = let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); - let go = a => inject_proj(SetModel(P.update(p.model, a))); + let go = a => + inject(PerformAction(Project(SetModel(id, P.update(p.model, a))))); view_wrapper( ~inject, ~font_metrics, @@ -128,35 +142,6 @@ let view_setup = ); }; -let indication = (z: ZipperBase.t) => - switch (Indicated.piece(z)) { - | Some((p, Left, _)) => Some((Piece.id(p), ["indicated", "left"])) - | Some((p, Right, _)) => Some((Piece.id(p), ["indicated", "right"])) - | None => None - }; - -let view_all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => - div_c( - "projectors", - List.filter_map( - ((id, _)) => { - view_setup( - id, - ~meta, - ~inject, - ~font_metrics, - ~indication= - switch (indication(meta.projected.z)) { - | Some((ind_id, indication)) when ind_id == id => - Some(indication) - | _ => None - }, - ) - }, - Id.Map.bindings(meta.projected.z.projectors) |> List.rev, - ), - ); - let indicated_proj_z = (z: Zipper.t) => { let* id = Indicated.index(z); let+ projector = Projector.Map.find(id, z.projectors); @@ -164,41 +149,36 @@ let indicated_proj_z = (z: Zipper.t) => { }; let indicated_proj_ed = (editor: Editor.t) => - //TODO(andrew): In future use z_proj instead of zipper? indicated_proj_z(editor.state.zipper); -let kind = (editor: Editor.t) => { - let+ (_, p) = indicated_proj_ed(editor); - p.kind; -}; - -let shape = (z: Zipper.t, syntax): option(shape) => { - let+ (_, p) = indicated_proj_z(z); - Projector.shape(p, syntax); -}; - -let id = (editor: Editor.t) => { - switch (indicated_proj_ed(editor)) { - | Some((id, _)) => id - | None => Id.invalid +let indication = (z, id) => + switch (Indicated.piece(z)) { + | Some((p, d, _)) when Piece.id(p) == id => Some(Direction.toggle(d)) + | _ => None }; -}; -let shape_from_map = (z, meta: Editor.Meta.t): option(shape) => { - let* id = Indicated.index(z); - let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); - let ci = Id.Map.find_opt(id, meta.statics.info_map); - let info = {id, syntax, ci}; - shape(z, info); -}; - -let caret = (z: Zipper.t, meta: Editor.Meta.t): option(Node.t) => - switch (shape_from_map(z, meta)) { - | None => None - | Some(Inline(_)) => None - | Some(Block(_)) => Some(div([])) - }; +/* Returns a div containing all projector UIs, intended to + * be absolutely positioned atop a rendered editor UI */ +let all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => + div_c( + "projectors", + List.filter_map( + ((id, _)) => { + let indication = indication(meta.projected.z, id); + setup_view(id, ~meta, ~inject, ~font_metrics, ~indication); + }, + Id.Map.bindings(meta.projected.z.projectors) |> List.rev, + ), + ); +/* When the caret is directly adjacent to a projector, keyboard commands + * can be overidden here. Right now, trying to move into the projector, + * that is, pressing left when it's to the right or vice-versa, without + * holding down a modifier, will give the projector focus (if its can_focus) + * flag is set. Be conservative about these kind of overloads; you need + * to consider how they interact with all the editor keyboard commands. + * For example, without the modifiers check, this would break selection + * around a projector. */ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => switch (indicated_proj_ed(editor)) { | None => None @@ -216,6 +196,7 @@ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => }; }; +/* The projector selection panel on the right of the bottom bar */ module Panel = { let option_view = (name, n) => option( @@ -223,6 +204,9 @@ module Panel = { [text(n)], ); + /* Decide which projectors are applicable based on the cursor info. + * This is slightly inside-out as elsewhere it depends on the underlying + * syntax, which is not easily available here */ let applicable_projectors = (ci: Info.t): list(Projector.kind) => ( switch (Info.cls_of(ci)) { @@ -237,7 +221,7 @@ module Panel = { | _ => [] } ) - @ [(Fold: Projector.kind)] + @ [Fold] @ ( switch (ci) { | InfoExp(_) @@ -274,6 +258,18 @@ module Panel = { ], ); + let kind = (editor: Editor.t) => { + let+ (_, p) = indicated_proj_ed(editor); + p.kind; + }; + + let id = (editor: Editor.t) => { + switch (indicated_proj_ed(editor)) { + | Some((id, _)) => id + | None => Id.invalid + }; + }; + let currently_selected = editor => option_view( switch (kind(editor)) { From df47cbb0ee9387a547a78ce701fa0c9b1ef4d875 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 20:07:36 -0400 Subject: [PATCH 126/168] projectors cleanup --- src/haz3lcore/zipper/Editor.re | 3 ++ src/haz3lcore/zipper/Projector.re | 8 ++++ .../zipper/action/ProjectorPerform.re | 43 +++++++------------ src/haz3lweb/view/Deco.re | 2 +- src/haz3lweb/view/ProjectorView.re | 15 ++----- 5 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 3f48363b1c..1ee1ae7e1d 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -302,6 +302,9 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; }; +let indicated_projector = (editor: t) => + Projector.indicated(editor.state.zipper); + let map_projectors = (f: (Id.t, Projector.Map.entry) => Projector.Map.entry, ed: t) => update_z( diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ed09697ae6..e7b9718115 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -63,6 +63,14 @@ let create = (kind: kind, syntax: syntax): option(Map.entry) => { ? Some({kind, model: P.init}) : None; }; +/* Returns the projector at the caret, if any */ +let indicated = (z: ZipperBase.t) => { + open Util.OptUtil.Syntax; + let* id = Indicated.index(z); + let+ projector = Map.find(id, z.projectors); + (id, projector); +}; + /* Is a piece of syntax currently projected? */ let syntax_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => switch (syntax) { diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index b58dd59af8..d56a555e94 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -1,8 +1,9 @@ open Projector; +/* If the caret is inside the indicated piece, move it out + * NOTE: Might need to be updated to support pieces with more than 2 delims */ let move_out_of_piece = (d: Util.Direction.t, rel: Indicated.relation, z: Zipper.t): Zipper.t => - /* NOTE: Might not work for pieces with more than 2 delims */ switch (rel) { | Sibling => {...z, caret: Outer} | Parent => @@ -29,14 +30,6 @@ let add_or_remove = (id: Id.t, z: Zipper.t, p, piece, d, rel) => | true => Ok(set(id, None, z)) }; -//TODO(andrew): dupe, rm -let indicated_proj_z = (z: Zipper.t) => { - open Util.OptUtil.Syntax; - let* id = Indicated.index(z); - let+ projector = Projector.Map.find(id, z.projectors); - (id, projector); -}; - let go = ( jump_to_id, @@ -46,14 +39,20 @@ let go = z: Zipper.t, ) : result(ZipperBase.t, Action.Failure.t) => { + let jump = (z, id) => + switch (jump_to_id(z, id)) { + | Some(z) => z + | None => z + }; + let switch_side = z => + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + }; switch (a) { | Focus(id, d) => - let z = - switch (jump_to_id(z, id)) { - | Some(z) => z - | None => z - }; - switch (indicated_proj_z(z)) { + let z = jump(z, id); + switch (Projector.indicated(z)) { | Some((_, p)) => let (module P) = to_module(p.kind); P.focus((id, d)); @@ -61,20 +60,10 @@ let go = | None => Error(Cant_project) }; | Escape(id, d) => - let z = - switch (jump_to_id(z, id)) { - | Some(z) => z - | None => z - }; + let z = jump(z, id); switch (d) { | Left => Ok(z) - | Right => - let z = - switch (primary(ByToken, Right, z)) { - | Some(z) => z - | None => z - }; - Ok(z); + | Right => Ok(switch_side(z)) }; | SetIndicated(p) => switch (Indicated.for_index(z)) { diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 0571416ba9..b27cc4e9ef 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -373,7 +373,7 @@ module Deco = (M: { }; let indication = (z: Zipper.t) => - switch (ProjectorView.indicated_proj_z(z)) { + switch (Projector.indicated(z)) { | Some(_) => Node.div([]) /* projector indication handled internally */ | None => div_c("indication", indicated_piece_deco(z)) }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index c37f7e52bd..ffdbc6eae8 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -142,15 +142,6 @@ let setup_view = ); }; -let indicated_proj_z = (z: Zipper.t) => { - let* id = Indicated.index(z); - let+ projector = Projector.Map.find(id, z.projectors); - (id, projector); -}; - -let indicated_proj_ed = (editor: Editor.t) => - indicated_proj_z(editor.state.zipper); - let indication = (z, id) => switch (Indicated.piece(z)) { | Some((p, d, _)) when Piece.id(p) == id => Some(Direction.toggle(d)) @@ -180,7 +171,7 @@ let all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => * For example, without the modifiers check, this would break selection * around a projector. */ let key_handoff = (editor: Editor.t, key: Key.t): option(Action.project) => - switch (indicated_proj_ed(editor)) { + switch (Editor.indicated_projector(editor)) { | None => None | Some((id, p)) => let* (_, d, _) = Indicated.piece(editor.state.zipper); @@ -259,12 +250,12 @@ module Panel = { ); let kind = (editor: Editor.t) => { - let+ (_, p) = indicated_proj_ed(editor); + let+ (_, p) = Editor.indicated_projector(editor); p.kind; }; let id = (editor: Editor.t) => { - switch (indicated_proj_ed(editor)) { + switch (Editor.indicated_projector(editor)) { | Some((id, _)) => id | None => Id.invalid }; From f28581b9c6e4e78aea07a5dc82cc04573ebca6e0 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 22 Jul 2024 20:16:50 -0400 Subject: [PATCH 127/168] rename projectors callbacks --- src/haz3lcore/zipper/ProjectorBase.re | 23 ++++++++------ .../zipper/action/ProjectorPerform.re | 30 +++++++++---------- .../zipper/projectors/CheckboxCore.re | 6 ++-- src/haz3lcore/zipper/projectors/FoldCore.re | 4 +-- src/haz3lcore/zipper/projectors/InfoCore.re | 4 +-- src/haz3lcore/zipper/projectors/SliderCore.re | 6 ++-- .../zipper/projectors/SliderFCore.re | 6 ++-- .../zipper/projectors/TextAreaCore.re | 16 +++++----- src/haz3lweb/view/ProjectorView.re | 6 ++-- 9 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 6726e8470a..49d4a68737 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -100,15 +100,15 @@ module type Projector = { ( model, ~info: info, - ~go: action => Ui_effect.t(unit), - ~inject: external_action => Ui_effect.t(unit) + ~local: action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) ) => Node.t; /* Renders a DOM view for the projector, given the * model, an info packet (see info type for details), - * and has two callbacks: inject calls global projector - * actions (see action type above), and go calls this - * projector's local update function. */ + * and has two callbacks: ~parent for parent editor + * actions(see external_action type above), and ~local + * for this projector's local update function. */ let placeholder: (model, info) => shape; /* How much space should be left in the code view for * this projector? This determines how the base code @@ -143,8 +143,8 @@ module type Cooked = { ( serialized_model, ~info: info, - ~go: serialized_action => Ui_effect.t(unit), - ~inject: external_action => Ui_effect.t(unit) + ~local: serialized_action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) ) => Node.t; let placeholder: (serialized_model, info) => shape; @@ -160,8 +160,13 @@ module Cook = (C: Projector) : Cooked => { let init = C.init |> serialize_m; let can_project = C.can_project; let can_focus = C.can_focus; - let view = (m, ~info, ~go, ~inject) => - C.view(deserialize_m(m), ~info, ~go=a => go(serialize_a(a)), ~inject); + let view = (m, ~info, ~local, ~parent) => + C.view( + deserialize_m(m), + ~info, + ~local=a => local(serialize_a(a)), + ~parent, + ); let placeholder = m => m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; let update = (m, a) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index d56a555e94..f00853efe9 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -50,21 +50,6 @@ let go = | None => z }; switch (a) { - | Focus(id, d) => - let z = jump(z, id); - switch (Projector.indicated(z)) { - | Some((_, p)) => - let (module P) = to_module(p.kind); - P.focus((id, d)); - Ok(z); - | None => Error(Cant_project) - }; - | Escape(id, d) => - let z = jump(z, id); - switch (d) { - | Left => Ok(z) - | Right => Ok(switch_side(z)) - }; | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Cant_project) @@ -85,5 +70,20 @@ let go = | SetModel(id, model) => let update = entry => Option.map(e => Map.{model, kind: e.kind}, entry); Ok({...z, projectors: Map.update(id, update, z.projectors)}); + | Focus(id, d) => + let z = jump(z, id); + switch (Projector.indicated(z)) { + | Some((_, p)) => + let (module P) = to_module(p.kind); + P.focus((id, d)); + Ok(z); + | None => Error(Cant_project) + }; + | Escape(id, d) => + let z = jump(z, id); + switch (d) { + | Left => Ok(z) + | Right => Ok(switch_side(z)) + }; }; }; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index da4efb16f5..0eef999ffb 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -28,15 +28,15 @@ let view = ( _, ~info, - ~go as _, - ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + ~local as _, + ~parent: ProjectorBase.external_action => Ui_effect.t(unit), ) => Node.input( ~attrs= [ Attr.create("type", "checkbox"), Attr.on_input((_, _) => - inject(SetSyntax(put(!get(info.syntax)))) + parent(SetSyntax(put(!get(info.syntax)))) ), ] @ (get(info.syntax) ? [Attr.checked] : []), diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index f4fe6250d4..b21ab12721 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -13,9 +13,9 @@ module M: Projector = { let can_focus = false; let placeholder = (_, _) => Inline(2); let update = (_, _) => (); - let view = (_, ~info as _, ~go as _, ~inject) => + let view = (_, ~info as _, ~local as _, ~parent) => div( - ~attrs=[Attr.on_double_click(_ => inject(Remove))], + ~attrs=[Attr.on_double_click(_ => parent(Remove))], [text("⋱")], ); let focus = _ => (); diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 67fac38ad5..9195c6c974 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -76,11 +76,11 @@ module M: Projector = { | (ToggleDisplay, Self) => Expected }; - let view = (model, ~info: ProjectorBase.info, ~go, ~inject as _) => + let view = (model, ~info: ProjectorBase.info, ~local, ~parent as _) => div( ~attrs=[ Attr.class_("info"), - Attr.on_mousedown(_ => go(ToggleDisplay)), + Attr.on_mousedown(_ => local(ToggleDisplay)), ], [ text("⋱ " ++ display_mode(model, info.ci) ++ " "), diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index f22f579a61..70d462705b 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -27,11 +27,11 @@ module M: Projector = { ( _, ~info, - ~go as _, - ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + ~local as _, + ~parent: ProjectorBase.external_action => Ui_effect.t(unit), ) => Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], + ~attrs=[Attr.on_input((_, v) => parent(SetSyntax(put(v))))], get(info.syntax), ); let focus = _ => (); diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index c6726feada..220275a544 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -30,11 +30,11 @@ module M: Projector = { ( _, ~info, - ~go as _, - ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + ~local as _, + ~parent: ProjectorBase.external_action => Ui_effect.t(unit), ) => Util.Web.range( - ~attrs=[Attr.on_input((_, v) => inject(SetSyntax(put(v))))], + ~attrs=[Attr.on_input((_, v) => parent(SetSyntax(put(v))))], get(info.syntax) |> Printf.sprintf("%.2f"), ); let focus = _ => (); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 23b2969156..7859243339 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -33,17 +33,17 @@ let is_last_pos = id => let is_first_pos = id => JsUtil.TextArea.caret_at_start(JsUtil.TextArea.get(of_id(id))); -let key_handler = (id, ~inject, evt) => { +let key_handler = (id, ~parent, evt) => { open Effect; let key = Key.mk(KeyDown, evt); switch (key.key) { | D("ArrowRight" | "ArrowDown") when is_last_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; - Many([inject(Escape(Right)), Stop_propagation]); + Many([parent(Escape(Right)), Stop_propagation]); | D("ArrowLeft" | "ArrowUp") when is_first_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; - Many([inject(Escape(Left)), Stop_propagation]); + Many([parent(Escape(Left)), Stop_propagation]); | _ => Stop_propagation }; }; @@ -51,15 +51,15 @@ let key_handler = (id, ~inject, evt) => { let textarea = ( id, - ~inject: ProjectorBase.external_action => Ui_effect.t(unit), + ~parent: ProjectorBase.external_action => Ui_effect.t(unit), text: string, ) => Node.textarea( ~attrs=[ Attr.id(of_id(id)), - Attr.on_keydown(key_handler(id, ~inject)), + Attr.on_keydown(key_handler(id, ~parent)), Attr.on_input((_, new_text) => - Effect.(Many([inject(put(new_text))])) + Effect.(Many([parent(put(new_text))])) ), /* Note: adding these handlers below because * currently these are handled on page level. @@ -71,14 +71,14 @@ let textarea = [Node.text(text)], ); -let view = (_, ~info, ~go as _, ~inject) => { +let view = (_, ~info, ~local as _, ~parent) => { let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[Attr.classes(["wrapper"])], [ Node.div( ~attrs=[Attr.classes(["cols"])], - [Node.text("·")] @ [textarea(info.id, ~inject, text)], + [Node.text("·")] @ [textarea(info.id, ~parent, text)], ), ], ); diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index ffdbc6eae8..3622f4bef2 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -127,8 +127,8 @@ let setup_view = let info = {id, ci, syntax}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); - let inject_proj = a => inject(PerformAction(Project(handle(id, a)))); - let go = a => + let parent = a => inject(PerformAction(Project(handle(id, a)))); + let local = a => inject(PerformAction(Project(SetModel(id, P.update(p.model, a))))); view_wrapper( ~inject, @@ -138,7 +138,7 @@ let setup_view = ~info, ~selected=List.mem(id, meta.selection_ids), p, - P.view(p.model, ~info, ~go, ~inject=inject_proj), + P.view(p.model, ~info, ~local, ~parent), ); }; From 90dad4329a551b260d1ad1dd807de054e6d59ae4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 23 Jul 2024 01:36:41 -0400 Subject: [PATCH 128/168] rm unused --- src/haz3lcore/zipper/Editor.re | 7 ------- src/haz3lweb/Editors.re | 4 ---- 2 files changed, 11 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 1ee1ae7e1d..56afe443ee 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -304,10 +304,3 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { let indicated_projector = (editor: t) => Projector.indicated(editor.state.zipper); - -let map_projectors = - (f: (Id.t, Projector.Map.entry) => Projector.Map.entry, ed: t) => - update_z( - z => {...z, projectors: Projector.Map.mapi(f, z.projectors)}, - ed, - ); diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index d0a960905d..054ae22b89 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -65,10 +65,6 @@ let perform_action = let update_current_editor_statics = settings => update(Editor.update_statics(~settings)); -let map_projectors = - (editors: t, f: (Id.t, Projector.Map.entry) => Projector.Map.entry): t => - editors |> get_editor |> Editor.map_projectors(f) |> put_editor(_, editors); - let get_ctx_init = (~settings as _: Settings.t, editors: t): Ctx.t => switch (editors) { | Scratch(_) From 3a5311dd33d6b3fee64d240cf23ba6d9bfa2bf30 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 23 Jul 2024 22:57:15 -0400 Subject: [PATCH 129/168] created new piece type called projector. moved over supporting projector infra from ProjectorBase and Projector. compiling, haven't hooked it up yet --- src/haz3lcore/Measured.re | 104 ++++++++---------- src/haz3lcore/statics/MakeTerm.re | 7 ++ src/haz3lcore/tiles/Base.re | 16 +++ src/haz3lcore/tiles/Piece.re | 38 +++++-- src/haz3lcore/tiles/Segment.re | 84 +++++++++----- src/haz3lcore/tiles/Skel.re | 2 + src/haz3lcore/zipper/IncompleteBidelim.re | 61 +++++----- src/haz3lcore/zipper/Printer.re | 3 +- src/haz3lcore/zipper/Projector.re | 1 + src/haz3lcore/zipper/ProjectorBase.re | 20 +--- src/haz3lcore/zipper/Zipper.re | 6 +- src/haz3lcore/zipper/action/Action.re | 2 +- src/haz3lcore/zipper/action/Indicated.re | 3 +- src/haz3lcore/zipper/action/Move.re | 30 +++-- .../zipper/projectors/CheckboxCore.re | 15 +-- src/haz3lcore/zipper/projectors/FoldCore.re | 2 +- src/haz3lcore/zipper/projectors/InfoCore.re | 6 +- src/haz3lcore/zipper/projectors/SliderCore.re | 9 +- .../zipper/projectors/SliderFCore.re | 9 +- .../zipper/projectors/TextAreaCore.re | 10 +- src/haz3lweb/view/BackpackView.re | 2 +- src/haz3lweb/view/Cell.re | 2 +- src/haz3lweb/view/Code.re | 11 ++ src/haz3lweb/view/Deco.re | 22 +++- src/haz3lweb/view/ProjectorView.re | 2 +- src/haz3lweb/view/dec/CaretDec.re | 2 +- src/haz3lweb/view/dec/DecUtil.re | 6 +- 27 files changed, 259 insertions(+), 216 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 07fa14e9f1..020750998e 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -1,44 +1,7 @@ open Util; +open Point; -[@deriving (show({with_path: false}), sexp, yojson)] -type row = int; -[@deriving (show({with_path: false}), sexp, yojson)] -type col = int; - -module Point = { - [@deriving (show({with_path: false}), sexp, yojson)] - type t = { - row, - col, - }; - let zero = {row: 0, col: 0}; - - let equals: (t, t) => bool = (p, q) => p.row == q.row && p.col == q.col; - - type comparison = - | Exact - | Under - | Over; - - let comp = (current, target): comparison => - switch () { - | _ when current == target => Exact - | _ when current < target => Under - | _ => Over - }; - let compare = (p1, p2) => - switch (comp(p1, p2)) { - | Exact => 0 - | Under => (-1) - | Over => 1 - }; - - let dcomp = (direction: Direction.t, a, b) => - switch (direction) { - | Right => comp(a, b) - | Left => comp(b, a) - }; -}; +module Point = Point; [@deriving (show({with_path: false}), sexp, yojson)] type measurement = { @@ -91,6 +54,7 @@ type t = { tiles: Id.Map.t(Shards.t), grout: Id.Map.t(measurement), secondary: Id.Map.t(measurement), + projectors: Id.Map.t(measurement), rows: Rows.t, linebreaks: Id.Map.t(rel_indent), }; @@ -99,6 +63,7 @@ let empty = { tiles: Id.Map.empty, grout: Id.Map.empty, secondary: Id.Map.empty, + projectors: Id.Map.empty, rows: Rows.empty, linebreaks: Id.Map.empty, }; @@ -139,12 +104,17 @@ let add_w = (w: Secondary.t, m, map) => { ...map, secondary: map.secondary |> Id.Map.add(w.id, m), }; +let add_pr = (p: Base.projector, m, map) => { + ...map, + projectors: map.projectors |> Id.Map.add(p.id, m), +}; let add_p = (p: Piece.t, m, map) => p |> Piece.get( w => add_w(w, m, map), g => add_g(g, m, map), t => add_t(t, m, map), + pr => add_pr(pr, m, map), ); let add_row = (row: int, shape: Rows.shape, map) => { @@ -152,6 +122,15 @@ let add_row = (row: int, shape: Rows.shape, map) => { rows: Rows.add(row, shape, map.rows), }; +let rec add_n_rows = (origin: Point.t, row_indent, n: abs_indent, map: t): t => + switch (n) { + | 0 => map + | _ => + map + |> add_n_rows(origin, row_indent, n - 1) + |> add_row(origin.row + n - 1, {indent: row_indent, max_col: origin.col}) + }; + let add_lb = (id, indent, map) => { ...map, linebreaks: Id.Map.add(id, indent, map.linebreaks), @@ -184,6 +163,10 @@ let find_g = (~msg="", g: Grout.t, map): measurement => try(Id.Map.find(g.id, map.grout)) { | _ => failwith("find_g: " ++ msg) }; +let find_pr = (~msg="", p: Base.projector, map): measurement => + try(Id.Map.find(p.id, map.projectors)) { + | _ => failwith("find_g: " ++ msg) + }; // returns the measurement spanning the whole tile let find_t = (t: Tile.t, map): measurement => { let shards = Id.Map.find(t.id, map.tiles); @@ -204,6 +187,7 @@ let find_p = (~msg="", p: Piece.t, map): measurement => w => find_w(w, map), g => find_g(g, map), t => find_t(t, map), + p => find_pr(p, map), ) ) { | _ => failwith("find_p: " ++ msg ++ "id: " ++ Id.to_string(p |> Piece.id)) @@ -265,6 +249,7 @@ let is_indented_map = (seg: Segment.t) => { ) | Secondary(_) | Grout(_) => (is_indented, map) + | Projector(_) => (is_indented, map) // TODO(andrew): ?? | Tile(t) => let is_indented = is_indented || post_tile_indent(t); let map = @@ -281,6 +266,13 @@ let is_indented_map = (seg: Segment.t) => { go(seg); }; +let last_of_token = (token: string, origin: Point.t): Point.t => + // Adjustment for multi-line tokens e.g. projector placeholders + Point.{ + col: origin.col + StringUtil.max_line_width(token), + row: origin.row + StringUtil.num_linebreaks(token), + }; + let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let is_indented = is_indented_map(seg); @@ -333,6 +325,11 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { ); (origin, map); | [hd, ...tl] => + let extra_rows = (token, origin, map) => { + let row_indent = container_indent + contained_indent; + let num_extra_rows = StringUtil.num_linebreaks(token); + add_n_rows(origin, row_indent, num_extra_rows, map); + }; let (contained_indent, origin, map) = switch (hd) { | Secondary(w) when Secondary.is_linebreak(w) => @@ -373,29 +370,18 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let last = {...origin, col: origin.col + 1}; let map = map |> add_g(g, {origin, last}); (contained_indent, last, map); + | Projector(p) => + let token = ProjMeta.placeholder_str(p); + let last = last_of_token(token, origin); + let map = extra_rows(token, origin, map); + let map = add_pr(p, {origin, last}, map); + (contained_indent, last, map); | Tile(t) => let add_shard = (origin, shard, map) => { let token = List.nth(t.label, shard); - // Adjustment for multi-line tokens e.g. projector placeholders - let last = - Point.{ - col: origin.col + StringUtil.max_line_width(token), - row: origin.row + StringUtil.num_linebreaks(token), - }; - let map = map |> add_s(t.id, shard, {origin, last}); - let row_indent = container_indent + contained_indent; - let rec add_n_rows = (n, map) => - switch (n) { - | 0 => map - | _ => - map - |> add_n_rows(n - 1) - |> add_row( - origin.row + n - 1, - {indent: row_indent, max_col: origin.col}, - ) - }; - let map = map |> add_n_rows(StringUtil.num_linebreaks(token)); + let map = extra_rows(token, origin, map); + let last = last_of_token(token, origin); + let map = add_s(t.id, shard, {origin, last}, map); (last, map); }; let (last, map) = diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index 2bd2868e91..c289889c92 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -19,6 +19,7 @@ let tokens = _ => [], _ => [" "], (t: Tile.t) => t.shards |> List.map(List.nth(t.label)), + _ => [] //TODO(andrew) ); [@deriving (show({with_path: false}), sexp, yojson)] @@ -470,6 +471,12 @@ and unsorted = (skel: Skel.t, seg: Segment.t): unsorted => { switch (p) { | Secondary(_) | Grout(_) => [] + | Projector(p) => + Aba.aba_triples(Aba.mk([0], [ProjMeta.seg_for_maketerm(p)])) + |> List.map(((_l, kid, _r)) => { + let s = Sort.Any; //TODO(andrew) + go_s(s, Segment.skel(kid), kid); + }) | Tile({mold, shards, children, _}) => Aba.aba_triples(Aba.mk(shards, children)) |> List.map(((l, kid, r)) => { diff --git a/src/haz3lcore/tiles/Base.re b/src/haz3lcore/tiles/Base.re index 768baa0a1c..339c81fca7 100644 --- a/src/haz3lcore/tiles/Base.re +++ b/src/haz3lcore/tiles/Base.re @@ -1,11 +1,21 @@ open Util; +[@deriving (show({with_path: false}), sexp, yojson)] +type kind = + | Fold + | Info + | Checkbox + | Slider + | SliderF + | TextArea; + [@deriving (show({with_path: false}), sexp, yojson)] type segment = list(piece) and piece = | Tile(tile) | Grout(Grout.t) | Secondary(Secondary.t) + | Projector(projector) and tile = { // invariants: // - length(mold.in_) + 1 == length(label) @@ -17,6 +27,12 @@ and tile = { mold: Mold.t, shards: list(int), children: list(segment), +} +and projector = { + id: Id.t, + kind, + syntax: piece, + model: string, }; // This is for comment insertion diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 6eebfaa5a8..ad5dee205d 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -8,20 +8,23 @@ let secondary = w => Secondary(w); let grout = g => Grout(g); let tile = t => Tile(t); -let get = (f_w, f_g, f_t, p: t) => +let get = (f_w, f_g, f_t: tile => _, f_p: projector => _, p: t) => switch (p) { | Secondary(w) => f_w(w) | Grout(g) => f_g(g) | Tile(t) => f_t(t) + | Projector(p) => f_p(p) }; -let id = get(Secondary.id, Grout.id, Tile.id); +let proj_id = projector => projector.id; +let id = get(Secondary.id, Grout.id, tile => tile.id, proj_id); let sort = get( _ => (Sort.Any, []), _ => (Sort.Any, []), t => (t.mold.out, t.mold.in_), + _ => (Sort.Any, []), ); let nibs = @@ -32,6 +35,10 @@ let nibs = Some(Nib.({shape: l, sort: Any}, {shape: r, sort: Any})); }, t => Some(Tile.nibs(t)), + p => { + let (l, r) = ProjNew.shapes(p); + Some(Nib.({shape: l, sort: Any}, {shape: r, sort: Any})); + }, ); let nib_sorts = @@ -42,9 +49,10 @@ let nib_sorts = let (l, r) = Tile.nibs(t); (l.sort, r.sort); }, + _ => (Sort.Any, Sort.Any), ); -let sorted_children = get(_ => [], _ => [], Tile.sorted_children); +let sorted_children = get(_ => [], _ => [], Tile.sorted_children, _ => []); let children = p => sorted_children(p) |> List.split |> snd; // let is_balanced = @@ -58,19 +66,22 @@ let pop_l = (p: t): (t, segment) => switch (p) { | Tile(t) => Tile.pop_l(t) | Grout(_) - | Secondary(_) => (p, []) + | Secondary(_) + | Projector(_) => (p, []) }; let pop_r = (p: t): (segment, t) => switch (p) { | Tile(t) => Tile.pop_r(t) | Grout(_) - | Secondary(_) => ([], p) + | Secondary(_) + | Projector(_) => ([], p) }; let disassemble = (p: t): segment => switch (p) { | Grout(_) - | Secondary(_) => [p] + | Secondary(_) + | Projector(_) => [p] | Tile(t) => Tile.disassemble(t) }; @@ -82,7 +93,12 @@ let disassemble = (p: t): segment => // }; let shapes = - get(_ => None, g => Some(Grout.shapes(g)), t => Some(Tile.shapes(t))); + get( + _ => None, + g => Some(Grout.shapes(g)), + t => Some(Tile.shapes(t)), + p => Some(ProjNew.shapes(p)), + ); let is_convex = (p: t): bool => switch (shapes(p)) { @@ -105,6 +121,11 @@ let is_tile: t => option(Tile.t) = | Tile(t) => Some(t) | _ => None; +let is_projector: t => option(projector) = + fun + | Projector(p) => Some(p) + | _ => None; + let label: t => option(Label.t) = fun | Tile({label, _}) => Some(label) @@ -128,6 +149,7 @@ let get_outside_sorts = (~default_sort=Sort.Any, p: t): list(Sort.t) => //TODO: David please review this switch (p) { | Secondary(_) => [] + | Projector(_) => [] | Grout({shape: Convex, _}) => [] | Grout({shape: Concave, _}) => [default_sort, default_sort] | Tile({shards: _, _} as t) when !Tile.is_complete(t) => @@ -150,6 +172,7 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Tile(t) => t.mold | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) + | Projector(p) => ProjNew.mold_of(p.kind, Any) }; let replace_id = (id: Id.t, p: t): t => @@ -157,6 +180,7 @@ let replace_id = (id: Id.t, p: t): t => | Tile(t) => Tile({...t, id}) | Grout(g) => Grout({...g, id}) | Secondary(w) => Secondary({...w, id}) + | Projector(p) => Projector({...p, id}) }; let mk_tile: (Form.t, list(list(t))) => t = diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index bf1acb79c9..7ccfde7497 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -73,6 +73,10 @@ let shape_affix = let (ws, wss) = ListUtil.split_first(wss); (([[w, ...ws], ...wss], gs), s, tl); | Grout(g) => (Aba.cons([], g, wgw), s, tl) + | Projector(p) => + let (l, _) = + ProjNew.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); + (empty_wgw, l, tl); | Tile(t) => let (l, _) = Tile.shapes(t) |> (d == Left ? TupleUtil.swap : Fun.id); (empty_wgw, l, tl); @@ -92,6 +96,9 @@ let rec convex = seg => { | Secondary(_) => shape | Grout(g) => Grout.fits_shape(g, s) ? Some(fst(Grout.shapes(g))) : None + | Projector(p) => + let (l, r) = ProjNew.shapes(p); + Nib.Shape.fits(r, s) ? Some(l) : None; | Tile(t) => let (l, r) = Tile.shapes(t); List.for_all(convex, t.children) && Nib.Shape.fits(r, s) @@ -164,7 +171,8 @@ and remold_typ = (shape, seg: t): t => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => [hd, ...remold_typ(shape, tl)] + | Grout(_) + | Projector(_) => [hd, ...remold_typ(shape, tl)] | Tile(t) => switch (remold_tile(Typ, shape, t)) { | None => [Tile(t), ...remold_typ(snd(Tile.shapes(t)), tl)] @@ -178,7 +186,8 @@ and remold_typ_uni = (shape, seg: t): (t, Nib.Shape.t, t) => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => + | Grout(_) + | Projector(_) => let (remolded, shape, rest) = remold_typ_uni(shape, tl); ([hd, ...remolded], shape, rest); | Tile(t) => @@ -207,7 +216,8 @@ and remold_pat_uni = (shape, seg: t): (t, Nib.Shape.t, t) => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => + | Grout(_) + | Projector(_) => let (remolded, shape, rest) = remold_pat_uni(shape, tl); ([hd, ...remolded], shape, rest); | Tile(t) => @@ -238,7 +248,8 @@ and remold_pat = (shape, seg: t): t => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => [hd, ...remold_pat(shape, tl)] + | Grout(_) + | Projector(_) => [hd, ...remold_pat(shape, tl)] | Tile(t) => switch (remold_tile(Pat, shape, t)) { | None => [Tile(t), ...remold_pat(snd(Tile.shapes(t)), tl)] @@ -258,7 +269,8 @@ and remold_tpat_uni = (shape, seg: t): (t, Nib.Shape.t, t) => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => + | Grout(_) + | Projector(_) => let (remolded, shape, rest) = remold_tpat_uni(shape, tl); ([hd, ...remolded], shape, rest); | Tile(t) => @@ -285,7 +297,8 @@ and remold_tpat = (shape, seg: t): t => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => [hd, ...remold_tpat(shape, tl)] + | Grout(_) + | Projector(_) => [hd, ...remold_tpat(shape, tl)] | Tile(t) => switch (remold_tile(TPat, shape, t)) { | None => [Tile(t), ...remold_tpat(snd(Tile.shapes(t)), tl)] @@ -305,7 +318,8 @@ and remold_exp_uni = (shape, seg: t): (t, Nib.Shape.t, t) => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => + | Grout(_) + | Projector(_) => let (remolded, shape, rest) = remold_exp_uni(shape, tl); ([hd, ...remolded], shape, rest); | Tile(t) => @@ -347,7 +361,8 @@ and remold_rul = (shape, seg: t): t => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => [hd, ...remold_rul(shape, tl)] + | Grout(_) + | Projector(_) => [hd, ...remold_rul(shape, tl)] | Tile(t) => switch (remold_tile(Rul, shape, t)) { | Some(t) => @@ -376,7 +391,8 @@ and remold_exp = (shape, seg: t): t => | [hd, ...tl] => switch (hd) { | Secondary(_) - | Grout(_) => [hd, ...remold_exp(shape, tl)] + | Grout(_) + | Projector(_) => [hd, ...remold_exp(shape, tl)] | Tile(t) => switch (remold_tile(Exp, shape, t)) { | None => [Tile(t), ...remold_exp(snd(Tile.shapes(t)), tl)] @@ -541,6 +557,12 @@ and regrout_affix = switch (p) { | Secondary(w) => (Trim.cons_w(w, trim), r, tl) | Grout(g) => (Trim.(merge(cons_g(g, trim))), r, tl) + | Projector(p) => + let p = Piece.Projector(p); + let (l', r') = + ProjNew.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); + let trim = Trim.regrout(d, (r', r), trim); + (Trim.empty, l', [p, ...Trim.to_seg(trim)] @ tl); | Tile(t) => let children = List.fold_right( @@ -669,25 +691,25 @@ let edge_shape_of = (d: Direction.t, ps: t): option(Nib.Shape.t) => { let edge_direction_of = (d: Direction.t, ps: t): option(Direction.t) => Option.map(Nib.Shape.absolute(d), edge_shape_of(d, ps)); -let rec serialize = (seg: t) => - seg - |> List.concat_map( - fun - | (Piece.Secondary(_) | Grout(_) | Tile({shards: [_], _})) as p => [ - p, - ] - | Tile(t) => { - let shards = - List.map( - Tile.to_piece, - Tile.split_shards(t.id, t.label, t.mold, t.shards), - ); - let children = List.map(serialize, t.children); - Aba.mk(shards, children) - |> Aba.join(s => [s], Fun.id) - |> List.concat; - }, - ); +// let rec serialize = (seg: t) => +// seg +// |> List.concat_map( +// fun +// | (Piece.Secondary(_) | Grout(_) | Tile({shards: [_], _}) | Projector(_)) as p => [ +// p, +// ] +// | Tile(t) => { +// let shards = +// List.map( +// Tile.to_piece, +// Tile.split_shards(t.id, t.label, t.mold, t.shards), +// ); +// let children = List.map(serialize, t.children); +// Aba.mk(shards, children) +// |> Aba.join(s => [s], Fun.id) +// |> List.concat; +// }, +// ); let sameline_secondary = List.for_all( @@ -728,7 +750,8 @@ let expected_sorts = (sort: Sort.t, seg: t): list((int, Sort.t)) => { let rec holes = (segment: t): list(Grout.t) => List.concat_map( fun - | Piece.Secondary(_) => [] + | Piece.Secondary(_) + | Projector(_) => [] | Tile(t) => List.concat_map(holes, t.children) | Grout(g) => [g], segment, @@ -772,5 +795,6 @@ and ids_of_piece = (p: Piece.t): list(Id.t) => switch (p) { | Tile(t) => [Piece.id(p), ...ids(List.concat(t.children))] | Grout(_) - | Secondary(_) => [Piece.id(p)] + | Secondary(_) + | Projector(_) => [Piece.id(p)] }; diff --git a/src/haz3lcore/tiles/Skel.re b/src/haz3lcore/tiles/Skel.re index baf0f05dcc..c93f644f77 100644 --- a/src/haz3lcore/tiles/Skel.re +++ b/src/haz3lcore/tiles/Skel.re @@ -78,6 +78,8 @@ let rel = (p1: Piece.t, p2: Piece.t): option(rel) => | Convex => Some(Lt) | Concave => Some(Gt) } + | (Projector(_), _) => Some(Gt) + | (_, Projector(_)) => Some(Lt) | (Tile(t1), Tile(t2)) => open Labels; let lbl1 = (==)(t1.label); diff --git a/src/haz3lcore/zipper/IncompleteBidelim.re b/src/haz3lcore/zipper/IncompleteBidelim.re index 1ffd1f16c2..8883d59533 100644 --- a/src/haz3lcore/zipper/IncompleteBidelim.re +++ b/src/haz3lcore/zipper/IncompleteBidelim.re @@ -1,32 +1,29 @@ -type t = Id.Map.t(list(int)); - -let t = ref(Id.Map.empty); - -let contains = (id, i): bool => - switch (Id.Map.find_opt(id, t^)) { - | None => false - | Some(is) => List.mem(i, is) - }; - -let clear = () => { - t := Id.Map.empty; -}; - -// assumes seg is fully assembled -let set = (seg: Base.segment): unit => - t := - seg - |> List.filter_map( - fun - | Piece.Tile(t) => { - let (l_shard, r_shard) = Tile.(l_shard(t), r_shard(t)); - let l = l_shard == 0 ? [] : [l_shard - 1]; - let r = r_shard == List.length(t.label) - 1 ? [] : [r_shard]; - let lr = l @ r; - lr == [] ? None : Some((t.id, l @ r)); - } - | Grout(_) - | Secondary(_) => None, - ) - |> List.to_seq - |> Id.Map.of_seq; +// type t = Id.Map.t(list(int)); + // let t = ref(Id.Map.empty); + // let contains = (id, i): bool => + // switch (Id.Map.find_opt(id, t^)) { + // | None => false + // | Some(is) => List.mem(i, is) + // }; + // let clear = () => { + // t := Id.Map.empty; + // }; + // // assumes seg is fully assembled + // let set = (seg: Base.segment): unit => + // t := + // seg + // |> List.filter_map( + // fun + // | Piece.Tile(t) => { + // let (l_shard, r_shard) = Tile.(l_shard(t), r_shard(t)); + // let l = l_shard == 0 ? [] : [l_shard - 1]; + // let r = r_shard == List.length(t.label) - 1 ? [] : [r_shard]; + // let lr = l @ r; + // lr == [] ? None : Some((t.id, l @ r)); + // } + // | Grout(_) + // | Secondary(_) + // | Projector(_) => None, + // ) + // |> List.to_seq + // |> Id.Map.of_seq; diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index c474199a0a..f3e9ebe324 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -20,6 +20,7 @@ and of_piece = (~holes, p: Piece.t): string => | Grout({shape: Convex, _}) => " " | Secondary(w) => Secondary.is_linebreak(w) ? "\n" : Secondary.get_string(w.content) + | Projector(_) => "" } and of_tile = (~holes, t: Tile.t): string => Aba.mk(t.shards, t.children) @@ -39,7 +40,7 @@ let to_rows = ( ~holes: option(string), ~measured: Measured.t, - ~caret: option(Measured.Point.t), + ~caret: option(Point.t), ~indent: string, ~segment: Segment.t, ) diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index e7b9718115..2fbc838392 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -181,6 +181,7 @@ module MapPiece = { switch (piece) { | Tile(t) => Tile(of_tile(f, t)) | Grout(_) + | Projector(_) | Secondary(_) => piece }; } diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 49d4a68737..92feec00ea 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -42,33 +42,25 @@ module Map = { * display with given length & height. Both of these can * depend on the projector model and info package */ [@deriving (show({with_path: false}), sexp, yojson)] -type shape = - | Inline(int) - | Block(Measured.Point.t); +type shape = ProjNew.shape; /* The type of syntax which a projector can replace. * Right now projectors can replace a single piece */ [@deriving (show({with_path: false}), sexp, yojson)] -type syntax = Piece.t; +type syntax = ProjNew.syntax; /* Global actions available to handlers in all projectors */ -type external_action = - | Remove /* Remove projector entirely */ - | Escape(Util.Direction.t) /* Pass focus to parent editor */ - | SetSyntax(syntax); /* Set underlying syntax */ +type external_action = ProjNew.external_action; /* External info fed to all projectors. Eventually * dynamic information will be added here. Projector * position and dimensions in base editor could be * added here if needed */ [@deriving (show({with_path: false}), sexp, yojson)] -type info = { - id: Id.t, - syntax, - ci: option(Info.t), -}; +type info = ProjNew.info; -let info_init = (p: syntax) => {id: Piece.id(p), syntax: p, ci: None}; +let info_init = (p: syntax) => + ProjNew.{id: Piece.id(p), syntax: p, ci: None}; /* To add a new projector, implement this module signature */ module type Projector = { diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 3ccef45ddb..eae6718da1 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -307,7 +307,7 @@ let caret_direction = (z: t): option(Direction.t) => let measured = z => z |> unselect_and_zip |> Measured.of_segment; -let base_point = (measured: Measured.t, z: t): Measured.Point.t => { +let base_point = (measured: Measured.t, z: t): Point.t => { switch (representative_piece(z)) { | Some((p, d)) => /* NOTE: Below conversion necessary because sometimes @@ -350,8 +350,8 @@ let base_point = (measured: Measured.t, z: t): Measured.Point.t => { | None => {row: 0, col: 0} }; }; -let caret_point = (measured, z: t): Measured.Point.t => { - let Measured.Point.{row, col} = base_point(measured, z); +let caret_point = (measured, z: t): Point.t => { + let Point.{row, col} = base_point(measured, z); {row, col: col + Caret.offset(z.caret)}; }; diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 003134be2b..dc8f835999 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -16,7 +16,7 @@ let of_piece_goal = [@deriving (show({with_path: false}), sexp, yojson)] type goal = - | Point(Measured.Point.t) + | Point(Point.t) | Piece(piece_goal, Direction.t); [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index a8039c007a..5af5fd3f2e 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -72,7 +72,8 @@ let shard_index = (z: ZipperBase.t): option(int) => | Sibling => switch (p) { | Secondary(_) - | Grout(_) => Some(0) + | Grout(_) + | Projector(_) => Some(0) | Tile(t) => switch (side) { | Left => Some(List.length(t.children)) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 65af376bc8..52f5fd7971 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -43,7 +43,7 @@ let neighbor_movability = Unicode.length(content_string) - 1, Unicode.length(content_string) - 2, ); - | Some(Secondary(_) | Grout(_)) => CanPass + | Some(Secondary(_) | Grout(_) | Projector(_)) => CanPass | None => supernhbr_l }; let r = @@ -53,7 +53,7 @@ let neighbor_movability = // Comments are always length >= 2 let content_string = Secondary.get_string(w.content); CanEnter(0, Unicode.length(content_string) - 2); - | Some(Secondary(_) | Grout(_)) => CanPass + | Some(Secondary(_) | Grout(_) | Projector(_)) => CanPass | None => supernhbr_r }; (l, r); @@ -96,33 +96,32 @@ module Make = (M: Editor.Meta.S) => { }; let is_at_side_of_row = (d: Direction.t, z: Zipper.t) => { - let Measured.Point.{row, col} = caret_point(z); + let Point.{row, col} = caret_point(z); switch (Zipper.move(d, z)) { | None => true | Some(z) => - let Measured.Point.{row: rowp, col: colp} = caret_point(z); + let Point.{row: rowp, col: colp} = caret_point(z); row != rowp || col == colp; }; }; - let direction_to_from = - (p1: Measured.Point.t, p2: Measured.Point.t): Direction.t => { + let direction_to_from = (p1: Point.t, p2: Point.t): Direction.t => { let before_row = p1.row < p2.row; let at_row = p1.row == p2.row; let before_col = p1.col < p2.col; before_row || at_row && before_col ? Left : Right; }; - let closer_to_prev = (curr, prev, goal: Measured.Point.t) => + let closer_to_prev = (curr, prev, goal: Point.t) => /* Default to true if equal */ abs(caret_point(prev).col - goal.col) < abs(caret_point(curr).col - goal.col); let do_towards = ( - ~anchor: option(Measured.Point.t)=?, + ~anchor: option(Point.t)=?, f: (Direction.t, t) => option(t), - goal: Measured.Point.t, + goal: Point.t, z: t, ) : option(t) => { @@ -130,8 +129,8 @@ module Make = (M: Editor.Meta.S) => { let d_to_goal = direction_to_from(goal, init); let rec go = (prev: t, curr: t) => { let curr_p = caret_point(curr); - let x_progress = Measured.Point.dcomp(d_to_goal, curr_p.col, goal.col); - let y_progress = Measured.Point.dcomp(d_to_goal, curr_p.row, goal.row); + let x_progress = Point.dcomp(d_to_goal, curr_p.col, goal.col); + let y_progress = Point.dcomp(d_to_goal, curr_p.row, goal.row); switch (y_progress, x_progress) { /* If we're not there yet, keep going */ | (Under, Over | Exact | Under) @@ -171,7 +170,7 @@ module Make = (M: Editor.Meta.S) => { }; }; let res = go(z, z); - Measured.Point.equals(caret_point(res), init) ? None : Some(res); + Point.equals(caret_point(res), init) ? None : Some(res); }; let do_vertical = (f: (Direction.t, t) => option(t), d: Direction.t, z: t): option(t) => { @@ -180,17 +179,14 @@ module Make = (M: Editor.Meta.S) => { caret position to a target derived from the initial position */ let cur_p = caret_point(z); let goal = - Measured.Point.{ - col: M.col_target, - row: cur_p.row + (d == Right ? 1 : (-1)), - }; + Point.{col: M.col_target, row: cur_p.row + (d == Right ? 1 : (-1))}; do_towards(f, goal, z); }; let do_extreme = (f: (Direction.t, t) => option(t), d: planar, z: t): option(t) => { let cur_p = caret_point(z); - let goal: Measured.Point.t = + let goal: Point.t = switch (d) { | Right(_) => {col: Int.max_int, row: cur_p.row} | Left(_) => {col: 0, row: cur_p.row} diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 0eef999ffb..87f4600eaf 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -1,5 +1,5 @@ open Util; -open ProjectorBase; +open ProjNew; open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => @@ -25,12 +25,7 @@ let put = (bool: bool): Piece.t => bool |> string_of_bool |> mk_mono(Exp); let toggle = (piece: Piece.t) => put(!get(piece)); let view = - ( - _, - ~info, - ~local as _, - ~parent: ProjectorBase.external_action => Ui_effect.t(unit), - ) => + (_, ~info, ~local as _, ~parent: external_action => Ui_effect.t(unit)) => Node.input( ~attrs= [ @@ -43,12 +38,6 @@ let view = (), ); -let keymap = (_, _, key: Key.t): option(ProjectorBase.external_action) => - switch (key) { - | {key: D("Escape"), _} => Some(Remove) - | _ => None - }; - module M: Projector = { [@deriving (show({with_path: false}), sexp, yojson)] type model = unit; diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index b21ab12721..5df105e410 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,5 +1,5 @@ open Util; -open ProjectorBase; +open ProjNew; open Virtual_dom.Vdom; open Node; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 9195c6c974..03365f44cb 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -1,6 +1,6 @@ open Virtual_dom.Vdom; open Node; -open ProjectorBase; +open ProjNew; let mode = (info: option(Info.t)): option(Mode.t) => switch (info) { @@ -67,7 +67,7 @@ module M: Projector = { let display = (model, info) => display_ty(model, info) |> totalize_ty |> Typ.pretty_print; - let placeholder = (model, info: ProjectorBase.info) => + let placeholder = (model, info) => Inline((display(model, info.ci) |> String.length) + 5); let update = (model, a: action) => @@ -76,7 +76,7 @@ module M: Projector = { | (ToggleDisplay, Self) => Expected }; - let view = (model, ~info: ProjectorBase.info, ~local, ~parent as _) => + let view = (model, ~info, ~local, ~parent as _) => div( ~attrs=[ Attr.class_("info"), diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index 70d462705b..fc74f325c0 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjectorBase; +open ProjNew; let put: string => Piece.t = Piece.mk_mono(Exp); @@ -24,12 +24,7 @@ module M: Projector = { let placeholder = (_, _) => Inline(10); let update = (model, _) => model; let view = - ( - _, - ~info, - ~local as _, - ~parent: ProjectorBase.external_action => Ui_effect.t(unit), - ) => + (_, ~info, ~local as _, ~parent: external_action => Ui_effect.t(unit)) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => parent(SetSyntax(put(v))))], get(info.syntax), diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 220275a544..91c3864092 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjectorBase; +open ProjNew; /* Some decimal places necessary to avoid becoming an int */ let float_of_float = s => s |> float_of_string |> Printf.sprintf("%.2f"); @@ -27,12 +27,7 @@ module M: Projector = { let placeholder = (_, _) => Inline(10); let update = (model, _) => model; let view = - ( - _, - ~info, - ~local as _, - ~parent: ProjectorBase.external_action => Ui_effect.t(unit), - ) => + (_, ~info, ~local as _, ~parent: external_action => Ui_effect.t(unit)) => Util.Web.range( ~attrs=[Attr.on_input((_, v) => parent(SetSyntax(put(v))))], get(info.syntax) |> Printf.sprintf("%.2f"), diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index 7859243339..e735fd54e2 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjectorBase; +open ProjNew; let of_id = (id: Id.t) => "id" ++ (id |> Id.to_string |> String.sub(_, 0, 8)); @@ -25,7 +25,7 @@ let get = (piece: Piece.t): string => let put = (s: string): Piece.t => s |> mk_mono(Exp); -let put = (str: string): ProjectorBase.external_action => +let put = (str: string): external_action => SetSyntax(str |> Form.string_quote |> put); let is_last_pos = id => @@ -49,11 +49,7 @@ let key_handler = (id, ~parent, evt) => { }; let textarea = - ( - id, - ~parent: ProjectorBase.external_action => Ui_effect.t(unit), - text: string, - ) => + (id, ~parent: external_action => Ui_effect.t(unit), text: string) => Node.textarea( ~attrs=[ Attr.id(of_id(id)), diff --git a/src/haz3lweb/view/BackpackView.re b/src/haz3lweb/view/BackpackView.re index 42c6e6e683..c0400d9cd0 100644 --- a/src/haz3lweb/view/BackpackView.re +++ b/src/haz3lweb/view/BackpackView.re @@ -38,7 +38,7 @@ let backpack_sel_view = let view = ( ~font_metrics: FontMetrics.t, - ~origin: Measured.Point.t, + ~origin: Point.t, {backpack, _} as z: Zipper.t, ) : Node.t => { diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 63cc265dfe..ccc0bae3c2 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -6,7 +6,7 @@ let get_goal = (~font_metrics: FontMetrics.t, ~target_id, e) => { let rect = JsUtil.get_elem_by_id(target_id)##getBoundingClientRect; let goal_x = float_of_int(e##.clientX); let goal_y = float_of_int(e##.clientY); - Measured.Point.{ + Point.{ row: Float.to_int((goal_y -. rect##.top) /. font_metrics.row_height), col: Float.( diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 5e8dcc3182..965109e273 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -100,6 +100,16 @@ module Text = (M: { | Grout(_) => of_grout | Secondary({content, _}) => of_secondary((content, M.settings.secondary_icons, m(p).last.col)) + | Projector(p) => + of_delim'(( + [ProjMeta.placeholder_str(p)], + false, + expected_sort, //TODO(andrew): ?? + true, //TODO(andrew): ?? + true, + m(Projector(p)).origin.col, + 0, + )) }; } and of_tile = (buffer_ids, expected_sort: Sort.t, t: Tile.t): list(Node.t) => { @@ -128,6 +138,7 @@ let rec holes = |> List.concat_map( fun | Piece.Secondary(_) => [] + | Projector(_) => [] | Tile(t) => List.concat_map(holes(~map, ~font_metrics), t.children) | Grout(g) => [ EmptyHoleDec.view( diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index b27cc4e9ef..2b33bcd2a7 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -37,6 +37,7 @@ module Deco = (M: { let shard_data = switch (p) { | Tile(t) => sel_of_tile(~start_shape, t) + | Projector(p) => sel_of_projector(~start_shape, p) | Grout(g) => [ Some( sel_shard_svg( @@ -91,6 +92,19 @@ module Deco = (M: { t.children |> List.mapi(index => sel_of_segment(shape_at(index))); ListUtil.interleave(tile_shards, children_shards) |> List.flatten; } + and sel_of_projector = + (~start_shape, p: Base.projector): list(option(shard_data)) => { + let m = + Measured.find_pr(~msg="sel_of_tile", p, M.meta.projected.measured); + let token = ProjMeta.placeholder_str(p); + switch (StringUtil.num_linebreaks(token)) { + | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] + //TODO(andrew): decoration for selections + /* No deco for multi-line tokens e.g. projector placeholders, + * but need to leave some blank lines */ + | num_lb => List.init(num_lb, _ => None) + }; + } and sel_of_segment = (start_shape: Nib.Shape.t, seg: Segment.t): list(option(shard_data)) => { seg @@ -135,7 +149,7 @@ module Deco = (M: { | None => Nib.Shape.Convex | Some(nib) => Nib.Shape.relative(nib, side) }; - let range: option((Measured.Point.t, Measured.Point.t)) = { + let range: option((Point.t, Point.t)) = { // if (Piece.has_ends(p)) { let id = Id.Map.find(Piece.id(p), M.meta.projected.terms) |> Term.rep_id; @@ -272,11 +286,7 @@ module Deco = (M: { ); let term_decoration = - ( - ~id: Id.t, - deco: - ((Measured.Point.t, Measured.Point.t, SvgUtil.Path.t)) => Node.t, - ) => { + (~id: Id.t, deco: ((Point.t, Point.t, SvgUtil.Path.t)) => Node.t) => { let (p_l, p_r) = TermRanges.find(id, M.meta.projected.term_ranges); let l = Measured.find_p(~msg="Deco.term", p_l, M.meta.projected.measured). diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 3622f4bef2..cf0ec5aa16 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -124,7 +124,7 @@ let setup_view = let* p = Projector.Map.find(id, meta.projected.z.projectors); let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); - let info = {id, ci, syntax}; + let info = ProjNew.{id, ci, syntax}; let+ measurement = Measured.find_by_id(id, meta.projected.measured); let (module P) = to_module(p.kind); let parent = a => inject(PerformAction(Project(handle(id, a)))); diff --git a/src/haz3lweb/view/dec/CaretDec.re b/src/haz3lweb/view/dec/CaretDec.re index 04fd7b8002..e2bf1c4d55 100644 --- a/src/haz3lweb/view/dec/CaretDec.re +++ b/src/haz3lweb/view/dec/CaretDec.re @@ -8,7 +8,7 @@ let caret_bend = DecUtil.tip_width; module Profile = { type t = { side: Direction.t, - origin: Haz3lcore.Measured.Point.t, + origin: Haz3lcore.Point.t, shape: option(Direction.t), }; }; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index ba7668d5c1..7404f01124 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -105,7 +105,7 @@ let position = ~height_fudge=0.0, ~scale=1., ~font_metrics: FontMetrics.t, - origin: Haz3lcore.Measured.Point.t, + origin: Haz3lcore.Point.t, ) => Attr.create( "style", @@ -128,7 +128,7 @@ let abs_position = ~height_fudge=0.0, ~scale=1., ~font_metrics: FontMetrics.t, - origin: Haz3lcore.Measured.Point.t, + origin: Haz3lcore.Point.t, ) => { position( ~style="position: absolute", @@ -145,7 +145,7 @@ let abs_position = let code_svg = ( ~font_metrics: FontMetrics.t, - ~origin: Haz3lcore.Measured.Point.t, + ~origin: Haz3lcore.Point.t, ~base_cls=[], ~path_cls=[], ~left_fudge=0.0, From 5cae7e488b32a437d52d661ff53efaf951e676a3 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 23 Jul 2024 23:17:02 -0400 Subject: [PATCH 130/168] add/remove infra. haven't hooked up yet --- src/haz3lcore/zipper/ProjectorBase.re | 109 ++------------------------ src/haz3lweb/view/ProjectorView.re | 19 +++-- 2 files changed, 18 insertions(+), 110 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 92feec00ea..2ca15cc918 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -1,5 +1,5 @@ open Util; -open Virtual_dom.Vdom; +//open Virtual_dom.Vdom; /* This module, along with ZipperBase, exists to resolve * cyclic dependencies between Zipper and Projector. All @@ -9,13 +9,7 @@ open Virtual_dom.Vdom; /* Enumeration of different kinds of projectors. This is * used as a key when adding new projectors to an editor. */ [@deriving (show({with_path: false}), sexp, yojson)] -type kind = - | Fold - | Info - | Checkbox - | Slider - | SliderF - | TextArea; +type kind = Base.kind; /* The projector map is store alongside the zipper and * maps syntax UUIDs to instantiated projectors. This @@ -63,105 +57,16 @@ let info_init = (p: syntax) => ProjNew.{id: Piece.id(p), syntax: p, ci: None}; /* To add a new projector, implement this module signature */ -module type Projector = { - [@deriving (show({with_path: false}), sexp, yojson)] - type model; - /* The internal model type of the projector which will - * be serialized and persisted. Use `unit` if you don't - * need other state beyond the underlying syntax */ - [@deriving (show({with_path: false}), sexp, yojson)] - type action; - /* An internal action type to be used in actions which - * update the model. Use `unit` if the basic projector - * actions (type `action`) above suffice */ - let init: model; - /* Initial state of the model */ - let can_project: Piece.t => bool; - /* A predicate determining if the given underlying - * syntax (currently limited to convex pieces) is - * supported by this projector. This is used to gate - * adding the projector */ - let can_focus: bool; - /* Does this projector have internal position states, - * overriding the editor caret & keyboard handlers? - * If yes, the focus method will be called when this - * projector is either clicked on or if left/right - * is pressed when the caret is to the immediate - * right/left of the projector */ - let view: - ( - model, - ~info: info, - ~local: action => Ui_effect.t(unit), - ~parent: external_action => Ui_effect.t(unit) - ) => - Node.t; - /* Renders a DOM view for the projector, given the - * model, an info packet (see info type for details), - * and has two callbacks: ~parent for parent editor - * actions(see external_action type above), and ~local - * for this projector's local update function. */ - let placeholder: (model, info) => shape; - /* How much space should be left in the code view for - * this projector? This determines how the base code - * view is laid out, including how movement around the - * projector works. In principle this could be derived - * from the view, but this is awkward to do so for now - * projector writers are responsible for keeping these - * in sync with each other. */ - let update: (model, action) => model; - /* Update the local projector model given an action */ - let focus: ((Id.t, option(Direction.t))) => unit; - /* Does whatever needs to be done to give a projector - * keyboard focus. Right now this is only for side - * effects but could be extended in the future to - * take/return the model if the projector needs to - * maintain a complex internal position state */ -}; +module type Projector = ProjNew.Projector; /* Projector model and action are serialized so that * they may be used by the Editor without it having * specialized knowledge of projector internals */ -type serialized_model = string; -type serialized_action = string; +type serialized_model = ProjNew.serialized_model; +type serialized_action = ProjNew.serialized_action; /* A cooked projector is the same as the base module * signature except model & action are serialized */ -module type Cooked = { - let init: serialized_model; - let can_project: Piece.t => bool; - let can_focus: bool; - let view: - ( - serialized_model, - ~info: info, - ~local: serialized_action => Ui_effect.t(unit), - ~parent: external_action => Ui_effect.t(unit) - ) => - Node.t; - let placeholder: (serialized_model, info) => shape; - let update: (serialized_model, serialized_action) => serialized_model; - let focus: ((Id.t, option(Direction.t))) => unit; -}; +module type Cooked = ProjNew.Cooked; -module Cook = (C: Projector) : Cooked => { - let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; - let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; - let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; - let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; - let init = C.init |> serialize_m; - let can_project = C.can_project; - let can_focus = C.can_focus; - let view = (m, ~info, ~local, ~parent) => - C.view( - deserialize_m(m), - ~info, - ~local=a => local(serialize_a(a)), - ~parent, - ); - let placeholder = m => - m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; - let update = (m, a) => - C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; - let focus = C.focus; -}; +module Cook = ProjNew.Cook; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index cf0ec5aa16..8226a1a36e 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -1,11 +1,14 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -open Projector; +open ProjNew; +open ProjMeta; open Util; open Util.OptUtil.Syntax; open Util.Web; +type kind = Base.kind; + /* A friendly name for each projector. This is used * both for identifying a projector in the CSS and for * selecting projectors in the projector panel menu */ @@ -75,7 +78,7 @@ let view_wrapper = ~info: info, ~indication: option(Direction.t), ~selected: bool, - entry: Map.entry, + entry: Projector.Map.entry, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; @@ -101,7 +104,7 @@ let view_wrapper = }; /* Dispatches projector external actions to editor-level actions */ -let handle = (id, action: ProjectorBase.external_action): Action.project => +let handle = (id, action: ProjNew.external_action): Action.project => switch (action) { | Remove => Remove(id) | Escape(d) => Escape(id, d) @@ -198,11 +201,11 @@ module Panel = { /* Decide which projectors are applicable based on the cursor info. * This is slightly inside-out as elsewhere it depends on the underlying * syntax, which is not easily available here */ - let applicable_projectors = (ci: Info.t): list(Projector.kind) => + let applicable_projectors = (ci: Info.t): list(Base.kind) => ( switch (Info.cls_of(ci)) { | Exp(Bool) - | Pat(Bool) => [Checkbox] + | Pat(Bool) => [Base.Checkbox] | Exp(Int) | Pat(Int) => [Slider] | Exp(Float) @@ -212,11 +215,11 @@ module Panel = { | _ => [] } ) - @ [Fold] + @ [Base.Fold] @ ( switch (ci) { | InfoExp(_) - | InfoPat(_) => [(Info: Projector.kind)] + | InfoPat(_) => [(Info: Base.kind)] | _ => [] } ); @@ -272,7 +275,7 @@ module Panel = { let view = (~inject, editor: Editor.t, ci: Info.t) => { let might_project = switch (Indicated.piece''(editor.state.zipper)) { - | Some((p, _, _)) => Projector.minimum_projection_condition(p) + | Some((p, _, _)) => minimum_projection_condition(p) | None => false }; div( From 695b5a9b342817470df6290a6005b6e6208b6db1 Mon Sep 17 00:00:00 2001 From: disconcision Date: Tue, 23 Jul 2024 23:30:30 -0400 Subject: [PATCH 131/168] forgot some files. more infra. still haven't hooked up --- src/haz3lcore/Point.re | 39 ++++ src/haz3lcore/zipper/ProjMeta.re | 292 ++++++++++++++++++++++++++ src/haz3lcore/zipper/ProjNew.re | 153 ++++++++++++++ src/haz3lcore/zipper/Zipper.re | 4 +- src/haz3lcore/zipper/action/Action.re | 4 +- src/haz3lweb/explainthis/Example.re | 2 +- 6 files changed, 489 insertions(+), 5 deletions(-) create mode 100644 src/haz3lcore/Point.re create mode 100644 src/haz3lcore/zipper/ProjMeta.re create mode 100644 src/haz3lcore/zipper/ProjNew.re diff --git a/src/haz3lcore/Point.re b/src/haz3lcore/Point.re new file mode 100644 index 0000000000..16a0d147e2 --- /dev/null +++ b/src/haz3lcore/Point.re @@ -0,0 +1,39 @@ +open Util; + +[@deriving (show({with_path: false}), sexp, yojson)] +type row = int; +[@deriving (show({with_path: false}), sexp, yojson)] +type col = int; + +[@deriving (show({with_path: false}), sexp, yojson)] +type t = { + row, + col, +}; +let zero = {row: 0, col: 0}; + +let equals: (t, t) => bool = (p, q) => p.row == q.row && p.col == q.col; + +type comparison = + | Exact + | Under + | Over; + +let comp = (current, target): comparison => + switch () { + | _ when current == target => Exact + | _ when current < target => Under + | _ => Over + }; +let compare = (p1, p2) => + switch (comp(p1, p2)) { + | Exact => 0 + | Under => (-1) + | Over => 1 + }; + +let dcomp = (direction: Direction.t, a, b) => + switch (direction) { + | Right => comp(a, b) + | Left => comp(b, a) + }; diff --git a/src/haz3lcore/zipper/ProjMeta.re b/src/haz3lcore/zipper/ProjMeta.re new file mode 100644 index 0000000000..af7a350e32 --- /dev/null +++ b/src/haz3lcore/zipper/ProjMeta.re @@ -0,0 +1,292 @@ +//open Util; +//open Virtual_dom.Vdom; +open ProjNew; + +let seg_for_maketerm = (_: Base.projector): Base.segment => + failwith("TODO(andrew): seg_for_maketerm"); + +let placeholder_str = _ => failwith("TODO(andrew)"); + +/* After adding a new projector module, add it here so that + * it can be instantiated. The first-class module created by + * this function must be reified whenever projector methods + * are to be called; see `shape` below for an example */ +let to_module = (kind: Base.kind): (module Cooked) => + switch (kind) { + | Fold => (module Cook(FoldCore.M)) + | Info => (module Cook(InfoCore.M)) + | Slider => (module Cook(SliderCore.M)) + | SliderF => (module Cook(SliderFCore.M)) + | Checkbox => (module Cook(CheckboxCore.M)) + | TextArea => (module Cook(TextAreaCore.M)) + }; + +let shape = (kind, model, info: info): shape => { + let (module P) = to_module(kind); + P.placeholder(model, info); +}; + +/* A projector is replaced by a placeholder in the underlying + * editor for view purposes. This projector is an all-whitespace + * monotile. Currently there is no explicit notion of placeholders + * in the zipper; a tile consisting of any number of whitespaces + * is considered a placeholder. This could be made more principled. + * Note that a placeholder retains the UUID of the underlying. */ +let placeholder_label = (kind, model, info): list(string) => + switch (shape(kind, model, info)) { + | Inline(width) => [String.make(width, ' ')] + | Block({row, col}) => [ + String.make(row - 1, '\n') ++ String.make(col, ' '), + ] + }; + +let placeholder = (kind, model, info: info): syntax => + Piece.Tile({ + id: Piece.id(info.syntax), + label: placeholder_label(kind, model, info), + mold: Mold.mk_op(Any, []), + shards: [0], + children: [], + }); + +/* Must be in-sync with placeholder_label / placeholder above */ +let is_placeholder = (p: Piece.t): bool => + switch (p) { + | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 + | _ => false + }; + +/* Currently projection is limited to convex pieces */ +let minimum_projection_condition = (syntax: syntax): bool => + Piece.is_convex(syntax); + +/* Add a new projector, gated on the predicated on the syntax */ +let create = (kind: Base.kind, syntax: syntax): option((Base.kind, string)) => { + let (module P) = to_module(kind); + P.can_project(syntax) && minimum_projection_condition(syntax) + ? Some((kind, P.init)) : None; +}; + +/* Returns the projector at the caret, if any */ +let indicated = (z: ZipperBase.t) => { + open Util.OptUtil.Syntax; + let* id = Indicated.index(z); + let* (p, _, _) = Indicated.piece(z); + let+ projector = + switch (p) { + | Projector(pr) => Some(pr) + | _ => None + }; + (id, projector); +}; + +module MapPiece = { + type updater = Piece.t => Piece.t; + + let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { + seg |> List.map(p => f(p)) |> List.map(of_piece(f)); + } + and of_piece = (f: updater, piece: Piece.t): Piece.t => { + switch (piece) { + | Tile(t) => Tile(of_tile(f, t)) + | Grout(_) + | Projector(_) + | Secondary(_) => piece + }; + } + and of_tile = (f: updater, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(f), t.children)}; + }; + + let of_siblings = (f: updater, sibs: Siblings.t): Siblings.t => ( + of_segment(f, fst(sibs)), + of_segment(f, snd(sibs)), + ); + + let of_ancestor = (f: updater, ancestor: Ancestor.t): Ancestor.t => { + { + ...ancestor, + children: ( + List.map(of_segment(f), fst(ancestor.children)), + List.map(of_segment(f), snd(ancestor.children)), + ), + }; + }; + + let of_generation = + (f: updater, generation: Ancestors.generation): Ancestors.generation => ( + of_ancestor(f, fst(generation)), + of_siblings(f, snd(generation)), + ); + + let of_ancestors = (f: updater, ancestors: Ancestors.t): Ancestors.t => + List.map(of_generation(f), ancestors); + + let of_selection = (f: updater, selection: Selection.t): Selection.t => { + {...selection, content: of_segment(f, selection.content)}; + }; + + let go = (f: updater, z: ZipperBase.t): ZipperBase.t => { + ...z, + selection: of_selection(f, z.selection), + relatives: { + ancestors: of_ancestors(f, z.relatives.ancestors), + siblings: of_siblings(f, z.relatives.siblings), + }, + }; +}; + +//TODO(andrew): refine or remove +module Project = { + let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); + + let placehold = (syntax: syntax) => { + let id = Piece.id(syntax); + switch (syntax) { + | Projector(pr) => + syntax_map := Id.Map.add(id, pr.syntax, syntax_map^); + pr.syntax; + | _ => syntax + }; + }; + + let go = (z: ZipperBase.t): Id.Map.t(syntax) => { + syntax_map := Id.Map.empty; + if (Id.Map.is_empty(z.projectors)) { + syntax_map^; + } else { + MapPiece.go(placehold, z) |> ignore; + syntax_map^; + }; + }; +}; + +/* Updates the underlying piece of syntax for a projector */ +module Update = { + let update_piece = + (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => Base.Projector(f(pr)) + | x => x + }; + + // let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { + // switch (z.relatives.siblings |> get) { + // | Some(l) => Piece.id(l) == id + // | _ => false + // }; + // }; + + // let left_sib_has_id = sib_has_id(Siblings.left_neighbor); + // let right_sib_has_id = sib_has_id(Siblings.right_neighbor); + + // let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { + // let (l, r) = z.relatives.siblings; + // let sibs = (List.map(f, l), List.map(f, r)); + // z |> ZipperBase.put_siblings(sibs); + // }; + + // let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { + // let sibs = + // switch (z.relatives.siblings) { + // | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) + // | sibs => sibs + // }; + // z |> ZipperBase.put_siblings(sibs); + // }; + + let update = + (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) + : ZipperBase.t => { + /* This applies the function to the piece in the zipper having id id, and + * then replaces the id of the resulting piece with the idea of the old + * piece, ensuring that the root id remains stable. This function assumes + * the cursor is not inside the piece to be updated. This is optimized to + * be O(1) when the piece is directly to the left or right of the cursor, + * otherwise it is O(|zipper|) */ + let f = syntax => update_piece(f, id, syntax); + // if (left_sib_has_id(z, id)) { + // update_left_sib(f, z); + // } else if (right_sib_has_id(z, id)) { + // update_right_sib(f, z); + // } else { + MapPiece.go(f, z); + // }; + }; + + let init = (kind, id, syntax): option(Base.projector) => { + let (module P) = to_module(kind); + P.can_project(syntax) ? Some({id, kind, model: P.init, syntax}) : None; + }; + + let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => + // Or Replace + switch (init(kind, id, pr.syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | syntax when Piece.id(syntax) == id => + switch (init(kind, id, syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | x => x + }; + + let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let f = syntax => add_projector(k, id, syntax); + // if (left_sib_has_id(z, id)) { + // update_left_sib(f, z); + // } else if (right_sib_has_id(z, id)) { + // update_right_sib(f, z); + // } else { + MapPiece.go(f, z); + // }; + }; + + let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => pr.syntax + | syntax when Piece.id(syntax) == id => + switch (init(kind, id, syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | x => x + }; + + let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let f = syntax => add_or_remove_projector(k, id, syntax); + // if (left_sib_has_id(z, id)) { + // update_left_sib(f, z); + // } else if (right_sib_has_id(z, id)) { + // update_right_sib(f, z); + // } else { + MapPiece.go(f, z); + // }; + }; + + let remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when pr.id == id => + let (module P) = to_module(kind); + Base.Projector({id, kind, model: P.init, syntax}); + | x => x + }; + + let remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let f = syntax => remove_projector(k, id, syntax); + // if (left_sib_has_id(z, id)) { + // update_left_sib(f, z); + // } else if (right_sib_has_id(z, id)) { + // update_right_sib(f, z); + // } else { + MapPiece.go(f, z); + // }; + }; +}; diff --git a/src/haz3lcore/zipper/ProjNew.re b/src/haz3lcore/zipper/ProjNew.re new file mode 100644 index 0000000000..ae86827391 --- /dev/null +++ b/src/haz3lcore/zipper/ProjNew.re @@ -0,0 +1,153 @@ +open Util; +open Virtual_dom.Vdom; + +[@deriving (show({with_path: false}), sexp, yojson)] +type t = Base.kind; + +//TODO(andrew): docs +let shapes = _ => Nib.Shape.(Convex, Convex); + +//TODO(andrew): cleanup, docs +let mold_of: (t, Sort.t) => Mold.t = + (_, sort) => { + nibs: { + ({shape: Convex, sort}, {shape: Convex, sort}); + }, + out: sort, + in_: [], + }; + +/* Projectors currently have two options for placeholder + * shapes: A inline display of a given length, or a block + * display with given length & height. Both of these can + * depend on the projector model and info package */ +[@deriving (show({with_path: false}), sexp, yojson)] +type shape = + | Inline(int) + | Block(Point.t); + +/* The type of syntax which a projector can replace. + * Right now projectors can replace a single piece */ +[@deriving (show({with_path: false}), sexp, yojson)] +type syntax = Base.piece; + +/* Global actions available to handlers in all projectors */ +type external_action = + | Remove /* Remove projector entirely */ + | Escape(Util.Direction.t) /* Pass focus to parent editor */ + | SetSyntax(syntax); /* Set underlying syntax */ + +/* External info fed to all projectors. Eventually + * dynamic information will be added here. Projector + * position and dimensions in base editor could be + * added here if needed */ +[@deriving (show({with_path: false}), sexp, yojson)] +type info = { + id: Id.t, + syntax, + ci: option(Info.t), +}; + +/* To add a new projector, implement this module signature */ +module type Projector = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model; + /* The internal model type of the projector which will + * be serialized and persisted. Use `unit` if you don't + * need other state beyond the underlying syntax */ + [@deriving (show({with_path: false}), sexp, yojson)] + type action; + /* An internal action type to be used in actions which + * update the model. Use `unit` if the basic projector + * actions (type `action`) above suffice */ + let init: model; + /* Initial state of the model */ + let can_project: Base.piece => bool; + /* A predicate determining if the given underlying + * syntax (currently limited to convex pieces) is + * supported by this projector. This is used to gate + * adding the projector */ + let can_focus: bool; + /* Does this projector have internal position states, + * overriding the editor caret & keyboard handlers? + * If yes, the focus method will be called when this + * projector is either clicked on or if left/right + * is pressed when the caret is to the immediate + * right/left of the projector */ + let view: + ( + model, + ~info: info, + ~local: action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) + ) => + Node.t; + /* Renders a DOM view for the projector, given the + * model, an info packet (see info type for details), + * and has two callbacks: ~parent for parent editor + * actions(see external_action type above), and ~local + * for this projector's local update function. */ + let placeholder: (model, info) => shape; + /* How much space should be left in the code view for + * this projector? This determines how the base code + * view is laid out, including how movement around the + * projector works. In principle this could be derived + * from the view, but this is awkward to do so for now + * projector writers are responsible for keeping these + * in sync with each other. */ + let update: (model, action) => model; + /* Update the local projector model given an action */ + let focus: ((Id.t, option(Direction.t))) => unit; + /* Does whatever needs to be done to give a projector + * keyboard focus. Right now this is only for side + * effects but could be extended in the future to + * take/return the model if the projector needs to + * maintain a complex internal position state */ +}; + +/* Projector model and action are serialized so that + * they may be used by the Editor without it having + * specialized knowledge of projector internals */ +type serialized_model = string; +type serialized_action = string; + +/* A cooked projector is the same as the base module + * signature except model & action are serialized */ +module type Cooked = { + let init: serialized_model; + let can_project: Base.piece => bool; + let can_focus: bool; + let view: + ( + serialized_model, + ~info: info, + ~local: serialized_action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) + ) => + Node.t; + let placeholder: (serialized_model, info) => shape; + let update: (serialized_model, serialized_action) => serialized_model; + let focus: ((Id.t, option(Direction.t))) => unit; +}; + +module Cook = (C: Projector) : Cooked => { + let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; + let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; + let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; + let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; + let init = C.init |> serialize_m; + let can_project = C.can_project; + let can_focus = C.can_focus; + let view = (m, ~info, ~local, ~parent) => + C.view( + deserialize_m(m), + ~info, + ~local=a => local(serialize_a(a)), + ~parent, + ); + let placeholder = m => + m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; + let update = (m, a) => + C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; + let focus = C.focus; +}; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index eae6718da1..5e980ce8dd 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -11,7 +11,7 @@ let init: unit => t = ancestors: [], }, caret: Outer, - projectors: ProjectorBase.Map.empty, + projectors: Id.Map.empty, }; let next_blank = _ => Id.mk(); @@ -58,7 +58,7 @@ let unzip = (seg: Segment.t): t => { ancestors: [], }, caret: Outer, - projectors: ProjectorBase.Map.empty, + projectors: Id.Map.empty, }; let pop_backpack = (z: t) => diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index dc8f835999..540fd78306 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -49,8 +49,8 @@ type select = * and from each projector's own internal action type */ [@deriving (show({with_path: false}), sexp, yojson)] type project = - | SetIndicated(Projector.kind) /* Project syntax at caret */ - | ToggleIndicated(Projector.kind) /* Un/Project syntax at caret */ + | SetIndicated(Base.kind) /* Project syntax at caret */ + | ToggleIndicated(Base.kind) /* Un/Project syntax at caret */ | Remove(Id.t) /* Remove projector at Id */ | SetSyntax(Id.t, Piece.t) /* Set underlying syntax */ | SetModel(Id.t, string) /* Set serialized projector model */ diff --git a/src/haz3lweb/explainthis/Example.re b/src/haz3lweb/explainthis/Example.re index aef4fd243d..8a54d97bb0 100644 --- a/src/haz3lweb/explainthis/Example.re +++ b/src/haz3lweb/explainthis/Example.re @@ -49,7 +49,7 @@ let zipper: Zipper.t = { ancestors, }, caret: Outer, - projectors: Projector.Map.empty, + projectors: Id.Map.empty, }; // TODO Make sure using this for all the forms that should, like wild and nil From 23976edf884e160a3719fede085b8ed3fa4644d4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 24 Jul 2024 01:58:31 -0400 Subject: [PATCH 132/168] hooked up piece-level projectors. running, largely functional, some exceptions. perf bad needs major cleanup --- src/haz3lcore/Measured.re | 25 ++++++ src/haz3lcore/statics/MakeTerm.re | 9 +- src/haz3lcore/tiles/Piece.re | 21 ----- src/haz3lcore/tiles/Segment.re | 57 +----------- src/haz3lcore/tiles/Skel.re | 5 +- src/haz3lcore/zipper/Editor.re | 51 ++++++----- src/haz3lcore/zipper/IncompleteBidelim.re | 30 +------ src/haz3lcore/zipper/ProjMeta.re | 88 ++++++++++++------- src/haz3lcore/zipper/ProjNew.re | 15 ++-- src/haz3lcore/zipper/Zipper.re | 30 +++---- src/haz3lcore/zipper/action/Perform.re | 2 +- .../zipper/action/ProjectorPerform.re | 44 +++++----- src/haz3lweb/Update.re | 4 +- src/haz3lweb/view/Cell.re | 23 ++++- src/haz3lweb/view/Code.re | 3 +- src/haz3lweb/view/Deco.re | 16 ++-- src/haz3lweb/view/ProjectorView.re | 26 ++++-- 17 files changed, 218 insertions(+), 231 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 020750998e..eb53a5f502 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -384,6 +384,31 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let map = add_s(t.id, shard, {origin, last}, map); (last, map); }; + //TODO(andrew) + // let add_shard = (origin, shard, map) => { + // let token = List.nth(t.label, shard); + // // Adjustment for multi-line tokens e.g. projector placeholders + // let last = + // Point.{ + // col: origin.col + StringUtil.max_line_width(token), + // row: origin.row + StringUtil.num_linebreaks(token), + // }; + // let map = map |> add_s(t.id, shard, {origin, last}); + // let row_indent = container_indent + contained_indent; + // let rec add_n_rows = (n, map) => + // switch (n) { + // | 0 => map + // | _ => + // map + // |> add_n_rows(n - 1) + // |> add_row( + // origin.row + n - 1, + // {indent: row_indent, max_col: origin.col}, + // ) + // }; + // let map = map |> add_n_rows(StringUtil.num_linebreaks(token)); + // (last, map); + // }; let (last, map) = Aba.mk(t.shards, t.children) |> Aba.fold_left( diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index c289889c92..81a8f8abe4 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -472,11 +472,9 @@ and unsorted = (skel: Skel.t, seg: Segment.t): unsorted => { | Secondary(_) | Grout(_) => [] | Projector(p) => - Aba.aba_triples(Aba.mk([0], [ProjMeta.seg_for_maketerm(p)])) - |> List.map(((_l, kid, _r)) => { - let s = Sort.Any; //TODO(andrew) - go_s(s, Segment.skel(kid), kid); - }) + let s = Sort.Any; //TODO(andrew) + let kid = ProjMeta.seg_for_maketerm(p); + [go_s(s, Segment.skel(kid), kid)]; | Tile({mold, shards, children, _}) => Aba.aba_triples(Aba.mk(shards, children)) |> List.map(((l, kid, r)) => { @@ -530,6 +528,7 @@ let go = ); let from_zip = (~dump_backpack: bool, ~erase_buffer: bool, z: Zipper.t) => { + let z = ProjMeta.Update.remove_all(z); let seg = Zipper.smart_seg(~dump_backpack, ~erase_buffer, z); go(seg); }; diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index ad5dee205d..4b74808a76 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -145,27 +145,6 @@ let is_complete: t => bool = | Tile(t) => Tile.is_complete(t) | _ => true; -let get_outside_sorts = (~default_sort=Sort.Any, p: t): list(Sort.t) => - //TODO: David please review this - switch (p) { - | Secondary(_) => [] - | Projector(_) => [] - | Grout({shape: Convex, _}) => [] - | Grout({shape: Concave, _}) => [default_sort, default_sort] - | Tile({shards: _, _} as t) when !Tile.is_complete(t) => - // TODO(andrew): better incomplete tile handling - // Need to figure out what shape of incomplete tile is - [] - | Tile(t) => - let (sort_l, sort_r) = nib_sorts(p); - switch ((t.mold.nibs |> fst).shape, (t.mold.nibs |> snd).shape) { - | (Convex, Convex) => [] - | (Convex, Concave(_)) => [sort_r] - | (Concave(_), Convex) => [sort_l] - | (Concave(_), Concave(_)) => [sort_l, sort_r] - }; - }; - let mold_of = (~shape=Nib.Shape.Convex, p: t) => // TODO(d) fix sorts switch (p) { diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 7ccfde7497..911d1587df 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -74,6 +74,7 @@ let shape_affix = (([[w, ...ws], ...wss], gs), s, tl); | Grout(g) => (Aba.cons([], g, wgw), s, tl) | Projector(p) => + //TODO(andrew): ??? let (l, _) = ProjNew.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); (empty_wgw, l, tl); @@ -84,42 +85,6 @@ let shape_affix = }; go((d == Left ? List.rev : Fun.id)(affix), r); }; -let shape = shape_affix(Right); - -let rec convex = seg => { - open OptUtil.Syntax; - let l = - fold_right( - (p: Piece.t, shape) => { - let* s = shape; - switch (p) { - | Secondary(_) => shape - | Grout(g) => - Grout.fits_shape(g, s) ? Some(fst(Grout.shapes(g))) : None - | Projector(p) => - let (l, r) = ProjNew.shapes(p); - Nib.Shape.fits(r, s) ? Some(l) : None; - | Tile(t) => - let (l, r) = Tile.shapes(t); - List.for_all(convex, t.children) && Nib.Shape.fits(r, s) - ? Some(l) : None; - }; - }, - seg, - Some(Nib.Shape.concave()), - ); - switch (l) { - | None => false - | Some(l) => Nib.Shape.fits(Nib.Shape.concave(), l) - }; -}; - -let split_by_grout: t => Aba.t(t, Grout.t) = - Aba.split( - fun - | Piece.Grout(g) => Either.R(g) - | p => L(p), - ); let rec remold = (~shape=Nib.Shape.concave(), seg: t, s: Sort.t) => switch (s) { @@ -691,26 +656,6 @@ let edge_shape_of = (d: Direction.t, ps: t): option(Nib.Shape.t) => { let edge_direction_of = (d: Direction.t, ps: t): option(Direction.t) => Option.map(Nib.Shape.absolute(d), edge_shape_of(d, ps)); -// let rec serialize = (seg: t) => -// seg -// |> List.concat_map( -// fun -// | (Piece.Secondary(_) | Grout(_) | Tile({shards: [_], _}) | Projector(_)) as p => [ -// p, -// ] -// | Tile(t) => { -// let shards = -// List.map( -// Tile.to_piece, -// Tile.split_shards(t.id, t.label, t.mold, t.shards), -// ); -// let children = List.map(serialize, t.children); -// Aba.mk(shards, children) -// |> Aba.join(s => [s], Fun.id) -// |> List.concat; -// }, -// ); - let sameline_secondary = List.for_all( fun diff --git a/src/haz3lcore/tiles/Skel.re b/src/haz3lcore/tiles/Skel.re index c93f644f77..9d7223e91a 100644 --- a/src/haz3lcore/tiles/Skel.re +++ b/src/haz3lcore/tiles/Skel.re @@ -78,8 +78,9 @@ let rel = (p1: Piece.t, p2: Piece.t): option(rel) => | Convex => Some(Lt) | Concave => Some(Gt) } - | (Projector(_), _) => Some(Gt) - | (_, Projector(_)) => Some(Lt) + //TODO(andrew):??? + | (Projector(_), _) => None + | (_, Projector(_)) => None | (Tile(t1), Tile(t2)) => open Labels; let lbl1 = (==)(t1.label); diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 56afe443ee..acaec672fb 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -26,7 +26,8 @@ module CachedStatics = { module Meta = { /* Derived data for projected zipper */ type projected = { - z: Zipper.t, + //z: Zipper.t, + projectors: Id.Map.t(ProjMeta.SyntaxMap.entry), segment: Segment.t, measured: Measured.t, term: Term.UExp.t, @@ -45,11 +46,16 @@ module Meta = { projected, }; - let init_projected = (z_projected: Projector.proj_ret): projected => { - let segment = Zipper.unselect_and_zip(z_projected.z); - let (term, terms) = MakeTerm.go(segment); + let init_projected = (z): projected => { + let segment = Zipper.unselect_and_zip(z); + //TODO(andrew):... + let (term, terms) = + MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); + //TODO(andrew): deprec projectors? + let (syntax_map, projectors) = ProjMeta.SyntaxMap.go(z); { - z: z_projected.z, + projectors, + syntax_map, segment, term, terms, @@ -57,7 +63,6 @@ module Meta = { tiles: TileMap.mk(segment), holes: Segment.holes(segment), measured: Measured.of_segment(segment), - syntax_map: z_projected.syntax_map, }; }; @@ -66,12 +71,11 @@ module Meta = { let init = (~settings: CoreSettings.t, z: Zipper.t) => { let statics = mk_statics(~settings, z); - let projected = - Projector.Project.go(z, statics.info_map) |> init_projected; + let projected = init_projected(z); { col_target: 0, touched: Touched.empty, - selection_ids: Selection.selection_ids(projected.z.selection), + selection_ids: Selection.selection_ids(z.selection), statics, projected, }; @@ -98,12 +102,17 @@ module Meta = { let yojson_of_t = _ => failwith("Editor.Meta.yojson_of_t"); let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); - let next_projected = (z_projected: Projector.proj_ret, ~touched, ~old) => { - let segment = Zipper.unselect_and_zip(z_projected.z); - let (term, terms) = MakeTerm.go(segment); + let next_projected = (z, ~touched, ~old) => { + let segment = Zipper.unselect_and_zip(z); + //TODO(andrew): ... + let (term, terms) = + MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); let measured = Measured.of_segment(~touched, ~old, segment); + //TODO(andrew): deprec projectors? + let (syntax_map, projectors) = ProjMeta.SyntaxMap.go(z); { - z: z_projected.z, + projectors, + syntax_map, segment, term, terms, @@ -111,7 +120,6 @@ module Meta = { term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), - syntax_map: z_projected.syntax_map, }; }; @@ -127,7 +135,8 @@ module Meta = { } else if (!Action.is_edit(a)) { old_statics; } else { - CachedStatics.mk(~settings, z); + let x = CachedStatics.mk(~settings, z); + x; }; let next = @@ -143,24 +152,22 @@ module Meta = { // Effects disabled below; if nothing breaks due to this then rip them out let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); let statics = next_statics(~settings, a, z, meta.statics); - let z_projected = Projector.Project.go(z, statics.info_map); let projected = switch (Action.is_edit(a)) { - | false => {...meta.projected, z: z_projected.z} - | _ => - next_projected(z_projected, ~touched, ~old=meta.projected.measured) + | false => meta.projected + | _ => next_projected(z, ~touched, ~old=meta.projected.measured) }; let col_target = switch (a) { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => meta.col_target - | _ => Zipper.caret_point(projected.measured, projected.z).col + | _ => (Zipper.caret_point(projected.measured))(. z).col }; { touched, col_target, projected, - selection_ids: Selection.selection_ids(projected.z.selection), + selection_ids: Selection.selection_ids(z.selection), statics, }; }; @@ -303,4 +310,4 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; let indicated_projector = (editor: t) => - Projector.indicated(editor.state.zipper); + ProjMeta.indicated(editor.state.zipper); diff --git a/src/haz3lcore/zipper/IncompleteBidelim.re b/src/haz3lcore/zipper/IncompleteBidelim.re index 8883d59533..8b13789179 100644 --- a/src/haz3lcore/zipper/IncompleteBidelim.re +++ b/src/haz3lcore/zipper/IncompleteBidelim.re @@ -1,29 +1 @@ -// type t = Id.Map.t(list(int)); - // let t = ref(Id.Map.empty); - // let contains = (id, i): bool => - // switch (Id.Map.find_opt(id, t^)) { - // | None => false - // | Some(is) => List.mem(i, is) - // }; - // let clear = () => { - // t := Id.Map.empty; - // }; - // // assumes seg is fully assembled - // let set = (seg: Base.segment): unit => - // t := - // seg - // |> List.filter_map( - // fun - // | Piece.Tile(t) => { - // let (l_shard, r_shard) = Tile.(l_shard(t), r_shard(t)); - // let l = l_shard == 0 ? [] : [l_shard - 1]; - // let r = r_shard == List.length(t.label) - 1 ? [] : [r_shard]; - // let lr = l @ r; - // lr == [] ? None : Some((t.id, l @ r)); - // } - // | Grout(_) - // | Secondary(_) - // | Projector(_) => None, - // ) - // |> List.to_seq - // |> Id.Map.of_seq; + diff --git a/src/haz3lcore/zipper/ProjMeta.re b/src/haz3lcore/zipper/ProjMeta.re index af7a350e32..700c00a807 100644 --- a/src/haz3lcore/zipper/ProjMeta.re +++ b/src/haz3lcore/zipper/ProjMeta.re @@ -1,11 +1,8 @@ -//open Util; +open Util; //open Virtual_dom.Vdom; open ProjNew; -let seg_for_maketerm = (_: Base.projector): Base.segment => - failwith("TODO(andrew): seg_for_maketerm"); - -let placeholder_str = _ => failwith("TODO(andrew)"); +let seg_for_maketerm = (p: Base.projector): Base.segment => [p.syntax]; /* After adding a new projector module, add it here so that * it can be instantiated. The first-class module created by @@ -32,18 +29,20 @@ let shape = (kind, model, info: info): shape => { * in the zipper; a tile consisting of any number of whitespaces * is considered a placeholder. This could be made more principled. * Note that a placeholder retains the UUID of the underlying. */ -let placeholder_label = (kind, model, info): list(string) => +let placeholder_str' = (kind, model, info): string => switch (shape(kind, model, info)) { - | Inline(width) => [String.make(width, ' ')] - | Block({row, col}) => [ - String.make(row - 1, '\n') ++ String.make(col, ' '), - ] + | Inline(width) => String.make(width, ' ') + | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') }; +let placeholder_str = ({id, kind, syntax, model}: Base.projector): string => + //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess + placeholder_str'(kind, model, {id, syntax, ci: None}); + let placeholder = (kind, model, info: info): syntax => Piece.Tile({ id: Piece.id(info.syntax), - label: placeholder_label(kind, model, info), + label: [placeholder_str'(kind, model, info)], mold: Mold.mk_op(Any, []), shards: [0], children: [], @@ -137,27 +136,40 @@ module MapPiece = { }; //TODO(andrew): refine or remove -module Project = { +module SyntaxMap = { let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); + [@deriving (show({with_path: false}), sexp, yojson)] + type entry = { + kind: Base.kind, + model: string, + }; + let projectors_map: ref(Id.Map.t(entry)) = ref(Id.Map.empty); let placehold = (syntax: syntax) => { let id = Piece.id(syntax); switch (syntax) { - | Projector(pr) => - syntax_map := Id.Map.add(id, pr.syntax, syntax_map^); - pr.syntax; + | Projector({kind, model, syntax, _}) => + projectors_map := Id.Map.add(id, {kind, model}, projectors_map^); + syntax_map := Id.Map.add(id, syntax, syntax_map^); + syntax; | _ => syntax }; }; - let go = (z: ZipperBase.t): Id.Map.t(syntax) => { + let go = (z: ZipperBase.t): (Id.Map.t(syntax), Id.Map.t(entry)) => { syntax_map := Id.Map.empty; - if (Id.Map.is_empty(z.projectors)) { - syntax_map^; - } else { - MapPiece.go(placehold, z) |> ignore; - syntax_map^; - }; + projectors_map := Id.Map.empty; + // if (Id.Map.is_empty(z.projectors)) { + // (); + // } else { + MapPiece.go(placehold, z) |> ignore; + // }; + // print_endline("syntaxMap.go: z:" ++ (z |> ZipperBase.show)); + // print_endline( + // "SyntaxMap.go:num_prog:" + // ++ (Id.Map.cardinal(syntax_map^) |> Int.to_string), + // ); + (syntax_map^, projectors_map^); }; }; @@ -237,7 +249,7 @@ module Update = { }; let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = syntax => add_projector(k, id, syntax); + let f = add_projector(k, id); // if (left_sib_has_id(z, id)) { // update_left_sib(f, z); // } else if (right_sib_has_id(z, id)) { @@ -260,7 +272,7 @@ module Update = { }; let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = syntax => add_or_remove_projector(k, id, syntax); + let f = add_or_remove_projector(k, id); // if (left_sib_has_id(z, id)) { // update_left_sib(f, z); // } else if (right_sib_has_id(z, id)) { @@ -270,17 +282,33 @@ module Update = { // }; }; - let remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + let remove_projector = (id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when pr.id == id => syntax + | x => x + }; + + let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let f = remove_projector(id); + // if (left_sib_has_id(z, id)) { + // update_left_sib(f, z); + // } else if (right_sib_has_id(z, id)) { + // update_right_sib(f, z); + // } else { + MapPiece.go(f, z); + // }; + }; + + let remove_all_projectors = (syntax: syntax) => //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { - | Projector(pr) when pr.id == id => - let (module P) = to_module(kind); - Base.Projector({id, kind, model: P.init, syntax}); + | Projector(pr) => pr.syntax | x => x }; - let remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = syntax => remove_projector(k, id, syntax); + let remove_all = (z: ZipperBase.t): ZipperBase.t => { + let f = remove_all_projectors; // if (left_sib_has_id(z, id)) { // update_left_sib(f, z); // } else if (right_sib_has_id(z, id)) { diff --git a/src/haz3lcore/zipper/ProjNew.re b/src/haz3lcore/zipper/ProjNew.re index ae86827391..2280097b07 100644 --- a/src/haz3lcore/zipper/ProjNew.re +++ b/src/haz3lcore/zipper/ProjNew.re @@ -9,12 +9,15 @@ let shapes = _ => Nib.Shape.(Convex, Convex); //TODO(andrew): cleanup, docs let mold_of: (t, Sort.t) => Mold.t = - (_, sort) => { - nibs: { - ({shape: Convex, sort}, {shape: Convex, sort}); - }, - out: sort, - in_: [], + (p, sort) => { + let (l, r) = shapes(p); + { + nibs: { + ({shape: l, sort}, {shape: r, sort}); + }, + out: sort, + in_: [], + }; }; /* Projectors currently have two options for placeholder diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index 5e980ce8dd..e55b690d36 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -321,21 +321,21 @@ let base_point = (measured: Measured.t, z: t): Point.t => { * piece, not an id. Piece-based lookups will fail if (say) * a Grout becomes a Tile. Hence we convert pieces that * would be projected to their placeholders before lookup */ - let p = - switch (ProjectorBase.Map.find(Piece.id(p), z.projectors)) { - | _ when Projector.is_placeholder(p) => - /* NOTE: If OTOH we call this on the projected zipper, then - * p will already be a placeholder. In this case we may not - * want to call Projector.placeholder, as it may not be able - * to account for recieving a placeholder. AFAIK disabling - * this check doesn't currently cause any issues, but it - * did in the past when we were reifying the module in the - * below call, resulting in trying to interpret the syntax - * of the placeholder as e.g. an int for the slider */ - p - | Some(pr) => Projector.placeholder(pr, Projector.info_init(p)) - | None => p - }; + // let p = + // switch (ProjectorBase.Map.find(Piece.id(p), z.projectors)) { + // | _ when Projector.is_placeholder(p) => + // /* NOTE: If OTOH we call this on the projected zipper, then + // * p will already be a placeholder. In this case we may not + // * want to call Projector.placeholder, as it may not be able + // * to account for recieving a placeholder. AFAIK disabling + // * this check doesn't currently cause any issues, but it + // * did in the past when we were reifying the module in the + // * below call, resulting in trying to interpret the syntax + // * of the placeholder as e.g. an int for the slider */ + // p + // | Some(pr) => Projector.placeholder(pr, Projector.info_init(p)) + // | None => p + // }; let seg = Piece.disassemble(p); switch (d) { | Left => diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 86f345dd99..5eb2a3678d 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -87,7 +87,7 @@ let go_z = * pasting, then return to the beginning and advance to the * first hole. This should be revisited if completions are * refactored to use a more structured buffer format. */ - let start = Zipper.caret_point(M.measured, meta.projected.z); + let start = Zipper.caret_point(M.measured, z); let z = { open OptUtil.Syntax; let* z = paste(z, completion); diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index f00853efe9..76e291ffcb 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -13,22 +13,24 @@ let move_out_of_piece = } }; -let set = (id: Id.t, p: option(Map.entry), z: Zipper.t) => { - ...z, - projectors: Map.update(id, _ => p, z.projectors), -}; +// let set = (id: Id.t, p: option(Map.entry), z: Zipper.t) => { +// ...z, +// projectors: Map.update(id, _ => p, z.projectors), +// }; -let add = (id: Id.t, z: Zipper.t, p, piece, d, rel) => - switch (Projector.create(p, piece)) { - | None => Error(Action.Failure.Cant_project) - | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) - }; +let add = (id: Id.t, z: Zipper.t, p, _piece, d, rel) => + Ok(move_out_of_piece(d, rel, z) |> ProjMeta.Update.add(p, id)); +// switch (Projector.create(p, piece)) { +// | None => Error(Action.Failure.Cant_project) +// | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) +// }; -let add_or_remove = (id: Id.t, z: Zipper.t, p, piece, d, rel) => - switch (Map.mem(id, z.projectors)) { - | false => add(id, z, p, piece, d, rel) - | true => Ok(set(id, None, z)) - }; +let add_or_remove = (id: Id.t, z: Zipper.t, p, _piece, d, rel) => + Ok(ProjMeta.Update.add_or_remove(p, id, z) |> move_out_of_piece(d, rel)); +// switch (Map.mem(id, z.projectors)) { +// | false => add(id, z, p, piece, d, rel) +// | true => Ok(set(id, None, z)) +// }; let go = ( @@ -61,18 +63,14 @@ let go = | Some((piece, d, rel)) => add_or_remove(Piece.id(piece), z, p, piece, d, rel) } - | Remove(id) => - switch (Map.mem(id, z.projectors)) { - | false => Error(Cant_project) - | true => Ok(set(id, None, z)) - } - | SetSyntax(id, syntax) => Ok(Projector.Syntax.update(_ => syntax, id, z)) + | Remove(id) => Ok(ProjMeta.Update.remove(id, z)) + | SetSyntax(id, syntax) => + Ok(ProjMeta.Update.update(p => {...p, syntax}, id, z)) | SetModel(id, model) => - let update = entry => Option.map(e => Map.{model, kind: e.kind}, entry); - Ok({...z, projectors: Map.update(id, update, z.projectors)}); + Ok(ProjMeta.Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => let z = jump(z, id); - switch (Projector.indicated(z)) { + switch (ProjMeta.indicated(z)) { | Some((_, p)) => let (module P) = to_module(p.kind); P.focus((id, d)); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index b6dce9db7b..820466498d 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -420,7 +420,9 @@ let apply = : Zipper.can_put_down(z) ? Put_down : Move(Goal(Piece(Grout, Right))); perform_action(model, action); - | PerformAction(a) => perform_action(model, a) + | PerformAction(a) => + let r = perform_action(model, a); + r; | Undo => switch (Editors.update_opt(model.editors, Editor.undo)) { | None => Error(CantUndo) diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index ccc0bae3c2..fa91e1327b 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -111,6 +111,7 @@ let deco = ~selected, ~test_results: option(TestResults.t), ~highlights: option(ColorSteps.colorMap), + z, meta: Editor.Meta.t, ) => { module Deco = @@ -118,11 +119,16 @@ let deco = let ui_state = ui_state; let meta = meta; }); - let decos = selected ? Deco.all() : Deco.always(); + let decos = selected ? Deco.all(z) : Deco.always(); let decos = decos @ [ - ProjectorView.all(~meta, ~inject, ~font_metrics=ui_state.font_metrics), + ProjectorView.all( + z, + ~meta, + ~inject, + ~font_metrics=ui_state.font_metrics, + ), ]; let decos = switch (test_results) { @@ -268,9 +274,18 @@ let editor_view = let mousedown_overlay = selected && mousedown ? [mousedown_overlay(~inject, ~font_metrics, ~target_id)] : []; - let code_text_view = Code.view(~sort, ~font_metrics, ~settings, meta); + let code_text_view = + Code.view(~sort, ~font_metrics, ~settings, editor.state.zipper, meta); let deco_view = - deco(~inject, ~ui_state, ~selected, ~test_results, ~highlights, meta); + deco( + ~inject, + ~ui_state, + ~selected, + ~test_results, + ~highlights, + editor.state.zipper, + meta, + ); let code_view = div( diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 965109e273..2dc47cbe10 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -183,7 +183,8 @@ let view = ~sort: Sort.t, ~font_metrics, ~settings: Settings.t, - {projected: {z, measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, + z: Zipper.t, + {projected: {measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, ) : Node.t => { module Text = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 2b33bcd2a7..1bdca1750e 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -95,7 +95,7 @@ module Deco = (M: { and sel_of_projector = (~start_shape, p: Base.projector): list(option(shard_data)) => { let m = - Measured.find_pr(~msg="sel_of_tile", p, M.meta.projected.measured); + Measured.find_pr(~msg="sel_of_projector", p, M.meta.projected.measured); let token = ProjMeta.placeholder_str(p); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] @@ -383,7 +383,7 @@ module Deco = (M: { }; let indication = (z: Zipper.t) => - switch (Projector.indicated(z)) { + switch (ProjMeta.indicated(z)) { | Some(_) => Node.div([]) /* projector indication handled internally */ | None => div_c("indication", indicated_piece_deco(z)) }; @@ -392,12 +392,12 @@ module Deco = (M: { let always = () => [errors()]; - let all = () => [ - caret(M.meta.projected.z), - indication(M.meta.projected.z), - selection(M.meta.projected.z), - backpack(M.meta.projected.z), - backpack_targets(M.meta.projected.z.backpack, M.meta.projected.segment), + let all = z => [ + caret(z), + indication(z), + selection(z), + backpack(z), + backpack_targets(z.backpack, M.meta.projected.segment), errors(), ]; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 8226a1a36e..6aad29b04e 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -78,11 +78,11 @@ let view_wrapper = ~info: info, ~indication: option(Direction.t), ~selected: bool, - entry: Projector.Map.entry, + entry: ProjMeta.SyntaxMap.entry, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; - let shape = Projector.shape(entry, info); + let shape = ProjMeta.shape(entry.kind, entry.model, info); let focus = (id, _) => Effect.( Many([ @@ -124,11 +124,17 @@ let setup_view = ~indication: option(Direction.t), ) : option(Node.t) => { - let* p = Projector.Map.find(id, meta.projected.z.projectors); + let* p = Id.Map.find_opt(id, meta.projected.projectors); let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); let ci = Id.Map.find_opt(id, meta.statics.info_map); let info = ProjNew.{id, ci, syntax}; - let+ measurement = Measured.find_by_id(id, meta.projected.measured); + let+ measurement = + Some( + Measured.find_pr( + {id, kind: p.kind, syntax, model: p.model}, + meta.projected.measured, + ), + ); let (module P) = to_module(p.kind); let parent = a => inject(PerformAction(Project(handle(id, a)))); let local = a => @@ -153,17 +159,23 @@ let indication = (z, id) => /* Returns a div containing all projector UIs, intended to * be absolutely positioned atop a rendered editor UI */ -let all = (~meta: Editor.Meta.t, ~inject, ~font_metrics) => +let all = (z, ~meta: Editor.Meta.t, ~inject, ~font_metrics) => { + // print_endline( + // "cardinal: " + // ++ (meta.projected.projectors |> Id.Map.cardinal |> string_of_int), + // ); div_c( "projectors", List.filter_map( ((id, _)) => { - let indication = indication(meta.projected.z, id); + //TODO(andrew): cleanup + let indication = indication(z, id); setup_view(id, ~meta, ~inject, ~font_metrics, ~indication); }, - Id.Map.bindings(meta.projected.z.projectors) |> List.rev, + Id.Map.bindings(meta.projected.projectors) |> List.rev, ), ); +}; /* When the caret is directly adjacent to a projector, keyboard commands * can be overidden here. Right now, trying to move into the projector, From 52f4529b31e3a3ab626fce9259111d34b960ea90 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 24 Jul 2024 14:46:06 -0400 Subject: [PATCH 133/168] piece-level projectors bug fixes and cleanup --- src/haz3lcore/Measured.re | 13 +- src/haz3lcore/zipper/Editor.re | 12 +- src/haz3lcore/zipper/ProjMeta.re | 207 ++++++++---------- src/haz3lcore/zipper/action/Indicated.re | 2 +- .../zipper/action/ProjectorPerform.re | 13 +- src/haz3lweb/DebugConsole.re | 3 +- src/haz3lweb/view/Deco.re | 10 +- src/haz3lweb/view/ProjectorView.re | 17 +- 8 files changed, 129 insertions(+), 148 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index eb53a5f502..4a4d53ced1 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -167,6 +167,8 @@ let find_pr = (~msg="", p: Base.projector, map): measurement => try(Id.Map.find(p.id, map.projectors)) { | _ => failwith("find_g: " ++ msg) }; +let find_pr_opt = (p: Base.projector, map): option(measurement) => + Id.Map.find_opt(p.id, map.projectors); // returns the measurement spanning the whole tile let find_t = (t: Tile.t, map): measurement => { let shards = Id.Map.find(t.id, map.tiles); @@ -212,8 +214,15 @@ let find_by_id = (id: Id.t, map: t): option(measurement) => { ); Some({origin: first.origin, last: last.last}); | None => - Printf.printf("Measured.WARNING: id %s not found", Id.to_string(id)); - None; + switch (Id.Map.find_opt(id, map.projectors)) { + | Some(m) => Some(m) + | None => + Printf.printf( + "Measured.WARNING: id %s not found", + Id.to_string(id), + ); + None; + } } } }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index acaec672fb..27b197e784 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -27,7 +27,8 @@ module Meta = { /* Derived data for projected zipper */ type projected = { //z: Zipper.t, - projectors: Id.Map.t(ProjMeta.SyntaxMap.entry), + //syntax_map: Id.Map.t(Piece.t), + projectors: Id.Map.t(Base.projector), segment: Segment.t, measured: Measured.t, term: Term.UExp.t, @@ -35,7 +36,6 @@ module Meta = { terms: TermMap.t, tiles: TileMap.t, holes: list(Grout.t), - syntax_map: Id.Map.t(Piece.t), }; type t = { @@ -52,10 +52,10 @@ module Meta = { let (term, terms) = MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); //TODO(andrew): deprec projectors? - let (syntax_map, projectors) = ProjMeta.SyntaxMap.go(z); + let projectors = ProjMeta.SyntaxMap.go(z); { projectors, - syntax_map, + //syntax_map, segment, term, terms, @@ -109,10 +109,10 @@ module Meta = { MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); let measured = Measured.of_segment(~touched, ~old, segment); //TODO(andrew): deprec projectors? - let (syntax_map, projectors) = ProjMeta.SyntaxMap.go(z); + let projectors = ProjMeta.SyntaxMap.go(z); { projectors, - syntax_map, + // syntax_map, segment, term, terms, diff --git a/src/haz3lcore/zipper/ProjMeta.re b/src/haz3lcore/zipper/ProjMeta.re index 700c00a807..0f336153a7 100644 --- a/src/haz3lcore/zipper/ProjMeta.re +++ b/src/haz3lcore/zipper/ProjMeta.re @@ -1,4 +1,4 @@ -open Util; +//open Util; //open Virtual_dom.Vdom; open ProjNew; @@ -18,9 +18,9 @@ let to_module = (kind: Base.kind): (module Cooked) => | TextArea => (module Cook(TextAreaCore.M)) }; -let shape = (kind, model, info: info): shape => { - let (module P) = to_module(kind); - P.placeholder(model, info); +let shape = (p: Base.projector, info: info): shape => { + let (module P) = to_module(p.kind); + P.placeholder(p.model, info); }; /* A projector is replaced by a placeholder in the underlying @@ -29,31 +29,28 @@ let shape = (kind, model, info: info): shape => { * in the zipper; a tile consisting of any number of whitespaces * is considered a placeholder. This could be made more principled. * Note that a placeholder retains the UUID of the underlying. */ -let placeholder_str' = (kind, model, info): string => - switch (shape(kind, model, info)) { +let placeholder_str = ({id, syntax, _} as p: Base.projector): string => + //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess + switch (shape(p, {id, syntax, ci: None})) { | Inline(width) => String.make(width, ' ') | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') }; -let placeholder_str = ({id, kind, syntax, model}: Base.projector): string => - //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess - placeholder_str'(kind, model, {id, syntax, ci: None}); - -let placeholder = (kind, model, info: info): syntax => - Piece.Tile({ - id: Piece.id(info.syntax), - label: [placeholder_str'(kind, model, info)], - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], - }); +// let _placeholder = (p: Base.projector, info: info): syntax => +// Piece.Tile({ +// id: Piece.id(info.syntax), +// label: [placeholder_str'(p, info)], +// mold: Mold.mk_op(Any, []), +// shards: [0], +// children: [], +// }); /* Must be in-sync with placeholder_label / placeholder above */ -let is_placeholder = (p: Piece.t): bool => - switch (p) { - | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 - | _ => false - }; +// let is_placeholder = (p: Piece.t): bool => +// switch (p) { +// | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 +// | _ => false +// }; /* Currently projection is limited to convex pieces */ let minimum_projection_condition = (syntax: syntax): bool => @@ -137,27 +134,27 @@ module MapPiece = { //TODO(andrew): refine or remove module SyntaxMap = { - let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); - [@deriving (show({with_path: false}), sexp, yojson)] - type entry = { - kind: Base.kind, - model: string, - }; - let projectors_map: ref(Id.Map.t(entry)) = ref(Id.Map.empty); + // let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); + // [@deriving (show({with_path: false}), sexp, yojson)] + // type entry = { + // kind: Base.kind, + // model: string, + // }; + let projectors_map: ref(Id.Map.t(Base.projector)) = ref(Id.Map.empty); let placehold = (syntax: syntax) => { let id = Piece.id(syntax); switch (syntax) { - | Projector({kind, model, syntax, _}) => - projectors_map := Id.Map.add(id, {kind, model}, projectors_map^); - syntax_map := Id.Map.add(id, syntax, syntax_map^); + | Projector(pr) => + projectors_map := Id.Map.add(id, pr, projectors_map^); + // syntax_map := Id.Map.add(id, syntax, syntax_map^); syntax; | _ => syntax }; }; - let go = (z: ZipperBase.t): (Id.Map.t(syntax), Id.Map.t(entry)) => { - syntax_map := Id.Map.empty; + let go = (z: ZipperBase.t): Id.Map.t(Base.projector) => { + // syntax_map := Id.Map.empty; projectors_map := Id.Map.empty; // if (Id.Map.is_empty(z.projectors)) { // (); @@ -169,62 +166,62 @@ module SyntaxMap = { // "SyntaxMap.go:num_prog:" // ++ (Id.Map.cardinal(syntax_map^) |> Int.to_string), // ); - (syntax_map^, projectors_map^); + /*syntax_map^,*/ projectors_map^; }; }; /* Updates the underlying piece of syntax for a projector */ module Update = { - let update_piece = - (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when pr.id == id => Base.Projector(f(pr)) - | x => x + let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { + switch (z.relatives.siblings |> get) { + | Some(l) => Piece.id(l) == id + | _ => false }; + }; - // let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { - // switch (z.relatives.siblings |> get) { - // | Some(l) => Piece.id(l) == id - // | _ => false - // }; - // }; - - // let left_sib_has_id = sib_has_id(Siblings.left_neighbor); - // let right_sib_has_id = sib_has_id(Siblings.right_neighbor); + let left_sib_has_id = sib_has_id(Siblings.left_neighbor); + let right_sib_has_id = sib_has_id(Siblings.right_neighbor); - // let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { - // let (l, r) = z.relatives.siblings; - // let sibs = (List.map(f, l), List.map(f, r)); - // z |> ZipperBase.put_siblings(sibs); - // }; + let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { + let (l, r) = z.relatives.siblings; + let sibs = (List.map(f, l), List.map(f, r)); + z |> ZipperBase.put_siblings(sibs); + }; - // let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { - // let sibs = - // switch (z.relatives.siblings) { - // | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) - // | sibs => sibs - // }; - // z |> ZipperBase.put_siblings(sibs); - // }; + let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { + let sibs = + switch (z.relatives.siblings) { + | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) + | sibs => sibs + }; + z |> ZipperBase.put_siblings(sibs); + }; - let update = - (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) - : ZipperBase.t => { + let eff_update = + (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => /* This applies the function to the piece in the zipper having id id, and * then replaces the id of the resulting piece with the idea of the old * piece, ensuring that the root id remains stable. This function assumes * the cursor is not inside the piece to be updated. This is optimized to * be O(1) when the piece is directly to the left or right of the cursor, * otherwise it is O(|zipper|) */ - let f = syntax => update_piece(f, id, syntax); - // if (left_sib_has_id(z, id)) { - // update_left_sib(f, z); - // } else if (right_sib_has_id(z, id)) { - // update_right_sib(f, z); - // } else { - MapPiece.go(f, z); - // }; - }; + if (left_sib_has_id(z, id)) { + print_endline("ProjMeta.Update.update: left_sib_has_id"); + update_left_sib(f, z); + } else if (right_sib_has_id(z, id)) { + print_endline("ProjMeta.Update.update: right_sib_has_id"); + update_right_sib(f, z); + } else { + print_endline("ProjMeta.Update.update: MapPiece.go"); + MapPiece.go(f, z); + }; + + let update_piece = + (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => Base.Projector(f(pr)) + | x => x + }; let init = (kind, id, syntax): option(Base.projector) => { let (module P) = to_module(kind); @@ -248,17 +245,6 @@ module Update = { | x => x }; - let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = add_projector(k, id); - // if (left_sib_has_id(z, id)) { - // update_left_sib(f, z); - // } else if (right_sib_has_id(z, id)) { - // update_right_sib(f, z); - // } else { - MapPiece.go(f, z); - // }; - }; - let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { @@ -271,50 +257,33 @@ module Update = { | x => x }; - let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = add_or_remove_projector(k, id); - // if (left_sib_has_id(z, id)) { - // update_left_sib(f, z); - // } else if (right_sib_has_id(z, id)) { - // update_right_sib(f, z); - // } else { - MapPiece.go(f, z); - // }; - }; - let remove_projector = (id: Id.t, syntax: syntax) => //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { - | Projector(pr) when pr.id == id => syntax + | Projector(pr) when pr.id == id => pr.syntax | x => x }; - let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => { - let f = remove_projector(id); - // if (left_sib_has_id(z, id)) { - // update_left_sib(f, z); - // } else if (right_sib_has_id(z, id)) { - // update_right_sib(f, z); - // } else { - MapPiece.go(f, z); - // }; - }; + let update = + (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) + : ZipperBase.t => + eff_update(update_piece(f, id), id, z); + + let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(add_projector(k, id), id, z); + let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(add_or_remove_projector(k, id), id, z); + + let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(remove_projector(id), id, z); let remove_all_projectors = (syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + //TODO(andrew): avoid the need to remove all switch (syntax) { | Projector(pr) => pr.syntax | x => x }; - let remove_all = (z: ZipperBase.t): ZipperBase.t => { - let f = remove_all_projectors; - // if (left_sib_has_id(z, id)) { - // update_left_sib(f, z); - // } else if (right_sib_has_id(z, id)) { - // update_right_sib(f, z); - // } else { - MapPiece.go(f, z); - // }; - }; + let remove_all = (z: ZipperBase.t): ZipperBase.t => + MapPiece.go(remove_all_projectors, z); }; diff --git a/src/haz3lcore/zipper/action/Indicated.re b/src/haz3lcore/zipper/action/Indicated.re index 5af5fd3f2e..8fbfadfeb6 100644 --- a/src/haz3lcore/zipper/action/Indicated.re +++ b/src/haz3lcore/zipper/action/Indicated.re @@ -73,7 +73,7 @@ let shard_index = (z: ZipperBase.t): option(int) => switch (p) { | Secondary(_) | Grout(_) - | Projector(_) => Some(0) + | Projector(_) => Some(0) //TODO(andrew): ??? | Tile(t) => switch (side) { | Left => Some(List.length(t.children)) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 76e291ffcb..6b56ed42eb 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -41,16 +41,18 @@ let go = z: Zipper.t, ) : result(ZipperBase.t, Action.Failure.t) => { - let jump = (z, id) => - switch (jump_to_id(z, id)) { - | Some(z) => z - | None => z - }; let switch_side = z => switch (primary(ByToken, Right, z)) { | Some(z) => z | None => z }; + let jump = (z, id) => + switch (jump_to_id(z, id)) { + /* Moves to right side, as right side always implies it's indicated. + * For example,"(|x)" or "!|x" wouldn't have "x" indicated */ + | Some(z) => switch_side(z) + | None => z + }; switch (a) { | SetIndicated(p) => switch (Indicated.for_index(z)) { @@ -69,6 +71,7 @@ let go = | SetModel(id, model) => Ok(ProjMeta.Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => + //TODO(andrew): this fails if moving to e.g. "![checkbox]" let z = jump(z, id); switch (ProjMeta.indicated(z)) { | Some((_, p)) => diff --git a/src/haz3lweb/DebugConsole.re b/src/haz3lweb/DebugConsole.re index 867199b93e..2f5f3cceeb 100644 --- a/src/haz3lweb/DebugConsole.re +++ b/src/haz3lweb/DebugConsole.re @@ -24,10 +24,11 @@ let print = ({settings, editors, _}: Model.t, key: string): unit => { let index = Indicated.index(zipper); switch (index) { | Some(index) => + print("id:" ++ Id.to_string(index)); switch (Id.Map.find_opt(index, map)) { | Some(ci) => print(Info.show(ci)) | None => print("DEBUG: No CI found for index") - } + }; | None => print("DEBUG: No indicated index") }; | _ => print("DEBUG: No action for key: " ++ key) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 1bdca1750e..12444d5a07 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -95,7 +95,11 @@ module Deco = (M: { and sel_of_projector = (~start_shape, p: Base.projector): list(option(shard_data)) => { let m = - Measured.find_pr(~msg="sel_of_projector", p, M.meta.projected.measured); + switch (Measured.find_pr_opt(p, M.meta.projected.measured)) { + | None => + failwith("TODO(andrew): Deco.sel_of_projector: missing measurement") + | Some(m) => m + }; let token = ProjMeta.placeholder_str(p); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] @@ -353,6 +357,7 @@ module Deco = (M: { }; let errors_of_tile = (id: Id.t) => { + //TODO(andrew): needs projectors update; err holes on projs crash let tiles = Id.Map.find(id, M.meta.projected.terms) |> Term.ids @@ -378,7 +383,8 @@ module Deco = (M: { div_c( "errors", //List.concat_map(PieceDec.simple_shards_errors(~font_metrics), tiles), - List.map(errors_of_tile, M.meta.statics.error_ids), + //TODO(andrew): reinistate + [] //List.map(errors_of_tile, M.meta.statics.error_ids), ); }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 6aad29b04e..fcdbc7663e 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -78,11 +78,11 @@ let view_wrapper = ~info: info, ~indication: option(Direction.t), ~selected: bool, - entry: ProjMeta.SyntaxMap.entry, + p: Base.projector, view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; - let shape = ProjMeta.shape(entry.kind, entry.model, info); + let shape = ProjMeta.shape(p, info); let focus = (id, _) => Effect.( Many([ @@ -93,8 +93,7 @@ let view_wrapper = div( ~attrs=[ Attr.classes( - ["projector", name(entry.kind)] - @ status(indication, selected, shape), + ["projector", name(p.kind)] @ status(indication, selected, shape), ), Attr.on_mousedown(focus(info.id)), DecUtil.abs_style(measurement, ~fudge, ~font_metrics), @@ -125,16 +124,10 @@ let setup_view = ) : option(Node.t) => { let* p = Id.Map.find_opt(id, meta.projected.projectors); - let* syntax = Id.Map.find_opt(id, meta.projected.syntax_map); + let* syntax = Some(p.syntax); let ci = Id.Map.find_opt(id, meta.statics.info_map); let info = ProjNew.{id, ci, syntax}; - let+ measurement = - Some( - Measured.find_pr( - {id, kind: p.kind, syntax, model: p.model}, - meta.projected.measured, - ), - ); + let+ measurement = Measured.find_pr_opt(p, meta.projected.measured); let (module P) = to_module(p.kind); let parent = a => inject(PerformAction(Project(handle(id, a)))); let local = a => From e2431de85dc39fac1daba1702fdcfcdb48a59399 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 24 Jul 2024 19:02:22 -0400 Subject: [PATCH 134/168] cleanup --- src/haz3lcore/Measured.re | 2 +- src/haz3lcore/statics/MakeTerm.re | 4 +- src/haz3lcore/zipper/Editor.re | 10 +- src/haz3lcore/zipper/ProjMeta.re | 289 ------------------ src/haz3lcore/zipper/Projector.re | 274 +++++++---------- src/haz3lcore/zipper/Zipper.re | 66 +--- src/haz3lcore/zipper/action/Move.re | 3 - .../zipper/action/ProjectorPerform.re | 41 +-- src/haz3lweb/exercises/Ex_OddlyRecursive.ml | 16 +- .../exercises/Ex_RecursiveFibonacci.ml | 14 +- src/haz3lweb/view/Code.re | 2 +- src/haz3lweb/view/Deco.re | 4 +- src/haz3lweb/view/ProjectorView.re | 4 +- 13 files changed, 163 insertions(+), 566 deletions(-) delete mode 100644 src/haz3lcore/zipper/ProjMeta.re diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 4a4d53ced1..76a5b3754d 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -380,7 +380,7 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let map = map |> add_g(g, {origin, last}); (contained_indent, last, map); | Projector(p) => - let token = ProjMeta.placeholder_str(p); + let token = Projector.placeholder_str(p); let last = last_of_token(token, origin); let map = extra_rows(token, origin, map); let map = add_pr(p, {origin, last}, map); diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index 81a8f8abe4..8f07b63596 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -473,7 +473,7 @@ and unsorted = (skel: Skel.t, seg: Segment.t): unsorted => { | Grout(_) => [] | Projector(p) => let s = Sort.Any; //TODO(andrew) - let kid = ProjMeta.seg_for_maketerm(p); + let kid = Projector.seg_for_maketerm(p); [go_s(s, Segment.skel(kid), kid)]; | Tile({mold, shards, children, _}) => Aba.aba_triples(Aba.mk(shards, children)) @@ -528,7 +528,7 @@ let go = ); let from_zip = (~dump_backpack: bool, ~erase_buffer: bool, z: Zipper.t) => { - let z = ProjMeta.Update.remove_all(z); + let z = Projector.Update.remove_all(z); let seg = Zipper.smart_seg(~dump_backpack, ~erase_buffer, z); go(seg); }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 27b197e784..915d11001c 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -50,9 +50,9 @@ module Meta = { let segment = Zipper.unselect_and_zip(z); //TODO(andrew):... let (term, terms) = - MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); + MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); //TODO(andrew): deprec projectors? - let projectors = ProjMeta.SyntaxMap.go(z); + let projectors = Projector.SyntaxMap.go(z); { projectors, //syntax_map, @@ -106,10 +106,10 @@ module Meta = { let segment = Zipper.unselect_and_zip(z); //TODO(andrew): ... let (term, terms) = - MakeTerm.go(Zipper.unselect_and_zip(ProjMeta.Update.remove_all(z))); + MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); let measured = Measured.of_segment(~touched, ~old, segment); //TODO(andrew): deprec projectors? - let projectors = ProjMeta.SyntaxMap.go(z); + let projectors = Projector.SyntaxMap.go(z); { projectors, // syntax_map, @@ -310,4 +310,4 @@ let trailing_hole_ctx = (ed: t, info_map: Statics.Map.t) => { }; let indicated_projector = (editor: t) => - ProjMeta.indicated(editor.state.zipper); + Projector.indicated(editor.state.zipper); diff --git a/src/haz3lcore/zipper/ProjMeta.re b/src/haz3lcore/zipper/ProjMeta.re deleted file mode 100644 index 0f336153a7..0000000000 --- a/src/haz3lcore/zipper/ProjMeta.re +++ /dev/null @@ -1,289 +0,0 @@ -//open Util; -//open Virtual_dom.Vdom; -open ProjNew; - -let seg_for_maketerm = (p: Base.projector): Base.segment => [p.syntax]; - -/* After adding a new projector module, add it here so that - * it can be instantiated. The first-class module created by - * this function must be reified whenever projector methods - * are to be called; see `shape` below for an example */ -let to_module = (kind: Base.kind): (module Cooked) => - switch (kind) { - | Fold => (module Cook(FoldCore.M)) - | Info => (module Cook(InfoCore.M)) - | Slider => (module Cook(SliderCore.M)) - | SliderF => (module Cook(SliderFCore.M)) - | Checkbox => (module Cook(CheckboxCore.M)) - | TextArea => (module Cook(TextAreaCore.M)) - }; - -let shape = (p: Base.projector, info: info): shape => { - let (module P) = to_module(p.kind); - P.placeholder(p.model, info); -}; - -/* A projector is replaced by a placeholder in the underlying - * editor for view purposes. This projector is an all-whitespace - * monotile. Currently there is no explicit notion of placeholders - * in the zipper; a tile consisting of any number of whitespaces - * is considered a placeholder. This could be made more principled. - * Note that a placeholder retains the UUID of the underlying. */ -let placeholder_str = ({id, syntax, _} as p: Base.projector): string => - //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess - switch (shape(p, {id, syntax, ci: None})) { - | Inline(width) => String.make(width, ' ') - | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') - }; - -// let _placeholder = (p: Base.projector, info: info): syntax => -// Piece.Tile({ -// id: Piece.id(info.syntax), -// label: [placeholder_str'(p, info)], -// mold: Mold.mk_op(Any, []), -// shards: [0], -// children: [], -// }); - -/* Must be in-sync with placeholder_label / placeholder above */ -// let is_placeholder = (p: Piece.t): bool => -// switch (p) { -// | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 -// | _ => false -// }; - -/* Currently projection is limited to convex pieces */ -let minimum_projection_condition = (syntax: syntax): bool => - Piece.is_convex(syntax); - -/* Add a new projector, gated on the predicated on the syntax */ -let create = (kind: Base.kind, syntax: syntax): option((Base.kind, string)) => { - let (module P) = to_module(kind); - P.can_project(syntax) && minimum_projection_condition(syntax) - ? Some((kind, P.init)) : None; -}; - -/* Returns the projector at the caret, if any */ -let indicated = (z: ZipperBase.t) => { - open Util.OptUtil.Syntax; - let* id = Indicated.index(z); - let* (p, _, _) = Indicated.piece(z); - let+ projector = - switch (p) { - | Projector(pr) => Some(pr) - | _ => None - }; - (id, projector); -}; - -module MapPiece = { - type updater = Piece.t => Piece.t; - - let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { - seg |> List.map(p => f(p)) |> List.map(of_piece(f)); - } - and of_piece = (f: updater, piece: Piece.t): Piece.t => { - switch (piece) { - | Tile(t) => Tile(of_tile(f, t)) - | Grout(_) - | Projector(_) - | Secondary(_) => piece - }; - } - and of_tile = (f: updater, t: Tile.t): Tile.t => { - {...t, children: List.map(of_segment(f), t.children)}; - }; - - let of_siblings = (f: updater, sibs: Siblings.t): Siblings.t => ( - of_segment(f, fst(sibs)), - of_segment(f, snd(sibs)), - ); - - let of_ancestor = (f: updater, ancestor: Ancestor.t): Ancestor.t => { - { - ...ancestor, - children: ( - List.map(of_segment(f), fst(ancestor.children)), - List.map(of_segment(f), snd(ancestor.children)), - ), - }; - }; - - let of_generation = - (f: updater, generation: Ancestors.generation): Ancestors.generation => ( - of_ancestor(f, fst(generation)), - of_siblings(f, snd(generation)), - ); - - let of_ancestors = (f: updater, ancestors: Ancestors.t): Ancestors.t => - List.map(of_generation(f), ancestors); - - let of_selection = (f: updater, selection: Selection.t): Selection.t => { - {...selection, content: of_segment(f, selection.content)}; - }; - - let go = (f: updater, z: ZipperBase.t): ZipperBase.t => { - ...z, - selection: of_selection(f, z.selection), - relatives: { - ancestors: of_ancestors(f, z.relatives.ancestors), - siblings: of_siblings(f, z.relatives.siblings), - }, - }; -}; - -//TODO(andrew): refine or remove -module SyntaxMap = { - // let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); - // [@deriving (show({with_path: false}), sexp, yojson)] - // type entry = { - // kind: Base.kind, - // model: string, - // }; - let projectors_map: ref(Id.Map.t(Base.projector)) = ref(Id.Map.empty); - - let placehold = (syntax: syntax) => { - let id = Piece.id(syntax); - switch (syntax) { - | Projector(pr) => - projectors_map := Id.Map.add(id, pr, projectors_map^); - // syntax_map := Id.Map.add(id, syntax, syntax_map^); - syntax; - | _ => syntax - }; - }; - - let go = (z: ZipperBase.t): Id.Map.t(Base.projector) => { - // syntax_map := Id.Map.empty; - projectors_map := Id.Map.empty; - // if (Id.Map.is_empty(z.projectors)) { - // (); - // } else { - MapPiece.go(placehold, z) |> ignore; - // }; - // print_endline("syntaxMap.go: z:" ++ (z |> ZipperBase.show)); - // print_endline( - // "SyntaxMap.go:num_prog:" - // ++ (Id.Map.cardinal(syntax_map^) |> Int.to_string), - // ); - /*syntax_map^,*/ projectors_map^; - }; -}; - -/* Updates the underlying piece of syntax for a projector */ -module Update = { - let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { - switch (z.relatives.siblings |> get) { - | Some(l) => Piece.id(l) == id - | _ => false - }; - }; - - let left_sib_has_id = sib_has_id(Siblings.left_neighbor); - let right_sib_has_id = sib_has_id(Siblings.right_neighbor); - - let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { - let (l, r) = z.relatives.siblings; - let sibs = (List.map(f, l), List.map(f, r)); - z |> ZipperBase.put_siblings(sibs); - }; - - let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { - let sibs = - switch (z.relatives.siblings) { - | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) - | sibs => sibs - }; - z |> ZipperBase.put_siblings(sibs); - }; - - let eff_update = - (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => - /* This applies the function to the piece in the zipper having id id, and - * then replaces the id of the resulting piece with the idea of the old - * piece, ensuring that the root id remains stable. This function assumes - * the cursor is not inside the piece to be updated. This is optimized to - * be O(1) when the piece is directly to the left or right of the cursor, - * otherwise it is O(|zipper|) */ - if (left_sib_has_id(z, id)) { - print_endline("ProjMeta.Update.update: left_sib_has_id"); - update_left_sib(f, z); - } else if (right_sib_has_id(z, id)) { - print_endline("ProjMeta.Update.update: right_sib_has_id"); - update_right_sib(f, z); - } else { - print_endline("ProjMeta.Update.update: MapPiece.go"); - MapPiece.go(f, z); - }; - - let update_piece = - (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when pr.id == id => Base.Projector(f(pr)) - | x => x - }; - - let init = (kind, id, syntax): option(Base.projector) => { - let (module P) = to_module(kind); - P.can_project(syntax) ? Some({id, kind, model: P.init, syntax}) : None; - }; - - let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere - switch (syntax) { - | Projector(pr) when Piece.id(syntax) == id => - // Or Replace - switch (init(kind, id, pr.syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } - | syntax when Piece.id(syntax) == id => - switch (init(kind, id, syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } - | x => x - }; - - let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere - switch (syntax) { - | Projector(pr) when Piece.id(syntax) == id => pr.syntax - | syntax when Piece.id(syntax) == id => - switch (init(kind, id, syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } - | x => x - }; - - let remove_projector = (id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere - switch (syntax) { - | Projector(pr) when pr.id == id => pr.syntax - | x => x - }; - - let update = - (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) - : ZipperBase.t => - eff_update(update_piece(f, id), id, z); - - let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(add_projector(k, id), id, z); - let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(add_or_remove_projector(k, id), id, z); - - let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(remove_projector(id), id, z); - - let remove_all_projectors = (syntax: syntax) => - //TODO(andrew): avoid the need to remove all - switch (syntax) { - | Projector(pr) => pr.syntax - | x => x - }; - - let remove_all = (z: ZipperBase.t): ZipperBase.t => - MapPiece.go(remove_all_projectors, z); -}; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 2fbc838392..3577c3e344 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,13 +1,12 @@ -open Util; -include ProjectorBase; +open ProjNew; -/* See ProjectorBase for an introduction */ +let seg_for_maketerm = (p: Base.projector): Base.segment => [p.syntax]; /* After adding a new projector module, add it here so that * it can be instantiated. The first-class module created by * this function must be reified whenever projector methods * are to be called; see `shape` below for an example */ -let to_module = (kind: kind): (module Cooked) => +let to_module = (kind: Base.kind): (module Cooked) => switch (kind) { | Fold => (module Cook(FoldCore.M)) | Info => (module Cook(InfoCore.M)) @@ -17,7 +16,7 @@ let to_module = (kind: kind): (module Cooked) => | TextArea => (module Cook(TextAreaCore.M)) }; -let shape = (p: Map.entry, info: info): shape => { +let shape = (p: Base.projector, info: info): shape => { let (module P) = to_module(p.kind); P.placeholder(p.model, info); }; @@ -28,28 +27,11 @@ let shape = (p: Map.entry, info: info): shape => { * in the zipper; a tile consisting of any number of whitespaces * is considered a placeholder. This could be made more principled. * Note that a placeholder retains the UUID of the underlying. */ -let placeholder_label = (p: Map.entry, syntax): list(string) => - switch (shape(p, syntax)) { - | Inline(width) => [String.make(width, ' ')] - | Block({row, col}) => [ - String.make(row - 1, '\n') ++ String.make(col, ' '), - ] - }; - -let placeholder = (p: Map.entry, info: info): syntax => - Piece.Tile({ - id: Piece.id(info.syntax), - label: placeholder_label(p, info), - mold: Mold.mk_op(Any, []), - shards: [0], - children: [], - }); - -/* Must be in-sync with placeholder_label / placeholder above */ -let is_placeholder = (p: Piece.t): bool => - switch (p) { - | Tile({label: [s], _}) => s |> String.trim |> String.length == 0 - | _ => false +let placeholder_str = ({id, syntax, _} as p: Base.projector): string => + //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess + switch (shape(p, {id, syntax, ci: None})) { + | Inline(width) => String.make(width, ' ') + | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') }; /* Currently projection is limited to convex pieces */ @@ -57,118 +39,23 @@ let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); /* Add a new projector, gated on the predicated on the syntax */ -let create = (kind: kind, syntax: syntax): option(Map.entry) => { +let create = (kind: Base.kind, syntax: syntax): option((Base.kind, string)) => { let (module P) = to_module(kind); P.can_project(syntax) && minimum_projection_condition(syntax) - ? Some({kind, model: P.init}) : None; + ? Some((kind, P.init)) : None; }; /* Returns the projector at the caret, if any */ let indicated = (z: ZipperBase.t) => { open Util.OptUtil.Syntax; let* id = Indicated.index(z); - let+ projector = Map.find(id, z.projectors); - (id, projector); -}; - -/* Is a piece of syntax currently projected? */ -let syntax_is = (ps: Map.t, syntax: option(syntax)): option(Id.t) => - switch (syntax) { - | Some(p) when Map.mem(Piece.id(p), ps) => - Map.mem(Piece.id(p), ps) ? Some(Piece.id(p)) : None - | _ => None - }; - -/* Is neighboring syntax currently projected? */ -let neighbor_is = (ps, s: Siblings.t): (option(Id.t), option(Id.t)) => ( - syntax_is(ps, Siblings.left_neighbor(s)), - syntax_is(ps, Siblings.right_neighbor(s)), -); - -/* This handles the logic for selecting around projectors. - * This amounts to simply selecting over the projected syntax - * as if it were atomic instead of selecting into it. In principle, - * this should work the same as if the projected syntax was replaced - * by its placeholder, the selection was made on that projections, - * and then the placeholder was replaced by former syntax. In an - * updated syntax model, it should maybe work this way, or else - * projected syntax should be represented in the zipper in - * a more first-class way */ -module Select = { - let skip_grow_left = - ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { - let (ls, content) = Segment.push_right((ls, z.selection.content)); - z - |> ZipperBase.put_selection_content(content) - |> ZipperBase.put_siblings((ls, rs)) - |> Option.some; - }; - - let skip_grow_right = - ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { - let (content, rs) = Segment.push_left((z.selection.content, rs)); - z - |> ZipperBase.put_selection_content(content) - |> ZipperBase.put_siblings((ls, rs)) - |> Option.some; - }; - - let grow = - ({relatives: {siblings, _}, projectors, _} as z: ZipperBase.t) - : option(ZipperBase.t) => - switch (z.selection.focus, neighbor_is(projectors, siblings)) { - | (Left, (Some(_), _)) => skip_grow_left(z) - | (Right, (_, Some(_))) => skip_grow_right(z) - | _ => None - }; - - let skip_shrink_left = - ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { - let (ls, content) = Segment.push_left((ls, z.selection.content)); - z - |> ZipperBase.put_selection_content(content) - |> ZipperBase.put_siblings((ls, rs)) - |> Option.some; - }; - - let skip_shrink_right = - ({relatives: {siblings: (ls, rs), _}, _} as z: ZipperBase.t) => { - let (content, rs) = Segment.push_right((z.selection.content, rs)); - z - |> ZipperBase.put_selection_content(content) - |> ZipperBase.put_siblings((ls, rs)) - |> Option.some; - }; - - let selection_sides_is = - (projectors, s: Selection.t): (option(Id.t), option(Id.t)) => ( - syntax_is(projectors, ListUtil.hd_opt(s.content)), - syntax_is(projectors, ListUtil.last_opt(s.content)), - ); - - let shrink = - ({selection, projectors, _} as z: ZipperBase.t): option(ZipperBase.t) => - switch (selection.focus, selection_sides_is(projectors, selection)) { - | (Left, (Some(_), _)) => skip_shrink_left(z) - | (Right, (_, Some(_))) => skip_shrink_right(z) - | _ => None - }; -}; - -/* See Select description above */ -module Move = { - let go = (d: Direction.t, z: ZipperBase.t): option(ZipperBase.t) => - switch (d, neighbor_is(z.projectors, z.relatives.siblings)) { - | (Left, (Some(_), _)) => - Some( - ZipperBase.put_siblings(Segment.push_right(z.relatives.siblings), z), - ) - | (Right, (_, Some(_))) => - Some( - ZipperBase.put_siblings(Segment.push_left(z.relatives.siblings), z), - ) + let* (p, _, _) = Indicated.piece(z); + let+ projector = + switch (p) { + | Projector(pr) => Some(pr) | _ => None }; + (id, projector); }; module MapPiece = { @@ -227,46 +114,29 @@ module MapPiece = { }; }; -[@deriving (show({with_path: false}), sexp)] -type proj_ret = { - z: ZipperBase.t, - syntax_map: Id.Map.t(syntax), -}; - -/* Creates a projected version of the zipper for the view. - * This replaces all projected pieces of syntax with their - * corresponding placeholders. For convience, it also returns - * a map from projector/syntax ids to the corresponding syntax */ -module Project = { - let syntax_map: ref(Id.Map.t(syntax)) = ref(Id.Map.empty); +//TODO(andrew): refine or remove +module SyntaxMap = { + let projectors_map: ref(Id.Map.t(Base.projector)) = ref(Id.Map.empty); - let placehold = (projectors: Map.t, info_map: Statics.Map.t, syntax: syntax) => { + let placehold = (syntax: syntax) => { let id = Piece.id(syntax); - switch (Map.find(id, projectors)) { - | None => syntax - | Some(pr) => - let info: info = {id, syntax, ci: Id.Map.find_opt(id, info_map)}; - syntax_map := Id.Map.add(id, syntax, syntax_map^); - placeholder(pr, info); + switch (syntax) { + | Projector(pr) => + projectors_map := Id.Map.add(id, pr, projectors_map^); + syntax; + | _ => syntax }; }; - let go = (z: ZipperBase.t, info_map: Statics.Map.t): proj_ret => { - syntax_map := Id.Map.empty; - if (Id.Map.is_empty(z.projectors)) { - {z, syntax_map: syntax_map^}; - } else { - let z = MapPiece.go(placehold(z.projectors, info_map), z); - {z, syntax_map: syntax_map^}; - }; + let go = (z: ZipperBase.t): Id.Map.t(Base.projector) => { + projectors_map := Id.Map.empty; + MapPiece.go(placehold, z) |> ignore; + projectors_map^; }; }; /* Updates the underlying piece of syntax for a projector */ -module Syntax = { - let update_piece = (f, id: Id.t, syntax: syntax) => - id == Piece.id(syntax) ? f(syntax) : syntax; - +module Update = { let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { switch (z.relatives.siblings |> get) { | Some(l) => Piece.id(l) == id @@ -292,25 +162,93 @@ module Syntax = { z |> ZipperBase.put_siblings(sibs); }; - let update = (f: syntax => syntax, id: Id.t, z: ZipperBase.t): ZipperBase.t => { + let eff_update = + (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => /* This applies the function to the piece in the zipper having id id, and * then replaces the id of the resulting piece with the idea of the old * piece, ensuring that the root id remains stable. This function assumes * the cursor is not inside the piece to be updated. This is optimized to * be O(1) when the piece is directly to the left or right of the cursor, * otherwise it is O(|zipper|) */ - let f = syntax => - update_piece( - p => p |> f |> Piece.replace_id(Piece.id(p)), - id, - syntax, - ); if (left_sib_has_id(z, id)) { + print_endline("Projector.Update.update: left_sib_has_id"); update_left_sib(f, z); } else if (right_sib_has_id(z, id)) { + print_endline("Projector.Update.update: right_sib_has_id"); update_right_sib(f, z); } else { + print_endline("Projector.Update.update: MapPiece.go"); MapPiece.go(f, z); }; - }; + + let update_piece = + (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => Base.Projector(f(pr)) + | x => x + }; + + let init = (kind, id, syntax): option(Base.projector) => { + let (module P) = to_module(kind); + P.can_project(syntax) ? Some({id, kind, model: P.init, syntax}) : None; + }; + + let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => + // Or Replace + switch (init(kind, id, pr.syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | syntax when Piece.id(syntax) == id => + switch (init(kind, id, syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | x => x + }; + + let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => pr.syntax + | syntax when Piece.id(syntax) == id => + switch (init(kind, id, syntax)) { + | None => syntax + | Some(pr) => Base.Projector(pr) + } + | x => x + }; + + let remove_projector = (id: Id.t, syntax: syntax) => + //TODO(andrew): same id still? make sure these aren't creating dupes somewhere + switch (syntax) { + | Projector(pr) when pr.id == id => pr.syntax + | x => x + }; + + let update = + (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) + : ZipperBase.t => + eff_update(update_piece(f, id), id, z); + + let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(add_projector(k, id), id, z); + let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(add_or_remove_projector(k, id), id, z); + + let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => + eff_update(remove_projector(id), id, z); + + let remove_all_projectors = (syntax: syntax) => + //TODO(andrew): avoid the need to remove all + switch (syntax) { + | Projector(pr) => pr.syntax + | x => x + }; + + let remove_all = (z: ZipperBase.t): ZipperBase.t => + MapPiece.go(remove_all_projectors, z); }; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index e55b690d36..ba0af71349 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -121,13 +121,9 @@ let put_selection = (sel: Selection.t, z: t): t => snd(update_selection(sel, z)); let grow_selection = (z: t): option(t) => { - switch (Projector.Select.grow(z)) { - | Some(z) => Some(z) - | None => - let+ (p, relatives) = Relatives.pop(z.selection.focus, z.relatives); - let selection = Selection.push(p, z.selection); - {...z, selection, relatives}; - }; + let+ (p, relatives) = Relatives.pop(z.selection.focus, z.relatives); + let selection = Selection.push(p, z.selection); + {...z, selection, relatives}; }; // toggles focus and grows if selection is empty @@ -137,15 +133,11 @@ let shrink_selection = (z: t): option(t) => { let selection = Selection.toggle_focus(z.selection); grow_selection({...z, selection}); | Some((p, selection)) => - switch (Projector.Select.shrink(z)) { - | Some(z) => Some(z) - | None => - let relatives = - z.relatives - |> Relatives.push(selection.focus, p) - |> Relatives.reassemble; - Some({...z, selection, relatives}); - } + let relatives = + z.relatives + |> Relatives.push(selection.focus, p) + |> Relatives.reassemble; + Some({...z, selection, relatives}); }; }; @@ -161,16 +153,12 @@ let directional_unselect = (d: Direction.t, z: t): t => { let move = (d: Direction.t, z: t): option(t) => if (Selection.is_empty(z.selection)) { - switch (Projector.Move.go(d, z)) { - | Some(z) => Some(z) - | None => - let+ (p, relatives) = Relatives.pop(d, z.relatives); - let relatives = - relatives - |> Relatives.push(Direction.toggle(d), p) - |> Relatives.reassemble; - {...z, relatives}; - }; + let+ (p, relatives) = Relatives.pop(d, z.relatives); + let relatives = + relatives + |> Relatives.push(Direction.toggle(d), p) + |> Relatives.reassemble; + {...z, relatives}; } else { Some(directional_unselect(d, z)); }; @@ -310,32 +298,6 @@ let measured = z => z |> unselect_and_zip |> Measured.of_segment; let base_point = (measured: Measured.t, z: t): Point.t => { switch (representative_piece(z)) { | Some((p, d)) => - /* NOTE: Below conversion necessary because sometimes - * we call this with measured based on projected zipper - * measurements but also z is the non-projected zipper. - * This should work okay since the core movement/selection - * actions in Zipper avoid cursor positions around pieces - * which would be absent in the projected zipper. The problem - * is the projected tile itself. Specifically because looking - * up measurements is not currently homogenous; it takes a - * piece, not an id. Piece-based lookups will fail if (say) - * a Grout becomes a Tile. Hence we convert pieces that - * would be projected to their placeholders before lookup */ - // let p = - // switch (ProjectorBase.Map.find(Piece.id(p), z.projectors)) { - // | _ when Projector.is_placeholder(p) => - // /* NOTE: If OTOH we call this on the projected zipper, then - // * p will already be a placeholder. In this case we may not - // * want to call Projector.placeholder, as it may not be able - // * to account for recieving a placeholder. AFAIK disabling - // * this check doesn't currently cause any issues, but it - // * did in the past when we were reifying the module in the - // * below call, resulting in trying to interpret the syntax - // * of the placeholder as e.g. an int for the slider */ - // p - // | Some(pr) => Projector.placeholder(pr, Projector.info_init(p)) - // | None => p - // }; let seg = Piece.disassemble(p); switch (d) { | Left => diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 52f5fd7971..9cc511c290 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -77,9 +77,6 @@ module Make = (M: Editor.Meta.S) => { /* this case maybe shouldn't be necessary but currently covers an edge (select an open parens to left of a multichar token and press left) */ | _ when z.selection.content != [] => pop_move(d, z) - /* Need this case to avoid moving sub-caret onto projectors: */ - | (_, Outer, _) when Projector.Move.go(d, z) != None => - Zipper.move(d, z) | (Left, Outer, (CanEnter(dlm, c_max), _)) => inner_end(d, dlm, c_max, z) | (Left, Outer, _) => Zipper.move(d, z) diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 6b56ed42eb..48110ebb1f 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -13,25 +13,6 @@ let move_out_of_piece = } }; -// let set = (id: Id.t, p: option(Map.entry), z: Zipper.t) => { -// ...z, -// projectors: Map.update(id, _ => p, z.projectors), -// }; - -let add = (id: Id.t, z: Zipper.t, p, _piece, d, rel) => - Ok(move_out_of_piece(d, rel, z) |> ProjMeta.Update.add(p, id)); -// switch (Projector.create(p, piece)) { -// | None => Error(Action.Failure.Cant_project) -// | opt_p => Ok(set(id, opt_p, z) |> move_out_of_piece(d, rel)) -// }; - -let add_or_remove = (id: Id.t, z: Zipper.t, p, _piece, d, rel) => - Ok(ProjMeta.Update.add_or_remove(p, id, z) |> move_out_of_piece(d, rel)); -// switch (Map.mem(id, z.projectors)) { -// | false => add(id, z, p, piece, d, rel) -// | true => Ok(set(id, None, z)) -// }; - let go = ( jump_to_id, @@ -50,30 +31,38 @@ let go = switch (jump_to_id(z, id)) { /* Moves to right side, as right side always implies it's indicated. * For example,"(|x)" or "!|x" wouldn't have "x" indicated */ - | Some(z) => switch_side(z) + //TODO(andrew): just making this change breaks escape + | Some(z) => z //switch_side(z) | None => z }; switch (a) { | SetIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Cant_project) - | Some((piece, d, rel)) => add(Piece.id(piece), z, p, piece, d, rel) + | Some((piece, d, rel)) => + Ok( + move_out_of_piece(d, rel, z) + |> Projector.Update.add(p, Piece.id(piece)), + ) } | ToggleIndicated(p) => switch (Indicated.for_index(z)) { | None => Error(Cant_project) | Some((piece, d, rel)) => - add_or_remove(Piece.id(piece), z, p, piece, d, rel) + Ok( + move_out_of_piece(d, rel, z) + |> Projector.Update.add_or_remove(p, Piece.id(piece)), + ) } - | Remove(id) => Ok(ProjMeta.Update.remove(id, z)) + | Remove(id) => Ok(Projector.Update.remove(id, z)) | SetSyntax(id, syntax) => - Ok(ProjMeta.Update.update(p => {...p, syntax}, id, z)) + Ok(Projector.Update.update(p => {...p, syntax}, id, z)) | SetModel(id, model) => - Ok(ProjMeta.Update.update(pr => {...pr, model}, id, z)) + Ok(Projector.Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => //TODO(andrew): this fails if moving to e.g. "![checkbox]" let z = jump(z, id); - switch (ProjMeta.indicated(z)) { + switch (Projector.indicated(z)) { | Some((_, p)) => let (module P) = to_module(p.kind); P.focus((id, d)); diff --git a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml index 92a87c7b16..7976012cc0 100644 --- a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml +++ b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml @@ -12,7 +12,7 @@ let exercise : Exercise.spec = { test_validation = 1; mutation_testing = 1; impl_grading = 2 }; prelude = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -259,7 +259,7 @@ let exercise : Exercise.spec = }; correct_impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -802,7 +802,7 @@ let exercise : Exercise.spec = { tests = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Right; content = []; mode = Normal }; backpack = []; relatives = @@ -1057,7 +1057,7 @@ let exercise : Exercise.spec = }; your_impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1242,7 +1242,7 @@ let exercise : Exercise.spec = { impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1449,7 +1449,7 @@ let exercise : Exercise.spec = { impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1656,7 +1656,7 @@ let exercise : Exercise.spec = { impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -2456,7 +2456,7 @@ let exercise : Exercise.spec = { tests = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml index de12e0ccd9..153ee70192 100644 --- a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml +++ b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml @@ -20,11 +20,11 @@ let exercise : Exercise.spec = ancestors = []; }; caret = Outer; - projectors = Projector.Map.empty; + projectors = Id.Map.empty; }; correct_impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -481,7 +481,7 @@ let exercise : Exercise.spec = { tests = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -496,7 +496,7 @@ let exercise : Exercise.spec = }; your_impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -684,7 +684,7 @@ let exercise : Exercise.spec = { impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1407,7 +1407,7 @@ let exercise : Exercise.spec = { impl = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1991,7 +1991,7 @@ let exercise : Exercise.spec = { tests = { - projectors = Projector.Map.empty; + projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 2dc47cbe10..1b04cd3e8a 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -102,7 +102,7 @@ module Text = (M: { of_secondary((content, M.settings.secondary_icons, m(p).last.col)) | Projector(p) => of_delim'(( - [ProjMeta.placeholder_str(p)], + [Projector.placeholder_str(p)], false, expected_sort, //TODO(andrew): ?? true, //TODO(andrew): ?? diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 12444d5a07..71f941a6cf 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -100,7 +100,7 @@ module Deco = (M: { failwith("TODO(andrew): Deco.sel_of_projector: missing measurement") | Some(m) => m }; - let token = ProjMeta.placeholder_str(p); + let token = Projector.placeholder_str(p); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] //TODO(andrew): decoration for selections @@ -389,7 +389,7 @@ module Deco = (M: { }; let indication = (z: Zipper.t) => - switch (ProjMeta.indicated(z)) { + switch (Projector.indicated(z)) { | Some(_) => Node.div([]) /* projector indication handled internally */ | None => div_c("indication", indicated_piece_deco(z)) }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index fcdbc7663e..9af1a9de8f 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -2,7 +2,7 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; open ProjNew; -open ProjMeta; +open Projector; open Util; open Util.OptUtil.Syntax; open Util.Web; @@ -82,7 +82,7 @@ let view_wrapper = view: Node.t, ) => { let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; - let shape = ProjMeta.shape(p, info); + let shape = Projector.shape(p, info); let focus = (id, _) => Effect.( Many([ From 03ffd3b6220823b66ce676927590b59560a111d1 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 24 Jul 2024 20:12:25 -0400 Subject: [PATCH 135/168] .. --- src/haz3lcore/tiles/Piece.re | 6 +- src/haz3lcore/tiles/Segment.re | 4 +- src/haz3lcore/zipper/Editor.re | 135 +- src/haz3lcore/zipper/ProjNew.re | 156 - src/haz3lcore/zipper/Projector.re | 2 +- src/haz3lcore/zipper/ProjectorBase.re | 162 +- src/haz3lcore/zipper/Zipper.re | 2 - src/haz3lcore/zipper/ZipperBase.re | 2 - src/haz3lcore/zipper/action/Action.re | 2 +- .../zipper/projectors/CheckboxCore.re | 2 +- src/haz3lcore/zipper/projectors/FoldCore.re | 2 +- src/haz3lcore/zipper/projectors/InfoCore.re | 2 +- src/haz3lcore/zipper/projectors/SliderCore.re | 2 +- .../zipper/projectors/SliderFCore.re | 2 +- .../zipper/projectors/TextAreaCore.re | 2 +- src/haz3lweb/Init.ml | 14584 ++++++++-------- src/haz3lweb/exercises/Ex_OddlyRecursive.ml | 8 - .../exercises/Ex_RecursiveFibonacci.ml | 7 - src/haz3lweb/explainthis/Example.re | 1 - src/haz3lweb/view/Cell.re | 2 +- src/haz3lweb/view/Code.re | 2 +- src/haz3lweb/view/Deco.re | 49 +- src/haz3lweb/view/ProjectorView.re | 12 +- 23 files changed, 7576 insertions(+), 7572 deletions(-) delete mode 100644 src/haz3lcore/zipper/ProjNew.re diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 4b74808a76..3183b4cc22 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -36,7 +36,7 @@ let nibs = }, t => Some(Tile.nibs(t)), p => { - let (l, r) = ProjNew.shapes(p); + let (l, r) = ProjectorBase.shapes(p); Some(Nib.({shape: l, sort: Any}, {shape: r, sort: Any})); }, ); @@ -97,7 +97,7 @@ let shapes = _ => None, g => Some(Grout.shapes(g)), t => Some(Tile.shapes(t)), - p => Some(ProjNew.shapes(p)), + p => Some(ProjectorBase.shapes(p)), ); let is_convex = (p: t): bool => @@ -151,7 +151,7 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Tile(t) => t.mold | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) - | Projector(p) => ProjNew.mold_of(p.kind, Any) + | Projector(p) => ProjectorBase.mold_of(p.kind, Any) }; let replace_id = (id: Id.t, p: t): t => diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 911d1587df..6847772a6a 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -76,7 +76,7 @@ let shape_affix = | Projector(p) => //TODO(andrew): ??? let (l, _) = - ProjNew.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); + ProjectorBase.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); (empty_wgw, l, tl); | Tile(t) => let (l, _) = Tile.shapes(t) |> (d == Left ? TupleUtil.swap : Fun.id); @@ -525,7 +525,7 @@ and regrout_affix = | Projector(p) => let p = Piece.Projector(p); let (l', r') = - ProjNew.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); + ProjectorBase.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); let trim = Trim.regrout(d, (r', r), trim); (Trim.empty, l', [p, ...Trim.to_seg(trim)] @ tl); | Tile(t) => diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 915d11001c..00fff6a4e5 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -21,13 +21,23 @@ module CachedStatics = { let error_ids = Statics.Map.error_ids(info_map); {term, info_map, error_ids}; }; + + let mk = (~settings: CoreSettings.t, z: Zipper.t) => + settings.statics ? mk(~settings, z) : empty; + + let next = + (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, old_statics: t): t => + if (!settings.statics) { + empty; + } else if (!Action.is_edit(a)) { + old_statics; + } else { + mk(~settings, z); + }; }; -module Meta = { - /* Derived data for projected zipper */ - type projected = { - //z: Zipper.t, - //syntax_map: Id.Map.t(Piece.t), +module CachedSyntax = { + type t = { projectors: Id.Map.t(Base.projector), segment: Segment.t, measured: Measured.t, @@ -38,47 +48,63 @@ module Meta = { holes: list(Grout.t), }; - type t = { - col_target: int, - touched: Touched.t, - selection_ids: list(Id.t), - statics: CachedStatics.t, - projected, + let init = (z): t => { + let segment = Zipper.unselect_and_zip(z); + //TODO(andrew): avoid remove_all + let (term, terms) = + MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); + //TODO(andrew): consolidate with remove_all? + let projectors = Projector.SyntaxMap.go(z); + { + projectors, + segment, + term, + terms, + term_ranges: TermRanges.mk(segment), + tiles: TileMap.mk(segment), + holes: Segment.holes(segment), + measured: Measured.of_segment(segment), + }; }; - let init_projected = (z): projected => { + let update = (z, ~touched, ~old): t => { let segment = Zipper.unselect_and_zip(z); - //TODO(andrew):... + let measured = Measured.of_segment(~touched, ~old, segment); + //TODO(andrew): remove/consolidate remove_all and syntaxMap let (term, terms) = MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); - //TODO(andrew): deprec projectors? let projectors = Projector.SyntaxMap.go(z); { projectors, - //syntax_map, segment, term, terms, + measured, term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), - measured: Measured.of_segment(segment), }; }; - let mk_statics = (~settings: CoreSettings.t, z: Zipper.t) => - settings.statics ? CachedStatics.mk(~settings, z) : CachedStatics.empty; + let next = (a: Action.t, z: Zipper.t, old: t, ~touched) => + Action.is_edit(a) ? update(z, ~touched, ~old=old.measured) : old; +}; + +module Meta = { + type t = { + col_target: int, + touched: Touched.t, + selection_ids: list(Id.t), + statics: CachedStatics.t, + syntax: CachedSyntax.t, + }; let init = (~settings: CoreSettings.t, z: Zipper.t) => { - let statics = mk_statics(~settings, z); - let projected = init_projected(z); - { - col_target: 0, - touched: Touched.empty, - selection_ids: Selection.selection_ids(z.selection), - statics, - projected, - }; + col_target: 0, + touched: Touched.empty, + selection_ids: Selection.selection_ids(z.selection), + statics: CachedStatics.mk(~settings, z), + syntax: CachedSyntax.init(z), }; module type S = { @@ -91,8 +117,8 @@ module Meta = { (module { let touched = m.touched; - let measured = m.projected.measured; - let term_ranges = m.projected.term_ranges; + let measured = m.syntax.measured; + let term_ranges = m.syntax.term_ranges; let col_target = m.col_target; }); @@ -102,43 +128,6 @@ module Meta = { let yojson_of_t = _ => failwith("Editor.Meta.yojson_of_t"); let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); - let next_projected = (z, ~touched, ~old) => { - let segment = Zipper.unselect_and_zip(z); - //TODO(andrew): ... - let (term, terms) = - MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); - let measured = Measured.of_segment(~touched, ~old, segment); - //TODO(andrew): deprec projectors? - let projectors = Projector.SyntaxMap.go(z); - { - projectors, - // syntax_map, - segment, - term, - terms, - measured, - term_ranges: TermRanges.mk(segment), - tiles: TileMap.mk(segment), - holes: Segment.holes(segment), - }; - }; - - let next_statics = - ( - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - old_statics: CachedStatics.t, - ) => - if (!settings.statics) { - CachedStatics.empty; - } else if (!Action.is_edit(a)) { - old_statics; - } else { - let x = CachedStatics.mk(~settings, z); - x; - }; - let next = ( ~effects as _: list(Effect.t)=[], @@ -151,22 +140,18 @@ module Meta = { print_endline("Editor.next. Action:" ++ Action.show(a)); // Effects disabled below; if nothing breaks due to this then rip them out let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); - let statics = next_statics(~settings, a, z, meta.statics); - let projected = - switch (Action.is_edit(a)) { - | false => meta.projected - | _ => next_projected(z, ~touched, ~old=meta.projected.measured) - }; + let syntax = CachedSyntax.next(~touched, a, z, meta.syntax); + let statics = CachedStatics.next(~settings, a, z, meta.statics); let col_target = switch (a) { | Move(Local(Up | Down)) | Select(Resize(Local(Up | Down))) => meta.col_target - | _ => (Zipper.caret_point(projected.measured))(. z).col + | _ => (Zipper.caret_point(syntax.measured))(. z).col }; { touched, col_target, - projected, + syntax, selection_ids: Selection.selection_ids(z.selection), statics, }; @@ -253,7 +238,7 @@ let new_state = let update_statics = (~settings: CoreSettings.t, ed: t): t => { /* Use this function to force a statics update when (for example) * changing the statics settings */ - let statics = Meta.mk_statics(~settings, ed.state.zipper); + let statics = CachedStatics.mk(~settings, ed.state.zipper); { ...ed, state: { diff --git a/src/haz3lcore/zipper/ProjNew.re b/src/haz3lcore/zipper/ProjNew.re deleted file mode 100644 index 2280097b07..0000000000 --- a/src/haz3lcore/zipper/ProjNew.re +++ /dev/null @@ -1,156 +0,0 @@ -open Util; -open Virtual_dom.Vdom; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = Base.kind; - -//TODO(andrew): docs -let shapes = _ => Nib.Shape.(Convex, Convex); - -//TODO(andrew): cleanup, docs -let mold_of: (t, Sort.t) => Mold.t = - (p, sort) => { - let (l, r) = shapes(p); - { - nibs: { - ({shape: l, sort}, {shape: r, sort}); - }, - out: sort, - in_: [], - }; - }; - -/* Projectors currently have two options for placeholder - * shapes: A inline display of a given length, or a block - * display with given length & height. Both of these can - * depend on the projector model and info package */ -[@deriving (show({with_path: false}), sexp, yojson)] -type shape = - | Inline(int) - | Block(Point.t); - -/* The type of syntax which a projector can replace. - * Right now projectors can replace a single piece */ -[@deriving (show({with_path: false}), sexp, yojson)] -type syntax = Base.piece; - -/* Global actions available to handlers in all projectors */ -type external_action = - | Remove /* Remove projector entirely */ - | Escape(Util.Direction.t) /* Pass focus to parent editor */ - | SetSyntax(syntax); /* Set underlying syntax */ - -/* External info fed to all projectors. Eventually - * dynamic information will be added here. Projector - * position and dimensions in base editor could be - * added here if needed */ -[@deriving (show({with_path: false}), sexp, yojson)] -type info = { - id: Id.t, - syntax, - ci: option(Info.t), -}; - -/* To add a new projector, implement this module signature */ -module type Projector = { - [@deriving (show({with_path: false}), sexp, yojson)] - type model; - /* The internal model type of the projector which will - * be serialized and persisted. Use `unit` if you don't - * need other state beyond the underlying syntax */ - [@deriving (show({with_path: false}), sexp, yojson)] - type action; - /* An internal action type to be used in actions which - * update the model. Use `unit` if the basic projector - * actions (type `action`) above suffice */ - let init: model; - /* Initial state of the model */ - let can_project: Base.piece => bool; - /* A predicate determining if the given underlying - * syntax (currently limited to convex pieces) is - * supported by this projector. This is used to gate - * adding the projector */ - let can_focus: bool; - /* Does this projector have internal position states, - * overriding the editor caret & keyboard handlers? - * If yes, the focus method will be called when this - * projector is either clicked on or if left/right - * is pressed when the caret is to the immediate - * right/left of the projector */ - let view: - ( - model, - ~info: info, - ~local: action => Ui_effect.t(unit), - ~parent: external_action => Ui_effect.t(unit) - ) => - Node.t; - /* Renders a DOM view for the projector, given the - * model, an info packet (see info type for details), - * and has two callbacks: ~parent for parent editor - * actions(see external_action type above), and ~local - * for this projector's local update function. */ - let placeholder: (model, info) => shape; - /* How much space should be left in the code view for - * this projector? This determines how the base code - * view is laid out, including how movement around the - * projector works. In principle this could be derived - * from the view, but this is awkward to do so for now - * projector writers are responsible for keeping these - * in sync with each other. */ - let update: (model, action) => model; - /* Update the local projector model given an action */ - let focus: ((Id.t, option(Direction.t))) => unit; - /* Does whatever needs to be done to give a projector - * keyboard focus. Right now this is only for side - * effects but could be extended in the future to - * take/return the model if the projector needs to - * maintain a complex internal position state */ -}; - -/* Projector model and action are serialized so that - * they may be used by the Editor without it having - * specialized knowledge of projector internals */ -type serialized_model = string; -type serialized_action = string; - -/* A cooked projector is the same as the base module - * signature except model & action are serialized */ -module type Cooked = { - let init: serialized_model; - let can_project: Base.piece => bool; - let can_focus: bool; - let view: - ( - serialized_model, - ~info: info, - ~local: serialized_action => Ui_effect.t(unit), - ~parent: external_action => Ui_effect.t(unit) - ) => - Node.t; - let placeholder: (serialized_model, info) => shape; - let update: (serialized_model, serialized_action) => serialized_model; - let focus: ((Id.t, option(Direction.t))) => unit; -}; - -module Cook = (C: Projector) : Cooked => { - let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; - let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; - let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; - let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; - let init = C.init |> serialize_m; - let can_project = C.can_project; - let can_focus = C.can_focus; - let view = (m, ~info, ~local, ~parent) => - C.view( - deserialize_m(m), - ~info, - ~local=a => local(serialize_a(a)), - ~parent, - ); - let placeholder = m => - m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; - let update = (m, a) => - C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; - let focus = C.focus; -}; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 3577c3e344..caf1e342bc 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,4 +1,4 @@ -open ProjNew; +open ProjectorBase; let seg_for_maketerm = (p: Base.projector): Base.segment => [p.syntax]; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 2ca15cc918..2280097b07 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -1,72 +1,156 @@ open Util; -//open Virtual_dom.Vdom; +open Virtual_dom.Vdom; -/* This module, along with ZipperBase, exists to resolve - * cyclic dependencies between Zipper and Projector. All - * projector functionality should be added to Projector.re - * or above unless it would create such a cycle */ - -/* Enumeration of different kinds of projectors. This is - * used as a key when adding new projectors to an editor. */ [@deriving (show({with_path: false}), sexp, yojson)] -type kind = Base.kind; +type t = Base.kind; -/* The projector map is store alongside the zipper and - * maps syntax UUIDs to instantiated projectors. This - * is how projector placement and models are persisted */ -[@deriving (show({with_path: false}), sexp, yojson)] -module Map = { - [@deriving (show({with_path: false}), sexp, yojson)] - type entry = { - kind, - model: string, +//TODO(andrew): docs +let shapes = _ => Nib.Shape.(Convex, Convex); + +//TODO(andrew): cleanup, docs +let mold_of: (t, Sort.t) => Mold.t = + (p, sort) => { + let (l, r) = shapes(p); + { + nibs: { + ({shape: l, sort}, {shape: r, sort}); + }, + out: sort, + in_: [], + }; }; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = Id.Map.t(entry); - open Id.Map; - let empty = empty; - let find = find_opt; - let mem = mem; - let mapi = mapi; - let update = update; -}; /* Projectors currently have two options for placeholder * shapes: A inline display of a given length, or a block * display with given length & height. Both of these can * depend on the projector model and info package */ [@deriving (show({with_path: false}), sexp, yojson)] -type shape = ProjNew.shape; +type shape = + | Inline(int) + | Block(Point.t); /* The type of syntax which a projector can replace. * Right now projectors can replace a single piece */ [@deriving (show({with_path: false}), sexp, yojson)] -type syntax = ProjNew.syntax; +type syntax = Base.piece; /* Global actions available to handlers in all projectors */ -type external_action = ProjNew.external_action; +type external_action = + | Remove /* Remove projector entirely */ + | Escape(Util.Direction.t) /* Pass focus to parent editor */ + | SetSyntax(syntax); /* Set underlying syntax */ /* External info fed to all projectors. Eventually * dynamic information will be added here. Projector * position and dimensions in base editor could be * added here if needed */ [@deriving (show({with_path: false}), sexp, yojson)] -type info = ProjNew.info; - -let info_init = (p: syntax) => - ProjNew.{id: Piece.id(p), syntax: p, ci: None}; +type info = { + id: Id.t, + syntax, + ci: option(Info.t), +}; /* To add a new projector, implement this module signature */ -module type Projector = ProjNew.Projector; +module type Projector = { + [@deriving (show({with_path: false}), sexp, yojson)] + type model; + /* The internal model type of the projector which will + * be serialized and persisted. Use `unit` if you don't + * need other state beyond the underlying syntax */ + [@deriving (show({with_path: false}), sexp, yojson)] + type action; + /* An internal action type to be used in actions which + * update the model. Use `unit` if the basic projector + * actions (type `action`) above suffice */ + let init: model; + /* Initial state of the model */ + let can_project: Base.piece => bool; + /* A predicate determining if the given underlying + * syntax (currently limited to convex pieces) is + * supported by this projector. This is used to gate + * adding the projector */ + let can_focus: bool; + /* Does this projector have internal position states, + * overriding the editor caret & keyboard handlers? + * If yes, the focus method will be called when this + * projector is either clicked on or if left/right + * is pressed when the caret is to the immediate + * right/left of the projector */ + let view: + ( + model, + ~info: info, + ~local: action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) + ) => + Node.t; + /* Renders a DOM view for the projector, given the + * model, an info packet (see info type for details), + * and has two callbacks: ~parent for parent editor + * actions(see external_action type above), and ~local + * for this projector's local update function. */ + let placeholder: (model, info) => shape; + /* How much space should be left in the code view for + * this projector? This determines how the base code + * view is laid out, including how movement around the + * projector works. In principle this could be derived + * from the view, but this is awkward to do so for now + * projector writers are responsible for keeping these + * in sync with each other. */ + let update: (model, action) => model; + /* Update the local projector model given an action */ + let focus: ((Id.t, option(Direction.t))) => unit; + /* Does whatever needs to be done to give a projector + * keyboard focus. Right now this is only for side + * effects but could be extended in the future to + * take/return the model if the projector needs to + * maintain a complex internal position state */ +}; /* Projector model and action are serialized so that * they may be used by the Editor without it having * specialized knowledge of projector internals */ -type serialized_model = ProjNew.serialized_model; -type serialized_action = ProjNew.serialized_action; +type serialized_model = string; +type serialized_action = string; /* A cooked projector is the same as the base module * signature except model & action are serialized */ -module type Cooked = ProjNew.Cooked; +module type Cooked = { + let init: serialized_model; + let can_project: Base.piece => bool; + let can_focus: bool; + let view: + ( + serialized_model, + ~info: info, + ~local: serialized_action => Ui_effect.t(unit), + ~parent: external_action => Ui_effect.t(unit) + ) => + Node.t; + let placeholder: (serialized_model, info) => shape; + let update: (serialized_model, serialized_action) => serialized_model; + let focus: ((Id.t, option(Direction.t))) => unit; +}; -module Cook = ProjNew.Cook; +module Cook = (C: Projector) : Cooked => { + let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; + let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; + let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; + let deserialize_a = s => s |> Sexplib.Sexp.of_string |> C.action_of_sexp; + let init = C.init |> serialize_m; + let can_project = C.can_project; + let can_focus = C.can_focus; + let view = (m, ~info, ~local, ~parent) => + C.view( + deserialize_m(m), + ~info, + ~local=a => local(serialize_a(a)), + ~parent, + ); + let placeholder = m => + m |> Sexplib.Sexp.of_string |> C.model_of_sexp |> C.placeholder; + let update = (m, a) => + C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; + let focus = C.focus; +}; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index ba0af71349..aa15a0cacd 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -11,7 +11,6 @@ let init: unit => t = ancestors: [], }, caret: Outer, - projectors: Id.Map.empty, }; let next_blank = _ => Id.mk(); @@ -58,7 +57,6 @@ let unzip = (seg: Segment.t): t => { ancestors: [], }, caret: Outer, - projectors: Id.Map.empty, }; let pop_backpack = (z: t) => diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 49c477cb9d..34af4fc0e0 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -25,8 +25,6 @@ type t = { backpack: Backpack.t, relatives: Relatives.t, caret: Caret.t, - [@opaque] - projectors: ProjectorBase.Map.t, }; let update_relatives = (f: Relatives.t => Relatives.t, z: t): t => { diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 540fd78306..5334a23774 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -44,7 +44,7 @@ type select = | Term(rel); /* This type defines the top-level actions used to manage - * projectors,as distinguished from ProjectorBase.external_action, + * projectors,as distinguished from external_action, * which defines the actions available internally to all projectors, * and from each projector's own internal action type */ [@deriving (show({with_path: false}), sexp, yojson)] diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxCore.re index 87f4600eaf..b1d734a8cf 100644 --- a/src/haz3lcore/zipper/projectors/CheckboxCore.re +++ b/src/haz3lcore/zipper/projectors/CheckboxCore.re @@ -1,5 +1,5 @@ open Util; -open ProjNew; +open ProjectorBase; open Virtual_dom.Vdom; let of_mono = (syntax: Piece.t): option(string) => diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldCore.re index 5df105e410..b21ab12721 100644 --- a/src/haz3lcore/zipper/projectors/FoldCore.re +++ b/src/haz3lcore/zipper/projectors/FoldCore.re @@ -1,5 +1,5 @@ open Util; -open ProjNew; +open ProjectorBase; open Virtual_dom.Vdom; open Node; diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoCore.re index 03365f44cb..5ab9eb5160 100644 --- a/src/haz3lcore/zipper/projectors/InfoCore.re +++ b/src/haz3lcore/zipper/projectors/InfoCore.re @@ -1,6 +1,6 @@ open Virtual_dom.Vdom; open Node; -open ProjNew; +open ProjectorBase; let mode = (info: option(Info.t)): option(Mode.t) => switch (info) { diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderCore.re index fc74f325c0..2a73c6d012 100644 --- a/src/haz3lcore/zipper/projectors/SliderCore.re +++ b/src/haz3lcore/zipper/projectors/SliderCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjNew; +open ProjectorBase; let put: string => Piece.t = Piece.mk_mono(Exp); diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFCore.re index 91c3864092..4ad36621ad 100644 --- a/src/haz3lcore/zipper/projectors/SliderFCore.re +++ b/src/haz3lcore/zipper/projectors/SliderFCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjNew; +open ProjectorBase; /* Some decimal places necessary to avoid becoming an int */ let float_of_float = s => s |> float_of_string |> Printf.sprintf("%.2f"); diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaCore.re index e735fd54e2..f66fba5a64 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaCore.re +++ b/src/haz3lcore/zipper/projectors/TextAreaCore.re @@ -1,6 +1,6 @@ open Util; open Virtual_dom.Vdom; -open ProjNew; +open ProjectorBase; let of_id = (id: Id.t) => "id" ++ (id |> Id.to_string |> String.sub(_, 0, 8)); diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 165a63c3e9..3cee684080 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -9,7 +9,7 @@ let startup : PersistentData.t = statics = true; elaborate = false; assist = true; - dynamics = true; + dynamics = false; evaluation = { show_case_clauses = true; @@ -38,618 +38,596 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - bf55461b-033f-43d1-b6da-27c10c213813)(content(Comment\"# \ + 839d3632-542c-4664-9b9f-991ca1ebdfbe)(content(Comment\"# \ PROJECTORS #\"))))(Secondary((id \ - e098d2d5-046e-4c89-92cb-578b19937d9e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 63c09322-1c5f-464a-8cad-d18f9b89c661)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f005a4b3-1215-46da-bb69-b4ba80d3b215)(content(Comment\"# Some \ + 7852672c-1f78-4cd4-975b-53ce4b49c74f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 40d40fd1-640a-44df-9be7-c3aa0d878983)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 66540dac-21e0-42cd-94a2-d632df946806)(content(Comment\"# Some \ kinds of syntax have dedicated GUIs. \ #\"))))(Secondary((id \ - 99b70603-66d5-4639-aa9b-b43dee1cbec2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1ee1e8c0-6aba-4eab-b66f-636823e5a4e8)(content(Comment\"# The \ + 44a2d412-ea2c-42b0-93af-6ab71ae6947a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 76c40380-769b-4e08-a2ed-f97270bbf7b8)(content(Comment\"# The \ menu at the bottom left shows which GUIs \ #\"))))(Secondary((id \ - 14e1e998-352c-4a0c-b841-453e9b53c173)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 498d6ac4-e1be-4bb9-a34e-292b712d3e2d)(content(Comment\"# (if \ + f01b0776-1ae2-4a04-8b7c-33b90d1a2d7f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b79fb05b-5698-4dae-8a74-918847e09087)(content(Comment\"# (if \ any) are applicable to the current term \ #\"))))(Secondary((id \ - 8d86e54f-bf4c-4083-8064-2b2cc8213b0d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6cf459f4-d2ab-4fb6-9ccd-b7bdf11332e9)(content(Comment\"# \ + 5de09f9f-7cff-4fc7-91e0-4d32c875a1cd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 24629d6d-f74e-4707-b171-d39b3878dcfb)(content(Comment\"# \ indicated by the caret. \ #\"))))(Secondary((id \ - 22078138-3eb1-4d82-a065-6cf4efcf650b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e8441807-2e12-45ea-bd3c-7310c29f55e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6189e770-4a3c-4865-8318-db732c97ae55)(content(Comment\"# Fold \ + b4aec306-3a4a-4324-b3be-17b5674e6e1d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 049b4942-f842-4dc4-9d8d-71d25f356799)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d7889f6a-394f-453f-8dc6-00aed3a0c741)(content(Comment\"# Fold \ projectors cover terms with abstractions. \ #\"))))(Secondary((id \ - bb768d63-d4b0-4692-bb08-d44f4f8b49ed)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b448bdd6-945d-43cd-8bdf-1d4b925488d1)(content(Comment\"# 1. A \ + e5994a1a-ef46-46fb-9000-1420ec521e4b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cf954a50-524c-4574-8d84-cf615024a484)(content(Comment\"# 1. A \ simple fold roles up any term, replacing \ #\"))))(Secondary((id \ - 7ae00ecc-713e-4569-91c8-2b95c982b7dc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - df74c8e6-e684-48b2-9645-fa3ac39f2321)(content(Comment\"# it \ + b33a1b26-4f01-4ee6-adb0-be298cba1a3b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c5197aa1-bba5-4a1c-b4ba-ff947e181b23)(content(Comment\"# it \ with ... until it is expanded again. \ #\"))))(Secondary((id \ - d7bb6d4a-5b4c-405c-930d-3c5a876f3d41)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 551dabf1-bf90-4061-b622-5e509e6e4f38)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7bfca1ff-5ce6-4c12-a78a-86a699e8dfb4)(label(let = \ + a2e0fb0e-f392-47b9-ba7d-a14f0ff9d73b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 03002626-68ae-4caa-b0d7-c700b854f783)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1bd97d7a-27ab-44dd-ad74-c347f02e1358)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bd3529f5-9b3a-4c11-b6ce-dda813e0fb12)(content(Whitespace\" \ + b1800a80-c7da-466f-abe1-f1ea77ce1cb5)(content(Whitespace\" \ \"))))(Tile((id \ - 9cf96ad2-ebca-4a57-8552-efac7177e6d6)(label(fold))(mold((out \ + e0ddc8fc-2990-4485-b911-5968a402e930)(label(fold))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - fddad1a7-251c-4557-89a8-e4ab674677a9)(content(Whitespace\" \ + eb16b8b3-4cc6-4d27-a098-784a586742b1)(content(Whitespace\" \ \")))))((Secondary((id \ - d5318305-ade6-4c55-87c3-66fee19e03d5)(content(Whitespace\" \ + b1a52743-8b9e-4381-a6eb-baeb198c1dd5)(content(Whitespace\" \ \"))))(Tile((id \ - 44567071-4f8e-4c42-9d9c-e67c7855dd77)(label(\"(\"\")\"))(mold((out \ + 9965e1fa-27b0-4b2f-adc6-851c3408413b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab128650-72bc-4c5c-bc3c-17e6ad51a81c)(label(\"(\"\")\"))(mold((out \ + 19912e02-424d-48a1-add8-d49c57610c61)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8b7bc2db-cf6e-40a5-82c8-be3a11866150)(label(\"(\"\")\"))(mold((out \ + ca57a8e1-1449-4eed-9a06-679e89a47166)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4f879f8e-6cda-45a1-9a95-2fc8a8f648c1)(label(\"(\"\")\"))(mold((out \ + 1215d8f5-242c-40f4-a63c-5827bd922228)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 81a5b8d5-bc01-493f-8c7d-645540f2c736)(label(\"(\"\")\"))(mold((out \ + d9468bf5-d453-493c-a653-b43acc9d9380)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3a4b2745-4e63-4560-921e-c4cdbda17552)(label(\"(\"\")\"))(mold((out \ + f4c124bf-1fd9-4f21-8dc8-62244bc7fde9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8d37fa5d-10d5-4534-a396-3c9b9e6d1aa1)(label(\"(\"\")\"))(mold((out \ + 4d17ef11-4d13-41b0-80e2-a0400113d25e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4786c0c1-c6af-446b-a14b-d347ac58d430)(label(\"(\"\")\"))(mold((out \ + 169d2be7-e89a-4073-80ba-3219d3e5fa55)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84e53a2e-ece8-4d6e-9b88-60c305064e8e)(label(\"(\"\")\"))(mold((out \ + 2ab02541-7ebb-4f37-abfe-131932adc96c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f8cb8a86-f40b-472e-9c79-41c72b5a5380)(label(\"(\"\")\"))(mold((out \ + 8ac33df1-d7a6-44da-ace8-fa718ef85256)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 966f9b94-9042-4555-9559-2b8d31b6dca0)(label(\"(\"\")\"))(mold((out \ + 59fa8438-17e4-427d-9b38-b2433a463b9f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d638f071-3373-454f-ab7a-e3f807d2a26e)(label(\"()\"))(mold((out \ + e1933fee-1819-4f8f-9286-3aa6a273f937)(label(\"()\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(Secondary((id \ - 437072ef-1a10-454b-aa7d-69c6b8aabb2d)(content(Whitespace\" \ + 68ccf417-53c7-41de-97ca-32e131f1871b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ac562e3f-6d57-454f-809b-3b4a4dea90b4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f6087b46-5280-408e-8618-d682587f8522)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7da3277d-2510-48eb-8985-54f02e53142a)(content(Comment\"# 2. A \ + 59478e6b-0639-40f7-b9f8-f95b6f280c56)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 51f724a2-5f49-4850-bc66-9a525e67350e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 73b09732-95a9-4f19-9dc1-0e7417aa5020)(content(Comment\"# 2. A \ semantic fold covers a term with a property: \ #\"))))(Secondary((id \ - 6ef1a5eb-53e1-4dff-aa31-780506ff447c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9df325c2-436d-4234-965a-7b3449e3e233)(content(Comment\"# \ + c1b9dbee-35c0-4d1e-8320-439f3292869f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a0382b44-f7ca-4ba5-b511-e22edcc8fda5)(content(Comment\"# \ Click to toggle inferred & synthesized types \ #\"))))(Secondary((id \ - 33b6a395-b5da-4ac7-97bb-268fb12c804b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 04185330-1edc-4e4d-be3e-1092df66cc74)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d887ee56-f82b-48cf-82ab-467c9baf402c)(label(let = \ + 716bc6ec-c0cd-453c-9b58-4549973f3966)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 39371a43-1d6e-4d01-bca9-ff9245f72a6a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b55740a9-239c-4a9f-aa2e-00572a916cc4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7d8bafa4-edf9-42a6-9fb8-f8bc7b35e2a1)(content(Whitespace\" \ + 22581933-45f1-400b-a105-b1f43ecac7cf)(content(Whitespace\" \ \"))))(Tile((id \ - d666d484-8652-4be5-b7bd-371c7a3b30d2)(label(folds))(mold((out \ + f136ce22-2983-4343-b7c7-9508f3a23569)(label(folds))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - e7af10b2-bd04-4afc-a5c7-0e99bb020859)(label(:))(mold((out \ + e1195181-4d6b-44ba-ac0e-f540c0a9f2c8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - cee1670d-0f18-45be-a7b1-b3be4f15ad73)(content(Whitespace\" \ + c9d586da-f68d-4bab-9f11-4687eed1cb8e)(content(Whitespace\" \ \"))))(Tile((id \ - 8f0882d0-cfab-4488-a2f8-5d9380774d73)(label(\"(\"\")\"))(mold((out \ + 22a6d81b-2d46-4ca3-b6df-af82841356d6)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 24cb2e53-f836-4a5b-8d2b-6b2c513f084b)(label(Int))(mold((out \ + 87de0e4a-eb13-4d2b-b831-7a5549754ddd)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e36fd936-518f-4fe7-902d-d4828602d402)(content(Whitespace\" \ + 36070a1c-0f8b-4f39-95a0-70df3d90acb0)(content(Whitespace\" \ \"))))(Tile((id \ - 284ef493-bf58-46f2-8b39-ff57e4b1b617)(label(->))(mold((out \ + 1f23f0a0-9d6e-43e7-8590-93751c4c7b7d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort Typ))((shape(Concave \ 6))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4427eabc-5119-4b12-b4ed-b0c21f921ad6)(content(Whitespace\" \ + f757daf9-0456-4349-9503-56f20f095bd1)(content(Whitespace\" \ \"))))(Tile((id \ - bb5ceb72-956d-4e60-9e60-1f4455014432)(label(Bool))(mold((out \ + e470b910-7c44-4590-ab94-92b1fa956a10)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 40040726-dbff-4b42-83a7-cbf6fbf702bf)(content(Whitespace\" \ - \")))))((Secondary((id \ - e664dca1-6b6b-43df-92c5-ce0b47bdb5d3)(content(Whitespace\" \ - \"))))(Grout((id 9082db6a-3383-4a57-b3bd-9ab54b90478e)(shape \ + 747b1c0e-27eb-4bca-ac18-2b95e25f6777)(content(Whitespace\" \ + \")))))((Grout((id b91bf7a7-bce7-4454-9c98-72e8dbc3825f)(shape \ Convex)))(Secondary((id \ - ebb3d015-fffe-4485-9bcb-b19791b5ad3c)(content(Whitespace\" \ + 89036531-ec98-4137-9432-7adb0e25f2c5)(content(Whitespace\" \ + \"))))(Secondary((id \ + eb4c10b9-a1d3-4d40-8fbd-d97a6234693c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 96a1a7fb-bf6d-4144-aa0e-576d21c56660)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 918b829b-2205-4701-a649-cca45eef92f4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 45376ae5-fc43-4210-97b3-7a9e0b1b99f4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0e0d3f24-3e45-4a08-9e11-57e099b25b60)(content(Comment\"# \ + 68a8ba48-f056-4fab-ba87-ad1652406841)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1ec93f5e-8539-4275-94bd-3da9ad12f029)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b8f0815c-71e4-4b26-965f-826fe8006bbc)(content(Comment\"# \ Projectors on literal data are called livelits. \ #\"))))(Secondary((id \ - 37a79098-c967-402b-bf91-ab4b629dc21f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8b076343-a3af-45ed-89ff-3d0767790f0e)(content(Comment\"# Three \ + bb46a6cf-8d4f-4c5a-8ecd-e97ad673325f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2c50b4ef-1329-40f0-9591-697fde800c22)(content(Comment\"# Three \ base types literals use inline views: \ #\"))))(Secondary((id \ - efb4a7a7-3b10-4b9a-867c-9a66f7287dfe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1d5b50ce-19ef-4aa2-b3cb-3eb7fc64e8ee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a18674df-4b6a-4c84-b7f4-87c03f381e31)(label(let = \ + e58256d4-c344-4002-b38c-c83b916344d2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 698805b1-972f-4967-a92c-475799b0e28a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f3a5128b-830a-48ac-96d9-36e4c5940f46)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 97f07be8-f98a-415d-b336-e7fe26e35fc7)(content(Whitespace\" \ + 187fae87-efa0-4435-8716-55412cca57b8)(content(Whitespace\" \ \"))))(Tile((id \ - 1d58f652-c3f9-4c6c-b99a-c802af5f6784)(label(guard))(mold((out \ + ed3eb462-ef47-4daf-8f6a-37be6e7d8ada)(label(guard))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - ac204c96-278f-4702-b972-fe41e8017b71)(label(:))(mold((out \ + b773c416-ab2f-4715-be45-97bde6800bbc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3ece060c-beaf-448c-b598-c798bd1fb080)(content(Whitespace\" \ + dfa002bb-ca23-4a63-b110-97558702330a)(content(Whitespace\" \ \"))))(Tile((id \ - b17d0141-6b78-4f08-9c3f-b46b343293ee)(label(Bool))(mold((out \ + e9792ded-9b39-4ca7-8a8a-c9facbb9731d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 11f0955b-a96f-40ad-aed4-6913bdb69a6c)(content(Whitespace\" \ + ebf57d60-c922-4d8b-b15e-51801e111404)(content(Whitespace\" \ \")))))((Secondary((id \ - 8153f573-1082-4d52-b385-8658f14147f7)(content(Whitespace\" \ + eb2a9f3f-4e39-4c2d-84e6-4b6f0ce83e8a)(content(Whitespace\" \ \"))))(Tile((id \ - f4f1d912-c312-4809-9d84-3cd729a50e40)(label(true))(mold((out \ + f6919fea-2166-4729-ad2a-760836b59b9d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9e2139ea-9055-4718-b544-a68f5017d28b)(content(Whitespace\" \ + 47f4b5ec-1b70-4f6d-b72f-e7a1f3f073e6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c1ccf339-4fef-4a94-9e5e-b5ccf1e142f5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 11b25da0-6db8-47d8-9b71-17fb13a30887)(label(let = \ + 50873043-dc1f-4390-adb8-64eb3f1b1500)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + edc37e22-efb3-46df-84db-9fa28ba977de)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8f84e448-40f0-4d06-9105-ec3183494ebd)(content(Whitespace\" \ + df26fb0f-bf28-4434-a362-f6adc2ab7594)(content(Whitespace\" \ \"))))(Tile((id \ - 35cc6b95-3222-4789-ac68-ae279d3d58ec)(label(phase))(mold((out \ + 00ef5c50-189e-4407-a261-c315638414e0)(label(phase))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - f2482f4d-d157-4b49-bb8c-ad7dc265fd7b)(label(:))(mold((out \ + 1cf88388-1634-4341-879f-e2acf0032018)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 28cbb49c-2124-4897-9732-f8aa7a698d4e)(content(Whitespace\" \ + 8af8bd92-9b73-49d5-9f76-b5042135aa1f)(content(Whitespace\" \ \"))))(Tile((id \ - 97202a86-9a46-49f8-a560-13c3a3cd73bc)(label(Int))(mold((out \ + 675d05b7-637c-447c-8dc9-c894b8d349ac)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ae0a9a22-aa5b-4ae5-afa5-66e57f241d0a)(content(Whitespace\" \ + 8c5b596d-9200-462a-ad9d-0364695bc346)(content(Whitespace\" \ \")))))((Secondary((id \ - 509f12aa-cf92-41d2-ae41-0d9d766735b0)(content(Whitespace\" \ + 12dc2951-7e8b-48d2-a9c7-3f34a1417350)(content(Whitespace\" \ \"))))(Tile((id \ - 15a3dabb-c4ee-41c9-adce-a04d217a118e)(label(44))(mold((out \ + d6880462-81c7-4fa1-b374-c493cc1828e5)(label(44))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 70c3f042-ed70-4c04-be8e-05f984583035)(content(Whitespace\" \ + ee8f026d-19d1-4a7f-bf8c-85d7869ab9b7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cb3a42f1-d906-4d15-821d-c0457d1083f0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5525c76a-a6c1-4e41-9d14-ccd2690dacd1)(label(let = \ + 2fcf937c-6f2c-4c0b-a465-12f0973971f0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + de181b8e-97f7-42f1-963d-79176e4d21d1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c5249efb-0d1f-497f-9bdf-e46cf350e482)(content(Whitespace\" \ + 609bc50b-4dfd-43e0-afae-a7799aa6d79e)(content(Whitespace\" \ \"))))(Tile((id \ - 37a12141-5277-4e94-bfb0-1faeaf325a64)(label(float))(mold((out \ + ae0bb825-2c30-4c14-be37-b24d1bd94f24)(label(float))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - c3886630-7e8e-4b5d-8300-d973d222bf70)(label(:))(mold((out \ + 6f220eb2-b439-4059-8e5e-554c01b9c47d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 45d02f72-da15-44b6-b02e-a5162666a07d)(content(Whitespace\" \ + 0bba02b8-ad92-4cff-85d8-211b6b66c444)(content(Whitespace\" \ \"))))(Tile((id \ - 3eecc80d-1a01-4364-9d05-01553c3ae59d)(label(Float))(mold((out \ + 80e208c4-b6c0-4af5-a123-eb86cd93c489)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8b9b5395-e8d6-44f6-a1a4-8e80baa39b78)(content(Whitespace\" \ + 30c04170-2e05-4511-8a36-10120c297b55)(content(Whitespace\" \ \")))))((Secondary((id \ - d58a9df6-b04d-4117-9b98-73f2ebc090f4)(content(Whitespace\" \ + 39347a69-1faf-49a2-91d9-0533db9697dc)(content(Whitespace\" \ \"))))(Tile((id \ - fccb7933-86a8-4d60-b885-234abd132b90)(label(79.00))(mold((out \ + 039fcdc6-4035-4944-9980-53ac5e9603ef)(label(79.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 123dd104-7a4f-4c5e-9240-32d4c04b6bf6)(content(Whitespace\" \ + f818e814-2233-4df7-b564-78b21de722e6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee855910-ba64-4f1a-99d5-017cedd6ae85)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e324c3b6-6bb3-40d3-a2b4-4cf272306ff5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 328c6682-1c08-4aab-a05d-7ab232e8c70e)(content(Comment\"# Inline \ + 678ca4b6-1929-44b9-985f-1ba6cc735caf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ffbe3dad-2d25-4b29-bdfd-f88fc54f6a92)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8fe2ddff-4179-4d7b-b80a-45a413b4cf14)(content(Comment\"# Inline \ error decorations (same as for tokens) #\"))))(Secondary((id \ - 576032f7-84a4-414f-9b15-0f091f538b6e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bf78e9e0-232e-4da2-9b07-01ba791b9383)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 94ea22f4-35cb-45c8-bd43-8977de4760d3)(label(let = \ + fc6e186e-0741-4f54-b3fe-15bf1b7fb899)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + def56754-af6d-4896-a59e-0eae7f219001)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 07170c0b-020c-44f1-adfd-da1b5b26f0af)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 821509aa-6469-41bf-ba4e-23e6712f6d15)(content(Whitespace\" \ + f2710892-ac0a-4ca3-88a4-73d52b0fefe5)(content(Whitespace\" \ \"))))(Tile((id \ - 9ffcc05b-a3c2-469a-87a3-2f70e619bb03)(label(\"(\"\")\"))(mold((out \ + 96290555-dfc9-4309-8f47-9f81b2e0cba0)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 545fee50-3ebd-491e-ac90-65058cc90c4e)(label(a))(mold((out \ + 1cdacf98-9383-4806-8b73-f8e654ed0570)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - a170578b-ae1c-431e-816e-07dcddac29a0)(label(:))(mold((out \ + c6a78de3-9eff-4898-b0b8-373a3fdfb589)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Tile((id \ - b0d23be0-4fab-467a-ad85-6f5184d31365)(label(Int))(mold((out \ + a7a2b48c-5fef-45d4-b95f-382006ab5d56)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - 79b0945d-4df7-45ec-be85-d287c3273ce2)(label(,))(mold((out \ + 08c75481-f7a9-45e9-b987-99e5670d9230)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort Pat))((shape(Concave \ 15))(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dafa0103-79be-48e0-aac9-63966ff5b014)(content(Whitespace\" \ + 102832b6-0668-408f-a78f-cbdbcc267d68)(content(Whitespace\" \ \"))))(Tile((id \ - 9c0563fa-f824-4ae5-ac1f-9fc75e0b7e9d)(label(f))(mold((out \ + 61336953-3b37-4a9e-802b-fa09c2fb1de9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 1a182b4d-1891-420b-bfce-6b7793bfcaa3)(label(:))(mold((out \ + 7a7dfe66-9c7f-4a34-8153-6c7862556406)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 649ef1f6-c81d-4743-8e36-1a7b615d35c7)(content(Whitespace\" \ + b399ab42-72ea-413e-9b0d-bc9e512a2df5)(content(Whitespace\" \ \"))))(Tile((id \ - 94aaaf87-3e34-4ac2-99fc-4b8b85a55400)(label(Float))(mold((out \ + 67d99393-1a85-461d-aa60-e50ede33bba6)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6c6ee1f9-823d-4077-a183-3572210f7803)(content(Whitespace\" \ + 79e6ba9b-22b2-4f8d-a116-2c40511654b0)(content(Whitespace\" \ \")))))((Secondary((id \ - 96496c4d-eec0-4a6e-a82f-06e44ad10f9c)(content(Whitespace\" \ + 896f68dc-75de-4fb9-85eb-8bb9f8a4a79e)(content(Whitespace\" \ \"))))(Tile((id \ - fe9aaa1c-473b-4de7-b8f6-8e76ada94f1a)(label(true))(mold((out \ + 9ad71f62-f693-4412-8b5f-2ccaf4d30ea8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 22c1a26d-c217-4da3-ad15-837c9ffd3467)(label(,))(mold((out \ + 21b6784a-4ef6-45f8-9419-9d33b5186b98)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort Exp))((shape(Concave \ 15))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3daf019d-f290-481e-ac80-ef35cb2ec7fd)(content(Whitespace\" \ + 0bb6d4f2-7a4c-44b8-8904-1d9ac54baf40)(content(Whitespace\" \ \"))))(Tile((id \ - 4e85dfc9-08a3-4790-a681-c752eb512780)(label(28))(mold((out \ + ca930d70-7af6-49bb-a15b-5a2c45ed3ef2)(label(28))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c7ca7822-6292-4cfe-88c1-4639f6178f6c)(content(Whitespace\" \ + c3f711c1-a0b6-4628-bc01-f77346e01f99)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 09072f7a-f9c1-4115-bcc3-63f6992ca758)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 83fa32e9-6a11-44ea-90ce-8b90af9e4eba)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5a608c49-93fc-4cd8-84fd-e9a827156c9e)(content(Comment\"# The \ + e86efb2d-8296-4644-be39-7dddae194b35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 979429e8-a444-48af-a358-814b5d8a3f35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3365667c-c484-41be-9fe8-f0bbd89bc0a0)(content(Comment\"# The \ String base type get a multiline view: #\"))))(Secondary((id \ - 18665233-028b-4f1a-b37f-8f9a4ddf0d9b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 727addbe-c792-45e7-a99a-ddc52d790583)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - af3ebbab-5c85-4573-a2d5-fcce429f53f7)(label(let = \ + b026a077-d94a-4d61-9e76-ef6c6cf60add)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fc4af030-e857-4260-a90a-249c8dd69e98)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4cce1cfe-2ec4-4e80-9542-d35e98a41bb3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7158ccc1-a928-4a59-96a6-6bc9b775855e)(content(Whitespace\" \ + 0b5f1c33-3aba-485d-a121-381c02a933ee)(content(Whitespace\" \ \"))))(Tile((id \ - cbbe2c5e-1e28-4213-9aad-0664b6bce817)(label(_))(mold((out \ + f9580b33-7de6-419e-a6c4-25fd0872e54b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 7895d806-35ca-4f20-a650-7726a345462e)(label(:))(mold((out \ + 199d7f9d-96c1-4dc3-b3d1-18f994640c58)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2c6409ba-f92f-401e-831b-6c0287cdbe23)(content(Whitespace\" \ + 0adf0994-46eb-4c56-ab40-b6fd4088a073)(content(Whitespace\" \ \"))))(Tile((id \ - 0fe96735-f003-416d-beb5-cfa6a7cc7e92)(label(String))(mold((out \ + 53a98ffc-0a04-4c75-ae71-9fb18e1e56b2)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c8ede035-c9fa-4cb6-8472-e50c663c707f)(content(Whitespace\" \ + 120b3b57-5124-4fff-aac9-63f11c51ec75)(content(Whitespace\" \ \")))))((Secondary((id \ - 3b2e0893-f2c1-4090-b86c-d54ffeb38367)(content(Whitespace\" \ + a0eb09be-46ac-4018-8761-a8aefecae3ba)(content(Whitespace\" \ \"))))(Tile((id \ - b7f2f293-0186-4272-b358-c52d22b4bca4)(label(\"\\\"a\\\"\"))(mold((out \ + fbe62b63-c07e-4017-9c6c-a8c99d2cb333)(label(\"\\\"a\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5d8829e0-6392-42d5-8a5a-b69090f77d70)(content(Whitespace\" \ + 3453ff35-5faf-450e-b528-818492f09e34)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 20b698b3-0a27-4aa8-a6f2-42f0c6c4771c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 29f3f0d1-7d41-488c-beec-45a4ae29fe4b)(label(let = \ + a38dc73d-a7d2-4fd2-a056-65ea78c50eca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dd3726b8-5611-4fda-b7ad-cd966012a640)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c90454a7-0176-4f4a-ae8d-31c3d02e6e1b)(content(Whitespace\" \ + f424b92e-ef00-4332-8520-63a320749876)(content(Whitespace\" \ \"))))(Tile((id \ - 572f08fb-1b50-4bac-9fe8-7b219c22fddc)(label(__))(mold((out \ + fb096b51-aee1-499e-bceb-319be015b8a7)(label(__))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 1a4e2586-5e23-4747-996b-545e14d7aa8d)(label(:))(mold((out \ + 83e7b9b2-9297-4b2e-a4ec-4de76044a7db)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - daeaf97e-c450-4286-ad38-2eaf5077c46f)(content(Whitespace\" \ + 973187f1-98ad-4c7a-a5b4-bb103bd5dde6)(content(Whitespace\" \ \"))))(Tile((id \ - 2f4a9017-a6bd-4039-98f3-2931f819b090)(label(String))(mold((out \ + 518ba4c0-71ab-4eab-89ac-942ed9ddc99a)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 01bf64e3-31dd-41e9-bdca-2c6074d8dbb6)(content(Whitespace\" \ + 71812c46-4ca4-4ec8-906c-3e32f4813308)(content(Whitespace\" \ \")))))((Secondary((id \ - 8632b375-6f55-461f-85e8-1576e0395169)(content(Whitespace\" \ + c2cacfb8-fe15-4219-8f87-cc49b1c4e96f)(content(Whitespace\" \ \"))))(Tile((id \ - 9874058f-1a2d-4d55-a864-7c18e851219a)(label(\"\\\"\\\\n\\\"\"))(mold((out \ + 6933776c-5618-4e4f-b618-17c44b9f2380)(label(\"\\\"\\\\n\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4c54745b-6990-4d49-b8c8-954752e31a8f)(content(Whitespace\" \ + b4efd185-9b2e-448d-b8a4-e66b8704a524)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cdc918e3-f69f-4449-bba7-1223610b4f25)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 684d40ea-cac8-428e-a28e-09166c8f64ea)(label(let = \ + 60824984-80f3-4af0-bfaa-3e0cdc4fb5b9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0cb7893a-abe6-4357-9ada-08475043643a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 42be8063-4c3b-4ddc-9a10-1ee2d871930b)(content(Whitespace\" \ + 99fe31ef-a411-4ba8-b70a-e8018c99c543)(content(Whitespace\" \ \"))))(Tile((id \ - 4a3502dc-eb20-4bd4-86c1-b81b17da3b56)(label(___))(mold((out \ + c3e5f545-957e-46b4-85f2-81136c37e9d3)(label(___))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 837e727b-2e5a-4475-aa21-a4cb6ffe1181)(label(:))(mold((out \ + 3d056330-a6d3-4ba4-9026-19d12169efdf)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 75fcb4ef-d3c6-4b2b-820e-b33093026280)(content(Whitespace\" \ + 2b1dd229-e949-47ef-90de-c6c03c92aa40)(content(Whitespace\" \ \"))))(Tile((id \ - 1f6f9bb9-e99d-4762-80ee-ff4672c5d92e)(label(String))(mold((out \ + 74c741d7-ca4c-48b8-b77a-4fd1a9f03d9a)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 74f1dd6a-c4b0-4693-8bbe-d392cac8af6f)(content(Whitespace\" \ + a2afb218-2987-4121-9b9a-d2489efb5fd0)(content(Whitespace\" \ \")))))((Secondary((id \ - 3688eaa6-6c65-4150-bbc6-8d5d10b29653)(content(Whitespace\" \ + 2156eb35-c6e8-4901-9930-6d83a7757366)(content(Whitespace\" \ \"))))(Tile((id \ - be90d682-69a8-4d88-b6e8-2e598508d07d)(label(\"\\\"a\\\"\"))(mold((out \ + ae96e48b-2900-4418-aaa2-021c7f9e2445)(label(\"\\\"a\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4dd25af6-b9c7-4bf5-96a9-68804aa4e32c)(content(Whitespace\" \ + 7aee6d0a-34c7-4410-b740-c29c9e87d147)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c0537d94-4c10-488f-8131-28390b1a9044)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e5747904-8e62-450d-92a6-24e33eef1b98)(label(let = \ + 64a004c5-9e17-40d2-a032-0065c7681a29)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8a42b824-69ea-478f-a054-6fbdb0989492)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 46f548a9-dc70-4079-9ac1-e04fcef8325a)(content(Whitespace\" \ + 466f984b-a359-4bf9-8a37-6ca5ed434322)(content(Whitespace\" \ \"))))(Tile((id \ - d9e31c14-91f1-4669-8f35-580ba96005dc)(label(____))(mold((out \ + ccc8f5c0-68b7-4d88-9046-7b9b5c992f2a)(label(____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - dd5f9e26-e6a5-411a-8b9a-646bf7e1dd56)(label(:))(mold((out \ + fa7d3ffe-9f7b-4b7a-9bf3-a96e2d823f74)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 636ec5f1-8224-4f50-8ae5-8a00336c2154)(content(Whitespace\" \ + 9d9197ee-c296-4aac-8444-c32b8b0ab927)(content(Whitespace\" \ \"))))(Tile((id \ - 32a16566-2e00-49fa-af1e-8b12bc29188c)(label(String))(mold((out \ + c18ac778-b646-4196-a1ff-a44e3bee969f)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 03fc1512-8526-4b7d-8351-87a55a464e9f)(content(Whitespace\" \ + ab964d90-7b6d-460d-b381-017c18d835db)(content(Whitespace\" \ \")))))((Secondary((id \ - 47cdba0a-786c-41b6-b582-3aa7dca80b01)(content(Whitespace\" \ + abf7af94-43de-44e3-9d8d-e6ebc530db65)(content(Whitespace\" \ \"))))(Tile((id \ - d07452c2-a421-4bb8-88c8-48c1d0b9c0c6)(label(\"\\\"d\\\"\"))(mold((out \ + 290e3659-6fa6-40cb-8c1b-ac6cd023ec24)(label(\"\\\"d\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1beb033b-f54b-47bd-9c79-0452aed00820)(content(Whitespace\" \ + 6a7d93a2-5994-430e-9af0-bd9589322e11)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 53f14ce5-fcc7-4402-9503-c3300510539c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d47d24e1-08c2-4437-ae32-cde10f35836b)(label(let = \ + 5ecffb3e-af50-42df-8261-297971ecbc89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 63be4dcd-6732-407b-8d53-7fea1afada1f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b7e4a56c-e3ec-4d8a-b6b3-8011d81a9b06)(content(Whitespace\" \ + 8f6b259a-e911-4142-8ace-856894a600dd)(content(Whitespace\" \ \"))))(Tile((id \ - 395260a5-12fa-43a2-8c9c-6a6e06eef6f2)(label(_____))(mold((out \ + e9c88b7e-0cbb-4ba0-b05b-9e35aab816ca)(label(_____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 087114b8-e5fc-450c-9e26-f9f28b1e585c)(label(:))(mold((out \ + 68690388-7f05-484a-845d-4210edcd623f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 95b1868a-3b07-41e5-9ef3-784862e5d5b7)(content(Whitespace\" \ + 034a90cc-adac-41c8-a4bb-9ccd31f81fb1)(content(Whitespace\" \ \"))))(Tile((id \ - 9c355212-19ba-4d85-86a0-75b9ef803777)(label(String))(mold((out \ + 7ea24ee5-62eb-4681-957b-94cc65fa88bf)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 297ac918-1f36-4c2e-8518-c77caca90c57)(content(Whitespace\" \ + 8f6a6709-590c-47b9-869f-774410834477)(content(Whitespace\" \ \")))))((Secondary((id \ - 280eb2c8-643f-4d4d-9f3b-df33caa945c0)(content(Whitespace\" \ + efffbaf4-9dbb-4d2a-bb71-678fb2bcc249)(content(Whitespace\" \ \"))))(Tile((id \ - deda51f8-a793-4c73-9ed5-c6ec959935b5)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + f39a6db7-0ada-441d-bc1e-1fb36ed32248)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 052b371a-cf53-4c02-9501-10e4097d93b1)(content(Whitespace\" \ + 1986daba-75a5-4f61-9ccf-61a32ee8ee67)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 237f85ed-28f9-4b71-92d4-edb0e52a525e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a2cdbd5c-7be0-4e93-8aa1-fdaafd567ee5)(label(let = \ + 29174a34-6c9f-4797-9f06-2e50cc04e5cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 05bc12b0-f868-4792-aec7-42e3fbdf994c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6d312329-c3dd-4e08-8213-b8111c668d93)(content(Whitespace\" \ + c793020b-da6e-4fac-a02e-a9244c9576c2)(content(Whitespace\" \ \"))))(Tile((id \ - 0799ec44-b23d-4bd6-9ca6-3642e5ffdf12)(label(______))(mold((out \ + 4ce05d8f-7462-479d-93e5-5ef0086c1239)(label(______))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - a08f9196-ffe6-4118-a176-af08a557e104)(label(:))(mold((out \ + efb087af-8603-4537-86f5-4740752cb24e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 5fb53f8a-2dda-4ea2-885b-eba67f595c0c)(content(Whitespace\" \ + 348ebb56-49ab-467a-b731-701787ce3e51)(content(Whitespace\" \ \"))))(Tile((id \ - 9d99c82b-4138-44d7-86c7-c51b1919d0ee)(label(String))(mold((out \ + fd09e0a1-9951-47f4-9812-c956334fc474)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - da1b8a72-ad06-40e1-bc01-9603eabac342)(content(Whitespace\" \ + b7f61923-bdaf-40d6-beb2-cd4ac111cd71)(content(Whitespace\" \ \")))))((Secondary((id \ - c75406d6-b682-4fa6-b902-4c1e13b19891)(content(Whitespace\" \ + 53b5a950-623a-4a8d-aa06-132c20bd067f)(content(Whitespace\" \ \"))))(Tile((id \ - a328bad6-82a6-49fc-bdd3-f2cd47dfa037)(label(\"\\\"a\\\\n \ + bf698fb4-161c-4661-bee0-83b364d487af)(label(\"\\\"a\\\\n \ shift\\\\n malicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4cb885a0-8e13-4db2-9cb6-a946c824ff94)(content(Whitespace\" \ + 9f127ead-825b-425a-917c-75891e493bb7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f371c438-e3be-481b-bcbc-0452d8b92d20)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 89cb3965-7bce-40cc-8570-d04edc45e458)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b0104054-5798-4787-9825-c0dbcf4ba7f4)(content(Comment\"# \ + f170b9ec-8415-4394-b4af-f4847ab94cdd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6c929f6f-be4b-4d3d-aea6-5484e367554c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ad2620ef-2a85-4c89-8355-d70ad982c0a7)(content(Comment\"# \ Multiline error decorations #\"))))(Secondary((id \ - 02a3b380-8c00-4e4d-a7a2-e86100f65413)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 147df1eb-f184-4b86-95b1-afc4d00ecdeb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 11296497-3af1-4faa-afe1-2c52d7e6adf1)(label(let = \ + d111adca-6c14-4686-8e2b-3bc92a7af55e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2ecc1f28-c69c-4ac5-8097-419208fdfdb8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c67a841c-8dd5-4bd8-a383-2bc00dee4dae)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ed508733-fa94-49ee-95c0-f293ef1dc34b)(content(Whitespace\" \ + 7aeb7199-8735-49a5-bbaf-ab59465b963b)(content(Whitespace\" \ \"))))(Tile((id \ - e3daf182-c65e-4d0f-aadb-aaec5c918930)(label(box))(mold((out \ + e927333d-2b99-4d83-8c60-fa6b98852d35)(label(box))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 9e491069-ae8b-4201-a74e-f38be8602628)(label(:))(mold((out \ + 0eed961b-cd89-4067-a0ad-d019d3e31f1b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 477b81fe-d002-4fe5-8434-c1a04f9f04b2)(content(Whitespace\" \ + 72fc515f-0889-451d-80e7-550b7e0404bd)(content(Whitespace\" \ \"))))(Tile((id \ - f4054bae-1125-4c6b-9fb2-71535754533b)(label(Int))(mold((out \ + de5b6a9d-6428-47ec-9862-dbf2d397e63e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 849d996f-37ea-4eee-b475-0f07e991ea11)(content(Whitespace\" \ + b5e15dce-f327-41e6-83de-799753bb7341)(content(Whitespace\" \ \")))))((Secondary((id \ - d41ae062-74b6-41b3-acf8-7acfee819ede)(content(Whitespace\" \ + d4249c41-86a1-4f85-b5d3-48146f0d3c67)(content(Whitespace\" \ \"))))(Tile((id \ - e9542f88-6218-4c8a-9d0e-8912cb2af367)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + 6b4aa5cf-e622-4e83-82e7-e7e2ad2c3b3d)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e7933e6a-d02e-4810-b098-3fe0b4211da4)(content(Whitespace\" \ + d200a081-f7d0-49ba-8c4b-1c0037f2d013)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b0484d9f-435a-4c0b-bbad-f35b002f7077)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 45c825b7-43ca-4ead-b66f-b5f1ae0fdfe4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7765adc4-a910-4aa7-b049-d95cbea2c519)(content(Comment\"# \ + 4569aec5-ba4c-4487-abd8-092ea882ab66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 12a34fa0-0ca0-4a69-b498-15659cb8f3b1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 530085f2-2212-4a55-a274-ba32f0c3ce50)(content(Comment\"# \ ERRATA: \ #\"))))(Secondary((id \ - 6b2502ae-6aa7-4f79-af57-11e9f42c6622)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 30112b9c-c3c8-44ad-9d40-37b38770a67e)(content(Comment\"# The \ + 34905c96-347d-4641-8f79-9dd417212011)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4aa999e5-4f22-492c-942f-00fb5d848a29)(content(Comment\"# The \ bottom toggle can also be used to remove \ #\"))))(Secondary((id \ - ab4e5359-153c-41db-846f-d65a5a1f9bf4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3a8cf61e-a2a9-4639-9bfa-7b8eadfdc6cc)(content(Comment\"# \ + df7de2c6-f7f0-4d59-b327-1a2501ef954f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1159c000-d2cb-4e8f-a669-142abe4a1fa3)(content(Comment\"# \ projectors. Currently only bidelmited terms can \ #\"))))(Secondary((id \ - 82a41fe5-55ba-46f4-9347-dc40e37fec92)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 75bec90b-a2e6-4240-b6d7-1416007bae80)(content(Comment\"# \ + 53f2f478-b0da-41bf-956a-67907f01d2b3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 19deddeb-57b4-4bf9-b5a6-b2798fe597d3)(content(Comment\"# \ projected, so some may have to be parenthesized. \ #\"))))(Secondary((id \ - be353873-d8bb-4ccb-bc5e-6bbb0475bb36)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 7a201b6a-fa16-4974-af1a-47f178db1966)(content(Comment\"# \ + c4c5d0b0-ff38-4a92-903f-637294181b46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f3664d26-7fa8-49e6-b7ce-d75393d732d6)(content(Comment\"# \ Projectors are persistent across sessions, but \ #\"))))(Secondary((id \ - 591f7cec-1fa1-4a9b-adab-4ee9f961b955)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 082b513c-b03b-4acc-b719-35968c611f52)(content(Comment\"# \ + 0e2c9dad-8073-4e76-9a6d-00e84900e80f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 02c27b2c-f3c2-47f3-9899-ff6528fc118f)(content(Comment\"# \ currently are lost on cut/copy. Both these \ #\"))))(Secondary((id \ - cd7e6533-ef30-40d3-b0ed-1564c938150c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a7d7365c-dff2-410c-8e5b-1236be2a704e)(content(Comment\"# \ + 21cf74b6-347e-4fbe-90b1-6c9027195092)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fea6fc11-dea6-4601-9cb1-35c049e73d1b)(content(Comment\"# \ restrictions will be removed in a future update. \ #\"))))(Secondary((id \ - a8185d3a-e316-4101-9713-1c1f50a5fd84)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e562c0ea-2d81-4a46-9ec1-0b06ce1685ac)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8fbbd6f2-973c-424b-bef2-855f600c727c)(content(Comment\"# \ + e2d90882-38a7-43b2-87bd-6531c4ace16d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fb06c653-855e-4a1e-9bd3-ba8c295705f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7ac61350-55c3-488b-9984-809f5cea9317)(content(Comment\"# \ Projectors playfround #\"))))(Secondary((id \ - f88b238c-2f66-4324-8844-4619bda670cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b12c9df1-b44b-4797-bd01-f60b266599fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ab0093cb-d3d7-4ce2-8afb-c222eb6729a6)(label(if then \ + b90f7fd8-b537-4544-a73b-da45d028e9d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6de16b65-ab01-4d8a-a1dd-10cb3d79f9b8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2f5bb63c-ff21-429a-9eff-5abdc07598e2)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e854ee4-6b18-497e-80bb-ae89ee38b41d)(content(Whitespace\" \ + 8e6ffe46-c2a8-4024-bdf3-90e2395116d4)(content(Whitespace\" \ \"))))(Tile((id \ - 07783d82-8dac-458f-83fa-71f6e69cd209)(label(true))(mold((out \ + 134a6b2e-017a-4e9f-a782-4e0a19915d53)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a9c3ea8f-77cd-4bd4-9903-3ed2d02ff8e1)(content(Whitespace\" \ + 2603b8be-54cf-4cb4-acab-705ec10faecc)(content(Whitespace\" \ \"))))(Tile((id \ - 1a78a317-ee30-4599-ad60-67d72a66f72c)(label(&&))(mold((out \ + 5e5beeab-eb63-40d8-b87a-1f54371ffcf4)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort Exp))((shape(Concave \ 10))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6945d8f7-a328-4e48-9d4c-c6b78fc233e8)(content(Whitespace\" \ + 928e83cd-3dc0-48df-987f-c678ecf2b3a2)(content(Whitespace\" \ \"))))(Tile((id \ - 0a440294-202f-4cc5-bcb4-5ff0125c1fef)(label(79))(mold((out \ + f4c7e1ad-d473-492d-abac-b73aa09a6d6d)(label(79))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 31b14770-96b7-4aa4-b176-07f776013d98)(content(Whitespace\" \ + 81319825-690a-444a-bc5a-0899cafd61c1)(content(Whitespace\" \ \"))))(Tile((id \ - eb92ae4a-8353-4a5e-922b-5e116e90be99)(label(<))(mold((out \ + 9d746c4e-50ef-4078-a79d-e5a66e9012c1)(label(<))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort Exp))((shape(Concave \ 9))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4c7b94b7-54cd-4740-88db-721a09eb4b0f)(content(Whitespace\" \ + 472690e7-361d-4676-a18c-b2257f1bec47)(content(Whitespace\" \ \"))))(Tile((id \ - 5bb9c867-b369-4d4b-970b-da300cc02515)(label(int_of_float))(mold((out \ + a5163c00-6bea-40e5-be4c-6c0db74cb34f)(label(int_of_float))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - c29cc48d-1629-477a-843d-8a6b8172e142)(label(\"(\"\")\"))(mold((out \ + 008dd76c-e655-4bfe-a1a5-f9a97ce28fa7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9948829d-fcf7-45eb-aafe-ed217a8d7076)(label(60.00))(mold((out \ + 1ace692e-4c16-4bc1-9ade-5766b434f6bb)(label(60.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f4ef5db4-3d57-44ae-81c4-0a31272bd18a)(content(Whitespace\" \ + af346370-49c0-45b8-b6b5-54abf58a1b80)(content(Whitespace\" \ \"))))(Secondary((id \ - 039d4ed0-263f-42f8-a09c-2eb4026ad14c)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - a8a875dc-718f-4867-a557-6a17bf7de921)(content(Whitespace\" \ + 3b307b64-01a7-43ce-8ae4-033b84a8f050)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7fe31a60-667c-479c-a6a9-ee957d73a626)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 38a576c9-7afe-4cf0-9e75-67f205d5bebd)(content(Whitespace\" \ \"))))(Tile((id \ - 22aaf8b0-134b-4425-bcf9-d0ed63e05d40)(label(______))(mold((out \ + e3967e60-29a2-4922-82ee-6f61b28e8794)(label(______))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - afa89cd0-c3b6-468f-a331-330ede229363)(content(Whitespace\" \ + a72c77e7-c784-48d7-a4d9-3d3d4b6581ae)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 18bfc8af-9eea-4cde-a20e-ff8b20e9de58)(content(Whitespace\" \ + 7a8789b3-f717-4966-b8b1-71c5a632d92d)(content(Whitespace\" \ \"))))(Tile((id \ - 957c50a5-e89d-4cd0-a244-987980f4eb21)(label(\"\\\"its: \ + 83d899b7-bb2d-4280-8115-04b0c6631efe)(label(\"\\\"its: \ \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1a8fbbee-903f-43f8-88c4-212483c429b7)(content(Whitespace\" \ + 4c67ffdb-9786-42aa-a030-79463d29bda7)(content(Whitespace\" \ \"))))(Tile((id \ - c65cc809-d3c9-4fcd-ad5f-2a3483e33bc7)(label(++))(mold((out \ + 17e70cd8-a542-485b-ae0b-7674f6ea211a)(label(++))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort Exp))((shape(Concave \ 6))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 945f4532-eeb5-40b0-a492-b776f02a36c3)(content(Whitespace\" \ + 5a785e13-d82f-4d8b-9cde-b23f1661c9ff)(content(Whitespace\" \ \"))))(Tile((id \ - 0707d39e-9a05-4e00-8fae-95b99b11376e)(label(box))(mold((out \ + 1185f1ef-5d8b-4ce7-b21d-893e42f8c4fa)(label(box))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c0d9e645-cbc4-4c33-92dd-700b24dadbd9)(content(Whitespace\" \ + b7de0cc9-4ee0-408c-a2db-2247fe81adab)(content(Whitespace\" \ \"))))(Secondary((id \ - cad86941-2772-491c-8fe6-0c94745e21bb)(content(Whitespace\" \ + 3c6fda68-dbd7-4803-8332-567ba25e5a24)(content(Whitespace\" \ \"))))(Secondary((id \ - 5122eb62-5788-4fb7-8253-59fd8a6877a8)(content(Whitespace\" \ + 469cf969-6d5f-4389-8368-be473d01a24e)(content(Whitespace\" \ \"))))(Secondary((id \ - 167a6ec0-7387-4986-868f-58ca30d73669)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 644c7995-ae11-422a-8014-9a001a017cb9)(content(Whitespace\" \ - \")))))))(ancestors())))(caret(Inner 0 \ - 32))(projectors((07783d82-8dac-458f-83fa-71f6e69cd209((kind \ - Checkbox)(model\"()\")))(0a440294-202f-4cc5-bcb4-5ff0125c1fef((kind \ - Slider)(model\"()\")))(15a3dabb-c4ee-41c9-adce-a04d217a118e((kind \ - Slider)(model\"()\")))(28b98d62-d7a6-42c7-bfdd-92df5989b9bf((kind \ - Info)(model \ - Expected)))(3f0c70df-dd39-4efe-a415-eb90a1f4e818((kind \ - Fold)(model\"()\")))(44567071-4f8e-4c42-9d9c-e67c7855dd77((kind \ - Fold)(model\"()\")))(4e85dfc9-08a3-4790-a681-c752eb512780((kind \ - Slider)(model\"()\")))(59d7623e-3a8d-47b0-ab14-1b3da3af67fd((kind \ - Info)(model \ - Expected)))(5bb9c867-b369-4d4b-970b-da300cc02515((kind \ - Fold)(model\"()\")))(8f0882d0-cfab-4488-a2f8-5d9380774d73((kind \ - Fold)(model\"()\")))(9082db6a-3383-4a57-b3bd-9ab54b90478e((kind \ - Info)(model \ - Expected)))(9874058f-1a2d-4d55-a864-7c18e851219a((kind \ - TextArea)(model\"()\")))(9948829d-fcf7-45eb-aafe-ed217a8d7076((kind \ - SliderF)(model\"()\")))(a328bad6-82a6-49fc-bdd3-f2cd47dfa037((kind \ - TextArea)(model\"()\")))(b7f2f293-0186-4272-b358-c52d22b4bca4((kind \ - TextArea)(model\"()\")))(be90d682-69a8-4d88-b6e8-2e598508d07d((kind \ - TextArea)(model\"()\")))(d07452c2-a421-4bb8-88c8-48c1d0b9c0c6((kind \ - TextArea)(model\"()\")))(deda51f8-a793-4c73-9ed5-c6ec959935b5((kind \ - TextArea)(model\"()\")))(e9542f88-6218-4c8a-9d0e-8912cb2af367((kind \ - TextArea)(model\"()\")))(f4f1d912-c312-4809-9d84-3cd729a50e40((kind \ - Checkbox)(model\"()\")))(fccb7933-86a8-4d60-b885-234abd132b90((kind \ - SliderF)(model\"()\")))(fe9aaa1c-473b-4de7-b8f6-8e76ada94f1a((kind \ - Checkbox)(model\"()\"))))))"; + ca43d8ea-0085-4f4c-862f-76db5d5da98c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 000fa47e-e8ed-44e0-a47f-303cda505ff2)(content(Whitespace\" \ + \")))))()))(ancestors())))(caret Outer))"; backup_text = "# PROJECTORS #\n\n\ # Some kinds of syntax have dedicated GUIs. #\n\ @@ -662,7 +640,7 @@ let startup : PersistentData.t = let fold = (((((((((((()))))))))))) in\n\n\ # 2. A semantic fold covers a term with a property: #\n\ # Click to toggle inferred & synthesized types #\n\n\ - let folds: (Int -> Bool) = in\n\n\ + let folds: (Int -> Bool) = in\n\n\ # Projectors on literal data are called livelits. #\n\ # Three base types literals use inline views: #\n\n\ let guard: Bool = true in\n\ @@ -687,7 +665,7 @@ let startup : PersistentData.t = # currently are lost on cut/copy. Both these #\n\ # restrictions will be removed in a future update. #\n\n\ # Projectors playfround #\n\n\ - if true && 79 < int_of_float(60.00) \n\ + if true && 79 < int_of_float(60.00) \n\ then ______ else \"its: \" ++ box \n\ \ "; }; @@ -695,8608 +673,8748 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 35003015-fbef-4b09-92fb-9c595d680cfe)(content(Whitespace\" \ + 299e87e3-9a79-4c7c-9dcb-cbe50454f629)(content(Whitespace\" \ + \"))))(Secondary((id \ + 61e4e570-3297-4243-8228-d5fb99bb62a0)(content(Whitespace\" \ \"))))(Secondary((id \ - 915a1d4d-7375-4dbd-a027-acc97eb86fa5)(content(Whitespace\" \ + 8cbb8685-419f-4716-9fa2-35d7cc92c7bd)(content(Whitespace\" \ \"))))(Secondary((id \ - db94144c-b1e8-45fd-8993-31fa9d707fb5)(content(Whitespace\" \ - \")))))((Grout((id d524e629-726d-4409-b082-295582f53acb)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + eec5bd58-1af6-402d-a3a8-754b1c08e48c)(content(Whitespace\" \ + \")))))((Grout((id e87c8d67-9374-4a6f-ba01-5ec8f300b924)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 1829a9f9-d1fd-4d9c-9e0b-cf2411c3e3ec)(content(Whitespace\" \ + 18263281-6927-4fbe-9638-ca6f68482eed)(content(Whitespace\" \ + \"))))(Secondary((id \ + 868cb8e7-830b-4bda-b9dc-5f9ccd1e3159)(content(Whitespace\" \ \"))))(Secondary((id \ - b70dd120-f653-44a3-b021-205022ce5bc1)(content(Whitespace\" \ + c2ba472e-549f-4856-9263-0a1235769f32)(content(Whitespace\" \ \"))))(Secondary((id \ - 1ad97a42-fe88-4022-b429-66ade9a6ca40)(content(Whitespace\" \ - \")))))((Grout((id 06943c01-52f1-4b60-a0d5-3d4effb0fdc8)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + eebed27e-13cd-4df4-a1fe-02068ca455e1)(content(Whitespace\" \ + \")))))((Grout((id defe91b0-3d3a-4a13-97ab-5c90d5b10a81)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 8012a4dc-0e86-4a80-a7ea-8f1c2fcc84da)(content(Whitespace\" \ + 3824a4b0-c8f8-44dd-bc3c-e1cfee7576fd)(content(Whitespace\" \ \"))))(Secondary((id \ - ae12f9e4-a42a-4ff2-ab72-4294d60abc21)(content(Whitespace\" \ + 70e7b08c-f7b4-42b8-9b4e-5149dd45674d)(content(Whitespace\" \ \"))))(Secondary((id \ - d14b7725-4c89-4afc-9cf9-68f47518a0c8)(content(Whitespace\" \ - \")))))((Grout((id 7e68a559-45b9-4196-9d73-aa81c2f3b407)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 52efbb33-96d5-4647-a85f-cd0822c2786d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 06f79f3b-d319-4878-a1cb-d3f09a410e4d)(content(Whitespace\" \ + \")))))((Grout((id 62472d55-f985-4caf-9e1f-749c338d0397)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - b56a604f-e332-4801-85af-28bc06a7d216)(content(Whitespace\" \ + 618d94b7-add8-4b70-a2b2-d348e80b8b2a)(content(Whitespace\" \ + \"))))(Secondary((id \ + 69798386-81ac-4737-b0d3-011cbf0607fd)(content(Whitespace\" \ \"))))(Secondary((id \ - 82e7a0c9-5db3-4050-91e3-df034164eed9)(content(Whitespace\" \ + 5855e854-e9cc-415f-bd7f-ba50bddaf212)(content(Whitespace\" \ \"))))(Secondary((id \ - 17d51d16-010b-4ed0-b521-3f5b9f63b2b2)(content(Whitespace\" \ - \")))))((Grout((id 19012cd2-c47e-41de-a26a-0ff5274f7e40)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + f23de1f5-396e-4e7c-b126-8cd7c6f78417)(content(Whitespace\" \ + \")))))((Grout((id 39cacada-31f6-4a82-9739-e7a46cfa50d1)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 5aea5bbd-8b47-4a3e-80ac-435082d1e589)(content(Whitespace\" \ + 231fd762-0c50-47cf-b726-21d97cd95bd6)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4aa822a6-c41e-4931-be88-1d51a939726c)(content(Whitespace\" \ \"))))(Secondary((id \ - 7f20b4bc-ff3d-46ad-857d-a9f857736d9f)(content(Whitespace\" \ + 8b6b8a4d-7492-4768-a3c7-735a58d7cd1d)(content(Whitespace\" \ \"))))(Secondary((id \ - a7425e24-658f-420a-887b-f2a062ae7355)(content(Whitespace\" \ - \")))))((Grout((id 193e5c93-b34a-48e1-8437-9d9f68761f20)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + f52b2872-d6ce-4a89-99d7-1ade17e605cc)(content(Whitespace\" \ + \")))))((Grout((id cf50313e-1875-41c1-bbb9-ca6ddf012775)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 47b6d6a0-707a-4e9c-90c7-92cc267869b2)(content(Whitespace\" \ + 61823896-b3c6-400b-802c-f7474bc1ff03)(content(Whitespace\" \ \"))))(Secondary((id \ - ea6dfdb9-b42b-4f24-bd59-8c6893d3a933)(content(Whitespace\" \ + 06d6c8bd-c122-4d10-9fcf-da154f3da58b)(content(Whitespace\" \ \"))))(Secondary((id \ - 80c4359a-b297-44a2-bdec-a3e0f5fa97b9)(content(Whitespace\" \ - \")))))((Grout((id 27c22608-ce4a-4f85-b7f9-af3692db1347)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + b2485fc1-848f-450b-8f79-133e3ea1754d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 45e00143-e851-4efd-a36f-cbd5c057c5ad)(content(Whitespace\" \ + \")))))((Grout((id bd9ea551-2060-47ad-bb83-252df293d38c)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 5fe7cabe-3f08-4390-9d34-d9754bc1520b)(content(Whitespace\" \ + 5998851c-31ad-4c14-8e44-f6b9ba7682f4)(content(Whitespace\" \ + \"))))(Secondary((id \ + e9c9fdab-ad33-4ab3-bbdb-cb5e9f75c039)(content(Whitespace\" \ \"))))(Secondary((id \ - 93f66164-b39f-4c4d-8091-3c1ff23dad25)(content(Whitespace\" \ + dc09da18-0513-4737-b30c-ad493b10b839)(content(Whitespace\" \ \"))))(Secondary((id \ - e07cbe1b-176d-4853-9da2-6a8e125943e2)(content(Whitespace\" \ + 39733598-2f92-47ad-beb3-7e528c4e6599)(content(Whitespace\" \ \"))))(Secondary((id \ - 4a7eca7f-2ad4-4ff0-94e2-97b8f2824e6e)(content(Whitespace\" \ + 6116e484-47d4-4e02-a79d-ce6cfebbcc8f)(content(Whitespace\" \ \"))))(Secondary((id \ - 8f8896d1-cf4d-468e-82a2-01cc2a5df1c7)(content(Whitespace\" \ - \")))))((Grout((id 13e6876e-c26f-414f-82c3-dd35b58a62df)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + a330f312-3e60-4b93-86fc-ef0d6ef08c7d)(content(Whitespace\" \ + \")))))((Grout((id 0078ad5b-23c0-45ab-afa4-be2fec6a958d)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; ], [ ("scratch_0", Evaluation); ("scratch_1", Evaluation) ] ); documentation = - ( "Basic Reference", + ( "Projectors", [ ( "Casting", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 4513e0b2-70cf-4541-9ca2-8797759b23ca)(content(Comment\"# \ + 81369b05-3100-46fa-8519-383f032773b7)(content(Comment\"# \ Internal Regression Tests: Function literal casting \ #\"))))(Secondary((id \ - 8977768f-526c-46cf-94c3-d2b524e6dc05)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c8937095-d29d-4564-9770-d784e425a0d8)(content(Comment\"# None \ + 661ca937-ef26-4d0f-8e56-34169b5314b4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cec34ac6-7912-499a-9c79-3044a2463686)(content(Comment\"# None \ of the below should trigger runtime exceptions \ #\"))))(Secondary((id \ - ca3b6a21-58af-4be5-96d1-c7662e7d113b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3c605615-ed09-4a8c-b0b3-4c5563abcdb7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a4fb43f6-86ee-4ad8-afd1-4bd3eb777559)(label(let = \ + 7226679b-c010-43b2-9dc4-17a1c5810b79)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3286f00c-648a-45c0-b4ba-facb03d5f5eb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9eaeefd6-f39a-4e11-9bbd-7670fa49ae2d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5973f436-1fb0-46a4-b071-2e4fb3ca8a8b)(content(Whitespace\" \ + 2b64b7f2-0ed1-4c42-a823-872b8a547369)(content(Whitespace\" \ \"))))(Tile((id \ - ffeb6fc5-a0be-4383-b310-52e68d59ad8d)(label(g))(mold((out \ + e27950cc-13f0-4e63-b33d-bb38bcf4a33d)(label(g))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 19b9e385-4290-4094-be42-699b9a3f7f74)(label(:))(mold((out \ + ebd66162-10cb-405d-a69c-87c51113f790)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - aeecf78f-b1ec-4fe9-9622-e753e1cede32)(content(Whitespace\" \ + cdf12728-5f08-4e00-adff-8d203d2e1406)(content(Whitespace\" \ \"))))(Secondary((id \ - 924c52d1-b1a1-4ed9-961a-0f81454a67c3)(content(Whitespace\" \ - \"))))(Grout((id c0ea92c4-2936-4dd9-a993-32f4f652fe68)(shape \ + 006b25b5-ccc3-430f-a8ef-0af78f24133d)(content(Whitespace\" \ + \"))))(Grout((id 82bdac5f-a8bc-49c5-aaf8-c8626bd1aaaf)(shape \ Convex)))(Tile((id \ - e6953228-35f8-4e93-826b-cc94ce535e79)(label(->))(mold((out \ + 39909202-da1c-4570-80d2-3144f7ec1544)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9dc79b6f-179a-4516-86ee-1424a66b1797)(shape \ + 7214e1a3-10e6-41a3-b38b-6e0029268c2e)(shape \ Convex)))(Secondary((id \ - bcc72c1d-16a0-431c-b119-102efefac6bf)(content(Whitespace\" \ + 80e3a9a3-5d6d-46d7-ace0-620267ff4c52)(content(Whitespace\" \ \"))))(Secondary((id \ - e84afad4-c313-460e-a428-7a5ae6c6fcb1)(content(Whitespace\" \ + fef4623f-387d-4b3e-a954-ca5becab31b0)(content(Whitespace\" \ \"))))(Secondary((id \ - 8bff5b25-05dc-4f85-873a-cd219e8be7b5)(content(Whitespace\" \ + 4dc169da-d912-4571-bf44-e96ef78f46f9)(content(Whitespace\" \ \"))))(Secondary((id \ - ec9a3ba9-3c1a-4458-ae03-0bc1781ca95d)(content(Whitespace\" \ + 2abb0229-e337-47d4-91f0-49ad4420874d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9879f996-22b4-4d72-b87e-6c03717798b7)(content(Whitespace\" \ \")))))((Secondary((id \ - f22d8033-ac10-4b5e-9a93-e96ce2877d7d)(content(Whitespace\" \ + acaad34c-1ef9-4103-8cc7-a315cb16766c)(content(Whitespace\" \ \"))))(Tile((id \ - 62e89cc5-4c0f-4a58-9ea8-c66caf8d955d)(label(fun \ + 58a5cd00-5b25-4258-8de2-4ec58460d679)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 213965e6-9c76-4595-9d55-f4e409af802c)(content(Whitespace\" \ + 77a7a302-9006-4fdf-8ebb-5a898fe80dda)(content(Whitespace\" \ \"))))(Tile((id \ - 7c6ea234-5b8d-410c-a193-84cea3cd932b)(label(_))(mold((out \ + 848cd28f-e857-440e-a5f1-9377774717b6)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b44663a7-dc46-4a2b-b579-6e7a7b008129)(content(Whitespace\" \ + 891dd4d9-3426-4ffc-ba06-67bdfd9e1eff)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 17e2bc31-f2b4-425d-8520-d20eda1311c7)(content(Whitespace\" \ + 25cccae1-4e5b-4e5f-aa8e-994731827f49)(content(Whitespace\" \ \"))))(Tile((id \ - 038a4211-e388-492c-9965-993698c62263)(label(9))(mold((out \ + 950ba9b6-d9aa-44e5-918b-6e388eb31365)(label(9))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 86e5e626-80d1-4293-a96a-327bc5009761)(content(Whitespace\" \ + 4f0f471a-e929-41cd-854f-73fc11a997c5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c8bc16bb-2bfb-4f5c-8e51-d159c6a9cdbd)(content(Whitespace\" \ + 3c4aa4bf-2198-4d96-939b-622db1210f2f)(content(Whitespace\" \ \"))))(Tile((id \ - f90129c4-1298-4de4-9874-ee0b39ceb804)(label(-))(mold((out \ + 12aac901-a820-49a5-9de4-6d5efd1821a3)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ - a25c0804-5919-441a-9401-b9327b500a32)(label(g))(mold((out \ + a1c315c9-9f6d-49e8-83fb-619021db8ba6)(label(g))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8cd5cd0b-f692-40f1-96f0-518117080388)(label(\"(\"\")\"))(mold((out \ + f2070018-aa3e-45f4-9108-039b8cfe8d0a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2713281c-1453-487a-a917-240525d9bb25)(label(1))(mold((out \ + 35429397-758e-443e-a6b4-570c37ab7ed8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - e67c9a06-134c-4853-a5fd-68eb7bb90394)(label(\";\"))(mold((out \ + cd5a1c96-d516-4740-a615-f329ded8cbb3)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 02d7ddd7-f3f7-43d2-a252-2212ea546e3b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cbf1a599-fbc7-4011-a72a-2c4438c63995)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a0babb87-2d63-4010-997e-ed35688a2009)(label(let = \ + 4f1e5988-02d8-4e2f-8809-130c13e5bedb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a39a6432-d075-43de-821c-91c593ee68b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7fb82384-cfcf-4395-9f99-4df2fdb7259a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7857b5ee-a782-4134-a2ef-0372d2a5c0e2)(content(Whitespace\" \ + 199cb1d9-9622-4470-bcde-98b88d1f2d2e)(content(Whitespace\" \ \"))))(Tile((id \ - 3117e9ab-269a-4e8a-9d70-4e9290ce39f7)(label(f))(mold((out \ + 8336854c-f7d3-4b02-bf20-f3de09fe0641)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 497c989e-d13f-445a-9fe9-cad756909645)(content(Whitespace\" \ + 3339ca2a-6b18-4288-a8fe-f17890b2a4e8)(content(Whitespace\" \ \")))))((Secondary((id \ - 38494d4b-cc5d-4561-8794-e4d26259afee)(content(Whitespace\" \ + 4455604d-cd69-41fd-8f6b-8d42faf4bf30)(content(Whitespace\" \ \"))))(Tile((id \ - 58f2107d-4fe4-4bf6-b76a-18765a0177be)(label(fun \ + 5f379f57-e6aa-4e13-b987-68edf2157c30)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - be5a7be1-4262-4fe3-b571-020e43cdc0db)(content(Whitespace\" \ + 1b144f4e-2ee0-42ee-bc4f-41f39efa24cb)(content(Whitespace\" \ \"))))(Tile((id \ - 1c7f7743-e689-4e73-94f8-090bdbffe2eb)(label(b))(mold((out \ + 57f0523e-58fd-481c-9208-555cebb9f272)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7c3152f8-3143-4778-96f4-de986576b1d2)(content(Whitespace\" \ + 62f93351-1cc0-48d3-8ffb-887cdde7b26c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - df25e1ba-21d9-4831-ae30-7ba11a4c971b)(content(Whitespace\" \ + b3f9ec66-5704-4f88-a893-3fc85a30ef33)(content(Whitespace\" \ \"))))(Tile((id \ - bd033cd0-99d7-4af7-a392-470699e9bcc0)(label(b))(mold((out \ + fb2434da-6c4e-49f1-ae63-5f7f87aff525)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9b1acda6-3317-4a09-b6ff-4f05227d29f0)(content(Whitespace\" \ + 3930fcf7-5f96-441d-bc79-8857a1d99eba)(content(Whitespace\" \ \"))))(Tile((id \ - 6a9eeffb-2a80-4e45-b5c5-97cdeb983e93)(label(&&))(mold((out \ + 7c3fd7f6-254d-492b-bfd5-2a68f0a1e69f)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c407cf81-11f3-4ef0-9d1b-bc37eb8179cc)(content(Whitespace\" \ + 0cee3916-02e5-4293-99a6-70c6db19eae9)(content(Whitespace\" \ \"))))(Tile((id \ - 532465b7-a7e8-4a20-96de-f48bd3a0f62f)(label(true))(mold((out \ + 8c13774a-da7b-486a-a9b6-c1ea1f1d8be3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 91c841bd-ce77-4bf2-9a10-e7ff44352f1f)(content(Whitespace\" \ + 15dc697a-d3d1-462b-872c-1e714ab3de22)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b9f81427-fd67-4e04-b754-31a35466c0d7)(content(Whitespace\" \ + 3e3ea0f4-263e-40bc-b457-322892f972e5)(content(Whitespace\" \ \"))))(Tile((id \ - fa8b50dd-6c87-40ff-a89c-766290651eee)(label(f))(mold((out \ + e03c4dbd-e37a-409b-9b36-e3bada070bf6)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1a1fb467-7318-4017-8603-b6d6c14d24a4)(label(\"(\"\")\"))(mold((out \ + 46a54169-cc48-4153-89c6-02efa923deaf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d10d9bdc-3b9d-4108-988f-5194c70d0e89)(label(true))(mold((out \ + f124eb1f-fa56-4867-b3eb-4dc3d2d86531)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 4104a061-f2e9-49d1-a9d2-624dc64d43e9)(label(\";\"))(mold((out \ + 4c25952b-6297-4560-b56a-3c162d83c8e5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fa874c41-3b99-485d-ad43-20ba3821f04f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f45956e2-2a4a-4762-ac89-c803b49c22ea)(label(let = \ + 1e81390d-b689-482e-924e-77c9c8ce4484)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ec4b55d8-e8ee-4c10-a340-a04819b633c3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 71cf1a45-b7e3-4103-84b9-b32d689d5b0d)(content(Whitespace\" \ + 9129d50f-afae-49fa-9d6a-2167542620c2)(content(Whitespace\" \ \"))))(Tile((id \ - d4e4c92d-e07c-428b-b43b-d664ab476935)(label(f))(mold((out \ + 3e496a44-1f49-4a3e-ab32-7c0fb8002c31)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6c41be94-a392-46ac-a21d-9c78ba5deb0f)(content(Whitespace\" \ + 1df7b1d5-927a-4538-a168-21e4e4465342)(content(Whitespace\" \ \")))))((Secondary((id \ - 8f156447-b9fd-44c1-b152-ad84f07382e3)(content(Whitespace\" \ + 708a7cb1-88e5-4754-8031-3143ec4c0383)(content(Whitespace\" \ \"))))(Tile((id \ - fb8f8fb6-5f51-4a03-9643-14c0f0a12391)(label(fun \ + 6d4a42cb-0718-4e9e-bca1-0af11cd095e7)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 754385fd-2ea1-4547-ab5d-f7a47ff25f32)(content(Whitespace\" \ + f2f6342f-640f-40d6-85c7-7d0c5cce62ef)(content(Whitespace\" \ \"))))(Tile((id \ - aa722fb8-fd7d-442e-baaf-7392aefbd4e9)(label(b))(mold((out \ + 6a9756bd-2505-46e0-9493-c1df53e5a1a5)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cc43d795-d7d6-48ff-b1f2-2059e7f050e9)(label(:))(mold((out \ + 3b0b22c1-8b06-454b-bc5b-3bcd047b858e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e8ccdc7c-3eb4-4f75-9008-26c85a683f1a)(shape \ + 3ad438f5-eedf-4c63-b276-c8fe3e4c6622)(shape \ Convex)))(Secondary((id \ - 3e0790f2-4a3a-4ea6-8384-8f252df408e1)(content(Whitespace\" \ + 518a4068-d476-4b78-a51d-71da3483d9a4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 25e640db-08a3-49aa-becd-835cfc80763c)(content(Whitespace\" \ \"))))(Secondary((id \ - bae45e43-19f6-47e1-825a-4608fa91aec6)(content(Whitespace\" \ + 3fe64100-5b8c-4e0b-9cb2-cdb9c41e562c)(content(Whitespace\" \ \"))))(Secondary((id \ - 02109c03-53eb-4655-8b10-8818fb5d9c1b)(content(Whitespace\" \ + 7c114496-fa35-45b7-8b56-64219a25937f)(content(Whitespace\" \ \"))))(Secondary((id \ - 7a586f77-e7d0-4e4b-bd32-86dbf0e2b7c2)(content(Whitespace\" \ + bd028bd4-7a3c-4b73-bdc4-cb71ae4dabcf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a792cf48-d235-48e3-9031-24109e86d560)(content(Whitespace\" \ + 7b57f276-9239-48a5-959b-439c645e6b9b)(content(Whitespace\" \ \"))))(Tile((id \ - 1b9ac3a4-8a3d-470d-a9f6-d95a24759cc3)(label(b))(mold((out \ + 02e9a8a2-4b70-4386-a03a-c7338edd1ac1)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b3d5a072-e0e3-4418-bf30-d40d801542a4)(content(Whitespace\" \ + b3c18a9e-1da8-4c5a-9d05-5925d467091b)(content(Whitespace\" \ \"))))(Tile((id \ - 4a168637-97b1-40fb-b286-46bc8de1e0b7)(label(&&))(mold((out \ + a5a691d3-386c-4599-884a-c8f9aa833e68)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - acdb4e6f-e6ff-497b-a386-5279c6cc9350)(content(Whitespace\" \ + 9a583679-4605-45d0-a43e-52bf5622f396)(content(Whitespace\" \ \"))))(Tile((id \ - 2725d779-bf25-421f-a562-b50d769fea51)(label(true))(mold((out \ + 6cec4350-c571-4854-b06e-ca6c31ff0d82)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5d4174a8-03fa-4cf9-b639-a291c4b18879)(content(Whitespace\" \ + 69a109a1-5a88-451a-8cae-58b743ef879c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5c1701ed-b772-49d5-a40d-e2f3f9f0f78a)(content(Whitespace\" \ + f587f878-71e0-466c-af3c-6806440c4280)(content(Whitespace\" \ \"))))(Tile((id \ - 98de3d6c-95a1-45af-90d7-3107e9264ffb)(label(f))(mold((out \ + 3f05de1c-201f-4e4d-881c-38096ae05061)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bd5345f9-ffe0-49fa-bf38-87caf27eeac3)(label(\"(\"\")\"))(mold((out \ + ff86ff15-f544-4fd3-8dec-e3ac31a240ee)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 47ff3937-a409-4194-a82a-b858884ec848)(label(true))(mold((out \ + afd5101b-29b6-42cd-81d3-21d73058beb4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 8f4d840b-492b-4cc4-a981-1b7b1ffb871f)(label(\";\"))(mold((out \ + 5c651383-18c1-48b1-8e66-b03c769f3bde)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ed86443-4cd5-4c89-aa64-d12dbfd43595)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c8175bf2-719a-4aa4-9a15-50156d9cf29c)(label(let = \ + f7390a85-d74e-4b67-98d5-bb26e8b8865f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0a704a14-505d-4c2d-a6de-ae4517221ab9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2c569a02-61a8-4ef5-8c0c-5aeed9799b0e)(content(Whitespace\" \ + d5e59e75-f4f3-4b5b-b2e4-2019d7673305)(content(Whitespace\" \ \"))))(Tile((id \ - e79f7c1a-b610-4563-999e-0b43158f3734)(label(f))(mold((out \ + c909509f-18e3-40c3-a5bd-d87fc999b730)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f193660b-2817-41e5-8e24-e0c22459ecc1)(content(Whitespace\" \ + 1d89694e-c062-41b9-af8b-8355b392a7b8)(content(Whitespace\" \ \")))))((Secondary((id \ - 3fe4b5d4-322c-4211-bbd7-7c4dff7ce7e0)(content(Whitespace\" \ + f1853bc9-8e24-4a70-90dd-194539cdb314)(content(Whitespace\" \ \"))))(Tile((id \ - 6db7ae83-3c08-4a1f-b9e3-64cf73057c11)(label(fun \ + 310a11f0-71a7-4b63-a256-7307f27b228e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2efd79e5-498f-4def-a5e4-effe171be5dc)(content(Whitespace\" \ + 1d6f9a93-cc2c-4889-a604-f02951053baf)(content(Whitespace\" \ \"))))(Tile((id \ - 04df02d1-17eb-4e5c-afe9-851a1b6ec96d)(label(b))(mold((out \ + bf737c42-1b95-4fea-aed2-763f716782e3)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f9994a77-a390-4d44-a4c6-9c577dc6585d)(label(:))(mold((out \ + 58d9ec65-d4da-47ee-a01a-5bd43af058b8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 98e7d74c-6b55-4ae8-b13d-df8b064f47ff)(content(Whitespace\" \ + 91ff0c5e-4435-4908-9722-fc51f4b726dd)(content(Whitespace\" \ \"))))(Tile((id \ - cfefa68c-ead3-4e88-91cd-70778ba23bf5)(label(Bool))(mold((out \ + 25ce4103-1679-4c34-a5f1-5c6930fef1ee)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f2057d9b-bf72-48da-8cfb-a1d1b99b9033)(content(Whitespace\" \ + f1c5d99a-e84a-4b86-945a-45eb32da95ba)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 61accecf-2c2a-4102-b868-aa38c3f44d7e)(content(Whitespace\" \ + a3b5cd01-b0a2-4300-ab04-fd6940ffcd15)(content(Whitespace\" \ \"))))(Tile((id \ - c7ad7889-cd6a-4046-910e-d201b00eb621)(label(b))(mold((out \ + 764204e6-fe9a-49db-9e9f-7576f8c736f1)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8a311226-869b-487c-82a8-d208ba19cc70)(content(Whitespace\" \ + 56cad22e-7568-49f8-a934-1ad6645bbb5d)(content(Whitespace\" \ \"))))(Tile((id \ - d98a35a1-2510-4917-97a6-1a836997cb5d)(label(&&))(mold((out \ + 2631fc54-11f2-4562-ac0a-357e1d807e05)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d64ad2eb-88f7-40ad-af63-4e6c9b29391d)(content(Whitespace\" \ + f60d2720-ec79-4276-81de-486df193d1de)(content(Whitespace\" \ \"))))(Tile((id \ - bdd32c4f-6be9-4de0-bbbe-4e73e6db5259)(label(true))(mold((out \ + 0f4609f5-6880-4d39-9a3d-d23db6bc348d)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fa0a556e-eed7-46b2-b62f-238a3f2649ef)(content(Whitespace\" \ + 92118d8a-9090-4cca-91c8-378221c73f3c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d2352cbb-0030-4a7f-9ae8-3e2b4b861b81)(content(Whitespace\" \ + f126a678-ad98-49da-9331-c6c933d6c7e7)(content(Whitespace\" \ \"))))(Tile((id \ - 8b4ace74-3775-48bc-8c2d-302ecc5d1f58)(label(f))(mold((out \ + 4658f768-b661-46d7-a228-bda00d6b4630)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 35f467db-24d5-471b-a20f-d6c77f3335b9)(label(\"(\"\")\"))(mold((out \ + 5c6b8fdf-cc60-405f-b69e-74098d60aea8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5a1ac369-54b4-4b23-a877-74d5f95ff7fa)(label(true))(mold((out \ + 3d9c9325-622f-4a2f-9f27-fbabbf352359)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 23f88f0a-40d9-4193-b71c-b67c31c7cd00)(label(\";\"))(mold((out \ + e4482912-39b0-49e3-82dd-4a222f6baad5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - adbbe295-ac3d-4af2-a1e5-f5383c61748c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 72c467a4-33f8-4ebd-a820-6f02956bde62)(label(let = \ + f528425c-fe76-45e2-aaf0-3fce94886371)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e9ba542f-8cee-4258-97e3-b92404ca2681)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 26ec9d21-1cfb-49bb-b33c-dbd2b35cf8fa)(content(Whitespace\" \ + 34b33841-788c-4352-ba2d-7e198a3a7c5e)(content(Whitespace\" \ \"))))(Tile((id \ - 35af5060-31cc-422f-865a-abb7e0a304d1)(label(f))(mold((out \ + 75077e71-5287-4321-9425-d482e7db1ed3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fb7ddfe3-cb9b-4daa-b23d-4d1d2e9cc50e)(label(:))(mold((out \ + 27e7e63c-ca04-4945-af58-848913dbf40b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 44535cf7-dbad-4da8-b7c2-96e2f777f3b9)(shape \ + df8e3f00-cc95-458b-a422-8cdb9e15d285)(shape \ Convex)))(Secondary((id \ - e12e8fbf-b955-4fba-a59e-fed86b8752c4)(content(Whitespace\" \ + ee09a346-60da-4faf-af20-4ada2033a7b8)(content(Whitespace\" \ + \"))))(Secondary((id \ + fe3c1157-b579-4ee1-85db-dd3970fadcc8)(content(Whitespace\" \ \"))))(Secondary((id \ - 4de37596-6a3b-44e2-a21f-b717f58b7172)(content(Whitespace\" \ + 723bda35-ccff-45b5-bc97-a0abffe79563)(content(Whitespace\" \ \"))))(Secondary((id \ - 6c1ff3ed-068a-435c-95ef-17184cc90a45)(content(Whitespace\" \ + ff0307f1-17f9-4e0f-81ab-7765ac58e62d)(content(Whitespace\" \ \"))))(Secondary((id \ - 4b3030f7-558e-4c2c-8eb1-0ba8db188bec)(content(Whitespace\" \ + f1baf6dd-8d9a-4bc6-9f74-fb176f11854a)(content(Whitespace\" \ \")))))((Secondary((id \ - 6f60abf4-bb4b-4e4c-a922-a2f3134d37a8)(content(Whitespace\" \ + 8904533a-4cdf-4111-b504-dc6c88ea0996)(content(Whitespace\" \ \"))))(Tile((id \ - 842a9e31-880a-41a4-8bf7-fdc7250c1549)(label(fun \ + 022f45b7-15fe-4015-b609-048270f33bb5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - bd935af1-8a16-4613-a8e5-b13937d4196d)(content(Whitespace\" \ + 95fa2567-2fd9-4c1f-801f-bbec283d6de8)(content(Whitespace\" \ \"))))(Tile((id \ - 48698381-6f54-4d28-bbe9-5e7309b067ca)(label(b))(mold((out \ + b77150c8-ae85-4c15-b80d-4f1e1aa0afe7)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d4eda7f7-6a16-40bd-8458-8261dc8cea3c)(content(Whitespace\" \ + 920818bc-1839-487d-8f28-8ea1ac7f7f6b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 96361760-efe1-4cf7-b0a4-26ee809dec11)(content(Whitespace\" \ + 9346d43d-0ae0-4e08-8050-39b3ea8d0ab4)(content(Whitespace\" \ \"))))(Tile((id \ - f806e1bb-75da-4031-8b43-ea5fcbdf1b2b)(label(b))(mold((out \ + 476aa9aa-37a4-473a-8ed6-040d0952d951)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ae65efda-417e-4167-a8c0-bdf019e5effb)(content(Whitespace\" \ + 412312ee-b030-42b6-9dd2-1547de65ebfa)(content(Whitespace\" \ \"))))(Tile((id \ - 83047c2d-ed67-4dc8-b6ca-d3232dc7313d)(label(&&))(mold((out \ + da81d26b-5d29-4e73-bb68-deafc87e357a)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6fbfc169-02a4-4144-8a2e-38b0b5d96942)(content(Whitespace\" \ + e521bb4a-b193-495a-aeb0-b2c82bacb9b2)(content(Whitespace\" \ \"))))(Tile((id \ - ff269e9b-fe40-4cca-8918-0bcd0159108e)(label(true))(mold((out \ + 4e74bfb1-38c4-407c-8297-69cd09ae8e6b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0fe695f9-072d-4858-9e11-fc125d910386)(content(Whitespace\" \ + ef63ff2c-8ef7-47f8-9710-c4f472c9a9cc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0b23a9b2-9251-40dc-89aa-185d30eb2299)(content(Whitespace\" \ + 149a46b4-a34b-46cf-a027-cf85fb5b15e1)(content(Whitespace\" \ \"))))(Tile((id \ - d289a6ff-7bb2-4e6d-bfe8-1975f8ff3c8c)(label(f))(mold((out \ + 1aae26f0-fc96-44aa-828f-b073e55ff69d)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b8f0229b-68ea-41f9-9e67-24d1a40f79a4)(label(\"(\"\")\"))(mold((out \ + 8e2b1ed4-db2d-49eb-88d2-4728cd09d8e4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e0c06d3d-023d-49ac-8d3f-f9322c135555)(label(true))(mold((out \ + 662cbcb9-b30d-4562-80b0-7364ca66de2f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 4031b812-dc50-45dc-8059-2c9b987aa2bb)(label(\";\"))(mold((out \ + d20c5d46-a170-4403-a97e-a7011ff7cd9d)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d4ca12af-5e8d-4a5c-a54e-0838bcf1c868)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 13c56e5f-c5c7-4329-9ec7-308523291539)(label(let = \ + 68beb6cf-6acf-4189-a0bd-e243d91237fa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f8a81479-e26e-4a45-9dcb-4c5fe7d14ab8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7457bcfb-e4bd-46aa-9134-378395e9782a)(content(Whitespace\" \ + c482be25-4bc1-44f5-a33f-3821a6c7f273)(content(Whitespace\" \ \"))))(Tile((id \ - e189d1e8-5e9b-4167-acdc-ec558885ceb2)(label(f))(mold((out \ + 5c74dff5-8cce-4dc2-a5b6-49a978fac1e5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f40b9593-d854-486d-9fb5-fa171c4169f7)(label(:))(mold((out \ + 2d8453ea-d5be-40c8-ba37-3cb7862e3536)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 3010680c-1f2d-481b-89fc-1280e80b3095)(shape \ + 480f930c-710b-4641-9eb1-655779af6646)(shape \ Convex)))(Secondary((id \ - 5c3fd634-a4bd-4a94-9010-f83587a8c38e)(content(Whitespace\" \ + 866488a0-d5a8-49c6-93bb-be5bee900cc4)(content(Whitespace\" \ \"))))(Secondary((id \ - 05fc9fb8-856b-4d60-ae0c-528f70defd0c)(content(Whitespace\" \ + 72c7edd0-0227-4a57-87dc-a388f9417b28)(content(Whitespace\" \ \"))))(Secondary((id \ - d6c91b88-fb8b-4f4f-80b6-233e206c11e7)(content(Whitespace\" \ + d1b5bc7a-9cc4-44f0-b193-807db15818cc)(content(Whitespace\" \ \"))))(Secondary((id \ - aa7abb72-965f-44fc-889e-487d0ce1ff38)(content(Whitespace\" \ + 380ecbc5-422a-44fc-80bf-0190ecae0722)(content(Whitespace\" \ + \"))))(Secondary((id \ + 66421242-3d8b-4498-b3e1-7e1589086eab)(content(Whitespace\" \ \")))))((Secondary((id \ - 4fdd9500-5904-4e18-a2a4-b9b52ea181e1)(content(Whitespace\" \ + f7773304-b9e1-4487-ae33-452466e47a8e)(content(Whitespace\" \ \"))))(Tile((id \ - efa41b4a-ae37-4e6c-8460-c14168038d53)(label(fun \ + 4476eff5-8342-4be4-bdd0-ef851d1e911f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e506c067-85b0-4291-8e42-838936e3e9f5)(content(Whitespace\" \ + 2a5dd54d-d7bd-406b-a6ce-f4b9952398e2)(content(Whitespace\" \ \"))))(Tile((id \ - 3214dbdd-14db-49e6-ba05-f4f8d7b9e1fa)(label(b))(mold((out \ + 1a1b1421-4293-4126-b66b-d6836f42da81)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b13c9738-a410-4da1-a8db-5af280743784)(label(:))(mold((out \ + cb957614-fcf7-4785-b6e3-be86272e251c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f4023bbc-d333-463d-8107-59aaebee9ce6)(shape \ + 75bd82c3-b6a3-4407-a0bd-280b491932ff)(shape \ Convex)))(Secondary((id \ - 5872d1a7-490d-4dc5-acbb-5063ff944e1a)(content(Whitespace\" \ + 85967488-1ba8-4dd8-b873-ec56d4ac51a8)(content(Whitespace\" \ + \"))))(Secondary((id \ + 471f70ac-51c4-478e-aaf9-2c1a0bb23adb)(content(Whitespace\" \ \"))))(Secondary((id \ - 65a0f97a-9806-450b-82ee-949b2814683f)(content(Whitespace\" \ + 0a340ac0-3e04-4003-8c83-96d6dbe464d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 333d4657-5034-4e2e-87f9-9599b60999c0)(content(Whitespace\" \ + 15be90aa-5534-43e2-9ebf-a33f0c249cc9)(content(Whitespace\" \ \"))))(Secondary((id \ - 306e26b8-afef-4d97-adb9-07d413b0f0e0)(content(Whitespace\" \ + e61828d1-9d80-4b5a-92f8-cceea7fc1986)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8be45247-7464-4e8e-873a-9e72ec552c59)(content(Whitespace\" \ + 1ebcd64c-8de0-4d29-a255-24f923bcc1cd)(content(Whitespace\" \ \"))))(Tile((id \ - d6152a57-357d-4dc1-8343-638e8615ea2b)(label(b))(mold((out \ + 6bda0da5-9b10-4ada-82da-524b09822480)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - edc725b2-610e-4eae-a662-4cbdcde1c4f1)(content(Whitespace\" \ + c178798b-479e-487b-841a-749464fb5b13)(content(Whitespace\" \ \"))))(Tile((id \ - 37b056e2-86db-4512-9ca1-743520f8f885)(label(&&))(mold((out \ + c311861e-80ca-436c-8789-55ba6c0b16d5)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - db829664-9db4-4b1a-9784-76b849a43109)(content(Whitespace\" \ + 6d7edee0-d45a-4f58-a531-a29da2882794)(content(Whitespace\" \ \"))))(Tile((id \ - 2681d881-7c2d-40c2-9ac7-63c3adccc927)(label(true))(mold((out \ + aa66b7b9-ca28-4865-b7d3-568f461a9cae)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2b364945-53c0-438f-b425-1f568dbd45d8)(content(Whitespace\" \ + 3f5a7092-d548-4a8a-825c-9268819bbe4a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a58ff0d1-800f-4f58-882b-aa190a011fd3)(content(Whitespace\" \ + 0d5a7f6c-a557-4026-92a1-6bde64f360b7)(content(Whitespace\" \ \"))))(Tile((id \ - 8dfa7251-8c4d-44c9-9e0e-c1204501d98e)(label(f))(mold((out \ + 174e462f-11c0-4787-a300-09b9e0606098)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9a0eafad-15de-4c6a-a658-5ff411c50bfd)(label(\"(\"\")\"))(mold((out \ + 14587240-3d05-48c1-98ec-999bfa2470a2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9f077f67-c728-4afc-9285-c741f1e0505d)(label(true))(mold((out \ + 1027ad2a-9348-45a2-aab1-db362dbbbd58)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 01723fa2-eda6-4ce9-99a3-e46c149926c1)(label(\";\"))(mold((out \ + 4e933200-863d-4a1c-88e2-8bfa23c82acb)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6540d7af-0b45-4dcd-9f6f-f8085cb43b73)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ce2b7e40-addc-4e4b-a048-1cb6ed9a532f)(label(let = \ + ad93dbcb-2b79-4ea8-9140-71fc17f4882d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f4641efb-5ac2-4a73-86ce-4d8253be45bb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 53eaf352-dade-4d8e-bc89-f4bc36527e5f)(content(Whitespace\" \ + b3ae2558-1ed6-4c2f-9a19-8f3c90d36d1f)(content(Whitespace\" \ \"))))(Tile((id \ - 1bacbd62-6ec6-4f54-aee5-4ff01315a784)(label(f))(mold((out \ + cb65824d-6678-4e27-b490-6fe1fb699878)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5c7c85c8-1fa6-463a-8ee2-16e691ecbd95)(label(:))(mold((out \ + 39c34523-e878-40a5-bc8c-cdd3a3f6f049)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 8c868f9e-be84-46d2-9a3f-841f2f079062)(shape \ + d4d5219c-be8b-4dcd-b57b-442f8965a748)(shape \ Convex)))(Secondary((id \ - 38e06f33-79fb-4aee-9ad7-2b3058418c48)(content(Whitespace\" \ + b01b77b0-8b99-4514-aed9-263f02029ab2)(content(Whitespace\" \ \"))))(Secondary((id \ - abe6159b-41de-42d9-9275-6f9b8ad818f6)(content(Whitespace\" \ + c2e8ff5b-bc62-4e2e-aade-78f05fe6a6cb)(content(Whitespace\" \ \"))))(Secondary((id \ - 5d6f7686-5ae8-474a-8135-a7734754bbcc)(content(Whitespace\" \ + af1bf930-3e63-4335-bc7b-6b030cfc1360)(content(Whitespace\" \ \"))))(Secondary((id \ - 5a858904-5b68-4604-ba89-35910d065091)(content(Whitespace\" \ + 171256f9-b4c9-4188-8ec3-175c12c06487)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4523a20a-a1ff-4de2-a689-1592b3b69750)(content(Whitespace\" \ \")))))((Secondary((id \ - b5d96223-2a3b-428d-851e-08ce7b721ab9)(content(Whitespace\" \ + b5cd6e6e-9aab-4679-998b-f7d1085e0440)(content(Whitespace\" \ \"))))(Tile((id \ - 0488c69e-62d6-4d44-889b-958e261f2a0d)(label(fun \ + ada250f8-1efd-4ee2-92f1-b3cb427a1494)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0a4a0186-b65a-45ce-9630-208ac32cf844)(content(Whitespace\" \ + 8cfb3720-7e6e-448c-b437-04478b3622c3)(content(Whitespace\" \ \"))))(Tile((id \ - 32ce5c06-3673-4c88-82ab-05646d50601a)(label(b))(mold((out \ + 4657a01e-d011-4d88-acc3-b9cbb590bc28)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 51170fe6-741e-4c79-b0e6-27075d5bb9fe)(label(:))(mold((out \ + 6c7fbe5c-b345-4db0-ae41-7c98b7d78ea0)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dcc1ca73-6305-485e-90b7-5ec8c4c8653a)(content(Whitespace\" \ + e605721b-a27d-4501-8b19-82983084ce1d)(content(Whitespace\" \ \"))))(Tile((id \ - ffe7b677-45e5-411a-aab3-d365be8a2e44)(label(Bool))(mold((out \ + 6a54d4b4-a690-43ee-aaf0-145d5008ac26)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 9d768faa-28f8-4e8f-bab6-2e5a70183850)(content(Whitespace\" \ + c68d5b21-d1fb-4a7a-9cb6-d85c71df5a46)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 94975586-4549-4fc2-ab67-48e09fe8c8fc)(content(Whitespace\" \ + ba51531a-4f3b-494e-8c04-653a784f9c20)(content(Whitespace\" \ \"))))(Tile((id \ - 59a53165-c308-4b63-a85f-f5b4d6a39abb)(label(b))(mold((out \ + 4a550533-9737-432d-9e87-baf3352eee95)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d19a72d1-053d-44eb-81b0-c0965210191e)(content(Whitespace\" \ + e3eb9a4e-91a9-42fa-a6be-aa59990d83cd)(content(Whitespace\" \ \"))))(Tile((id \ - 1c033c43-63fa-4521-a68c-72464608c85a)(label(&&))(mold((out \ + ae8e5205-b91e-4886-9a86-1b0f929fc9c4)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 37ad3c08-a8e1-48e8-9670-b3d764899ebc)(content(Whitespace\" \ + a0da3698-12ea-4606-89d0-b8436462a95f)(content(Whitespace\" \ \"))))(Tile((id \ - f92ce557-1081-415a-9728-9b3bd8e3df7e)(label(true))(mold((out \ + b2ede11e-8ae5-4601-8511-39b74b55fbc0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3f735ca1-07a0-4709-87ec-baea55b05e42)(content(Whitespace\" \ + f279092e-a9ed-4986-ba12-9c7334c26167)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2ac00c56-5b69-46d1-a14d-53fb88079218)(content(Whitespace\" \ + 3a262efd-7feb-4e19-93d1-6eacd82878a1)(content(Whitespace\" \ \"))))(Tile((id \ - 81b8d494-510c-4196-b01f-6c387f010c18)(label(f))(mold((out \ + 54033896-bdf3-4539-8149-3987b264fda1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 72ef30ce-f13a-41ef-8c59-92dceeca24d5)(label(\"(\"\")\"))(mold((out \ + b5e74e95-cc04-4c27-adac-4f020ec31405)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b3586b2f-62a1-4f12-bfdc-d0a17de5ca29)(label(true))(mold((out \ + c820ac31-122a-4958-a0bb-8a8d0baf6e30)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 37a4d0df-d177-4879-b313-7745b0db12e3)(label(\";\"))(mold((out \ + fe87eae2-aa00-4eb0-a785-fda1a4dc121f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6282a0aa-eae4-42c5-967a-c20c7775edd4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 13f48ecb-2540-4b37-8c5d-fc8d99c10b11)(label(let = \ + 727a5f75-ac95-4668-9085-b98ec78ab510)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d30f154d-3759-4ca5-ad0d-d4b7a2b99fc9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - de950ab3-ab57-40fc-9db3-fb1f845de77f)(content(Whitespace\" \ + 0b102f64-22f5-4699-9f61-2a7297a36850)(content(Whitespace\" \ \"))))(Tile((id \ - 6b06aaa0-4d0b-45a9-b837-e69f2ecaefec)(label(f))(mold((out \ + bf0aa727-8efe-455c-b780-110e574f409e)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dc027e14-023b-4b06-8fe1-0989fe8b8d0d)(label(:))(mold((out \ + ada1e07c-d277-4b01-90c9-3386227cfeeb)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1394944f-9f38-46f3-a441-267789c03c1d)(content(Whitespace\" \ + 4982da82-00d6-4c7e-8bac-343e08953bcd)(content(Whitespace\" \ \"))))(Secondary((id \ - 02e818cf-9f7c-4070-9284-cc8c01def3f6)(content(Whitespace\" \ - \"))))(Grout((id 83482750-07e1-4df4-8393-f66e905c890e)(shape \ + 1b11ae38-069e-4223-977f-236e39a50c17)(content(Whitespace\" \ + \"))))(Grout((id 83ceadf7-3610-48dd-8fd9-b87bd662c90a)(shape \ Convex)))(Tile((id \ - 9dc1a904-41cd-4cfb-b1b9-7e76a3b03630)(label(->))(mold((out \ + bbf8d0c6-d491-427e-83ae-c75b3db010fc)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 3b42dda4-f4e9-414f-9b8b-58b43c377508)(shape \ + c1f4eaab-433b-4d42-8091-6e1f603f9e3a)(shape \ Convex)))(Secondary((id \ - 91f989a5-ed3b-4c42-bbe1-5e39cf2e5c55)(content(Whitespace\" \ + 4b7b93f4-7639-4e2c-bc2c-3cc40f1c9e8c)(content(Whitespace\" \ + \"))))(Secondary((id \ + cd20c4bc-cb28-4d0c-9908-340e019d4d77)(content(Whitespace\" \ \"))))(Secondary((id \ - 68335fa4-5bf9-4f7f-8a24-80d2353a0f25)(content(Whitespace\" \ + 1edcb7d7-d12f-406a-9d79-456fb99d6adb)(content(Whitespace\" \ \"))))(Secondary((id \ - 97d4c5e8-672c-4c91-9a8b-7ad39149caad)(content(Whitespace\" \ + c89e2ba4-b8c4-4151-a1d6-3b87a278b7bf)(content(Whitespace\" \ \"))))(Secondary((id \ - cb69c7a0-8ed6-447e-9698-34555fd5ca4a)(content(Whitespace\" \ + 9441c1d0-4e60-489c-a9f9-4d3eff77315a)(content(Whitespace\" \ \")))))((Secondary((id \ - e89b5245-a255-4f8a-ac04-60cef6195a8c)(content(Whitespace\" \ + 3ed6de05-238b-44d8-97b7-b426127d6b52)(content(Whitespace\" \ \"))))(Tile((id \ - 192066bb-aad5-438d-8e1f-19e5693d9095)(label(fun \ + 41f40d53-d3bf-460c-8970-310ff30cca3d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - eca49d26-af1c-4cb0-b186-4a24ff62850a)(content(Whitespace\" \ + 934c9ba9-32b6-4129-af6d-66464bd39386)(content(Whitespace\" \ \"))))(Tile((id \ - fe826692-6323-41d7-8fcb-bfd3e3ba2892)(label(b))(mold((out \ + 67607314-a4b3-4b37-bc77-015a22caac19)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2f8d5a57-c587-4aad-bff3-5f623642dac1)(content(Whitespace\" \ + ccb99062-63b5-4c40-a196-69b672054250)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dfc09091-3ca3-459b-a6e1-8a9ea50d094f)(content(Whitespace\" \ + 4e311950-00df-4aad-87f8-4c9995a96d1d)(content(Whitespace\" \ \"))))(Tile((id \ - c0b14af7-353e-40ab-bee5-fea9554edfdd)(label(b))(mold((out \ + afba7796-49fc-42c6-8c97-978430e3f3fc)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 375a0e05-466c-440c-84d5-69f54b0fc10a)(content(Whitespace\" \ + 4f275799-c0b0-4bfc-b77b-4915b2affe8b)(content(Whitespace\" \ \"))))(Tile((id \ - e5df557c-4611-4c11-a6a6-18c1fba7a620)(label(&&))(mold((out \ + d2a36a8c-6fb3-4261-875e-8822456bbc4b)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ae1fa1ab-2e8c-4b30-b466-7295c94c8d92)(content(Whitespace\" \ + bfa1515f-4fb6-470f-9ae5-84919b8b59e3)(content(Whitespace\" \ \"))))(Tile((id \ - fe62cc2a-71e2-444d-816a-15bc9b2e591a)(label(true))(mold((out \ + fc0f19fb-229e-4187-b623-41ff6111b24f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ae289cd0-de0a-4ea4-ab0b-bb2f62b36dcd)(content(Whitespace\" \ + a3f15ef2-e460-4dfc-bb61-fbedba9ab321)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 158ec98d-65fa-4797-82c8-4eb2b53540d6)(content(Whitespace\" \ + 7a12e1cc-3f2e-45e1-be62-71b78097957c)(content(Whitespace\" \ \"))))(Tile((id \ - fb972cc9-ed9d-44e6-81a7-310d977a2a77)(label(f))(mold((out \ + 8df21149-a38f-49ed-84fe-5f5e83809637)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 817a3541-c039-48db-9381-8583b5ec2874)(label(\"(\"\")\"))(mold((out \ + 0c17f378-49e0-4eb2-b9fb-b90bbb8d740d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33b0c204-0a27-4e9d-b85e-a3e5903c907a)(label(true))(mold((out \ + d7b07adf-c1bb-4fef-be0c-920a54d9c5d0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 3883b692-ca0d-4995-9e95-4d7e64c841cb)(label(\";\"))(mold((out \ + 888fccf9-8e5f-4760-be1c-d606300b7bc2)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 08985975-bfa1-4be5-a984-7e0d407f31cf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4fdec0d0-d08e-450c-90a4-b71785ed2596)(label(let = \ + 4cc6a91c-e1dd-4f59-ba75-897ebface5dc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 44395e54-de4a-4d4a-866d-31c6991e7004)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cf40f0f7-f098-4077-b4cb-6d3aa1423dcc)(content(Whitespace\" \ + 345456cd-a4b1-4433-b6d7-aa0cdd8230b4)(content(Whitespace\" \ \"))))(Tile((id \ - 1438aa0f-c6ff-4d64-b876-6f3c52dbc0b9)(label(f))(mold((out \ + 670001da-ab32-488d-9c1d-abecd21636b3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6b8373b2-d79f-4bd8-95d6-a3f1c098baff)(label(:))(mold((out \ + d4bc69cd-616b-48e1-8f85-00af9db27d39)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4ee8eac6-cb4d-4ba8-b8da-e610a644f6ee)(content(Whitespace\" \ + a8adfc83-5436-423b-bb9b-96ce8d2e2ebc)(content(Whitespace\" \ \"))))(Secondary((id \ - dfedfe2b-c7c0-4653-ae18-8b1cc39cfd0e)(content(Whitespace\" \ - \"))))(Grout((id 92961956-917d-42d0-a28b-16983478b7ef)(shape \ + 44a16ef5-adbb-4044-9de5-9844fa570598)(content(Whitespace\" \ + \"))))(Grout((id 339c0c6d-0a89-4052-9bb5-bf42eeac7f1d)(shape \ Convex)))(Tile((id \ - 86a58780-42d7-4a2c-b6e3-3e423b97f59c)(label(->))(mold((out \ + 3905e512-9aa4-4ab0-b04e-f4786812da9e)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - af78881f-4064-49a3-aa85-d5478819950e)(shape \ + eaf562ad-0f2d-4bdf-90ef-31d39a5a7da6)(shape \ Convex)))(Secondary((id \ - 3d0b8787-3742-4e33-97eb-1a06fa7b81c6)(content(Whitespace\" \ + dbabd996-4165-454f-a9bc-ead809c6296e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7722b379-aa97-467b-869e-4d767d260321)(content(Whitespace\" \ \"))))(Secondary((id \ - 6da66252-4787-4102-93db-26180559f8fb)(content(Whitespace\" \ + 8662bc94-3013-415a-869d-1d1f89baf83b)(content(Whitespace\" \ \"))))(Secondary((id \ - 07a1d627-522f-418b-b031-3464780b9e7c)(content(Whitespace\" \ + b1098d8f-181c-492e-9ffa-58422fca5328)(content(Whitespace\" \ \"))))(Secondary((id \ - 86bdaab5-eecb-4b18-b358-42e4a1eeee32)(content(Whitespace\" \ + b7de2c10-4dcd-472c-854e-a3b7b64058e4)(content(Whitespace\" \ \")))))((Secondary((id \ - b4c41ec1-3534-4135-ac5e-b373438ca5a5)(content(Whitespace\" \ + a6201111-d191-46c7-9586-e5ea7a0d332e)(content(Whitespace\" \ \"))))(Tile((id \ - aa02f5d3-8c62-438f-b7b6-4efc2ee0b701)(label(fun \ + 72d906de-8061-4ed7-a353-7c8e6d3dfc6a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a6cb6af6-cff1-493d-ba59-49f02b8a8aeb)(content(Whitespace\" \ + d413d35c-d803-4c02-ac95-e683efd8591a)(content(Whitespace\" \ \"))))(Tile((id \ - 7b192f67-e318-474d-ac41-8113ac2a2ceb)(label(b))(mold((out \ + ebc05c7f-07a0-4b3c-ab67-833e556b156a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f3950b11-e5ab-42b2-96c7-b14f14a32be1)(label(:))(mold((out \ + e56cab14-55c6-4029-9154-6de5d2dc909a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - c506a2c7-177c-4f2b-83ce-60744a9c9b79)(shape \ + 9e985d5c-3879-4ca0-9147-32e752f1786e)(shape \ Convex)))(Secondary((id \ - 708f2954-5178-4153-a526-5112ab95ee8f)(content(Whitespace\" \ + 151feaa4-e7ec-46fc-a17c-3ca0c5cfd5e0)(content(Whitespace\" \ \"))))(Secondary((id \ - 5264170c-43c7-48f4-b145-a73105ec1075)(content(Whitespace\" \ + 4a4192a7-aa36-4575-a3b2-932cfe77d763)(content(Whitespace\" \ \"))))(Secondary((id \ - aa62e05e-4764-4eaf-aa75-d829095fdbdb)(content(Whitespace\" \ + 54cbf34a-1ef4-44f7-9ab1-c92024f9bc7f)(content(Whitespace\" \ \"))))(Secondary((id \ - 717247eb-16c8-4bdf-a85d-c09887b60158)(content(Whitespace\" \ + 5bf19363-b78a-4da6-9d20-b0b585ec440d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8b4e4e2d-8c54-4a39-855c-faf7f151aa94)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1a3e4129-52ca-4a1a-979b-12f7dcfa5ad1)(content(Whitespace\" \ + 023ddf1d-110e-4830-aecc-8bc19be454da)(content(Whitespace\" \ \"))))(Tile((id \ - aa15d7c7-43f5-49bd-8b03-f2bb42286fac)(label(b))(mold((out \ + 461c4005-40ce-4952-bbd8-f9631528a10c)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c0ffc66d-f344-4a75-85b0-333593e743fb)(content(Whitespace\" \ + 0cebaff7-5382-4cb5-bb3e-7e445f001f4d)(content(Whitespace\" \ \"))))(Tile((id \ - fc75a655-8394-45b0-a2ce-0a5b7afb803f)(label(&&))(mold((out \ + afc88503-3c16-4243-b465-14e807b66446)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 444d3c78-9510-48c9-9d07-68bc9f9f1c99)(content(Whitespace\" \ + 8c43f148-2876-4ca8-94c3-bd42fe927d4b)(content(Whitespace\" \ \"))))(Tile((id \ - f29bb6fa-ca63-4fc8-9955-87c507984a02)(label(true))(mold((out \ + 8da7da3f-1460-40a0-a975-5c4b6f042873)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5559c135-4878-403e-82e1-47ae069b2731)(content(Whitespace\" \ + f4806e9d-37d1-4390-8f94-4d1b8446119f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - aba57a68-db7f-4536-9e3a-0248b43b64eb)(content(Whitespace\" \ + efd7ceff-b80c-43fc-bc38-94c6392e23e4)(content(Whitespace\" \ \"))))(Tile((id \ - 36171d1a-2b3b-42ab-90a1-54c1b052e258)(label(f))(mold((out \ + 06ec0827-fe93-4fe5-a36a-5357069eb2f2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f77b5ee1-7f3f-451c-9112-badaef1ad16f)(label(\"(\"\")\"))(mold((out \ + cb5458f9-858d-46d8-b385-e03498a99ee2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 87f08c37-e441-471e-a0fe-006246b12c2c)(label(true))(mold((out \ + 051ca841-f108-44b7-a7e9-0567c885e11c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 3f71a4a8-f5e3-44d4-9af3-fb99b92ac81c)(label(\";\"))(mold((out \ + 236d7b22-3415-4a10-a0d6-785e958aef93)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 303fa164-06fd-459d-91d7-46073713d9f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fd075e9b-2378-4fd2-97dd-1251fe5127bf)(label(let = \ + 3e9d1246-8a0f-424c-b70f-49f31459b670)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 01d328d8-5a45-44cf-88a6-779b0b5a6614)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - be18dcf7-1d51-4ad9-a6c3-5050263d4074)(content(Whitespace\" \ + d68c60c7-dd64-4964-90c9-ca00c81958cb)(content(Whitespace\" \ \"))))(Tile((id \ - 3576fe59-2bef-4fe1-afca-d3bf11bc48c0)(label(f))(mold((out \ + fef2c656-6496-4d28-91a2-080777feedd5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 339fcd7e-cfe3-4fee-86aa-7b4d38b979ed)(label(:))(mold((out \ + 85c1cf30-5e31-469b-809a-fdaa68feb8bd)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 04f39485-efcc-4748-9a7f-b1c972321b35)(content(Whitespace\" \ + 35f9d94b-bb11-43e3-807d-cc592596f670)(content(Whitespace\" \ \"))))(Secondary((id \ - 49d0f26e-a2fc-4777-af5f-da06c24a7ddc)(content(Whitespace\" \ - \"))))(Grout((id cf0e1fae-2866-4058-946a-9d4a05b565af)(shape \ + f2b4dc48-256b-446c-aa2b-0490fb0862be)(content(Whitespace\" \ + \"))))(Grout((id 11bdafd0-4f45-469b-84e2-21b566b0283a)(shape \ Convex)))(Tile((id \ - d6c0b1b1-4b2a-4335-9879-efc9d8ed0c32)(label(->))(mold((out \ + 9dfef0a4-c410-40bb-9769-66b71533bf42)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - c74ae9f7-58ca-4f6c-92c0-050c5922bfe0)(shape \ + 235a8992-c930-4ed8-b8ea-ff8485e62472)(shape \ Convex)))(Secondary((id \ - cac7e3b8-a117-4451-8f80-b80686fb63b1)(content(Whitespace\" \ + 9a97bebe-6401-464d-a7e6-6326dfd82f79)(content(Whitespace\" \ + \"))))(Secondary((id \ + eed78917-2805-4dd9-ab2f-578dc40d493d)(content(Whitespace\" \ \"))))(Secondary((id \ - 8d2c451c-63f1-43a5-8f63-4b86b505e5ee)(content(Whitespace\" \ + ce69949f-2cc1-4dd8-bb6f-eb0441d28fd8)(content(Whitespace\" \ \"))))(Secondary((id \ - 5b2db501-7cc8-4101-9c6e-50d8287789ff)(content(Whitespace\" \ + f4ffca34-7871-48d0-909b-f768d52182b1)(content(Whitespace\" \ \"))))(Secondary((id \ - 70488382-8549-4512-9572-cdfa13f25028)(content(Whitespace\" \ + 68d33e96-e2f6-49d0-9e52-0d50b83e4b63)(content(Whitespace\" \ \")))))((Secondary((id \ - edf01e85-04e4-4df7-84f1-4b39b165e56c)(content(Whitespace\" \ + 4c325100-74c7-4bd2-8a89-232f0a0b414f)(content(Whitespace\" \ \"))))(Tile((id \ - 51780a54-63b4-4b50-8f95-7955f8f91f4e)(label(fun \ + 2c164671-2faa-4d84-ab2f-c0e341b529eb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6eedade5-f7f0-4206-8808-626d63028527)(content(Whitespace\" \ + 96018f05-2e0a-4eb9-9c97-ec586552a39b)(content(Whitespace\" \ \"))))(Tile((id \ - 44350841-7ce9-4e86-a8a7-7ec5773c092d)(label(b))(mold((out \ + 9572156f-8f54-47f7-8575-424ee16e5525)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fe716da0-f009-463b-8c96-b40774867f5a)(label(:))(mold((out \ + 40486f0a-2699-46f5-b2b3-b5783ddf1397)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 93b3a899-51dd-4b27-875e-6610990da6c9)(content(Whitespace\" \ + c3f8dafa-dca6-4ec0-bd3d-dab9ac106a39)(content(Whitespace\" \ \"))))(Tile((id \ - 9d1621f4-28f5-402a-8052-2d6fb623063a)(label(Bool))(mold((out \ + 7b932435-b4b5-4226-98ef-0ccf56798d13)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c8f22d93-c6db-4409-b7d9-6358146fe03d)(content(Whitespace\" \ + 4640e4ab-feec-43ec-966a-2024927f31e6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 49fe41b4-28ef-4af7-abdc-e89c12452cc2)(content(Whitespace\" \ + 5e3273a2-cf78-465b-97af-ee302b9ceb26)(content(Whitespace\" \ \"))))(Tile((id \ - b5c9ba5b-b251-46de-a704-c650d0366340)(label(b))(mold((out \ + a3f4f6a1-52ad-478c-914f-575b442b1950)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b1aa0527-7599-413b-b7c6-3c534e0a3c64)(content(Whitespace\" \ + cd921878-badc-4820-8511-ab89a24c2f0f)(content(Whitespace\" \ \"))))(Tile((id \ - 27eef18a-17b6-4e87-9ce8-0636ebb3b5b7)(label(&&))(mold((out \ + a8c0da36-61e8-4ce7-9e2d-20afdc25cfb0)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - da9fe58d-cef9-47d4-8a6d-0aef727660f3)(content(Whitespace\" \ + 9a994449-64a3-4aca-8f50-720723c163eb)(content(Whitespace\" \ \"))))(Tile((id \ - eee1a87e-3f40-4427-90d2-a8af27166716)(label(true))(mold((out \ + c2aed4b3-9fba-4f50-b40a-d2599b65bd7b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 47b6f8a4-6ddf-4e68-90bc-777c94a947ec)(content(Whitespace\" \ + 271ee3ad-cfd0-4394-adff-9de4c4c65ade)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4ba11c21-413c-4dfb-a2c4-056f592a7b29)(content(Whitespace\" \ + edcd8312-7c21-444b-8465-f865c635d041)(content(Whitespace\" \ \"))))(Tile((id \ - ae095a44-c1e1-4b31-b8c6-c632a6564ded)(label(f))(mold((out \ + 3131a2b3-8ad7-4919-aa06-6ddf6f56a2a8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dc8eb1f8-cd87-4cac-bac3-e16e2e3a5e8c)(label(\"(\"\")\"))(mold((out \ + 096de3ba-b14f-46e5-997c-d867c81fd6cf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d855252f-8692-4697-914e-bd3bbf08b9b3)(label(true))(mold((out \ + a1b648d4-1490-4d95-8182-04839dc3f538)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f00ba289-17f8-4581-8899-3b6429f52b5d)(label(\";\"))(mold((out \ + 5d58099d-f550-455e-b274-b8d44b673764)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e2b286b8-a540-40c8-95d7-e3b7561c2be5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 607644e8-6ef9-44eb-9851-09f6a87dbc82)(label(let = \ + 4ba5ad49-1425-44ea-9961-3bb16e514206)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 96ec8227-f5f6-4d9a-beb1-b6de5b4cfafc)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - aff7b64f-b2c3-4f43-adac-5bec1bd40f0e)(content(Whitespace\" \ + ee59cc36-6cc6-4a11-a7b4-863f1e8334b3)(content(Whitespace\" \ \"))))(Tile((id \ - cb828e27-2abf-4fd6-8390-92ae75883183)(label(f))(mold((out \ + 484b4174-f8da-4a33-932a-7644fe992b29)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3b461d7c-b221-4d76-ad2d-7cfa36d73911)(label(:))(mold((out \ + e8a7e593-6f9f-491d-a3c1-f6fac3e726a2)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7da883ac-b024-402f-9a9e-930fa0f4ed0f)(content(Whitespace\" \ + f83f64ae-470e-4f90-9d65-b89c75a4790e)(content(Whitespace\" \ \"))))(Tile((id \ - 15bb6429-a0fc-4915-b572-cb48eea378fb)(label(Bool))(mold((out \ + c9c237c8-500f-4464-80e6-0b8d7a216447)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 5390701e-cac6-4266-b8f0-eb2c77fa5b95)(content(Whitespace\" \ + c96d378e-344c-4693-92f9-f4f822a91c0e)(content(Whitespace\" \ \"))))(Tile((id \ - 4b941678-f474-4810-aadb-95c049f5d67b)(label(->))(mold((out \ + 620e8167-f2be-4612-8a71-713085cd3c55)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 8892dd8d-8aaf-460c-a0a9-bd8836ceba15)(shape \ + 9692a327-cb2d-410f-a3f3-17876dbefa6c)(shape \ Convex)))(Secondary((id \ - f27ba5e8-4ac2-4f5f-a562-e4716c66f8fa)(content(Whitespace\" \ + 1fe2bfe4-02f8-41ff-ae0e-e2d599cd1c61)(content(Whitespace\" \ \"))))(Secondary((id \ - 9092ab11-609a-4bbb-a688-a5612ba88eea)(content(Whitespace\" \ + eebaa091-1ad8-4a9f-b9f8-e4704cf2b787)(content(Whitespace\" \ \"))))(Secondary((id \ - fe04f82d-60f6-46c3-ba70-b940e7aef277)(content(Whitespace\" \ + b87b6471-1c91-4f85-8bae-fa61c7e9da6c)(content(Whitespace\" \ \"))))(Secondary((id \ - a368fcd7-4a37-4743-81b7-69794b1875fe)(content(Whitespace\" \ + e07768f1-be7e-4d7c-b24c-df2241caeff7)(content(Whitespace\" \ + \"))))(Secondary((id \ + bbbf4ea7-5fe0-4c21-b88d-20f99e2c19a5)(content(Whitespace\" \ \")))))((Secondary((id \ - 3096a059-f4f3-4ed0-87df-da4568b5f30e)(content(Whitespace\" \ + 97cfd64c-f6ed-4827-b18c-b37ff8ee0ab1)(content(Whitespace\" \ \"))))(Tile((id \ - 0ee03a55-10ef-43bb-9a38-adfd112d0b21)(label(fun \ + 51d12a97-54a8-42a4-af38-4b46ee5f1fea)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e8405540-dadc-4a6b-9090-968cab9f4ec8)(content(Whitespace\" \ + cdf1bfa9-4c7a-4c90-9219-3bb6cadfc401)(content(Whitespace\" \ \"))))(Tile((id \ - 53c2eaaf-6a43-4a10-98c8-15b4adecb51b)(label(b))(mold((out \ + b9caeb1a-13b9-41ba-87a0-7048f4b2c085)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4d116565-adb1-44e6-88b8-08067ec749ed)(content(Whitespace\" \ + 47d38601-0a62-4421-8186-4725f5e86b0e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 07491eae-5f14-454c-a01f-e92b2d43476e)(content(Whitespace\" \ + 404685af-9999-4d72-a83e-f00dee7c3070)(content(Whitespace\" \ \"))))(Tile((id \ - 14768e36-1522-412f-ad60-84f6cb4024fe)(label(b))(mold((out \ + 5a20a632-5831-4b43-91ee-c89296ac87c5)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 88d52fbf-dd8f-4395-a4e2-e7589a0fde2e)(content(Whitespace\" \ + 27b52b4b-f200-4ea4-a6b4-4a89f1f73350)(content(Whitespace\" \ \"))))(Tile((id \ - 117f9f20-ed82-4fda-b808-b53505ed579a)(label(&&))(mold((out \ + e46dfb03-2909-424f-a544-eee9173a06de)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7f93c156-6ac6-43a5-a74b-136abafcd5a4)(content(Whitespace\" \ + bc62f67f-2872-48cf-9d3b-d4b161c9713c)(content(Whitespace\" \ \"))))(Tile((id \ - c5ee6d7f-f44f-446c-8b96-3e8ac217de4d)(label(true))(mold((out \ + 6198cfa1-3918-4af3-93aa-2737f4e2300f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8ee9ccbb-e25c-4088-bf47-cf7cb4927fc0)(content(Whitespace\" \ + 648999a3-e9cd-4572-a1e8-91069847516f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b42da58f-e0d7-4125-8893-8462f1364c24)(content(Whitespace\" \ + 33ac7908-d5a5-440a-97aa-daa7feae7abb)(content(Whitespace\" \ \"))))(Tile((id \ - c7afce13-1a50-4cc1-920f-e2388f12e3db)(label(f))(mold((out \ + 8a3ac91a-9de0-4fb1-a6c6-39f34f5e5ce7)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fe04ff53-5035-4348-8e19-6bbd201a94ce)(label(\"(\"\")\"))(mold((out \ + a6dfbc30-52c0-4961-8359-6a7cbccf5050)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 07110fd4-3a2f-4526-b81e-b455e9a6c219)(label(true))(mold((out \ + c1d5a8cd-0c31-4545-b4a7-668574a2262e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d4d0a0b9-e058-4125-8e84-d7468da7fd54)(label(\";\"))(mold((out \ + cc7f868d-169b-48a1-8776-708fdbb271f6)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3cc036b7-e238-4e67-a979-e3abbb186e28)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6e183e3b-74e1-4695-82bd-ef5adef388da)(label(let = \ + aefaefe0-c489-459c-a90f-676a273e45d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dfb2c3d9-d26c-41ac-acd4-331d8f18fb38)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9fc8778e-5301-4b64-a49e-19f116aa5b0c)(content(Whitespace\" \ + 5c1ca163-3b80-4b33-9131-e26af61def24)(content(Whitespace\" \ \"))))(Tile((id \ - ea332fc6-7449-4924-8870-3be08c4e52d6)(label(f))(mold((out \ + 015a9c9d-49fa-48f4-af81-41f8a9176910)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c9ef1dd9-0790-475f-9410-df6f14bb77e8)(label(:))(mold((out \ + f3229705-7b06-4a16-bf2d-ccad56fdd66b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7af9817-0186-445e-b6ee-a891ddaec1bb)(content(Whitespace\" \ + c20b44cd-647b-4dd4-a55e-f52e09387e3c)(content(Whitespace\" \ \"))))(Tile((id \ - 0a7c72ef-f826-4520-8b64-ca08abb5c238)(label(Bool))(mold((out \ + 0578cab9-80e2-469e-a804-283cf1ad16e0)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ce9b598e-f5bd-4877-a113-63231400684c)(content(Whitespace\" \ + 4dd87f5a-457d-4000-84d8-6981913a19a3)(content(Whitespace\" \ \"))))(Tile((id \ - 997038e1-7918-45fd-b0da-e2335334bf39)(label(->))(mold((out \ + 4db7eb0d-f6bb-4382-8e9d-7d5855f2e45a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - baf88c08-cf17-4bc7-8ad9-3af846a6acb5)(shape \ + 199f7341-a052-4082-b8dc-3beb7f770f2b)(shape \ Convex)))(Secondary((id \ - 7af26442-ed9a-480d-9c23-cb9dc3dc07b4)(content(Whitespace\" \ + 6ad8f43e-b537-475e-92d8-a183e2671f09)(content(Whitespace\" \ + \"))))(Secondary((id \ + 22e493c1-5a71-4364-8ff3-e8dd42ffae23)(content(Whitespace\" \ \"))))(Secondary((id \ - a3efb0fd-6fe5-4e4b-bce6-e4c35d4de49a)(content(Whitespace\" \ + 6d68c6a5-992f-43af-afd9-2c1a3485be89)(content(Whitespace\" \ \"))))(Secondary((id \ - 37506495-f207-4790-8302-e6653b1a8f34)(content(Whitespace\" \ + 56a53905-0b29-44d5-ad1a-1a9a367ccafd)(content(Whitespace\" \ \"))))(Secondary((id \ - 8af1a52e-256b-49f8-87d3-4e8ea414a998)(content(Whitespace\" \ + fda42f56-3909-41ab-adbe-b4e3ffba46b4)(content(Whitespace\" \ \")))))((Secondary((id \ - 6d3f0189-eb41-42ef-9048-8c6494d6aed2)(content(Whitespace\" \ + 5b312070-fc46-4386-9087-2e4eb7a90a40)(content(Whitespace\" \ \"))))(Tile((id \ - 5408e15b-fa72-449c-a7df-782530d70685)(label(fun \ + c31efc42-92bd-4b1f-98d9-f8403b2bd353)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4fa73419-93a6-493a-98ba-6e7532066467)(content(Whitespace\" \ + de4d1d1e-a36a-447c-b4a7-b6d388726378)(content(Whitespace\" \ \"))))(Tile((id \ - 8aa20bf3-e66b-4496-9c03-b714ae6bee6a)(label(b))(mold((out \ + e705d8a6-48de-40ac-bf4e-4a993716e2f5)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 42a20ea0-2270-423c-b399-f1aab1921b14)(label(:))(mold((out \ + 9faf313a-e902-4342-8bd8-60e31698845d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 6ff47399-1766-415a-a8b6-f62032588af4)(shape \ + 0a141009-2224-4fe7-aedc-57808fd406b9)(shape \ Convex)))(Secondary((id \ - cb6aaaf7-768f-4226-a314-b116486c8501)(content(Whitespace\" \ + f6e2c333-3948-4ed0-bb23-52de82e718d7)(content(Whitespace\" \ + \"))))(Secondary((id \ + 35f1c7ad-3ce7-4820-b4a3-898c428da870)(content(Whitespace\" \ \"))))(Secondary((id \ - 6a787b5a-d39b-4579-9332-05ab2dc48134)(content(Whitespace\" \ + 8cb15049-4f0e-4edd-a312-526f63325b47)(content(Whitespace\" \ \"))))(Secondary((id \ - c65a5173-7735-4440-857f-d51a90bea271)(content(Whitespace\" \ + fa43b01b-cb39-4cad-968b-654553ea709a)(content(Whitespace\" \ \"))))(Secondary((id \ - 75108fa4-6ffb-4d43-9b57-406235b5b83f)(content(Whitespace\" \ + e0d4cb94-44b0-413e-aea7-e8ff5defbea0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cb720542-197b-461e-a5ee-46e7e4deeee4)(content(Whitespace\" \ + a11341f9-b8a9-44e5-a04c-2579378cfd2b)(content(Whitespace\" \ \"))))(Tile((id \ - 577e7880-2413-4a2f-ada4-9126ed7e0a15)(label(b))(mold((out \ + bce55a9e-3000-4e8c-8fe4-8fc0a45dbb07)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1e875e5f-9161-4cb1-b5af-0f6587ad9a5c)(content(Whitespace\" \ + c6c901f2-2d3d-4788-ab41-bb14f9d81d70)(content(Whitespace\" \ \"))))(Tile((id \ - 86dacbfa-6493-4286-bb07-35c46a2fa2a3)(label(&&))(mold((out \ + dd2780cf-f96f-4b13-9520-b06e352c1184)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9abb6439-2736-4ce4-a6b6-749666784819)(content(Whitespace\" \ + 2802c239-3dce-4afd-8b3d-a5f17b6c49a4)(content(Whitespace\" \ \"))))(Tile((id \ - 8655cf90-51ac-43c9-ada4-cff8f97ead68)(label(true))(mold((out \ + 554e55fb-140a-41ac-9297-bb637b418b78)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 282d1bb8-ea70-4042-a04f-107235a4885d)(content(Whitespace\" \ + 0f1edec5-fa60-469d-a10d-8e83f7deab1a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 53842990-0694-496f-91b1-b570d6adfb27)(content(Whitespace\" \ + 27eb87fc-73d2-4af0-89c6-c3e9f18db8cf)(content(Whitespace\" \ \"))))(Tile((id \ - 183447e3-4b15-41ea-a7dd-b7bc86954e47)(label(f))(mold((out \ + 64c54a8c-0bf6-4a8f-824e-0c6852b5f9ee)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d40784b-8087-4ee7-94d4-c8815877c21a)(label(\"(\"\")\"))(mold((out \ + 3978b95b-b042-4db4-87b7-cfa0c6d07541)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1cb699db-1917-42fd-983c-f9bf7447a84f)(label(true))(mold((out \ + 01389a6a-40bf-481a-bdf8-292731c99c71)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 07c7e0f7-6179-4deb-a221-4528c988a1ed)(label(\";\"))(mold((out \ + 4baf1e3f-8382-4e98-8e80-184b54aec095)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6e753517-5f81-4bba-b4c7-2c509758d84f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cd2fd3f1-14c2-460e-b2e1-f6ca6ea5a4da)(label(let = \ + c0dc0ee4-46c5-4477-9cc6-807e9177f9a4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 51b97558-4055-45df-927b-fb265bdf5bfa)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ead08dee-c899-4c4c-8e29-e67e21f275be)(content(Whitespace\" \ + 2b8cae90-b0fe-4b4b-b588-3ab3f0179e6c)(content(Whitespace\" \ \"))))(Tile((id \ - 7b27357f-379e-4ed1-a6dd-3e8df595887f)(label(f))(mold((out \ + 14a62537-ed95-48a3-be96-4cbd3180dfcd)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d14e2b06-cb14-44a6-9490-049e834cd139)(label(:))(mold((out \ + 06c401be-259f-4a9b-b9d1-b1c150e3a242)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - df28aa72-1e7b-4b30-89ba-b5e108befafe)(content(Whitespace\" \ + 9e49fe6b-6c3a-490a-91cc-877850d74b7a)(content(Whitespace\" \ \"))))(Tile((id \ - 749ff386-870a-413e-bd80-517177d9e2da)(label(Bool))(mold((out \ + aafc41d1-3e03-4087-9449-a2bf4ed30c18)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0ddd711a-d270-49b4-a894-21a6c7179ed1)(content(Whitespace\" \ + b9de13d2-fdb7-495f-8439-3b556350ec62)(content(Whitespace\" \ \"))))(Tile((id \ - 1e5d478b-aced-4a6c-8a20-c0264fd86a63)(label(->))(mold((out \ + 1f096804-096d-4e60-a161-aa5b8fd96038)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - a8fef003-fe1c-4359-9648-8b1e8078e8ab)(shape \ + 22ddace9-28eb-4ecc-9d3f-fcdd87ad469c)(shape \ Convex)))(Secondary((id \ - 4e5add81-10ae-47dd-81e1-378863dbf6cb)(content(Whitespace\" \ + 3ce9bcc4-159c-4acc-9672-d5c5f9f794c8)(content(Whitespace\" \ \"))))(Secondary((id \ - 25bec1ce-c291-41de-8138-24c5571192a8)(content(Whitespace\" \ + 01d48d24-742e-4597-bae0-165889ab457e)(content(Whitespace\" \ \"))))(Secondary((id \ - 8901204d-5e88-4743-b328-fd6d02bb631a)(content(Whitespace\" \ + 2b9b0e3b-e927-439b-b0c9-5e7ba1da88f8)(content(Whitespace\" \ \"))))(Secondary((id \ - 7496f078-dda7-423b-a0e0-c11464c48065)(content(Whitespace\" \ + 5ea3e328-ebf6-4aa0-a1c1-09a86ea5453c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 82d5d81c-83cd-4543-8a68-59ba34e77972)(content(Whitespace\" \ \")))))((Secondary((id \ - b6d30c79-7828-4bb2-8dcb-83c4186ef4c2)(content(Whitespace\" \ + 7d2fb8a0-183b-4461-94c0-22094f91e3da)(content(Whitespace\" \ \"))))(Tile((id \ - a6b326d3-8c80-4ef7-9311-93dbc7ea5030)(label(fun \ + ccce627e-8ed9-4548-8b20-fb21c2336f88)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e9cc3ead-61a7-4702-b488-484711c1cf61)(content(Whitespace\" \ + a98e10cf-083b-4fd2-b1d0-8b48158594d4)(content(Whitespace\" \ \"))))(Tile((id \ - 5368e2f1-bb85-4e0b-b979-ec4dc24b07bf)(label(b))(mold((out \ + 8304c105-574b-4ff2-8bd0-49ec6fff1ab1)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c9908b3e-ab5d-4f95-b98a-6887a6830fee)(label(:))(mold((out \ + bfbd35de-d70b-4722-83cc-d8d4274e38c8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a65b3116-86ef-4f71-b6ae-b3a3e0edbcad)(content(Whitespace\" \ + 8eb4dc36-4e5d-4fde-b4d8-825f6a72a669)(content(Whitespace\" \ \"))))(Tile((id \ - fb016d50-6fb5-4ebe-898f-741ed4f6a501)(label(Bool))(mold((out \ + 9aa05c03-3d06-4fbf-be2a-4e108738f262)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 62ed6924-d011-4c35-b9dc-5d302e45a9a0)(content(Whitespace\" \ + 03545f59-d1d0-458e-a76c-2f1b3b7f597d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8655939a-cdcc-444a-9e5b-58a38312380b)(content(Whitespace\" \ + 27cdcb58-f75e-4d2c-8eaf-bbba044374d4)(content(Whitespace\" \ \"))))(Tile((id \ - 6241f498-000e-4e9d-8eb0-19e5852e3daa)(label(b))(mold((out \ + e3c8fece-e098-49cf-9aae-f190fdfb8734)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8fd7adde-b656-443f-9f04-2e787140e620)(content(Whitespace\" \ + ee56f34e-620c-4943-8e54-35c18c629342)(content(Whitespace\" \ \"))))(Tile((id \ - 7f4df1ad-a870-476f-864f-919be18409d5)(label(&&))(mold((out \ + 98682a79-5211-4c97-a12b-c19d576a8d53)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c195a743-f704-485e-bd35-3190c7694021)(content(Whitespace\" \ + 3f9aa75e-0848-4a4d-bde1-881c1f0089f7)(content(Whitespace\" \ \"))))(Tile((id \ - 1f2eaed1-718a-40c1-96ce-2c31348d2ece)(label(true))(mold((out \ + 2bb60bea-2c86-4c12-9b19-968ff80f143e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d4c262b6-7c1d-41b7-b7ae-9129f2a0b480)(content(Whitespace\" \ + 7175ac98-f0d1-4822-beea-f8d33f878cf7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2e9b4c20-7c72-4d43-9589-605a8dd447d6)(content(Whitespace\" \ + 9a3fd89e-dfa5-4ddf-9874-5ad61930698d)(content(Whitespace\" \ \"))))(Tile((id \ - 1c0ecd06-bf0f-458c-94cc-068248093c83)(label(f))(mold((out \ + 5e8b3a5a-61ed-4b75-b49d-5a43a09c0f52)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e3aa329c-f6bb-4f9d-acf3-c793ce2c9706)(label(\"(\"\")\"))(mold((out \ + b1f8562d-3e9e-4223-b21d-6f58d4bcc059)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fc28aa29-9ae6-4484-b792-3ae1266f26e7)(label(true))(mold((out \ + 40d534dd-11e0-40a1-90cc-28113e7763ff)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - ea9f9cf7-86c0-4595-aab5-caaa8bc17fe9)(label(\";\"))(mold((out \ + 0e6526da-0046-4138-94de-e82946772cfc)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f1653f68-0798-4ffc-b840-574d203b692f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c50c2d45-9780-4232-8dbf-14f335bd2f61)(label(let = \ + 2ef640fe-5954-4cbb-b021-55b3b587cc04)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a19c56f1-a816-4e38-aea5-0d6f420485a9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 32fceaf3-6778-43fa-bc28-f7a27f23505c)(content(Whitespace\" \ + 98128ccf-eb80-4274-a9f8-11446c56b5b5)(content(Whitespace\" \ \"))))(Tile((id \ - 8579a942-bfde-481d-9079-416b47bb33b8)(label(f))(mold((out \ + e7ea6026-d6ba-4f07-a0c8-d047bd2f7345)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 808ed137-190d-4cac-af68-fdc1addff0db)(label(:))(mold((out \ + 44557d34-334c-4d06-9385-51e758dc83e7)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 80a1f4cc-8d76-4f92-97de-e0a3e580075c)(content(Whitespace\" \ + fec09f88-6801-42a7-9175-9ef7303246f7)(content(Whitespace\" \ \"))))(Tile((id \ - fc9db7be-38c8-40d0-9e34-c119c62a6cf8)(label(Bool))(mold((out \ + 2c2a1818-84d8-4c58-bc5d-3b33005ddb1d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0911ef58-83c2-4fb3-a0bf-e014a6f90518)(content(Whitespace\" \ + 57a45db0-c303-4c3a-bf1e-01f25e6a0ed2)(content(Whitespace\" \ \"))))(Tile((id \ - 85d9004e-d1f1-4a82-9a97-542bae897256)(label(->))(mold((out \ + d7063e08-d506-42fa-ac6c-4ae28161a2d9)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e4947b8d-a648-45bc-908c-8ecd554c347e)(content(Whitespace\" \ + 10b217d4-3767-4336-ba63-ba8e6b3cb32f)(content(Whitespace\" \ \"))))(Tile((id \ - 06957c9d-9544-4b0f-a8bd-eb8de824cc4b)(label(Bool))(mold((out \ + 85bd9a4c-faea-4a76-b8f0-cf6d37a6bc08)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 88d2133d-65ca-48dd-a34b-c2e4c2419c8b)(content(Whitespace\" \ + 2bfe4276-4545-4fd1-a956-8199488be84a)(content(Whitespace\" \ \")))))((Secondary((id \ - c0148ed3-43e9-4229-b070-262ff31c9325)(content(Whitespace\" \ + a0123bb1-437f-4087-bee7-a806c490d512)(content(Whitespace\" \ \"))))(Tile((id \ - 062649a4-d793-4701-a715-8d18f88b0011)(label(fun \ + 19d73c19-8fa2-457a-b7af-2df583748713)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 893bd5a2-c636-4940-80bd-9f3a96566c71)(content(Whitespace\" \ + 3f1e9ee0-1072-41a4-a399-b8883997ad74)(content(Whitespace\" \ \"))))(Tile((id \ - b0a16173-d490-4ae3-9ff5-fd4bae050f87)(label(b))(mold((out \ + 8ff514ba-39bc-4814-b9b2-b2f96459433e)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 56326c7a-4315-4a55-8c3e-ab562ada3b3a)(content(Whitespace\" \ + f4644458-7e5b-4845-a044-ae6258f9b034)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 73c8ed36-8d00-4379-85f2-a3f636079e46)(content(Whitespace\" \ + b8374dca-8331-4521-bb0d-fa528029b446)(content(Whitespace\" \ \"))))(Tile((id \ - 1a75a52e-876e-4b88-a727-2d730dd79cfb)(label(b))(mold((out \ + 5600f0d0-e653-454c-8c78-7ef3c536ccb0)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16e191a8-53c6-4f75-b276-789d19f6a358)(content(Whitespace\" \ + 5ffd63c6-4a32-4a55-9ae1-4678ab18c632)(content(Whitespace\" \ \"))))(Tile((id \ - c1c34c01-a4c7-414e-95bb-7aa96155c336)(label(&&))(mold((out \ + 9a0d1541-040f-4005-bc06-0de95750ec66)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 184c6ea6-7f7e-4aa6-b6dc-243443cb1697)(content(Whitespace\" \ + e388c305-99b7-4e44-86a1-3f0d2f6db4f1)(content(Whitespace\" \ \"))))(Tile((id \ - 586d5d90-9a02-4714-9ae0-69c89a77cfea)(label(true))(mold((out \ + 8ce8a964-f121-45fd-902e-2d3c921b202e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cfc091f3-f70c-48c5-b938-bb0680fd798c)(content(Whitespace\" \ + 2b9a92dd-ee7b-438f-b11c-8c933b4c5dc8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a1976d2e-00ed-4958-919e-44900a4570c2)(content(Whitespace\" \ + 3cdf446c-32f8-4537-b8e2-d19635cba9e3)(content(Whitespace\" \ \"))))(Tile((id \ - b92e0d96-b298-4993-ac88-c43a3ca77d8b)(label(f))(mold((out \ + 885c9638-f14c-4209-a18d-0027b9d60ee9)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f8088b58-78f8-4c6c-b234-6f543af846f7)(label(\"(\"\")\"))(mold((out \ + 0959e0af-9d29-4781-ab5e-cb4e47eec8ac)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 08aeb418-feba-4323-8063-ec811ba6b00c)(label(true))(mold((out \ + df1ede34-f81f-4872-b3a0-40e465e76686)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 577cf875-4d37-449a-bbb8-f7c44d5ec69b)(label(\";\"))(mold((out \ + 4d2fa6a7-1ce4-452d-9d9f-87c6e90ff090)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd0b3675-ad83-4de8-a027-82d47a271e36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fead603d-0a15-4ab7-bfd3-7d1e055ccd5f)(label(let = \ + 2eb49856-902d-404a-b748-5feea0ca1768)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7a8e41c6-5e9d-44cc-b4eb-7cbfdacc1553)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4d2f7c38-d842-47ff-8757-c439befee20d)(content(Whitespace\" \ + cfdf24e8-9a1e-4706-a496-1d4e02d66678)(content(Whitespace\" \ \"))))(Tile((id \ - 92fc18ed-f0b5-4d7b-a967-0d67d6b12507)(label(f))(mold((out \ + 2c18ffbd-d1a1-473d-97ad-5f7ab8b2c912)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 00616c8e-76d1-43bc-ae69-6b96c0fa95de)(label(:))(mold((out \ + 4464bd4d-b398-4b81-9b91-1c1d1bd359fa)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 56c4a13b-c2cc-471f-972f-5e4e1fde8478)(content(Whitespace\" \ + 83f46475-1e0b-4ef4-b673-b8f1a32d41de)(content(Whitespace\" \ \"))))(Tile((id \ - 4055948d-188d-4c29-b8d7-6ae34387768d)(label(Bool))(mold((out \ + e9702d52-7f41-4388-af63-657a7220eaad)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ced2efed-8785-48ea-9196-f55c0a22c813)(content(Whitespace\" \ + 76b34502-9430-45ed-a772-5fbc6a9be180)(content(Whitespace\" \ \"))))(Tile((id \ - 73091ac9-3a45-4bc7-ad14-18116f8f23a5)(label(->))(mold((out \ + 20ece6f4-e474-4ac2-8694-e3dc032735b4)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 930ebd52-b938-4621-8a20-4ebff2d70ee1)(content(Whitespace\" \ + 2003cf1f-e928-41a1-a5e3-099d2b178a7f)(content(Whitespace\" \ \"))))(Tile((id \ - 0ab69d05-ccb7-4ee3-9bab-a323da5713a3)(label(Bool))(mold((out \ + 13542ada-13e7-4363-a5f6-26c5368b23c3)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8dc58755-7da5-4cd9-b3e9-ebcda8d5c182)(content(Whitespace\" \ + 650ef260-46ab-48b4-8c90-ec74bc051db4)(content(Whitespace\" \ \")))))((Secondary((id \ - d9059153-9f06-427c-bee0-37cc240fab05)(content(Whitespace\" \ + b4529b9b-30ff-4d26-bde9-1335db00c6c0)(content(Whitespace\" \ \"))))(Tile((id \ - ca134b4e-b4b7-4c3c-9fab-e24fc264a477)(label(fun \ + c6f437ed-3ead-4a0f-a94e-4c26491aa33f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a63e6ef2-1c9c-412c-a3fb-6d99800fd79e)(content(Whitespace\" \ + 399a8732-ec09-49cf-a7f8-8328d63f0286)(content(Whitespace\" \ \"))))(Tile((id \ - b837de0c-57f4-43eb-94d7-1c54403ceb0c)(label(b))(mold((out \ + f90f910d-d864-4376-bba1-541c48e7d7b3)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1b746e81-503f-49aa-8377-91afb8447ab9)(label(:))(mold((out \ + 86642454-aab9-4523-ab80-bdd57e8959d8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 43b8150d-0456-44f0-bd2b-1f4e61fc122e)(shape \ + 9441d59f-1241-4f7f-95b3-5dbaa808989d)(shape \ Convex)))(Secondary((id \ - a9324d1e-f1fb-4505-9f84-0f0bc47e47b9)(content(Whitespace\" \ + 65913e11-3203-4336-9321-c22a775f2ed6)(content(Whitespace\" \ + \"))))(Secondary((id \ + e438a443-ab82-4444-96ac-a79f88fa6043)(content(Whitespace\" \ \"))))(Secondary((id \ - a1db7c87-0f69-47d5-b371-a7864711139b)(content(Whitespace\" \ + f92a6dcd-708b-44ba-9111-1b95448c0e39)(content(Whitespace\" \ \"))))(Secondary((id \ - 1f8935b0-5ee3-4e9a-940c-6670a364c6e2)(content(Whitespace\" \ + 5389d635-f2a9-4c54-bd67-ba2d40f02507)(content(Whitespace\" \ \"))))(Secondary((id \ - 151a15aa-7a6e-4c29-b70b-84f074e5f288)(content(Whitespace\" \ + b4b18b98-2ec8-429f-93c9-db90a4a18da5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7f88a01b-8031-4a23-9fdc-c462aa979645)(content(Whitespace\" \ + 9483c348-a09b-47fc-a3df-0ac8e8b889d3)(content(Whitespace\" \ \"))))(Tile((id \ - 61eff510-da2c-404a-8fc2-1db816db79f0)(label(b))(mold((out \ + 60f2da67-9cbd-46e7-92bd-a4d6559271a7)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d5853605-33dd-42fa-b7ac-a917e7e26e7d)(content(Whitespace\" \ + 9fc8d718-c1e2-4abe-9c3b-80ae5f211b1e)(content(Whitespace\" \ \"))))(Tile((id \ - e7956a81-da26-44ea-8681-60dcd13b4a30)(label(&&))(mold((out \ + bbac6b16-cb7f-4010-ba4e-72fb7680e08e)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ef3120a3-e345-4222-a368-c66e97de51d6)(content(Whitespace\" \ + 18b1c92a-a5c2-4e65-bdf4-bad8219ac43a)(content(Whitespace\" \ \"))))(Tile((id \ - 056196b5-3381-4193-b928-248c62e9a631)(label(true))(mold((out \ + bdb128b4-b722-4d11-b512-4a12bdd52bc5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0a824d69-1162-4e44-b44a-d126047683fe)(content(Whitespace\" \ + b1f07ebc-d87f-44bf-bf6e-bfd25fc0a1d0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 18240d48-47e7-4711-b6df-4ec3d94e2acf)(content(Whitespace\" \ + e91971ff-13df-4635-915f-bb0848c342d0)(content(Whitespace\" \ \"))))(Tile((id \ - 91ac08bb-0e40-4b8f-bac2-8fe0c597f367)(label(f))(mold((out \ + 87cb2b65-acd0-40b7-8c78-029134db7160)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c5c67012-2c5b-44a3-82a4-149cd39b37ee)(label(\"(\"\")\"))(mold((out \ + d108db24-3242-40e0-bf0a-b0e7e43c608e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 14354e42-77c3-4ae7-bfbb-f003bf32a701)(label(true))(mold((out \ + b485d614-c9bb-4bc9-a203-16b73ebf346f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 66103e4f-e225-4667-a63f-82c16de4f7ee)(label(\";\"))(mold((out \ + 4ddd71d0-4bb2-48d2-955c-ef3328946282)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 93fda463-0ab7-409b-9594-14a1c539b2b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1ed68432-4e8f-411d-8233-d133b200cb6d)(label(let = \ + 2152af54-f0c0-470c-8813-e58a1d7bbb60)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 65043ff3-6dce-41bf-86f4-e2f2702de6fd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 172b22fa-e177-4328-80e5-f7ec221b3944)(content(Whitespace\" \ + e5027c61-0c83-4387-aad8-7c57b1e02b32)(content(Whitespace\" \ \"))))(Tile((id \ - c9fee522-6a29-4a23-a524-d82d0fb4329c)(label(f))(mold((out \ + dc7273f2-0d50-458a-8f9e-985aa162d16a)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 17f92c8b-077e-4e6c-9d1d-e260b90b74aa)(label(:))(mold((out \ + 61dcdae9-5537-4509-976f-31ea5a31dfa5)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b074a49d-5c8e-4ec4-b36e-6d1cc4c0203d)(content(Whitespace\" \ + ebaaf9bc-ac82-485f-9d92-4646e148468f)(content(Whitespace\" \ \"))))(Tile((id \ - b51b45b6-f44e-4964-b221-771cac279275)(label(Bool))(mold((out \ + e1430b36-4e7a-40d4-81ec-be2fb3c46e55)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1ddce984-706e-4e01-8b92-6f23fc776ca3)(content(Whitespace\" \ + 9279ef56-b02b-424d-8af6-20eb45f33767)(content(Whitespace\" \ \"))))(Tile((id \ - dee3a1f7-25d2-4c85-9e56-2e2ac037258e)(label(->))(mold((out \ + f1f6ca79-b481-4b65-8747-127671befa58)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c393f505-6e3d-4df5-82ae-b6102e4080e7)(content(Whitespace\" \ + 24e89e5e-4f12-45b6-9d27-cd79d024ab3c)(content(Whitespace\" \ \"))))(Tile((id \ - 09d6ed39-9bd0-4a88-a72b-423e5b57c08a)(label(Bool))(mold((out \ + 64cec726-87a6-495b-bd78-f2682f07d4c1)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 5864d9d4-7c3e-43d6-a5d6-7ad5f9f1acca)(content(Whitespace\" \ + abe4350e-19f8-4d6c-ab9b-29a77b2f50f7)(content(Whitespace\" \ \")))))((Secondary((id \ - 2c3b7f07-ea58-41aa-9271-0045bed697fb)(content(Whitespace\" \ + 2f2577f7-9dd2-4064-81ee-ecbc3cb8928b)(content(Whitespace\" \ \"))))(Tile((id \ - 194d000b-1879-441d-abf3-1d0f9e9fd41e)(label(fun \ + 68eda258-5832-4cd8-8694-37321878756e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 569d6241-2573-4452-94e7-fe3b02a60580)(content(Whitespace\" \ + e502e437-a087-4576-8436-27f3213a2cd6)(content(Whitespace\" \ \"))))(Tile((id \ - c8626215-cc1e-4b3f-9ab9-373683820459)(label(b))(mold((out \ + a6f283b2-c95d-49bd-a8dd-55947e2a1270)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd1230bf-e193-4ee7-9773-036f1bd3a0ba)(label(:))(mold((out \ + 3bab8d58-d0ad-43f2-b149-d84f78dcd61c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8da5d4eb-e237-4f38-8552-7d1b1d7d1dbe)(content(Whitespace\" \ + 8bca23ab-78c4-4ea3-ba15-c0223e504d33)(content(Whitespace\" \ \"))))(Tile((id \ - 7bbbefa3-e855-4cc1-8f27-f50ce3c8adda)(label(Bool))(mold((out \ + 3b819b9d-669e-4d1f-ad5e-fd2dfce7f12d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - dd46425f-60f6-4464-8b8b-df9d4416d0a6)(content(Whitespace\" \ + 35c887e9-f52e-47d9-8121-4be61869454c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 635a9e1d-0eda-4e55-becb-377c87fce358)(content(Whitespace\" \ + 3b036e98-60cf-472a-9e8f-01c5ced8a8d8)(content(Whitespace\" \ \"))))(Tile((id \ - 901bb792-99ab-469a-840a-de204d95d61d)(label(b))(mold((out \ + 0bb2edf1-0cc1-41f9-8e9a-d80e8b0637e3)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c7e709fd-d98d-4744-af81-bc21fbb9dcaa)(content(Whitespace\" \ + 05d20c47-aa5b-496f-b72d-6d9447cc6d70)(content(Whitespace\" \ \"))))(Tile((id \ - 6cfc72b4-0b90-4bdc-a167-f9593d7e5a3f)(label(&&))(mold((out \ + 8a5b8d39-1c51-45e9-a788-cecc9ffb450c)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5c9c6eab-a4f4-4425-a51c-72c36d638319)(content(Whitespace\" \ + edd46a22-d261-4d93-a5b1-9b5724cdd9a5)(content(Whitespace\" \ \"))))(Tile((id \ - 79b07d2d-d725-4e3f-926f-9766877a9204)(label(true))(mold((out \ + 13273931-f8a8-414b-97cf-be7a23d73d5e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b859a615-5215-44ea-8bf3-44c588bb4d73)(content(Whitespace\" \ + 6d496488-09c4-408e-821b-ecffe9f69dab)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a7cfe7a6-32bd-4bc4-bda0-90a56ec8e009)(content(Whitespace\" \ + eba3c130-0ecb-460a-acbc-853a850a1828)(content(Whitespace\" \ \"))))(Tile((id \ - 0f300def-0934-4f25-8893-6cfd9d65dc56)(label(f))(mold((out \ + 29d0aa2d-ddbd-4757-abc0-061e584172c0)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 88565aa2-e93c-4375-867e-17c1a1eaf752)(label(\"(\"\")\"))(mold((out \ + 54dd5f77-6e58-45bd-9033-50415c188e20)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ef2559cd-0cc9-4101-a442-ce1bed65a503)(label(true))(mold((out \ + 26d73d95-02b1-46bf-aadf-46aec79fd5cd)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 22cc6540-c18a-4ae2-8e84-a093c0983f0a)(label(\";\"))(mold((out \ + 4f7a1bd8-b0ef-409e-9271-181dcb58722b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a1bf1132-c6f3-48ee-a4bb-a83bddd2a3e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c74feddd-e3cc-4276-9fb6-1f7dbb6aec27)(label(let = \ + 4d3f9222-9f37-4c30-8509-f9dc9613027e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8c441a61-9777-4b1c-9259-86b90fbc4718)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4da71f79-1773-4964-a174-32fb0cf53aab)(content(Whitespace\" \ + 5e6f8aae-da65-45cc-9786-f1823b777da7)(content(Whitespace\" \ \"))))(Tile((id \ - ca09975c-0306-46ad-99a4-593a17970ce7)(label(f))(mold((out \ + 6147717f-ce5c-42ad-adc7-da64a8bd061a)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 98d2756d-c70c-4bb6-9c53-6f4a673f7ed3)(label(:))(mold((out \ + 7d27c56e-9cf7-422b-9e8d-2fc2a9eededa)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 190646d8-64c8-4ed6-9668-01c0382b22e6)(content(Whitespace\" \ + e31fb855-a7c5-4aef-9380-35b2e43b3f82)(content(Whitespace\" \ \"))))(Secondary((id \ - bc39e914-b4a6-4057-8b77-6a15ebf104d3)(content(Whitespace\" \ - \"))))(Grout((id a3b4df43-edce-4251-b73c-d789a475bd56)(shape \ + fd521f2b-4755-4628-ba87-298d885279a7)(content(Whitespace\" \ + \"))))(Grout((id c44133e4-9123-414b-b10a-6f39c31594dc)(shape \ Convex)))(Tile((id \ - 0a3ac9ef-5776-4333-8a0a-a1b1a5698844)(label(->))(mold((out \ + 12f7912f-1216-41db-b8a2-eb9671e4d468)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a136e534-3f22-444c-9236-acea1198d8dc)(content(Whitespace\" \ + 3be812d9-6334-4edb-aa0a-4a806380e5f2)(content(Whitespace\" \ \"))))(Tile((id \ - 7c168894-d013-4cd6-b421-556c3b97c8af)(label(Bool))(mold((out \ + 1215de91-8b24-4fe1-a090-de59d0033f4e)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3e7fa74a-e3ca-4176-b59a-0fcae88d7b72)(content(Whitespace\" \ + 60fe0844-8a99-499f-a35d-7856f719d576)(content(Whitespace\" \ \")))))((Secondary((id \ - 22a1cdb3-e50b-4b22-910f-1eadd9a4f6db)(content(Whitespace\" \ + d39b46db-5f4f-414e-a73d-31b5ac910179)(content(Whitespace\" \ \"))))(Tile((id \ - 1bc12853-b067-4d79-a57e-00665aeefe56)(label(fun \ + eca88e9e-819f-45b7-b0a3-1443665ec3e7)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6c876ed4-6e2c-4b35-88d8-8fbfac51a709)(content(Whitespace\" \ + 92b93201-1df5-4103-beb5-6ef07e71d16c)(content(Whitespace\" \ \"))))(Tile((id \ - b5a46baa-0996-4731-8ca7-c567d163bc0d)(label(b))(mold((out \ + f8ac367f-8937-4b64-884c-6451195c9543)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cd03ae06-fd21-4a52-826c-c13cb3ef4f3b)(content(Whitespace\" \ + f2b8f686-c841-43a5-9d3f-9ab5df0e8792)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 590d0ef7-dcee-4670-9246-ee9069bffe0c)(content(Whitespace\" \ + 0848f952-375f-4ca0-8e11-5c74437f877f)(content(Whitespace\" \ \"))))(Tile((id \ - 9f7926a7-84ef-4d0c-b273-d4e6a4633ad2)(label(b))(mold((out \ + 78ac8eb3-eff9-4e8f-a741-c2910cb15036)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0ef4e468-94e6-4efc-8f2b-6c7e1254bbff)(content(Whitespace\" \ + 8be47997-bb67-4709-8576-d501c9c6f7b9)(content(Whitespace\" \ \"))))(Tile((id \ - d16beb02-ce5c-4294-8445-0e223c2aa874)(label(&&))(mold((out \ + 581e9b22-4c79-4c52-90bf-e728af94a949)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5f45c285-651e-4eb3-a423-8c9320104100)(content(Whitespace\" \ + 4c250464-befe-470e-98ca-80464f349317)(content(Whitespace\" \ \"))))(Tile((id \ - 65160969-a0f9-428d-aea1-1cc70ab6064e)(label(true))(mold((out \ + 22f047c1-f8e8-45fb-8195-672ef54f926b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 32ca5192-a923-4b35-b36a-f1db1f7ccca4)(content(Whitespace\" \ + b0e7f832-107c-4adf-8423-68ba53a17902)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e2ddfc39-f908-4dfb-af59-700a4bac03f7)(content(Whitespace\" \ + 53d99323-7374-4682-aa14-ea9ae56ada88)(content(Whitespace\" \ \"))))(Tile((id \ - c6d7ce91-98f6-4411-b18f-9cd7577b3a5c)(label(f))(mold((out \ + 500fffbe-147e-4431-8c4e-5826fe11871b)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7cd76351-baae-43f3-b77c-1355ef9c5830)(label(\"(\"\")\"))(mold((out \ + 846762a1-f79b-491a-988b-38e810cfae08)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d9c1fffc-f78d-49bf-8812-65fa44a09f94)(label(true))(mold((out \ + 912de3d4-1ffb-426e-89e9-42f9cd6f53cc)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 31a54411-e9e1-487d-99c9-7bfc685ca918)(label(\";\"))(mold((out \ + ca684f2b-9a71-4356-b6ce-ca0f3c9bc0d5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 390c198a-3ed3-44b9-b9a6-1c10dffadb26)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9ad93f11-9575-4111-ae0b-004f42578907)(label(let = \ + 59f87025-ba17-4b81-9244-ee934bb37bc8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dff3d135-c383-41ef-8950-14ecf1c29366)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a8da4d73-d01b-43ec-911a-236e425a7fd4)(content(Whitespace\" \ + bd99843e-277c-4bbb-9eb1-4644682ace84)(content(Whitespace\" \ \"))))(Tile((id \ - 6a30323d-c56f-4f05-8688-6f79fd1988c5)(label(f))(mold((out \ + e9e4dfb6-6c9a-45e7-a321-73d822a3c2fe)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 810fe827-7624-4d34-9c38-6d9dc461b794)(label(:))(mold((out \ + 39e0ddf7-409c-4501-bf7c-7d84bf705ad6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d5b1817a-69d9-4b94-a639-7ec3e089138c)(content(Whitespace\" \ + abc01434-012f-4fb3-b00b-5899fa3a3215)(content(Whitespace\" \ \"))))(Secondary((id \ - 52fcb68c-968f-4297-8ce1-64382af00405)(content(Whitespace\" \ - \"))))(Grout((id 927ddb04-3048-47c4-b4d1-8a7ecefb8739)(shape \ + 38ae8470-6e06-44d7-b9c8-338da130c48d)(content(Whitespace\" \ + \"))))(Grout((id aa9e5b36-4759-4a2a-8f34-1bd8342325e2)(shape \ Convex)))(Tile((id \ - 59ef03b8-7b88-4873-a19b-e7e6342ce56c)(label(->))(mold((out \ + b4bd5b28-d004-4cb1-a7af-ef7f614e6e53)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f2483725-5d64-4afb-a395-5873753e1295)(content(Whitespace\" \ + fce3b39c-6801-499c-9a84-5503fac6c37b)(content(Whitespace\" \ \"))))(Tile((id \ - 6aa0833e-0929-4a70-9ed1-455fb70fbba0)(label(Bool))(mold((out \ + ec743d49-6c4f-4d11-bd09-0e4f5958e98b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f2dc8246-3902-4c25-8459-26b63dcee101)(content(Whitespace\" \ + 912b285a-0dc3-4e46-b91e-b62db6f93f62)(content(Whitespace\" \ \")))))((Secondary((id \ - b37cf78f-ac4d-40a0-a40b-a54d8ecf69f9)(content(Whitespace\" \ + 0413683c-d92f-4bf0-aaa8-0906b9cc262e)(content(Whitespace\" \ \"))))(Tile((id \ - 16665911-0429-4454-9727-6864ef126e95)(label(fun \ + bd067150-6e8b-4ff9-8ecf-40b1f5d898c1)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e543e53c-758b-4bb5-8c75-5197a21fa16e)(content(Whitespace\" \ + cfe6deae-c503-4c4e-9874-641c1c4799a4)(content(Whitespace\" \ \"))))(Tile((id \ - fb24a277-1392-4bb5-985c-fc79da73dfca)(label(b))(mold((out \ + fea62697-8566-4e39-b7e0-ff85c2769357)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f8ebaf3b-d241-47cd-a18d-687510035f00)(label(:))(mold((out \ + af4d8b0d-3b42-4710-8c71-f3f442894293)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 019771de-0324-4aad-9caa-e29fcbb37d02)(shape \ + f445f138-245f-49a3-a3e4-10f560594e51)(shape \ Convex)))(Secondary((id \ - ab3e3578-7470-42a7-bad1-b2efa5fa386b)(content(Whitespace\" \ + f4fde577-b16f-4e90-832b-1df3d1b7b6ca)(content(Whitespace\" \ + \"))))(Secondary((id \ + c1200ba0-8081-44c5-8e31-afe171355cac)(content(Whitespace\" \ \"))))(Secondary((id \ - 1066ebf7-09bd-4e46-a97a-b31521ab8a60)(content(Whitespace\" \ + 45e27cbc-2362-4216-b998-bf4a86ab1de4)(content(Whitespace\" \ \"))))(Secondary((id \ - cd7b8d44-0a70-45c0-9630-72a497ba7fa4)(content(Whitespace\" \ + 922b73cc-48c9-45a5-85bd-57163eeed22a)(content(Whitespace\" \ \"))))(Secondary((id \ - 9e752c2a-b0c0-4f9e-9797-947709a14cf9)(content(Whitespace\" \ + d0418412-d1c5-4708-81cc-9e532e283a5f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 60dd1ed7-4f5f-441a-8d40-c9f53fe88db7)(content(Whitespace\" \ + d517deff-6469-4b0a-811c-b247359750de)(content(Whitespace\" \ \"))))(Tile((id \ - e164d8f9-5654-4648-8e55-4adc8192438b)(label(b))(mold((out \ + 6b8818fb-8a04-4e9b-a06a-eb9d0d49e6cf)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7e746f80-99d3-4919-8b63-b9124ce0299b)(content(Whitespace\" \ + 04eb868f-e332-4a9a-b597-a8d0b0280976)(content(Whitespace\" \ \"))))(Tile((id \ - 9bcd062b-7894-4660-af76-4a7fb3b97b02)(label(&&))(mold((out \ + bc0ef424-20c8-4e1d-9677-869abe58c766)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f610ff1d-b1a4-45c1-b551-1719533375be)(content(Whitespace\" \ + 9af80ce5-9846-49be-b7d8-a145136e12ec)(content(Whitespace\" \ \"))))(Tile((id \ - d3ce9ba5-de80-40af-b4ff-e0a52cad0245)(label(true))(mold((out \ + 7aa44f9e-7e49-48c9-8836-6f5b6d425697)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 00958c15-6975-43a4-920b-a45067ccbded)(content(Whitespace\" \ + eb8f9e3a-a4b7-43e4-97d4-641e4bafd17e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6ff00d9a-2f4e-4383-aeb4-de4bd7f8e548)(content(Whitespace\" \ + e46f7506-1a51-4a95-bfd7-c1c4bc625d6a)(content(Whitespace\" \ \"))))(Tile((id \ - 3322489c-8140-46af-b068-4829a167706f)(label(f))(mold((out \ + 3adb1d79-6e7b-4e18-a2c5-57ecd86593c1)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee2ee216-a7da-49b8-babb-cca07169fa1b)(label(\"(\"\")\"))(mold((out \ + 479dbf3f-ba6a-48c0-ac87-b66e93acc316)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b75c1fe5-301d-4500-a7c1-01a18f8aaa8d)(label(true))(mold((out \ + 85729376-763a-4acf-ac8e-1da370b7df1a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 421383ed-8bc3-4767-a0f8-2bb8f7506ab5)(label(\";\"))(mold((out \ + 9e5e8178-381e-4c10-b980-7ec168184efa)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 685cc08e-bc09-4350-a22b-d69689995efa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 99c9244a-ce14-4ae9-86b3-16af45a4ca93)(label(let = \ + 497a0d60-0ab7-4d96-9ac1-717fbaf1efca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8f7563b2-9455-4599-9ff5-75ed69af637a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d075699b-d670-4d74-ada1-285e9a793699)(content(Whitespace\" \ + 28594a45-8136-475b-a6cd-659eaebf389e)(content(Whitespace\" \ \"))))(Tile((id \ - 4507f019-6453-451a-bc52-44ee36d07b62)(label(f))(mold((out \ + fed34b9f-5700-49aa-963a-8956bff955b9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 779cb84b-c760-494d-9e1b-30031a864a31)(label(:))(mold((out \ + 7c171d8d-5551-44b8-bffe-6c5309cb8556)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9d787d61-5bc6-498e-976d-cbf27886f7d6)(content(Whitespace\" \ + 096599db-71e7-41ae-b73c-353dfeee0ae4)(content(Whitespace\" \ \"))))(Secondary((id \ - 22427037-5629-41ed-9f90-3d5a9b54f515)(content(Whitespace\" \ - \"))))(Grout((id 877952bc-3b68-4d1a-a43a-678fe96f0362)(shape \ + 586f8980-456e-47d4-8d62-96560f4f8cde)(content(Whitespace\" \ + \"))))(Grout((id 84efce2d-74fa-425d-bb7f-5851b47fc038)(shape \ Convex)))(Tile((id \ - c9c61eac-eecc-4f70-b4b2-785a9b3dca10)(label(->))(mold((out \ + a60b549c-f762-4be1-9777-6089b8b65f28)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 45e7afd4-e6e7-4fd2-a77e-cd5b482f8bcc)(content(Whitespace\" \ + 1a7206f3-795e-419e-86c4-8ddd15a4b177)(content(Whitespace\" \ \"))))(Tile((id \ - b5fd5728-c20a-41f6-9ff9-4088cab44241)(label(Bool))(mold((out \ + 8520407c-631a-4604-8b4b-e10c4ce52df2)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 29166bed-8857-4aaa-89d5-11eba942a4cf)(content(Whitespace\" \ + 31fcd1c1-352a-4398-a7b5-8864fa8b506e)(content(Whitespace\" \ \")))))((Secondary((id \ - c4590d48-e5eb-4f26-9d88-5cadbf265b4e)(content(Whitespace\" \ + 5f28a5ec-6a33-4f91-893d-dbbd18425817)(content(Whitespace\" \ \"))))(Tile((id \ - 5a566b4c-3e87-435e-86fe-3e61cd45f2b3)(label(fun \ + 6bd798f6-295d-44e0-b703-3c545968fea9)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ee1dd963-be8c-4f45-b413-57607b48e356)(content(Whitespace\" \ + 4386035e-5010-4d2a-a56b-8e369cdab53a)(content(Whitespace\" \ \"))))(Tile((id \ - 7abce92f-20a0-4187-ac4d-47b544fb6bfb)(label(b))(mold((out \ + f942974a-343d-4802-869d-424f82da3f92)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8279c6d8-4fc2-41e0-83ca-bc0162b88096)(label(:))(mold((out \ + 72d4784e-f6af-42f4-a759-4b7f58932ad9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c55e3fa4-c7b7-4dd9-83ae-458938772492)(content(Whitespace\" \ + c5db147c-a182-4930-be02-f40882740402)(content(Whitespace\" \ \"))))(Tile((id \ - d2062fc1-7181-4ee8-8911-6c9a9ce0518e)(label(Bool))(mold((out \ + 7c14bc9e-7371-4820-898a-f282d3fded38)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 923a688c-2f79-4405-99fa-2fe618096f9b)(content(Whitespace\" \ + 860fc3fc-2ce5-4f94-bcd4-5309e35d21ca)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e73e8c00-9fc2-4df4-bb4c-97d1ae7338ee)(content(Whitespace\" \ + 656d2c3a-adba-4440-b19a-e9f1aba703c7)(content(Whitespace\" \ \"))))(Tile((id \ - 59b770cc-5454-4229-8df9-9dfe5bc98259)(label(b))(mold((out \ + 68ad3de0-09d3-4c4a-b1c5-23e178d5ee17)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2ee920ab-4567-4475-96c2-52792eb8a9f3)(content(Whitespace\" \ + 25ebe2d3-9f7e-46c4-bbe7-ecfd9d4bfa16)(content(Whitespace\" \ \"))))(Tile((id \ - 50067ad7-5c1d-487f-871a-5f74a5c869d9)(label(&&))(mold((out \ + 78084462-d834-4411-aadb-07502e58a4e6)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b6a55e9d-ad0a-48d7-a9a6-166e8e2ff849)(content(Whitespace\" \ + b9fc286d-232b-4c8f-9293-eba980beeb52)(content(Whitespace\" \ \"))))(Tile((id \ - e479fc9b-6995-46a4-93e2-e44619461a7e)(label(true))(mold((out \ + 4f85fc72-e07d-4025-ba79-945ba8f3a4db)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 958e3475-519d-4e2e-a585-abe653052b25)(content(Whitespace\" \ + 5c4a559e-2615-499a-87d5-c1c9c03febf2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 143fbd99-5be1-4fbc-928f-7c0882c99267)(content(Whitespace\" \ + 7961eecd-efa1-47a3-9751-23497a93a110)(content(Whitespace\" \ \"))))(Tile((id \ - 699c6e02-b53f-4a64-b517-bc29b5901c4b)(label(f))(mold((out \ + 1df1b019-acaf-4a69-be7a-6536f6063ceb)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - eb6709fd-8150-494c-880e-d8c5cc0c5c20)(label(\"(\"\")\"))(mold((out \ + 12e0b1cf-157e-4218-b357-6f4c0dd10463)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 690e2a82-583c-462e-bf3b-b523642720b1)(label(true))(mold((out \ + 11553788-86e8-414d-9cc3-756ac478b13f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 5e725c42-af60-4c41-99d6-e67c9cb91c7f)(label(\";\"))(mold((out \ + 142047ba-cd7f-4827-85e4-06aa322c1c3f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5d389b61-02fe-46e7-89c2-02d7c0f3a471)(content(Whitespace\" \ + 24c62fb1-1c75-4a40-a4c0-72f2195e96da)(content(Whitespace\" \ \"))))(Secondary((id \ - b62b0e9b-1705-4797-a023-67146999c501)(content(Comment \ + 07002c8e-aa91-4c28-82ab-2a087e3b1612)(content(Comment \ #ERR#))))(Secondary((id \ - a0ee9619-2bc4-487c-920c-f65faa1ab8fa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8b986f1f-ae4a-492b-aa54-a3dd6f7e9bc4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b7a0abbe-4185-482d-b221-bd2d2dd9f520)(label(let = \ + f895dfd2-13d4-44d8-be73-e9b703bb1094)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 365ca0b0-a697-433d-8514-d6174b4090c7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 28164dcf-ff08-461b-92f7-32860f171cab)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2d34297b-076f-4482-8901-5a45610b8b89)(content(Whitespace\" \ + aef0f946-d973-4312-9e7a-0fcbc51f567d)(content(Whitespace\" \ \"))))(Tile((id \ - 3f2261b6-8469-4f33-9c64-7267477e9377)(label(f))(mold((out \ + 3aaaf7e2-490d-4380-a87f-202778445eda)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1f1bba37-54d0-4040-adad-4f6fd6f11377)(content(Whitespace\" \ + 296fdf06-82f0-4404-b7b3-e09d9d81a773)(content(Whitespace\" \ \")))))((Secondary((id \ - e09327b0-af4f-492b-810e-de84db45dee4)(content(Whitespace\" \ + 7651a4fd-7989-49c6-b4c2-c414bf0fce55)(content(Whitespace\" \ \"))))(Tile((id \ - c597df8d-e197-4728-87c7-40684b5b74f4)(label(fun \ + b48f2de7-7327-4256-bc92-d95e266304bb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 710333d3-1e35-417c-9ca5-a52a3da36762)(content(Whitespace\" \ + 6117c5a7-cb48-4a61-be2f-68af17e7b0b8)(content(Whitespace\" \ \"))))(Tile((id \ - b2c17586-7624-4aed-bd53-a1191ca1a4c3)(label(b))(mold((out \ + 57b917d8-e170-4ab5-b3e1-5bb8a2ae272c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 501e4ba4-2991-4598-8c22-0d34ece06b76)(content(Whitespace\" \ + 9b6c7d09-7c66-48ca-9421-9e5abefe099c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 866a7268-e028-4e77-9fb9-0590c3c74bb0)(content(Whitespace\" \ + 17432af9-f82b-4fe3-8527-002b59570bbe)(content(Whitespace\" \ \"))))(Tile((id \ - 60c156c4-310c-4a4e-9ed6-27c9f73587f2)(label(b))(mold((out \ + a6f7ad03-d8f2-48cd-a238-a0a89898f885)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 07a7a0cd-e513-46c3-bc25-4d274e77cbb9)(content(Whitespace\" \ + 006fd185-4467-4f74-b767-157ac04257c8)(content(Whitespace\" \ \"))))(Tile((id \ - ea88b462-92ce-4299-8c49-3844c75fa2b1)(label(&&))(mold((out \ + 5326a8b0-b3ad-4eaf-93dd-9365d65dd0c4)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ef42820f-bdb9-4843-9c96-654ae895b710)(content(Whitespace\" \ + 9be71035-77a5-43d1-8c72-757283304ce5)(content(Whitespace\" \ \"))))(Tile((id \ - 5f742fda-1143-4194-8ee5-e58f87776f6a)(label(true))(mold((out \ + ef918a20-47a9-4d1b-aa5e-9f7d37756186)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 53300648-71ae-46d1-939c-5f194c16136c)(content(Whitespace\" \ + 2cf2b8dd-31e9-48b7-98dc-b24932a0f242)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 29ba6025-7d3d-413f-a3f7-fddc822000a8)(content(Whitespace\" \ + c43eeb3e-cd6e-495f-b45d-da6be67c0aec)(content(Whitespace\" \ \"))))(Tile((id \ - 99535c4d-01d8-494e-811d-57506853f9c1)(label(f))(mold((out \ + f048757e-1228-47d8-9ae4-ecd45f8f30e0)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 50be4508-9340-4001-b1f5-3d62273be001)(label(\"(\"\")\"))(mold((out \ + 229108a9-3793-4704-a18a-7105709635ae)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4e66157d-41a7-47a4-9456-cff6ea343870)(label(true))(mold((out \ + 17082d93-e429-4240-9500-1fee13b7fb23)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a233018b-94a7-4536-b928-f4367dc74ef4)(content(Whitespace\" \ + c90802e0-7bcd-4af0-8857-4e9b2cc894bb)(content(Whitespace\" \ \"))))(Tile((id \ - e535793c-9fd3-4fda-883e-cd7fbf144510)(label(&&))(mold((out \ + e48629c9-af5b-40eb-839c-b72e1eef788c)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4c34959b-9477-4c56-8795-cb2c6170e392)(content(Whitespace\" \ + 7bda3602-722b-4311-a048-35cb6e8de85a)(content(Whitespace\" \ \"))))(Tile((id \ - 11e55bea-2665-4185-a52b-66b6bffcc76a)(label(true))(mold((out \ + 76e8a28c-ec7d-4170-ad7b-0cd3eca5a081)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bc57352e-ed9e-43ce-aa5c-50d007c4c432)(label(\";\"))(mold((out \ + 04b6f724-922b-4c05-a750-a42532383cd9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - adb8b86b-ec48-4f8d-bdca-3a63852ff426)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a9bbc3e9-41b4-46ae-8e9d-ef0db7669e6f)(label(let = \ + 24fdccaa-d71c-4b52-a79e-6b8c0a2f85a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7ed645bf-2e8d-4227-8531-c2d26da9e73b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9c38b6ac-eeb4-42e3-b501-10ec47740541)(content(Whitespace\" \ + e4886839-ea76-4438-9006-35be8d065553)(content(Whitespace\" \ \"))))(Tile((id \ - aa998a53-3864-457e-bbc8-564153a76ed5)(label(f))(mold((out \ + cfd8bd18-0549-4142-bbee-f51cb95d340e)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 17ccdeb4-eb08-4ccb-9563-1295c0b19794)(content(Whitespace\" \ + c0cbe279-c697-48c5-9dd7-3762b751e91e)(content(Whitespace\" \ \")))))((Secondary((id \ - d6c5ceee-8035-4509-9c0b-5ca8aa7cd85f)(content(Whitespace\" \ + e05b807c-c4eb-4570-9cc5-f4fbb362ee74)(content(Whitespace\" \ \"))))(Tile((id \ - b3ba78b8-8454-4773-bec1-578a69efaeb8)(label(fun \ + f6ca0585-f98a-4e3c-a885-76f53a4e5ea0)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 43f31307-0cf4-4521-933e-3a9f46a7aaaf)(content(Whitespace\" \ + f91d5a37-ad48-4e6b-a7d0-f13200591773)(content(Whitespace\" \ \"))))(Tile((id \ - 2f7a1964-df17-4347-972a-a11cf37e99a0)(label(b))(mold((out \ + 2795203d-0717-4c13-82b0-eaaa6adc142e)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 03132640-437b-4e76-b914-b7bd3f7f482b)(label(:))(mold((out \ + 38f334e1-4d7f-4c63-a4a7-a7dc8abb96c9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 39c542cf-a0c2-41b8-8520-e252abe73c1a)(shape \ + c359c705-b4a0-48ed-86d2-13932971b7eb)(shape \ Convex)))(Secondary((id \ - 4ebedb81-bdb1-4f18-bb3b-da9db4b6272d)(content(Whitespace\" \ + 488a6d06-c8b3-46cf-b74e-fe29329ccd33)(content(Whitespace\" \ \"))))(Secondary((id \ - 2c1c56c4-4fe2-4d83-97b2-74703b4b8c8f)(content(Whitespace\" \ + 9f33b2e5-1550-41f2-aaf9-e529786df9f0)(content(Whitespace\" \ \"))))(Secondary((id \ - 4dd7a77a-3fbe-4c1b-af48-be05e98a213c)(content(Whitespace\" \ + bd6c1bb4-2553-4904-840e-00af37ac723e)(content(Whitespace\" \ \"))))(Secondary((id \ - 0bc9c874-e0b4-4b3a-86ec-6c64deabdc66)(content(Whitespace\" \ + ba8b844c-a8c1-4bba-a442-29b671816290)(content(Whitespace\" \ + \"))))(Secondary((id \ + b29e3338-7a60-48d7-9f6a-0652b4bcedc7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0aedd0e9-b7b0-446d-8f30-89666a987d2d)(content(Whitespace\" \ + f5862777-feaa-4502-8c3c-aada463eeb74)(content(Whitespace\" \ \"))))(Tile((id \ - 6820463f-2046-4c1d-9afb-6a6443a5e849)(label(b))(mold((out \ + 3a66731e-7f72-4f50-af3e-6677babad8c2)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c272c80d-518c-4e4e-bac5-162535032b95)(content(Whitespace\" \ + 510e7bb2-2c72-4196-b5e8-765112670b93)(content(Whitespace\" \ \"))))(Tile((id \ - ab7f6b4a-782b-441d-814e-d711fd0dae3f)(label(&&))(mold((out \ + 34de1a6c-ae02-4c5a-ba1b-efb4625a70a7)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3c39c15a-af2e-47c3-a8ca-adfb954c3f01)(content(Whitespace\" \ + 086bb1ba-c2f0-4f57-b659-029ef20eec7b)(content(Whitespace\" \ \"))))(Tile((id \ - d4019d5b-0539-4d29-8be1-1028214711d5)(label(true))(mold((out \ + 9f2e7ca0-882b-4401-ab30-0a0e3dc2cdee)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 84b0eca1-79ae-4a66-ac51-b7e4aec3fc0e)(content(Whitespace\" \ + f05b8ca0-c141-4846-9d80-fc76455fe268)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cfe0ae35-92aa-436f-b828-43f6969ca3e4)(content(Whitespace\" \ + 3b2fe1b9-2db4-4100-a22a-f3f29f0d9525)(content(Whitespace\" \ \"))))(Tile((id \ - b1534f30-51ed-4202-abac-e5fb5bf6ddb3)(label(f))(mold((out \ + 09b61fc5-5208-4e18-a443-10fa11f413e8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4f0cd3f5-e4fd-41bc-9bab-4a386fc8976a)(label(\"(\"\")\"))(mold((out \ + 5e2e3a74-6bc2-4555-92b5-8568aa433ade)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8e02fb7a-fa69-4abd-9372-862293acb95f)(label(true))(mold((out \ + dd24a755-0573-433e-8b8f-4af069aa6b9f)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - edf21139-8986-40de-a295-9272409af698)(content(Whitespace\" \ + 443b31d5-36e8-4cab-9eb9-f4fd9b862f51)(content(Whitespace\" \ \"))))(Tile((id \ - dd9179e0-b0c3-41b8-b1bd-4933fe1456ab)(label(&&))(mold((out \ + 1b591eaa-2af5-4354-afd5-779d96c24590)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 95e2f796-7ef7-4b0d-ae9d-3e5a39bb5a40)(content(Whitespace\" \ + 21626e70-35eb-4cfc-b9dc-27778eff7541)(content(Whitespace\" \ \"))))(Tile((id \ - 9a7172b8-b30c-4fe5-8aae-b893551a04d5)(label(true))(mold((out \ + c5549a28-9141-409a-a696-86315e8bab0e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 61f04a6a-56f2-476a-a4ff-da7e656fafac)(label(\";\"))(mold((out \ + f3f502a0-e05e-4c5d-bac4-0940a4384e5b)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 66b70a48-b296-408d-8db1-a3f32ff2e048)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 57dbc75c-6a3f-48e8-8b56-f925fbb67b01)(label(let = \ + 5e566bac-f713-43cf-9a1c-a446bb10fd72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5e39763-e6ac-4504-ace9-2f702b3bf054)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2ff2e170-5ad4-46b8-814a-b8a56e0459c6)(content(Whitespace\" \ + 73215912-7525-4aec-8bb8-5f0d00ed1a2f)(content(Whitespace\" \ \"))))(Tile((id \ - 1fb668d4-9b95-425f-a89d-dc5b03f31d98)(label(f))(mold((out \ + c932105d-83e5-4abe-9b59-0700a0f06f5c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a27d99c4-4c79-4147-a702-51b129cbdd4b)(content(Whitespace\" \ + 0711ed89-a605-4c72-a2f5-db62706870f9)(content(Whitespace\" \ \")))))((Secondary((id \ - 3c047527-e2d5-4263-847a-3aeefe07f8b7)(content(Whitespace\" \ + 79c84649-a8b4-48a8-9133-b2f9514bf4ac)(content(Whitespace\" \ \"))))(Tile((id \ - 003af475-fd97-44d9-ba6e-f2403c31d6e9)(label(fun \ + ead1b462-795f-4041-a54e-4c7f472d05da)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2a95e875-e5ec-4f51-812a-396bd106411c)(content(Whitespace\" \ + d8bacea6-3902-4f36-9f8a-16b330e76f73)(content(Whitespace\" \ \"))))(Tile((id \ - ac2495ef-d2cc-49b6-a506-0573259e4cdf)(label(b))(mold((out \ + 569f3650-bbe5-4ec7-a48a-f53f2fa1df28)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f9b48f8b-f070-4a71-acec-704feb9826e4)(label(:))(mold((out \ + 62b71633-f65b-4a48-9ddc-945f9ab163b0)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7fb59992-990a-49c6-85c9-22b9090900e1)(content(Whitespace\" \ + 885fba18-bb5a-409f-b7c4-65bb60ed64fb)(content(Whitespace\" \ \"))))(Tile((id \ - ebeb9b99-e46d-4cd9-af35-41f60fa02047)(label(Bool))(mold((out \ + 3e5b1891-31e8-44f6-ae80-c795b070ddc8)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 02f34ab8-a93d-46ab-8b19-99446802017b)(content(Whitespace\" \ + 8f851483-70b6-4f2d-925a-57a982bfa93d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f1f8282f-c25c-4b6b-8373-0e81484aa527)(content(Whitespace\" \ + 63302d7d-1590-4836-ae8d-ca087abdc208)(content(Whitespace\" \ \"))))(Tile((id \ - 2246b457-4c9a-4002-b69e-29e231192d52)(label(b))(mold((out \ + 34430174-6447-4913-bb3c-f34887b89db1)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 97ebbb2d-a465-4a8a-82cf-71d9c84821af)(content(Whitespace\" \ + 7bd589a8-1217-4eee-9622-f3953e7611bf)(content(Whitespace\" \ \"))))(Tile((id \ - 991280b2-6e51-46aa-b6d0-de0e4e55cc0b)(label(&&))(mold((out \ + 92670b90-4e4e-4643-9196-e85d7be9c26d)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d6d6656e-2730-4930-88ae-0ab5f89ca96d)(content(Whitespace\" \ + 40db8075-75e0-49ac-922a-82cb1cef182c)(content(Whitespace\" \ \"))))(Tile((id \ - a3bb68ce-b3fc-4092-82e9-0f12360592b9)(label(true))(mold((out \ + ed88a8eb-3d79-4ae7-ac73-79e4ea801760)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d72dcd0f-e1ac-43ba-be3c-bf43c25dd337)(content(Whitespace\" \ + 17c87a74-73ad-4e38-9714-ebc1eaa96e3d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fbf6b243-e0a0-4511-9c2c-a0c115302643)(content(Whitespace\" \ + a34ed96e-0489-4a39-99be-1b6871fe0b3e)(content(Whitespace\" \ \"))))(Tile((id \ - 7ef055fd-4877-4d5b-aaa0-69bafd3d0b92)(label(f))(mold((out \ + 5b1f4213-4405-4149-bd2b-79380456c515)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8c51d0cf-855d-4257-a490-c48bb9dddd98)(label(\"(\"\")\"))(mold((out \ + 5bd418a2-dff7-433c-b0f5-fdbf88c8ae06)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3502e709-d294-4543-9aae-c5854a223d01)(label(true))(mold((out \ + a8102985-99eb-4c36-a3cf-2f85b0abd07e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 516fea90-c995-4f29-9fc7-ee5d14d1f0e8)(content(Whitespace\" \ + e255d926-3901-4aeb-9260-c3e603719ff6)(content(Whitespace\" \ \"))))(Tile((id \ - 1e2291ac-3285-4a11-833a-33571f22732d)(label(&&))(mold((out \ + 29526314-bcb8-45ed-8379-c444ddcc1886)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9465d458-0feb-435b-8b1e-ef307dad2dc6)(content(Whitespace\" \ + 40705c42-0d49-43c4-8ef2-d127eefb52fe)(content(Whitespace\" \ \"))))(Tile((id \ - 46789fa4-3d0e-44dc-b695-8f0015ea06c6)(label(true))(mold((out \ + 55665ab2-77d6-44c0-ba84-248442384124)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d80c192a-0baa-4041-979e-4d1be54f8189)(label(\";\"))(mold((out \ + 3ef9f1f9-d033-4992-897e-5f2ef8513183)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - af6970d5-be47-4a23-ac95-c297bffc84fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b0d46039-f969-4e90-aa99-a7047be09b44)(label(let = \ + 15eee5c4-d26a-427d-84d7-1569e3cb4919)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7274d08c-4615-4c9b-be36-990fd467e475)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f548c8bc-087e-4d0c-9f90-d271a5808bb4)(content(Whitespace\" \ + 39de470e-3675-47b3-aacf-e34fe1e8dca8)(content(Whitespace\" \ \"))))(Tile((id \ - 812059ac-7292-45e2-ba61-4d908385bb4c)(label(f))(mold((out \ + 902ba6b8-eb31-4ba7-a6fa-96df20d2864c)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2d702eea-e48c-44c5-a9c2-7df7bed0b50b)(label(:))(mold((out \ + 80d018fa-cb2e-483f-8939-e35ba76975af)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 8ce6a743-ed4b-4e6f-b1e4-f4f3d16b5b01)(shape \ + ef849061-6164-420e-82f8-317d023d5104)(shape \ Convex)))(Secondary((id \ - 77d17beb-c73b-449f-b1e2-cb46759c0e4b)(content(Whitespace\" \ + 8f768566-fc9f-4e4f-95a1-74592ee51228)(content(Whitespace\" \ + \"))))(Secondary((id \ + bbd5b7a9-de93-4892-ad1c-465f0da1221a)(content(Whitespace\" \ \"))))(Secondary((id \ - bc31eba1-4e70-4ef6-9d82-b938f51be1a8)(content(Whitespace\" \ + 1b5f395d-8f7a-49c8-b561-22948f9a7e74)(content(Whitespace\" \ \"))))(Secondary((id \ - a77c929a-5483-4a19-a587-6f194a098baf)(content(Whitespace\" \ + 7d6677cf-b44a-44c0-b54a-6883c5f75d12)(content(Whitespace\" \ \"))))(Secondary((id \ - 7958b3fc-8cd5-46ff-9927-fe3774c1e052)(content(Whitespace\" \ + ee3ad412-cc95-49c8-9f0e-61de4d8c6aa7)(content(Whitespace\" \ \")))))((Secondary((id \ - f5759079-0082-4691-b62d-8a9e22f59c43)(content(Whitespace\" \ + 7c2e966c-b4d4-42d2-a1b4-fce00bbf6196)(content(Whitespace\" \ \"))))(Tile((id \ - 19d819a2-8f69-4889-849d-17d51a0f6d68)(label(fun \ + 1969789a-458b-4e05-b947-70d23b96bf39)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6537b350-d300-465a-bc63-d5bd5c12cbe5)(content(Whitespace\" \ + 5c849bda-0f4c-429a-a820-7dc5e8c5be28)(content(Whitespace\" \ \"))))(Tile((id \ - 168d30ef-3526-4640-8083-4743614e390f)(label(b))(mold((out \ + fc50b426-ba00-479f-b26b-702e44aca663)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e10cba2a-c657-4fe3-a172-759d3dfddd20)(content(Whitespace\" \ + ea9c2647-c134-4639-b2a2-ee96bab7b8e7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 45a0d383-79bf-4337-bfcc-461ede853e35)(content(Whitespace\" \ + 68abedc9-0113-4009-ab73-af255381a9d4)(content(Whitespace\" \ \"))))(Tile((id \ - 18c479d9-2d27-4eb7-b704-558212b400df)(label(b))(mold((out \ + ca7e0e38-2bed-4d9d-aa61-c4da5526cdd8)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 50e87e25-d452-47b2-a20f-3fb633ce787a)(content(Whitespace\" \ + b915f2b7-7aba-473e-b398-efdccca2ac0f)(content(Whitespace\" \ \"))))(Tile((id \ - 2b728f25-94f0-4b7b-9730-86b7f4c0f3e6)(label(&&))(mold((out \ + 04bd1c05-913c-418d-9cfb-1fd9c50f6ffd)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 20685cb3-165d-430a-be74-0666e5253714)(content(Whitespace\" \ + 01eada3e-b33b-4741-bcd3-60ceb1882b1b)(content(Whitespace\" \ \"))))(Tile((id \ - 6b050fdb-58e6-468e-8fc4-ab811a61e743)(label(true))(mold((out \ + 018c7cdd-d028-4add-9aa4-941601d4ad01)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 233395be-27e3-4bce-a8c4-6f9df4decb83)(content(Whitespace\" \ + c88e09ec-9300-4f7a-b731-99d8dc8cb298)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee6fac43-afdc-425e-bf3d-d9aa724cf063)(content(Whitespace\" \ + 7aa4206e-8f62-4ff9-9547-6f1480b86c85)(content(Whitespace\" \ \"))))(Tile((id \ - 80e65a16-2aee-4b04-b38a-cddde9426a0c)(label(f))(mold((out \ + 7327d675-f536-4078-87fe-69690be87f51)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0f1fdde2-45af-4686-a254-7011a0ec29e7)(label(\"(\"\")\"))(mold((out \ + c83cb139-41e1-469f-8948-fa675b31fdbb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 658f97d3-2e66-4279-85b7-86afef69b1c0)(label(true))(mold((out \ + a1f9cfc5-64be-4a4d-9777-fe6feabba0a4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 4a0208dd-668e-4bf9-91fb-16bca37001c6)(content(Whitespace\" \ + 28d5aa6d-9124-4b2c-8533-552b69bb15c3)(content(Whitespace\" \ \"))))(Tile((id \ - 54e009bb-f96b-42bc-8628-1b9e22c9756a)(label(&&))(mold((out \ + 2eb779e0-8654-4ebd-a0b3-f10a2d9fb5d6)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a79a2122-1939-47ca-b934-14fc0faec285)(content(Whitespace\" \ + 26a7acc4-31b4-4fc1-b5a0-17ef0e1a4f99)(content(Whitespace\" \ \"))))(Tile((id \ - 54c2e19c-ef08-4d7b-a8dd-6630d2603161)(label(true))(mold((out \ + b4baeb8f-018f-448f-a10e-b3b593d00a4e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ba3520b8-68b9-4adc-87b2-cf190b51f554)(label(\";\"))(mold((out \ + bb9c6f93-31f0-481d-ae6c-80cab1902cb9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1dad7f98-8460-4a45-b43a-c228dc74fc0e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1378eed9-713f-4458-9bd6-6c895cdb189a)(label(let = \ + 068e9875-3e6a-475d-bfc0-9f2f443b7b63)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 592c390c-1f19-422c-a471-a5ce868a91cf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f08b2095-5f59-41f8-b7b3-4265e7c8099c)(content(Whitespace\" \ + 683e9248-b7fc-4e13-9d75-9e62b8af677a)(content(Whitespace\" \ \"))))(Tile((id \ - 2b6a96c7-9b81-423e-bd64-ca7628398a21)(label(f))(mold((out \ + 788a1fff-9abf-4460-8c06-332a8796d6dc)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ee1b2972-1bc0-4555-9870-c36b15909609)(label(:))(mold((out \ + 6c89bae2-8501-4c11-8f12-9ef16f71adae)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 86b1b0dc-324a-4585-a7d5-cc0019cbacbe)(shape \ + 01ab497c-5faa-4e55-8cec-a4bb60cbddd5)(shape \ Convex)))(Secondary((id \ - fa21ce37-7059-4de8-9a77-322688476189)(content(Whitespace\" \ + 82e3390e-c6ac-4a90-97ae-7449b5f0806c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 95493832-367f-4c1e-a502-90fd0a0b4525)(content(Whitespace\" \ \"))))(Secondary((id \ - 407d0f76-dbbb-45b5-8bb9-a92a218f2a3d)(content(Whitespace\" \ + fa9e793d-92f7-4baa-96ce-fc070bc2e185)(content(Whitespace\" \ \"))))(Secondary((id \ - ec18225b-81ba-4e1a-ad40-c62e3e98e5a4)(content(Whitespace\" \ + 1dfebe5b-b167-44f1-afa1-742190a7e70a)(content(Whitespace\" \ \"))))(Secondary((id \ - 9b84a72a-804c-45f4-94dc-f47183bc5774)(content(Whitespace\" \ + 5b8a0e6b-97ae-437c-8a68-887f434c5b55)(content(Whitespace\" \ \")))))((Secondary((id \ - 60ceba61-8fa2-4bff-bf61-41e998992f05)(content(Whitespace\" \ + f7d1ce1e-d5f6-4fde-a8b5-3f62db021689)(content(Whitespace\" \ \"))))(Tile((id \ - e558fc1f-12bc-44f6-9f99-3428adf34403)(label(fun \ + 8f685f57-0c38-4dbd-bd98-f4cc665e1efb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 591d9a53-b7c3-408e-b25a-5a7b1b2aabaa)(content(Whitespace\" \ + 326534a0-3d18-4833-a6d5-c0858a771841)(content(Whitespace\" \ \"))))(Tile((id \ - 55311a83-ac8c-4f98-8daf-2e7378ed78c2)(label(b))(mold((out \ + 6e703dd6-b924-4ac5-a880-a2ed7b9f4881)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 99cd75ff-fe66-4f78-b4b2-7302b05d6b9b)(label(:))(mold((out \ + 7cfddcc5-641c-413f-91ea-383848351b32)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - d107205e-4b1a-4f93-88b5-75f627f3b3dc)(shape \ + 91232f17-47a9-4ce2-86ce-45859f009a46)(shape \ Convex)))(Secondary((id \ - 6241cf4c-6cae-44ee-b723-42c8c4508f01)(content(Whitespace\" \ + ec20996d-7a9f-4807-9973-35b685527d21)(content(Whitespace\" \ \"))))(Secondary((id \ - 6e606c02-5c5d-4642-8253-268342deba9d)(content(Whitespace\" \ + 2ce73cb8-4040-417a-bc08-8d8a8cc52121)(content(Whitespace\" \ \"))))(Secondary((id \ - 8f90ee3a-409d-4619-bfa3-fff68c6135fb)(content(Whitespace\" \ + ea87b70a-b71c-4ce2-b82b-b30201086209)(content(Whitespace\" \ \"))))(Secondary((id \ - 09e29e90-6ee5-4b05-9318-1c2b7ddaaa18)(content(Whitespace\" \ + b40e83fa-59da-4f96-aa36-46b6e3b96efc)(content(Whitespace\" \ + \"))))(Secondary((id \ + ecc8c1a7-cb57-4a36-b082-863944108f7c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 49f77e7d-36ed-44b4-bd72-cedf899316d0)(content(Whitespace\" \ + 04807fbe-1bc7-4bf3-b615-6c68a47735d3)(content(Whitespace\" \ \"))))(Tile((id \ - d3de0ce8-a2a6-4d4e-9248-664b74de9731)(label(b))(mold((out \ + 3a8eacec-7507-40b7-9462-216d24509a83)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 39d471ed-582e-4a9a-8f91-899da355b6b2)(content(Whitespace\" \ + e7a45951-5ea6-47d7-a181-857895da130b)(content(Whitespace\" \ \"))))(Tile((id \ - 1a8775aa-54c4-428a-b4e3-c243b79a62ba)(label(&&))(mold((out \ + b983bb9a-ffbf-4514-ae30-63adba184fe3)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7e1dfad4-652b-4c6f-bf42-77f52811d497)(content(Whitespace\" \ + 875af082-d9c8-4784-bfca-fab86f00b08b)(content(Whitespace\" \ \"))))(Tile((id \ - 1a1b4ec3-b7b5-4c25-89ae-194eb7ac24cb)(label(true))(mold((out \ + b4a60880-3e10-45d7-af87-325b2683a844)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 21545bae-ecf0-4bf4-aa5e-238c4f4137d8)(content(Whitespace\" \ + 3bec3d06-d27a-4d48-b9b7-bdeb8e599860)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0f8ae9d8-e1e0-478d-9bdb-337f315ac3f6)(content(Whitespace\" \ + ebadd770-c138-4ecd-aded-b533211474c4)(content(Whitespace\" \ \"))))(Tile((id \ - 93092ee4-700e-4026-8765-dc5d09889592)(label(f))(mold((out \ + 1d35f185-762e-4903-8e47-b6fc0a76009c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 197fd06d-e3e5-4971-9e64-a78c4cbafb47)(label(\"(\"\")\"))(mold((out \ + 2004a474-7539-4d12-acd6-5eaf194f1948)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3a577dff-ab5a-4a98-8374-7945262aeb50)(label(true))(mold((out \ + 242bf2b9-b9dd-451a-be88-46a3b6fb2628)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f2ed0932-af69-49b1-a7b6-8d96dabc0c1b)(content(Whitespace\" \ + 34bd4eea-b342-4070-b657-96707aa51b05)(content(Whitespace\" \ \"))))(Tile((id \ - 4db53e53-4849-4848-86b0-454849bc0513)(label(&&))(mold((out \ + d2593a6c-b878-4f1c-8b86-963c0f18567d)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3f9923da-24fe-446d-a5e3-ced701cb58a7)(content(Whitespace\" \ + f6f5a0df-9e77-438c-a919-9c4be59126b2)(content(Whitespace\" \ \"))))(Tile((id \ - 241ddf2e-a507-4ed1-93f9-6ded0c0b4610)(label(true))(mold((out \ + 48d5294e-2b16-432f-8f32-0dcf54ba9587)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94d4dbcc-946d-4f56-8e66-2c765d5e1486)(label(\";\"))(mold((out \ + 7b8dee0e-55f7-4b8f-bceb-960272396728)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1ca68eed-f99c-47d3-8950-18b3780d23a2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1a362fe2-25f6-446a-a0bd-05cba32852fc)(label(let = \ + 9584580c-62ff-45e7-86dc-b5d559efdf21)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2e8deaa1-fad9-42f6-b2a2-cc74257fad3f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cc6f780e-18b6-4c1c-b6ad-8f12246c3acd)(content(Whitespace\" \ + 6691d181-75e0-432c-867a-2d3f7b3087fe)(content(Whitespace\" \ \"))))(Tile((id \ - bd373afd-2107-4383-8c91-a9daf07ca150)(label(f))(mold((out \ + 238e206a-8751-40d7-99da-a8105a4055e2)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 57b28608-23cb-4737-b726-081e9957f981)(label(:))(mold((out \ + eee88fd3-c0c0-4ca5-96ba-2f834624a547)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2e03d47f-61d1-4eb1-a832-782ef2780111)(shape \ + a378535c-f2d2-42cb-ab1f-df6b5c1e9321)(shape \ Convex)))(Secondary((id \ - c0e2cc03-f8e3-44ca-b9ff-f1e5b6de9d26)(content(Whitespace\" \ + 53d3be40-16ec-444b-89e0-82504ca7899c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0fdba49c-527d-4238-ab80-146ec677bbdf)(content(Whitespace\" \ \"))))(Secondary((id \ - fe5e963b-edec-4c04-943d-252f9cb229f0)(content(Whitespace\" \ + ec61d8d0-bae8-4c4f-9f0b-7dc4c88bfee5)(content(Whitespace\" \ \"))))(Secondary((id \ - d1fb8529-a98b-4876-b8f8-692605a76616)(content(Whitespace\" \ + 36caf6e5-60ac-497d-9f85-2ddaaed534cc)(content(Whitespace\" \ \"))))(Secondary((id \ - 3c3aae70-ba7b-403e-97ff-edb1797f7d4a)(content(Whitespace\" \ + 0af47010-ac83-45d3-a6c0-1a38117f5925)(content(Whitespace\" \ \")))))((Secondary((id \ - 7041413d-c8b4-4c6a-b72a-61130a12fbb0)(content(Whitespace\" \ + 46143bec-11d8-45bf-9ffc-d4cc5cf06448)(content(Whitespace\" \ \"))))(Tile((id \ - 685d3e96-10e0-4bcc-9e36-eccb06a4bc90)(label(fun \ + 5c2c7d78-5f05-4b30-a719-9203af5da3dd)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3e46b522-6276-43ad-9c6d-c716d5b3405f)(content(Whitespace\" \ + efdef946-6b3a-4762-a4d9-abbd2d2ec7f4)(content(Whitespace\" \ \"))))(Tile((id \ - dedb85e6-97f5-410e-b7cd-620c419c868a)(label(b))(mold((out \ + dd40d17f-eaca-40f3-800d-fa71f6511717)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8f05e18d-e3e2-4344-8fd5-ee645bc39832)(label(:))(mold((out \ + 21292813-ae30-4421-965c-984f854e72dc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1d33e33e-d3a9-44dc-be8f-a1ef99a9ff90)(content(Whitespace\" \ + 35207fd7-80ab-42ad-ab06-051c5c964c5f)(content(Whitespace\" \ \"))))(Tile((id \ - 883b9061-baec-493c-b028-db65808f4ffd)(label(Bool))(mold((out \ + b5da4155-cf8b-4f53-8515-95103d0ff286)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 5538ec55-54a8-4653-beb4-38f29087b461)(content(Whitespace\" \ + 06a7485d-848b-453f-868b-b7f176a87ec7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f76996e1-563f-4bb0-8722-bd1a4b31273b)(content(Whitespace\" \ + ba271a94-21e3-4364-a8a0-44cf74754fe9)(content(Whitespace\" \ \"))))(Tile((id \ - 5ba00249-1cca-4c45-913e-e81cd19e70e0)(label(b))(mold((out \ + c24ad3bf-34a7-41d4-bb92-1da639b00211)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - de9c2cb1-3ebb-4f20-a9c3-ca73f11b4e4a)(content(Whitespace\" \ + 28692f19-bc32-4bee-9b72-35ffeeadf60d)(content(Whitespace\" \ \"))))(Tile((id \ - 2cb79e7d-c79d-4dd5-84d3-64c0c946b2d5)(label(&&))(mold((out \ + f63006e4-6ca0-48b4-acdb-389ea239b5fa)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 18a861dd-7a13-42d6-b198-fbcfca97e1fa)(content(Whitespace\" \ + 91114bba-c7a3-4852-88ff-bcd85e66ca86)(content(Whitespace\" \ \"))))(Tile((id \ - f8a6bff2-9036-449f-9900-53c911d2fe1a)(label(true))(mold((out \ + 4dfd04bc-ed2c-49f1-ab8c-7888f6815ec4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2dc3898c-c666-4b37-ac8a-cd3db6bb4c5d)(content(Whitespace\" \ + 2b3ca272-e046-4eaf-bf98-a9c0634303b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90ead382-945e-43fb-b823-a64da5509f2c)(content(Whitespace\" \ + 0225a667-db44-442a-b448-6c5bce82c110)(content(Whitespace\" \ \"))))(Tile((id \ - ac578193-c80d-4cc0-bdf5-ea05b74fdfbc)(label(f))(mold((out \ + 59d42b3f-b9d7-4ada-83de-b39f31f3c638)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f7ddb630-6342-45a6-ad9b-c5beaaa4211a)(label(\"(\"\")\"))(mold((out \ + cab1f053-ae06-4c71-916e-61b6f7039701)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c3131eee-81db-4311-91c1-45e82647dbbf)(label(true))(mold((out \ + 19d26568-fcaf-459e-8d8d-3dc079c0740e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2f03fd4c-dc2a-493a-96bb-581ce4f32f4e)(content(Whitespace\" \ + 80489f22-a168-4539-982a-cb574c1f79aa)(content(Whitespace\" \ \"))))(Tile((id \ - 07ec0158-2f25-43a1-8ec4-4f969827eee8)(label(&&))(mold((out \ + 492d97fb-91ad-4d1a-8d6b-e4fd1cdda5fc)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b12f13c9-7a15-4758-83b4-70d4d9b48cdd)(content(Whitespace\" \ + 4ac0d076-d615-4341-af02-93207390fbf4)(content(Whitespace\" \ \"))))(Tile((id \ - d5aa9c32-dc39-4ad3-845b-8d5b9895711d)(label(true))(mold((out \ + 535dd6b9-372c-48b6-b804-af8eba2c70db)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a5604d6b-9845-4b42-9882-b73f13044f59)(label(\";\"))(mold((out \ + 57ce7d30-b2e6-4185-8b69-8909a2fa2657)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ef18b357-4b72-441d-bf7a-9381e68d4eb5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7fdf1a1-8871-4cb7-92d9-e03cda823874)(label(let = \ + 7aedf271-fdbd-4ab0-a7bf-cff3ddf5d7a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9eb6a887-66ed-4e6f-abb1-0fd18cc232a2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bfa6adfb-bb16-4646-a0b0-f897469793b1)(content(Whitespace\" \ + 12be4102-aed6-4de1-90d4-30fc48b2488e)(content(Whitespace\" \ \"))))(Tile((id \ - 60ad8d3d-5f54-40a9-afa1-011d28823bf0)(label(f))(mold((out \ + 1265ef43-4ead-4e57-bd7b-71f40fde0dc9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a964dd76-dd1b-47dc-8cb9-fb11e47a0d6d)(label(:))(mold((out \ + 78d8e46a-31a4-447f-a2ab-8d4411270c7f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 73e6d7d9-d9de-446b-aebb-a35389332fd9)(content(Whitespace\" \ + a5e00130-9fa2-41a0-8234-28ca3baba902)(content(Whitespace\" \ \"))))(Secondary((id \ - f982779c-2eff-4ab6-851b-6d07d54b181d)(content(Whitespace\" \ - \"))))(Grout((id 27a027e0-6b17-45bd-a137-07db10378138)(shape \ + 16d34ea7-44f2-4faa-bc07-b4679ee9ac88)(content(Whitespace\" \ + \"))))(Grout((id 17ae806e-1dc6-47b3-af8d-a1193f451a01)(shape \ Convex)))(Tile((id \ - 6c1d4e1a-4058-4aec-a653-6810e81e454d)(label(->))(mold((out \ + 71e37eb1-4a8e-4477-b6e6-3d22fa8744ca)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 71b2616f-f023-4be4-9758-613382b4bfb8)(shape \ + e886e87b-531b-4dcb-af2a-708ba8ba0222)(shape \ Convex)))(Secondary((id \ - 5013f58c-13b1-445f-8a50-f0d4a2c2d2de)(content(Whitespace\" \ + 38a9c301-9f10-4689-9d0e-8a6dfcf055e5)(content(Whitespace\" \ \"))))(Secondary((id \ - 012beeb5-86d3-44eb-bbe1-8c01d8c94bb1)(content(Whitespace\" \ + 0ff8eae2-1c57-4348-9973-374b884fc0d4)(content(Whitespace\" \ \"))))(Secondary((id \ - 052ff6e6-8c96-4397-bc4f-856432ec902d)(content(Whitespace\" \ + de480e87-c164-4699-9d52-f9ca0fce51db)(content(Whitespace\" \ \"))))(Secondary((id \ - 41a7b697-1488-4472-b22a-87296906fb5e)(content(Whitespace\" \ + e022ed77-aa6a-439e-82be-501008d82adf)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2070cccd-7c74-46e5-a86b-e759a77b9fad)(content(Whitespace\" \ \")))))((Secondary((id \ - 44d390ad-175f-4667-80cd-f69e0a20b20b)(content(Whitespace\" \ + ba98ff4a-41ff-4029-90cd-ae83979916ca)(content(Whitespace\" \ \"))))(Tile((id \ - 78a63590-4f04-4ecd-93de-5d3c7320d2f3)(label(fun \ + eb3b3af6-9ea6-4066-af0d-aba8d6d33e3d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 160f0b9f-d426-42b7-87f4-6644e37130d6)(content(Whitespace\" \ + c5c594eb-aaf2-410f-98fd-d1c7e4c6a488)(content(Whitespace\" \ \"))))(Tile((id \ - c71c0c07-5fbd-411a-af3c-60c560395c8e)(label(b))(mold((out \ + e14ee146-62cb-490c-b60e-1f63352a9c36)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b1e56c81-a887-495c-8746-df89e6c82dcb)(content(Whitespace\" \ + 47f4de57-9b84-41ec-b953-464055365276)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c21f5d94-a514-4a9d-b6ee-3b839d8b1a74)(content(Whitespace\" \ + cc658ed0-0a54-46c8-b8b0-939f66e278ef)(content(Whitespace\" \ \"))))(Tile((id \ - f7e8d364-6c3a-4626-8011-1956477a1556)(label(b))(mold((out \ + 109143e1-f8b8-4fcd-a18a-57ed61bd876e)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dfdf3910-42bb-43f3-8fda-48367852adee)(content(Whitespace\" \ + f72203fc-cdd6-4153-b644-2c95b4c2ecb0)(content(Whitespace\" \ \"))))(Tile((id \ - 4e7e7052-73f9-4351-bfa7-8016b084aa12)(label(&&))(mold((out \ + 95e2a609-b4b7-4c81-85aa-85a22eedd5f0)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 74acf77d-2e30-4005-94d6-bd1047728d46)(content(Whitespace\" \ + 7e155bae-1731-479d-9f1b-06f61b7a89bf)(content(Whitespace\" \ \"))))(Tile((id \ - 9dced731-e36e-4ca9-b812-3f747d908400)(label(true))(mold((out \ + 8bdfc26a-f9af-452a-8a87-6c1fe89f5585)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 42732025-27ab-4e03-9b3d-46fd84496c36)(content(Whitespace\" \ + 6d64f6df-70ee-475a-9970-04228e13e884)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7205b5c9-7220-4fa1-bcbc-199da3614b9b)(content(Whitespace\" \ + d9e12550-14e9-484c-a37c-5c4ec208c2ed)(content(Whitespace\" \ \"))))(Tile((id \ - 9a839fd0-76f8-4bde-b695-61356f04f901)(label(f))(mold((out \ + 7a47d4da-93b4-45dc-a181-f5e0e2df44e5)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 33608e75-9522-45a6-b1fd-95676cc0214b)(label(\"(\"\")\"))(mold((out \ + 3bbb380a-2756-43cb-9c31-47b11ed3b026)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 35f8e5e7-1e45-4180-9dac-5fdfaf5e9213)(label(true))(mold((out \ + 8cf40d8f-5131-4b2a-b925-f9a0c73e5c66)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e2a2dc0d-31b1-4222-ab47-4cefb4c272b4)(content(Whitespace\" \ + ba2a4838-e96f-439d-82b5-426ea913889a)(content(Whitespace\" \ \"))))(Tile((id \ - 17702a02-4ae1-4bd2-ac8b-d2b03e8bbae4)(label(&&))(mold((out \ + 5b017b05-2dc9-4bb8-9d81-43104f05572c)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5df892a8-cea4-47f5-b764-fd8839e36c97)(content(Whitespace\" \ + af45430e-6e51-4520-9f9d-49117bfaf4aa)(content(Whitespace\" \ \"))))(Tile((id \ - c08308f9-c27f-4ed9-8646-ea1c313fcb06)(label(true))(mold((out \ + e6f67f3a-4b22-4be1-8ed1-36801f42b6d8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - efb6ac7c-feea-4484-8545-6237d8049984)(label(\";\"))(mold((out \ + 095ded62-7845-4ab1-b493-867e9ee579b1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 755a25f6-5f65-49aa-af37-86fac0a44830)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3a16cfc9-c4b6-40a6-9a34-d01f9d0694ec)(label(let = \ + fbb796fa-219b-46cd-b36f-ca75d1a64a3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 31bf6267-878e-4291-8605-72974e318b28)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 57208890-7d71-4306-a9b7-7545deeeba3b)(content(Whitespace\" \ + 983167f5-028f-4688-9cf9-f5c8daa9b9e8)(content(Whitespace\" \ \"))))(Tile((id \ - 603e866e-f5cb-4df4-b5cf-c70b9065404c)(label(f))(mold((out \ + c10b24c2-ea13-479d-80c3-1bd57b9c337f)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e0768be1-7d29-4e58-9ba2-8d642149d853)(label(:))(mold((out \ + dd5ef1eb-f6f0-46d9-91df-ec1a47142b3b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0a0d958d-a728-47b3-817f-28dc9bf45d32)(content(Whitespace\" \ + fd6ab311-a796-40fa-8dc6-647660ae60f1)(content(Whitespace\" \ \"))))(Secondary((id \ - 7f03b181-76e0-49dd-b086-a3531eb488f6)(content(Whitespace\" \ - \"))))(Grout((id cabf4d71-480a-4af4-b090-f58ebc57a971)(shape \ + c912d664-2faf-495d-9bea-e742b8189585)(content(Whitespace\" \ + \"))))(Grout((id 2d3ddd04-87e2-46fc-a7fa-d913c513d4d3)(shape \ Convex)))(Tile((id \ - d14715fb-b049-4bd8-8d7b-f529d4bc7e0e)(label(->))(mold((out \ + f88f9c63-4a55-4f62-808b-6f75a08cc614)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 16926afc-66d1-4271-8871-1af513af284c)(shape \ + ec9a09e8-c256-4e2a-984b-d78d0f0d32f1)(shape \ Convex)))(Secondary((id \ - 4b92e4e1-7313-4bb9-a8c1-18528f14058f)(content(Whitespace\" \ + 2ebb233c-d2b4-4f79-85a8-989b89908a9a)(content(Whitespace\" \ + \"))))(Secondary((id \ + de3dc889-bae6-4a59-a963-44d9cc68a182)(content(Whitespace\" \ \"))))(Secondary((id \ - 768855d1-319d-4aa9-8ab4-2ef59217480b)(content(Whitespace\" \ + c43178d1-de35-4843-9bf7-931def214d44)(content(Whitespace\" \ \"))))(Secondary((id \ - 20666716-4b06-4721-902e-d9d5cb7769c5)(content(Whitespace\" \ + 38a2299e-8516-4201-a545-f6f4b4fa4d8b)(content(Whitespace\" \ \"))))(Secondary((id \ - 6f7033ac-848d-4e8c-a54e-dcf1a337f904)(content(Whitespace\" \ + 90ad3009-01e4-4620-8ed5-bf8cfc581f41)(content(Whitespace\" \ \")))))((Secondary((id \ - 3f7ffdf1-ad0c-4b36-a9fa-c91b374942c7)(content(Whitespace\" \ + bfbc29bc-ce2e-4086-a397-a391dfbf04a0)(content(Whitespace\" \ \"))))(Tile((id \ - b5323b6f-bd06-4341-b0a8-684f2fc0066b)(label(fun \ + 5c2b4d8b-335a-449a-82df-351e7040c582)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - cd90892a-fcf5-4fae-864a-fc2beb27d574)(content(Whitespace\" \ + 09e3f249-0d35-4992-9e96-442bcf21a0f1)(content(Whitespace\" \ \"))))(Tile((id \ - 4b63493a-3f77-4454-9ac6-f8123cc2ed13)(label(b))(mold((out \ + f06585d0-5231-43e2-a7ff-47bfb8476b06)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fc19adf0-f2ef-4f0c-8051-ec1476018bf0)(label(:))(mold((out \ + a00c688e-3015-4b40-bcd7-dbf738e7760d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2de04a1e-c14f-4f65-867a-c416a2219ed9)(shape \ + 05680e6e-0b3c-4934-9a61-435ac8fdc944)(shape \ Convex)))(Secondary((id \ - d34cd1d1-e12c-4a88-87b0-db00c16222a3)(content(Whitespace\" \ + c2e2f523-d982-45a6-a118-561b3e11a8cc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3706ac8a-79b7-43b3-860a-d6408eb0b109)(content(Whitespace\" \ \"))))(Secondary((id \ - 97c5ff61-006e-404c-99d6-431bbca6a3fa)(content(Whitespace\" \ + 6535ad0c-56ec-43bc-949c-920d24528632)(content(Whitespace\" \ \"))))(Secondary((id \ - d2b92827-a875-4f61-b51c-6e198cb3308c)(content(Whitespace\" \ + c6b41176-9bba-4a80-afcd-be190b267668)(content(Whitespace\" \ \"))))(Secondary((id \ - 355446e1-0e38-48e1-b16e-5e4f7c8a7e4a)(content(Whitespace\" \ + 37607c93-3b86-47ee-95bf-0a51c5bf290e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4ea0f50d-727b-429a-b040-e436c04e118c)(content(Whitespace\" \ + 626c5d8c-9b0a-4eaf-b93e-f2fccc236f33)(content(Whitespace\" \ \"))))(Tile((id \ - 2e3dbfa6-2fe8-4c78-b769-6345e845bb36)(label(b))(mold((out \ + 603e5f78-5d90-4e18-8940-75b0a639b585)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 11b0e1b8-12ed-445f-9cbb-1b38146c2606)(content(Whitespace\" \ + c08d9a5b-3e01-4978-8d06-ca262dd66433)(content(Whitespace\" \ \"))))(Tile((id \ - 42da6cee-5d0c-4b77-89c8-f9e422b32916)(label(&&))(mold((out \ + 0332f83c-144e-4b12-9320-c7979fb8e029)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3b785e14-4227-45cc-9b1e-81d830871c74)(content(Whitespace\" \ + c6d0c9f1-eb8f-4055-a5c3-685a6357d708)(content(Whitespace\" \ \"))))(Tile((id \ - a836a2db-4e5f-46a2-be78-fa14b23d56ea)(label(true))(mold((out \ + 1af5fcaf-8498-425c-bc46-7af2d3326375)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 37d59ed9-af4d-4bf5-bd6f-56b9e0e1afe7)(content(Whitespace\" \ + 4b493e4c-08b6-417c-bafc-8466dd14c80b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5521457d-6cf2-43dd-98e9-a9d7df92e9c4)(content(Whitespace\" \ + 534e7df4-07b4-48c9-8551-24fd1cbff076)(content(Whitespace\" \ \"))))(Tile((id \ - 04eb2f4e-a50d-4a33-8725-c9104b79851f)(label(f))(mold((out \ + 1df2eb0c-0156-4f35-aee4-d12f57940147)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 89369cb3-51a8-42fc-a6fa-3ff4a9e06bf4)(label(\"(\"\")\"))(mold((out \ + 9d7e38c0-9ff7-45ba-a7eb-cf1927b4a52b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 33d81b13-87c5-400a-9e3b-4cc95fd7fe27)(label(true))(mold((out \ + 396f8e21-6176-4c3d-8359-a5aeef61957c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 1b20962e-73e6-4ab4-af2f-66743011fd49)(content(Whitespace\" \ + bcd3e8be-a5e8-4621-8f98-85b4284f6f87)(content(Whitespace\" \ \"))))(Tile((id \ - 2f18f52b-fcf0-4c74-a5ea-3d9277483d87)(label(&&))(mold((out \ + aeb2eda0-7164-4e3b-b8c8-bc615b928c00)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 450c3eed-3bbb-49c9-8a36-7dd77af0ba6c)(content(Whitespace\" \ + 47e9bb9b-4bb5-410c-8a7f-26ef26fb096e)(content(Whitespace\" \ \"))))(Tile((id \ - 52bf5292-c8d2-4680-9a91-c94fdca39f28)(label(true))(mold((out \ + d1d5d9aa-aad0-4486-848a-b4623c776bcd)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ca93c267-9833-49cb-8a2f-ce9c1cfb8688)(label(\";\"))(mold((out \ + 22a96e4c-dd62-46b6-8ce0-891312cc0ab3)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9d5ede7f-8fec-4112-a9a1-dfa09242134b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cca03013-94a1-41bb-9aaa-40a61bb4b967)(label(let = \ + 5577a324-0232-40b8-bfc7-cfa11ce76a42)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + aba93dc0-e541-408d-9776-49ac3e7852c9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c383ed9c-9976-496d-8d33-0d91bd7de454)(content(Whitespace\" \ + 91a328e7-7d3c-4e21-a464-b370b9e48aa7)(content(Whitespace\" \ \"))))(Tile((id \ - 2fb45cc0-9e24-40f8-8dfe-d49e05b5e8e6)(label(f))(mold((out \ + 7f68f2bf-0d4c-4d82-a5e3-bd51941d58f5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 46d099fe-7ed9-434c-ba89-0f6046ff95ed)(label(:))(mold((out \ + 36d8d777-d96d-47ab-af17-f337409ad427)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b37f512f-824f-4714-bdaf-c34da5d50937)(content(Whitespace\" \ + 6ddbed28-47ca-4ed7-ae0d-cb0dbead3f92)(content(Whitespace\" \ \"))))(Secondary((id \ - 4b4e481b-ed0e-4b8e-9b5a-79f6e0daedea)(content(Whitespace\" \ - \"))))(Grout((id 0345e588-2bcc-4db6-9756-e2d5600f62ed)(shape \ + 23a7afa2-b2db-4b17-a80e-115acab722a8)(content(Whitespace\" \ + \"))))(Grout((id 7c07d640-531b-4cd3-87bb-35835dde8e0e)(shape \ Convex)))(Tile((id \ - 9fa88c44-7345-4ed7-bb7e-e9df09135100)(label(->))(mold((out \ + 2b78b82b-63e9-4042-9b42-68b5fe26d7c4)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - cd1f514b-c2f1-4db7-ba5e-ef788f5298f2)(shape \ + 50277b6c-6a0d-401a-982a-88b0c3dfd860)(shape \ Convex)))(Secondary((id \ - 638ef6c7-e565-4025-b11a-cdd4207c33d4)(content(Whitespace\" \ + 464fb60f-c5f9-4dd9-88c7-a276ac3774ae)(content(Whitespace\" \ \"))))(Secondary((id \ - d11b2f70-3adc-4ab1-bf1a-8eccea47f3f7)(content(Whitespace\" \ + 41bfb844-ff21-4944-93d8-0a2722526d48)(content(Whitespace\" \ \"))))(Secondary((id \ - 9c66d267-d8e3-4d0d-9d2c-ef1bdf13d326)(content(Whitespace\" \ + 699bfb3a-9f6d-4180-a0cf-901cbf112a31)(content(Whitespace\" \ \"))))(Secondary((id \ - 001ebfc8-fd51-4c0f-b5b6-d969d2922403)(content(Whitespace\" \ + 7f4e1132-fe15-4607-8f96-29e3a973c1e2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 40807720-bbbb-4af2-a773-02d34bfd999c)(content(Whitespace\" \ \")))))((Secondary((id \ - 39186db7-2642-4b36-a610-4b9aa1e26b88)(content(Whitespace\" \ + efdc2871-cdbe-479a-9108-be021edb0265)(content(Whitespace\" \ \"))))(Tile((id \ - 232c92cf-5b17-49b0-9b0a-d244918f827f)(label(fun \ + 549a5421-45ed-4578-a3ea-f5d53fa0d3fd)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b765006e-6e75-44fe-ba9d-ae51f70e6008)(content(Whitespace\" \ + 79c8bf09-f3d0-412e-9d45-baf44eff9bb1)(content(Whitespace\" \ \"))))(Tile((id \ - c6a205b7-80cb-48e8-a5f4-24db741cf7de)(label(b))(mold((out \ + 57833b66-cadf-4c0f-b734-35cd0aec89a2)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2170f1db-c288-4be1-894f-3ae1f0f8ea33)(label(:))(mold((out \ + da024268-488f-4095-a6e8-924711139f18)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0465d5d3-bbc1-40b3-a2a5-f2ee522da580)(content(Whitespace\" \ + b9ac481e-9009-4a53-acdf-20ed6956fd64)(content(Whitespace\" \ \"))))(Tile((id \ - 1ed71b8d-2be2-4895-ba24-a357dcd48810)(label(Bool))(mold((out \ + abb7c9b8-e143-4537-a158-84e720ba8e4d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 84e19648-70fb-4396-80af-282752914f27)(content(Whitespace\" \ + 11a68b18-c9ee-4998-a7a4-3028a8b87bf3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 42c995e5-8731-4863-afed-00cff3bec890)(content(Whitespace\" \ + c292d1ba-61d2-42c0-a51f-5e4ed16fd4a6)(content(Whitespace\" \ \"))))(Tile((id \ - 3c4eb7a5-76aa-40f9-b1f8-353e8bdc3999)(label(b))(mold((out \ + 83c22315-fce1-44c8-bc66-ab3b21041d30)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 28f11fff-1db2-4f1b-99a6-c0a46faef9da)(content(Whitespace\" \ + a81ae344-dafa-4ccb-8a28-0e036a37139b)(content(Whitespace\" \ \"))))(Tile((id \ - 214fdf21-148e-4d90-a7ef-92ae38ebf07e)(label(&&))(mold((out \ + c97fa7fd-211f-4f3b-b4ef-311cf83a760d)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 86d5b648-036d-4a8a-a85a-5c30db39d245)(content(Whitespace\" \ + 919e5ad2-faa1-4f1a-844d-4b4363e81670)(content(Whitespace\" \ \"))))(Tile((id \ - f283831c-a328-4dea-a2dc-886116d47f90)(label(true))(mold((out \ + 99cee9a1-3024-4916-9e3a-c21c47e3b386)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a0963d68-bdba-4426-9336-32994575fc83)(content(Whitespace\" \ + 167d7af3-6b81-4ecf-bd0a-b920001c9ab3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 19fc3011-3a8a-4340-a610-20d23c8c6379)(content(Whitespace\" \ + 390c410f-8099-450e-a96a-9396b89f0dd1)(content(Whitespace\" \ \"))))(Tile((id \ - 8ad6d48d-6f37-49c0-beb0-9cb9874f5fd8)(label(f))(mold((out \ + 9a350d43-86d2-4aac-88e4-477aee222b3d)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 719bee1f-6f13-40db-9f77-50c637b337a4)(label(\"(\"\")\"))(mold((out \ + 74c9597e-081a-44d1-9d6c-59ec236635cf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 965bf8cd-aff9-4808-b6b0-2e9b349c4f2c)(label(true))(mold((out \ + 1c0fc16e-ca6c-4930-9d9a-84d3a056bfb3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ad3d9fd1-6476-4f87-bb38-34f4f7f38595)(content(Whitespace\" \ + 48980f08-2293-4e6f-8778-e29f0f7855ac)(content(Whitespace\" \ \"))))(Tile((id \ - 40b17abc-ead0-4680-9005-c9a70c5b62a6)(label(&&))(mold((out \ + bf5d79af-54db-4fd3-b05e-3cfa54046b81)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9c8aab7e-dc49-4f96-b06d-c093291ec80a)(content(Whitespace\" \ + 4b315d42-e151-4ea6-ab9c-546dffc9217b)(content(Whitespace\" \ \"))))(Tile((id \ - b8f22027-a3d1-4cda-8c8d-367ecdb39b6b)(label(true))(mold((out \ + 73438406-c661-409c-b4a2-b87e9f450721)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f15876a8-f53e-42b3-96c0-5a86430e7999)(label(\";\"))(mold((out \ + 57758ed1-ab57-4e3d-aef9-aa7d1fbf04d5)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fcce66b5-2c98-4554-a35f-6fe9356f4ff3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 11cd68d4-3055-4e6d-b2ba-d532fe47caed)(label(let = \ + e7628ab6-c525-4065-80ea-893de72fa236)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8cf8b117-3717-4ce8-bed2-54a0036715cc)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 010533b3-77f0-4e2f-af0d-5f2c996e436a)(content(Whitespace\" \ + 88d2f074-ef60-4d8b-bfb3-68d035e5706a)(content(Whitespace\" \ \"))))(Tile((id \ - d64b6898-cc91-4d59-81ac-747515c6c627)(label(f))(mold((out \ + 0014f507-6f68-4412-be09-212a19dca949)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e2cb63f0-5082-442e-b602-3bf3b218b89e)(label(:))(mold((out \ + 9482dda0-f933-43cd-ae1a-13ada91e8b18)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 17ac70f9-402a-4ff4-80a9-20c61fc8314d)(content(Whitespace\" \ + 9f70188b-9cbc-40a5-95cf-9c189a1f0c85)(content(Whitespace\" \ \"))))(Tile((id \ - 7f528aaf-f2a2-4935-917b-ce20709839b4)(label(Bool))(mold((out \ + 3e962086-862c-4c03-bb32-d446a5511509)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 05000601-d579-4e80-9972-bc6d8f3b2e28)(content(Whitespace\" \ + 2176d7bf-847e-45e9-ad8e-143fc5b7c945)(content(Whitespace\" \ \"))))(Tile((id \ - 36df75da-0dd3-488b-a9d9-5d21c171cc9a)(label(->))(mold((out \ + f70c5e0c-61c4-4ec8-9b51-a630959eba84)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 6463f7cf-2b42-4e08-a17f-f407e057c0bb)(shape \ + bb324f28-a8ef-4f23-9059-5a399484c2c6)(shape \ Convex)))(Secondary((id \ - 45ecbd7b-f73c-4d0b-b46e-9e360161face)(content(Whitespace\" \ + eb70dc44-fd3e-421d-a873-272e02dd88be)(content(Whitespace\" \ + \"))))(Secondary((id \ + 99f5a121-99b7-4506-a466-bd7b6105a6fa)(content(Whitespace\" \ \"))))(Secondary((id \ - 09f02bdb-8e5f-4bdb-bd01-d7dfa9241610)(content(Whitespace\" \ + ba8923b2-389e-4c39-b1ae-49066a3cf36b)(content(Whitespace\" \ \"))))(Secondary((id \ - 1e00cde3-c1b0-4de2-9a00-a34e2ff7c655)(content(Whitespace\" \ + f9433098-c530-416e-be0a-732eec1909b7)(content(Whitespace\" \ \"))))(Secondary((id \ - 8b301dda-83af-4a8f-a0fb-a609537e21b4)(content(Whitespace\" \ + f4f67fa7-ae86-46e7-9be2-eeba26bfd98b)(content(Whitespace\" \ \")))))((Secondary((id \ - 28849283-0d26-40df-9733-19e27ea79ddf)(content(Whitespace\" \ + 5d6f4679-6a1b-40b4-b3ef-ef15cec637ac)(content(Whitespace\" \ \"))))(Tile((id \ - 6d2ad017-4926-4a91-890c-2ee9878eb57b)(label(fun \ + acb8a802-0768-4b63-8e61-b32962743330)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2d532352-1000-4c3b-84eb-c061d6f89b87)(content(Whitespace\" \ + 2884de99-add9-4604-9640-8af3a551585e)(content(Whitespace\" \ \"))))(Tile((id \ - 248543bd-79cf-4dc7-9ccc-a335930da2ae)(label(b))(mold((out \ + 58f0f730-9a99-4f96-9939-9ecce9c86813)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dca1f43d-fc2c-4db7-8629-ddca28b02384)(content(Whitespace\" \ + 1a0e1918-68a2-47da-9ef3-2fe570911946)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b0fb2925-c05a-47d6-beab-9a5bc077e390)(content(Whitespace\" \ + 8855824e-2554-4f29-8640-f12da017fb9e)(content(Whitespace\" \ \"))))(Tile((id \ - f30d6fe5-fc15-4165-b5cb-74b581608850)(label(b))(mold((out \ + 7469b75b-e2e8-4a00-95de-5c75f5f3e5eb)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 28de10b0-ee86-4b36-868e-efa974c7fefd)(content(Whitespace\" \ + 842a0b63-629d-4a53-bd09-c7cd1f7cd201)(content(Whitespace\" \ \"))))(Tile((id \ - 034b93e1-e68b-4c71-9aa9-8b88a1f6717f)(label(&&))(mold((out \ + e4f29a70-bab6-4049-9d89-c3bb0621869e)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0aa13a16-8a85-4b6a-af46-3259e80498b9)(content(Whitespace\" \ + 95625354-da02-4b87-aaaf-096ac5051c4b)(content(Whitespace\" \ \"))))(Tile((id \ - ca718d01-9143-41df-a9dd-9695bee7cc40)(label(true))(mold((out \ + 8f5c2142-3f3a-4221-9764-7d8c1bf6caaf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6108da88-cd31-4bbd-98a1-74870b6f5f59)(content(Whitespace\" \ + 17d9fc1b-e994-489d-a515-281c80254886)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fc08e84f-6f5c-406b-a370-4d8764076c0e)(content(Whitespace\" \ + 4649159d-c144-4fa0-b13f-b4b29b6dc38f)(content(Whitespace\" \ \"))))(Tile((id \ - 3264ef95-4518-47c6-8186-3e040a2878f3)(label(f))(mold((out \ + f0e635f9-1d16-4e70-91c3-17405b229157)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 083896f7-521d-45eb-b5e2-a0693472b6f8)(label(\"(\"\")\"))(mold((out \ + 10f6a9e7-32da-4caf-807a-74e8d17beb02)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9a445efe-d95a-43c3-9230-bbdca765a148)(label(true))(mold((out \ + b7412d33-2626-4430-99a5-24b64072d705)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 56f63e5c-89b9-4b8d-aeec-1a57863e4b5e)(content(Whitespace\" \ + ebac4da7-9134-41a0-96ba-e5187562426c)(content(Whitespace\" \ \"))))(Tile((id \ - 93508e37-b4f3-4830-ab96-9ceb29388e53)(label(&&))(mold((out \ + 66703279-490d-4776-b9a5-2b0dae0b4df8)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8c1e6a65-a640-417f-b2a3-43ee0693e64c)(content(Whitespace\" \ + a911af86-9bdd-4fe9-acf6-770f52193d2e)(content(Whitespace\" \ \"))))(Tile((id \ - 5afd5f9f-3941-40a3-8f97-4a83aabd5d0d)(label(true))(mold((out \ + 871b70ce-e384-4741-a0f0-e91dc6c91f2c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3e5c743a-f3a5-4d3a-9360-ea5b2b36e6d1)(label(\";\"))(mold((out \ + bfbcec2b-6879-44ef-81f4-46bde8f68a94)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ec976b0b-cbbf-48d4-9868-a1baa3a2571f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fca344de-2eb5-40bb-9f6d-0c8442b1f763)(label(let = \ + 90aceb86-483e-4844-b758-9c04a734f56c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5e772249-f1bb-44d3-b037-cbfa1746ebae)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 596d5e3f-1701-4791-b5a7-c090e993e604)(content(Whitespace\" \ + a48e554d-6b6e-4976-b863-47aa3099778f)(content(Whitespace\" \ \"))))(Tile((id \ - 8c80bd17-ae12-40f3-95f6-4811a3cb94da)(label(f))(mold((out \ + deb0d572-8fe7-4e81-a6c5-9f7235e230ef)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f9316f37-d724-4b33-8902-682f3419ec73)(label(:))(mold((out \ + 969170cf-4bf4-4299-990e-e0c3f75f3f4c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ffcb227d-6bad-44a2-b874-744b86e8a8e3)(content(Whitespace\" \ + 05efd73c-c11c-4583-9d24-d6fa2e5cbfc5)(content(Whitespace\" \ \"))))(Tile((id \ - 8246fdc4-2f51-40ed-bf24-c9b189a72ce7)(label(Bool))(mold((out \ + 9626500b-0d65-45d6-8cc1-21701b982ee7)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 70a96cc6-0821-4f30-9c32-aaace439c4a2)(content(Whitespace\" \ + 9ecb9b9b-fded-468c-8cf7-2e3729056b37)(content(Whitespace\" \ \"))))(Tile((id \ - 55f875ee-c926-4d7e-9581-552f36cbaf05)(label(->))(mold((out \ + 00e07324-83e7-4df7-a772-22d1d8de54b8)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - ab4093d9-720a-4143-8e79-1255e712e234)(shape \ + c1f33aba-6e3a-4c8f-b4d2-574ce5b4f216)(shape \ Convex)))(Secondary((id \ - 943861f0-fd63-4cbe-9115-d69860ad12a1)(content(Whitespace\" \ + db022bb8-9aca-48fd-9690-ae1d6c5bb490)(content(Whitespace\" \ \"))))(Secondary((id \ - 442c7424-afaf-4b69-81fe-5af0238388c9)(content(Whitespace\" \ + 027d8ca2-1b81-442b-8cf1-cdf2d1c76e91)(content(Whitespace\" \ \"))))(Secondary((id \ - c4474715-a547-46ab-b40a-a244cef264c9)(content(Whitespace\" \ + a2cd2ce4-0fdb-428d-9a51-13701d0fa4a0)(content(Whitespace\" \ \"))))(Secondary((id \ - 29705c2e-e88c-480d-b7bc-1440d024e5b5)(content(Whitespace\" \ + a5cf72cf-677f-4aaf-9ec6-09e91c1f525a)(content(Whitespace\" \ + \"))))(Secondary((id \ + db235a2f-8387-4e02-babf-2199d2c272ea)(content(Whitespace\" \ \")))))((Secondary((id \ - 576a7ae2-ecba-4052-b24c-5c21a53c33c9)(content(Whitespace\" \ + 2d450b70-0ed5-42be-85f1-f0f933a8483c)(content(Whitespace\" \ \"))))(Tile((id \ - e9c92d0e-19bb-4954-bf3e-fdc999cf2496)(label(fun \ + 8bdfcdc9-d729-47f6-97d7-2ac32198f162)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 497e2f36-1649-4374-88a6-21d26a2abd04)(content(Whitespace\" \ + 06ddc928-ab64-4781-bd72-dffab779b785)(content(Whitespace\" \ \"))))(Tile((id \ - 5408491e-14c3-4ac0-97b7-a4a169bf3e55)(label(b))(mold((out \ + d2319dc5-d1f8-4de0-8d7f-63a147483635)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d582ea88-8616-4a46-943a-d23cfd396ed6)(label(:))(mold((out \ + c25b9f07-e439-4dfe-a263-5bcaed84a1de)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - d15964eb-dbb5-4e2f-ac89-d30c814d2368)(shape \ + e7b5912a-155e-41f9-89af-6ec00d4d5001)(shape \ Convex)))(Secondary((id \ - 39a5836d-ea50-4b1c-9b7e-5ab281b1ba9d)(content(Whitespace\" \ + f918b9a6-55f3-4a16-8ba1-a00fbd9bb382)(content(Whitespace\" \ + \"))))(Secondary((id \ + fbadb3c6-02ac-4ca5-90f8-9e5d3a219ab9)(content(Whitespace\" \ \"))))(Secondary((id \ - bd0aadbc-209c-4243-a9e7-a9b54106ae2e)(content(Whitespace\" \ + dadb658a-0b61-420f-b1b5-4771a9a987a0)(content(Whitespace\" \ \"))))(Secondary((id \ - 7d458f40-8936-4796-8b61-f5d0743609af)(content(Whitespace\" \ + 1a9310c9-0c07-4dab-8af5-02d6135cca25)(content(Whitespace\" \ \"))))(Secondary((id \ - 3c0a02fa-fc7c-49ea-8ae3-197a8ebcca98)(content(Whitespace\" \ + b8907280-6edc-4fd9-b5bc-c6fd56283b0b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6737dfac-e94b-438f-8982-58f7bee19633)(content(Whitespace\" \ + c036a747-29d0-4d85-b17b-6d6b56ffadd9)(content(Whitespace\" \ \"))))(Tile((id \ - 4b15c4f7-ce91-4281-854f-1188f75bf5bc)(label(b))(mold((out \ + a91b0838-4442-4144-b1c7-0c2a9c0baee2)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e654b815-f44b-44d6-a742-38eb2b6b8235)(content(Whitespace\" \ + f1649a88-1f7e-4178-ad24-48c3a8a288d5)(content(Whitespace\" \ \"))))(Tile((id \ - 6048be0a-77c8-4cd3-a1cc-2b101deb8219)(label(&&))(mold((out \ + b02e51ce-a0d5-43a9-8da4-661da9b68805)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c4980224-f3bc-4216-ad5d-ffe0c145a643)(content(Whitespace\" \ + dac2a560-cb86-4e00-81ff-b562d2ce7418)(content(Whitespace\" \ \"))))(Tile((id \ - a76cc209-2468-4999-b945-987771e356c2)(label(true))(mold((out \ + c00f81b8-8545-498a-96b7-b763e03a4076)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 75e578c6-daa6-4299-97de-a6d8c66c48d6)(content(Whitespace\" \ + 735cc62a-bfcc-41b3-b850-4dc5498b4f82)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5561ee81-b3e9-4509-9394-5026f562c29c)(content(Whitespace\" \ + b461d8b4-fde6-444f-b91f-43e54c2196ae)(content(Whitespace\" \ \"))))(Tile((id \ - 60acaab5-41d2-4adc-bbe6-94c69ac6beb8)(label(f))(mold((out \ + 3d7259df-8be3-4feb-8be1-879a470dffa8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a11bab41-cca9-448a-8eca-014ac0ee2cc4)(label(\"(\"\")\"))(mold((out \ + ed9207eb-e8a6-4812-b49b-18275f649eb3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28ebdf1c-b7b1-49c9-8a4f-8db534b555b4)(label(true))(mold((out \ + ee3b1c86-1b07-46d6-8d98-dfa2e9b01333)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 93d8e458-a2c9-468d-907d-23dbc4b705de)(content(Whitespace\" \ + 967b9cd8-a392-48d2-af20-89b3d996fdce)(content(Whitespace\" \ \"))))(Tile((id \ - 255ad8ca-26b2-4b5a-811c-737046ab2eca)(label(&&))(mold((out \ + baa5eb0d-189d-4f32-a19f-4ee25cf4e9c9)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 51a23c09-d225-4235-a0d7-6fc4830f4e43)(content(Whitespace\" \ + f8ffbb71-c00d-4ca3-a16e-5af3a1ac39f0)(content(Whitespace\" \ \"))))(Tile((id \ - 47960195-5bee-4004-b241-78df30e2294a)(label(true))(mold((out \ + 3b24e68b-6cce-4418-a75a-52010aedeedf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6e02f82c-6501-4810-8c7c-eaf13131fe5b)(label(\";\"))(mold((out \ + 3db940c0-7cd1-46ff-bd95-848686d62bc2)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 60481f3e-2959-464c-a0a3-b2e1988ea492)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fdfe41dd-9c7e-4a19-9343-954c3b393735)(label(let = \ + baf9fff8-bdad-4120-a57d-609684b3c00e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ced662d0-40b1-49d2-aeed-14e5b19b9bf8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0a76ce8d-b223-4a5e-87a3-bdc07041bd10)(content(Whitespace\" \ + e86f6dfc-95e6-431d-b7b4-f3951b691796)(content(Whitespace\" \ \"))))(Tile((id \ - 21d61a6e-f2e2-4007-8b22-081f7996a8b3)(label(f))(mold((out \ + 4d1baebc-09a9-4c66-ae7e-cf888cae6a86)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f2ee63a3-94f0-4861-8682-e05bdea64975)(label(:))(mold((out \ + 00ec5f54-d6ac-4b1d-b7be-6a00dc7579ba)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7e018fae-fc46-436a-a7c2-9c69a1714586)(content(Whitespace\" \ + f87ea09c-c66e-4ff8-a440-2c5c551ab2cd)(content(Whitespace\" \ \"))))(Tile((id \ - f26115c0-a57c-433e-95c0-983c94e220a6)(label(Bool))(mold((out \ + e74f7346-d1cf-4e40-b23a-4989d0fa3be4)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 64c51762-8008-4e55-bfc2-9cfde5c80559)(content(Whitespace\" \ + 6b8e383d-3bd1-478d-85f4-89ab10769816)(content(Whitespace\" \ \"))))(Tile((id \ - d6f79c9b-7c9b-4bbe-a160-eaaf8a3ad6d7)(label(->))(mold((out \ + 045eb834-c416-4178-9684-65571b11ca00)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - a0667515-d8dd-4e72-960b-48ef0ff056c4)(shape \ + d3aa535f-e3f5-4110-a904-fbc7b46296e4)(shape \ Convex)))(Secondary((id \ - 0f802e30-af30-4eb1-9614-afa9e50dc48d)(content(Whitespace\" \ + 19011eab-4218-454d-8de9-0801934b624e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 720ea606-dd60-4a44-8355-85dd8d5c9eea)(content(Whitespace\" \ \"))))(Secondary((id \ - 853517a7-56a3-4ec7-8d52-37b8bc6a9c04)(content(Whitespace\" \ + b203fe9c-9bdc-457b-b73b-c2e99bf1679f)(content(Whitespace\" \ \"))))(Secondary((id \ - 718e1e1c-cf19-4e36-8f26-cc3583643e14)(content(Whitespace\" \ + 70d499ed-5ea8-4bf6-85a1-8f2117bba5c9)(content(Whitespace\" \ \"))))(Secondary((id \ - 7f374afe-d137-4715-9eb5-e322f0e0dba8)(content(Whitespace\" \ + a6a0f9b8-fc54-4438-bd31-e4e977eb675f)(content(Whitespace\" \ \")))))((Secondary((id \ - 19c9fb30-4c93-4077-a3e3-b35e23f7a7f8)(content(Whitespace\" \ + 158e221a-8e5d-4652-b0d9-a558c0313529)(content(Whitespace\" \ \"))))(Tile((id \ - 46f92a3f-da8d-4285-8ead-9ec1ce0abddf)(label(fun \ + 69a3edf9-3dec-4fa6-8ed2-f216f28fe76f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 54b051d7-e80b-463a-b74d-6b40de79bad2)(content(Whitespace\" \ + 9f7734ab-daaf-4851-b627-af2c546d8b21)(content(Whitespace\" \ \"))))(Tile((id \ - a67f2834-c727-4bc9-bb32-526102ff03f9)(label(b))(mold((out \ + 78cca49d-e3e1-465a-a32c-6bde6671f2bc)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3071c88f-37ab-4ab4-84ec-13714c72f4e6)(label(:))(mold((out \ + e6b95480-2132-4201-99f9-26bdc8b5df1c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a2c4ca2-c97c-4e19-ab90-d5f66cfa20f7)(content(Whitespace\" \ + 91eda95c-2d9a-4bba-a2af-1d20bea73d9c)(content(Whitespace\" \ \"))))(Tile((id \ - 91d340ce-225e-4152-93b3-40d3053254fe)(label(Bool))(mold((out \ + d6c45d32-a1d2-43b4-8262-6124417d5c86)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1efec563-79c5-4e32-9451-84575119377f)(content(Whitespace\" \ + 278e4a58-bc7a-4387-8b49-88616fb2a8cd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6795be87-8534-475c-be6f-7c96d853ba01)(content(Whitespace\" \ + ffeace91-a82e-4ef5-85d7-d28c4d9499a1)(content(Whitespace\" \ \"))))(Tile((id \ - c1c5fdc8-219c-4dd9-a21e-3112db64b8e8)(label(b))(mold((out \ + 2b517f29-a6d8-47bd-958c-d4c3e959b530)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c51c32c3-1905-4fce-b636-f2a4f3d0001b)(content(Whitespace\" \ + 4b2ca458-d052-49fb-b890-328ff5d99d06)(content(Whitespace\" \ \"))))(Tile((id \ - 222fcd2e-9f60-4c4b-9a38-271b602bc23e)(label(&&))(mold((out \ + 7ebdd869-99b1-468d-b006-04a41af147e0)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c0ec4ef1-124b-4613-908f-79c33988ee0d)(content(Whitespace\" \ + 97826df9-82b5-4fcd-bc69-9682b769f0d4)(content(Whitespace\" \ \"))))(Tile((id \ - 341b3887-efbe-4f8b-8fd0-a9471ad9b18d)(label(true))(mold((out \ + b096fcee-6c3b-4031-87c3-d4158787990a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 67d44ffa-74b8-4080-a29c-1ece364b9a73)(content(Whitespace\" \ + 5ffc38f4-6c30-427c-9fdd-e1f64dee4636)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 28985c6c-b2b9-489e-b6c3-6e139b178c18)(content(Whitespace\" \ + b77b8f48-fd64-4069-9766-8e7031786091)(content(Whitespace\" \ \"))))(Tile((id \ - a0b6f2bd-251a-4cf5-ba7d-654a0bba207e)(label(f))(mold((out \ + 38845d37-0f71-44e6-8043-593ccd979192)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6e041455-834d-496e-9296-47d80f312bc8)(label(\"(\"\")\"))(mold((out \ + 43c772b1-012c-48bb-bf01-5ed1981c10b2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c431601b-29c9-4ce8-ad01-f08ef2b718ec)(label(true))(mold((out \ + 33e62425-ff7c-405a-bd40-4717d7a0e031)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d8327bcc-4852-458f-a143-5d6fd9635754)(content(Whitespace\" \ + 2c64ed12-5710-4d17-8537-84505afa0b91)(content(Whitespace\" \ \"))))(Tile((id \ - 45c9bb25-dd64-46ca-a51f-290721f6c6ab)(label(&&))(mold((out \ + 3656e38c-ed7f-4d9f-8137-adfda414a209)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8607f6f3-caf4-42f7-9c23-542a4ac5409a)(content(Whitespace\" \ + 64098c03-acc7-4d0b-95d8-38cb950e4ebe)(content(Whitespace\" \ \"))))(Tile((id \ - fbf85a57-7107-4f76-be20-ec4fd4de8414)(label(true))(mold((out \ + d84f6294-f7b6-4da2-8280-17ff445f9c75)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cdd7d4ce-2b97-4130-bb78-f602befeb688)(label(\";\"))(mold((out \ + eccbf863-8826-4c0f-8e23-8eafad3eb9ef)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c96646f1-a366-498d-9cc7-d4a041ded860)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fd66b6c6-6c7e-4745-9a7a-4fe6a4e10b23)(label(let = \ + 7aa73962-e3ff-4888-9f19-14fc18bce03c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4c006c03-ca73-450e-a26c-2ede30e78b09)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fa28cf4f-ce9a-4cce-b193-a5e948d90b18)(content(Whitespace\" \ + 68b2c91f-1e98-45b5-8a01-6003cc94ea63)(content(Whitespace\" \ \"))))(Tile((id \ - 7fd69968-da34-4a32-b6d3-49d068124e96)(label(f))(mold((out \ + 8a8e5529-a4b4-4ddb-8dad-baa79ba51373)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6f14f8d2-964f-4ec8-81d1-2f636752a3f0)(label(:))(mold((out \ + 573bd504-f9dd-4047-ad50-be503d5e7c25)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 75a251da-4dfb-4d18-831e-6592543a5fd2)(content(Whitespace\" \ + 9f430850-54e1-45a5-a470-4332577ef26b)(content(Whitespace\" \ \"))))(Tile((id \ - 5c548775-922f-44c5-9dd4-a482f96397fd)(label(Bool))(mold((out \ + a4cd0a4e-4577-4a05-abf8-fedf9edb7088)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8f09ef73-27e1-4e23-8fbb-859ae92168d4)(content(Whitespace\" \ + 3ab16d71-565d-46f1-8197-42c05146cb1f)(content(Whitespace\" \ \"))))(Tile((id \ - f71ccf61-d921-4144-bc50-cf734fff1e07)(label(->))(mold((out \ + fddcb399-67ef-4249-bb64-c99b69dfdb23)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a62140e6-3119-41f9-839e-4017096fceb8)(content(Whitespace\" \ + a873c136-4dc5-4a55-b1c3-8872c313112c)(content(Whitespace\" \ \"))))(Tile((id \ - da9079ab-625e-4e66-813c-fb1d1028e8c1)(label(Bool))(mold((out \ + ff72d139-df9c-4720-9012-189e536af3ce)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 54af84a2-4d74-4069-93d8-9c4149de83d6)(content(Whitespace\" \ + ddfe4334-19de-461f-9167-3fc7e4fadafa)(content(Whitespace\" \ \")))))((Secondary((id \ - 26655250-b104-4b6b-9a6b-ee34ff40545c)(content(Whitespace\" \ + 7d8aaba0-019a-4c4a-8e20-0016858bbcfd)(content(Whitespace\" \ \"))))(Tile((id \ - b892c8a0-7935-42d3-b9ae-d85529770a4e)(label(fun \ + 4e248130-8d4d-4329-9477-f96837affdce)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 89aa3597-97ba-49d0-98fc-a7d278267ff2)(content(Whitespace\" \ + 735a66f3-35f5-4bb2-978e-21076b7fd756)(content(Whitespace\" \ \"))))(Tile((id \ - d35cac24-6deb-4934-8a66-587be5365e3a)(label(b))(mold((out \ + b5d9e601-6097-404c-8bd5-7a9b6e9d9c96)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a0b2eec8-c65c-45d8-b12d-0e87bf5dac80)(content(Whitespace\" \ + 4f3037e2-cc04-41d1-aa98-ac188b8d017a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 011898c2-8326-40ed-a1ea-fc3331fa1656)(content(Whitespace\" \ + 1802abd3-3eb2-44dd-bb5d-06159679e6f4)(content(Whitespace\" \ \"))))(Tile((id \ - d7cff5ed-2a65-49a8-8fed-f9f9e6967e68)(label(b))(mold((out \ + 68e24d5b-2d4a-4b13-8334-dcb39571d31c)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e86956f8-d506-4875-b563-86dcd60f66d2)(content(Whitespace\" \ + 53156d78-5fd0-43dc-8d39-6181fd47534c)(content(Whitespace\" \ \"))))(Tile((id \ - de8a8713-4bae-4f21-961f-d88ada28f203)(label(&&))(mold((out \ + 3800df1b-0894-4471-b836-50cd9dab55c9)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4e305125-c826-4892-8e3b-fbb9b24c8e00)(content(Whitespace\" \ + e2bcd9bc-9d51-4733-977b-7c6e62598182)(content(Whitespace\" \ \"))))(Tile((id \ - 5b25630e-abfe-4d96-ba06-39e199e57fac)(label(true))(mold((out \ + af35b589-3432-4b72-8744-7b95856459bf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d2395d10-9d6d-4fb6-949d-4ae89c509252)(content(Whitespace\" \ + b5061643-74aa-4e45-b68f-0e6a3d467b70)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 98e45812-06c9-4163-9670-c9cd14baac1d)(content(Whitespace\" \ + c906fce4-50a9-401f-862e-35769927bc45)(content(Whitespace\" \ \"))))(Tile((id \ - 6d9d336c-0377-4a14-9aad-ef4bc86e5ac2)(label(f))(mold((out \ + ee3606f9-1e03-4db2-81c5-fa37d8e61055)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 744de733-f6e0-4563-8883-655a73995137)(label(\"(\"\")\"))(mold((out \ + 6c140faf-75e0-47bb-a0d9-832ebb0b0ed4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c5c37a9b-cb08-44f8-a7ef-24c637f85e5c)(label(true))(mold((out \ + 4573a35f-6552-4634-b8ed-99f99f303841)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e7bcdffe-61e6-4e61-b110-77a836c8230c)(content(Whitespace\" \ + 03a86cef-8652-426d-8579-cbb328b035b0)(content(Whitespace\" \ \"))))(Tile((id \ - 6a0b316b-303e-4a32-a723-8cad2b466d3e)(label(&&))(mold((out \ + 50b5890d-bb23-4712-8bfd-94ee4e503054)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9ba3bf2f-1b7b-4902-a7bc-3cb29958723a)(content(Whitespace\" \ + 52b64aa9-0d10-467e-bcfa-09aca544bfd1)(content(Whitespace\" \ \"))))(Tile((id \ - 46b4f5d4-91d6-4f56-a528-e5854c889117)(label(true))(mold((out \ + b062a20e-a072-4822-97da-b13ec379c12c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7216c9c3-cf9d-4cd9-be12-f71c1089b3b2)(label(\";\"))(mold((out \ + 5dd2d4ab-a2b7-482d-8140-78790ff8c623)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 87da09f6-80db-4e77-9f49-a621bfe605bb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f4095cc-a71d-439d-9f31-a9ae0986c524)(label(let = \ + be1ba7de-ec19-4672-8cb3-0e7482ee9237)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 226f8cc3-31fa-48a6-bc2a-9fe5bc8b8046)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5968ffce-0fd2-4b90-bbcb-d6757fb6bce2)(content(Whitespace\" \ + 3bd8505c-e38c-473a-878a-cb3fe94e0e73)(content(Whitespace\" \ \"))))(Tile((id \ - fb5f7fd6-46a5-4df2-8abe-2e5922e75ff7)(label(f))(mold((out \ + a6dd8947-0a0b-4406-9c7e-c0c19fad54de)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f075af34-6bf2-4e2f-aaae-9cf3a57f3bb3)(label(:))(mold((out \ + a93a0099-ec2a-431c-8a95-0856e25cd900)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1289f0f9-9fa3-4000-9920-d56965773608)(content(Whitespace\" \ + 6ee451cd-b02d-48c7-814c-911907a0bdef)(content(Whitespace\" \ \"))))(Tile((id \ - 0efc091c-4b53-4848-b4af-ba6b2932da3c)(label(Bool))(mold((out \ + 93a0edcb-f9bc-48d4-9bae-a21ecde6850e)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - eac43b9c-d4e0-4ad0-a2e5-676b8ae64198)(content(Whitespace\" \ + ae727d65-13c8-4bd5-bae9-53478a94569a)(content(Whitespace\" \ \"))))(Tile((id \ - 95240bbe-9588-4382-bbf2-17de9ceec5a1)(label(->))(mold((out \ + 6b4e022e-1df9-4a73-8a72-8221ad245945)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 59c6d5f6-f04c-4241-bbb8-dff6567b63cd)(content(Whitespace\" \ + a8a82dab-6ed5-451a-9407-e30e8264cd0c)(content(Whitespace\" \ \"))))(Tile((id \ - 6b1133f3-7163-4cec-8db6-62630c735aa8)(label(Bool))(mold((out \ + b078e37a-51f2-4658-b847-90f3babecbfa)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 87e0e8a8-3eb0-4f9f-abc0-68b932fdb065)(content(Whitespace\" \ + b845173a-9104-438f-a364-5dc28a8e781f)(content(Whitespace\" \ \")))))((Secondary((id \ - 09b6809a-fff8-47a8-9914-217fba4d9a0e)(content(Whitespace\" \ + 9b0c486a-3f26-4bdb-8959-76195ebce31e)(content(Whitespace\" \ \"))))(Tile((id \ - b6f2a206-130b-476d-8aac-3cce8eb97149)(label(fun \ + b2cb6bf5-c0ce-4976-bd94-307ef4475ec4)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 92d62283-1f76-4fc7-8f03-9c29bd93fa0d)(content(Whitespace\" \ + 9eb19b00-2c5d-4fd9-bf10-f824f313a3bd)(content(Whitespace\" \ \"))))(Tile((id \ - da9b4f2b-3576-4741-a893-d96592a712fb)(label(b))(mold((out \ + fe3faddd-142f-44a4-a59a-be380e47159e)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5b89009f-c1db-4659-9ceb-820ca43848b2)(label(:))(mold((out \ + a05299d1-ee0e-4551-b400-02f082bfbdcc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - a072455d-2263-4e11-9261-45f2812fcaab)(shape \ + 17a574f7-a714-437e-adbd-9e33a68def0e)(shape \ Convex)))(Secondary((id \ - 07477c75-3d9d-4cf2-9a83-d559dc990338)(content(Whitespace\" \ + cccbe27b-53e4-4bff-8cc9-bfb4fa2e0e01)(content(Whitespace\" \ \"))))(Secondary((id \ - b8ebf16d-0eec-4680-ae29-a4af45ff4304)(content(Whitespace\" \ + b6e40f4e-c8fb-4f75-8cf2-07cff0cdaf76)(content(Whitespace\" \ \"))))(Secondary((id \ - 0bd4fd48-0f4d-4b54-9d42-e43f303916df)(content(Whitespace\" \ + e2ae5512-6800-4e98-a93a-3eb56f6c2465)(content(Whitespace\" \ \"))))(Secondary((id \ - cd00641b-c26e-4a77-a78c-773244c23324)(content(Whitespace\" \ + ad64908c-bf0f-44a2-afd0-169ff9da9176)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6498c90e-11d9-41ea-9caf-282c151d43ec)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b304dce3-027d-4740-b014-3aadcf732962)(content(Whitespace\" \ + e640fd12-11c1-40ab-92bb-051cdf2a111e)(content(Whitespace\" \ \"))))(Tile((id \ - 662a94b9-46e3-4786-a208-0b22db654526)(label(b))(mold((out \ + 679f722c-2a77-463f-9c38-899e6fc629bf)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a3a15271-f413-4f26-8b4e-a3451319e3e8)(content(Whitespace\" \ + c768c89f-854d-4aa4-bbce-761603c09244)(content(Whitespace\" \ \"))))(Tile((id \ - f5fcc2c1-6422-4d5b-a5a3-007a1627044e)(label(&&))(mold((out \ + f65d928b-18fe-473a-946c-713cc86a9450)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c6230b68-81a1-43bc-96c9-9c21eafc6230)(content(Whitespace\" \ + eeac3afa-3ab2-45d2-9973-7c54a9c0ec77)(content(Whitespace\" \ \"))))(Tile((id \ - bc58ab39-2d3b-4438-8ae0-a6ddc93391d4)(label(true))(mold((out \ + 0156c574-0368-43ec-b561-1d43d1033fda)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 331d92e6-fb7f-4db6-b17c-869e425a0cab)(content(Whitespace\" \ + 7d723fb5-cf4a-4ea1-9ea4-1e3e3aad126b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a0d63e76-05bc-4660-b154-364702e807fe)(content(Whitespace\" \ + eb3fc3da-aea8-4ec2-bccd-92f207dc1f27)(content(Whitespace\" \ \"))))(Tile((id \ - d3dee762-c950-47d5-a019-977f86e32398)(label(f))(mold((out \ + 7cca7ddc-350b-4593-b125-36242c0097da)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5db5eee2-3883-421f-a709-d25227563cad)(label(\"(\"\")\"))(mold((out \ + 7f226cc5-4f76-4884-8bb9-0b3062c53ab5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 83e15250-2c6b-4418-a137-9c4c6e6b14e4)(label(true))(mold((out \ + a961c178-ab39-4885-b37a-001fc0bc9af4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 9e0632cf-1ae3-4376-ab57-491f18d2b968)(content(Whitespace\" \ + 27b63192-bf57-417c-bc0d-381ad9744908)(content(Whitespace\" \ \"))))(Tile((id \ - c9d784ac-7302-4c2b-8191-bd5be8c83cf6)(label(&&))(mold((out \ + e1548cbb-0fa4-4c62-8841-79d60121366e)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f569f511-1442-4f32-8122-d2828f4969d6)(content(Whitespace\" \ + 8da9116e-ac40-44a6-9cbc-db7f25cdeba1)(content(Whitespace\" \ \"))))(Tile((id \ - 75bad9b4-36e5-4730-aec5-b3a3d4462063)(label(true))(mold((out \ + a73f5960-d7a0-42f3-9f87-b7ab23ee225e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6ab03724-3bdd-4b33-b088-a6f4004cc33d)(label(\";\"))(mold((out \ + 1ec6b086-98b7-4bcc-acff-3e2ee3747026)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3b92ba6b-19a1-4b0c-a3c7-806fe36fc713)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f97c2119-7208-4846-8d49-f50df66882f5)(label(let = \ + 21363ebd-d485-44f1-ab7e-1007beaffef1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 35ec3a37-980a-4deb-9e53-47f783d84412)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 915eb545-56d2-4b3b-8a42-e8a62b9d5ced)(content(Whitespace\" \ + 33a3e151-e2ca-4555-a38a-43081ecfe350)(content(Whitespace\" \ \"))))(Tile((id \ - edaa9a3c-8382-480b-aa95-7e1df21d4f17)(label(f))(mold((out \ + 2e706c72-fb01-4054-9822-af7e5d243694)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 40844ddf-3718-4c9c-9418-357180d9307a)(label(:))(mold((out \ + 249ac389-683d-4aed-ae34-7598215b4222)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 414bd942-6026-49f8-a13e-0da73f9c46cd)(content(Whitespace\" \ + fe5dec15-fb65-419b-a94f-d832bf5a3ff6)(content(Whitespace\" \ \"))))(Tile((id \ - f4f46c53-5198-4362-b54c-9b952a0f6102)(label(Bool))(mold((out \ + a507c20b-0f41-43d4-b687-812cc402e307)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a2294884-214f-4101-a29b-4079aa26a253)(content(Whitespace\" \ + a7e19047-fe26-4af9-bdaf-01484ea9fae4)(content(Whitespace\" \ \"))))(Tile((id \ - cb66f8cd-97ed-4f63-b3e9-840155744430)(label(->))(mold((out \ + 6b189eb2-a05c-42d2-a1e2-3b8ecc1ebb0d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 69fb31c9-316a-4ad2-802f-0ea2e330986a)(content(Whitespace\" \ + 8fb1a892-921e-47d4-9327-de260ebd51b4)(content(Whitespace\" \ \"))))(Tile((id \ - 0b545548-9127-469b-8174-2c9e0abf1a39)(label(Bool))(mold((out \ + 2557e096-fe29-4849-969c-a1a953831b1c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 43b1c848-46e5-49a9-89da-dd2ddbd8df6e)(content(Whitespace\" \ + 4ebec74c-fb13-4758-a8bf-c4e34b031434)(content(Whitespace\" \ \")))))((Secondary((id \ - 34936e38-7ac5-4bb5-8456-223fe2c52ae3)(content(Whitespace\" \ + fee94c78-9e92-4ba3-aa5f-822a0a287c22)(content(Whitespace\" \ \"))))(Tile((id \ - df2e6ff1-1b0d-44b5-9576-0d25c0a25635)(label(fun \ + 4a2689de-836c-4af7-bf4a-38276bd27dfe)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 18d08929-f4ad-451f-8b89-6e62b74d5e06)(content(Whitespace\" \ + 9c0835cf-0fd3-40d4-a82a-db25807291c5)(content(Whitespace\" \ \"))))(Tile((id \ - 907b484b-9b0e-4a13-b173-f8d0530a539c)(label(b))(mold((out \ + 10130787-6c13-47ce-9cc8-8fcd90fac2fe)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 49a63e2f-507e-4b0c-814d-49805544d22e)(label(:))(mold((out \ + 673f4447-fc1c-4ee6-ad30-176759e4fc84)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0ab5f8d7-a7e9-4f59-a6f5-b80a304c6508)(content(Whitespace\" \ + 3723e8ba-29d8-4751-a6bd-57c6014ebed0)(content(Whitespace\" \ \"))))(Tile((id \ - dc39c8bf-cf17-4771-a6d5-5eacebedf535)(label(Bool))(mold((out \ + ad007c76-3fb0-4aa4-9d46-7092c82c2992)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8590ab2a-dc65-49d3-9af6-8b1d116c58a4)(content(Whitespace\" \ + 867cf76d-01c2-4ea6-b03d-fd57d631c6a2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 61640a3a-e81a-4173-b858-85ac0776eeec)(content(Whitespace\" \ + 6a6bb12f-d4e7-4071-a134-a6022e4dbaa2)(content(Whitespace\" \ \"))))(Tile((id \ - 6260560e-1501-43f8-9553-ff363e51c692)(label(b))(mold((out \ + e259d880-65b2-4f43-8335-cb4cb8a09790)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e4bf9a24-8b79-4acc-ace1-4200caf896a1)(content(Whitespace\" \ + 58b08f75-9b15-440f-b2ac-162c1bb6fad9)(content(Whitespace\" \ \"))))(Tile((id \ - 1501e7ab-dca6-4e78-b17e-f58900254f22)(label(&&))(mold((out \ + 28a0c1c6-cf38-4bc7-8d7d-acadf6dae3d1)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 751f7b84-d34e-4034-923b-fa699462b2a5)(content(Whitespace\" \ + 733e13fe-1a99-4140-8d15-708b1a3d3782)(content(Whitespace\" \ \"))))(Tile((id \ - 5aee0834-bdaf-4f66-9c3a-3a91755163aa)(label(true))(mold((out \ + fe0f62c7-19d7-4964-be42-4a45da1dd3b6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 612f5d6f-575d-4a44-be8e-4ced1d7feea3)(content(Whitespace\" \ + e0e2e3fe-717e-46f1-80d8-bf641a00c9f5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a82539d0-09cf-4dc6-a794-27e8212c37d9)(content(Whitespace\" \ + 11d58c19-3c5f-4a3b-89de-31cea5ac4dc2)(content(Whitespace\" \ \"))))(Tile((id \ - 27145e94-f582-4553-a437-3e622cb641d2)(label(f))(mold((out \ + 29f2de60-7e6d-460f-9516-72bfcceb8230)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 949b0157-0f61-4ea8-b17f-37444778ee39)(label(\"(\"\")\"))(mold((out \ + 186dcf99-1acf-4b9f-bceb-4e1e791b6bcc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b0ed89f5-0e34-40de-9578-ec25325c358d)(label(true))(mold((out \ + d79997d8-d848-43dd-860c-601908513e92)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8e21cefd-2576-41ee-b6d2-38f76eeab831)(content(Whitespace\" \ + 70281d27-0079-4001-b1a3-699b60c84b2a)(content(Whitespace\" \ \"))))(Tile((id \ - 51bd9248-0b18-41e5-8a62-ad8c58f69d22)(label(&&))(mold((out \ + 45ca8fc5-d408-4b13-afa7-083f98723c79)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c43af710-5079-4be1-9077-a1b9cb129c6f)(content(Whitespace\" \ + 4070c4ad-2776-477f-823f-085f4384bed5)(content(Whitespace\" \ \"))))(Tile((id \ - 6f098917-8017-4bff-b096-4afdeea315ae)(label(true))(mold((out \ + de179e15-928a-4fb5-a7e0-6aaabd17e3c9)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4be7b6d3-2fe6-4e2c-89a3-baa825a564f1)(label(\";\"))(mold((out \ + a0b183bd-484a-4a7f-9ab8-e8c7c2bf2a13)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5eb5b0c2-0592-4c35-9251-768c9cb553a0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 566b41f3-649c-4d91-8abf-23dbb935cba4)(label(let = \ + 95b8cb50-ee78-4de8-803f-a219c8e99e24)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1665684e-79cf-41ac-bb87-3b785fd83ba8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9ae40712-0636-48df-a4bc-b91ddb9da9c2)(content(Whitespace\" \ + 420f3e72-db0b-458b-a278-2eb3141fe707)(content(Whitespace\" \ \"))))(Tile((id \ - 3daee0f3-74a3-450e-a21a-47492af9b839)(label(f))(mold((out \ + b0dccd5c-cae5-4ec6-bf11-39f8bf6de1b7)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f412a385-a544-4744-834e-1a31d1d53084)(label(:))(mold((out \ + cd4a97d0-ea15-4063-a59b-cdd00067da43)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d1a82b37-cff5-42d7-97c9-0abe944a41bb)(content(Whitespace\" \ + 25a37cea-d563-425d-9376-a25f60abf27d)(content(Whitespace\" \ \"))))(Secondary((id \ - ec945ea6-0f00-4865-9397-defa21dfd606)(content(Whitespace\" \ - \"))))(Grout((id 790ccb5c-16aa-48b0-b9dc-87bd35339514)(shape \ + 6d39e6e7-ac05-4bab-8ef2-c3e1f260aef6)(content(Whitespace\" \ + \"))))(Grout((id 066892cc-dfc1-45bd-8f37-fed4afed1097)(shape \ Convex)))(Tile((id \ - b62a5f8b-4c6e-4509-be11-2e2224cbb3d2)(label(->))(mold((out \ + 78d7d760-6c93-4534-a1d9-f95c02de8c87)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2730f7fe-fff4-4ddf-b69f-6e1cc9614f8e)(content(Whitespace\" \ + 5f1d6a94-de73-4914-a521-cb718d275a54)(content(Whitespace\" \ \"))))(Tile((id \ - 4cf61217-e831-4313-8065-63531bc1a87f)(label(Bool))(mold((out \ + 19323054-da63-4b8a-a870-79856e7ce363)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 1ba85a19-4516-4bb9-96e5-3ff2f18262ad)(content(Whitespace\" \ + d1f08ac3-eef1-4f0c-91db-e92293e0b2c2)(content(Whitespace\" \ \")))))((Secondary((id \ - 8849ad08-e83c-48de-af24-8e965759f356)(content(Whitespace\" \ + a72e6c11-44b8-4de8-bca7-120ab8e768dc)(content(Whitespace\" \ \"))))(Tile((id \ - 6822d5e1-2032-4e09-9777-9659fee0cc30)(label(fun \ + dc18a635-3244-4441-99a6-b65d9e7cc313)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 80044288-1994-4620-81e7-5af22840acc3)(content(Whitespace\" \ + 1bdba6fb-deda-4959-8039-f84359c1044a)(content(Whitespace\" \ \"))))(Tile((id \ - 9aaacd74-e7bd-4201-96aa-60f4eeca3954)(label(b))(mold((out \ + 53954186-d29c-4f04-8129-fd4aa6ea680f)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 325c4c46-4d8b-4080-aeb4-f68f33c86c7f)(content(Whitespace\" \ + 8e88416c-1019-41ea-8087-4d974d572d88)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3a0e1d15-e193-49c6-bc97-5ae655b2e4ea)(content(Whitespace\" \ + 0ec4549b-5c98-45be-8ba7-c6eb7393cf92)(content(Whitespace\" \ \"))))(Tile((id \ - f71c28bd-ac2e-4639-be9b-543c68a416ae)(label(b))(mold((out \ + adad0f21-5597-4d95-ba63-a2bf964a490d)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 50f7f340-211c-4b1d-b020-ea496a80584b)(content(Whitespace\" \ + 796ba787-372f-480a-a9cf-d74db2e77b51)(content(Whitespace\" \ \"))))(Tile((id \ - fd4c79eb-68d6-4364-8310-088461e64c88)(label(&&))(mold((out \ + 95f43eb4-a91e-4e1d-8b99-7ad69b68adb2)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 69b1a43f-e268-4d87-ba1d-47c2168823fb)(content(Whitespace\" \ + a91d6a13-8021-45b5-8c2b-8cc8c6981cf0)(content(Whitespace\" \ \"))))(Tile((id \ - 923b329e-606b-40fa-8d31-a55af4403862)(label(true))(mold((out \ + 518e5e46-b13b-4f09-91f3-31fa566c58b0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 97a51e4f-dd34-4c87-a908-92cd52f46cb1)(content(Whitespace\" \ + 15b907b3-5c2f-46a0-b06b-ed21778fd31c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 31d458c7-cb6d-4e3c-b1c3-79602fe2a906)(content(Whitespace\" \ + 792c8302-9378-43b9-b261-57261ee99901)(content(Whitespace\" \ \"))))(Tile((id \ - 724bfe8e-5f4e-4288-bf48-0a84a27769c1)(label(f))(mold((out \ + 155c7c10-94f6-4c2f-8eef-004e14f86a92)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cd72e344-a153-495c-a147-3d64248bea4e)(label(\"(\"\")\"))(mold((out \ + 89e0c4f8-e24f-446c-a6a9-0839fc6faeb2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9d1b9872-d062-41ae-a952-28fbad475657)(label(true))(mold((out \ + bb5b3555-df6b-4b83-9220-073d7b532a98)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 7cd991f7-f4f6-46dd-aaf7-ab88e1f05396)(content(Whitespace\" \ + b3e23749-62b7-4a0d-98a5-4eb5d91e3473)(content(Whitespace\" \ \"))))(Tile((id \ - d13c7d7f-72e4-4985-992e-a05f763f9ef8)(label(&&))(mold((out \ + 91d1521b-18b1-4fc9-823e-71811291de24)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 27939642-ac52-4920-a5ad-2ad875dd5f08)(content(Whitespace\" \ + be75c19e-b32a-4505-927c-827587312b06)(content(Whitespace\" \ \"))))(Tile((id \ - a327b9f1-3f84-4aa4-b6c2-11c704041366)(label(true))(mold((out \ + 38c33e85-50e7-44b7-9c47-4b338295a021)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c9beb2a6-91e9-4a92-99a9-18df9dda6473)(label(\";\"))(mold((out \ + 21e4563f-b90c-4e2d-9c5e-4f113b210207)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c1d883de-d1fe-459c-b2f2-476c7699507f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4ac2a769-b258-4e87-9e09-05b9e1df89f6)(label(let = \ + 4205826b-a066-481f-9870-987bd9896244)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cee321fa-2443-4038-a148-61a759151c2b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f2ccc8d8-8069-4405-91e1-7c808fdf056e)(content(Whitespace\" \ + a8a4d5ee-d14f-4435-bdc8-c03d5c572e08)(content(Whitespace\" \ \"))))(Tile((id \ - 1429edc3-3c7f-435c-8dfb-c21788c4b15e)(label(f))(mold((out \ + 69615ff1-dcc7-4b9f-940a-a00c8b8d24a9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5a5742bb-53a9-4370-8987-5283cbd7217b)(label(:))(mold((out \ + d6cd7db1-8308-4874-8ff1-d6907319e7c4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2d14b488-6913-4e43-8feb-79fbcb7115d8)(content(Whitespace\" \ + 431d66e3-2e57-4a64-9024-31dedc02084e)(content(Whitespace\" \ \"))))(Secondary((id \ - c1349708-4d9d-4047-8224-101d11926f61)(content(Whitespace\" \ - \"))))(Grout((id 5a878575-c654-4ad4-a576-e42d4e3fd974)(shape \ + e2105f87-fa3d-44cf-b18a-cc9eafd83d00)(content(Whitespace\" \ + \"))))(Grout((id 64a9f0b2-3518-4d6a-9c82-d2fe9551e04c)(shape \ Convex)))(Tile((id \ - 406cd59d-06d0-49a7-8754-5a941c2b5896)(label(->))(mold((out \ + b964ec13-f861-4525-bca0-51a2fc701d3c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 06ead568-006d-4309-9e3a-96a34f0fbb9e)(content(Whitespace\" \ + 3cf0d400-0787-4327-b46a-7180d93d129c)(content(Whitespace\" \ \"))))(Tile((id \ - 6d420a9a-d0a6-471d-874a-e6fe0c0855ab)(label(Bool))(mold((out \ + dcddfbdc-0422-4720-9b2e-595f1dc069c3)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a9a0d3c0-bd16-483c-b0b8-f3cffc17f087)(content(Whitespace\" \ + fd270d79-b6e4-465e-8988-9e3d20e3ef54)(content(Whitespace\" \ \")))))((Secondary((id \ - 8cd4ff5c-854f-4a98-af1a-bd1d4cfea94a)(content(Whitespace\" \ + 944ca76d-9d70-49f5-8d99-d69df0e815a1)(content(Whitespace\" \ \"))))(Tile((id \ - b04c29ea-2497-4ba0-939b-e26dbaa666cc)(label(fun \ + 924e711f-10f5-4da2-972e-54d6cfcf01f4)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 82d15910-09ac-43ad-ab43-4070ca66c8d2)(content(Whitespace\" \ + 2b02f6d4-2d31-4e60-8cec-6b903fdadae0)(content(Whitespace\" \ \"))))(Tile((id \ - c89f82a8-8e1b-47b9-b592-ebfb6f942030)(label(b))(mold((out \ + 245fb049-2e05-42ec-8fb2-fa3553a1d525)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ddcd6a7c-2dea-4859-b3ee-eb137e96e07d)(label(:))(mold((out \ + 9a3fccf7-bb56-4d6a-aa7a-9fb7b7735be9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 385b39ea-ffa2-4cfa-9bbc-35a31877d4a7)(shape \ + 5c73e3f5-e5d4-4374-82e2-39159cd14b0a)(shape \ Convex)))(Secondary((id \ - 94fe35ff-27ad-4181-933d-84f75336ff9d)(content(Whitespace\" \ + 2ee1898a-0e53-46fd-8c8e-38e670fdd897)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4109f53a-51e6-4eb8-ade2-ec96623ace12)(content(Whitespace\" \ \"))))(Secondary((id \ - 0cc4c82e-a12d-4ba1-bcdd-5a9aa15e7f5b)(content(Whitespace\" \ + 58d0de2b-8d5c-40cf-b5b4-7306a8adb70e)(content(Whitespace\" \ \"))))(Secondary((id \ - 516c2289-18c7-47d2-944e-9c753d8409f2)(content(Whitespace\" \ + df586f74-1e98-4b51-a367-a3ad8866f8b6)(content(Whitespace\" \ \"))))(Secondary((id \ - 6e1f3d98-c081-4fbd-b1fa-ac31d8ee1ae8)(content(Whitespace\" \ + 13451dc7-126c-4dd7-a809-4de4aeb373b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d7c97ebe-2be2-4b7c-822f-125fd87e4fc6)(content(Whitespace\" \ + cf2250a8-a2b1-4f6c-977f-3614e6b8915d)(content(Whitespace\" \ \"))))(Tile((id \ - be6a120a-2170-4cfa-b5b2-3cc159a42ec0)(label(b))(mold((out \ + f2b7fc34-928e-4380-a8fb-fe194132b817)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 743475d0-2ca0-4664-bc76-c5bc84e01ac9)(content(Whitespace\" \ + 6b4935b4-ee35-49ae-9d8a-2387c77194b3)(content(Whitespace\" \ \"))))(Tile((id \ - fb0d2bfd-4212-49b3-b5b9-31ed8e35f9ca)(label(&&))(mold((out \ + 9c3c3a45-ccb5-45d8-9803-e7b86d129d39)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0fc7d1f9-855f-4b1a-b765-80946407b339)(content(Whitespace\" \ + 5ad14a87-f72a-47be-9069-d577535f6c48)(content(Whitespace\" \ \"))))(Tile((id \ - 861f0601-783e-40c2-9f5a-d0b00fb40a7b)(label(true))(mold((out \ + da4c4043-2748-433c-877e-2c4e7cf1edfa)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8399d94a-eca2-42d6-b012-2af15b0ef8d2)(content(Whitespace\" \ + c87b63b3-b6cb-4083-bf97-4e6f0a4c0539)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0dc4b044-07ae-4dfb-a0aa-e37ce2188114)(content(Whitespace\" \ + 6fc08be0-071a-4168-853b-da2f68952816)(content(Whitespace\" \ \"))))(Tile((id \ - 94575a3d-10e2-4a3c-91a3-da5b4151a419)(label(f))(mold((out \ + 77cc4e88-4a49-4b92-a107-535cc80424ee)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 68d75235-d51b-49e8-906d-aee3fe00f11b)(label(\"(\"\")\"))(mold((out \ + 0f6f2ecd-a29a-4435-86fc-b9f6c230de48)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 23569d3d-efbf-429c-9300-58d1c8b04723)(label(true))(mold((out \ + 55c07b75-8a45-4567-b7f8-60d14f7c07ad)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ddd5a005-8b15-4fd9-8148-e7db12860c3c)(content(Whitespace\" \ + 1f7669fa-03fa-4f4f-9902-fb47ddcc8530)(content(Whitespace\" \ \"))))(Tile((id \ - 89188388-880a-4076-8cf7-942633c98365)(label(&&))(mold((out \ + db81a8da-7e91-4fd6-a92d-9a4c09efbaca)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 17656d73-23fd-4259-a5bd-f74dd8dad9b3)(content(Whitespace\" \ + f34cb844-06e0-4ddf-a1aa-598a4e6be420)(content(Whitespace\" \ \"))))(Tile((id \ - fdc096fd-cff5-4934-ba23-ff0ece6580bb)(label(true))(mold((out \ + 361f292f-39ab-40b3-a65a-613cfe384cae)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1b7905d6-dd11-4b7f-8e71-2a496fd23bd2)(label(\";\"))(mold((out \ + b1bf835a-595d-4097-90ba-27001a850978)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ebe5270a-0fee-42b4-b375-45127773794d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9b5574b7-becb-49fe-bdf3-9ac4bc7577c0)(label(let = \ + 3aafdf26-ef40-4068-85d9-f27d95ef2621)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1abb53f5-ad2b-474d-8c52-4fc4f1d7fd6a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 929d9983-f1ff-418d-b87b-16cba3032d8b)(content(Whitespace\" \ + 5188bb35-71ce-4a97-bde0-e7c7af9ecbdf)(content(Whitespace\" \ \"))))(Tile((id \ - dff3f8b6-ee7a-4e17-832b-5efb96ca720e)(label(f))(mold((out \ + 7926d935-cd9d-4e6a-a353-502f45d51642)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dcc1f506-37cf-49de-9abf-542f983d08c8)(label(:))(mold((out \ + 1b599c7f-d95d-41f3-9aba-6836d9c6ee1d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cad1e0d5-a90f-42cd-ba86-5e695bc90b08)(content(Whitespace\" \ + ab673bb9-a1a3-4d8e-b626-0316fc513c69)(content(Whitespace\" \ \"))))(Secondary((id \ - f870d364-994c-49bf-b1ec-9056a961ab2a)(content(Whitespace\" \ - \"))))(Grout((id 1a305147-d99b-4e98-8dff-ed45d3d7080a)(shape \ + e1119c84-f258-4ead-b463-52b649d3db2f)(content(Whitespace\" \ + \"))))(Grout((id fccd8138-9d93-4fc0-9415-115d430d1f7f)(shape \ Convex)))(Tile((id \ - 84c417be-7625-4025-9e98-65130a2a060b)(label(->))(mold((out \ + c0e6e685-585c-4d8e-a441-19570c52bb30)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 759173b3-8467-4129-ad15-f986c67ffc98)(content(Whitespace\" \ + 7714e2f8-31d4-46ad-8346-4a47913e9f37)(content(Whitespace\" \ \"))))(Tile((id \ - f474f8be-f914-4d0d-ba07-99f0e9fe963c)(label(Bool))(mold((out \ + 24f4e851-1ea2-4764-b1be-2b072b9fa21c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 729a763e-9e87-4b83-bd25-51db05e84029)(content(Whitespace\" \ + 6912611d-7e4f-4495-be27-4aafcf1a375a)(content(Whitespace\" \ \")))))((Secondary((id \ - e72a4ac7-ba57-4618-b2af-a1bad7859604)(content(Whitespace\" \ + a266abef-19ec-45d6-aa58-190ed57e63f0)(content(Whitespace\" \ \"))))(Tile((id \ - 94ac4ab7-df2a-4775-bfa1-d8acc45969e3)(label(fun \ + 134292bc-5ecc-47e7-bfc1-f4bcadde17cf)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ffe494c8-3180-43b7-bbca-31081e57ca14)(content(Whitespace\" \ + 0ae4fdef-dacb-41a4-b276-37e0efc71965)(content(Whitespace\" \ \"))))(Tile((id \ - 7702e4ca-2cc5-47d6-bd50-3800bdfd9e33)(label(b))(mold((out \ + da8967f1-c3a1-4f99-ace9-fa4933bfb579)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f1230c65-7bfd-4b6d-8d44-256a29d25285)(label(:))(mold((out \ + 52908ba0-5b6f-4f2f-bb5b-c569a70eefcc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d4c44284-7be1-4acb-b6da-dd5a6a21414b)(content(Whitespace\" \ + 8152e22a-be0c-4854-8dde-0a5e7e301fbe)(content(Whitespace\" \ \"))))(Tile((id \ - 6b344839-bcb3-4f80-b401-2cb96c42764b)(label(Bool))(mold((out \ + 443b5cb9-1ff9-4aa7-a8a4-fc718f3e9df4)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3822229d-37a4-4234-ac28-2f6c42bb30cd)(content(Whitespace\" \ + 54a22bfc-d43f-4b0b-8d64-199bfe9bba14)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 56dd2df8-58db-4311-9882-5d466c5158d5)(content(Whitespace\" \ + 29bbe425-ba82-4208-8c80-2dfa3fd0bee9)(content(Whitespace\" \ \"))))(Tile((id \ - fcb8079b-cdc8-4d64-961b-87bb7dafa018)(label(b))(mold((out \ + 10e14aa2-591d-4ea0-b76a-bd4a343b358b)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3eeb844c-0922-48a8-a4cf-9a11301f0633)(content(Whitespace\" \ + 559b79a7-9c9c-4472-a187-c6f8e83a9439)(content(Whitespace\" \ \"))))(Tile((id \ - 0d5784b1-1900-4b43-8a8a-ee5c15da97f0)(label(&&))(mold((out \ + 68ae9f08-17ce-463c-a0ea-226fb65a9bef)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8467e3e1-ad96-4f5d-9b39-113a9e290b75)(content(Whitespace\" \ + bb2cd4c6-9f2d-4684-b434-9ac9317667c5)(content(Whitespace\" \ \"))))(Tile((id \ - 9078ec68-3d78-4273-861a-6ef9f664178e)(label(true))(mold((out \ + ea6534a4-039e-4eb0-a2d1-252aa4947866)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 260e3a4d-ff90-4aaf-8697-d7e1c4be6ac1)(content(Whitespace\" \ + 0a892a3f-b976-4d5a-b137-7f058b3d6a32)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d3b517dc-2018-4231-a0bd-8f87800b9115)(content(Whitespace\" \ + 2b4c6dfe-10ad-4d83-ac59-c7a2a8bdafaa)(content(Whitespace\" \ \"))))(Tile((id \ - 7f0aae2e-6981-4a40-a2fe-43f14959f272)(label(f))(mold((out \ + 7ccb1bb9-a155-4011-b3f0-a7d0cd616311)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b422931e-e182-4877-9515-6e8c36c4f97d)(label(\"(\"\")\"))(mold((out \ + bcc83914-ac9e-4923-948a-21fcc6500a97)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ab9ba0cf-153a-4834-a4d0-8d4d33021ba6)(label(true))(mold((out \ + 3a7f8d7c-2aa2-46ad-8ec6-da7718293b00)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 183bdb34-9709-4869-b996-4ab3c63e4e1b)(content(Whitespace\" \ + 5ca9edbe-5106-4ab9-b934-a8cd11a1ecdf)(content(Whitespace\" \ \"))))(Tile((id \ - fc741fde-7e09-47b3-8f8a-1fc60eafe060)(label(&&))(mold((out \ + dfb066cd-1459-4f97-a46a-75175abf2f77)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 76f66c98-2c96-4fb6-b697-b536671b2984)(content(Whitespace\" \ + 3c65fd1d-8ca6-43ed-8c38-887ec2e8d496)(content(Whitespace\" \ \"))))(Tile((id \ - a2701254-a4d2-4e7a-86bc-a1b1689cc1bd)(label(true))(mold((out \ + ea0b0f78-226e-4414-a4d0-356d0b84ceab)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f0d96485-31a5-4e0d-a2f7-2eebf8a84e6c)(label(\";\"))(mold((out \ + b5b3f373-ffb6-4353-89bc-934c4c890136)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9fbb94ec-b0a9-43c6-9ce7-690cc5778911)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5ebeff21-1ae9-4b5a-a9dd-dd18e4e55bb9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d0b179ef-b39f-4e0b-a0a3-718233c45530)(label(let = \ + ab179275-22b6-4232-a44e-2c0e3c044bc8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5f555c1f-ff3c-485b-9c47-514ee5f9d4ba)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d045a6aa-410c-410d-a561-73837d026f1d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9c8f1a40-24fb-48f7-9c85-cb98317d5e24)(content(Whitespace\" \ + b50b0fb9-3515-4ef8-bcff-7a56cc3eb9bb)(content(Whitespace\" \ \"))))(Tile((id \ - ff1bbab3-c584-472a-971e-9f5ecd822b8f)(label(f))(mold((out \ + d575360c-3482-4ef8-943a-43b5d3c46435)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b7917bd3-af6f-47af-accf-80292068118d)(content(Whitespace\" \ + 7205c138-01a0-46de-8920-04f964b8dc3a)(content(Whitespace\" \ \")))))((Secondary((id \ - d4fa39c5-5542-40f5-acc0-a07eeb9ffd1e)(content(Whitespace\" \ + f0a76c58-c581-4081-8d6a-36d54d527ab9)(content(Whitespace\" \ \"))))(Tile((id \ - a757e982-ae14-4dff-830e-c9c32b9a82aa)(label(fun \ + 6c3fd393-d782-41fb-8155-e67c3d2c89a3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 475f8f5c-4814-43a6-9804-9291f031b280)(content(Whitespace\" \ + 0930d78b-5667-4113-9cd1-2889969c1a2d)(content(Whitespace\" \ \"))))(Tile((id \ - d612c8dd-f408-40da-8100-0d1819d9edfc)(label(a))(mold((out \ + e7905658-e2e8-4d46-8516-1d1b3c4b41c8)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 892435f8-4d13-4d71-ba19-0e1c7a644a57)(label(,))(mold((out \ + 62000e68-6de4-46ea-9e6e-abf7e23e8be8)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 53fd9f06-4a3d-497d-b55f-d29210c5a37a)(content(Whitespace\" \ + 45c5e6a7-ecef-4ac6-a6fc-353cb942aa66)(content(Whitespace\" \ \"))))(Tile((id \ - 1aa627dc-f3f9-47d8-8070-6243bc098816)(label(b))(mold((out \ + 052c1e66-c99d-437f-9566-8634fac4294b)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 30c18950-0eec-48a3-817b-b287d4c2278b)(content(Whitespace\" \ + 1cf090b9-5d39-496e-b03d-949f527bdf17)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a490d8e5-b043-4bb6-852e-eb6e08ed8a3a)(content(Whitespace\" \ + 93e77fef-ef57-49dd-9553-a7b658579d2b)(content(Whitespace\" \ \"))))(Tile((id \ - bc0b0303-9ad2-4530-bb61-eea0c7a1f8e1)(label(a))(mold((out \ + 2d7073f4-0a18-45c1-9602-a363506b2fe6)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 001da831-7a5d-4a88-b1b5-8b1779043c7c)(content(Whitespace\" \ + 8860c4ae-d9c3-436a-8d6c-a8dc583a3aa0)(content(Whitespace\" \ \"))))(Tile((id \ - 40bcad1a-e2af-4703-a86a-f4131003ce1e)(label(+))(mold((out \ + 48a43dc5-8cd8-430d-85ea-5ec6919ed8b3)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5219c371-d726-42b3-a039-38d756f723d3)(content(Whitespace\" \ + 1c27e3fc-635e-4779-93d3-a0b756b6f7c8)(content(Whitespace\" \ \"))))(Tile((id \ - 332c7fc7-e2a0-46d6-9d5c-83d087297ba2)(label(1))(mold((out \ + bc74610b-ea3e-4bc1-b782-63db54c601b2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b7afcbc2-b4b2-4ce8-88c9-d09fc5ef65a0)(content(Whitespace\" \ + 0321da82-0225-492e-a8eb-34226d846a6d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c3c4efcf-6257-42aa-8abf-9f21f3a06074)(content(Whitespace\" \ + 9cdb87d8-8303-47b4-9fd8-e628b0a288bb)(content(Whitespace\" \ \"))))(Tile((id \ - 346592ad-d92d-4fb5-8129-5ea9bb2e7cd3)(label(f))(mold((out \ + 9e44fb59-8641-4382-9606-bf69cea2a644)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8c6e7c6e-498f-47d8-bc6e-35d04efebcdd)(label(\"(\"\")\"))(mold((out \ + 2bd366e6-1356-4d5f-9a17-799d3d5cf6f6)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3ab39d13-3668-4a95-a8a9-7d074b5ea65e)(label(1))(mold((out \ + 7f1fe351-9957-40dd-91d7-bf8470ad8756)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fba4b3d2-e2e6-4182-a14f-c73394a01b53)(label(,))(mold((out \ + 087103aa-873d-4d2e-bc93-1c2dd198003f)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 543ef4ac-d0a4-407b-a12e-4a22506c1860)(content(Whitespace\" \ + bd48283f-38a9-48c7-be14-2c9f7fbff9ad)(content(Whitespace\" \ \"))))(Tile((id \ - c2676e99-8ea7-4c43-91d3-7665aa54de9b)(label(2))(mold((out \ + 3806ef0e-e20f-44cb-9edd-dd82ed1202d2)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 6691affe-3599-434f-9958-fde848721f29)(label(\";\"))(mold((out \ + 2efb5f7f-eece-4042-ae3e-86b8417c643a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9410af55-2a27-47e7-b439-1d75bceb2687)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b29f69cf-4e26-49c6-bd4a-28cce5226084)(label(let = \ + 0ceef89a-c47f-4b07-a58d-7268b8b11f6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 21af2be8-1468-43e1-bc58-0e103ff4a70c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 40b8a3ff-604b-4211-8c50-901c9f80e2ad)(content(Whitespace\" \ + c990349e-8ebb-46eb-8b18-39facf131b5b)(content(Whitespace\" \ \"))))(Tile((id \ - 7efd79cc-0667-43d5-8276-4c988598bc12)(label(f))(mold((out \ + fbaa5097-5d8e-4abd-925d-0696180f3ba6)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4ce809c9-8946-4507-b552-f79744e225c5)(content(Whitespace\" \ + a527e9a5-af7a-4147-aaea-7e532e368c5e)(content(Whitespace\" \ \")))))((Secondary((id \ - ddef7c88-21b9-4912-8524-60681e3ae1fb)(content(Whitespace\" \ + d313e853-7df9-404c-9253-624a99c08413)(content(Whitespace\" \ \"))))(Tile((id \ - 00742cd9-5e06-41c8-a5b4-b162e6d53203)(label(fun \ + be53392f-c141-4f69-ae59-9cdc16f2337a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7961e384-77e0-446e-871c-73b8c06ac2ef)(content(Whitespace\" \ + 120353f7-949c-4378-b0c3-1fab665fc365)(content(Whitespace\" \ \"))))(Tile((id \ - b69b7b35-be06-47d9-ab0b-dd96f675f91a)(label(a))(mold((out \ + a123c1bd-7373-43d3-8c39-4dfde0b58b61)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5dcbf26c-2b42-4772-859d-5fd3d8640790)(label(:))(mold((out \ + a8cd877a-f098-4d76-b861-1a19be8f8c81)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 756d30df-b08c-4f9a-8726-d8f1f234ccd5)(content(Whitespace\" \ - \"))))(Grout((id 51d13b39-2b0c-48d2-8bae-7443be55c20c)(shape \ + 7c0780bd-651e-4324-8eb7-b3c824076241)(content(Whitespace\" \ + \"))))(Grout((id 2fca0530-56b3-4917-ac7e-a79ed934923e)(shape \ Convex)))(Tile((id \ - 3a452939-6af2-4826-b2af-2ca581f9b4da)(label(,))(mold((out \ + 1e2e65a3-81da-4de1-8eaf-8c7529d36556)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0215a642-1a1d-4b5f-bf14-4e53425fae58)(content(Whitespace\" \ + 3863750e-8521-425e-9d11-ada947ea3397)(content(Whitespace\" \ \"))))(Tile((id \ - d1015a90-f58f-430d-b7c0-e3eab8db92e3)(label(b))(mold((out \ + 77134c07-8a4e-4194-8e2f-9a0595c4dd48)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9c811e2d-2605-4d9a-9ef5-c703405f9a0b)(content(Whitespace\" \ + b07c5dc6-9749-47ba-bec4-a1699f1bfce0)(content(Whitespace\" \ \"))))(Secondary((id \ - 77f0afb3-0ace-47ba-af6e-3abc5ff5860c)(content(Whitespace\" \ + 2ad38361-9f56-40ed-9291-7bdb46f46385)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 134aa00e-6db3-4b9f-950a-02838ad6e96a)(content(Whitespace\" \ + 41d69c50-1acc-4a12-9481-2c84e758f52a)(content(Whitespace\" \ \"))))(Tile((id \ - a378b042-5542-46b3-9a27-43e84cc254d3)(label(a))(mold((out \ + 8b78d5e1-1101-4cc4-b650-d063dbc12ad7)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fde71fec-574f-4242-b196-ca1d2965a499)(content(Whitespace\" \ + bb0a7c70-43b5-4508-95b2-f94e2a62baa4)(content(Whitespace\" \ \"))))(Tile((id \ - f0d7606e-fa27-4984-8a7c-2163ecb88e32)(label(+))(mold((out \ + 607f3ceb-8bac-4c6b-a227-ce968b30c6d8)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 68ffbb21-af80-4457-a12c-5f2dee03439d)(content(Whitespace\" \ + f5313869-3019-46bb-bc82-25719e17741e)(content(Whitespace\" \ \"))))(Tile((id \ - d8b6a5fc-a995-468c-9879-fc78ce64056a)(label(1))(mold((out \ + de7a2497-ebe3-4ae9-9a61-d5ef34cd8562)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9adaf2e2-acd2-463e-92c3-f464804a5266)(content(Whitespace\" \ + 4166f028-4812-496b-825c-6ed30562e52b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee073d2c-adc0-479a-a98a-633f665a8d5d)(content(Whitespace\" \ + 2f7715d3-603a-4cf9-8f74-8057b5ee75cb)(content(Whitespace\" \ \"))))(Tile((id \ - 7a328416-67f2-497c-8620-4844f189ae19)(label(f))(mold((out \ + 56a118a5-3b48-4b70-a51c-711916074c7f)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - af64ba3d-874c-49d1-a59e-b5dc4a9b69ba)(label(\"(\"\")\"))(mold((out \ + 50146bfc-e7d9-41bd-bcfb-9f54a7e150d1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7838ac57-dcc0-4be9-a9ba-fe7453310957)(label(1))(mold((out \ + c430ad3e-1656-4f70-9f51-9f8372bfd55a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 349893ea-27cb-4a50-93a3-b2aa3ec127e4)(label(,))(mold((out \ + 08db6430-c09f-4b02-b317-2e9b1b9acae2)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9250f90d-5fc6-4eb7-af67-648ecff7d044)(content(Whitespace\" \ + d2fa3cf9-1b93-4964-8f0a-bb3fd83ea868)(content(Whitespace\" \ \"))))(Tile((id \ - 4558d9b6-2487-4be5-8fe1-8b9a7387b616)(label(2))(mold((out \ + eb18ffe5-0d40-4470-aaaa-9ea0f450fe47)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - fc197af3-e75d-4303-b7bf-1811d0ce7b07)(label(\";\"))(mold((out \ + 3508ff9c-84c8-4f0c-8f66-b0bd05fcb640)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - db4302c5-0a40-4ae6-9ad8-1db5605eeea7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 63e4674f-475c-4edc-8a72-28a66aed92c5)(label(let = \ + c9b1ef3b-5b9b-495e-9f82-a67443c39051)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a5474569-9485-4402-ba63-ee8df3f8a489)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5be93333-f90f-47d6-8625-5d1dd31c47f9)(content(Whitespace\" \ + 41a2aca8-68d1-47e7-9b73-cfed3e748364)(content(Whitespace\" \ \"))))(Tile((id \ - 8c25d37f-e094-47ec-8fbb-a51ef8e61401)(label(f))(mold((out \ + 182041f3-b3ec-4b2c-b6a8-a096763cda33)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7033d52f-67b5-4d3e-8047-9e936cbb126d)(content(Whitespace\" \ + 81ba3305-ff3a-44c1-b244-fe2191dd2ec7)(content(Whitespace\" \ \")))))((Secondary((id \ - 43b00301-5052-49e6-aed6-77020f376322)(content(Whitespace\" \ + d4ac2b7b-994c-45a6-b769-b332663df36a)(content(Whitespace\" \ \"))))(Tile((id \ - 72c533dc-2ea7-48e1-b21b-473e8e6e744c)(label(fun \ + 44573832-39da-48ec-afdb-fa5c8900b81f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f0788970-7079-4007-a667-ab130036abda)(content(Whitespace\" \ + 5589ba00-c0b4-44f1-b2b4-0f6ef87f82f2)(content(Whitespace\" \ \"))))(Tile((id \ - 05062ecb-e9e7-415c-a10b-4a4e93f87464)(label(a))(mold((out \ + e14764ae-97ea-4365-9707-a443a62a56b1)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2c3d8ad0-e032-46b9-af22-ef30378dd35e)(label(:))(mold((out \ + 2b81df7d-9153-4f5a-a776-7256c6def523)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c24ee2dd-ce61-487e-b793-a36a1b251701)(content(Whitespace\" \ + b07949ac-d3c1-4af4-9ddb-2eca381665ae)(content(Whitespace\" \ \"))))(Tile((id \ - 1b6c9850-b0e4-4511-bd7c-46e08a5907c5)(label(Int))(mold((out \ + fdf70e9f-7fd4-431a-9091-e00a2059dbdf)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ddd07d5f-6d77-4851-af97-0bbada96a1cd)(label(,))(mold((out \ + c621eb2d-7c4f-4203-8e07-44f343ab29d9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 95dd3fba-5691-48ed-bece-f4f302e8bddd)(content(Whitespace\" \ + 2fae53dc-6bdb-47c7-8e34-4e3b19ea3a10)(content(Whitespace\" \ \"))))(Tile((id \ - 997880de-9aba-4146-8a6e-0f2b38975b33)(label(b))(mold((out \ + afe54977-bf81-4824-8206-8843f2658b04)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a4d39c6b-facc-4cbb-8e88-f76c3c21bc96)(content(Whitespace\" \ + f6a23963-e107-48e7-aad0-5f53ce32aee4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 20ea35c7-7232-4558-9b28-f9a8568613b1)(content(Whitespace\" \ + 084974bf-38e0-41f1-b64e-9aaa80f602fe)(content(Whitespace\" \ \"))))(Tile((id \ - 63690bc8-6017-4973-912e-c80ff4c94543)(label(a))(mold((out \ + 2d02e281-1f39-4ce8-a37a-6682815f6ea7)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ee3eda93-22e5-4e78-8184-c2361594375f)(content(Whitespace\" \ + 290ba035-d72e-47bf-bedd-b66a5d707726)(content(Whitespace\" \ \"))))(Tile((id \ - 592396ec-4030-408d-88b5-8e361e651fd9)(label(+))(mold((out \ + ea30219b-4afc-4918-9ff8-b863a7447656)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5ae65e6c-2299-4f1e-a4b0-5a1fc6934c49)(content(Whitespace\" \ + 984756f5-4774-463f-9618-dc2a72287830)(content(Whitespace\" \ \"))))(Tile((id \ - 53507e7f-c5e1-4dca-9037-f0b516aee23d)(label(1))(mold((out \ + f2dc795b-537d-477f-a184-81f2dcc0887d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 39e860f3-5bbe-413a-a749-0dab5a3ef9c6)(content(Whitespace\" \ + 38460a6b-efd4-44ba-8ed2-d6879e2913ed)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 71df145c-828d-4fee-9167-eb759c499815)(content(Whitespace\" \ + e9bafdd1-6986-43a6-b851-e746f864b3d3)(content(Whitespace\" \ \"))))(Tile((id \ - 1299fe39-5ef2-4d41-a4f4-471c449d69ca)(label(f))(mold((out \ + 81131e23-c1de-448a-82ed-013ba4b8de9c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 89f29068-538a-46d1-b9e1-f0a73270e8e5)(label(\"(\"\")\"))(mold((out \ + ef3edfbc-bcbb-4d5f-aefa-f21de4062271)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6018fb5f-2c57-4acb-aac9-3b3c93c521b4)(label(1))(mold((out \ + d282eee9-7456-4b6e-a486-0a5fbbc9490f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e8f92be1-04d2-4e36-9be4-56a1745be3af)(label(,))(mold((out \ + 8ce2f265-919f-4bab-9c64-179dc041bf55)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5df69079-5a69-414e-aae9-fa933a8a6b93)(content(Whitespace\" \ + f79bdaa0-cae5-4310-b7d7-f3853127bca4)(content(Whitespace\" \ \"))))(Tile((id \ - 0a38cf41-ecb3-45c4-a511-3e4ca484f114)(label(2))(mold((out \ + 9c101efb-ca2b-4724-a233-8f98aec75b25)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b13bc0f8-18f4-4b17-82e1-81b37665a206)(label(\";\"))(mold((out \ + 43038ffb-081a-4011-9594-ede00e3f4958)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a26830d9-c5b8-4469-b1d1-6821d104d13b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f2a215ef-4114-4a54-8a71-f86d7e04c089)(label(let = \ + a91c2cb6-4a1a-480b-ae2d-d9c8f6d4f10f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 76a63418-74bb-4235-821e-0b41e8dd5274)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3f375f1f-64da-4b1f-8c25-cfcc3e6f27c3)(content(Whitespace\" \ + c84ecc69-f6f7-4a81-b453-4e7dda5d7efc)(content(Whitespace\" \ \"))))(Tile((id \ - 6fa50cb7-a2f0-4056-bb53-75b7f1445146)(label(f))(mold((out \ + 0f25b864-34c8-4e7b-8d19-60b7e20c55de)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a3de2efc-0bc9-4afc-a617-978a48b4a2ac)(content(Whitespace\" \ + 0349ca00-580e-418d-ab27-4682e21da633)(content(Whitespace\" \ \")))))((Secondary((id \ - 9bbb8ff9-e72f-4d7e-9064-a7b65a698017)(content(Whitespace\" \ + d10c97b2-22e5-4a52-87dc-c2d8d1476b5a)(content(Whitespace\" \ \"))))(Tile((id \ - 86e40599-87af-4cfd-811e-0f374665de65)(label(fun \ + 1072ad6d-92d8-43ca-b74a-a1977806a658)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 15d656ca-7eb8-42a3-a0b6-466542dce7e4)(content(Whitespace\" \ + c23ad015-92d8-4d63-9ed4-3557fa6224e7)(content(Whitespace\" \ \"))))(Tile((id \ - 8acd0a2f-12bf-486a-b4b0-b6db08e1679b)(label(\"(\"\")\"))(mold((out \ + 34ace31f-67fe-46ce-96e4-bdfced8edfac)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - a9a214d1-7580-4ec6-8f1d-2f892e2522ac)(label(a))(mold((out \ + 8669f34e-aa04-4eb9-aaff-26534e695ba8)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - eb1f6ba1-c70d-41e4-9523-3cf0ded83e93)(label(,))(mold((out \ + 0a5099bc-7e37-4c50-a54c-31aa78e1c5b2)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 312bdde5-2fd0-463e-8693-0cfba3cffb22)(content(Whitespace\" \ + d3a849e5-48db-4b4c-b1e1-62bd32e722ee)(content(Whitespace\" \ \"))))(Tile((id \ - ea40f3f4-a72e-4c64-8994-b26ac1e3a8ba)(label(b))(mold((out \ + fccbf8b2-a2eb-4657-ba10-5ef78866702c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 3d50f394-3af5-46d2-9136-def8d2ab9576)(label(:))(mold((out \ + fea27ae3-edd4-40ae-b72d-73acf0c0cab7)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 81670e1e-5474-486f-b130-e5131e5bb49a)(content(Whitespace\" \ + 3ef94d2a-f330-4e49-a457-bebd71a0beed)(content(Whitespace\" \ \"))))(Tile((id \ - ac1664cb-074a-4953-ac1a-e18dadc49879)(label(\"(\"\")\"))(mold((out \ + 661b8e37-2726-49e8-9d59-7ecf23f635f4)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c23c11d7-d91f-4a51-8245-c2fe190b8083)(label(Int))(mold((out \ + 01c7dfcf-e95c-410a-8a8e-eba2f3a3485e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 44929c70-8a20-49a7-b9cd-eee62809aded)(label(,))(mold((out \ + 721ff006-dad0-4010-bde6-e9d592c91227)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 7d4579d4-91cc-4e50-86e7-50f5d7c9a419)(shape \ + 0a2bd9e5-66e7-43b7-84e5-fca00b91d825)(shape \ Convex)))(Secondary((id \ - 7ad092f4-8bfc-43ea-a4f5-27a0a0955e78)(content(Whitespace\" \ + 78e2aacd-3c06-4335-a5f6-1749e67d79b7)(content(Whitespace\" \ \"))))(Secondary((id \ - 58211cfa-80bf-498b-a91f-fb8be112bb3e)(content(Whitespace\" \ + 8eef25c7-6b9e-456b-9a21-c1d99d59f0bb)(content(Whitespace\" \ \"))))(Secondary((id \ - 5f2f52cd-9547-44e0-b5cc-8cfe90aaff44)(content(Whitespace\" \ + 02493026-d109-4923-8110-37417a520ae9)(content(Whitespace\" \ + \"))))(Secondary((id \ + fe0c91b3-96b2-4203-bb6a-2a4bb29a990e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9b50c679-d94c-4e7d-939f-2fbe45d10bf8)(content(Whitespace\" \ + 2566dfae-edd4-4ffe-80a4-56968a475285)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4daffb6d-9d40-4eec-b0fc-1d38cdd2d771)(content(Whitespace\" \ + 52609218-3a2a-4dfd-8f40-0ae4e783a13a)(content(Whitespace\" \ \"))))(Tile((id \ - 4983e179-2e98-4723-bb7d-1dc342c0a4f8)(label(a))(mold((out \ + 7f6f0c0a-7015-448b-b8a4-642b9304aee5)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 75b604b0-ac95-433c-ae66-2c8ff7318cb6)(content(Whitespace\" \ + f490212a-c3dd-4e90-b267-9ca127e20b11)(content(Whitespace\" \ \"))))(Tile((id \ - 328ac98b-1f02-41c9-b5aa-c3d8fd43add1)(label(+))(mold((out \ + c91b4b3e-06cf-4b94-98bc-dc1c261ac807)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5d50b4f8-fdbf-4c14-b2c1-a7caa962565d)(content(Whitespace\" \ + 0c6805e8-0585-4e3c-ba3d-552516fc782d)(content(Whitespace\" \ \"))))(Tile((id \ - a305c41e-4f8f-4af2-ac3b-85acdbc57af2)(label(1))(mold((out \ + 83a53af1-7c2b-4de1-899e-8d62a47734ea)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1a0c311c-c305-46d5-8231-d44f115c637c)(content(Whitespace\" \ + 7af5c6eb-6dc8-43cc-979a-1a50ec56926a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d7204ed8-cf90-424e-b030-08361e345816)(content(Whitespace\" \ + 4a781956-8b8d-4ff1-9ef4-a11d0aab7757)(content(Whitespace\" \ \"))))(Tile((id \ - 175031ee-3d1f-43d8-9e85-9e4d85747c6e)(label(f))(mold((out \ + 3cd3fde3-be6b-4e09-979a-1a021b1d12b5)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 20f42551-cf83-4d2e-b184-9549f6cd3466)(label(\"(\"\")\"))(mold((out \ + cabe87ee-fb11-4d75-945c-4fcc9fcfb176)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1f6d5bb7-2f78-49b2-a5ac-6a67f9c6a2f4)(label(1))(mold((out \ + 87674a64-680c-43a7-a493-e9ac20287264)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 20f59798-fe3c-4a6c-ae33-d9c1510cbb26)(label(,))(mold((out \ + 35c1b7bb-4136-4980-9107-802b8eac8edd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2c624608-4e35-46fe-ad73-01c59419272f)(content(Whitespace\" \ + 265f5c13-9c06-45b9-8915-3e97ff54d180)(content(Whitespace\" \ \"))))(Tile((id \ - 8b6a0f94-a405-4e67-af69-1b20a09a5918)(label(2))(mold((out \ + c37f722e-97f5-4e0a-83ab-5d0778dfd906)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - dcfae7ca-a255-4b73-b464-b64ef146de0d)(label(\";\"))(mold((out \ + a40df762-a8b8-428c-83ac-0ec6b8cab1d8)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 76c9b253-b8d4-4279-9e2c-551f5bcdbaf7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2feb1f6e-34cc-4cc5-b342-44af1cc12543)(label(let = \ + a3dd9552-89c8-482f-8c6d-8b4cc77e1687)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ebf4c810-7207-451f-a1fc-8c7dfb7a941e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3561bf77-c6e4-4920-b2c7-8bb4a93038b2)(content(Whitespace\" \ + 31d8517a-8873-49a3-9f52-2c53e56d10dc)(content(Whitespace\" \ \"))))(Tile((id \ - 7fda9988-a993-48c2-b2d9-904b32f289a4)(label(f))(mold((out \ + 646f355f-4afb-4689-90e7-c44fd9962b33)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3953807d-847e-42ab-b174-7fe458198617)(label(:))(mold((out \ + b22cfa0c-f400-4401-9cf6-72815348b350)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fc718f33-df92-450c-ac86-802e8f915d55)(shape \ + 42374115-3428-4e0a-beb9-e31e89b0b4e6)(shape \ Convex)))(Secondary((id \ - 4c192394-c97a-4942-9dd3-1236aa5d6171)(content(Whitespace\" \ + c23b6ae7-ea8c-491b-add8-2eb5ca47141f)(content(Whitespace\" \ + \"))))(Secondary((id \ + fe25ea13-0cdc-4ce5-906f-a844878aeec9)(content(Whitespace\" \ \"))))(Secondary((id \ - 9243b820-716b-4cdf-9edb-18a66aa708ce)(content(Whitespace\" \ + b190d877-da10-4e10-8a31-e3d8bf33c294)(content(Whitespace\" \ \"))))(Secondary((id \ - 2829630c-4aba-4bd3-a0dc-bae7667b6a16)(content(Whitespace\" \ + 2dbe94e4-db24-4c13-a5f0-b68e28fde039)(content(Whitespace\" \ \"))))(Secondary((id \ - b0070bc2-3a9f-445b-b59c-f881852ecb76)(content(Whitespace\" \ + 3d63a36b-5d26-4d0f-abe9-a58147d417a6)(content(Whitespace\" \ \")))))((Secondary((id \ - e168d383-d52a-46ba-8339-33203b8837d9)(content(Whitespace\" \ + 7b732b12-0b14-4aaf-9f1f-b74b9ffc2d2f)(content(Whitespace\" \ \"))))(Tile((id \ - 935d0dca-0570-488e-bba0-12617adb81b0)(label(fun \ + a5aa73d7-4bcb-4c54-9c1f-8adfaf349b61)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 99bf2b71-f951-4eea-8e2c-865c7aea6e9c)(content(Whitespace\" \ + 1086b2b9-af49-473e-8e3c-76fc3cb45232)(content(Whitespace\" \ \"))))(Tile((id \ - 2d097e81-f216-4144-b475-9f0667e0bc37)(label(a))(mold((out \ + f82c151d-d67a-47d5-88c6-18d79457fc66)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 956ce9ec-77d9-4641-82f1-adf78db82d9d)(label(,))(mold((out \ + 01f6c191-045e-447c-9374-1702f7c4358c)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 381a5bf6-1224-4a2d-b204-7c266703c632)(content(Whitespace\" \ + 4b4d36bc-bab0-4c14-8697-36fb3a4f58d0)(content(Whitespace\" \ \"))))(Tile((id \ - 6ca4fbf4-9ed3-48bb-9b9c-96743f146158)(label(b))(mold((out \ + c3151bfb-d7a9-4507-b454-2a77c2fef2a4)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6bdd8cfb-fc79-4e2c-8b8c-e3d3dfb7bef1)(content(Whitespace\" \ + d0751f56-95dc-4e5a-8142-58b7a9aad3e9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 435115a5-3606-48d8-8ac2-29d5b8f30c40)(content(Whitespace\" \ + d1594cb6-528c-45b5-9ca0-d2f5db646ebb)(content(Whitespace\" \ \"))))(Tile((id \ - ec4ea498-5768-43db-b282-ad48a94014aa)(label(a))(mold((out \ + 0c18b4f9-5824-4c13-8b9f-4c03509e3d19)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cd97908d-5d8d-4716-8c9a-a456e03c5b83)(content(Whitespace\" \ + 9dfc4dda-d775-4495-8059-18e3ae60e620)(content(Whitespace\" \ \"))))(Tile((id \ - a42db2d0-d2b9-4ecc-9ec1-428769bfeae9)(label(+))(mold((out \ + 59d0bec5-8da8-480f-b9f9-aa2315ac5b05)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4d140807-e6db-4f94-ac28-13a4fc9bdc35)(content(Whitespace\" \ + b65ed8ff-e142-443c-9d35-2b763111bbfd)(content(Whitespace\" \ \"))))(Tile((id \ - 11628792-79c6-4d1b-9db1-120a43ff9f23)(label(1))(mold((out \ + 70faba09-22c9-40a0-a244-6dcae68e484d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - aa40938e-dca8-4d96-8470-2bd894f1e12c)(content(Whitespace\" \ + 0cda9659-d0a6-494c-8205-976647e3cb23)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 67b0e1e4-ee7f-45a8-8c87-5b553a9dcd34)(content(Whitespace\" \ + 900e3e11-7858-48a0-83a3-790dda457039)(content(Whitespace\" \ \"))))(Tile((id \ - 5a76410c-754a-4367-8577-09d73fb039bd)(label(f))(mold((out \ + 25766c0d-076a-4f19-9d10-9612247d8f8d)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5ea61f5f-e858-490b-8ed1-8186cddcd0a4)(label(\"(\"\")\"))(mold((out \ + e2fadbb3-13d5-4a5d-83a7-62487c4ce73f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e440302c-df0d-4b3b-924a-779c00e131b8)(label(1))(mold((out \ + 2fd60358-4c5b-4667-ab4a-8ea942da4f78)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fffcb647-fcf0-4724-bf3d-a8730d05cee3)(label(,))(mold((out \ + 46368e17-b30e-4543-98a3-75a131df9d7e)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4a262d6e-5e58-4248-b974-f1d2624a0474)(content(Whitespace\" \ + 1f3531d7-5aae-4dc3-9d36-438653994b0e)(content(Whitespace\" \ \"))))(Tile((id \ - 4df1b8c0-e2dc-4f14-b541-b6c3735647aa)(label(2))(mold((out \ + b3d9dced-fa23-48c9-9955-ad7f0361a838)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 141dcfa2-a499-4484-a6c5-ec818712509a)(label(\";\"))(mold((out \ + e185d3b6-73bc-44e6-b252-c688f844855a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 69e9cbf3-7d18-47a1-894e-74c78142969f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - db71d307-2ef7-45fa-aa6a-29f51fb7de3d)(label(let = \ + 2b1f34b8-5a8d-40d4-acd3-b5c0d7f3f520)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8667d8c0-adfa-405b-9da1-5f703ef0a4fb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 91d66f25-c8e0-44b0-a6ba-7470792df230)(content(Whitespace\" \ + 34fd2d59-25d4-48bf-95ef-7b79db0959c6)(content(Whitespace\" \ \"))))(Tile((id \ - 964ce16b-db32-49fc-b16f-544c9e7c5559)(label(f))(mold((out \ + 008a716e-5e30-497b-8ae1-b8da9e34fe95)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a7c2baa4-e944-4c07-b883-c2ab12a0b859)(label(:))(mold((out \ + 4d6b24f4-e671-44af-8f93-e57285d8cd72)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 86c734d4-789f-467c-9aea-371d78f13a31)(shape \ + 5596a196-aaac-4af3-b3db-dbb7b06531fc)(shape \ Convex)))(Secondary((id \ - 56d5a9c9-9757-45dd-8b68-d861b9e9e590)(content(Whitespace\" \ + 908cede4-8d2a-4d92-a2b1-bcd00555ded5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8acc3954-9c5a-410e-9b37-3efca660b6ae)(content(Whitespace\" \ \"))))(Secondary((id \ - abcd2e5f-7cae-4932-99aa-7dd185a9eedd)(content(Whitespace\" \ + 4f01b693-e232-4784-a7b5-0850f2f91584)(content(Whitespace\" \ \"))))(Secondary((id \ - 8e002a2e-b200-48f8-ae88-33f662d2796f)(content(Whitespace\" \ + 6ec3e612-7695-4c0d-afa7-aa9c415fa765)(content(Whitespace\" \ \"))))(Secondary((id \ - 04a7b375-2688-4fc5-99a9-38b5eaa15538)(content(Whitespace\" \ + 0728b94b-8098-4974-9bbe-72f1a1471b2c)(content(Whitespace\" \ \")))))((Secondary((id \ - 29177e5a-f49f-4d15-ab02-906e13feef06)(content(Whitespace\" \ + 44eb6358-ca32-4982-9ff1-4c32ebc3ed0a)(content(Whitespace\" \ \"))))(Tile((id \ - 9197c21b-8125-4a1c-a545-a1694f36921c)(label(fun \ + a53112ca-c595-4ee2-8edb-b729b6905c31)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - eb29b5a0-6d84-46c6-a92f-994bdbb99f89)(content(Whitespace\" \ + 931b44f6-bfdd-44a1-9e42-dfb135be1808)(content(Whitespace\" \ \"))))(Tile((id \ - e9ec2156-97f8-4352-b910-e844b867cac5)(label(a))(mold((out \ + e35ceb10-6c8f-445e-a055-54028bd61344)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5eb3dfe5-c69a-4400-9373-f1b3a5ea5850)(label(:))(mold((out \ + b22b3a28-ef38-4c28-90e8-e20af795e923)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 73d20fe3-1d78-4d89-b2a5-d980a41b6bba)(content(Whitespace\" \ - \"))))(Grout((id e9c578b4-9fe0-4e4b-bbe2-008874516c16)(shape \ + bf609873-bca2-4b7d-a177-2161e68345ac)(content(Whitespace\" \ + \"))))(Grout((id 0548ec7a-014e-4439-859c-e2310dcd63d7)(shape \ Convex)))(Tile((id \ - c4f24eb2-a855-489c-bd37-ada69350a5dd)(label(,))(mold((out \ + 8dc4e8f5-4f89-418d-bed7-967bb6611d59)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ceafad7d-abdf-48eb-81c9-22e640489ba8)(content(Whitespace\" \ + 84c39660-2dbf-45b9-88a8-41dbe2c9fac8)(content(Whitespace\" \ \"))))(Tile((id \ - f9e91a1f-1fe9-4ce7-a01c-f5c823d3c8d9)(label(b))(mold((out \ + 742a5e07-30a8-48ab-bd4e-367720619557)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bf28c0ff-5303-45b7-aa99-5703787d3db6)(content(Whitespace\" \ + c95b16bc-5c4e-483f-a9d7-15c0de37a834)(content(Whitespace\" \ \"))))(Secondary((id \ - 40dd2f6a-5e7d-4cf9-a4ce-6fc0976c13c6)(content(Whitespace\" \ + fe78d319-78d2-4072-94c4-68a57926dc7d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4610b348-cfe6-48e6-bbb5-547430d1413a)(content(Whitespace\" \ + 7ff568f5-e626-41a0-9561-73c83659fa01)(content(Whitespace\" \ \"))))(Tile((id \ - 8e07d0d6-29e5-403f-8d3e-22a29a8e37b5)(label(a))(mold((out \ + a71e5576-4bbb-4a52-9cb3-24029e2c93be)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8aa8da6b-778e-44ee-98b0-8720f09f80e4)(content(Whitespace\" \ + 62bd4be1-2085-45db-86af-16f088d5e2a2)(content(Whitespace\" \ \"))))(Tile((id \ - ab90af2d-ad92-4757-b2e9-aaa8c8ed93a8)(label(+))(mold((out \ + d2a7d9fc-beb1-4d92-9202-8f870729fc9f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ba42d147-5763-4b54-aae0-2827a3276415)(content(Whitespace\" \ + d0d66364-052b-48c5-99c8-c5559fb786b5)(content(Whitespace\" \ \"))))(Tile((id \ - 685e4cd3-ed2b-4d9b-a0a6-dcacc53419fd)(label(1))(mold((out \ + 2017864f-e67e-4ad9-8428-f5f095ee0e9b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - edbc8700-890a-4991-b890-d698192358e9)(content(Whitespace\" \ + 755d06b6-4d8a-4149-baa1-e10717916097)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b6a5e63e-f20b-4e10-8f8e-ad0d6e7ace14)(content(Whitespace\" \ + ad3d700b-0c3d-4cf1-b2bb-678f779aff3b)(content(Whitespace\" \ \"))))(Tile((id \ - 1854bbad-ad53-4028-b3a6-e2ded3932912)(label(f))(mold((out \ + e329ddc1-ae46-4cfd-bad2-f9fc4f6888dd)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1e97b3ca-b107-4047-9c49-3a58c75fd619)(label(\"(\"\")\"))(mold((out \ + 6127d3ae-4daf-446b-b92c-59cc4f92d948)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5ce388e0-0b28-4c64-a99e-a4f0aff8aee0)(label(1))(mold((out \ + db5a9d88-e8fd-440b-89c8-ec866a4b0b3d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fd5a746e-fcc8-48ff-80c8-4699f135c65a)(label(,))(mold((out \ + 2aca8941-c435-485f-ba30-9a34d607a802)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd960288-ba02-48e1-954d-d3a91d6e382a)(content(Whitespace\" \ + a909d6e7-0e8a-4c13-b21b-0a0c01b20ba0)(content(Whitespace\" \ \"))))(Tile((id \ - ef621b2a-6bd3-4518-962a-bf7fd1e4c163)(label(2))(mold((out \ + 017e8f15-9b57-4c81-8eb9-f0c9baec5039)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c9106c47-0493-499e-bee2-cb6abcc5f048)(label(\";\"))(mold((out \ + 266cf2d9-ddca-4fdf-aae5-8ce12ddca4b0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6d514b42-d09d-4fcd-8321-4fac6a77be5b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 21562688-1347-4c7e-be27-0226defcb12a)(label(let = \ + 3fe35443-0e62-4b24-88e5-f750b4aad0ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7aac6064-64b6-4e06-99c6-487a152c14a9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 77020c32-318e-44f9-bc54-2dbc8cdce53c)(content(Whitespace\" \ + cb48efcf-8e92-4bbe-80b4-6b06ee6e3233)(content(Whitespace\" \ \"))))(Tile((id \ - 5e91068b-221c-40bf-a6ce-a6d46efaea19)(label(f))(mold((out \ + d1a5627b-9bd1-4176-86b5-e20d10810ddc)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3301c1eb-814d-493d-8c02-fecae11058d3)(label(:))(mold((out \ + 568ccf78-b847-4ac7-bbb5-a9bd7b19e077)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f1e2cff0-47f3-46bc-b734-f167e81c7183)(shape \ + d33cbb82-586f-4971-a4a5-042338dd1d99)(shape \ Convex)))(Secondary((id \ - 37685087-0abf-4617-bb95-9809500b6994)(content(Whitespace\" \ + 29e9a2ff-0aba-4b44-a89a-dd903bd893d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 18a3f965-2ae7-4e89-a7f0-c4fe8223b15b)(content(Whitespace\" \ + 79b615b7-8131-4d46-825c-b66024126adf)(content(Whitespace\" \ \"))))(Secondary((id \ - 24006329-87f1-49f7-8185-f5f091c5a9ae)(content(Whitespace\" \ + fc364ba9-e446-4675-95a7-d3656f5c564e)(content(Whitespace\" \ \"))))(Secondary((id \ - c54f12fe-39d2-457c-ae41-b2c5010ca4b6)(content(Whitespace\" \ + e43fb7fb-d82c-4d1d-a335-371ff03bbec4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4a8177de-7020-497e-b5c0-81f50bac2ed3)(content(Whitespace\" \ \")))))((Secondary((id \ - 979b53f8-410e-4d5a-a8c6-59d92f175772)(content(Whitespace\" \ + 09dc5081-5c6d-4b8b-b376-2a009458d5d4)(content(Whitespace\" \ \"))))(Tile((id \ - 12b034d4-9efd-4dd8-840a-e886b1b3e14e)(label(fun \ + cff47fcd-7087-40db-a920-df7a6b38e08e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8a76a8c8-7314-4cae-916c-4a2be58ffe69)(content(Whitespace\" \ + bba7f435-d6b1-4c13-a1e8-e36596f8f4a2)(content(Whitespace\" \ \"))))(Tile((id \ - 38f4a281-c6f7-43d9-981f-a1c4f880b310)(label(a))(mold((out \ + 24236d9e-31a6-4240-b2df-c0a9aa50a2f0)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1bff4971-ca15-417e-9729-883074b05ebe)(label(:))(mold((out \ + ca2dd60d-1ab0-4bc4-9b09-db5d185f5309)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7828d07-5f1d-45fa-802f-5d44845f176e)(content(Whitespace\" \ + b4411e64-f416-48f7-93bb-c15417635b96)(content(Whitespace\" \ \"))))(Tile((id \ - a9636049-914a-4b4a-bde9-c663024772c2)(label(Int))(mold((out \ + 131b1c95-1913-466c-923b-151582cd1a41)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 04f417bb-7053-4975-ac0b-9326540aa47e)(label(,))(mold((out \ + 437e049e-0211-43b1-b363-faef322b6608)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 3a5faa38-cdd1-481d-91e6-0792db09017b)(content(Whitespace\" \ + bd1685c7-e98e-4024-8fe9-638aea7ff463)(content(Whitespace\" \ \"))))(Tile((id \ - eb27f466-955d-4987-86ef-d1ad0fb300e1)(label(b))(mold((out \ + ede4f17f-8a4d-4f50-b4f2-7e986d88c2b6)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6b277728-9153-4ddf-a7bf-69756937ec23)(content(Whitespace\" \ + 4c547a87-eb59-4fc5-9d19-b23abb75a8d1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f9cdd37e-d051-4e7f-bb7d-3cd149eddb2d)(content(Whitespace\" \ + bc0a22c9-2204-44ea-8141-7ceaeb09e124)(content(Whitespace\" \ \"))))(Tile((id \ - 1b3fbffa-6f05-42c5-bca8-d1b5826e434e)(label(a))(mold((out \ + 88ded2ef-cc84-4ed9-ab14-3940657f3e65)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fd47e64d-daf9-4e0f-9e93-a85d8f7f8eb9)(content(Whitespace\" \ + c1763aee-2ec1-4b29-904c-3e8c8c7ea983)(content(Whitespace\" \ \"))))(Tile((id \ - 1394c6f6-3fa9-47b4-9b7f-bb2353c3ab19)(label(+))(mold((out \ + f28f183a-6524-4f1d-82ba-3deba2ed10e0)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e15a24c4-a221-4c23-9ac0-4437bbd43614)(content(Whitespace\" \ + 13418cf6-15b4-450a-b54e-670b790808b7)(content(Whitespace\" \ \"))))(Tile((id \ - 7b7ca6ea-d1e1-4609-a6fd-dcc57b21a176)(label(1))(mold((out \ + dcd757d6-a025-4441-b71f-80b7498cae65)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 734538ad-6662-43c8-a588-1b6bf3591954)(content(Whitespace\" \ + a9c548ea-6dd8-4d2a-817f-19bd5638c43e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b718e2d1-9be0-475d-b3ad-bb3310d734bf)(content(Whitespace\" \ + 88006b00-ad25-4b6b-b8f2-46805805ce02)(content(Whitespace\" \ \"))))(Tile((id \ - 498f783a-683f-467a-bc21-8dc8abb8cdbe)(label(f))(mold((out \ + fb195e21-44ce-4ca5-9b85-ef9072cbef3e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 968a2b0f-044a-4b87-a43c-6a82b9f99a1d)(label(\"(\"\")\"))(mold((out \ + 33611903-51cb-487d-8fbf-aa9cf39229d0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6fc6814d-dccc-479d-8c8b-197a49ec54b2)(label(1))(mold((out \ + e6988fdd-0475-48cc-baf5-206e1af0a695)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a5a2ddff-92df-46b5-8a10-295fee71ac7c)(label(,))(mold((out \ + 04fa7efc-c94e-429d-af5d-96ac6b3e0acc)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b77aa261-cb36-4307-8a07-20634cabfb88)(content(Whitespace\" \ + 1a410cbc-778d-453c-9ca9-14f9c567cd25)(content(Whitespace\" \ \"))))(Tile((id \ - 8fd20ee8-9096-4fe8-98e4-48bea398ba10)(label(2))(mold((out \ + 0b489afe-f686-4f09-a7f1-8d2d8a421675)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c4cd1f4e-ea64-4492-99e4-43505fc0534a)(label(\";\"))(mold((out \ + 235f8bc3-e437-402e-85b4-7771adb8778e)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a7726994-ec80-49e5-acac-21db10025e87)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4db35f89-bc24-4136-b91f-a1b4db7d0cc6)(label(let = \ + 30d18eac-2393-47ed-9358-bdefc31e58e6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4780eb65-8f0e-4a67-bab8-107f251ae3f1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 784c9906-a3d8-4605-821c-cd0f14d551c2)(content(Whitespace\" \ + 9baf2aad-35d3-4395-a9c4-05ba8e88388a)(content(Whitespace\" \ \"))))(Tile((id \ - cbe0b3b0-51b1-445a-8e6b-dcd3f1a39475)(label(f))(mold((out \ + 516ad7d0-136c-4058-8589-ead6ff52394a)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6ee18ad9-de1c-44e0-8662-a5ba4a153a7e)(label(:))(mold((out \ + f9aaed1a-dc5e-4306-bcba-869a3725b6ee)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 2f5fb109-ae11-496c-95d7-793176997546)(shape \ + c553e28a-d12b-4915-8f9b-6bfc8b8c4a57)(shape \ Convex)))(Secondary((id \ - ce7a4d0b-d1fd-4a2a-8940-0577a27d374c)(content(Whitespace\" \ + cc0b1d4a-abe5-4924-9ae2-e3b0629e3f89)(content(Whitespace\" \ + \"))))(Secondary((id \ + 74a71cc7-8510-438d-b27f-7cebab161836)(content(Whitespace\" \ \"))))(Secondary((id \ - 8a26da39-7d18-411a-a176-41763bc4ae4b)(content(Whitespace\" \ + 2e12ed36-f19c-4e9c-b9f5-e529c13b470e)(content(Whitespace\" \ \"))))(Secondary((id \ - 582486c8-a289-4139-b57f-d97088e635bc)(content(Whitespace\" \ + cf52f316-7e6f-41cd-94ca-8d0a82248baf)(content(Whitespace\" \ \"))))(Secondary((id \ - 31001117-aea2-4ef4-8194-7dfc10cd11b4)(content(Whitespace\" \ + 6ef7a264-d389-4009-8435-2cc4470c931c)(content(Whitespace\" \ \")))))((Secondary((id \ - e82b63bc-70bb-4eee-9017-f4a29245f54b)(content(Whitespace\" \ + c0a5a1df-825b-49e0-ac29-c186dc016512)(content(Whitespace\" \ \"))))(Tile((id \ - 968a811b-da22-4cf0-b00e-2f76d87a568e)(label(fun \ + e156e57b-8a65-44ea-9cdd-c94fe195c9a5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9693ceaa-dda7-4371-b385-264a0290861b)(content(Whitespace\" \ + da46c755-ef24-408b-bb62-07524fd24562)(content(Whitespace\" \ \"))))(Tile((id \ - 184b3b99-9944-45e9-b570-48fef88b0c5a)(label(\"(\"\")\"))(mold((out \ + a2866d81-aebc-42eb-a7ae-e26043a74cf6)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - d26aabcd-fe68-4a83-b108-41986b047cf6)(label(a))(mold((out \ + 43cff81d-0762-4f05-976e-ce07af1b8a6c)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 837018fd-fe92-4c26-a8e3-92524eeeb6b4)(label(,))(mold((out \ + 226b9739-c1c9-46a4-8188-3f786f1f2086)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - feb1d885-8bf4-4dab-a380-3e6f08d7270e)(content(Whitespace\" \ + 06f2ab89-0ba8-4e6a-8dc9-9ec181d6564d)(content(Whitespace\" \ \"))))(Tile((id \ - ad86332a-1b25-4f73-a96d-9003f147c816)(label(b))(mold((out \ + 0feac348-f033-4ccc-8da7-d5f3a85c9307)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 1bb39a60-7efb-4e50-a1c9-222a4e2ad77b)(label(:))(mold((out \ + b5769b91-2d42-4b21-a507-85f80375b6d4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8726abf7-0004-45fc-987b-03c04f80290a)(content(Whitespace\" \ + 09e4539f-10b2-47db-a05e-6f0f4ea43ab6)(content(Whitespace\" \ \"))))(Tile((id \ - 6b239ee0-3dbd-45e7-970d-52a84ebe5a3b)(label(\"(\"\")\"))(mold((out \ + 0771103c-da05-4a99-aec3-4e8bff1a3536)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 51d6e599-610c-40fd-98b7-1dc4690125bd)(label(Int))(mold((out \ + 6492bbc5-95f1-4060-bca6-cb8522f43720)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 90ab602e-a068-47d2-bb8b-470d150edd02)(label(,))(mold((out \ + fa29e80b-ee90-4ca7-8887-96d4dad7e206)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - d955884c-5516-4e0f-9d3b-f3b5a350f67f)(shape \ + 4ee5945a-6712-4749-b669-68ad80cacb1a)(shape \ Convex)))(Secondary((id \ - bfcb0cf6-9c3a-44c3-916b-b104c6013a14)(content(Whitespace\" \ + 7202df72-9810-447d-9097-58e0915f2533)(content(Whitespace\" \ + \"))))(Secondary((id \ + 53c0d272-049c-4c9a-b2fa-521a2ece62ed)(content(Whitespace\" \ \"))))(Secondary((id \ - 5bfe2831-8ca3-498b-b7a5-2f72fc9541b5)(content(Whitespace\" \ + d8603266-973f-4524-9006-6f14a62197e2)(content(Whitespace\" \ \"))))(Secondary((id \ - e969add0-25f2-40ee-b27d-47347660cb55)(content(Whitespace\" \ + fba650fc-ee5a-42ad-884d-7e121466d566)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0c64e867-9ab1-4be9-969e-7e8ea38ba6f6)(content(Whitespace\" \ + 973270cb-406f-4118-885e-204c4574a814)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 528781ce-c7ee-4822-a4e3-07884c2ad1f5)(content(Whitespace\" \ + 1656182a-3530-4fad-b7af-19adeb223861)(content(Whitespace\" \ \"))))(Tile((id \ - acf6f5fb-858b-4ddc-8ae8-a8437b585246)(label(a))(mold((out \ + 5486db83-9bbf-4226-9389-3bd6a649e547)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b279f9cf-75a3-4149-a82b-7efe3f5045ef)(content(Whitespace\" \ + a3ac746b-4082-4873-9dbf-5f56d0f0f0f7)(content(Whitespace\" \ \"))))(Tile((id \ - 34e95715-ec0b-45ab-9e76-42fb406afa8e)(label(+))(mold((out \ + 27ed21fe-1cc0-4748-81ed-28e703e04bd3)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5ef600ef-fbf8-463d-8942-c7d115288fd4)(content(Whitespace\" \ + 1fd235e2-06ba-4e14-800c-745e4c75d2dd)(content(Whitespace\" \ \"))))(Tile((id \ - 335daf9d-bf8d-46be-9ae7-88e887b38bf3)(label(1))(mold((out \ + c0911878-6939-44aa-845e-4f69b96d65fd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cc7b5bc4-ac83-4b56-a00f-14a7b0d63f69)(content(Whitespace\" \ + 83fa241c-fd81-42d6-b83e-6d2da973399a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d311851b-f735-4aa2-82cf-3f253cbdd47e)(content(Whitespace\" \ + 92f7bbd4-e2e0-4778-9519-0140b26da2ce)(content(Whitespace\" \ \"))))(Tile((id \ - 56e5bdb9-8484-4c50-877e-4efef3864bbe)(label(f))(mold((out \ + 0c1dafed-ce1f-468a-8354-cb27671f5156)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - df865363-8a53-4452-83ba-c69264f60435)(label(\"(\"\")\"))(mold((out \ + 84b9e0f1-6cbf-4334-9df6-6e723b2c1318)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d1e1c7b1-0885-4961-83b9-c4c612290745)(label(1))(mold((out \ + 930e2d07-21f2-4671-b098-d41ddbb7f068)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 01c84fa9-8a5d-42c9-9040-4a9282c780b3)(label(,))(mold((out \ + c18881a1-4666-4280-9e23-30595fbce237)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d2140561-31ea-461f-b108-1fa8bdff73d2)(content(Whitespace\" \ + 8e98faa4-6463-4002-a1fd-a50db6eee4b3)(content(Whitespace\" \ \"))))(Tile((id \ - 17275d13-0c6e-42f4-a0b7-86885a21511b)(label(2))(mold((out \ + fbc65161-1ffa-4c69-8320-56c51dfd4e2b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 985767ad-b01f-4b63-9204-e6c63d3e2c35)(label(\";\"))(mold((out \ + 91c71496-e60d-4e86-82c0-5f0e8d875382)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c4a167d1-5c77-41d4-8fdc-f1424b07fe45)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 83ce8b95-252b-4020-b633-c95fd80443a6)(label(let = \ + b29c15d6-e2e2-496e-9c3d-ae025d33a239)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9daa0d58-3873-40e3-94f5-35732774bcd3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a9ca2d21-1754-4e2b-be76-3b417d6cba76)(content(Whitespace\" \ + b4fe7d76-e4e1-486a-a2dc-fcd0f3880f45)(content(Whitespace\" \ \"))))(Tile((id \ - 1d76bbc4-83b4-4305-8e7a-97d5e62daa4d)(label(f))(mold((out \ + a9580d9e-5f69-444f-a882-0a131072e3d3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0a0f2fc3-641f-4d46-9a68-68257193fbe2)(label(:))(mold((out \ + 8f7fff52-3b95-47de-b364-be40c36a715f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c10f8365-1c5c-4629-8ad9-a5959c6903eb)(content(Whitespace\" \ + 327e1af8-43e9-4d09-a9ce-92b25b1e828d)(content(Whitespace\" \ \"))))(Secondary((id \ - 4eeda34f-4758-40d6-a149-a647b273d36a)(content(Whitespace\" \ - \"))))(Grout((id 517d8bd0-a2ba-424a-b61c-adb29e6483c9)(shape \ + 5bfb47cd-051d-4eb2-8e89-b4fe353b5224)(content(Whitespace\" \ + \"))))(Grout((id 37a657ca-67bf-431a-b585-683b8696a621)(shape \ Convex)))(Tile((id \ - ba304aeb-4587-4959-a20d-a94d9d34cb93)(label(->))(mold((out \ + 5fce45d1-4122-42c2-a799-a65bc416d8e3)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 70a8204e-1d13-45b6-b25f-ea1b214d780b)(shape \ + 003d5f89-103d-447d-8c60-cb98613a5ab0)(shape \ Convex)))(Secondary((id \ - 837bcb68-f75c-45c2-9942-c886fedb41fc)(content(Whitespace\" \ + 333d1e3a-133d-4a9e-baa6-ad2a1a29599c)(content(Whitespace\" \ \"))))(Secondary((id \ - c86535db-0dd0-483d-8e3c-29d14974c63d)(content(Whitespace\" \ + c0d31cab-4498-4314-b924-fd98d6d22d92)(content(Whitespace\" \ \"))))(Secondary((id \ - 1f81b1c9-8ba1-4469-acb5-b900830ff0a3)(content(Whitespace\" \ + 479154a5-c1c6-4db7-893d-f31993628e79)(content(Whitespace\" \ \"))))(Secondary((id \ - 2ca75fd6-7343-45bc-9e70-0dc93649d740)(content(Whitespace\" \ + 09625be9-cf5b-4685-ad06-82440dc9a17a)(content(Whitespace\" \ + \"))))(Secondary((id \ + c2d6e30a-443b-41a7-b9f6-d446b4c3adc6)(content(Whitespace\" \ \")))))((Secondary((id \ - 06a28117-fd71-4e8d-8f90-c931810f8ad2)(content(Whitespace\" \ + 9f0d4a23-cc87-4332-8e8f-cec5fa3fc45d)(content(Whitespace\" \ \"))))(Tile((id \ - 50e5be80-3698-4f05-b4f0-051d1e04aa9a)(label(fun \ + 4279a28c-7e46-4485-93cf-678207144e74)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 53ce7f68-36bf-45f8-96db-755abbe9bded)(content(Whitespace\" \ + 215728f0-aa5d-43a3-b5b8-8784aad5b8be)(content(Whitespace\" \ \"))))(Tile((id \ - d7afae00-1a71-4663-9646-56203a70bd61)(label(a))(mold((out \ + 5138bfb3-2dd8-4371-bf07-92df8b84f6d5)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dcd918c8-9cc6-4908-8cf2-6c3a6b10813d)(label(,))(mold((out \ + 43b443bb-7a84-4866-9377-a2d3f523eef7)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c986b970-44ee-4a99-af19-88779f6d820b)(content(Whitespace\" \ + cb7c843d-8ddf-48ce-9c53-6102e8c17822)(content(Whitespace\" \ \"))))(Tile((id \ - 66eeb1de-a1cc-4fbd-955b-9ffff5487eef)(label(b))(mold((out \ + f30751ef-019a-49e3-9a74-ac42e5673b6a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 919bed8e-4c66-4248-a5c9-e91092258353)(content(Whitespace\" \ + 8eb77346-d376-4ea6-ac2b-d428fb0d13bc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ec92c6c9-baa5-41d8-a1a8-9fdfe0366179)(content(Whitespace\" \ + 12248498-708f-49ca-97a2-628a1be566f2)(content(Whitespace\" \ \"))))(Tile((id \ - d05bc698-67a3-43b6-a641-106cb4a11d0f)(label(a))(mold((out \ + 9c42e90c-e033-49be-8e59-8d1e28d5e737)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8a1f54c5-adcd-400c-b75e-bae94a39a949)(content(Whitespace\" \ + 99980d37-c66a-4f16-badc-b912ba8c5c89)(content(Whitespace\" \ \"))))(Tile((id \ - 441e27f9-3c1d-4d2b-92ec-45d760e639df)(label(+))(mold((out \ + a3be2bdb-d9c4-4233-b010-0c1bb3e62d2f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bfeea19e-d38b-431d-bdda-bf616cdc3516)(content(Whitespace\" \ + c2029d3a-1a8a-48af-86e1-cd96cafca897)(content(Whitespace\" \ \"))))(Tile((id \ - 6c4bed74-0d2f-46d7-9d07-27744c09bbc3)(label(1))(mold((out \ + 11214c70-9a30-404a-897f-a08cce1de0aa)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8424ebd6-c3dc-4342-9f48-33c226381c5d)(content(Whitespace\" \ + 89263309-873e-464a-bd31-f7fa7b44deea)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 43d562a3-5fba-448f-84c6-3b8db57421e3)(content(Whitespace\" \ + 2db81e68-e20d-48af-b5ea-6f3cf015f8f3)(content(Whitespace\" \ \"))))(Tile((id \ - 38d4d4d8-9cfb-40a9-a3e6-414801ea53f8)(label(f))(mold((out \ + 1f0a271a-c64f-4357-90be-857c771bc969)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c416ab12-0fac-410d-9c53-500629fb365c)(label(\"(\"\")\"))(mold((out \ + 78ef23b6-5143-4473-a21a-79a2069d9829)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b79a4f59-62c5-4f5b-835b-9b9dcf8a185d)(label(1))(mold((out \ + f24a098f-8ba0-4173-9c92-2994a82bebe2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4a7c9519-1a70-4f5c-be3b-f0f5163030a1)(label(,))(mold((out \ + 5bfa564f-ee24-4849-b0ae-2b7fde9821d5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7227af17-b28c-43d5-ac09-4bd4e3ef1c76)(content(Whitespace\" \ + f4be52c1-8d60-46ff-aead-61e7a30eae43)(content(Whitespace\" \ \"))))(Tile((id \ - 84fa523a-b25d-4366-9afb-b5392df0518c)(label(2))(mold((out \ + ffffbcb2-6e3a-4ff6-ae94-f2eb129a8020)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 448b367e-251f-4c0e-a94b-b38194266019)(label(\";\"))(mold((out \ + fc3577dc-45a5-4c31-a027-091beae08b06)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 20b03f4a-8032-4b3f-bd5a-ca4e7bc41ba8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2bd63cbe-5845-4cb7-8a0c-72a8dc25b0b5)(label(let = \ + 32e0f96a-c442-478b-80d1-0823411a57a3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7d3171f1-f0fd-47ba-917d-0c00f109962c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bdf8cc2d-2635-483a-8dc1-f774abee49d2)(content(Whitespace\" \ + be37c3b9-0f8a-4192-bbb6-5f812ec2a738)(content(Whitespace\" \ \"))))(Tile((id \ - f87776cc-e382-417b-8d86-18b282771911)(label(f))(mold((out \ + 85a13f28-7e4e-49f7-be41-d50bc5384f9b)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9f94ca87-cf4f-4238-b457-bfd0fa817f3e)(label(:))(mold((out \ + 95565c5e-7083-4a85-9e4e-0cc864ae8745)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a286b27-e63a-4cda-aa44-470e7bcd0a5e)(content(Whitespace\" \ + 7d6464f1-c86d-4003-be14-9a597d6aac37)(content(Whitespace\" \ \"))))(Secondary((id \ - c083591c-e992-4ac1-ab0d-78edb5cbbd8b)(content(Whitespace\" \ - \"))))(Grout((id bcddf638-1831-4d54-9d84-6aa42241399f)(shape \ + d5c969e0-6792-431e-b074-8827826108f2)(content(Whitespace\" \ + \"))))(Grout((id 5991e71b-b4b1-4482-9784-ae273a6102e4)(shape \ Convex)))(Tile((id \ - 57306077-9487-4e8a-ac8c-dd6282a2e2fe)(label(->))(mold((out \ + 6a81dc28-84d9-41a5-a122-27e7d6d2dc4a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 18f65da1-f47b-48b0-a3b3-ad48a22be0d4)(shape \ + 7cd82c1f-9951-486c-aece-5537007ede80)(shape \ Convex)))(Secondary((id \ - fc155d3b-9901-46ec-b6b5-b965f76edd21)(content(Whitespace\" \ + fbe47a62-a6e7-4580-a7c2-ee6c516e044d)(content(Whitespace\" \ + \"))))(Secondary((id \ + a4f58f66-1aac-4a3a-866e-260f6b8c3020)(content(Whitespace\" \ \"))))(Secondary((id \ - 27f08074-2223-4516-b6a8-c93e23185ae3)(content(Whitespace\" \ + 468c830a-f36a-41d3-bca0-d5e203cfd9f9)(content(Whitespace\" \ \"))))(Secondary((id \ - 08f152f5-e8c7-4bab-a052-faf148f5c1e0)(content(Whitespace\" \ + a40f53f5-9dd4-4a15-9fd0-44d9e83e79b1)(content(Whitespace\" \ \"))))(Secondary((id \ - cdd118f1-7410-4183-b8e2-36a1e7683b85)(content(Whitespace\" \ + 29e4a103-847a-445c-82b6-52f6c54ad7da)(content(Whitespace\" \ \")))))((Secondary((id \ - 03e67cde-b136-4d3c-8416-900b1dd6fd7f)(content(Whitespace\" \ + 917381e3-6d3b-4275-8e13-9ebdde15ae75)(content(Whitespace\" \ \"))))(Tile((id \ - 594f6b9f-efdf-4d10-a252-f3189c1e813c)(label(fun \ + 1a04c79e-0f7f-42ed-ac40-b93394f12631)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0631c415-c1db-426a-97a4-587814e54118)(content(Whitespace\" \ + b27eb762-a874-4dcc-9fd4-b2b9bd1a9ec8)(content(Whitespace\" \ \"))))(Tile((id \ - 69df4530-5eca-4452-86ab-b1e53c355e4f)(label(a))(mold((out \ + bcd7f101-d67e-458e-b55c-8aa3051f32bb)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f89d426c-946b-4045-a4a1-afed0e92bb26)(label(:))(mold((out \ + 9ad940ed-bef7-44ab-9cb0-618034dad0c6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 77cb9da2-f7ea-4978-a386-bed632465fd7)(content(Whitespace\" \ + 8ff2c6ec-1259-4d1d-a73f-069dc7176a60)(content(Whitespace\" \ \"))))(Secondary((id \ - 1e5a5975-6df0-48c1-ae48-fab9c631fdb2)(content(Whitespace\" \ - \"))))(Grout((id 53fa57a4-cc97-48b4-a8cc-c9c8daf1fa3a)(shape \ + f7ca66de-f307-45bf-b733-6a27598bd228)(content(Whitespace\" \ + \"))))(Grout((id 5222d1eb-91a0-40a5-8374-4362ec54269e)(shape \ Convex)))(Tile((id \ - b29aadd6-ac36-4f96-a5dd-b87ddde0cc39)(label(,))(mold((out \ + fa65330c-032c-4bdc-be72-60d2c19c5515)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 4b991c76-6ed3-497e-aab1-a10f8c26496b)(content(Whitespace\" \ + 11aa06f6-cbf1-4a10-b8e6-3a81f2282f65)(content(Whitespace\" \ \"))))(Tile((id \ - cef1b5b1-deda-4fcc-83e1-ceb9676ccb91)(label(b))(mold((out \ + 9a36f1c2-5edc-4cc7-a74f-a5262554f0f5)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 70bccb6d-c441-4645-a3a6-8db7070f4c34)(content(Whitespace\" \ + f28ac6f7-38b2-4450-895a-d0f68f224fd8)(content(Whitespace\" \ \"))))(Secondary((id \ - f5ead7c9-7fbd-4c3c-8fe7-d0c1a1909738)(content(Whitespace\" \ + e64b7753-13d6-4874-ab8c-c4eef4c2840c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ccdb17df-9183-4c15-8ade-401c1e18a00d)(content(Whitespace\" \ + 26031709-475d-4861-81dc-e80bb5293980)(content(Whitespace\" \ \"))))(Tile((id \ - e1ed7eef-11fd-4ddc-9e94-dbf94b5372c0)(label(a))(mold((out \ + e8bb26f5-7792-4ac4-9dea-d001e93bb861)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6c5eb260-4dae-4cd8-9e04-9c0ad8b777b8)(content(Whitespace\" \ + 9d1686de-5dc0-4382-9f1d-e64add1e0836)(content(Whitespace\" \ \"))))(Tile((id \ - 050082f9-8db6-4a10-bc9f-36864f2eb100)(label(+))(mold((out \ + 708c6b62-ec64-4756-a390-c339b6a5bdad)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fd2f7ec4-e69b-458a-b36e-19549847b639)(content(Whitespace\" \ + d0126896-2093-4a1c-9331-a50b4b339513)(content(Whitespace\" \ \"))))(Tile((id \ - e3f57c85-dbdf-4084-bc1f-849a437133cf)(label(1))(mold((out \ + eb086815-ad0d-4e96-a4c7-a0f7d75c113c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c7bbcce4-d144-4804-b1fa-4bedc65b2119)(content(Whitespace\" \ + a3ab4231-46af-444f-b0f6-032ae139b578)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b302da3e-0301-40f8-8f3c-a0b5b4554377)(content(Whitespace\" \ + ac89534d-4f51-4f5b-954a-0c4ef1db3098)(content(Whitespace\" \ \"))))(Tile((id \ - 849d2bea-dbc3-44cc-b4aa-9bef31b0a35a)(label(f))(mold((out \ + 173223c9-5720-40b4-913f-7998d41105b9)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ee8f2264-870c-47a3-a7a4-215771332d67)(label(\"(\"\")\"))(mold((out \ + f93531a8-8da2-4623-8d44-39df361554d5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a26377b4-8bd9-4ad5-9d58-7a42cba54d48)(label(1))(mold((out \ + 3b6568d7-3062-4763-a201-3343957ff3d8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 466c0cb9-3337-4574-859d-6278a5026893)(label(,))(mold((out \ + 2f5a6aaf-b092-4c58-b419-5865967b888d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b0fd0f95-ee10-4814-bbde-8e447199efc0)(content(Whitespace\" \ + 1bd2aef2-5f34-49a3-80ae-47de3ffe6e20)(content(Whitespace\" \ \"))))(Tile((id \ - a1098e42-6852-46d1-aa87-4c8df4f362dd)(label(2))(mold((out \ + 0b740331-4b0a-4e2b-8b56-cce39774b935)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c7399831-7b11-43a8-b4a8-63ae7cd72779)(label(\";\"))(mold((out \ + 22583b1d-a3dc-4cc1-a660-1474e6cf0172)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8c7db2a8-a7bd-4c58-bff4-9b130bb3b85e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4fe518de-a7d0-4166-896e-992364d9e7a5)(label(let = \ + 913e9b67-b810-4f88-9542-c93baf9535e7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f0c54c7e-e7ed-4f1b-8a2f-0e0ae502cb8f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e5aba834-40fd-4e64-a0f5-960f93e92ee2)(content(Whitespace\" \ + dd0ead85-35f6-485c-abdf-01592a532b75)(content(Whitespace\" \ \"))))(Tile((id \ - 9ca20ad4-adb5-437c-8b5c-e11e0c228d0d)(label(f))(mold((out \ + 9721ed47-b932-4a72-bb7f-bba6f29bc895)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ed8463e2-e66f-4493-9c5c-d5d9926de2c3)(label(:))(mold((out \ + 93a5e7e1-6ff1-4332-bccc-eab69074ada8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a15bb011-cc63-4a2d-84e0-c515238725d8)(content(Whitespace\" \ + 53a7580f-36d0-44fd-88a0-a946f408724e)(content(Whitespace\" \ \"))))(Secondary((id \ - 7c049d48-f3fc-4b52-9fd7-99ba269cf387)(content(Whitespace\" \ - \"))))(Grout((id a408e3c2-69eb-49bf-a0fb-2ee615868eb4)(shape \ + fc19cda9-5518-4a30-b7b4-691cb41bb0a9)(content(Whitespace\" \ + \"))))(Grout((id 0ed4e28a-96e6-47fa-a873-0ce1a7ca41bc)(shape \ Convex)))(Tile((id \ - 52eb2640-38d6-46db-b623-27cb56f4c728)(label(->))(mold((out \ + 74f87761-a327-4d21-844e-2cc249a3e722)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - dc45c658-bebc-416c-8c3d-cb8fcde81c18)(shape \ + b996df8d-2912-4ea7-8b22-9f57a4e84ec3)(shape \ Convex)))(Secondary((id \ - ab1f6fff-dba8-47b8-bb7e-691a34a83462)(content(Whitespace\" \ + 17d920d2-a18b-43b3-a1ba-90bd3c7d2001)(content(Whitespace\" \ + \"))))(Secondary((id \ + b87f7dae-6fe9-49b5-b1d7-791876b5d2d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 3d01ba4b-cbd3-4354-9450-0d0f40e985f8)(content(Whitespace\" \ + cf2cf415-6e87-46bf-bd01-62b7247eab78)(content(Whitespace\" \ \"))))(Secondary((id \ - aae3c458-224d-49be-866c-a099f1f03212)(content(Whitespace\" \ + 3421cc3a-ae54-4fb6-b641-5243bd1235f6)(content(Whitespace\" \ \"))))(Secondary((id \ - b9be9d94-3b41-4ef2-93c5-bdee3ec41b4f)(content(Whitespace\" \ + 9d5550b8-33e8-4d15-9a36-25500b9c3c0d)(content(Whitespace\" \ \")))))((Secondary((id \ - 78353ed0-7ca7-41c4-8f3c-c4b272719a76)(content(Whitespace\" \ + 38123bbf-a8c5-4134-8127-e7099abfad6d)(content(Whitespace\" \ \"))))(Tile((id \ - d8139083-bc22-4686-bd2a-2cee472b8a3a)(label(fun \ + b47d518b-c18d-4409-80a0-c896b2c04a22)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7ab0cb62-5e4a-41bc-915e-afd27e5d0d55)(content(Whitespace\" \ + d407247a-3cd8-4bfb-b03a-ffa207457c0f)(content(Whitespace\" \ \"))))(Tile((id \ - 011f90f4-3d16-4c35-8255-95e293abade8)(label(a))(mold((out \ + 605c4ae1-95e5-48f6-a0b7-13f9b792a60a)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3477d21e-4fa7-49b7-ad9e-bf2520148f6a)(label(:))(mold((out \ + efdcbd71-2f09-4272-94ce-a50d047cda39)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c41eaaf5-07d0-4098-a337-bd819093c711)(content(Whitespace\" \ + ab734cad-524b-4de1-868c-12c3843405b3)(content(Whitespace\" \ \"))))(Tile((id \ - 8bce6618-567a-4b43-a89b-28df2d53eb99)(label(Int))(mold((out \ + 0e58d366-e414-43ca-914a-482ce79d1db0)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e78101a0-0004-4081-b5d0-27557f519fc0)(label(,))(mold((out \ + 246729b5-e397-4814-a3aa-3a88c8b60cac)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 5182eb13-4233-4b23-84dc-990b2ab04d5a)(content(Whitespace\" \ + cabd8d8a-9450-4322-9450-9f8a6c1760b1)(content(Whitespace\" \ \"))))(Tile((id \ - e0b00135-59a1-4024-87f1-409f3b2db3e7)(label(b))(mold((out \ + 6fe9f703-34fe-4024-9a4e-334b5548f61f)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a2d37aea-8dae-4a56-8d77-e1cef82c1786)(content(Whitespace\" \ + f0eab0f9-ee8a-464c-9ce4-05e0c16b6a84)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0c279aa3-6ae0-49d9-92a0-5f7cdc3935a5)(content(Whitespace\" \ + 92dd92e9-e9d4-4e72-a81d-6c60bbebb5df)(content(Whitespace\" \ \"))))(Tile((id \ - fdddf2dc-29d3-4de4-b4e1-8e6f41e59cc2)(label(a))(mold((out \ + d2d0bc8d-e12a-4e5c-b3d3-8ecb0350e3f4)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c073676a-71df-443a-9e72-da1f350660c2)(content(Whitespace\" \ + 9094e003-b8ab-40cc-a5a4-1ae33722084f)(content(Whitespace\" \ \"))))(Tile((id \ - ada4fda0-4927-49fc-ad91-604da1b62b70)(label(+))(mold((out \ + 376b1959-4013-4e21-85da-8ee6b4696c06)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 147b5873-b304-4468-9d7e-c5a75b80bd3b)(content(Whitespace\" \ + 9b74d115-7af0-441a-a728-8e68aaaaa3ad)(content(Whitespace\" \ \"))))(Tile((id \ - bd5eeebf-1765-4114-8002-0b81da4a38e5)(label(1))(mold((out \ + 542fb2e0-6d43-49f0-ad48-1eb37babd095)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9af3cf95-9dc5-4fb4-8fc1-a47724d106c0)(content(Whitespace\" \ + c5fc87d9-58d4-41b9-9c0c-1552eebc7b1e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 48afdf6b-5496-4127-82da-b35502f7b68f)(content(Whitespace\" \ + d3fcb46c-58b5-49ae-ba6c-27d93650bbb1)(content(Whitespace\" \ \"))))(Tile((id \ - ec01553f-fd03-443d-a604-2ce116ccd4bc)(label(f))(mold((out \ + 3c0a53c8-91e3-418e-86a8-282d80a48538)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - eda0abf8-8a4a-4a79-b4bb-1aec209951a8)(label(\"(\"\")\"))(mold((out \ + f624e90c-dc4d-4102-bfc7-415759cd74f8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5e3089f8-06ca-4e3c-a551-5c56157012be)(label(1))(mold((out \ + 0bc8dfab-0eee-4ca8-83ae-58e5ebe71246)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2b7ded3a-13d7-44de-a711-bc1d662aa427)(label(,))(mold((out \ + 4dcb54ea-eac4-442b-866b-c3cc047b3c50)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ca84afef-5e9f-4053-919c-d670e5eb8671)(content(Whitespace\" \ + 3af47f19-2b75-48b1-9d20-7c3e87d1d397)(content(Whitespace\" \ \"))))(Tile((id \ - 42226930-77c1-4611-b1e5-2da13817e7e0)(label(2))(mold((out \ + 4c69f1c5-2159-4244-b85a-fe8a7624cdd3)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - e99e8e0d-d282-4fa1-a3e7-28fb84ad21e1)(label(\";\"))(mold((out \ + 395ff835-cd43-4f7e-804a-8f7751d883c6)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1589e905-70e9-4637-9f6e-914d38bc78c2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 426d3563-9955-4e7b-b079-74a00facdecd)(label(let = \ + 3822a97c-909e-4e0f-9783-aa511ae2e4be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dbc95f6f-0dac-413b-9a57-875c91d1bc19)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ec843bbd-3324-4ef1-8716-f39abb579a49)(content(Whitespace\" \ + 6d4f1f2b-2cb6-4a54-855c-eba41992f09a)(content(Whitespace\" \ \"))))(Tile((id \ - 49733db8-ac26-4cb1-a31f-5aee5529d790)(label(f))(mold((out \ + b2f91c33-d0b4-4a42-8bdd-cb318b160df3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7730c6f6-b7e7-490b-80e2-3e43a8c9be89)(label(:))(mold((out \ + 3f84fcc2-2c28-4b76-b9c4-7a12a043ddb4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a73d87f7-4d17-49d6-9567-b64018e79136)(content(Whitespace\" \ + 870ec8b2-886e-42ec-a35a-efd1ecc926ce)(content(Whitespace\" \ \"))))(Secondary((id \ - 6ce66a60-c5bf-4482-8dac-c5342ee5a2e3)(content(Whitespace\" \ - \"))))(Grout((id 98c8f209-4e72-4f1d-945f-bad1d13fcca0)(shape \ + 4ef72b5a-1f48-41d1-9c08-e4726c798517)(content(Whitespace\" \ + \"))))(Grout((id 1de99ca5-1fcd-4073-a10c-b0bbb595db3b)(shape \ Convex)))(Tile((id \ - 1ed7f780-6d10-4a24-b09d-d82168312778)(label(->))(mold((out \ + 3254d589-fc8c-44bd-af59-b32f30bf2194)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 73566dee-36c4-4f0d-9ad7-b26190fe4d04)(shape \ + 802da816-8705-4c69-b8ad-10e81ab6d78e)(shape \ Convex)))(Secondary((id \ - bff6abbe-8ec2-49fe-bfb6-56dc3a205006)(content(Whitespace\" \ + 28b6de81-ebd9-49a3-8e14-f7ad344fe62a)(content(Whitespace\" \ \"))))(Secondary((id \ - 54c74bfd-329b-4464-b0bb-03749a70ab44)(content(Whitespace\" \ + d2866f2b-fb55-4a40-b3f6-c0e1985552a4)(content(Whitespace\" \ \"))))(Secondary((id \ - 7b1e3324-724b-4771-bea6-9a8212a01b2a)(content(Whitespace\" \ + a51a2228-de9b-48f1-83a5-7cf73dc96f6c)(content(Whitespace\" \ \"))))(Secondary((id \ - 5254184f-2967-4ebf-9ae5-c475273f11cb)(content(Whitespace\" \ + cf7a673a-7e78-43fd-a753-9c1a93382419)(content(Whitespace\" \ + \"))))(Secondary((id \ + 51870ac0-3cbd-4f8b-8f9c-0aefe4224d1a)(content(Whitespace\" \ \")))))((Secondary((id \ - 4eadaed1-19e3-43d9-ba0c-eff6b781121d)(content(Whitespace\" \ + 005e18cc-6749-4a8d-85f5-513cf98bcbf1)(content(Whitespace\" \ \"))))(Tile((id \ - 107e386f-a18a-4b34-9e7e-2a3dba62893e)(label(fun \ + b569b6f7-d7fc-4248-b301-16d955623be9)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c7fcef59-2b97-423c-af92-c8732761ceb9)(content(Whitespace\" \ + e22cb4de-e71f-437c-aa78-7dbddaf539b9)(content(Whitespace\" \ \"))))(Tile((id \ - a8363bf3-c579-4be1-b94f-3a35c0767014)(label(\"(\"\")\"))(mold((out \ + f1cf30d1-5648-4a00-ab7f-3a6ddd790203)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - f4f2cc02-0f0b-44c8-955b-65bae06c3092)(label(a))(mold((out \ + 644e9674-214f-4d11-8679-6d3d920cc2ea)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2244a42f-e0d5-42bf-94b2-2b8a14d3e6c2)(label(,))(mold((out \ + 01fecc9f-f74c-4505-b970-87738e766bd1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ed593dfd-4be1-47cf-8a93-9b2fddfe8668)(content(Whitespace\" \ + 786d94c1-6e02-4925-b04d-a4a76d0d4e62)(content(Whitespace\" \ \"))))(Tile((id \ - 85a59389-595b-4621-9926-812a7c0f0929)(label(b))(mold((out \ + 2cc9c805-a00e-444f-a440-fbfa3d63c99d)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - b08d1286-8c83-4666-a6d6-bc822e9c5dbb)(label(:))(mold((out \ + bcada562-fe9c-4f83-acd4-416e41ef4546)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 453f2b50-ba8d-4ac2-96cc-9585f96365f6)(content(Whitespace\" \ + 54b24744-488a-457e-9abf-f70d4947bf8e)(content(Whitespace\" \ \"))))(Tile((id \ - 7d61967a-95b0-4542-8bd3-c81528db1bf5)(label(\"(\"\")\"))(mold((out \ + 14508377-cc9d-420b-8d68-d7d5a7fd35c0)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - cb4fc898-fc33-486c-adc3-9715e5baef41)(label(Int))(mold((out \ + 501dfb3c-f396-46d9-8838-380c842b63e3)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 7f5a8891-c67b-4f50-adfe-aa619cd21c1c)(label(,))(mold((out \ + 58d2c431-0b68-485f-9fa5-3fbf8823a165)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - c705631b-475f-4929-9eb9-95536c0057fa)(shape \ + e06415ce-d4ab-499d-ae69-a6e703a8cfdb)(shape \ Convex)))(Secondary((id \ - dd3c1293-547b-465d-bd30-0437c0435908)(content(Whitespace\" \ + f6a37369-b94e-436a-8e0d-4c9252b3301b)(content(Whitespace\" \ + \"))))(Secondary((id \ + f1cb0bef-e154-49e4-afd3-af4d1b9d40b4)(content(Whitespace\" \ \"))))(Secondary((id \ - e47ab165-90b1-4e1f-b9aa-9261a91e1f72)(content(Whitespace\" \ + ef3492bf-4a17-47b4-80a9-c3830ce5ee6d)(content(Whitespace\" \ \"))))(Secondary((id \ - 436e0e52-f172-4a95-95cc-4a981a8543a9)(content(Whitespace\" \ + 482b5e91-502e-4c58-b4c1-3cbb5a938642)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6811383f-93c7-4022-90f7-a615a7aee617)(content(Whitespace\" \ + 6cfb4cb5-8066-4a65-b197-b4155ba475f8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 80348f1e-4497-4eb8-84b4-bb65c0a28175)(content(Whitespace\" \ + e547925e-3719-4132-a268-711329c13791)(content(Whitespace\" \ \"))))(Tile((id \ - 395854d4-c109-4080-a3fb-84fb6708e4b0)(label(a))(mold((out \ + f989002e-7cf8-4163-93dd-1043941820c0)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d9e6ef0f-5f0e-4ae9-adbe-e5f1d10dc4f4)(content(Whitespace\" \ + 35b2a690-ccac-466f-b90e-d651f823e56e)(content(Whitespace\" \ \"))))(Tile((id \ - ff036928-c230-4190-b77f-37437ea47a24)(label(+))(mold((out \ + 18e0b965-1d34-45fd-9a69-9158d8099c33)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 208f3e4f-acbc-43a4-9426-ab471b516b5b)(content(Whitespace\" \ + b6a82bdb-5fe5-424b-a63c-3edcfb0d08a9)(content(Whitespace\" \ \"))))(Tile((id \ - 09da4585-2795-4c96-a39c-74477efc7830)(label(1))(mold((out \ + b7ed8465-5cd8-45ba-a30c-43f845b03341)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7c4655fb-b81c-4f44-abae-8b6340412a12)(content(Whitespace\" \ + c1b1e3c2-2c9d-46e5-9053-b0d14f2174e7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9ab1c99f-9c2a-444e-a933-a0a1d7a81816)(content(Whitespace\" \ + a391afd6-6206-4a8b-9173-eda0124c5248)(content(Whitespace\" \ \"))))(Tile((id \ - 498345d9-4e06-49a8-bd5f-f2b8e5c68421)(label(f))(mold((out \ + 04785cf3-a023-4724-b495-a2a5567ff327)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7711aafb-5e26-41c1-952c-5b795aae0f91)(label(\"(\"\")\"))(mold((out \ + 86485503-96d7-4ed0-a017-983fb191bdf8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 70e3c5c6-6f79-4e21-bccf-a7260e28b88d)(label(1))(mold((out \ + d97768d7-25f9-4967-821c-297c36c93d98)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - daf45ebe-fd82-4fba-a5fe-47326eb9ceb6)(label(,))(mold((out \ + 036dab2e-58df-403a-98e5-a994434a3bdb)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 16903195-51ff-4738-9cd8-a0d237ec6781)(content(Whitespace\" \ + 465c6146-c520-45ac-93b5-bc90b0691b53)(content(Whitespace\" \ \"))))(Tile((id \ - dadcff18-d860-458c-9494-644a535ec6f6)(label(2))(mold((out \ + 91f7f8bf-5c5a-442f-9ea4-6f0a90e35e06)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 3a8ce154-f251-4b34-9e3d-db8429e8d79a)(label(\";\"))(mold((out \ + bb0c1e89-3047-414b-b445-dd343fe3f874)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3d65585e-3e34-4462-9ed3-c4c93371b8d7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bc66001d-553e-46f7-8d59-c6b6de375d88)(label(let = \ + e0011fca-0dfd-4ec7-a74f-0d8a3cdb2eff)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0a16c719-e6b8-4ae8-8602-074ee1ce69f6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e2323d0c-9769-495b-ac9c-393e2fe33762)(content(Whitespace\" \ + 804b57a4-e5ad-4f42-b1d9-9293f223c724)(content(Whitespace\" \ \"))))(Tile((id \ - 9dab995e-0e0e-4430-9823-4f4284ae4007)(label(f))(mold((out \ + d19a1997-d322-426d-8293-84a4064730cf)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 01fe2842-26db-4b65-9301-6c1dce9cdd61)(label(:))(mold((out \ + b1243561-3961-471b-93fe-f531c58d48e7)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a46ab23f-3200-4016-aacb-31954acc9f72)(content(Whitespace\" \ + 6bee335b-b841-432e-9933-0c984252ede6)(content(Whitespace\" \ \"))))(Tile((id \ - 44a710b7-81ed-4db4-9e20-4c6c0f488109)(label(\"(\"\")\"))(mold((out \ + e9d13a71-fd23-4b27-a9e9-d5a395ce52d8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 61d6db40-68da-4abc-a3e9-77bc5fd7d4e2)(shape \ + 52eab2a5-dd03-4361-b914-9c6ed6fb05e1)(shape \ Convex)))(Tile((id \ - e7a63eee-c6cb-47b4-8072-3aa33cf5376e)(label(,))(mold((out \ + da2dccb5-7ad0-4606-9e5b-24011989db77)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 33970745-8987-412d-a3c7-74eaab1914d4)(shape \ + 7c1c45ff-5fad-4ba5-b5ae-85f245d8c58e)(shape \ Convex)))(Secondary((id \ - e94a703d-9593-4691-a626-a997c43adc93)(content(Whitespace\" \ + ab0a9027-fc24-4ca9-8b7f-5898fa85bdba)(content(Whitespace\" \ \"))))(Secondary((id \ - a179d7be-c198-42fb-854d-72cebcc39ddf)(content(Whitespace\" \ + d6f818d4-12ab-4e67-ab8d-93f1fbc63c0e)(content(Whitespace\" \ \"))))(Secondary((id \ - 105bad3b-5e73-4abe-9c86-8b148b9e6357)(content(Whitespace\" \ + b365e442-ce2f-4881-98d0-1b4026046238)(content(Whitespace\" \ + \"))))(Secondary((id \ + 85ce8539-faf3-48b1-a5ff-af55970e644c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a079c66a-9124-44b8-b183-96d4ae609ebc)(content(Whitespace\" \ + b4431d08-0ed8-4bc4-8e01-83476e937af1)(content(Whitespace\" \ \"))))(Tile((id \ - 4575be30-e6c8-486b-ad08-661b0507e239)(label(->))(mold((out \ + 776b88a1-6a5e-4c61-bfee-61b48058cb19)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 3bf7b03c-c751-4b39-989f-a831a353f253)(shape \ + ed55839d-6dc1-4f04-8664-17a5cf5f7644)(shape \ Convex)))(Secondary((id \ - 942a4a7e-6c8a-4aa0-8d26-8a6a6ed90c53)(content(Whitespace\" \ + 794f9424-8d84-4c66-8436-da7e719d51cf)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9e35d395-af06-4e46-b702-695394335802)(content(Whitespace\" \ \"))))(Secondary((id \ - 13b0a988-5a67-41a5-aaa5-bb81cd1aaf25)(content(Whitespace\" \ + ba13bb65-b990-43fc-bef8-4a54908611d0)(content(Whitespace\" \ \"))))(Secondary((id \ - 0a7315bb-879e-4dae-885f-26b1044d6a6d)(content(Whitespace\" \ + 4a0c3966-55c4-490b-a893-a0ab692bd113)(content(Whitespace\" \ \"))))(Secondary((id \ - 9d4e8047-0e1d-4219-ab29-8868c9ac55ca)(content(Whitespace\" \ + 3c2f3ae2-6252-4faf-b153-ebddd32605a6)(content(Whitespace\" \ \")))))((Secondary((id \ - 72a0e204-0be8-48a8-b0f5-4d3d3ca12152)(content(Whitespace\" \ + a23ce396-a5e1-49e1-8344-a2fb1fcee0dc)(content(Whitespace\" \ \"))))(Tile((id \ - b58d5f05-4e5d-433b-b717-6c236baa06b2)(label(fun \ + 408e94b8-448d-4799-ae58-2230a86db98e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ea7a02d9-3bd6-492e-83cc-11a5846c6097)(content(Whitespace\" \ + 15117fe1-bcaf-4b56-9a15-01df91847a3e)(content(Whitespace\" \ \"))))(Tile((id \ - 61612e92-a360-42b0-9bdd-cfc1e0a6352f)(label(a))(mold((out \ + 64bdf45b-3110-4037-9f09-64a644be429d)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a3e5cbaa-13fe-4969-99f9-8746749bc5cd)(label(,))(mold((out \ + cc12782b-2a38-44f4-93ca-092f94e27c86)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 788d2df8-796c-43ad-91a6-012f307c8d25)(content(Whitespace\" \ + 717232e9-1ce3-4caf-be52-0957da124dc4)(content(Whitespace\" \ \"))))(Tile((id \ - 46ff2fb9-d781-45e6-9de2-7182d2e895cf)(label(b))(mold((out \ + 3ea5fc7b-03bb-4029-85bf-318eabc68207)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bf203cce-4173-49ed-b107-22e0a135a50e)(content(Whitespace\" \ + ef6659b0-9d3c-4018-af64-4c990e77cf00)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 49a5545b-97ec-41f1-809c-52ea8331a64a)(content(Whitespace\" \ + 94106d2b-323f-485a-a3e1-76c8e0967ac2)(content(Whitespace\" \ \"))))(Tile((id \ - dc36cc09-b786-4f6b-bdac-ab7ece25ef46)(label(a))(mold((out \ + 8c52a3d3-a1a8-449f-b12f-b425ba640e16)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3a6dd01b-3733-4527-8e5d-ca4b821fe607)(content(Whitespace\" \ + 740c5794-82ff-4682-bc1b-196bfc039643)(content(Whitespace\" \ \"))))(Tile((id \ - 8981ad87-7b7b-4b58-bf00-f6d9e79506f7)(label(+))(mold((out \ + 0350f5a0-85f5-444b-920f-26294eab140c)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3e8c9546-17bb-49b3-ab2e-f6eb123e5f1f)(content(Whitespace\" \ + 1828398b-0858-4850-a283-5e5d7cfc1d8c)(content(Whitespace\" \ \"))))(Tile((id \ - fcf56690-e195-4ca9-b443-e0e9ad518be9)(label(1))(mold((out \ + bab4e21f-f6ce-4c13-8560-9cade7290a25)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 57aca788-8fa8-476d-bb63-4209e540e44b)(content(Whitespace\" \ + 9a974c5e-b836-4adc-9949-11c3449f7514)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ebe462d4-ba0d-4be2-b4e1-443e710cfdaf)(content(Whitespace\" \ + be9ff373-e7ac-4dc1-ace7-d25ea830ff61)(content(Whitespace\" \ \"))))(Tile((id \ - af25e769-bfb2-46da-a17b-2f4790018825)(label(f))(mold((out \ + 4020ff3d-a6b5-4fe8-b0a2-c4108f7f5fbb)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 95c2d07e-1e4e-4c88-924b-7812745f557d)(label(\"(\"\")\"))(mold((out \ + 5fa91144-8aa5-4bb0-9e16-8a80b0199d1a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bea0ec60-d1ba-411d-b024-de700ef95c61)(label(1))(mold((out \ + 13d276a7-8b38-4fc2-80aa-c66c4df6c4fe)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e4a2bd49-cb22-4ed4-88f1-f9c5ce3c2611)(label(,))(mold((out \ + f073e364-7311-483b-a162-22c31e0dcbc3)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 056166d3-e6dc-4403-8931-c2ed56abb68d)(content(Whitespace\" \ + 3b924d1b-da65-4f96-a649-32783c12fa4d)(content(Whitespace\" \ \"))))(Tile((id \ - 6da2ad63-a0ab-427f-ad07-fb3d75354b47)(label(2))(mold((out \ + 9ce3031c-1ed5-4c08-be33-e8e003040023)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 77084eff-60a6-4f6a-ba97-b35e696da51f)(label(\";\"))(mold((out \ + 6b955a59-ba44-4b65-99c1-1418fb72ef21)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f782a013-491e-4079-8f25-c2d6abae34d5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6049c33f-b1e0-48d2-9089-baab0185b9ba)(label(let = \ + 954c6c0f-e515-4725-808b-2f4220144f8c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 741f0667-79a0-4c27-bd96-bbea5a774a54)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d0df6431-69ab-409b-afcb-2787b058c85e)(content(Whitespace\" \ + 3f8879c2-d63d-4bbb-b102-47e9875b6860)(content(Whitespace\" \ \"))))(Tile((id \ - f78df769-2f64-473d-9ea9-004d37e02a68)(label(f))(mold((out \ + 2344e263-fbe9-4cda-abfc-5f3a9161c3c6)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9bef26bf-ffaf-46a1-b64a-eb3ca135c691)(label(:))(mold((out \ + eb9b1a49-91b3-42db-8c6d-f8f76e750af4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a5c36d31-61c9-4cb5-a516-07a467c334aa)(content(Whitespace\" \ + d3470c02-0b2b-43cf-bdfc-25ea54aac84f)(content(Whitespace\" \ \"))))(Tile((id \ - 6733d7a4-18eb-4609-9cc2-7770e92cbe36)(label(\"(\"\")\"))(mold((out \ + 47f24a67-fc77-4416-91ac-d211e6490e28)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - f1309a56-6623-4622-bd62-dc2b03666722)(shape \ + 72803098-a0f1-411e-a6cb-9d1b1c25b8a2)(shape \ Convex)))(Tile((id \ - dbfca95c-26c7-443d-af2b-bea74a2fecd0)(label(,))(mold((out \ + 0dba3d2a-ec6d-4f24-81ab-386ef5224508)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 3e497aab-8a37-41d8-b461-6e5c38497b2a)(shape \ + b91b91be-7cd8-413e-b8e5-11c9efb23b15)(shape \ Convex)))(Secondary((id \ - f6c23c57-a8d2-46fd-a6d5-53cdb5ddc1e9)(content(Whitespace\" \ + 4e08ce96-0ea2-4a03-8d8c-3faa133cfcad)(content(Whitespace\" \ + \"))))(Secondary((id \ + fcf2f592-3e3d-470e-aba3-f554bad5356b)(content(Whitespace\" \ \"))))(Secondary((id \ - 6cc495fa-6fa2-45e8-9f24-f1c55240a0f4)(content(Whitespace\" \ + ebd88262-8e27-48f9-acf3-b6db69ad9588)(content(Whitespace\" \ \"))))(Secondary((id \ - 9b2e62e8-2702-49b9-8752-17576dfcc74f)(content(Whitespace\" \ + f66b9c8d-019c-4a90-9743-7fe7134e7d06)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9d49aa99-4823-488b-be71-ed09aee42c79)(content(Whitespace\" \ + a9d5ea5e-2fd7-4231-8811-cffb5f1211a9)(content(Whitespace\" \ \"))))(Tile((id \ - 7e4cdbc0-d775-4c11-86b1-fd39027efcb4)(label(->))(mold((out \ + 4a11b5ae-5814-4b5f-806d-fe716d6cd067)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 303fc384-f4b2-476b-92ca-443acdeac8cf)(shape \ + fe02e4f1-7076-466e-91be-c6171bd1c719)(shape \ Convex)))(Secondary((id \ - ebbd1079-da67-4a2b-ae20-cb29372e0601)(content(Whitespace\" \ + 0fea00fd-2a8e-401f-bd2e-0ec7d68ef841)(content(Whitespace\" \ \"))))(Secondary((id \ - 461e4e53-be52-4803-a22d-1774daedd411)(content(Whitespace\" \ + efa5207b-754c-4739-87c3-db220c259c2e)(content(Whitespace\" \ \"))))(Secondary((id \ - e1b135a2-d878-44bf-bed1-269463fd9827)(content(Whitespace\" \ + a6a915cf-6d19-4ad3-a394-5630e091cb36)(content(Whitespace\" \ \"))))(Secondary((id \ - 85cdf1ee-632b-4427-9bb2-1df99bac31fa)(content(Whitespace\" \ + 488311f0-d58c-4c08-baaf-c5a021605e58)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9af43606-b1ff-4096-96a4-aa061492c9e3)(content(Whitespace\" \ \")))))((Secondary((id \ - b01b9ef9-e760-4f36-aa3c-47d542322385)(content(Whitespace\" \ + 72286cbc-1586-45ab-acbd-831dcef7356e)(content(Whitespace\" \ \"))))(Tile((id \ - f57afa48-0b85-4df8-b585-48aa1b27a8f2)(label(fun \ + 28395633-07ab-40bf-8a0e-f1cf33ac4364)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 63484dd7-d313-4a7f-86cc-f763a2261cfa)(content(Whitespace\" \ + 07fc34a6-e37e-4af8-9585-d7cac87f19bd)(content(Whitespace\" \ \"))))(Tile((id \ - 055fd588-82fc-4f9a-9c89-1ba65b926f02)(label(a))(mold((out \ + c663a1d5-5166-449c-8a8c-f33b63652c5c)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 09e32d7a-cb91-42c5-a059-12fa7ccc7ecd)(label(:))(mold((out \ + 5d3e9a69-d15c-48c1-bc13-433923f251cc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1f654480-4ab4-4f0c-ab6b-f7a8e1f678da)(content(Whitespace\" \ - \"))))(Grout((id 46f7d16f-f68f-46c4-ac6d-f1fa58195a2d)(shape \ + 1e0e0dae-5435-4a5f-96b8-30ecbd84f935)(content(Whitespace\" \ + \"))))(Grout((id 530afce9-1d03-4fe4-ae88-6a4094d0b1ca)(shape \ Convex)))(Tile((id \ - 1028ab90-112b-4c70-b97a-ee0bbf92cf57)(label(,))(mold((out \ + 94233aef-7819-4eee-934b-7e7e41136c21)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 846f80e6-29e5-4e47-8daf-ae6583d1a010)(content(Whitespace\" \ + 28df4ae9-b956-41ac-96b9-37921c16ba2a)(content(Whitespace\" \ \"))))(Tile((id \ - eed68bd3-4e52-444b-8505-3c3f9bb2af53)(label(b))(mold((out \ + 15ef8426-a983-4b8d-ad31-e8dc4695c37c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8c0a1860-6a94-4ff7-ad71-897486e8cc48)(content(Whitespace\" \ + 1eee4812-6300-493c-b91c-8bcdac410000)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e52fe322-f595-4860-933c-3ec740c3ad22)(content(Whitespace\" \ + 9cce1083-a29c-406a-913a-b411aa0a867d)(content(Whitespace\" \ \"))))(Tile((id \ - ddedc239-d1f9-49e9-88d0-be9f9510d3f6)(label(a))(mold((out \ + 54271780-532f-46d7-8d8d-bdbfd943c10a)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8e5ce762-262d-4346-a637-4f88f9766041)(content(Whitespace\" \ + 6a9f7544-aa99-4453-8005-bb57f27065af)(content(Whitespace\" \ \"))))(Tile((id \ - 99764cfc-7746-4fbb-a6b5-3a8eb839ad38)(label(+))(mold((out \ + 7cb13d40-21c4-4886-b704-ca4d1540a644)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bb338045-ca4a-4f4d-beaa-50ca180cb216)(content(Whitespace\" \ + fe14cabf-9f0c-40ae-b739-e8caaf266ab1)(content(Whitespace\" \ \"))))(Tile((id \ - e164a61c-bdb7-4b00-9446-9954c9039b5b)(label(1))(mold((out \ + 10253db9-e295-4e30-b51f-81b0aa17d6f2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9e4373fa-16ea-4cfc-8f74-7597a053a815)(content(Whitespace\" \ + 4f8f2341-c0db-4772-9417-3c903f090689)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6a218fb6-b4bb-4039-833b-51089a549632)(content(Whitespace\" \ + 20afd105-6686-4952-8f39-c586e2117c4d)(content(Whitespace\" \ \"))))(Tile((id \ - f088d728-199e-485f-8f33-decac70928e8)(label(f))(mold((out \ + d303a86a-a801-4b4b-8e90-25d1b8357a91)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ffa07078-0f06-41eb-bc12-325ee845bc10)(label(\"(\"\")\"))(mold((out \ + e7595dbf-d4eb-4736-a3c9-ce6a68e5eda4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a651339c-dec0-476c-9bcb-3839a3dcd538)(label(1))(mold((out \ + 3d26e8b7-8786-4c95-b076-d8da4c6d7f6d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 49f7b439-e17e-4758-8486-b1652fbd9942)(label(,))(mold((out \ + 7dc46863-13b5-4677-a034-1f4dd0d1e6b0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 87f5f66a-8c48-4769-918f-43d83a69a305)(content(Whitespace\" \ + 00129298-79c9-44d2-8321-31fd74737cb0)(content(Whitespace\" \ \"))))(Tile((id \ - 08263235-73d5-435d-9ddd-399c592b44fe)(label(2))(mold((out \ + 8bdfae0d-2497-4531-be87-393573618a3d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 187e9b1d-44f9-4536-82e8-4375256213a6)(label(\";\"))(mold((out \ + 3ef219e5-fe9a-4c23-aaa4-9f20dc05c015)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d42ab740-3056-435d-bf08-e32784bb80ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d8970079-d4d7-44b4-84ea-fddb47f15d61)(label(let = \ + 02a2101b-a82e-4cb8-b24a-53d750216c90)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2f5e8f90-2224-4d16-a860-0c7d00780419)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - be6a887e-db96-41ee-9809-0ff7aea7cbe6)(content(Whitespace\" \ + c42ee223-5f97-4d88-a4c9-7b284590e739)(content(Whitespace\" \ \"))))(Tile((id \ - 265c62f0-244a-4c0a-8585-1a30e5d95093)(label(f))(mold((out \ + e10e2503-6206-40d1-b464-5105931c8f9b)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c5b3690c-8b37-4971-b0ab-09502d6eb34c)(label(:))(mold((out \ + 9c6a476c-fe73-452b-8450-d7dc9a141e66)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4515ffbb-37c5-482f-b7b6-da15343b53b7)(content(Whitespace\" \ + 7b153ae1-dcf3-450a-b553-f434c5930837)(content(Whitespace\" \ \"))))(Tile((id \ - 2cce24f5-7638-42e1-a46f-97cd78d22391)(label(\"(\"\")\"))(mold((out \ + c94179c3-10c7-4844-a48c-097655ae0b64)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 12fae552-acbc-4144-a99c-9ee06940b78c)(shape \ + 2dd4bdf0-376c-447e-87c7-2a763b5d8f87)(shape \ Convex)))(Tile((id \ - e49ee3d8-c564-48b4-a4ec-29939c236ab6)(label(,))(mold((out \ + 43a96673-815e-432d-86b0-fc1c73dbf8de)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4051c994-8c5d-44c1-8ab5-24a1d5ad73f3)(shape \ + 61e8a84d-5df5-447a-9c4d-cf828feac612)(shape \ Convex)))(Secondary((id \ - 7ae17503-e2f2-47c7-a393-cfa118448d73)(content(Whitespace\" \ + 3c11d380-9576-4ab2-a0e5-6c3669df819e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2c5d1c88-f521-4fbb-bc73-d421471d3a86)(content(Whitespace\" \ \"))))(Secondary((id \ - f581f576-6a47-46f1-bab4-cc0bb6306f60)(content(Whitespace\" \ + 4eb6f941-0f58-4d01-a538-cb6c4fb725ab)(content(Whitespace\" \ \"))))(Secondary((id \ - db194adf-0d7d-4c87-b69b-0698e2d35374)(content(Whitespace\" \ + d64110ac-2576-4623-be39-9f5e6176008e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fcb48981-a7c6-439b-b1d2-9b69472b38f7)(content(Whitespace\" \ + 28054157-7acb-4122-926d-0e95d271f42f)(content(Whitespace\" \ \"))))(Tile((id \ - 72857959-3cec-4aca-bd5f-f7c137d2f6f2)(label(->))(mold((out \ + 91efc9c5-4a90-4aa2-9264-df0a4cb8628f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 1faab939-8bb9-4e42-bbef-43b58da73001)(shape \ + 398b6b51-1a01-4ca5-8edf-b31f0bd1480e)(shape \ Convex)))(Secondary((id \ - 8b18ebb9-db8c-41d4-ac49-6e3c773dba2d)(content(Whitespace\" \ + 77d30d19-18d0-48f0-8682-132d5a445b24)(content(Whitespace\" \ \"))))(Secondary((id \ - c362fd7a-9737-483e-b967-a138dbdc9bf4)(content(Whitespace\" \ + 34975782-36b1-41e5-9746-eea1fbc1ea12)(content(Whitespace\" \ \"))))(Secondary((id \ - 022c4ee8-5c23-427f-8ef8-a9d8e7a6357e)(content(Whitespace\" \ + cebbb640-3c46-47b5-a4df-1101c9a4b76a)(content(Whitespace\" \ \"))))(Secondary((id \ - fcc383ce-4242-48b4-8d0b-b136db9eb497)(content(Whitespace\" \ + e67262c9-9e7b-44cd-8886-0a7cbb291e59)(content(Whitespace\" \ + \"))))(Secondary((id \ + 533d408c-e58c-4473-980a-5b930cd01d33)(content(Whitespace\" \ \")))))((Secondary((id \ - 115b14c6-4b2b-4218-a49a-7521f1cf39e3)(content(Whitespace\" \ + 354edd89-4de1-4cb3-a062-5cbcc62faded)(content(Whitespace\" \ \"))))(Tile((id \ - dc8ea8e2-a095-411f-b4ec-f42c1dfa864a)(label(fun \ + b5789586-2ff7-4040-ba8f-3a037c96fc16)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 13cae123-914d-4ab9-a0bb-95e74b757177)(content(Whitespace\" \ + 0e9895b8-f3a6-49c3-acb8-ea5973315809)(content(Whitespace\" \ \"))))(Tile((id \ - effeeb48-f8ae-4434-99ee-6b324ea1030c)(label(a))(mold((out \ + 019221e7-b7f4-45f6-9cda-eea902b16ccf)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fe204965-5d4b-4a7b-89e7-08c8a68faa7f)(label(:))(mold((out \ + 097c716f-cd91-4889-8126-f213d5a4202e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 93ab4776-8bc4-44b3-9c85-9df3e428e7e2)(content(Whitespace\" \ + 079a0a90-5795-45cf-ad53-78c640a16721)(content(Whitespace\" \ \"))))(Tile((id \ - 3b936c94-608f-43f9-a289-9a2c60986937)(label(Int))(mold((out \ + b2105dda-13f6-40f0-ba81-1ff9f5c2897d)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e7536a82-e11d-422c-8df6-5c8538922999)(label(,))(mold((out \ + 6ab9139d-165c-45bd-b770-1b3a9cfc66e5)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 591a9e54-e725-4068-b0b5-0aab93b6cf5d)(content(Whitespace\" \ + 15ffc761-de1c-4775-a3ca-56514625808e)(content(Whitespace\" \ \"))))(Tile((id \ - 6e42376d-7307-4aa0-9bf7-874c6ede51bc)(label(b))(mold((out \ + aa33aedf-0177-4014-ba2e-edfc1667b2ec)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a1ebe614-6941-428a-b341-6126da9b507c)(content(Whitespace\" \ + f554b45b-9a88-47f3-a1c5-3aa3b6a6da6e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7629c2c2-6617-477a-935b-b68dd45d2cb5)(content(Whitespace\" \ + e8953ff1-37ea-4353-a6f5-13c3edf9f37a)(content(Whitespace\" \ \"))))(Tile((id \ - 3f99bbaf-191c-44f2-ac0d-d9ea4e2b2cb7)(label(a))(mold((out \ + 0f6519a8-2117-4e17-accb-613a378390b1)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7b0c0908-7467-418e-a13a-90a311ef94b6)(content(Whitespace\" \ + f57c2b2f-9936-49c5-843e-47f78e818dc6)(content(Whitespace\" \ \"))))(Tile((id \ - 472b4173-b211-4f61-b0ad-8c76ebbfd6cc)(label(+))(mold((out \ + 5270b18d-7a86-436c-844e-83a2da3ffd13)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7a0995c2-8221-4342-afeb-ef342ece91ab)(content(Whitespace\" \ + 576551ea-b75b-45e6-a53a-72208fe05088)(content(Whitespace\" \ \"))))(Tile((id \ - 36300a74-5371-4559-943c-48f494c41aba)(label(1))(mold((out \ + ac127c5d-a9ef-4fda-94ef-bd72067a5324)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 40f5a161-495d-430a-ad72-badf3bdbb3c5)(content(Whitespace\" \ + a7e9c7b9-4a78-4b62-bf97-52a76358b86b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 79d68432-85ff-4eb7-b009-a5a75d5be95f)(content(Whitespace\" \ + af3df7b9-93ba-447f-ba68-c9fe69368a1f)(content(Whitespace\" \ \"))))(Tile((id \ - 3710c1b9-5165-47de-8530-5476531f03c4)(label(f))(mold((out \ + 5d09c495-1def-4b50-997e-78bffc66ce8d)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d71ef906-a04d-4169-b6d1-35e3126ddf74)(label(\"(\"\")\"))(mold((out \ + 432f6f29-13ec-42aa-85e3-4046f9b4204b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28f33431-1054-44c3-91f3-5a82a3272166)(label(1))(mold((out \ + 420455f3-21ec-45fd-af0c-1ab16278482f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6adc49ee-f2ed-469c-a1a6-a86d30ab2b29)(label(,))(mold((out \ + ed7445df-264f-4781-8e06-cc89a7277678)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 69c2c6e1-a14b-4685-a2f6-6a4e66086ae9)(content(Whitespace\" \ + 71bf73fe-e5e4-4d9c-af4a-830b6522d37f)(content(Whitespace\" \ \"))))(Tile((id \ - a9678f5e-29c2-4f5b-90a7-96834caac967)(label(2))(mold((out \ + 40bc4865-948b-4ee5-b47a-e09f60961fed)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - e8214e60-b570-4790-b0f0-865ee68708b1)(label(\";\"))(mold((out \ + 65ecec74-10b5-4d65-9d07-547469eebbbd)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6c339fd3-1985-42d3-9f9f-cf343e05d642)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 63aae96a-2e54-4a31-b7e8-f37341e30cb1)(label(let = \ + b2c53c9e-6b7d-40e3-ad2d-9b52e1629baf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0cd2dc3e-b0e1-4e8f-befb-f8c713347207)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 41150a00-9e44-4cc2-9cc0-e9b824b28585)(content(Whitespace\" \ + 47feb2d3-9a81-46ce-94f5-6c4709bbfef1)(content(Whitespace\" \ \"))))(Tile((id \ - 061b6f26-f65e-4b33-8d59-c410cfe89886)(label(f))(mold((out \ + b8275797-9c01-4428-b63c-ab024079adf3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f61cb2bb-b09e-4fbf-9557-52d3870a33e1)(label(:))(mold((out \ + afe7c5c9-ccb4-4bd9-8757-1f35b2e373da)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - aee00318-d9ac-4675-b2cc-8b5df62abab6)(content(Whitespace\" \ + 97ea9a19-ecaf-4940-aa98-f60b0cca8b69)(content(Whitespace\" \ \"))))(Tile((id \ - c2488260-74de-4668-9a05-35b5ad8bc816)(label(\"(\"\")\"))(mold((out \ + 64dd32f3-466a-45d3-8a9d-416d49c7c47e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - a5aaa2e1-cc92-4bb0-a570-54695358709d)(shape \ + 41425a49-b7d3-426a-9882-74e3c0b846fb)(shape \ Convex)))(Tile((id \ - 2bf41b7d-6966-4e05-bf86-81cbe8ae9e6a)(label(,))(mold((out \ + 00c4e1ae-f97c-4dc8-8a34-2880447762e6)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 9d3d0402-bc3a-4cf4-8b7e-9c101851f04d)(shape \ + 0406f8f9-debe-4e45-a39e-5d128ac393af)(shape \ Convex)))(Secondary((id \ - 402098c6-c1b2-4bb1-9b9d-c57ff9814821)(content(Whitespace\" \ + b7f7e12f-849b-4fc1-b120-4617cb2cadb2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 278b8ffd-0809-4c03-9439-06a1aba32af0)(content(Whitespace\" \ \"))))(Secondary((id \ - 06f0fb0b-7b02-453f-b2a3-913fe3e06ff0)(content(Whitespace\" \ + 5612c8d4-cfdc-4948-8755-950eed970985)(content(Whitespace\" \ \"))))(Secondary((id \ - 2c2a7296-aeb1-453e-b766-7d761181ea56)(content(Whitespace\" \ + 7dd5bdbf-94e3-4f07-a5d2-7e36a73ba077)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 90ebc460-5afd-41c0-b75f-aeae32dfa2d3)(content(Whitespace\" \ + f72f09a2-4927-4efa-aef0-e607f7395640)(content(Whitespace\" \ \"))))(Tile((id \ - c8108162-8534-4e07-b581-b29995ae5093)(label(->))(mold((out \ + 6f2156c2-f276-4f03-98f4-fb329a4aa303)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fba94540-3ad4-42e9-8ed5-b7c888ffcd23)(shape \ + e75c67fa-82f4-4b67-a9e4-a7d3df3cebf9)(shape \ Convex)))(Secondary((id \ - c2243f7e-ad6e-4651-afe1-b515c427cb38)(content(Whitespace\" \ + 3aa18005-afad-47ee-8597-4b92f321ffc0)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9bcebaa5-27f2-42a7-a67f-864f9ffb62ff)(content(Whitespace\" \ \"))))(Secondary((id \ - 195863db-6c4c-4406-983d-93ceec9d82de)(content(Whitespace\" \ + cdea2b41-b80f-480b-9f3c-a089656829ee)(content(Whitespace\" \ \"))))(Secondary((id \ - a4aed3dd-59cb-4167-b919-329dc55b269c)(content(Whitespace\" \ + 3d2865f8-2ec2-4e64-9a6b-3dbd8a2fc507)(content(Whitespace\" \ \"))))(Secondary((id \ - 5a0269c2-6858-462a-bda8-5229bd177147)(content(Whitespace\" \ + 31f299a1-0bd3-435e-abda-5f6e01b727c3)(content(Whitespace\" \ \")))))((Secondary((id \ - 8d9b764d-2ca9-4661-be80-2cfcdfe339aa)(content(Whitespace\" \ + 67e2966b-fdf7-41ba-b8b1-a08a2a357889)(content(Whitespace\" \ \"))))(Tile((id \ - 5ff3acc9-0297-4c57-9c04-c14dec59fad5)(label(fun \ + 2dae69d8-d8e3-468e-86d7-d8e7e1e84df1)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 795369bd-4839-42bd-9ef6-d46089eca6cc)(content(Whitespace\" \ + e5606c6e-7542-4c62-a12d-16ee9db2e3be)(content(Whitespace\" \ \"))))(Tile((id \ - 32b5640d-0d03-42e5-8163-713a3c23410b)(label(\"(\"\")\"))(mold((out \ + 4bdd36af-3c46-4017-9797-2f2608dbb63b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - f0f5d7ef-a571-49aa-8e83-970c5da8c73f)(label(a))(mold((out \ + 36cd609b-5234-452c-a457-0856a2669506)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 04ba332f-1c67-4c94-8c16-35f0e3e65049)(label(,))(mold((out \ + 7f01d606-9f3d-4aed-91fb-caac53e398f9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 48987d6c-4c40-4aaa-8f7b-46523f1f011d)(content(Whitespace\" \ + bc94654c-2f20-4f6c-9ddc-f59bd27c35a9)(content(Whitespace\" \ \"))))(Tile((id \ - f688b9a7-5a6e-4eda-b4e9-1605f5b5a7f9)(label(b))(mold((out \ + e42001b6-5437-441b-b90e-f4bab5ed406a)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 81ace651-9718-4bc6-8a8f-b1029c99aa5f)(label(:))(mold((out \ + edae296e-119c-4dd6-bc12-8723e45ce0d2)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 68db984b-14d2-4c4a-a1ac-130a81e4a13f)(content(Whitespace\" \ + 5105f7c4-b37b-4830-b60a-8074fd6e6679)(content(Whitespace\" \ \"))))(Tile((id \ - e6a2d40e-149e-4aa5-bca7-d24f443d6ca6)(label(\"(\"\")\"))(mold((out \ + 500203e4-409b-4b08-baa8-502a0a7079d0)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - b64a6b34-a6a3-4a34-99a2-e182b11c2a0b)(label(Int))(mold((out \ + 480c4fca-47b4-45aa-9f0e-c07d191ee6b1)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e02d9e4e-4a94-4077-b024-d771158a2be0)(label(,))(mold((out \ + df2b07d9-36a6-4bd9-a14f-4558066cde5a)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 38127717-ca61-42b0-8951-c55bdf1526f9)(shape \ + f9601b2b-1d04-4f90-8b5d-439a2ee32da5)(shape \ Convex)))(Secondary((id \ - ac01d5ae-b7e9-45ad-8057-19a904a84d7a)(content(Whitespace\" \ + 8a6f8329-d817-47df-88f4-976c226c1d3a)(content(Whitespace\" \ \"))))(Secondary((id \ - 9e82cc11-910c-4f8b-905e-a08385ab8cd9)(content(Whitespace\" \ + 0bd21b6b-cfdc-4d45-85a5-130e16ed40f2)(content(Whitespace\" \ \"))))(Secondary((id \ - 1f215d80-75d2-4175-9a7c-9e09017706d2)(content(Whitespace\" \ + ea5d9586-89fc-42b8-8bf3-6af88a2f3a61)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8829156b-02f6-400a-a14e-21d09bd60a72)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d36f5613-3059-42b6-bc83-b2083ac5dcc9)(content(Whitespace\" \ + 97627ef0-8e55-449c-a860-31b892a436ff)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 72254ceb-87dc-49a2-a994-8833935a480b)(content(Whitespace\" \ + 0ce934a9-0108-43fa-9ae7-dd73215f01e3)(content(Whitespace\" \ \"))))(Tile((id \ - 28663e12-09e1-4e35-ab20-4cb6d1edb6ea)(label(a))(mold((out \ + e3e5b629-a269-4d18-9533-17b4b6b34126)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 07bcd538-b4e8-44c7-9ec2-2b41a62d86dc)(content(Whitespace\" \ + 40114966-50d0-4c74-a078-c09f3924b7b2)(content(Whitespace\" \ \"))))(Tile((id \ - c3c83954-68f6-475d-bddb-039421f29988)(label(+))(mold((out \ + 897951a3-7a44-4520-83f2-c8b58477f5eb)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6fcb70b9-fea4-40ed-a584-74c4a312356e)(content(Whitespace\" \ + 3f06f2d5-c79b-4925-b967-bd136c952490)(content(Whitespace\" \ \"))))(Tile((id \ - bfe81cb8-bf12-4c56-99a9-b5d0c2e8d99e)(label(1))(mold((out \ + 5c51116c-3198-4254-b2bb-9bf9326f0681)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fcfc49d4-ddb1-4c86-af4d-6d69443d130a)(content(Whitespace\" \ + 02d21a0e-d741-4ce3-bca6-c56712c95003)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 87588ec2-9b85-4f89-8127-5a4c023f5e64)(content(Whitespace\" \ + c3012fb4-dbd8-4b65-bd7d-6bc52e02a910)(content(Whitespace\" \ \"))))(Tile((id \ - 50e258cf-754d-4890-966b-7ef15cf040ef)(label(f))(mold((out \ + 4c4ee333-dc6e-4d9d-a919-aaa80c32d84e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4dab0b99-7216-4b28-adfb-61cccba280df)(label(\"(\"\")\"))(mold((out \ + 35054f3d-b381-455c-a3e9-2749418b7887)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - adf0b799-a05b-4396-a402-c3aadf0ce504)(label(1))(mold((out \ + d1737bd2-ead6-496c-8810-905f390bdcfa)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 814d6777-9a77-454d-9fbe-c889c427edd6)(label(,))(mold((out \ + 7c4b90c2-b230-4068-9527-3ca580536ff2)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cea1387d-460c-41fc-95bf-4aa85e1c72c4)(content(Whitespace\" \ + d6f450f3-6aef-4292-b2d1-04e4c7c536e9)(content(Whitespace\" \ \"))))(Tile((id \ - 86089a6a-7a0a-41f3-bf64-6dd4f90af113)(label(2))(mold((out \ + 4673f3fa-3ee8-4ec3-971d-e2cedd8509f6)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 8ac88a53-3a64-4a02-bee1-7e1b842fcc68)(label(\";\"))(mold((out \ + 98605f14-241b-41b1-ad67-5795c7a108f0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 31e4f794-5573-4a5c-85d8-bf102109436a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3e3d29df-6e04-4372-9ff3-27aa8b86b6fb)(label(let = \ + 376a93e5-d19e-46fe-97a1-75092092e4f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 23838c85-4434-427c-bbf6-ad7216161cae)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fbed3e2c-2ac5-4e84-b7e8-c1e8557752d5)(content(Whitespace\" \ + b9c403c1-486f-4281-b123-7ac8fe903c1f)(content(Whitespace\" \ \"))))(Tile((id \ - 7a3f942f-104c-4e58-bfd2-42e5ebfa2002)(label(f))(mold((out \ + 73e74bb7-c1ef-4170-b168-6385771f6508)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 3959afd0-3b4c-40c6-b24a-b923725a9186)(label(:))(mold((out \ + 79ea2e5b-9a88-49d3-8ff7-d109d319824c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6bbe543c-055c-4eb7-ba67-80bb7bdad579)(content(Whitespace\" \ + b06aa8a5-4a29-410c-826e-223657b9344e)(content(Whitespace\" \ \"))))(Tile((id \ - 68d98c26-cb44-47a8-96b1-30416ee986a1)(label(\"(\"\")\"))(mold((out \ + 2cc8366c-a301-42b8-a2b1-2278cce34ccc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c7ce9a1a-ca77-4df1-b0b4-b6ee283c3c46)(label(Int))(mold((out \ + b0a594f4-645b-4deb-966c-e7f09eee5b8b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b48679cc-12c5-4943-986a-5a1e978e6c18)(label(,))(mold((out \ + 3f78bcb7-af28-4b2f-9018-374c7035517e)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 38b0fb5b-3255-4730-be50-f5d240e77726)(shape \ + dc28a809-ad5f-4b4f-b705-4c6385fb1606)(shape \ Convex)))(Secondary((id \ - 8d42a2ef-7465-4303-91a2-8be5db09223a)(content(Whitespace\" \ + df0b188c-e996-4f96-aeda-979ed61f05b4)(content(Whitespace\" \ + \"))))(Secondary((id \ + ee0383bd-3a94-4e3c-8a65-41b9953e9f74)(content(Whitespace\" \ \"))))(Secondary((id \ - 7dd0e694-8f7a-40fb-9e1f-15739d3dee0b)(content(Whitespace\" \ + e1372379-1ea4-4026-bb6c-821f78901b69)(content(Whitespace\" \ \"))))(Secondary((id \ - eb5f3c72-5326-404b-84ac-e5f89f34fcb4)(content(Whitespace\" \ + 07919393-9019-4470-ad4a-122a3af3fdfa)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6b22cb73-8841-41ff-bf1d-1077a0fa17ef)(content(Whitespace\" \ + 0e68f20e-300f-40ff-ae48-bb60dc210e7e)(content(Whitespace\" \ \"))))(Tile((id \ - 16692e8d-8f80-4e54-869e-742fa027343a)(label(->))(mold((out \ + 32c8ebbb-222e-432f-a69b-79988c6b6913)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - fecb0fe1-5af9-4b2b-b470-f291ac6c1668)(shape \ + c0b6ed31-5ff6-4f32-8e91-ecd171dfbaa9)(shape \ Convex)))(Secondary((id \ - 509ab176-69bb-42d0-95e7-b8f0226b391a)(content(Whitespace\" \ + 2230b86f-f3f2-41e1-83a9-aa998d43d1da)(content(Whitespace\" \ \"))))(Secondary((id \ - 4bcd3c12-27a9-40b2-aeb1-f345a63ec185)(content(Whitespace\" \ + a22a55df-9c4f-4d51-a547-b80a9eda66a1)(content(Whitespace\" \ \"))))(Secondary((id \ - 4cee1f22-05f3-4d3e-8e70-2f63bb2b933f)(content(Whitespace\" \ + 39bd9ece-0a1b-4407-985b-4599d728b730)(content(Whitespace\" \ \"))))(Secondary((id \ - 9d9f7f0b-c1dd-458e-b4af-dd3ef659aea1)(content(Whitespace\" \ + 71dabf03-7366-4d84-a5a1-456504e56658)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5e3bb7dd-cfeb-4ed8-a618-d59de00c95a2)(content(Whitespace\" \ \")))))((Secondary((id \ - 02883074-1b2c-44e2-b414-cf1d6ad92a66)(content(Whitespace\" \ + 4d1a8a7c-79ba-490f-a797-e438b620fa67)(content(Whitespace\" \ \"))))(Tile((id \ - 1faf63ae-35bf-4c32-81a3-3d3404447a22)(label(fun \ + a1495f70-2cd9-482a-8907-5f4ee0ccd14f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a0624ce4-0463-4322-b5d2-cbc48238beff)(content(Whitespace\" \ + 11439fcd-3a12-45a5-8dc3-eb0e2871a3ba)(content(Whitespace\" \ \"))))(Tile((id \ - dff046ab-e701-4b99-98dc-aecd9f0274d1)(label(a))(mold((out \ + 0911ba1b-85af-4d18-af1e-1e38c065d78b)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - eb379ff0-4866-46ef-9396-f72572693a94)(label(,))(mold((out \ + 605ea2a8-3c81-4bfe-88ce-5b6b94e11979)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ddfa12c7-f302-49a3-a0fd-d4667e739b17)(content(Whitespace\" \ + 78a2bc66-ead9-45dc-a0ba-2ddd00d2e8b9)(content(Whitespace\" \ \"))))(Tile((id \ - 589471b7-1fa2-4704-8ffc-27a850d04360)(label(b))(mold((out \ + 31237158-256a-4be3-af94-c57ec6a1aa59)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4879ce5d-7074-41a1-a703-53d950aae317)(content(Whitespace\" \ + 6f8baedb-6517-4beb-a178-a67a96a39d49)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b23486be-7faa-4b4a-82c1-08143c583190)(content(Whitespace\" \ + f60f3acd-7836-4436-bcad-f5cedc50aba2)(content(Whitespace\" \ \"))))(Tile((id \ - e4895aae-0fcf-4e0d-8f6f-1d1cd492fd94)(label(a))(mold((out \ + 8a38855d-d3dd-45f6-8b4b-549a0af11220)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d30d3b7b-d5b5-4d67-a721-0a37eb2d7fa5)(content(Whitespace\" \ + 27f73a81-432f-47cf-ac51-bfd6795ed30b)(content(Whitespace\" \ \"))))(Tile((id \ - 38ba8650-14c7-4fc4-9683-7ec2ca3dcba1)(label(+))(mold((out \ + 92a165de-27b7-497b-a22a-020a4d4c9086)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1b391273-58f2-4a9c-b51c-28906a94d82b)(content(Whitespace\" \ + 37f14632-9380-4689-a2cd-91df99902c58)(content(Whitespace\" \ \"))))(Tile((id \ - 0aa30864-a7a1-4366-8005-8cf23c7a6de2)(label(1))(mold((out \ + c81d480a-d37e-47ea-acbd-05020071cdbd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c6fb75dc-e0f1-446c-91db-0a9bb67a7765)(content(Whitespace\" \ + a59bf95b-6f8d-4218-9845-2c1550ccb6c1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8deb8dea-70fc-4d5c-9464-4b26eeffe4a4)(content(Whitespace\" \ + bcc8cf2e-e9dd-40c7-a870-05dba9b4f496)(content(Whitespace\" \ \"))))(Tile((id \ - e5472ada-a478-4aff-9a1f-5e0c8af1bc19)(label(f))(mold((out \ + 83a26342-f298-43b8-90e4-8d8a943f41e8)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2de9d557-60e5-4f1d-a292-efe62d314f9a)(label(\"(\"\")\"))(mold((out \ + 5becf2b3-1143-4ae1-899a-6530a5cc6287)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c512e04f-8cbe-4433-b433-ad3c66d367b8)(label(1))(mold((out \ + 0e53d94c-7040-4c08-8d31-0f1d47ed91b1)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2f7db17b-5b06-44fe-9853-8b78aa6a52cf)(label(,))(mold((out \ + 0b3c3616-4739-461a-8f08-dc7064e70297)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 12d68f5a-76e7-4336-8ac0-e5b94a2cf11b)(content(Whitespace\" \ + 7e5a67e7-6fbe-4e4b-a728-c6e160c93c2e)(content(Whitespace\" \ \"))))(Tile((id \ - c8783e11-d525-42a2-9b37-b21c87d4dd27)(label(2))(mold((out \ + a38e504d-eff5-41f8-ad28-3912a77795b8)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9828c26d-7c0e-40fa-9044-db3df9433364)(label(\";\"))(mold((out \ + a444a690-dd1f-46f0-8b32-673d85a87cfd)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4dc4360d-7277-497d-ace7-bef4f64260f2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ad550174-8a4b-437e-9aea-b0654bb46fbf)(label(let = \ + 3c720d05-2dd6-474f-8aef-6c537bc99012)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1b3c8184-481b-41ed-af13-ecaee014db19)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - de5b7a77-9eea-4a4b-bca7-2c1f7abdd35a)(content(Whitespace\" \ + 804ad984-3c3b-4505-bd75-7d027ffbbdee)(content(Whitespace\" \ \"))))(Tile((id \ - 50c075c6-dadb-4d6f-a8e8-1d4e5df350a5)(label(f))(mold((out \ + f6b17887-aef4-4da1-bfb9-06d14907f573)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a2309dc4-92ff-4817-a72e-b278666ecf0d)(label(:))(mold((out \ + 5ff4205a-bae5-447f-b8f9-2174c5822251)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 706b5a80-86c3-42e3-b17b-ceb32ce225fa)(content(Whitespace\" \ + 13e0fa19-3bdd-4e2f-aa95-9b0e64c4c4ca)(content(Whitespace\" \ \"))))(Tile((id \ - f6a0d5e2-eca9-485e-b687-4a96f09c2079)(label(\"(\"\")\"))(mold((out \ + e0a085b9-f283-4851-a41b-48cc0ae9e1ea)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - e9fab92c-cd64-48fd-ba7d-a58740488fa5)(label(Int))(mold((out \ + 98e49a14-fe3c-4361-8d32-e265df4593e3)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - e5b46ecc-4f95-4a5e-b0cf-9d045885caf9)(label(,))(mold((out \ + 37e84984-ba15-45b9-9e43-4f56ea4f2e64)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - dd95b714-a35a-4c30-830d-a48d7fb4e450)(shape \ + 7706b218-33a2-4467-907c-169311545674)(shape \ Convex)))(Secondary((id \ - 00867422-e03b-4e1c-8edd-140e2e303507)(content(Whitespace\" \ + caed6707-0175-4e93-a4f5-f1759b88ffab)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4e7b340f-0ca8-40b0-abcf-6a2c55cf23f8)(content(Whitespace\" \ \"))))(Secondary((id \ - 30ce2c99-6f06-4a12-a630-7305544b3636)(content(Whitespace\" \ + 97900902-4145-4f7f-8c05-61c29385bf36)(content(Whitespace\" \ \"))))(Secondary((id \ - 895ba0ce-70a9-4ea7-ac3d-ceceebbe7b62)(content(Whitespace\" \ + 13362c79-231f-4968-8730-8c21ef4804c8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a873546d-01fc-4995-871b-e39aa763242a)(content(Whitespace\" \ + 77db3bca-6ff9-4602-ba5d-1c4263324260)(content(Whitespace\" \ \"))))(Tile((id \ - 063130ba-8342-4168-8dae-7098249b387d)(label(->))(mold((out \ + 86524a59-20d2-4c2b-8e31-73ea1ff21f73)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - c5b7be20-3c31-496b-b6cb-b761b232fae4)(shape \ + 5dabd025-9a4a-4b25-b46a-04135f86f38e)(shape \ Convex)))(Secondary((id \ - 1ae25522-1243-4f44-937c-c3b131ea8f44)(content(Whitespace\" \ + 6cc35a0a-db18-4021-9c00-2e849fd14921)(content(Whitespace\" \ + \"))))(Secondary((id \ + 07df44d0-d30d-4127-8eee-8c777ec2295d)(content(Whitespace\" \ \"))))(Secondary((id \ - 69bbc385-38ec-4d1a-8e62-1f785d42d294)(content(Whitespace\" \ + aed047df-d10b-4d0d-92e6-dd98d262ee96)(content(Whitespace\" \ \"))))(Secondary((id \ - 475e3acb-d543-4fe4-92c9-16d559f1167f)(content(Whitespace\" \ + 9a58ad54-af4e-44fd-92da-01dc6b9eee1d)(content(Whitespace\" \ \"))))(Secondary((id \ - dc2eb0be-4057-4328-bdc4-e2dd1cdeb4f1)(content(Whitespace\" \ + c7939a2a-0d12-4c73-9b89-038385098f37)(content(Whitespace\" \ \")))))((Secondary((id \ - 4d47f2b6-499d-45ed-9c5f-42162bcb95ef)(content(Whitespace\" \ + d9c64d40-e20a-403b-ad8c-39006832a360)(content(Whitespace\" \ \"))))(Tile((id \ - 24e91ad4-87d3-454f-9dc9-f090ac5f56ab)(label(fun \ + ebbe74d6-7ff0-4c0f-9bea-77069f59676c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4d4e0f01-6ad1-4b86-9f20-963f70328669)(content(Whitespace\" \ + 8d3cffdb-352b-4388-8c11-3256fe3eb3c4)(content(Whitespace\" \ \"))))(Tile((id \ - a444473c-b35f-4e7e-a9e3-dfe845229c73)(label(a))(mold((out \ + 5ef11133-5b82-42f5-ab2e-7494af420c15)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a7a91a88-b619-40d1-9ee7-c6ed18a52caf)(label(:))(mold((out \ + 2a4ad24b-7659-458b-9672-2b14e466eca0)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d9015c98-269e-4403-866d-2765531ec3c7)(content(Whitespace\" \ - \"))))(Grout((id 31450075-b9b8-4bfa-847d-b7313d39d2be)(shape \ + c695b1c2-ced5-4122-84fb-5cc028d9d361)(content(Whitespace\" \ + \"))))(Grout((id da1dc92b-8a60-4221-9935-d265ba85c38f)(shape \ Convex)))(Tile((id \ - 73995931-36d1-4228-94aa-f474eb30225b)(label(,))(mold((out \ + 214ff7f9-27a3-41f1-a3a1-c5d465e3c5f9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a6e67fcb-d36f-48f6-80a9-9ae4f5bc6f55)(content(Whitespace\" \ + ccac5fca-1192-4123-abfb-68f987774372)(content(Whitespace\" \ \"))))(Tile((id \ - bde5a9c6-5b7e-4e87-a0d4-d069fcf1b8f0)(label(b))(mold((out \ + 1c78e035-6ab3-4094-ad71-99225db45bfa)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 74d45876-83e9-47f6-8bb7-1e6d58f031d9)(content(Whitespace\" \ + 13e164d8-e802-44e9-bb9d-907681ea2fa6)(content(Whitespace\" \ \"))))(Secondary((id \ - c45072de-7247-44bc-85aa-e62c3412acf3)(content(Whitespace\" \ + 7f5f819a-1111-4679-ad2d-4e8cab62e396)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 15908387-4f72-40f7-a795-b4a84823581f)(content(Whitespace\" \ + 0f4ae17d-6028-4ab6-91d6-ca6152c58656)(content(Whitespace\" \ \"))))(Tile((id \ - 66de2dca-2935-44e6-8aa0-8630bbe3fbcc)(label(a))(mold((out \ + a39c895c-a577-4fd2-ad3f-a850f7458911)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 13e86771-fb5e-4ee2-90a2-36e59ddded6c)(content(Whitespace\" \ + 949db5bc-11ea-4cd4-a3cb-5b3692375071)(content(Whitespace\" \ \"))))(Tile((id \ - 71d512ca-e864-445e-b9ce-e0fcd6e8d93e)(label(+))(mold((out \ + 407e39ce-960e-4fdb-957b-02cc506cdf60)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b80ade63-797c-4584-89ad-9d3ecfb90774)(content(Whitespace\" \ + cb7289ce-c7f2-498e-a0e3-74e541699823)(content(Whitespace\" \ \"))))(Tile((id \ - 5a1c8f51-73e9-41da-953b-1a78223bc7d9)(label(1))(mold((out \ + ed9a05df-34ff-4f8e-b996-714d5a12b28b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 770a7123-6c4b-4688-a85d-70de0d8bf6be)(content(Whitespace\" \ + b12e7c69-4c46-44c1-853b-2b45684c1e10)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b061a640-d80d-4ef8-bfab-be192a5a232a)(content(Whitespace\" \ + 6933afb9-f003-440f-ad29-613f73847b07)(content(Whitespace\" \ \"))))(Tile((id \ - 9bcc62a7-41ce-4364-a7c8-555cec20b750)(label(f))(mold((out \ + 19e5b8d4-e080-41c8-8bfb-aef2b53bcf65)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d8b7f4da-e56e-4ab5-8beb-5230668181d1)(label(\"(\"\")\"))(mold((out \ + 785addd4-155d-4060-ba64-c2629b94f4e6)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 763c7b6e-2149-4908-b25a-ddfa948e5029)(label(1))(mold((out \ + 44ef56e7-c1ee-40ff-b8af-0c64ad654b46)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4936f587-257b-4ec3-be3a-0d3928e1ada1)(label(,))(mold((out \ + eb1a9137-8cad-4361-98be-54c32e7941a9)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 47b4dbc8-10dd-4a9a-8b69-a8ebe0a75865)(content(Whitespace\" \ + 9b8aeb8a-ff33-4c34-b36b-7c2b481e2cf2)(content(Whitespace\" \ \"))))(Tile((id \ - c046e24a-40b4-4dce-a82f-e229f1f727ba)(label(2))(mold((out \ + 57136821-4424-45a8-94c4-2024e1174a7b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - c62b3b79-b38f-472b-9637-24690eef7e60)(label(\";\"))(mold((out \ + 4fe2861a-a3b4-41fa-83ee-8214e7390ce0)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c4703325-779b-4bed-8f17-430cb41d9c64)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f40f054-be4f-4731-829e-e9a9c280b868)(label(let = \ + cea6e21d-7c1c-4617-8ca0-f4f26295f1ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c5630b4f-d0cc-4423-b9df-6c2a5d338e84)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0fbaeb29-2938-44c6-98f6-17dc0e078189)(content(Whitespace\" \ + 723f77ed-7c7c-4425-9975-e03f5f2796c1)(content(Whitespace\" \ \"))))(Tile((id \ - e24b38f0-98a9-4976-8f60-42181899dd4a)(label(f))(mold((out \ + 45b04c53-21bb-49c2-af2e-4db1118b3919)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 766cfa4e-a2b4-49db-82c1-421197a93413)(label(:))(mold((out \ + 67ae30d0-142d-4680-a9a1-e9588d253a8a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 853a1459-d22e-4360-97ee-682b9d933269)(content(Whitespace\" \ + 8203e6a2-b957-49a7-9846-7d0321d6de81)(content(Whitespace\" \ \"))))(Tile((id \ - ba4bddde-4e1f-49ba-b002-fe7724650f33)(label(\"(\"\")\"))(mold((out \ + ec878a97-6eda-499e-a880-b044822f30da)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 1d23e646-fb4b-4e44-8ef7-a78767e3243a)(label(Int))(mold((out \ + 19e1e0b9-6ce1-4ac2-a627-d41fda0263d4)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - bb0cd056-753c-4e2f-b91c-033d5f300bc2)(label(,))(mold((out \ + 94fc3f58-9b9a-4b77-a847-458fadbaf22f)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 050b7a95-67f4-4567-8583-b818b145c0ef)(shape \ + 9e4ad59c-e695-443a-90aa-0f94a8b98148)(shape \ Convex)))(Secondary((id \ - e7af0f0e-bb35-472c-a6ad-54d36a167e25)(content(Whitespace\" \ + bb1e5259-8c9f-46b9-af6d-78fe92c57acd)(content(Whitespace\" \ \"))))(Secondary((id \ - ecabbba0-2d9a-4c00-b881-8ae7c4c2d6ee)(content(Whitespace\" \ + 926aa843-6b9c-440c-978e-db004471c8a7)(content(Whitespace\" \ \"))))(Secondary((id \ - f0d7d36e-ce5e-4028-b837-1ff06308114b)(content(Whitespace\" \ + b3188b67-8ff6-47f0-86e1-8f710d1a65e3)(content(Whitespace\" \ + \"))))(Secondary((id \ + d2db19fb-9c24-4982-a2bc-eeedb64dd1e3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7ffe7222-6922-41a9-b96a-0005c2437041)(content(Whitespace\" \ + dde093b9-cf10-4e73-a440-7e90dd5c9d90)(content(Whitespace\" \ \"))))(Tile((id \ - 6e554f30-51c0-4680-a8a4-d3a1cbd820bf)(label(->))(mold((out \ + 04369264-36df-48df-b04a-e126460e18ae)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - e72ef343-3321-4dbb-add8-1c89cf38241d)(shape \ + a3fd69c5-104e-4ed7-abc6-0757fdda5855)(shape \ Convex)))(Secondary((id \ - c17ce21d-6149-4be2-b6c4-780dcfaac041)(content(Whitespace\" \ + 0ddd36ed-6522-477c-8041-593f86d948e3)(content(Whitespace\" \ + \"))))(Secondary((id \ + 90340f37-26cb-47f3-9393-ec027b3acc4d)(content(Whitespace\" \ \"))))(Secondary((id \ - 4135504a-e34b-4677-98a3-c7a68c257a11)(content(Whitespace\" \ + 1ec31dfb-2da2-42cf-a2f9-8f917f70ec59)(content(Whitespace\" \ \"))))(Secondary((id \ - 3c53fadf-e48d-4725-a8a6-5bdde4daa591)(content(Whitespace\" \ + a181ec33-4129-4b6f-95f6-8dbfc2bd09e7)(content(Whitespace\" \ \"))))(Secondary((id \ - 72ad9c9f-b70d-4a29-a114-b07c57805c2b)(content(Whitespace\" \ + 71a83fa2-26d4-43e3-9b27-df38e3f8af10)(content(Whitespace\" \ \")))))((Secondary((id \ - f3294862-1e1b-4017-be4b-84e60147bda2)(content(Whitespace\" \ + adf7b8e1-aa0c-439a-8191-28d3bb86d59f)(content(Whitespace\" \ \"))))(Tile((id \ - e9a85d8e-40bf-4cc3-9f64-86462ccfd625)(label(fun \ + 8b74d945-578d-4339-b6b2-ed0e3bfb7604)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3f371173-8e8c-4cf3-b7e0-b1a9e6369020)(content(Whitespace\" \ + a199017a-a863-44a7-91af-ca4bab16e0c0)(content(Whitespace\" \ \"))))(Tile((id \ - fac1b4e0-caae-40ca-9cfc-aa156914b779)(label(a))(mold((out \ + 1dda4f28-4651-43c4-942f-afc91a06391a)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bb8816e9-bf80-494b-b114-9d9081d2f645)(label(:))(mold((out \ + 005f0fca-40d2-4347-b0e6-1cfdff1b7abf)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 49f35b36-6f56-4f35-a2ac-6ca4718c34f2)(content(Whitespace\" \ + 3aa11510-029b-47f4-9814-7b849a6b0c18)(content(Whitespace\" \ \"))))(Tile((id \ - 42d036ca-6ed9-43f8-a334-c656ee00b268)(label(Int))(mold((out \ + 8c3b0613-0a5f-4baf-bb13-8e0537ba8a99)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a8ecbdba-1e8d-48ff-931f-16400a3c84c6)(label(,))(mold((out \ + 8356a33e-e14a-45ea-9ccb-8643dc7e8c90)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 362a6111-5daa-4d90-87e2-7e755fb4fd85)(content(Whitespace\" \ + 82610d60-0e70-4286-a06f-027b27f889fc)(content(Whitespace\" \ \"))))(Tile((id \ - a1db34b9-fbf6-4ed6-ac88-6062bd2d14c9)(label(b))(mold((out \ + 8c1ae8d6-4e32-4fce-9ba3-1abddb49e7af)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f2064b7b-3a3d-4b46-8ce0-2b2a60ffda9d)(content(Whitespace\" \ + 90b04bf4-97ce-454a-b7a3-0058ad4148bc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d656dc22-ebaa-4f18-950b-00a868c9b867)(content(Whitespace\" \ + dd298321-2ef3-4941-9f2b-330c29b875ac)(content(Whitespace\" \ \"))))(Tile((id \ - 95eeded0-9ca5-476e-81f1-9bee335ab198)(label(a))(mold((out \ + 71a8e354-93c0-418c-b729-b993dc488fdf)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c2e3591f-4b2f-4a5f-8174-dce3dcf03775)(content(Whitespace\" \ + 110aea15-876e-4a86-80ea-89438d64c8a7)(content(Whitespace\" \ \"))))(Tile((id \ - eacc22fc-8e12-473f-8ee7-a5545633cd55)(label(+))(mold((out \ + 65d321df-a172-45f9-945f-d1b89ae81761)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 36aa0501-c99e-45f9-b3d6-8f51b28b67cb)(content(Whitespace\" \ + 4420f1b9-ac27-4a1a-b018-8b5d87049d78)(content(Whitespace\" \ \"))))(Tile((id \ - b9a9ccaa-d701-43d5-a8b2-e140b1c1a5a1)(label(1))(mold((out \ + 91cc08cd-3a9e-4c30-8815-bd79da9c3581)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2f850cae-7453-433d-92fb-f84d5b3e49d4)(content(Whitespace\" \ + 7f1b07d3-315d-401a-8ce2-6be512c2bada)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4b7f2643-599b-474c-90b4-455f797cf7fd)(content(Whitespace\" \ + 8e172e2f-ac49-4023-8435-2fee16bb4e12)(content(Whitespace\" \ \"))))(Tile((id \ - 7c075dba-e170-4496-947e-19d0dea1cb96)(label(f))(mold((out \ + f1cec1c7-8074-4892-ba78-f85ed01e3c00)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 81ba2018-609b-40ed-90e4-e1e83068c994)(label(\"(\"\")\"))(mold((out \ + ed95bd43-3ee3-4095-9b70-28884d520361)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5589cb1e-022a-405a-80c9-256fcae44d4e)(label(1))(mold((out \ + ace88fc4-3a31-45d4-9bdf-69a20bdffd47)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1406c6ba-21c1-4522-aa71-9de7980c8a69)(label(,))(mold((out \ + 31350bb8-4ba5-4166-83ff-44b230650a22)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4d624f30-15ae-450f-8523-47df552dd67a)(content(Whitespace\" \ + 623cd71d-5f31-4a56-818c-b14816d3fe21)(content(Whitespace\" \ \"))))(Tile((id \ - a0348c8e-1a7c-41b0-8f4d-b5083264bd37)(label(2))(mold((out \ + cfdcf73b-d839-4fa3-b242-335d39050a9e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 289edee8-bb2f-4db0-885e-e91a70ac7867)(label(\";\"))(mold((out \ + 4c26285b-99ab-425b-8eb5-e76daf1d0d54)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f31e820e-9dea-4931-aee8-19981977caa7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - de0b7640-1ae9-468a-94d0-50c5cf6525db)(label(let = \ + 7c81343d-3896-40ff-9b94-4fe477cfdcfb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc97567d-b5e7-4cbd-8ed9-b977b4202305)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d96f4f67-be48-495f-a365-f5bd63b8f682)(content(Whitespace\" \ + 8cf90a7f-e5cd-45ea-9ff6-8306406d8d71)(content(Whitespace\" \ \"))))(Tile((id \ - 33c9c8c9-c360-4423-9900-340d328ecda3)(label(f))(mold((out \ + d53912ff-83a8-4b21-80c5-482a4883d905)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 146b64c3-f32e-445b-82e4-fd3d5a6a312c)(label(:))(mold((out \ + 0822bcaf-a00a-465a-9755-20e7f4eaf2ad)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f5bf4d4a-bb60-47e8-9bb0-49ec53c6ed2f)(content(Whitespace\" \ + 530c0bde-85f2-47f1-a63c-cdeee2e4d904)(content(Whitespace\" \ \"))))(Tile((id \ - d7175a56-73d7-45b9-9e47-c17723d7b3dc)(label(\"(\"\")\"))(mold((out \ + 964f8a79-4858-4b0a-9d18-351a407b6d13)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4773ff41-a5b1-42d6-9f98-68f4850b9af3)(label(Int))(mold((out \ + ca16f358-b1a0-46ee-8c4b-e68b7fdab91e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8b7e2d10-47d5-4057-a256-9a4421d83399)(label(,))(mold((out \ + 88aca6e4-7e80-4b2e-bcb1-2498d163d22f)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f67fd215-ee3d-430b-a848-1423b4fc59c0)(shape \ + b131201e-ad94-4252-bcf2-4bd3abfae44d)(shape \ Convex)))(Secondary((id \ - ea3d9c7e-9634-4265-983d-2366efb0e742)(content(Whitespace\" \ + 20ab0045-1334-4d84-8137-7cb9e12d10eb)(content(Whitespace\" \ \"))))(Secondary((id \ - ac06becd-6c71-4701-806c-241f1a78e79f)(content(Whitespace\" \ + 071cd63d-fd54-479f-a58a-8881ad0ba046)(content(Whitespace\" \ \"))))(Secondary((id \ - 9747c1c7-1418-4b9b-af29-974bfba259b8)(content(Whitespace\" \ + 2911033e-f7ea-426c-b83b-fd304bab2de5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4deb5421-32b0-4857-bdc4-bc0ecd61ead3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8e23528c-c6f0-4baa-bb87-8b50a93ff829)(content(Whitespace\" \ + fb6209e1-3b79-4832-983d-9a284819df7a)(content(Whitespace\" \ \"))))(Tile((id \ - e7aca703-0531-40d7-9338-a58ec18277fd)(label(->))(mold((out \ + 98463ed0-2c82-4534-9a88-8ec780d92da1)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 1a78161f-1aab-42ac-903c-b2180dfbd7a4)(shape \ + b84f9fe5-fa23-4eb1-bee4-13e7fa696e9e)(shape \ Convex)))(Secondary((id \ - 8cda9233-f920-442f-8ff5-2f54f25ca83f)(content(Whitespace\" \ + 0d24b517-6b7c-49e7-82e8-19ad9ec2e2ed)(content(Whitespace\" \ + \"))))(Secondary((id \ + 09c74518-9ee5-4915-bf22-ed5f2f5be7d8)(content(Whitespace\" \ \"))))(Secondary((id \ - 911c9440-4148-43be-acfa-fff00c3b9cc5)(content(Whitespace\" \ + 1ebbdef5-4a32-44d8-953f-c90562371bd9)(content(Whitespace\" \ \"))))(Secondary((id \ - 9e079fc0-7b5b-429f-a802-bd93324b42cc)(content(Whitespace\" \ + 0a027f6f-7e7b-4326-8a85-af465f0a7420)(content(Whitespace\" \ \"))))(Secondary((id \ - d7b744a6-0de3-4365-bd75-f23fcccfae61)(content(Whitespace\" \ + 00323927-5cf1-4060-bd12-74aa08327cd0)(content(Whitespace\" \ \")))))((Secondary((id \ - ae5c1596-02fd-4960-9697-f73adc136762)(content(Whitespace\" \ + 6a25cc2a-69cc-4864-a54b-a7764c1676d3)(content(Whitespace\" \ \"))))(Tile((id \ - 68dcdeb6-8f27-4cd7-a4ce-4b01a9bcadc5)(label(fun \ + c423168b-9d88-446a-ae07-0a664c60ecce)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 16aae6e2-c723-4811-9dbd-2a7c4cc3009d)(content(Whitespace\" \ + 27dfc916-18f7-420f-b39b-fe53266910fc)(content(Whitespace\" \ \"))))(Tile((id \ - ecf0c43e-3a05-45d6-8e4c-48ff0e99353a)(label(\"(\"\")\"))(mold((out \ + f716266b-c8be-4581-b250-984d63b6fbe3)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 39a6650f-3ab4-4ef0-aba7-183f6baa2cc9)(label(a))(mold((out \ + 2bb90dc1-a91f-409d-a4cb-9650a68712ad)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 628ee25f-c44e-43b4-a4d6-2ff5e886aeed)(label(,))(mold((out \ + 7ae50a29-9e0d-493f-b4aa-3f2f11f5b789)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 87fdfc0e-8a5d-4fa2-b876-ffa71cecad65)(content(Whitespace\" \ + 2b2f4d71-025b-4275-a0e1-9be7ba4b1179)(content(Whitespace\" \ \"))))(Tile((id \ - 64488a6f-eb19-4fa5-bf49-b3c64e89fb04)(label(b))(mold((out \ + 46e2f0f8-b86e-4826-b2f9-fe1eb4d17d91)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - bfd9c6cd-c508-4fb6-9910-5923337a24b4)(label(:))(mold((out \ + ec82935f-dbe6-44ba-a061-2bce36224f7e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 864db579-07a4-4bc0-9bfa-0c5ea89d15a4)(content(Whitespace\" \ + 30ab007c-c5a6-4d59-99b1-56bac0bb7160)(content(Whitespace\" \ \"))))(Tile((id \ - 3b1e83b6-4a8e-450c-aa8a-d7a0a87238a2)(label(\"(\"\")\"))(mold((out \ + ad228b99-dc84-43a0-90ed-3aa1b3967a0f)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2339918a-66cf-4ea0-9fae-4635d5fd4b6c)(label(Int))(mold((out \ + 81a21b7b-5287-4171-90c8-70391ea8d5d9)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9e5daaaa-a850-4a2e-83a1-0d63eb6aefd3)(label(,))(mold((out \ + 02a3fa44-e0c8-4aa5-9616-b7d83ba546ec)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4bdb5ff2-f5f5-4b83-a871-2a0c50c32bac)(shape \ + 591d2a94-e810-48af-8cbf-3197cd72c327)(shape \ Convex)))(Secondary((id \ - c93acc29-6f0d-4548-bb4c-a79f6ae261a6)(content(Whitespace\" \ + f06af234-1165-493d-b873-b47f5b297dad)(content(Whitespace\" \ + \"))))(Secondary((id \ + d8a9307e-78ec-4d1b-ac51-8668fc6a10af)(content(Whitespace\" \ \"))))(Secondary((id \ - 186e9c42-94c4-4f1c-8c72-03151b226dfc)(content(Whitespace\" \ + c171c70f-f9b9-424d-b686-1766708c21a7)(content(Whitespace\" \ \"))))(Secondary((id \ - c178330b-7fc5-42f4-9b12-bd4143e7a081)(content(Whitespace\" \ + 9490824d-3073-4e55-b6ac-e3601f09bd0a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1ab7cd61-7a63-4902-ac6b-5519b41a74dd)(content(Whitespace\" \ + 5a427452-2351-440f-bf7f-0a5ba3f2946c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4e3562fe-8bda-4180-9968-efa5d769fd15)(content(Whitespace\" \ + c5ab0cfd-d873-4b9f-9372-3369a86a25fb)(content(Whitespace\" \ \"))))(Tile((id \ - fb29c220-2ba0-488b-8b4f-dd470175794e)(label(a))(mold((out \ + ca851131-76db-4fc2-b08c-da2f450cff28)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9b26649-0c2a-4ea6-ad47-221eb07dd0fd)(content(Whitespace\" \ + dfb9a24d-2654-4be3-a601-7a917bf7944e)(content(Whitespace\" \ \"))))(Tile((id \ - 71c6ca75-6393-49b2-b425-06f7179330c4)(label(+))(mold((out \ + d4a1b884-05b7-490a-b7ea-91d37bd6bfc1)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7ee42f2b-fb54-4bc3-82d3-e2ec52eb1585)(content(Whitespace\" \ + bc2dca84-abca-4423-8743-1ca9ddedce81)(content(Whitespace\" \ \"))))(Tile((id \ - 88f0770b-1272-4414-9eba-67003eccedcc)(label(1))(mold((out \ + b06dfd1d-91b1-4352-a36a-076ecd0a2269)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6c42f123-9cea-4ed5-ae5b-b8c2e2a942c7)(content(Whitespace\" \ + 87eb5fd8-49b2-4fe5-a6eb-655451b1f4cb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4c9beab6-89f8-4430-a41b-f9b504f94fc4)(content(Whitespace\" \ + dad9de9e-6e93-484f-bd8c-28df93b0da06)(content(Whitespace\" \ \"))))(Tile((id \ - 5568a4dc-3aa8-4752-86b6-b9009a685e75)(label(f))(mold((out \ + 5df5e410-305e-4e26-b1d4-71e197de9811)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c0dbfa8b-57d6-444a-9c6a-278f665aecab)(label(\"(\"\")\"))(mold((out \ + dccfc060-0742-4072-bfd4-bc4c04000904)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2786036a-1700-4ad1-a169-a3833ba80b85)(label(1))(mold((out \ + 3a2e58b2-df94-41ad-a531-f0d78b9e3edd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 44d7525f-50bd-4d55-bf6a-44fa6ddb6d96)(label(,))(mold((out \ + 951fafa4-ff14-4695-bc02-207a1895c66b)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b2250004-082f-49c8-aa1f-962ae7ac043d)(content(Whitespace\" \ + b0b19ca0-b024-432f-b2f0-3ec428acf942)(content(Whitespace\" \ \"))))(Tile((id \ - 8bf464c7-90d2-46d2-9ffa-7a4292ed2ce7)(label(2))(mold((out \ + a3492fe6-456d-44a0-9159-2da47a11a9c6)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 835bc565-a2ec-435f-89a5-3480d0c7f8de)(label(\";\"))(mold((out \ + cfcced1d-e9f8-473e-8f80-46e5d60af422)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bcac0509-a42c-41bf-835c-91c71468aba7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5136f388-18ba-4a95-abeb-0e88a05d8d86)(label(let = \ + f9042aa1-ef31-4dfa-ab93-72eb124c811f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b94fc01e-4a92-4ae9-bcb6-e4083f81350b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f87b5640-9f45-4449-9bca-f5f75f823596)(content(Whitespace\" \ + 4c5a73ed-3a5a-4469-910e-21196d2ca81f)(content(Whitespace\" \ \"))))(Tile((id \ - 30021ea1-ea8c-4fb4-b390-c052d4683e2b)(label(f))(mold((out \ + 7bafc498-f448-42c7-be93-7c7251d28b34)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e4b4bdf1-9017-43da-b1d0-368565245c26)(label(:))(mold((out \ + 79cdb704-c1c6-415e-9338-70b0c9a0e35d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e45c0013-337e-4493-ae0c-de06c0667908)(content(Whitespace\" \ + f9d6db4e-df30-4d88-9b2c-73dbf42b8c61)(content(Whitespace\" \ \"))))(Tile((id \ - 6c0bb721-7e2d-4b6f-9cc1-427af04cef69)(label(\"(\"\")\"))(mold((out \ + 0e2b7ffc-c426-45b7-9b0c-af09166d8f25)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - cf06dab3-31c7-4608-b861-7c0d63de193e)(label(Int))(mold((out \ + 7f85d424-2112-4b31-8c3a-6e834736c85d)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 30b18d09-9f2e-43cc-a7a5-d50428913412)(label(,))(mold((out \ + 75e56734-d29c-4516-890d-f962a1f9d267)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 1f5f5e12-6b97-40e3-84ab-d1274537ca85)(shape \ + 6e2cc051-0193-4716-a53c-c00ae9bb00b9)(shape \ Convex)))(Secondary((id \ - f26b0b9d-004e-4ecd-a996-680ec958f6e0)(content(Whitespace\" \ + 810b6986-5a00-4ded-8cf7-6bcee986006d)(content(Whitespace\" \ \"))))(Secondary((id \ - 622a653b-e7c9-4526-b9a2-08ac21d4cd57)(content(Whitespace\" \ + 14a526c4-340b-4cd1-9ddd-c610df7dfa91)(content(Whitespace\" \ \"))))(Secondary((id \ - 2280fb21-e600-445b-8cb4-ba205541771a)(content(Whitespace\" \ + 664ef446-c9a3-45ec-bc98-256d32ac08a5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6e98b565-d231-483a-8dc1-f4793df47b4f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0119daf9-ffe2-47b7-828f-3e36cd01939a)(content(Whitespace\" \ + e897e0ab-e739-4196-aaef-f309c2e6c87b)(content(Whitespace\" \ \"))))(Tile((id \ - 4a55088b-f2b0-4df9-8790-8a808d7ca177)(label(->))(mold((out \ + 6fef2665-08d4-4fd9-b7af-45b02a4ff70c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f09d619b-c99a-46e3-85c3-63c98dedb51f)(content(Whitespace\" \ + 498f37b3-1be3-4414-95ec-bbf672821622)(content(Whitespace\" \ \"))))(Tile((id \ - 71332adc-323f-4c5f-8dbb-b7d9bc8155e6)(label(Int))(mold((out \ + c0d7bf93-2f43-4d7e-86c2-d56c4ee5f564)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - de3569d5-aac5-42bf-8a5e-0845d65db228)(content(Whitespace\" \ + 6688af32-79f1-4cb8-8fd0-1371748bd8f9)(content(Whitespace\" \ \")))))((Secondary((id \ - 5803e4b5-beb5-4d13-9357-848aacf8e125)(content(Whitespace\" \ + aa64dd83-1c8e-43e9-af02-9f2f25ca7d6e)(content(Whitespace\" \ \"))))(Tile((id \ - 9ca74c81-f846-46e8-890c-d6ef40bfbbc6)(label(fun \ + 4911837e-2404-4ec5-8bc1-e50654fa5fe6)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 061721bb-df11-404e-aef0-4e1c985ad9ed)(content(Whitespace\" \ + 70805a22-abdd-42ed-9268-322855c90800)(content(Whitespace\" \ \"))))(Tile((id \ - 93ee75be-254c-4640-ad4e-49568f20c8ef)(label(a))(mold((out \ + 35d7bb29-7017-4bca-a2db-253df116efc9)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1777e6b7-591b-497a-a6e1-1999b40a6f43)(label(,))(mold((out \ + 345536af-891d-4b2f-809a-4839e3eded8c)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 36e3d56a-2134-44aa-8d2d-87a1e83ed10f)(content(Whitespace\" \ + a988b54c-62be-4beb-ab1f-7fde46772d46)(content(Whitespace\" \ \"))))(Tile((id \ - a0bba5c5-278e-4899-8d8f-cb15470b6c43)(label(b))(mold((out \ + 8ac8c748-7fd3-4a02-805e-5d5323bc696c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9643464d-c242-4be7-8845-97e4089bd58b)(content(Whitespace\" \ + ce28116e-9e2d-43e9-a793-a53572192803)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0fdceec8-37ef-46c6-b19e-f6484c9f2d45)(content(Whitespace\" \ + 8a9e96dc-f7bc-42ff-ba47-01c977440fa2)(content(Whitespace\" \ \"))))(Tile((id \ - c2add7cc-b896-48c5-82bc-df319bfc2e27)(label(a))(mold((out \ + 2fec9ac7-9339-4f96-84b4-34a9c6f73bfa)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4c997f2b-73ee-4068-be01-2504808a9197)(content(Whitespace\" \ + c0ec2546-64ca-4bc3-b812-05af6069baa9)(content(Whitespace\" \ \"))))(Tile((id \ - b26310ec-93bd-4e39-a3bd-0023a8aed824)(label(+))(mold((out \ + 6ff7b3fe-68e5-460c-a9d0-eef19693b947)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 950dbf05-6c2f-4479-8c6c-0bdcf9e65780)(content(Whitespace\" \ + a5b14a37-466e-46c0-b847-f10f9bc1c7e9)(content(Whitespace\" \ \"))))(Tile((id \ - 8f18b64b-c26f-4267-95e6-52149758e262)(label(1))(mold((out \ + c46c568d-4f00-477b-923f-82d0ede12890)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8159a7a5-9bfe-4886-80a2-eb1de0a701bd)(content(Whitespace\" \ + b6188cdf-5f8b-4945-a226-a898fd454383)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b04feb14-582e-4409-83d9-2de95ee360a9)(content(Whitespace\" \ + 43740e87-1f7d-4182-a068-8485e851c77e)(content(Whitespace\" \ \"))))(Tile((id \ - 1f3c8988-e979-4d33-9c8a-2b988d6af590)(label(f))(mold((out \ + 569b185c-c138-4865-858c-a1842790e6d2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c7c40244-065f-4416-89b2-45dc2973c677)(label(\"(\"\")\"))(mold((out \ + ed5b1350-b5d6-4104-a2ed-92003976b091)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d86dabc6-4a35-457d-997f-5dd1745c942c)(label(1))(mold((out \ + 30d5a125-e373-46fc-a3a5-841fb583bf72)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 18130974-1223-469c-9335-57691b0d0f09)(label(,))(mold((out \ + 9adab38f-695e-43fe-b1b0-2123d6ae4baa)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d66e1e64-946a-46f2-97f9-c93096f6e8db)(content(Whitespace\" \ + eb450173-68bd-4d31-b717-48cb6cea8ed8)(content(Whitespace\" \ \"))))(Tile((id \ - 74e58855-f241-416d-9f54-b8e271d3be37)(label(2))(mold((out \ + 36e861e9-c3be-462e-a88b-12970221948d)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - ca19b144-55cc-4fc5-bb88-6e1cac2b99c0)(label(\";\"))(mold((out \ + 5471073b-c26c-4631-85c6-e5ace2e10f5f)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 672a922f-f6c3-46f4-9bb0-fbfc13e6b150)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0e335cf7-889c-4bb7-a5d7-7d0f5c7a71f5)(label(let = \ + ebc4fcb0-e14c-4cdc-bbd6-72c4124013e5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a9d79ee8-1272-4310-adbc-d930a3cd5312)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9cb8b1dc-0c4b-4315-891d-7b5784a5863c)(content(Whitespace\" \ + d71737cd-b6d0-43a6-b418-1a7676108e28)(content(Whitespace\" \ \"))))(Tile((id \ - 7c5f349c-24e7-4a2f-8454-35ea89053144)(label(f))(mold((out \ + 77042751-cbcd-47a4-8962-2ecf6f843eb3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 837a5d29-00a1-4152-8dc4-3492fe61e7ee)(label(:))(mold((out \ + 1e3d6e4c-028f-422c-bbd7-46be30ac4297)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c668f238-b661-4e8e-a59d-541a5d96392d)(content(Whitespace\" \ + dc5f6381-8b71-4359-8379-da4f9686e73e)(content(Whitespace\" \ \"))))(Tile((id \ - 7962dec5-6bdc-41be-8e0f-458bc89ed3b0)(label(\"(\"\")\"))(mold((out \ + c86ef10b-ccf7-4129-a5fb-f49e3484a0c1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2dd0a138-b7ed-4642-8808-99b0926fd629)(label(Int))(mold((out \ + 970851d6-aca2-47ba-971e-1b7e5676f049)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c1d3ec25-cbd8-427c-a333-192d6a897e68)(label(,))(mold((out \ + 4c6dc8ca-4503-4e33-8cf1-8e3f7689ba8d)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 96695643-1b0c-44ee-b2b4-d1cabcb50180)(shape \ + 440d7842-f720-4f15-8168-1b4be6f555aa)(shape \ Convex)))(Secondary((id \ - a5295940-2563-466c-aaa6-8ca9da4d48dc)(content(Whitespace\" \ + 4563b440-4280-4ef4-a76a-5e945581a84e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 42315039-ee3b-41d1-89b5-68d4eeb1f683)(content(Whitespace\" \ \"))))(Secondary((id \ - cf7e1aff-0659-4aaa-a86a-d1fc0c423a25)(content(Whitespace\" \ + 3ccd1d96-1197-4daa-bb31-2d074baa28ac)(content(Whitespace\" \ \"))))(Secondary((id \ - b7946df3-c9c2-437a-83a3-f0578395ae05)(content(Whitespace\" \ + 135da9e1-5038-461c-8757-b27e0b9834ce)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0ed4f47f-67a4-4584-b3fc-5402b7bd90c6)(content(Whitespace\" \ + 6300e6bb-c002-4c64-939c-32f1d635db62)(content(Whitespace\" \ \"))))(Tile((id \ - 8030df3f-5ee9-4e7d-8f97-a2d5e9e446ef)(label(->))(mold((out \ + 3e209554-611c-4b99-adce-f78c142f9678)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0d126c50-ac37-473d-a786-99171621e36f)(content(Whitespace\" \ + 10677ba9-8355-4637-849f-55b0ac355ecb)(content(Whitespace\" \ \"))))(Tile((id \ - 19767020-38c4-49b2-9f69-71fa03d4fdea)(label(Int))(mold((out \ + f029b7c4-8a6e-407c-bcef-bc60f13ccc6b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 692ffccc-7f95-4ee5-a748-dc424648ef03)(content(Whitespace\" \ + 4d671960-3dc7-469e-bc94-d9f85304234b)(content(Whitespace\" \ \")))))((Secondary((id \ - deedae70-0bab-474b-984b-b6a750e30ff6)(content(Whitespace\" \ + 20668536-b9fe-4f52-bcf5-cc921d9c59e1)(content(Whitespace\" \ \"))))(Tile((id \ - 6edc5b49-902b-439b-813c-8780ab2a1486)(label(fun \ + f8b49d68-5a39-4a73-8b96-2df7cff483e3)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f5950683-3279-4510-8f44-853289f07b7d)(content(Whitespace\" \ + c290be37-98df-4e95-8d94-c05467574a74)(content(Whitespace\" \ \"))))(Tile((id \ - 919762b1-7193-4c52-905f-807adaa9fa02)(label(a))(mold((out \ + e659ae87-013b-4ba8-a9e7-e1c3ab485a14)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d0963770-45ec-4eed-90d4-d0439869fff0)(label(:))(mold((out \ + 0285464f-4c43-46c5-bc12-1dbfb0bfac63)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bdd93646-39dc-4761-9b0b-2663ee815f0b)(content(Whitespace\" \ - \"))))(Grout((id 602031c5-6a9f-482c-b103-fae3d559b137)(shape \ + 399b04af-4a93-4d90-9a23-6e064ffaedf1)(content(Whitespace\" \ + \"))))(Grout((id 1baefb26-ff9b-4306-94b1-81362a14b692)(shape \ Convex)))(Tile((id \ - 79128de0-b9e0-4c95-a2c8-2cef2d6f3d12)(label(,))(mold((out \ + 73330c4a-f166-4af0-9195-ab12a83b9ed5)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a1059cc9-f4e2-4255-966b-604b813b1c70)(content(Whitespace\" \ + 59c1a946-0b79-4f7b-a95a-2efb120dffb2)(content(Whitespace\" \ \"))))(Tile((id \ - db34c768-6a7a-4e0a-8f47-762e74183e0a)(label(b))(mold((out \ + 38f13aca-751c-4a31-8092-30fa65d6c0f0)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8d28ee11-21ef-4fb9-967e-f8b0bec01f56)(content(Whitespace\" \ + 48e1fca6-4927-46e0-89a4-669ead2fd537)(content(Whitespace\" \ \"))))(Secondary((id \ - 1c661a03-f7c5-4010-bdbc-99c6e10ad95d)(content(Whitespace\" \ + 9d1580b9-18f8-4e36-9b0c-fb724d1fa47c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 67a5dfb1-084f-4397-a7ce-aea71d89d603)(content(Whitespace\" \ + 9f7637bb-a589-4886-bc2c-84f24bf33351)(content(Whitespace\" \ \"))))(Tile((id \ - 6af292b1-c8cf-40c3-850e-a9f57d0b01ae)(label(a))(mold((out \ + 147bf938-d556-4338-a313-106354271255)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8a824172-67fd-4122-8172-b604807dfa36)(content(Whitespace\" \ + a250792f-ee12-4f94-a184-83a6eb901af8)(content(Whitespace\" \ \"))))(Tile((id \ - 4d678f68-f617-47cb-8aff-465b1eeb8b3b)(label(+))(mold((out \ + c6055ca2-f8af-4fa2-9e88-f5878407aa9a)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 90a12374-4576-48db-8e13-165a9a21c350)(content(Whitespace\" \ + c518ac9f-8aba-4323-a85a-bef0d466925a)(content(Whitespace\" \ \"))))(Tile((id \ - ea78e47c-f511-4a2d-8fb7-ee025f317737)(label(1))(mold((out \ + 378163bf-adfe-40c7-be7c-c5fce772e493)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 46260c07-be9e-4386-8dee-dab4b741a5cc)(content(Whitespace\" \ + c884f25d-30f2-4f04-84b8-ebbdc9513817)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c3829b28-a233-46a1-a6ca-191802323243)(content(Whitespace\" \ + 4801cb5a-5927-4d99-864f-ac0d0584c154)(content(Whitespace\" \ \"))))(Tile((id \ - 30947342-4312-42a2-be5a-9a0a5d758a56)(label(f))(mold((out \ + 99fdfc3b-c239-4508-aebb-b8c29052bdb2)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4e51c244-6225-4e93-af67-83613640fc2c)(label(\"(\"\")\"))(mold((out \ + baef7d1c-b5ee-45be-9c01-6a8c172cefb5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e9bbe4ad-8032-4153-930d-69e078e6a425)(label(1))(mold((out \ + 26d8cca4-6998-43db-a690-b2e0cc824680)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7877efdb-4f49-43e2-a10b-9336cd1078fa)(label(,))(mold((out \ + 1e941029-dadd-454c-873b-a2ae7a5f9bdc)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 06f706c7-edc0-4c53-abaf-653bee08519e)(content(Whitespace\" \ + 28414614-8cdd-4dc6-9d41-f518070feeca)(content(Whitespace\" \ \"))))(Tile((id \ - a0d3ce6d-c01b-437f-8c15-799b7c290b2e)(label(2))(mold((out \ + c86388a4-c2c4-4680-be35-d62a573b9e19)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f7f1fe30-f76e-4f09-a642-dec5acfd3e52)(label(\";\"))(mold((out \ + 637c43d2-1fea-48ed-88b8-ee598e1bfd2a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 408fc2b0-793a-43c4-a2c3-3247418af171)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 38c32938-8c8a-4898-ab92-bfd9b0046658)(label(let = \ + f5d78c30-4c90-4561-9e6c-538ec0121217)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f1c6a454-343d-4eb1-a928-8d96eff67dc3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fb37a419-dcde-4b3c-9359-723ebb4c61c2)(content(Whitespace\" \ + e9396021-2f8c-4a10-ab80-a708ea89c266)(content(Whitespace\" \ \"))))(Tile((id \ - 1799cdf0-8ed6-4b82-aece-da0808c4228c)(label(f))(mold((out \ + 4a0ecaf2-f05a-4ff4-8a61-08b3cd066050)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 29102023-1a5b-4447-bbb0-aafc7ac8c573)(label(:))(mold((out \ + 9b66c49a-b90a-4308-9afa-c509538a4439)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 305a2b6d-3c3e-478f-91b2-0af8ac8c98d1)(content(Whitespace\" \ + 965ba50a-8122-4719-8826-5f71e7f9fb88)(content(Whitespace\" \ \"))))(Tile((id \ - e15899d9-68c6-4086-83aa-6d01e56d892c)(label(\"(\"\")\"))(mold((out \ + 51e02eb3-bc19-4ba2-b6d1-95dafa2aaef2)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a09d060b-a50f-4fac-a0d2-9622796d866e)(label(Int))(mold((out \ + 7f3bead6-0563-4b15-b1b0-301554a47386)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 244abda5-730e-48c8-9a4e-7d1f44144bf0)(label(,))(mold((out \ + c12282a0-45b8-497b-a1c6-3d4306404484)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f8b354b9-a827-4278-9107-b0cba7f06efb)(shape \ + 42fba9f5-0f85-4b25-af9f-90cb591354e5)(shape \ Convex)))(Secondary((id \ - 6dccec00-de23-4f9c-8f45-c7e8117538e6)(content(Whitespace\" \ + 1b15a8fa-3e30-462e-8a59-a7c2454e5b64)(content(Whitespace\" \ \"))))(Secondary((id \ - 7189ce31-cb8d-4e09-bae1-2cf87591683d)(content(Whitespace\" \ + e281a711-f035-4b03-8be5-2ae31ea86cee)(content(Whitespace\" \ \"))))(Secondary((id \ - 33261f91-20dc-43ad-a71a-9732e33e94ff)(content(Whitespace\" \ + 0e51023b-be8b-4dec-9a24-32e6ea3e0495)(content(Whitespace\" \ + \"))))(Secondary((id \ + a148a37b-022a-4922-a78d-0ee9358e6333)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ad5246a6-85f5-423a-8182-0e133efdbdfd)(content(Whitespace\" \ + 6d921357-b093-4504-b2d5-2f4bc42d12a5)(content(Whitespace\" \ \"))))(Tile((id \ - 659b9ebc-1af5-49b5-872b-0e295bac1f62)(label(->))(mold((out \ + 131e03f2-d8ba-446b-9416-9721b12e8ad1)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ade62157-6f94-4645-b4a9-3ec15d795e0c)(content(Whitespace\" \ + c18f456d-bfd6-4ca8-aec1-0420159dc26c)(content(Whitespace\" \ \"))))(Tile((id \ - 586ee7a4-59cc-4c8c-90ab-cf1faf0b7876)(label(Int))(mold((out \ + f2a74f31-8bd2-4572-b821-2cdae72eade4)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f9859a85-2aea-4e56-9f4d-11254c4de8c6)(content(Whitespace\" \ + 3e369f63-3994-4fe6-b356-2dbb4f4cc881)(content(Whitespace\" \ \")))))((Secondary((id \ - fb2ec18a-2d75-4a04-a5c1-b0787a205336)(content(Whitespace\" \ + 689dee09-afca-44d5-a527-771e64675d87)(content(Whitespace\" \ \"))))(Tile((id \ - c3e0703c-abe8-40d0-b3fa-3c63ea47483c)(label(fun \ + 52033ae3-5ae5-4f2a-bf8f-e6a5ea53f6fb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 24ef38f8-8e53-40f7-9cfd-5c5627d925ee)(content(Whitespace\" \ + fe8cd260-7335-4f25-a872-bcac0a6f6d53)(content(Whitespace\" \ \"))))(Tile((id \ - 6eed80be-2011-4dd4-bfc8-f571bea100cb)(label(a))(mold((out \ + 8cf1949f-c811-4003-9e5d-77f94e4d8744)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2f183a0a-de5d-4efe-9c1c-4c669cf9d4e9)(label(:))(mold((out \ + 329e7886-88f2-493d-b858-293e12cdc21f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - daec8d15-905c-4316-8301-3aa674f026d8)(content(Whitespace\" \ + e68c833f-a788-4ed3-8656-ddd9013ed451)(content(Whitespace\" \ \"))))(Tile((id \ - 47beccea-7e84-487f-9ab9-f761b00383e2)(label(Int))(mold((out \ + c20ea726-acad-45ac-a13a-3c9aa82937e9)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d016d41f-801c-4793-b3d0-ecd33e37f205)(label(,))(mold((out \ + 3142844e-d8b4-4d68-8899-fa1047f0e9d3)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - b267102d-ba9c-4b17-9f0f-3428b2337027)(content(Whitespace\" \ + fa296f80-daf0-44e4-8eaa-3ebab1655fae)(content(Whitespace\" \ \"))))(Tile((id \ - 3679576d-8ca7-4afb-abd8-a04192ba414b)(label(b))(mold((out \ + 2f81ff0c-b8db-4ab1-8c1b-fc4d56647e1c)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9c4afb61-40df-4943-a033-aaa259e249fe)(content(Whitespace\" \ + 121d598a-d31d-475f-8c82-280c804713f1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 17721f47-c0dc-4e23-9341-8a0c2a37a906)(content(Whitespace\" \ + e44b06ba-0433-478f-bcf3-3c4d04adec0a)(content(Whitespace\" \ \"))))(Tile((id \ - fbd40537-4e0c-48fc-afef-d866502fccc4)(label(a))(mold((out \ + 6fd34eac-3ffd-41a9-a461-b6baf8e6b320)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ede9a8ca-43db-4930-9285-1406628c896f)(content(Whitespace\" \ + c1a99c86-e6f1-4015-a4ad-29f932730b45)(content(Whitespace\" \ \"))))(Tile((id \ - 56ebe246-3b97-48e4-b685-dc383d766cdd)(label(+))(mold((out \ + 7531d75d-4ac5-49c2-942a-b0773f2c18fa)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 418a6ccf-97a6-45b3-832d-7462588ce695)(content(Whitespace\" \ + 378d495c-14b4-4f3b-99b0-83b299b42953)(content(Whitespace\" \ \"))))(Tile((id \ - 36e744be-17bc-4523-a04e-8f9c81c67838)(label(1))(mold((out \ + 4f2605f9-27cc-467c-b8de-6b8c5369795e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 186313e6-f099-491e-bfe6-67eda5c29054)(content(Whitespace\" \ + 798d8937-fa75-4cd3-b007-06044754abd3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 216eda00-92cd-47c3-9b2b-47fd5b6e96e6)(content(Whitespace\" \ + 9c22105f-9b9a-41c2-a7da-31b368ca5268)(content(Whitespace\" \ \"))))(Tile((id \ - c08c18a5-12e9-4384-ba31-042d7d46b4e1)(label(f))(mold((out \ + c38a5375-a26a-4cf5-95af-506747effafc)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 525eb658-667b-4414-819f-9c7fe3c1f2cc)(label(\"(\"\")\"))(mold((out \ + e5af6a96-3548-42d5-bd1e-3af6cf30a9ea)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 16f981f0-8141-4d22-b474-b569fe24a0f5)(label(1))(mold((out \ + 6339f357-ce20-468b-87d7-61ffa266cdd9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d45c5ca7-6fb0-40a6-b4c5-677bfa7f94d5)(label(,))(mold((out \ + f9a79446-2016-4a9c-aaab-d70887a1c6fe)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3b370437-e9a3-4ffc-9312-8284a99157b2)(content(Whitespace\" \ + 49fd670b-4f55-44fe-ab34-f407521a63f7)(content(Whitespace\" \ \"))))(Tile((id \ - 78a530ea-c689-4c64-97a8-f1d5b965dc99)(label(2))(mold((out \ + c4a85424-0297-4aee-858e-9a30c5f98f30)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 179e5879-afba-4fe7-aa18-5da2ef106bed)(label(\";\"))(mold((out \ + 87c698cf-8aba-44ba-bb79-a223a452b823)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c3be3c08-bce7-4b02-9764-9611e379e6fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 99ac78e3-4cf4-45f0-ab03-866a069dcc51)(label(let = \ + 241640f0-109f-4e09-b4cc-efc7c097a369)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fa7004cc-6f59-4317-8084-9b2583a1838e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b258b4c7-c386-451d-b7f1-5020942da564)(content(Whitespace\" \ + 35d4e102-4c3b-4056-be2b-2fb9392e33b3)(content(Whitespace\" \ \"))))(Tile((id \ - 335a6690-58e4-410a-ae7b-1a4705db4d9f)(label(f))(mold((out \ + 7b885957-fa00-45d3-ba15-622c32b6142d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4aaf3fbd-24d2-4655-840a-67d67d685e22)(label(:))(mold((out \ + 9920c06e-bfa1-4f2b-9e81-db63e2a89764)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7c2d4144-90a7-430c-899e-ace6145ca414)(content(Whitespace\" \ + 850d0e94-3118-4f4a-8e9f-fc6d16f20d59)(content(Whitespace\" \ \"))))(Tile((id \ - 97289ff1-93ad-45b5-aee4-78637a324c14)(label(\"(\"\")\"))(mold((out \ + bad1a8f8-98ab-4e9f-98e5-fa3af6648df8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 56e4df84-fcd5-4b53-a0fb-4485a034702d)(label(Int))(mold((out \ + 8485cdf8-1f0d-4c19-af1a-f4047f63db6b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9611b7b3-4fd1-4130-85cf-a32bf4474afe)(label(,))(mold((out \ + c430e9b9-5362-4565-87fb-35164c25fbcf)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - db7ad3c0-4504-4c44-8057-50fb96503ef3)(shape \ + 0a97dbc8-0db5-401c-ba09-1ac84dd40a4f)(shape \ Convex)))(Secondary((id \ - 1e15d179-7a0e-492a-9472-4ed948ef5d53)(content(Whitespace\" \ + 36182a45-1c4d-4edf-88d2-b7359c118b60)(content(Whitespace\" \ + \"))))(Secondary((id \ + 19a0b589-b7fb-4c5a-b196-60414355f924)(content(Whitespace\" \ \"))))(Secondary((id \ - d6194650-5984-43cf-afc2-221c9b9edc7c)(content(Whitespace\" \ + 15c7dfec-19d3-4fda-95ff-802d797065dd)(content(Whitespace\" \ \"))))(Secondary((id \ - bb44d050-397d-4f09-a825-a9e288bb2ef8)(content(Whitespace\" \ + c687fbe7-74f5-4f51-b980-dd1b6034ac2d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0f6ec549-f9db-4207-927c-eec4f0a7df5f)(content(Whitespace\" \ + 733bf0c2-6254-4827-b718-4ba5a5db9ba4)(content(Whitespace\" \ \"))))(Tile((id \ - 157340e3-9719-4770-a926-e0cb4c0d7c91)(label(->))(mold((out \ + 07bd9b7e-200a-411e-ad5d-9e9d526147bf)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 217220ff-a9bd-4fbe-ab6e-e39e71dd7c0f)(content(Whitespace\" \ + 36f66486-5dfb-4b38-830f-02c75a905c49)(content(Whitespace\" \ \"))))(Tile((id \ - c3ea6e30-410d-425a-a924-066b5a0b70ee)(label(Int))(mold((out \ + b7a86965-9327-4b77-91e4-648c84c7604d)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 63fdc9a9-6b35-463e-943d-e715ce781a31)(content(Whitespace\" \ + 9494308a-26bf-41ff-8bac-672fd9ea208f)(content(Whitespace\" \ \")))))((Secondary((id \ - 1e7db639-f289-48d1-a736-652a8775a2ad)(content(Whitespace\" \ + 90f1a775-b049-4401-a27d-381142a796bb)(content(Whitespace\" \ \"))))(Tile((id \ - db8d8b9e-7ea0-41ac-99a8-a7510ebbb8fc)(label(fun \ + 070297db-ec76-4b31-8d06-82a36b79e375)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0ee79c80-e6a7-43ba-91b1-ab079873b4e0)(content(Whitespace\" \ + d64d0383-49e4-4bee-8e88-402364ac2bf2)(content(Whitespace\" \ \"))))(Tile((id \ - 6fcff986-dc50-4012-a998-4afefd9503bd)(label(\"(\"\")\"))(mold((out \ + 0980686f-33ad-4301-9340-0cce1fe86647)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9826d7b5-b6ce-4dda-9a1f-b3e3f787c202)(label(a))(mold((out \ + 92d2eafc-6979-4c72-9bb6-32abe12df48b)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6e336792-a7c6-499f-a483-8cd8a3d1f860)(label(,))(mold((out \ + a9e019ac-9602-4109-9423-38f211362ad7)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ecfe0be8-49eb-4a95-918e-5eea06086693)(content(Whitespace\" \ + 8d809fbe-794e-45a7-8b5f-6ad1b4ed0327)(content(Whitespace\" \ \"))))(Tile((id \ - 2652ca66-7145-4427-942f-bb9e2c2c505d)(label(b))(mold((out \ + 0bb9c4b3-63e8-4ce1-bd10-870990cb858e)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 3dae0dfb-2d9d-4805-a810-f3065bf44dbe)(label(:))(mold((out \ + 238cbd62-29bf-4ae7-9c87-e8a163811b3f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 35fdfb89-9162-4f18-afa4-5b21f031792f)(content(Whitespace\" \ + 835b7059-495d-4581-b226-930f0aa2d0c6)(content(Whitespace\" \ \"))))(Tile((id \ - fceda397-d473-402b-86e0-909a75930cce)(label(\"(\"\")\"))(mold((out \ + 7c06401a-3c56-4e3e-8b7c-7140f27f2fcf)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f754468b-87bb-486c-b95f-e3cd02b09cf9)(label(Int))(mold((out \ + 25f1ebe6-5693-4a55-8031-c0f87b04b9fd)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - eec33fdd-8574-4c87-95e2-2d1ac57f6309)(label(,))(mold((out \ + 3f447514-7da4-4285-bc4c-f14f0ff134e3)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 0a3f1ef7-fe0d-43b1-90a0-e5589138f588)(shape \ + a617f497-94ad-43f7-aeba-98f0d64fa6c7)(shape \ Convex)))(Secondary((id \ - 4f22bf09-98c6-4204-893d-f5263e57a726)(content(Whitespace\" \ + d6d411e5-06c0-40a3-a8c6-ae65e0da3922)(content(Whitespace\" \ + \"))))(Secondary((id \ + 316c247d-f869-49b2-a4ca-cfb4f94f037d)(content(Whitespace\" \ \"))))(Secondary((id \ - b8d40633-c604-41d2-9a9b-268130bf5d76)(content(Whitespace\" \ + e0cb5f29-56e4-4bb1-b77c-4a2f1f2dda3f)(content(Whitespace\" \ \"))))(Secondary((id \ - 7aef0d74-8a81-4190-ab7c-8e8c47eb6e35)(content(Whitespace\" \ + dff703fb-9c48-4cb6-8008-ef9021a8e557)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5a2fd7e6-1856-4640-8a21-df412669eebd)(content(Whitespace\" \ + 1c6a2c54-98e3-423f-b2fa-04a0f31c176d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 16ab6ab0-3d6c-4800-a44a-9b0b0950bc50)(content(Whitespace\" \ + b7e696ee-0072-4504-b813-66ad684ceebd)(content(Whitespace\" \ \"))))(Tile((id \ - be1a6391-c1f7-4780-a6db-c1f8f7500058)(label(a))(mold((out \ + 9b333115-4981-4abd-a710-06069dc2e201)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c3e5dcc1-9137-4ede-899e-09f9e82938c1)(content(Whitespace\" \ + abb84c80-a7f2-419c-9980-06faaf582b40)(content(Whitespace\" \ \"))))(Tile((id \ - 3ff81597-b364-4e23-848e-c47bb26b1bfe)(label(+))(mold((out \ + d952b11c-7972-495d-94a7-1342bc85026f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4d86c05d-e02e-4aba-a962-1822675de667)(content(Whitespace\" \ + 8fa0aaf4-5345-4d61-8550-733584d4ef57)(content(Whitespace\" \ \"))))(Tile((id \ - 9e0f66c8-c9aa-43d1-b456-e0e652ae2020)(label(1))(mold((out \ + 02e09527-8c71-4095-ab6c-6efbcc08be6c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1d369fb1-2dc5-4447-8915-12487790edbc)(content(Whitespace\" \ + dcd645d2-396d-4e4f-8c82-353c6e98ec75)(content(Whitespace\" \ \")))))))))(Secondary((id \ - be2fff4c-d1c3-4503-96d4-04d0037224d0)(content(Whitespace\" \ + a52ab881-25b0-4df9-a9b0-fe74890885c0)(content(Whitespace\" \ \"))))(Tile((id \ - 62ff48f7-a3e9-45de-bfc0-e34bc0ec2760)(label(f))(mold((out \ + 2287944d-f0dd-4ad6-8200-955c20976f79)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 761724b8-7e91-45e7-b52f-6cd9a3cadae7)(label(\"(\"\")\"))(mold((out \ + 81022dd8-a05f-4888-a694-153bd0efec62)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a99dfc1e-264a-4739-8800-1868f1e89e68)(label(1))(mold((out \ + a2e45f4a-0b70-4af4-8d48-5d25c67aa4c8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ace5b158-f6ff-4ee8-bd41-3ed5ec5ffde1)(label(,))(mold((out \ + 0e94a859-d72e-431a-b202-89dd534e9fba)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a1de0c7f-e868-4e71-944f-3ae90a85e456)(content(Whitespace\" \ + b998420a-5352-4820-a0a8-739ed79e6e48)(content(Whitespace\" \ \"))))(Tile((id \ - 0fc7cb34-f657-4db1-a021-3632c7887859)(label(2))(mold((out \ + 8e0c0849-c714-4413-b6b3-27bdcb546b31)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 327b6589-861d-4691-be3f-9b8792818cec)(label(\";\"))(mold((out \ + 84842094-9cfd-44b0-a616-59a635d135a7)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b20391a6-01b9-4f37-a613-bbf4e03cb0bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 24d47d08-6b41-4f26-8dcc-7d5baaed3e09)(label(let = \ + c08a517c-7d31-491a-8ca0-bdb311cdd1fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 973aca77-7a2e-447f-9b8b-79d46c90d289)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0dd39046-06b7-4023-b190-e31c0d021a36)(content(Whitespace\" \ + e058a9fd-33ed-426d-9a16-9d28aecdb6fd)(content(Whitespace\" \ \"))))(Tile((id \ - 728a6798-5239-478e-a409-c508a3103c1c)(label(f))(mold((out \ + b56a3be6-f44d-477f-8bc1-9035556d7e7e)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7b9d10f7-45f8-4993-aabf-92be6dc2bdbb)(label(:))(mold((out \ + 64a0ad2a-f57a-4021-873d-65799d736b60)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6ec41b2e-40f7-4078-a961-94aac27be53f)(content(Whitespace\" \ + 138862a5-5864-4e64-8d38-a7733be25a9e)(content(Whitespace\" \ \"))))(Secondary((id \ - a736d742-53d7-4fb6-9ec9-1d2eac804a86)(content(Whitespace\" \ - \"))))(Grout((id 4329136f-264c-4372-8ea7-f8c10487ba95)(shape \ + cccc5c68-3881-48ee-875f-36701f4416cc)(content(Whitespace\" \ + \"))))(Grout((id f5d1cabe-ba44-4687-a6e2-d44d016f60cd)(shape \ Convex)))(Tile((id \ - 2b76ff0d-dc63-4264-9454-2c193f26235a)(label(->))(mold((out \ + 1c7771cf-00e8-40bd-87df-b14712ddb613)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7b9907d8-9300-4180-a175-2c24270ec658)(content(Whitespace\" \ + 62318fea-bb9c-48db-895c-93fccb51a26a)(content(Whitespace\" \ \"))))(Tile((id \ - 1e1fb328-d749-474d-bb5f-f472340b26ff)(label(Int))(mold((out \ + f37a26dc-c159-475b-936a-6524364575b1)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 82a839db-b207-4243-8ef9-a0fdd1d4977b)(content(Whitespace\" \ + c86d7fbf-5672-4471-8dc7-00417019c03c)(content(Whitespace\" \ \")))))((Secondary((id \ - 28017d7a-90b4-42d0-a224-14df635f5cb9)(content(Whitespace\" \ + 485e90e1-b228-4a73-b1f8-98596532febe)(content(Whitespace\" \ \"))))(Tile((id \ - 2de57b79-70a0-42ec-b6c3-fa87e309c7ae)(label(fun \ + 2109b5ea-d867-4d42-95b3-e0219286c4b5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 10f48b4f-ff10-4b86-aad9-b5922fb5da8c)(content(Whitespace\" \ + f99b0538-9b95-42b5-96b4-15afb3485b66)(content(Whitespace\" \ \"))))(Tile((id \ - f2348448-61ad-4896-9efe-f5c68d6126d1)(label(a))(mold((out \ + bd3a7a7f-89c7-4c87-a0f4-b200c691d177)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0f3408cf-6a89-4975-b1f9-a2f59967085a)(label(,))(mold((out \ + cad85f10-72e6-418c-865c-270742dca8ee)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 26c7004c-0b50-45af-bf64-b952d5570936)(content(Whitespace\" \ + cfb8dbac-bf36-46f2-890d-e9f9c6ffd884)(content(Whitespace\" \ \"))))(Tile((id \ - 31b7aa1e-caeb-4bf5-aea7-a7ef550410d1)(label(b))(mold((out \ + cef6028f-59f5-4e7d-b194-f7adec478ed8)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - de6a2956-02d1-4dec-bb7f-f519ab1b22ae)(content(Whitespace\" \ + bd1d38d8-0d67-4f80-a35b-59588f1383a7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3e8e3852-2189-4731-b126-62cc040cb7fb)(content(Whitespace\" \ + b5c8eab9-9902-4bd3-a066-8c6c229d14c1)(content(Whitespace\" \ \"))))(Tile((id \ - 1a75004d-8654-47d8-9ef8-cdcda6af8abe)(label(a))(mold((out \ + c76cb56d-201a-4f93-bd11-5d35c69bc89d)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3097e62b-6fea-4285-9c2d-76ddd8cd327f)(content(Whitespace\" \ + 80810ecd-fde1-4b31-8708-ce638f46760c)(content(Whitespace\" \ \"))))(Tile((id \ - 522631b0-51a6-49ef-9abc-b6273bf20c7e)(label(+))(mold((out \ + e9a90d2c-09c6-435e-a04a-41da2cfc2756)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a56243da-d4a7-414d-8d86-c68f744db057)(content(Whitespace\" \ + 7692ebaf-e2b3-47c9-903d-909d8d496964)(content(Whitespace\" \ \"))))(Tile((id \ - 8ebacfdd-9092-4a93-9ec7-2e92f8643c09)(label(1))(mold((out \ + fd793831-f96a-4b94-aee9-e6723a91ad60)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f6df533a-54f3-446d-853e-f69eb8a6d193)(content(Whitespace\" \ + ea9c4db9-1dc3-49dc-835c-0069653696d2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 27d516fd-eb3d-43fb-808f-2d82a643cdb8)(content(Whitespace\" \ + 2c7872cd-b918-4c6d-8175-4089080e36cb)(content(Whitespace\" \ \"))))(Tile((id \ - dea5ae80-2015-4ecc-9896-25bf87d3f4d5)(label(f))(mold((out \ + b314e3ce-371e-49f3-8c4b-0447af69010c)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b2f5575f-8ec6-4cb6-af4a-0615a67562a6)(label(\"(\"\")\"))(mold((out \ + be253910-1720-429d-8ed9-f81db0449dd2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - aea0445c-e483-407c-a437-8b6af5a169cd)(label(1))(mold((out \ + 2fe89d4f-097a-44bf-8771-168063c819d6)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b4eaa61f-b26e-45e6-be82-a8ebfafd706b)(label(,))(mold((out \ + 4062f46d-48c1-4138-a0e7-5732094e221c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 64122c13-c11b-4214-bd9d-1510bafa1641)(content(Whitespace\" \ + 10f5853b-e255-44c6-95c6-9180bc8f6904)(content(Whitespace\" \ \"))))(Tile((id \ - 2bd7c6a6-cdad-49fb-9567-610d42a1c8d8)(label(2))(mold((out \ + ea4764e3-37cb-497d-ad34-c2470daf273a)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - de26956d-57fb-4a03-8a45-0ccb33d5bb90)(label(\";\"))(mold((out \ + 8996cc25-1f48-4ca3-94ce-6eaa7498aa5a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 46a3c13e-1b01-42aa-b0d4-b13476e95a7d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 535cd622-f095-4182-aff5-7053a18f977f)(label(let = \ + 0a78844d-935d-498c-9a44-a68f43962170)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 47790c08-a9e1-47d3-95ce-6030c0d06c09)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b01cdc62-89e3-4fe8-bb27-e947cb94db9c)(content(Whitespace\" \ + 916f9b14-621e-48c9-9edf-4cab8499a8ea)(content(Whitespace\" \ \"))))(Tile((id \ - 7cc510a4-ded7-41bf-9823-1bec60d9e27c)(label(f))(mold((out \ + 45f53c2f-9d60-447a-bd89-d0225a86528d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 71a88a9a-3d75-4cb2-8e88-a32ab70a60eb)(label(:))(mold((out \ + 0557d6d0-211a-4761-9c80-f5f4cb88fa3d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ebf21bdf-3bce-4b70-9a08-5736c3b6d2ec)(content(Whitespace\" \ + 06199b86-2bc6-46f3-95c7-dd38fa7f9044)(content(Whitespace\" \ \"))))(Secondary((id \ - b2542236-2b19-4028-a326-ee543b6682ae)(content(Whitespace\" \ - \"))))(Grout((id 4904f6f4-5647-4f1e-a20b-f66d448c7376)(shape \ + 98d56171-c361-4f62-abcd-d7fd00394a67)(content(Whitespace\" \ + \"))))(Grout((id 007a7168-e3ea-4347-86d7-51613e6e77d1)(shape \ Convex)))(Tile((id \ - 00321b6f-ba79-49d7-af93-ecfc59f95179)(label(->))(mold((out \ + fb920087-9166-4c09-8737-8c90bbbe6c9f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bd018672-ca63-49db-b999-0717aad334f3)(content(Whitespace\" \ + 0f7c6467-0079-417b-818c-1fafb365ec21)(content(Whitespace\" \ \"))))(Tile((id \ - 6fcbdb9d-0643-4a21-9cb6-3f18b93dd295)(label(Int))(mold((out \ + 8377ab57-5d90-4acf-bd9d-6795d80c6299)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 9fc4fd55-fb9c-43af-a714-2e6868b4220c)(content(Whitespace\" \ + 3489484f-1413-496f-be53-4f7ccccaeec9)(content(Whitespace\" \ \")))))((Secondary((id \ - 946755b3-5079-40b2-8ff2-e323564a19ee)(content(Whitespace\" \ + 3880508f-a25e-42a2-9a6d-1e7c02a2261a)(content(Whitespace\" \ \"))))(Tile((id \ - bd49e1fd-89ea-4e9d-a310-3209512d08c2)(label(fun \ + f87f7e93-5c74-4015-9324-ea4c3fa1c193)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 23549daa-3b71-4579-9f0b-b964225577c7)(content(Whitespace\" \ + d91f0622-9b52-4b1f-8c5e-cd32d8482079)(content(Whitespace\" \ \"))))(Tile((id \ - f7a154bf-1645-4cc5-87ad-35a4f88d8a09)(label(a))(mold((out \ + 117385a4-0f99-4ceb-bd55-e80ccc7eba79)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e203b066-ff99-4c9f-806a-edd8ec223888)(label(:))(mold((out \ + 3acc077b-8e8a-4963-bf80-97d7a061bd9a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 45fbcd2e-e805-426f-a661-115a0c8806df)(content(Whitespace\" \ + 4a4ca8a2-7112-4fba-867a-c4a9ed22d911)(content(Whitespace\" \ \"))))(Secondary((id \ - a74f8035-9b04-44b9-9f51-4d13331dc7d9)(content(Whitespace\" \ - \"))))(Grout((id 8eafc01f-7c09-41a0-8f80-3cced03c8ef1)(shape \ + 75ebd88d-965d-47d9-af58-cfa8c116bced)(content(Whitespace\" \ + \"))))(Grout((id 631a3c14-fc3b-48ed-9fa4-be2489fbdc42)(shape \ Convex)))(Tile((id \ - 7e00b638-2c46-4f87-a513-030a1fbd58ac)(label(,))(mold((out \ + 37a5fd62-d26b-48c6-85b9-277d9b99787b)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 036ea3e7-445f-41d5-a6a5-571fac37a6b6)(content(Whitespace\" \ + fb335f33-ec02-42ac-b9d2-125f3052f46a)(content(Whitespace\" \ \"))))(Tile((id \ - c30bf2cb-2fec-475f-b2e2-7710a7428fdc)(label(b))(mold((out \ + ed32223d-470f-4237-b2d9-39b0a016a0ac)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 971be3f4-5d32-4025-b7ca-759bc80b2b5f)(content(Whitespace\" \ + 0fd75c65-531e-4cc9-8f00-30107fab4d69)(content(Whitespace\" \ \"))))(Secondary((id \ - 57e35c16-243c-49d4-bede-5ee3cf1d17fd)(content(Whitespace\" \ + b53880b4-4e39-4e65-967c-aa45f62540e4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5655c2b4-ec64-4663-9d0e-cbcd97695216)(content(Whitespace\" \ + 1622b77a-1b36-40dc-a463-d69ef002c5dc)(content(Whitespace\" \ \"))))(Tile((id \ - 99fe2662-76cf-4f90-bb20-518c9286396b)(label(a))(mold((out \ + 73290c21-6b8d-4840-943b-56de0499f532)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d3d045d4-aea0-4908-aaa1-475a642301f5)(content(Whitespace\" \ + 72470713-6edd-4809-8262-48506fdb6cc2)(content(Whitespace\" \ \"))))(Tile((id \ - bcec14dc-b0d4-48eb-9448-26fb5086d77e)(label(+))(mold((out \ + 35e74c6e-7dfd-472d-aadd-b0a25422f83d)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7c2138b7-1474-4325-8368-63d97bd2b2ff)(content(Whitespace\" \ + e9849eb2-92e1-45b5-983d-b4c4efc443c4)(content(Whitespace\" \ \"))))(Tile((id \ - 14a6742b-7a0a-4f01-b469-ef428281d4bd)(label(1))(mold((out \ + 72ee6f9e-5c3b-4635-8740-5ec010bef5c9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dc5fe424-8c81-42ee-bf7c-6259aad8be89)(content(Whitespace\" \ + 42d11360-d68b-4e83-896c-fab41052dea1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c1b8ef09-78c6-41ff-afe6-97f9bed07b4e)(content(Whitespace\" \ + 0540387f-c191-4f0c-b011-0e02a99ac216)(content(Whitespace\" \ \"))))(Tile((id \ - e0af1a70-221e-4ca5-b529-f8f9e9e24075)(label(f))(mold((out \ + 97db6dea-f3a8-4f3e-897f-45d739106e7a)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ea937068-03c3-46b5-838e-8431ac511223)(label(\"(\"\")\"))(mold((out \ + d8fb6e78-61d3-408c-831a-155561751f4a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c04f2911-e937-4997-8dec-044f8062e0ef)(label(1))(mold((out \ + 17b14124-2913-4406-9ee2-c4e49a51745d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2ddbce58-512d-454c-9414-71cc83365048)(label(,))(mold((out \ + ff8bf59f-351a-4bd0-b3ed-0bea707aed25)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 902b01ab-4426-436c-85fe-c1177823af7a)(content(Whitespace\" \ + 99aeb614-c1d6-421f-bea5-38c265e0da1e)(content(Whitespace\" \ \"))))(Tile((id \ - 231978f4-f1a2-4195-a82b-240349d0e1a4)(label(2))(mold((out \ + 60f943d1-a0d0-4835-b63a-163b57faea38)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - fb53893b-398d-4528-b5a7-07397f1fde0a)(label(\";\"))(mold((out \ + b5e14b9b-d4f7-4c17-befb-ce5bd8c907cf)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3c25df64-783c-4df9-a51b-a0e030b1b234)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f49582c7-8751-4026-b008-a40322fd6163)(label(let = \ + 623f89b2-f4b9-4708-abd9-4858f4b6c685)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2a11ed63-c77a-41a5-98c6-9944b775106b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 36cd6b35-6bbd-4777-8c79-728c62f8e9f1)(content(Whitespace\" \ + 81c32cf6-5e3a-4eb6-b206-bdd0ca210a0c)(content(Whitespace\" \ \"))))(Tile((id \ - d58d666e-eeb7-4fe2-80a4-7e3d47cb0bd9)(label(f))(mold((out \ + 9580051a-1fc1-4512-aa4f-33afba464fac)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8db0136e-51cf-4e0f-a71b-b36cbab2505d)(label(:))(mold((out \ + f3d33f33-6988-4dbe-8653-9609aee12615)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ad59ce9e-71fb-4e09-b957-0086013b9b2d)(content(Whitespace\" \ + c64c35d5-b8ed-4955-9f83-b5c301360a61)(content(Whitespace\" \ \"))))(Secondary((id \ - fd9389db-acbb-4615-bf01-172db6faf640)(content(Whitespace\" \ - \"))))(Grout((id 23589f3e-8d1b-46ed-902b-c7988503d002)(shape \ + dee528cd-578e-4612-838d-4e1e5a85bc53)(content(Whitespace\" \ + \"))))(Grout((id 8c1c628b-4c15-42bb-b034-0e104c37522c)(shape \ Convex)))(Tile((id \ - d51a3452-36eb-49ee-8210-d128252e1395)(label(->))(mold((out \ + 78b3eee1-7d12-470b-9f9c-145e913c9167)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3acceab2-5529-43c1-b4b3-3c735851c937)(content(Whitespace\" \ + 4ceadb13-0558-406b-b5fb-7e50ee87fdf8)(content(Whitespace\" \ \"))))(Tile((id \ - b440cb2d-cb3b-4b89-a57c-061ec3ec16e5)(label(Int))(mold((out \ + 02253eaf-3c18-41c4-aa2f-97ee47ea29bf)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 398b718d-35b1-4cce-95de-f2c5ae2b9b7e)(content(Whitespace\" \ + c540e15c-3b2a-4146-861c-b415cef3701c)(content(Whitespace\" \ \")))))((Secondary((id \ - 25698a56-7f09-4f3d-ac8a-a0b1a8997d96)(content(Whitespace\" \ + c788a07a-9849-4102-b17c-f3d4a5e1e1e8)(content(Whitespace\" \ \"))))(Tile((id \ - 306f8858-47c3-4474-aa45-7d87a6a5e7bc)(label(fun \ + 16105dd2-b42d-428c-bc82-66c19b810b91)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b02f33bc-0210-4d50-84fc-8aaec13c23a0)(content(Whitespace\" \ + f18ab206-6397-424f-bd01-8ec1de2af31f)(content(Whitespace\" \ \"))))(Tile((id \ - aa8337bb-b7be-48a0-88d7-807386376e4f)(label(a))(mold((out \ + c54bae36-a6be-45cb-a175-f11b640c14db)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - fcdedec1-0897-4e17-a83b-edbdc270c9b8)(label(:))(mold((out \ + deee1609-2695-41ff-b342-01d2c118feb4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6c81acb8-9a8c-4401-b421-799ef8fa97ad)(content(Whitespace\" \ + 31dc3c6b-40d4-4df3-99ae-e84ce7b7fb45)(content(Whitespace\" \ \"))))(Tile((id \ - dacf631f-a9b8-4e67-ae16-b9bc829c76cc)(label(Int))(mold((out \ + abfee07b-f80b-4cbb-8932-b8ab45fa79af)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 27298d20-d9fc-4e51-bd60-77d6a97afdbe)(label(,))(mold((out \ + 0f82c4fc-c292-4b5a-b3ce-2c96a41dae0b)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 38e9da4c-d007-49da-bb56-c05c71300c6e)(content(Whitespace\" \ + 2aa9f93a-2604-4b31-abff-6e1e73aa94ad)(content(Whitespace\" \ \"))))(Tile((id \ - 2d57aae5-e641-4b64-b776-e54f4e69c53d)(label(b))(mold((out \ + d644270f-ef6e-49e4-84a3-e7cb8fbb4ca7)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bf0eabd8-fb7a-4bf9-8d7e-67f2b9c227c7)(content(Whitespace\" \ + 6eb9b226-f651-416f-883c-85365a10311e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4184250c-108e-46b7-8827-7c71940ff09f)(content(Whitespace\" \ + 809318ff-8155-415c-8990-23b5fad263c3)(content(Whitespace\" \ \"))))(Tile((id \ - bedade1a-15a6-4390-81b1-4c5d1bee160a)(label(a))(mold((out \ + 222f3893-83f7-4142-b4f9-3e4db52a5692)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8d96fe72-1ea6-4a92-a74e-c26b836ecc4a)(content(Whitespace\" \ + 4a86a391-f008-40a2-9245-aceaa2b75b6f)(content(Whitespace\" \ \"))))(Tile((id \ - cea9adc5-879b-46e1-884b-4cd50eb2c561)(label(+))(mold((out \ + 485796d0-1475-429b-be51-2c738aad651f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 812965df-8ad6-4758-bc97-52ffceb743f2)(content(Whitespace\" \ + 2d4487e4-3410-4ab7-b761-b552f65db9ea)(content(Whitespace\" \ \"))))(Tile((id \ - fcde7ed9-59a7-4e06-983d-bf3123d70b82)(label(1))(mold((out \ + b6a8ad38-c1fd-4d69-8832-67206f0d1f53)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ddf5e9d5-bebd-442c-a466-000a7b87f36b)(content(Whitespace\" \ + 23b3f6fb-10d5-4caa-a9a9-057575a66052)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 279145a2-d13d-434b-8542-2a3b1bda8cfd)(content(Whitespace\" \ + 5158275a-4ab2-44b0-aa30-6c099c173abd)(content(Whitespace\" \ \"))))(Tile((id \ - 48348a80-8ce4-4a94-83fc-4863761517d2)(label(f))(mold((out \ + 1e924e79-7a16-4de9-9a3c-e4ff9ad48333)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - de254a37-5ee2-40a6-8358-1cebda171dfc)(label(\"(\"\")\"))(mold((out \ + 299dab18-d0a3-441a-aae1-b30ea66fd395)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 781f5803-be44-44e0-97d3-8cbfff60ce67)(label(1))(mold((out \ + 477383e7-bc41-438f-8955-434f3fc33fee)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 15422ad3-b89d-4468-978f-6b5759648433)(label(,))(mold((out \ + a5fd3ab0-498e-4f4c-8302-78dc766caebd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 90ac4093-4bc5-45f2-8af9-566d3cef9f0a)(content(Whitespace\" \ + 8bebd1d5-97af-49b5-814e-d2ed6db0a6b7)(content(Whitespace\" \ \"))))(Tile((id \ - 94887070-f174-4e25-9859-fe832c7f3223)(label(2))(mold((out \ + b57f8ebf-002d-4f04-9d78-700c8208d5d0)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 16ca04b3-ef11-43b8-9554-88ad6a639054)(label(\";\"))(mold((out \ + f8b67ad0-d8da-4614-b1e7-0dbcc7b19ae1)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 38ec8e6b-64b6-4d0d-9a4a-df986fd14112)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 086df4d2-2dda-4c82-afa2-f33d7ee0efe5)(label(let = \ + 225913ec-3b8f-46d7-a43f-1ff784f26662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e14eec4b-d7f7-4085-902f-c5b99493873a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a30874fc-f8d0-46e7-92f1-d8d9110df9dd)(content(Whitespace\" \ + aa1cb2c3-44fe-489c-92ef-f22d198c90d6)(content(Whitespace\" \ \"))))(Tile((id \ - c2630add-a437-48d2-bc35-1589ff25fd09)(label(f))(mold((out \ + cc232e4d-fb0e-40b8-a483-cd83dc15ebc9)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c2a3eca8-59f9-40ee-9836-1f28ecc30933)(label(:))(mold((out \ + f0b36e59-61ee-469c-83fa-ff5bd5c2985d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2935e898-128a-4fb3-8f98-a3fa209c2c83)(content(Whitespace\" \ + f765efa2-eab5-4665-9965-c4ed7f3b5400)(content(Whitespace\" \ \"))))(Secondary((id \ - a8eb29d6-58cd-4515-8d47-3c4516f221f2)(content(Whitespace\" \ + 0f4ce747-c45a-427d-8f29-29f50f4d0036)(content(Whitespace\" \ \"))))(Secondary((id \ - 717fda3f-72e6-4285-86dc-73c268bee886)(content(Whitespace\" \ - \"))))(Grout((id c80495a2-eb33-4fb6-b814-3c9c5c1a57b9)(shape \ + 818436f5-06d1-4d53-a81a-5ebe6ef8a77c)(content(Whitespace\" \ + \"))))(Grout((id d172bd5d-67d9-4ad4-900c-aa7850aab13f)(shape \ Convex)))(Tile((id \ - 56f48c8e-49fa-46f6-b8f3-791e755dee84)(label(->))(mold((out \ + edb6f7cb-4f54-44ff-b297-9e4e6e80d8b5)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f55a22df-bb3d-4b51-9edc-36f337251dec)(content(Whitespace\" \ + c4c4173d-2af1-415e-8f02-2415ed7e6892)(content(Whitespace\" \ \"))))(Tile((id \ - 2b53e25b-49db-466a-850c-4c4c925ffb20)(label(Int))(mold((out \ + 6b18af98-5b9e-4e1f-be93-d02a3768a806)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d6d44fdf-8409-4585-8f72-556c13b30aac)(content(Whitespace\" \ + 583ba5ee-ae97-4b56-b85c-214ec904727b)(content(Whitespace\" \ \")))))((Secondary((id \ - f7d35b64-c841-41c4-8dcd-1a3a62d1cc26)(content(Whitespace\" \ + cea0ece3-97ef-4970-9332-49dbc49b80cc)(content(Whitespace\" \ \"))))(Tile((id \ - f75bc43e-01c3-43a0-855f-8be780fbeaf3)(label(fun \ + 733ef178-7a6f-43e8-9397-e0583cfecf6d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9299c0b4-265e-4cbc-a09e-693dd074be5b)(content(Whitespace\" \ + 89915481-daa5-42f3-954f-948c1aff1549)(content(Whitespace\" \ \"))))(Tile((id \ - 7cc935c9-a97d-4ba0-8416-b50fca6b9d72)(label(\"(\"\")\"))(mold((out \ + a53dceac-6fe5-405e-a1d7-97343fbc9030)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 494eab00-c809-4722-a02e-b0fc68d4a3f6)(label(a))(mold((out \ + 0b692918-371b-49dd-9f3d-6c93800c3f31)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4b656dee-a4bb-49a6-9ac8-aed5a2f09458)(label(,))(mold((out \ + a1517b07-805c-43bf-88df-39d427604f7d)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 6e57ee07-52bd-4f27-90a5-b4607dc51f1e)(content(Whitespace\" \ + 6331eeb6-db80-4c09-9f8e-3d1fa91e34b6)(content(Whitespace\" \ \"))))(Tile((id \ - 05a00a59-ae7b-434f-bab4-1a50caa79401)(label(b))(mold((out \ + ff25c371-f52b-4aca-adea-44556eaa65ea)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 1f6d136a-6df2-4a71-a77e-90224285b84c)(label(:))(mold((out \ + 30df784d-d6a7-4e72-b333-743de0028917)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cb595d47-bdb4-4ce7-93b9-b210d53688fa)(content(Whitespace\" \ + 783606ed-bd62-4b30-bae2-b3c9125c6582)(content(Whitespace\" \ \"))))(Tile((id \ - cb5a0da8-2604-4c5d-9af2-fba64593117a)(label(\"(\"\")\"))(mold((out \ + 0aaa7391-9ccc-47a4-b561-38c7f1cac1c7)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 5d5a98da-3ae9-4d3f-b669-c89d27c520a6)(label(Int))(mold((out \ + 5a61e355-ee4a-48b1-b3f4-dd6b7bea72b5)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 939f45f3-8613-423a-b1b6-2d770d037f75)(label(,))(mold((out \ + bbb5fbd6-ea5b-424e-a403-2851794e75e0)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - f5a556f3-b755-4bea-8be1-3117ce6472a2)(shape \ + 6fd5520f-841f-463c-8780-42573be8b976)(shape \ Convex)))(Secondary((id \ - 32a7c4d7-a79e-4224-94ec-657c5f29eb39)(content(Whitespace\" \ + b93f2697-a4e9-48de-ac5d-f144a1a3ce60)(content(Whitespace\" \ \"))))(Secondary((id \ - 8ac5867b-6fc2-4e18-8cab-2c03b9f9aca1)(content(Whitespace\" \ + 929bb152-5ea8-45fb-9fb0-5f0ac3211db9)(content(Whitespace\" \ \"))))(Secondary((id \ - 793c838a-1fae-4b08-8996-447c82f6e6a6)(content(Whitespace\" \ + 887b6e32-3d1d-45dc-8c43-bab69be84ce0)(content(Whitespace\" \ + \"))))(Secondary((id \ + d557d37f-7499-4f6c-9cb7-2e7bb12aa34d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0839f24e-e181-4ccf-b0fa-51aa3ecf37f6)(content(Whitespace\" \ + d35fea4a-36de-4e10-9512-1873c1965654)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 303c7cc4-a770-4570-8be1-79b6ed766777)(content(Whitespace\" \ + 8b51bb9e-3510-4ca9-afaf-579d5e4d05a6)(content(Whitespace\" \ \"))))(Tile((id \ - 2e0d1e0b-ec0b-4771-a9bd-d5cbca4fea15)(label(a))(mold((out \ + fa6f5d9a-7e59-459b-b5cb-0fa241021151)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9d90178e-c585-41e8-82e8-c9af3e367704)(content(Whitespace\" \ + a658832d-570e-4d64-945b-2fe3a5f49666)(content(Whitespace\" \ \"))))(Tile((id \ - cfa499f2-d351-4cb2-b77e-1eedc3d0ef71)(label(+))(mold((out \ + 652a04e7-897d-4ec3-b0f7-1b63e64e7b20)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - af4c72fa-4302-4294-b4d7-2d9be7af0f84)(content(Whitespace\" \ + e94b2239-27cc-468b-9214-a42d2a497929)(content(Whitespace\" \ \"))))(Tile((id \ - f63b3f8c-ce1d-42b8-b93a-8f2a69d62a3b)(label(1))(mold((out \ + 9a2efcf0-6410-465c-8871-909dba1b381c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b0fea629-b8f0-4b8c-8728-984adeafe22c)(content(Whitespace\" \ + 30c12b6a-6d0f-419d-8fdd-c898449e2237)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5f6cd696-65e5-4d98-b2b1-9265700a04cc)(content(Whitespace\" \ + 2836f94f-1d02-470e-85ad-b0fee4aa4c22)(content(Whitespace\" \ \"))))(Tile((id \ - 00b620d3-78fc-4b8a-a564-25d0bf672cb1)(label(f))(mold((out \ + f07dcef0-5700-4c69-afad-63e79497701e)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bdfb8de6-3b93-4725-9d75-075a5ff2a87a)(label(\"(\"\")\"))(mold((out \ + 452a38b7-3724-47ae-91d2-b397871e54c8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9f054021-8f5b-4486-854a-f96e4fda32e4)(label(1))(mold((out \ + 8a70ca24-26f2-4608-a159-1f11ed4901c0)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c497b161-0b64-4555-af52-284b0c8196c0)(label(,))(mold((out \ + f340d87c-adff-463e-9045-fcac56ce16fc)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6a05f4c6-0047-464a-8822-fb7e0708b9e8)(content(Whitespace\" \ + d439aade-1f27-494b-9e00-1930511c5192)(content(Whitespace\" \ \"))))(Tile((id \ - 32414123-8c1f-4a63-93aa-c5d8c3a32644)(label(2))(mold((out \ + 59050d8e-66da-4abd-8ed4-5e6febdb06a8)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 2b7f6bb1-9e33-4935-bb14-4ad9e3e0f6c1)(label(\";\"))(mold((out \ + f485a019-0a07-40d3-899a-9512d4def50c)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 92309307-3065-4eed-b0e7-131763ec7773)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5c4effee-fad1-4099-b9ac-0f0c201f87c6)(content(Whitespace\" \ - \"))))(Secondary((id \ - f637b2a3-4c1c-4743-b131-166fad34191b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 40618bbb-cda3-483f-9799-f66777e8fec2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 94f5a2c3-7ba6-40dc-9242-ed582dea46ac)(content(Whitespace\" \ - \"))))(Grout((id 81bb6c1b-2172-4115-971f-d156eccb7acb)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; + 5633975f-c769-481e-9b92-68cb2685176c)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ + ec5fef77-52f4-4093-a5fa-7e07d30a822b)(shape \ + Convex))))))(ancestors())))(caret Outer))"; backup_text = "# Internal Regression Tests: Function literal casting #\n\ # None of the below should trigger runtime exceptions #\n\n\ - let g: -> = fun _ -> 9 in -g(1);\n\n\ + let g: -> = fun _ -> 9 in -g(1);\n\n\ let f = fun b -> b && true in f(true);\n\ - let f = fun b: -> b && true in f(true);\n\ + let f = fun b: -> b && true in f(true);\n\ let f = fun b: Bool -> b && true in f(true);\n\ - let f: = fun b -> b && true in f(true);\n\ - let f: = fun b: -> b && true in f(true);\n\ - let f: = fun b: Bool -> b && true in f(true);\n\ - let f: -> = fun b -> b && true in f(true);\n\ - let f: -> = fun b: -> b && true in f(true);\n\ - let f: -> = fun b: Bool -> b && true in f(true);\n\ - let f: Bool -> = fun b -> b && true in f(true);\n\ - let f: Bool -> = fun b: -> b && true in f(true);\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ + let f: = fun b -> b && true in f(true);\n\ + let f: = fun b: -> b && true in f(true);\n\ + let f: = fun b: Bool -> b && true in f(true);\n\ + let f: -> = fun b -> b && true in f(true);\n\ + let f: -> = fun b: -> b && true in f(true);\n\ + let f: -> = fun b: Bool -> b && true in f(true);\n\ + let f: Bool -> = fun b -> b && true in f(true);\n\ + let f: Bool -> = fun b: -> b && true in f(true);\n\ + let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ let f: Bool -> Bool = fun b -> b && true in f(true);\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true);\n\ + let f: Bool -> Bool = fun b: -> b && true in f(true);\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true);\n\ let f: -> Bool = fun b -> b && true in f(true);\n\ - let f: -> Bool = fun b: -> b && true in f(true);\n\ + let f: -> Bool = fun b: -> b && true in f(true);\n\ let f: -> Bool = fun b: Bool -> b && true in f(true); #ERR#\n\n\ let f = fun b -> b && true in f(true) && true;\n\ - let f = fun b: -> b && true in f(true) && true;\n\ + let f = fun b: -> b && true in f(true) && true;\n\ let f = fun b: Bool -> b && true in f(true) && true;\n\ - let f: = fun b -> b && true in f(true) && true;\n\ - let f: = fun b: -> b && true in f(true) && true;\n\ - let f: = fun b: Bool -> b && true in f(true) && true;\n\ - let f: -> = fun b -> b && true in f(true) && true;\n\ - let f: -> = fun b: -> b && true in f(true) && true;\n\ - let f: -> = fun b: Bool -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b: -> b && true in f(true) && \ + let f: = fun b -> b && true in f(true) && true;\n\ + let f: = fun b: -> b && true in f(true) && true;\n\ + let f: = fun b: Bool -> b && true in f(true) && true;\n\ + let f: -> = fun b -> b && true in f(true) && true;\n\ + let f: -> = fun b: -> b && true in f(true) && true;\n\ + let f: -> = fun b: Bool -> b && true in f(true) && true;\n\ + let f: Bool -> = fun b -> b && true in f(true) && true;\n\ + let f: Bool -> = fun b: -> b && true in f(true) && \ true;\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true) && \ + let f: Bool -> = fun b: Bool -> b && true in f(true) && \ true;\n\ let f: Bool -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true) && \ + let f: Bool -> Bool = fun b: -> b && true in f(true) && \ true;\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\ let f: -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: -> Bool = fun b: -> b && true in f(true) && true;\n\ + let f: -> Bool = fun b: -> b && true in f(true) && true;\n\ let f: -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\n\ let f = fun a, b -> a + 1 in f(1, 2);\n\ let f = fun a: , b -> a + 1 in f(1, 2);\n\ let f = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: = fun a, b -> a + 1 in f(1, 2);\n\ - let f: = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun (a, b): (Int, ) -> a + 1 in \ - f(1, 2);\n\ - let f: (Int, ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun (a, b): (Int, ) -> a + 1 in \ - f(1, 2);\n\ - let f: (Int, ) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun (a, b): (Int, ) -> a + 1 in \ - f(1, 2);\n\ + let f = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: = fun a, b -> a + 1 in f(1, 2);\n\ + let f: = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: -> = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: ( , ) -> = fun (a, b): (Int, ) -> a + 1 \ + in f(1, 2);\n\ + let f: (Int, ) -> = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> = fun (a, b): (Int, ) -> a + 1 \ + in f(1, 2);\n\ + let f: (Int, ) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ) -> Int = fun (a, b): (Int, ) -> a + 1 \ + in f(1, 2);\n\ let f: -> Int = fun a, b -> a + 1 in f(1, 2);\n\ let f: -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ let f: -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> Int = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - \ \n\ - \ "; + let f: -> Int = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + \ "; } ); ( "ADT Statics", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 89e33248-1bc7-474b-8cc1-52f14e3e707a)(content(Comment\"# \ + 8f545503-9ccc-4a1f-9570-51cc80ed498b)(content(Comment\"# \ Internal Regression Tests: ADT Statics #\"))))(Secondary((id \ - 454449e8-3659-42c5-a25e-6d1d6155d5a0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4937d8bb-3b30-468e-880a-41c0acb969cf)(content(Comment\"# All \ + 7df37433-694f-49e1-bd34-5e440ddce095)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f1af6a08-8b94-424e-bf1e-94bb5efddca9)(content(Comment\"# All \ commented lines should show errors as described \ #\"))))(Secondary((id \ - 59e213c9-ee8d-4d0b-b4d1-7bf5f1489768)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0da14afd-2ea6-4f68-9976-4093be981c87)(content(Comment\"# No \ + 19de118a-4634-458e-ab3d-fa2ddd45182a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 94a20bbb-796f-4b4b-b587-ad228fc451ed)(content(Comment\"# No \ other lines should show errors #\"))))(Secondary((id \ - 7ea28ccc-7a2f-4ca7-b581-7d56e6089cd3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 669a1d0d-426e-42b4-80a0-89e1ac7b1e1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3eaa3286-66f6-48f7-b4ca-ec8b7b2b3529)(content(Comment\"#type \ + e3134ee0-6c81-431e-a0e9-019b4a005233)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ced5b603-67a5-4d6b-8c60-e20d3dc77d8e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bfd76574-e632-450b-8129-cd813c164e53)(content(Comment\"#type \ definitions: no errors#\"))))(Secondary((id \ - 808fe9c2-af5d-4c17-a3fb-be4d7a2c766a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e4e6500c-a7a7-488c-a2ab-6457b37c07a4)(label(type = \ + 5bbfdda1-e2fe-4fe2-97b5-8e83fe230690)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e9e303cd-7ef7-4fb5-8cde-6a1951181563)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b051cd5a-8265-40be-9ea0-df8f23a86856)(content(Whitespace\" \ - \"))))(Grout((id eb7a40e6-c374-4b1e-8635-73f7e9638420)(shape \ + a72a561d-27a9-41f2-8ef3-8065d19a5fde)(content(Whitespace\" \ + \"))))(Grout((id d0cd5bbc-3883-4fe8-a9d8-67bf7ba77f68)(shape \ Convex)))(Secondary((id \ - a4c96856-06b0-4f22-94ad-c1a12aa21acd)(content(Whitespace\" \ + fadcfc44-7cdf-4c69-9f56-1a64ce2ae893)(content(Whitespace\" \ \")))))((Secondary((id \ - 63bcba84-a27d-46b3-8c65-575af3b55211)(content(Whitespace\" \ - \"))))(Grout((id 2a226a3d-e11a-4751-9bda-80c03315b18d)(shape \ + fb0ed68b-3058-49d0-a2d0-658170c04016)(content(Whitespace\" \ + \"))))(Grout((id 50707bcd-d303-4f2c-8dd9-019e87497b95)(shape \ Convex)))(Secondary((id \ - d110a090-41b4-438b-85a9-980720f1b566)(content(Whitespace\" \ + 606fc561-7a9f-4c4c-81ab-f4b09c51a78a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8d281563-ca03-4ef5-82c7-ef46c0ccdb6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a5af0ca8-4063-4a44-b68b-b0c0e00bd328)(label(type = \ + 90da604d-57b1-465b-b94e-da7571018abb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5b223b93-1ca6-43d1-a140-1d1f9d2e3757)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 45d0c30a-2f38-477f-9404-5f8f4e5a1637)(content(Whitespace\" \ + 44600d02-12bf-4611-b2b2-dfaf8c4f73a6)(content(Whitespace\" \ \"))))(Tile((id \ - 3e437a95-c750-4a60-b1bc-70c279b913c3)(label(SingleNull))(mold((out \ + 25749c0b-386c-48e6-aced-da78f71607a0)(label(SingleNull))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 6749722f-b18b-4b75-ac08-adb4566ed755)(content(Whitespace\" \ + 9c55ef7a-f168-4466-95e6-cf2e96e9c35e)(content(Whitespace\" \ \")))))((Secondary((id \ - 56b82221-d544-4e7f-9b0d-5265a7d67d91)(content(Whitespace\" \ + f7222135-1e0a-47d8-9768-4a2b3d5b3e41)(content(Whitespace\" \ \"))))(Tile((id \ - b28f5d37-cf4a-4490-aea6-4845ed7baa3a)(label(+))(mold((out \ + 093b56c5-d1d7-4ba8-87ed-36e778e18b0a)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - c06936ef-5bc4-4f85-9892-786d4a2e34b5)(label(One))(mold((out \ + 6297bd3a-a4c4-42c6-8d3d-7235cb78a5e3)(label(One))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 35c9c81c-03e5-43ea-93b9-c1c1ac29956e)(content(Whitespace\" \ + 5e9d7baf-7bc1-4d27-9dd8-805d474e307e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3e6eeb53-4b68-4c18-9c17-5a910ecd8edd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2c5c41b2-febb-4589-b286-68f1a2b46c0c)(label(type = \ + bce476d9-96e7-420b-aa17-a10481fd5513)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 38657977-bb27-4f27-b328-eac29facdc1f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fce12697-fa94-4f10-8ce0-aa9c5cce633b)(content(Whitespace\" \ + cbc3f8f9-1bcb-4982-8560-19c6f2033323)(content(Whitespace\" \ \"))))(Tile((id \ - 2a095719-b314-479f-9664-89494a5415c6)(label(Single))(mold((out \ + 0e48e761-87ef-4c15-8414-430c07a0394a)(label(Single))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - c5f9fa2a-fa58-49ee-aaa7-d187d7920cac)(content(Whitespace\" \ + 40acbb91-7ae1-4440-aa80-7e9db8847fd1)(content(Whitespace\" \ \")))))((Secondary((id \ - 61b7c8d3-15f2-41c4-975c-b63abefef8f8)(content(Whitespace\" \ + 273f1a10-a364-43ae-9db2-1f9cf1530b06)(content(Whitespace\" \ \"))))(Tile((id \ - 8695b4a9-dfd3-49f1-bf63-86ac6f930f79)(label(+))(mold((out \ + aa249f07-8299-4dca-abd1-d1e7102410fd)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - c7d21efa-c21e-4d5a-95e3-6341813a3069)(label(F))(mold((out \ + eebac9c4-570b-4c43-8afe-d12787a0b613)(label(F))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 609f2e05-ddec-439e-86fa-5fc4e82b2d23)(label(\"(\"\")\"))(mold((out \ + 1cff1dc4-0d8c-4419-b45e-74800a59f801)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 420049a0-30d3-4a01-8ac1-c836abc9bdb0)(label(Int))(mold((out \ + 2438e51a-a325-41a3-bd4b-80d5eda4baa6)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 2c130ce1-a652-44ef-9316-ce1a0e7401d8)(content(Whitespace\" \ + 705a3f01-40fc-409e-81f4-60a687da58ce)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a5ef9581-177d-4ad9-a070-dd2053c29926)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 837fa1f2-aedb-4ec8-9e3e-93f6cb63be79)(label(type = \ + 1fd480bc-ad4c-421d-ab12-fb3de2efa08b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f3fb89fd-da2f-4ea5-a873-0e6ea51f7686)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 69b1dbde-158f-41e7-9f2a-d03f0e928c68)(content(Whitespace\" \ + a1d9f6ad-6108-4538-84bc-9a180eb438b0)(content(Whitespace\" \ \"))))(Tile((id \ - f07a6e45-700d-40ac-9a18-fe3ecfeeb4ad)(label(GoodSum))(mold((out \ + 9ea2359a-3961-497a-addc-e22277787da0)(label(GoodSum))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0074aaf1-18fc-404a-8bdc-f57533a30b4e)(content(Whitespace\" \ + 1092282e-966b-44e8-bf8c-945357a3cc3f)(content(Whitespace\" \ \")))))((Secondary((id \ - dd8700e2-dd7d-405f-9221-fbe60f0a1fe2)(content(Whitespace\" \ + 7ba4f93b-19ce-4ec6-aaaf-7d58d797054f)(content(Whitespace\" \ \"))))(Tile((id \ - 37f3fcb7-e173-405d-9808-bf3fe20033a2)(label(A))(mold((out \ + 3c887993-bf3a-415e-9ea0-89b1fd7fbfa4)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8ce30bc8-4d6b-4fe8-965b-8b70d200f1dc)(content(Whitespace\" \ + 75df5c25-26cc-415d-8499-47e9b3600101)(content(Whitespace\" \ \"))))(Tile((id \ - 6c9386af-fb9d-47d4-b950-7837c2a42810)(label(+))(mold((out \ + 1b27d94b-d652-40da-8cce-e7b2189adcfe)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 46d6e55d-cb09-4726-be93-8c9abf825bea)(content(Whitespace\" \ + a250a98e-aca4-4877-bab2-bcef86ee67d0)(content(Whitespace\" \ \"))))(Tile((id \ - bb77517b-ecc6-4be1-9ca6-ef3fdc086ea8)(label(B))(mold((out \ + 96094693-c7fc-4383-82b6-577a3cbcf77b)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 827a04b9-aaa9-415f-a9e2-84c3f0ce9548)(content(Whitespace\" \ + ea434234-d808-4877-8316-a333f6bb3569)(content(Whitespace\" \ \"))))(Tile((id \ - 1bc7e76d-b958-4703-a7ff-c87d08446317)(label(+))(mold((out \ + 4b1fded6-5bb6-4c85-807e-962dd99e69fb)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f291e28c-2612-47ff-80bd-e22c80016a0a)(content(Whitespace\" \ + 6476f6ba-2b42-45db-83c1-ceba76a59a71)(content(Whitespace\" \ \"))))(Tile((id \ - cc232f7e-f22c-4af9-bfc1-2d10299a5049)(label(C))(mold((out \ + 282335bf-c355-4b0e-8326-d44bca6d1a41)(label(C))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a1a1f23c-bbff-4b37-9093-7cb84131096b)(label(\"(\"\")\"))(mold((out \ + d759ff34-5570-453e-8ec8-87014426ef87)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 92c7ceec-473d-4004-be1a-bd2807ca3720)(label(Int))(mold((out \ + 97b4d24e-63a5-40ac-9fc5-ee2dded33c16)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3bc33329-3c76-4102-9387-b16f704c8902)(content(Whitespace\" \ + da11db79-7646-478a-93d3-7b2aae1321c0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2d50361b-8f4b-4a92-8acd-39aa805c7e14)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6666eb68-101d-4fa7-b2d3-ca5ff5d8c517)(label(type = \ + 9e98c17c-260d-4a3e-855e-1bbc0ade62fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3234a4fa-88d6-4747-b851-0f64ed1d53f2)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7df3d9b7-0a72-416a-b9c7-0f083012a32a)(content(Whitespace\" \ + 8b90c0d6-41fd-4f20-aba6-f5c804258112)(content(Whitespace\" \ \"))))(Tile((id \ - 75b207cf-db91-49c2-9cae-07cfabb882a3)(label(Partial))(mold((out \ + 500a71f2-abf0-45fd-a7f4-70cea3d59ec2)(label(Partial))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - b98420b9-743e-400d-939c-d1062d22abe4)(content(Whitespace\" \ + eb010edf-9908-438c-9c25-af7d412cc0b5)(content(Whitespace\" \ \")))))((Secondary((id \ - a19b4798-1502-4f8d-bc06-8b15a4f6409a)(content(Whitespace\" \ + 8283b850-34d4-48ea-9b2a-663d9fcb7292)(content(Whitespace\" \ \"))))(Tile((id \ - 62955e9a-3d95-4605-9e00-143ad300c5c2)(label(Ok))(mold((out \ + e2b74d99-c07e-46ba-904d-7f5c699cc458)(label(Ok))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - f2d36b5b-7864-40e1-8339-e4ec027d1f20)(label(\"(\"\")\"))(mold((out \ + 23ae11d9-84ba-4845-856c-a6ae7bfd231e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 99606fb6-88d6-4fc5-870f-6a5850d37eb0)(shape \ + fb06ce02-44a2-49b8-9842-b2b49418acc1)(shape \ Convex))))))))(Secondary((id \ - 4f336c71-34f8-40c8-b567-8d6ef36ea809)(content(Whitespace\" \ + a3fbdb78-95db-4b70-9085-2b346153bc9d)(content(Whitespace\" \ \"))))(Tile((id \ - 708d6f03-55cb-464b-b88e-e0a8150fe1d6)(label(+))(mold((out \ + c9c8b322-afcd-4739-ad8b-d91db8b9b9fd)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - aeef33aa-96ee-4d0f-bfbf-825cb1935157)(content(Whitespace\" \ - \"))))(Grout((id 7efc08c0-8655-4d19-8ef5-a13798e574c2)(shape \ + 4156bc1b-fa1f-410a-b4c1-2ce7c746e3f1)(content(Whitespace\" \ + \"))))(Grout((id fe7e519c-2461-4dd7-9746-49c3af96df9d)(shape \ Convex)))(Secondary((id \ - 4543b862-6cd4-4844-bed6-f2e3c09d42c4)(content(Whitespace\" \ + e55f0796-7068-490e-8de1-3f3c58002c3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 96f6afab-3951-4eff-a4a3-a2bfe653f246)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 133867b0-6488-4d53-8a3e-eac9ea123c3a)(label(type = \ + 114869ba-22a8-49c8-9c73-a3fe57060dc9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e5c55242-63a8-4cb5-8e95-1fdb58a10b7f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 844f0954-2482-425a-acb6-8bdae3e575a1)(content(Whitespace\" \ + cbc14084-5dd4-4efb-b4fb-6210346bafed)(content(Whitespace\" \ \"))))(Tile((id \ - 1de15d73-d5ec-4300-89f3-e625abf25fa1)(label(DoubleAlias))(mold((out \ + e5096ae9-33b4-4725-9848-480b6860d80b)(label(DoubleAlias))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 48940ece-c21b-406a-a835-70def77436f9)(content(Whitespace\" \ + 9a886244-fd66-4b8b-9c1f-fa80b5e46baf)(content(Whitespace\" \ \")))))((Secondary((id \ - 23add4d0-c0c3-4839-af2d-157e3263d6f5)(content(Whitespace\" \ + dcafc866-530b-449d-89ca-fe43873db8a6)(content(Whitespace\" \ \"))))(Tile((id \ - 2a8d861b-ed0f-4d4e-a5da-66177133b1d2)(label(GoodSum))(mold((out \ + c9ac785d-96dc-4bf2-aaaa-97ab942a5efd)(label(GoodSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 07bf7bba-0e93-4e83-914b-7606ed4a0073)(content(Whitespace\" \ + c7b80047-311b-4153-aa1b-803f990d0efb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 37a671ca-1074-4060-a541-f7b8816bd0a1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4a63d8bf-a486-4f6d-bdd7-9ce0d0486c8c)(label(type = \ + 47eac0d8-d8b1-4c4c-832d-4014d5744812)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a665ab2e-2e67-4c71-9289-6c2f901f8528)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4e2f946b-bea5-4bde-9310-2cf6314df466)(content(Whitespace\" \ + b3ed006b-88b8-475e-8246-059f0963e8b2)(content(Whitespace\" \ \"))))(Tile((id \ - f20b6d69-f647-440b-9aa6-576476344f9a)(label(VerticalLeading))(mold((out \ + 9c3a5271-84e6-460a-a195-9bcd098804cd)(label(VerticalLeading))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - e63a953a-b13a-4c7c-b196-72b2a2ff22bf)(content(Whitespace\" \ + ca7977ef-64e8-47a5-a112-53afc400788c)(content(Whitespace\" \ \")))))((Secondary((id \ - 73ec6fe7-c3d6-41a1-8b93-7583933e8c99)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 313aca52-ad71-45ec-a91c-4643849cce0d)(label(+))(mold((out \ + 98521797-da85-45ce-bf2e-4b3fe7f96b0e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b2a63a1f-2688-4dcc-8782-f925d6b3d3e0)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 06adf35e-9b04-406f-b737-134bc2bc0805)(content(Whitespace\" \ + d11152e3-a36c-445b-9535-d43bbd2ce4ad)(content(Whitespace\" \ \"))))(Tile((id \ - eca64c6d-220d-4c27-ad92-54d23d4e7873)(label(A))(mold((out \ + 207a47c3-ae84-4ff6-9d06-9e1c93ad092a)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4e1bc11a-cc46-470a-9665-ce67099df2f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e0530d2e-876a-4d61-aef4-724a2089820c)(label(+))(mold((out \ + 6ab9c507-8c80-4da8-b18a-87d203ba5a79)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 10e3b054-9c7d-4c1b-bb3d-5f92086ffd9a)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c6de3880-44c4-45d3-b74d-8e304f6a8eb3)(content(Whitespace\" \ + 8622b766-c2d9-4373-8a98-e0816392af05)(content(Whitespace\" \ \"))))(Tile((id \ - 72fecc0c-f072-4bac-b361-48c5d3c538fb)(label(B))(mold((out \ + 4c846cd0-efd1-452f-918e-951d53257907)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 78ac48c2-f63b-40bc-8b03-15f33e2fe22a)(label(\"(\"\")\"))(mold((out \ + 5e702525-8caa-48bb-8b05-a040df4feeb1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 6af87973-e7e8-417c-b4c6-c93c58e3be70)(label(GoodSum))(mold((out \ + af22edeb-5ad1-4335-8169-7734317f43d1)(label(GoodSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3a89891b-6279-4522-b31e-b992fbf42eea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a97ddf83-7e6f-42f0-9058-89420eca125f)(label(+))(mold((out \ + 05a0f029-d61e-478e-8dd1-aa49da039942)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f5f27106-f728-424a-bb07-15ce11337657)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ce6f9b84-8b77-4948-a6ca-7fbcd1f8f3ce)(content(Whitespace\" \ + 9c5937c6-d774-4d89-9ae9-56fd4e82ce1f)(content(Whitespace\" \ \"))))(Tile((id \ - 8a7c62eb-eb9b-4a62-865a-2bfd9ac50c8f)(label(C))(mold((out \ + ca286fac-9afd-4b52-9b2c-69fdae486a24)(label(C))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8e457293-c546-46fe-9aab-77dd8a962c8a)(label(\"(\"\")\"))(mold((out \ + 27fadc50-d16c-43db-a863-944dbb0b04b1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - aca95780-8bd5-4837-9685-d5a43d756204)(label(Bool))(mold((out \ + b5fe7d27-c744-42ea-922e-caba356871d2)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d25668b0-5da2-4400-b17d-cde3f9523cec)(label(->))(mold((out \ + 40de0ab6-2db4-4168-b17e-b43bf92712ad)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - 409a48b9-6f56-49da-93c0-3908a21b20d3)(label(Bool))(mold((out \ + 967acf6e-dc2d-4b97-8cb4-5bf5eaf9986b)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1bf0a21e-602e-48e0-a913-89acda895fa2)(content(Whitespace\" \ + d4f393e4-197c-4f5d-9992-9273a2230d42)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8c283036-2528-457b-8f84-4917ce721da3)(content(Whitespace\" \ \"))))(Secondary((id \ - 9fa48fc0-e740-436a-a834-d85c442e6d3b)(content(Whitespace\" \ + 1dff48cf-d5db-4ca5-8e97-1a87f837ca91)(content(Whitespace\" \ \"))))(Secondary((id \ - ba96a205-d3ea-47fb-a133-2bdb095b4075)(content(Whitespace\" \ + 03b2a113-7e4b-43d2-9db7-66e5b018ac80)(content(Whitespace\" \ \"))))(Secondary((id \ - 273bd99c-5f05-4f93-9f87-8b24ba051cc0)(content(Whitespace\" \ + 45705bc6-5bb1-4392-b2e8-3631305c9ca0)(content(Whitespace\" \ \"))))(Secondary((id \ - dcb11eda-d2e6-4613-afb6-39816ed80b31)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 85197060-af85-460e-b571-73408983cbab)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dd2c2412-6928-4540-9a05-64d3f699b3a9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fa41dd9f-9858-4325-8ffd-892dba7e3cc1)(content(Comment\"#incorrect \ + 191bed93-83d6-4e87-9a28-5a654c14a84b)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + b637ddf4-6636-4263-9d49-a7614a1e6f5b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 15c3bd9b-901a-4765-b0ae-2321e7367199)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fec3d60e-028e-4a0c-8796-d5fc09e3da83)(content(Comment\"#incorrect \ or incomplete type definitions#\"))))(Secondary((id \ - fa9e4b4a-1f9a-425b-b5b6-4f15f84a16df)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 729eb092-6bca-4c44-9c9c-a94a4b7cffd8)(label(type = \ + 489eb08a-1e8a-4ec9-9c5b-03752b32bd3e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7558ae1d-c2d2-4189-88a6-12ff215a1bee)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 73adf4e8-c8d3-4ebc-b516-5c8f92404ec9)(content(Whitespace\" \ + 6b2fa0dc-76c5-40c1-8a12-9434217efb46)(content(Whitespace\" \ \"))))(Tile((id \ - a2f1763d-ef60-4232-99ae-7647d78338f2)(label(badTypeName))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f8b520c6-f264-4076-9649-17a864a4b86f)(content(Whitespace\" \ + f149a8bb-910c-4022-a578-92dfd9d66bc1)(label(badTypeName))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ + a7d39551-cdfc-4990-9f97-923c226ca6da)(content(Whitespace\" \ \")))))((Secondary((id \ - 18019111-20f2-4478-ac3e-184d498baa90)(content(Whitespace\" \ - \"))))(Grout((id 8a941955-fd4c-4e66-b139-0474d6d02d66)(shape \ + f43043f5-2d04-47f9-8c63-f7d6a2ded9f3)(content(Whitespace\" \ + \"))))(Grout((id f77ea8ed-753b-4efc-85e7-a059acab6299)(shape \ Convex)))(Secondary((id \ - df256ea3-7ffe-4af3-8e07-436da632b54e)(content(Whitespace\" \ + 35957e0c-336f-4eca-bad5-41e410c3e733)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4e52dd2a-a324-4b26-92b5-cb43d228c19f)(content(Whitespace\" \ + 62c1a220-7594-4725-b900-92624aee8c45)(content(Whitespace\" \ \"))))(Secondary((id \ - 06714ab5-4fef-41e3-b49d-bee494043255)(content(Comment\"#err: \ + 2f2977d9-316c-41e1-98c8-bfd503b77a35)(content(Comment\"#err: \ invalid type name#\"))))(Secondary((id \ - 18328d79-df7d-4a3b-9f09-5b372c335600)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a6481775-519e-46e8-9ec6-2e589373d24b)(label(type = \ + b6e233d0-cb62-4f6a-ba0c-f8d1db0cc567)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 888f016c-d7c0-4c93-a18f-f5c834c9593b)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2a07e4a3-d81f-4526-80f1-32bbafb8899d)(content(Whitespace\" \ + 2a6d65ad-d513-4e19-ba4e-ca19cd2524ff)(content(Whitespace\" \ \"))))(Tile((id \ - 8b94d1a8-2e1f-4e82-9826-585834db8914)(label(\"(\"\")\"))(mold((out \ + 417bcb5d-9cb2-4517-9ecd-8b4b4bd4953b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - ea3f39e9-9d0a-4e79-b900-09de6ca7c0dc)(shape \ + 5206689f-03c8-4a86-830c-d83f82774620)(shape \ Convex)))(Tile((id \ - d78cad4b-9cb1-4187-a2b4-3daf04450c52)(label(,))(mold((out \ + ffab4ae0-0982-43d4-9142-646be82ce4a0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aaa31511-4997-4f57-a00a-99af63c3232a)(content(Whitespace\" \ - \"))))(Grout((id 4fe172c4-68be-4570-8516-1cba23643c8d)(shape \ + 831e5d76-6628-4ac5-832d-a5d0973f9cfa)(content(Whitespace\" \ + \"))))(Grout((id 5e5fc062-ee9f-467a-ae61-1484577a9a04)(shape \ Convex))))))))(Secondary((id \ - d315fa5f-9cf2-4a6d-9493-f0de67fedb89)(content(Whitespace\" \ + 226c107d-b679-4359-b700-0af5fb9c0fef)(content(Whitespace\" \ \")))))((Secondary((id \ - 524646d5-63ba-4ee8-bd04-58dc3f03993b)(content(Whitespace\" \ - \"))))(Grout((id 44bb8352-d0bf-4933-bac3-d227bae5dec7)(shape \ + 9a69480f-3749-46b7-b006-3782a8a22bee)(content(Whitespace\" \ + \"))))(Grout((id 5f4e6ebf-6e2d-4122-8dce-e1b65c16a987)(shape \ Convex)))(Secondary((id \ - 04ab24da-9785-4a74-9f0a-027cab3c0579)(content(Whitespace\" \ + 560d14c8-767f-4b3f-bf8e-4262f4e955d8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fc5706bb-edcd-4bc8-9618-4fdca8c7377d)(content(Whitespace\" \ + 2f5b0d39-8a13-4ddb-8ba5-e2835d9098c8)(content(Whitespace\" \ \"))))(Secondary((id \ - 782d8ab3-80fd-4e18-a67f-957c385efcae)(content(Comment\"#err: \ + f5a63c87-020d-44e8-9cf1-1cf2ba871078)(content(Comment\"#err: \ invalid type name#\"))))(Secondary((id \ - 776c65b7-6960-4c83-ac48-1dc6ddd6316c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 92eb8b7a-cae8-4111-be52-6530b229a36f)(label(type = \ + da7ce790-90ae-4d95-a9cd-cff65cfe54c7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f2cfc44a-3702-4143-8cb4-019ec2a2c620)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 638612b7-e75b-434f-9dd7-52e6f4afa84f)(content(Whitespace\" \ - \"))))(Grout((id e2a03ab3-180b-4d31-9278-cbe499404aed)(shape \ + 7003d5c2-5b64-4a4e-885d-9920ef0ff644)(content(Whitespace\" \ + \"))))(Grout((id bbe86a36-4e04-4b52-a6af-d722d52e8c5e)(shape \ Convex)))(Secondary((id \ - be085a86-4c10-429a-9172-df2d77c0f85c)(content(Whitespace\" \ + 2cbc15af-8797-4931-8a58-70050e5d26d4)(content(Whitespace\" \ \")))))((Secondary((id \ - 3d2eaf9e-22e8-428d-8670-36e50d66d2fc)(content(Whitespace\" \ + afedc638-2702-4c31-880c-49e842d7f452)(content(Whitespace\" \ \"))))(Tile((id \ - 2af8f5e7-032d-40a4-b733-2af5c7947e3b)(label(badTypeToken))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f422eefb-364a-461a-875b-0e01df1babe5)(content(Whitespace\" \ + 93bce54a-4065-4016-a4b5-1d15f708a2d8)(label(badTypeToken))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + a72c322a-fe7c-41ca-bfc2-54d2364a63c5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b5be4351-0e7f-473f-9fb5-6fa055130592)(content(Whitespace\" \ + 8bc487c7-e4b4-4ff2-b8be-7b588c67660b)(content(Whitespace\" \ \"))))(Secondary((id \ - 38ed1b1c-b840-4f12-8505-64e9a8aaf0ff)(content(Comment\"#err: \ + 4b8f7eb8-e810-406e-9cc3-50ab038b4b98)(content(Comment\"#err: \ invalid type token#\"))))(Secondary((id \ - 238a9588-4c4e-42e4-bd27-6c24e84a47db)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f6bc3423-dfd7-4840-acda-b87b7db7ff5d)(label(type = \ + 8a476536-be07-4be4-8146-0d8c81610946)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4c8d3376-d0be-44f8-bbfe-c641ce6b59cf)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2af16e97-3598-4aab-9875-8183e5ce77d6)(content(Whitespace\" \ + 673e7954-6578-421d-a70b-21447b7bb549)(content(Whitespace\" \ \"))))(Tile((id \ - 5bdd4d69-6eda-4d89-bae6-7216a7a01877)(label(NotASum))(mold((out \ + f2b11e88-da5b-4726-8d82-e3005b81346a)(label(NotASum))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 334bda6b-3d6f-4964-a2a0-74555ca5e900)(content(Whitespace\" \ + faf0684c-a771-45df-b295-72f9356a2e46)(content(Whitespace\" \ \")))))((Secondary((id \ - fe0e1a5b-4c6a-4219-86aa-343dcf537aba)(content(Whitespace\" \ + fc1e4372-cf3c-4dbe-8f98-802f11b882c1)(content(Whitespace\" \ \"))))(Tile((id \ - be97b584-8d86-4227-a785-68c71572668d)(label(NotInSum))(mold((out \ + 39854dea-8bdb-4fa6-9f10-446ff45a80af)(label(NotInSum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 2afa8050-cee7-4375-8369-9164fc66f62b)(label(\"(\"\")\"))(mold((out \ + f587e15e-acad-4996-aaf9-27a513104173)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4c73234e-fa09-4876-a4d4-347ae6f315fd)(label(Bool))(mold((out \ + 6b9a7e4f-eec6-42f7-8f29-9287a34e2e24)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - ad45f964-71b8-4365-a280-ba112e276d91)(content(Whitespace\" \ + 21c07099-370a-45e5-9bdd-31ae5da95622)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c06e3e90-296c-418b-aeea-9eee8436c3d1)(content(Whitespace\" \ + 6b7811b8-66ed-4179-8cd9-7e1a22227120)(content(Whitespace\" \ \"))))(Secondary((id \ - 70714876-4c76-4d34-80f0-39e632fb11c4)(content(Comment\"#err: \ + abba8456-f770-4b21-b4ff-67fd687eac02)(content(Comment\"#err: \ cons not in sum#\"))))(Secondary((id \ - d64987dc-6404-45da-8ca0-7879e7b52b4c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2099bd11-4147-4ad6-9039-9f6fc88f643b)(label(type = \ + 064d2987-ae17-4864-8575-c9100308435c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fbd98944-622e-41b7-95a7-bb7078744918)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b4df731f-29a8-45c0-8e20-be09fbdfef06)(content(Whitespace\" \ + 28135f7e-a78d-4845-9f04-862039a4e609)(content(Whitespace\" \ \"))))(Tile((id \ - b6aab60a-6dfa-4384-a6ed-22d767fafe6f)(label(Bool))(mold((out \ + f711c7c8-ab69-4969-9b01-cfe6842f118b)(label(Bool))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 436efcc2-d901-4cc8-88b6-2528b5df5c9c)(content(Whitespace\" \ + 2d1cfbbd-67cd-45cd-8fb1-ffa8aaf9606a)(content(Whitespace\" \ \")))))((Secondary((id \ - 6498302c-6a53-4ea8-ae45-a3def6ce9f93)(content(Whitespace\" \ - \"))))(Grout((id 4e7f6907-2a35-4077-ae80-a4097862ca2e)(shape \ + 712836fd-f2d8-4ae8-b834-2a5aa6b977aa)(content(Whitespace\" \ + \"))))(Grout((id 5993dbe9-38ec-48b8-9b20-f2453559df6e)(shape \ Convex)))(Secondary((id \ - 1494fed6-37ff-43dd-b1d1-b4afba3d8c46)(content(Whitespace\" \ + 9fc204c2-7649-4f75-a90b-14786125145d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6a8bf3d1-33f7-49c4-b75f-3aea2421be31)(content(Whitespace\" \ + d9987d7d-53c3-4a6a-bfd9-381501eb8fab)(content(Whitespace\" \ \"))))(Secondary((id \ - ae3890e7-841c-406d-8fac-05fb53dc383c)(content(Comment\"#err: \ + 5d07411f-534d-4a78-9711-33221ba5e1f3)(content(Comment\"#err: \ shadows base type#\"))))(Secondary((id \ - de591822-1253-473d-955d-a86be697c0ab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 79f4f791-e8bc-4083-beb3-35433524c7be)(label(type = \ + 3776f836-6b87-4867-8a6c-66f2fc169050)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8aa7fa01-948d-4c05-99f9-04cb40145e7d)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ba4e9b22-4497-4839-b4f8-4560b9862fc1)(content(Whitespace\" \ + 5d0ad717-41f3-4334-97ac-991ef377dc85)(content(Whitespace\" \ \"))))(Tile((id \ - aef1e763-8ae8-4ebf-b3bf-f7713b673bb8)(label(Dupes))(mold((out \ + edf15f0e-fbc9-46b4-b65b-866ff4a0b469)(label(Dupes))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - e8de319d-0f69-44fa-ba5f-475f25d5a8d7)(content(Whitespace\" \ + 333d60a4-e8a2-4ac8-8ea1-49ab56a3463b)(content(Whitespace\" \ \")))))((Secondary((id \ - ed5090b7-8616-4a08-90cf-734a7fcb1cfd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 512f8e9e-2709-4e10-9220-420bcb444a3f)(label(+))(mold((out \ + 8e14082b-8052-494c-99b9-a57524671756)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ee19dcaa-71a2-4c91-b05d-ac96faab20cc)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - db3a5b00-6bf0-43de-87c8-ce29d78857d5)(content(Whitespace\" \ + 8e965307-1027-4a51-b2a6-08e37ecfd206)(content(Whitespace\" \ \"))))(Tile((id \ - 81a8b322-9945-4229-ac29-410b6c02db6a)(label(Guy))(mold((out \ + b5bc14f1-e275-4212-bfd7-2589e0b8b725)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 808e4d48-d491-40b2-a130-717c8db241f9)(label(\"(\"\")\"))(mold((out \ + 6ba5f098-b3b6-4b70-a3c0-2e69db74db7d)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 738b6238-06ce-4ac2-a655-dde56ef050cc)(label(Bool))(mold((out \ + 862f4151-b0a4-4db2-8f90-acdf96709681)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0b604fe8-c45b-456a-b255-4c635a8be945)(content(Whitespace\" \ + ceb028b0-c0d7-44d8-be8b-6c3f585ba993)(content(Whitespace\" \ \"))))(Secondary((id \ - f97fd8a5-b07f-4f57-b4d0-14adc03b6e1e)(content(Comment\"#no \ + dd51ee1d-84b7-4b04-bee8-a99ce3e56807)(content(Comment\"#no \ err#\"))))(Secondary((id \ - 83f62094-807b-4a6c-b9d4-d648c0ce6c56)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a43d2fdf-3eab-487a-898b-97d7fccc9e87)(label(+))(mold((out \ + a901b57c-69b7-45df-b69e-b21c0450a157)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3cd85ba6-17b3-4c71-a2a2-f54c3427a32e)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5e010b4a-4440-40dc-a37c-d6a7ad147749)(content(Whitespace\" \ + c8470ef0-70ed-4753-83ea-edaaf49503df)(content(Whitespace\" \ \"))))(Tile((id \ - 31fa86c5-0158-4144-aa17-baf657163fee)(label(Guy))(mold((out \ + ed69a782-cffe-4064-9481-3425c8cd4b8d)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ddce3444-295a-4bd4-b64e-b86f16cb9b98)(label(\"(\"\")\"))(mold((out \ + 8185ed69-8f1c-48fa-b3ec-220316630eea)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - fef9efec-93e0-43e2-93e2-25d5029ad3e8)(label(Int))(mold((out \ + e7493c3a-23b2-45b0-937c-100e294c19a4)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 98860875-fbb2-42cb-9505-4b22eb59e513)(content(Whitespace\" \ + ccc73854-35fa-4755-bf66-0b841830108e)(content(Whitespace\" \ \"))))(Secondary((id \ - a7b96775-6858-4ee1-8148-96e8cb60d2d6)(content(Comment\"#err: \ + 15e3ca84-9d18-4355-b07f-485f3928f0aa)(content(Comment\"#err: \ already used#\"))))(Secondary((id \ - e83feb84-e824-4e24-be26-cc7f4a79fb0a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 534d4a01-bf40-462f-a9dc-2604811ca5ae)(label(+))(mold((out \ + 90cb768f-ee69-46da-85e9-02bdf81188bf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 908ca012-d4ef-460a-99b7-bbfbb3c8d082)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - eaa13358-69f5-4f93-af91-01f47ae43e53)(content(Whitespace\" \ + ea87f61f-56f5-4bb7-96e1-a2a5a0d1068f)(content(Whitespace\" \ \"))))(Tile((id \ - 09266814-631b-471a-9356-088e28c64f94)(label(Guy))(mold((out \ + e0c22a11-1546-4c87-a199-a5662d0eabde)(label(Guy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - afc90f5b-9892-4659-ab07-bc8f8027b79b)(content(Whitespace\" \ + e52f1b9b-5946-4f70-a3d7-9d5512ca7832)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 150ee1fb-29b8-4f8e-b7ee-fa4549224882)(content(Whitespace\" \ + cef7901f-0389-4ba6-a5e9-6520626a378d)(content(Whitespace\" \ \"))))(Secondary((id \ - 5ced057b-edc4-49bc-937b-12dd1f8a8a2d)(content(Comment\"#err: \ + 83d2b79a-91b6-4ac8-b769-845f1c62733f)(content(Comment\"#err: \ already used#\"))))(Secondary((id \ - f9280917-76e3-4844-bc7b-25f3509ec9c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 42576613-4978-4df6-8c81-9f2c4c9e5803)(label(type = \ + fa95b24d-693a-4f12-81de-fe1c4c53ab2e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cf385365-40b7-45eb-ad57-2021c268f397)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5da6891b-90d6-4380-8323-ea3156b4cc29)(content(Whitespace\" \ + 824f2d46-1063-4c08-9778-b3efae1d6b64)(content(Whitespace\" \ \"))))(Tile((id \ - 0eed58e4-da77-4d2d-8e88-3ea0dda9c959)(label(BadCons))(mold((out \ + 3ec9ae2a-cbed-4c90-814a-d211077d49f2)(label(BadCons))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - be82dbe2-4d5d-4435-8871-511cc4e29a99)(content(Whitespace\" \ + 96fd6772-8725-4875-b5de-c9a15b8f5973)(content(Whitespace\" \ \")))))((Secondary((id \ - 5ca402e1-16f1-46a8-9a2d-2537a3455334)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 797865f0-0a70-48e0-a7c3-06abf1098061)(label(+))(mold((out \ + 2dcafd6c-e8f2-4304-97c5-9b36d13d932c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 002acdc1-a61a-4ed9-a081-b8230078dd44)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 792b4716-921e-4f5a-ab4f-7d513f7dee7a)(content(Whitespace\" \ + b78bcd1e-362b-44ce-9d85-a480eba224a9)(content(Whitespace\" \ \"))))(Tile((id \ - 5fd4af46-9c59-462a-ad65-a5511988ba5b)(label(Um))(mold((out \ + c6f91064-ec82-4995-8bc5-db8ee018a756)(label(Um))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 249a8ad7-6f9b-4d25-a98d-393c96fb54ad)(label(\"(\"\")\"))(mold((out \ + 7c9464b5-3b7d-45d2-80eb-d91ab8cfd62e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 04b0aa5d-a432-42ac-816c-f40c06d40e1d)(label(Unbound))(mold((out \ + fa5518e3-4eb3-4be6-8364-c39ef2608c95)(label(Unbound))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3d794ae0-161f-4552-8bd3-8d57d0442002)(content(Whitespace\" \ + 99e81a33-186b-457a-bfce-f5145b9bd050)(content(Whitespace\" \ \"))))(Secondary((id \ - 7b97a728-0efb-462c-9b46-d5f2811508cc)(content(Comment\"#err: \ + 8592d68d-3e53-46c0-935b-16d1c836ba58)(content(Comment\"#err: \ unbound type var#\"))))(Secondary((id \ - 2e5636bb-e0a6-465f-a1df-fdb0f5e24653)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6447751b-29e3-44a2-a405-29f98eee4685)(label(+))(mold((out \ + 204f4073-1e00-4bdd-bd93-385d46f05b13)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ca0c6033-2ddf-4f79-b055-b48b89831a05)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - eece4248-72e4-4468-9b89-5e1bbca0b065)(content(Whitespace\" \ + 2d6e17bd-d828-47e3-b4be-350c0b73bffe)(content(Whitespace\" \ \"))))(Tile((id \ - e8f50522-7c0f-4131-9b6a-554d07d132ba)(label(notvalid))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0bc1c863-e71d-4db4-ac91-6b68ed84b9e9)(content(Whitespace\" \ + e5e19711-bab1-44c1-b80a-558676c264fd)(label(notvalid))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 5b817dd7-3b08-4638-bc49-927e1191e4d5)(content(Whitespace\" \ \"))))(Secondary((id \ - 6de1f294-e9eb-4720-97bc-78170bad857f)(content(Comment\"#err: \ + c329adb2-8abb-4f15-a2cc-54e1a9666062)(content(Comment\"#err: \ invalid#\"))))(Secondary((id \ - c45eb0a6-04ce-47a3-a776-4fd5b3c1b454)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 08fabaec-69c7-4590-9f88-5dd0fc4011ac)(label(+))(mold((out \ + 1f6b7a3a-6544-4793-bd5b-2cedcedd362a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 47e1980c-6bcb-4d35-917b-0aa366e82a00)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 73b55a89-bb15-4c63-9e19-bf13a4ac8a86)(content(Whitespace\" \ + 71915789-4894-45a2-89e0-aaff76f7afce)(content(Whitespace\" \ \"))))(Tile((id \ - 573530e5-070f-45b4-8e60-2ca26c23eb2f)(label(Bool))(mold((out \ + e1df3e66-0559-4e29-a642-fb9249ce3a79)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c4d4dea2-5a5d-4c51-bd33-7554baf0dacf)(content(Whitespace\" \ + c0d5da6d-8291-468f-9811-17af4efba571)(content(Whitespace\" \ \"))))(Secondary((id \ - 0bddc992-c58c-4636-9c62-24c335ff304c)(content(Comment\"#err: \ + a7dec1b9-aaf6-48ed-92b9-48f6aceef004)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - b3c1200b-b957-491c-9115-bd2a5943c19a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c7e0d488-2743-4a9d-90ce-e49810f08ab5)(label(+))(mold((out \ + 540ed3f5-7525-42a5-b484-c71a160b49ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bd587c31-7fb5-4d25-8723-596f77315616)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ad4e6ac1-c04c-4888-b982-0ea1f09ef59e)(content(Whitespace\" \ + 5eefc185-3a52-45c2-ba3a-5f4b13d8dbb7)(content(Whitespace\" \ \"))))(Tile((id \ - b5cf2934-55eb-41a8-9d82-4759d1b82ce7)(label(Int))(mold((out \ + 8f4a1a30-5205-4374-b4b3-63fb25420490)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a6aed30b-b938-47be-8d62-611b65951da8)(label(\"(\"\")\"))(mold((out \ + 71d3afac-3e1a-41d9-984e-e5ea6da607bf)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 06dfb39e-dd31-4205-88cc-e24f7dfab38c)(label(Int))(mold((out \ + c5a4bce2-945a-4220-ad1b-f4dcf6c3149c)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 9e6ee42b-65a6-476e-b29c-2f9247d67510)(content(Whitespace\" \ + e2d76872-4c0a-4466-8156-a165ff424b2a)(content(Whitespace\" \ \"))))(Secondary((id \ - 37c34bae-9b6c-4a8c-95be-8c753179e59a)(content(Comment\"#err: \ + ef25dfa1-8d2f-4eb0-8610-d032e6e75600)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - 20510235-1727-451f-9c67-ad5db70bda44)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4c385804-9778-42b2-9871-79b44326e3ea)(label(+))(mold((out \ + c4609ea8-b2d1-4650-b0eb-543cc0b23a83)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8a9fa4fc-41ba-43bc-9a11-d971243df488)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 02f80476-bd32-4a17-9fac-2926671e95c9)(content(Whitespace\" \ + eb8dad38-7aae-4245-b33a-59a5a8dcb957)(content(Whitespace\" \ \"))))(Tile((id \ - df043d06-b59c-4fe0-9ce8-3abbf82beb5f)(label(\"(\"\")\"))(mold((out \ + 71968b46-dda7-41c3-bd0c-ec1ae8e9d8e5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - b9bd046b-2dfd-46b6-85f1-fe86e5c80420)(shape \ - Convex)))(Secondary((id \ - c85014e9-1006-444d-8c7d-14788b21d112)(content(Whitespace\" \ - \")))))))))(Tile((id \ - 652f973c-ba42-4de9-a595-d0420b1234ca)(label(\"(\"\")\"))(mold((out \ + 75f8c6a6-949f-420b-a151-631ffd8d30ec)(shape \ + Convex))))))))(Tile((id \ + 976267ab-9b5c-4220-846e-1b135314b98e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 7ad3ba3e-d211-41e8-b230-61cbe5884e92)(label(Int))(mold((out \ + de8c7cfb-4375-4637-b416-844c9e54d7f7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 008443c8-979b-486e-8a8a-c97367c97e8d)(content(Whitespace\" \ + ea0e5687-1874-4236-8834-272136dac6f3)(content(Whitespace\" \ \"))))(Secondary((id \ - 6bd41e53-b5ab-4ebb-8d75-1b4c72f9bbe3)(content(Comment\"#err: \ + 7468b44f-805c-4e0c-ad77-c4cb4f848e6d)(content(Comment\"#err: \ expected cons found type#\"))))(Secondary((id \ - 6f14377b-1dde-4a48-ba48-1300ec9e0fe2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8043c836-6993-4e5e-aca7-da849e70dfab)(label(+))(mold((out \ + 4a153c35-5ce5-43fc-bbcd-7e43cbb18953)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 18c08f07-6b58-4a22-8f4d-682810773cb3)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f2c938bb-0ce1-426d-b0e6-f64d856fa370)(content(Whitespace\" \ + 7cd788b7-0236-40ae-b1da-2f20ab6a8cf4)(content(Whitespace\" \ \"))))(Tile((id \ - f5734ceb-e7eb-46ec-9c21-ee3c0206f64b)(label(A))(mold((out \ + f1feabaf-5ddb-4db9-b69a-b7e6eca70bf9)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 1602f845-c07f-463b-8065-4670979bacfd)(label(\"(\"\")\"))(mold((out \ + 8d82ae98-be0d-4f2f-beb9-3fcb2490a4a0)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 981c85c2-0813-4ca3-a55b-d99af769b8a2)(label(Bool))(mold((out \ + ffadc84f-e2c3-4bae-b968-b9ca33bc496c)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - dbc4fbf5-088f-4298-8d64-e7412dae6c09)(label(\"(\"\")\"))(mold((out \ + 2f1dab86-7106-4f52-a424-32ff23639a18)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 780a24dc-da03-4dfa-b901-25d60fe42377)(label(Int))(mold((out \ + ba7db097-40b6-4d66-b4a1-2059036739f8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - f8657c80-1c9f-42df-965f-5515cfba6bb9)(content(Whitespace\" \ + bd06261b-be63-4826-8c7a-2e82956837f5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 10d4fcfd-b3c3-461f-8e2f-485162c71892)(content(Whitespace\" \ + 3ebb1024-ba7f-4a31-87e6-e023edacceae)(content(Whitespace\" \ \"))))(Secondary((id \ - 7cbd30bc-2053-4dc5-8710-aedb5197a14d)(content(Comment\"#err: \ + 76dd8410-d31d-4d22-ba0f-50559b87f636)(content(Comment\"#err: \ expected cons found app#\"))))(Secondary((id \ - 6c4fb36a-b55d-4692-8bb4-3c2fce732e90)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0b4a81ab-3f85-4b10-bac0-d340a15aa6ff)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9e70b9ba-7e15-4d8a-8022-4efd6423e778)(content(Comment\"#sums \ + a4f7906a-e44e-4c54-822a-2839c0cdb322)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cadf4e99-f2ec-4447-b970-7f972a395d06)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 98cb10d1-3207-476f-9e61-2af22fc00094)(content(Comment\"#sums \ in compound aliases dont add ctrs to \ scope#\"))))(Secondary((id \ - 2736b75a-d763-4723-94ff-7b15cc7da021)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 87e1101f-508a-44da-9e98-6fae75646d5f)(content(Comment\"#but \ + 685006ca-8fa3-4967-b9ba-183f7f154ecc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 33f054b4-f4a2-40b2-8783-394a2d1299c6)(content(Comment\"#but \ compound alias types should propagate \ analytically#\"))))(Secondary((id \ - 5aef793e-beec-46e0-9a19-e831574d6432)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b6f2f4cf-2288-49ad-8064-b8edfa689d0b)(label(type = \ + 80dcf596-5dfa-4e32-ba56-a72707cb677c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9642e332-c9b2-4f1a-9692-bd1569f5a63f)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b0187792-3c02-4ce0-8d40-bded09318831)(content(Whitespace\" \ + ecd9880d-5dd7-4f39-a08b-9b91d584ebbc)(content(Whitespace\" \ \"))))(Tile((id \ - 66169d2b-6b8d-4797-a3ee-3772e4258dd7)(label(CompoundAlias))(mold((out \ + d1adeb5c-ab3f-4494-97d5-607502c6b76b)(label(CompoundAlias))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - e3e17be1-6491-451c-8fcc-21b82fe5442a)(content(Whitespace\" \ + 61dfd748-f518-464f-a1e1-b9652cb0def6)(content(Whitespace\" \ \")))))((Secondary((id \ - d74159b4-8c2e-4d98-8e04-a60b7145cb86)(content(Whitespace\" \ + 81f58e1d-3115-422a-be90-01d086075c5f)(content(Whitespace\" \ \"))))(Tile((id \ - 7402e78a-c22c-47e9-aad7-3c2f59e9fbfa)(label(\"(\"\")\"))(mold((out \ + e5325ade-d364-4f8b-9a04-bc74b904f07d)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 06e7788d-4918-4aeb-87c5-35974a312cad)(label(Int))(mold((out \ + 40fef070-2b38-4421-beb6-5c8f2c6a308b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - fa769906-28a2-4729-b0a1-cd19dbb31320)(label(,))(mold((out \ + e4d6f8f0-6d32-4a70-956e-9b656b7c6d2b)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3ff83eee-734d-48bf-8e6f-95368d916953)(content(Whitespace\" \ + bbb249de-9308-4a5e-b8d4-9101cf6102ac)(content(Whitespace\" \ \"))))(Tile((id \ - 1b76e89a-5a21-459e-be3e-a098b9ac4262)(label(Anonymous))(mold((out \ + a029348c-f2d0-48e4-999f-ed821dce66f1)(label(Anonymous))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ffd6a15e-c992-49cb-b093-4de734ef226a)(content(Whitespace\" \ + 03d4c0a6-1e17-4343-9428-9d215e96d0a2)(content(Whitespace\" \ \"))))(Tile((id \ - 5a058f00-b1eb-4aa5-a326-f319549949d5)(label(+))(mold((out \ + 43fc2bdb-d0e4-46b2-babd-5429c35a9e9c)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 635bde49-7101-4609-8eeb-b1dd62c58ac4)(content(Whitespace\" \ + 8be1ea2c-fd19-41e8-a831-dfee3966e1a2)(content(Whitespace\" \ \"))))(Tile((id \ - 0081bb3b-8957-4a9e-ad93-b57958e59e09)(label(Sum))(mold((out \ + 81dec1b6-4128-4881-bcd9-50e3a3e428c7)(label(Sum))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c43ee57a-f9ae-42e8-b32a-92dfb225a273)(content(Whitespace\" \ + 6235a423-f744-439c-8353-fb9c24e1691c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 33d8aa3f-3654-4675-a887-a7c2ddb0b5f1)(content(Whitespace\" \ + 29066f68-1f40-44db-9c83-efb0ba7a84c4)(content(Whitespace\" \ \"))))(Secondary((id \ - dd1ee30a-19df-4146-8077-29987772f7ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4d1e176c-830d-4f05-a557-2c0157120cd1)(label(let = \ + b632fcd7-4568-42e4-ac0e-594cd4bb40db)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d716fa00-7df4-413e-9916-3a0a6e640604)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 59740414-4047-48f5-aa87-c4f30485a202)(content(Whitespace\" \ + ea39fa11-773b-423e-81d5-3b02f76bd085)(content(Whitespace\" \ \"))))(Tile((id \ - 58487b2a-8323-449d-a1c5-b017932c7335)(label(_))(mold((out \ + 5d57e03a-351b-41ba-ad6a-ace053f8968a)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a8267f0c-50be-4a58-b34e-3b8da2fabbd7)(content(Whitespace\" \ + 87bb2a66-42f1-4be7-89e6-bb9556f13fd3)(content(Whitespace\" \ \")))))((Secondary((id \ - 506c2e86-935d-44e9-97a9-dc4cd11a48db)(content(Whitespace\" \ + 0f036fb7-2f6f-4758-8aca-d454055eec0c)(content(Whitespace\" \ \"))))(Tile((id \ - 4347e7fa-dbb9-4ae4-9a39-2b6645e72ab4)(label(\"(\"\")\"))(mold((out \ + 1917ca65-db0c-433c-a8a0-0f5051b124be)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 67e30d22-06c5-4f0e-b4d4-73d6940f21ed)(label(1))(mold((out \ + caf1b5fe-02ce-4776-93b5-83ee336cb24e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1cbf654d-a2e5-43f3-9d92-d997b3f32e7d)(label(,))(mold((out \ + 8ec33430-e0e9-499b-aa7f-37d478bb31b9)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d95ea558-5838-47ed-8f86-0449e50032a1)(content(Whitespace\" \ + a6561beb-8516-40ed-b30c-d79e85b5a1cf)(content(Whitespace\" \ \"))))(Tile((id \ - 314e666e-f0c7-4136-8ee4-a27863b197ca)(label(Sum))(mold((out \ + f26865be-cfc2-4eea-9a3d-ccb233775511)(label(Sum))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 0109e3c7-c5ca-4142-bfa0-0b2fcc225ef8)(content(Whitespace\" \ + 52415178-0882-473e-81b0-85dfeb97fbb8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ae7ea7eb-43e2-48ec-910c-5dcc8a7a54ad)(content(Whitespace\" \ + 4fc6a41a-cbab-4ee8-831d-f483c05d51fb)(content(Whitespace\" \ \"))))(Secondary((id \ - c6c9c717-c333-4f63-8199-d1f56e8a4202)(content(Comment\"#err: \ + 75d63fc9-22a0-4b25-b03d-c8c60d01cdef)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - 189df76f-8380-4723-8ee5-e0022c1f9791)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3c9e3372-e111-4cd0-aa30-63e1c14c68c3)(label(let = \ + 5902d467-dad9-4d76-9289-cff3d2d908a8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 13e603bf-456c-4a68-a4f8-081ab1f27467)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ce687dde-da25-42c2-9514-f796bc01711c)(content(Whitespace\" \ + 9e33f211-e11b-4123-a996-98e3b239b091)(content(Whitespace\" \ \"))))(Tile((id \ - a0cd2872-0616-44ad-bf1f-589eca58a542)(label(_))(mold((out \ + c419a6c2-109d-473e-b10f-4f86044ab502)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e5d9baf6-d033-472c-8f95-e13379cc67a0)(label(:))(mold((out \ + cdd7be54-b091-494b-90f2-4f33a24f36c3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9ec88df4-5c76-4be6-82b2-ec41313290fa)(content(Whitespace\" \ + 8fe7c565-b854-4710-adf5-93e4e8435308)(content(Whitespace\" \ \"))))(Tile((id \ - 2f81d35e-6d30-4bb6-9c85-eca4c40534b6)(label(CompoundAlias))(mold((out \ + 8f2faaad-3556-4dd4-a893-34427cf0f0e2)(label(CompoundAlias))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7ee66fed-2563-42b8-a6cb-dcbed6c52f83)(content(Whitespace\" \ + 1a941975-2d17-4e9d-b59e-03a046859a51)(content(Whitespace\" \ \")))))((Secondary((id \ - 8c659dcd-5658-4640-a5e9-2fe4782170d1)(content(Whitespace\" \ + 27b694ae-7a7c-4b1d-9ba6-9d1765ad3d35)(content(Whitespace\" \ \"))))(Tile((id \ - f1bcc86a-a392-4941-8c9d-320f7e01e822)(label(\"(\"\")\"))(mold((out \ + d86c44c8-d177-4816-ad64-e2a102636bf5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2e913e3c-664e-4bab-822e-d7d040d74dbf)(label(1))(mold((out \ + 5df66e2e-0f4d-4712-b312-8a8f4270717e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 706fb612-3ed1-42ce-8996-e356942c7e76)(label(,))(mold((out \ + 1463a015-88ce-4310-8732-2674b62f0269)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0b296129-a5df-4847-be1e-04c02fac5abc)(content(Whitespace\" \ + 976861eb-837f-4057-90cc-423961503364)(content(Whitespace\" \ \"))))(Tile((id \ - 95e7a4a7-bf57-4dac-bb63-7986929c12e8)(label(Sum))(mold((out \ + 660a30f5-d516-464c-9f00-27468adc7df4)(label(Sum))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 952d0ff7-4b82-4982-9e13-51bb7a59b980)(content(Whitespace\" \ + 6991618c-9ca3-4a66-9320-8cbb1033e337)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 30365859-c813-4c56-9424-d12b5b394608)(content(Whitespace\" \ + 7af72e22-e007-4afa-84f7-1129f90e471b)(content(Whitespace\" \ \"))))(Secondary((id \ - 36a46e75-d205-40be-a9f6-cacedaa64cc8)(content(Comment\"#no \ + b0520746-880f-4eb9-8d0b-62b8ce50c5fc)(content(Comment\"#no \ error#\"))))(Secondary((id \ - 9bc0a005-9b92-4090-94a6-df3cd4cbf181)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7a858d7f-897a-4fe2-bc82-4670e6305b1f)(label(type = \ + eca69d84-ccaf-4136-b2b7-aee3aff06565)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9c7e2a19-1253-4730-b97f-41371b0b2633)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8f021de1-9cdc-4c15-9532-058ba604ea9b)(content(Whitespace\" \ + d9b31d92-3b25-43f3-8a46-1e8fb77a9ef1)(content(Whitespace\" \ \"))))(Tile((id \ - 0efc7b1a-9960-4b18-aa25-75defcdb8138)(label(Yorp))(mold((out \ + 8215a985-87cd-4eeb-b453-019c74ddebc6)(label(Yorp))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 31d2b55f-57cb-4ab2-9182-271e87236af4)(content(Whitespace\" \ + 2827e281-ad0b-4392-a3d3-3697aedc866b)(content(Whitespace\" \ \")))))((Secondary((id \ - 97dbe6a3-ad64-468d-a97e-9ceb519b0d8f)(content(Whitespace\" \ + b03f72ee-9893-4b0f-919b-167c8ff201c7)(content(Whitespace\" \ \"))))(Tile((id \ - 36284329-5087-46b2-a15e-12a52b4cec90)(label(Int))(mold((out \ + 97e12b1d-da88-4adb-af7f-02f2cb0a955b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0de46358-0bfd-459c-a28e-526de56fcadf)(content(Whitespace\" \ + d704f7a1-04b8-4bc9-a9e9-b2ef79f39b3c)(content(Whitespace\" \ \"))))(Tile((id \ - 173eb4f7-d828-40cc-b2b6-1a7bdca2301e)(label(->))(mold((out \ + c05204ce-ae3e-43d2-b444-335cc6009080)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6af92d08-2e0c-4768-b3ba-3500a41655fc)(content(Whitespace\" \ + 9fd48464-2d3b-4c89-a74e-842fec231177)(content(Whitespace\" \ \"))))(Tile((id \ - 5b8b8ab9-eb4f-4ea2-911a-fc425796fbed)(label(\"(\"\")\"))(mold((out \ + 968a2ab4-cddb-443e-85d5-f239af736833)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 9a3c9fbb-8943-44f0-9382-5c697351f723)(label(Inside))(mold((out \ + d32c9b60-af33-4ad7-b306-bc5e609399bc)(label(Inside))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 439ee441-17d4-49c6-b33f-3610ae8cfe7a)(content(Whitespace\" \ + 9223590b-d737-4178-97d5-ecd925664de0)(content(Whitespace\" \ \"))))(Tile((id \ - 535dcfa5-0ba6-4ab8-a9b8-e5e923cef893)(label(+))(mold((out \ + 81131e9c-b78a-44f4-94af-d1f420b664d7)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 83710256-ec5f-455d-ba99-b02a86b49362)(content(Whitespace\" \ + 5d6e9cb5-37df-492f-a934-aa0d860d6c4b)(content(Whitespace\" \ \"))))(Tile((id \ - 641e2a99-c82b-4826-95c2-8e7a4a0a149d)(label(Ouside))(mold((out \ + 4d419704-0928-43ed-9a67-75baf0450c7b)(label(Ouside))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0b173734-9ef6-410f-9a12-004d77c532ae)(content(Whitespace\" \ + 683ec632-064c-4ce2-bb3b-db1f40743bc9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e70438f1-0691-4df6-956c-a529d934c330)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e83c5c81-b423-418d-9bd4-97ccb1879b87)(label(let = \ + b764ddf1-4e23-4e43-9262-25a977d70164)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c5ef6303-8e2d-4e18-9460-d9fce711a99a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6954a797-3c98-4dd2-b4a9-12ee61e237fd)(content(Whitespace\" \ + b7ecad3c-1945-40a4-bff8-104c3980e9d6)(content(Whitespace\" \ \"))))(Tile((id \ - 05146188-2968-43fb-9cf1-bcfb3a7d674e)(label(_))(mold((out \ + edf1b2b6-a5cd-4598-b1bc-62abfc8f8471)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8d94dc74-c4d7-4bb2-836a-5e64851c3087)(content(Whitespace\" \ + b55e4ea6-81c8-46d3-b9ed-fb88e8b44dc3)(content(Whitespace\" \ \")))))((Secondary((id \ - b50b0346-d9d0-4607-ad97-22fca24b825b)(content(Whitespace\" \ + 06c6d274-c0e0-4a72-9157-64143d5d0f5c)(content(Whitespace\" \ \"))))(Tile((id \ - 9b92f3dd-c819-480c-b3ad-cd268ff2fd7d)(label(fun \ + 64e7b454-4aa9-4c96-8426-bf8cbd295349)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fe797497-b536-4b25-8437-8a7cd2e55ff8)(content(Whitespace\" \ + cd07032c-3d70-452f-bef9-5fdec314dbf3)(content(Whitespace\" \ \"))))(Tile((id \ - a825960c-acc9-40e9-a4bd-fd5f09d4970f)(label(_))(mold((out \ + 0d0bd496-2b14-41d6-abcb-892da1b50942)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f823a7a6-4d75-4559-b2fc-d55197989bcb)(content(Whitespace\" \ + bf3bdc70-f358-433f-a0a3-b73129be9db0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dd672122-e01f-4f5e-b497-9816d563cec2)(content(Whitespace\" \ + 069d87f2-30b4-4343-aa89-452af86019d1)(content(Whitespace\" \ \"))))(Tile((id \ - 8a6c5c41-fa31-4e73-b367-9b0b45266716)(label(Inside))(mold((out \ + a8f6e316-23fe-43d6-ae87-da77a0e18daa)(label(Inside))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9d34fa3-4ae2-421b-bb05-eae8415b738f)(content(Whitespace\" \ + 2742564e-af1e-4eac-8903-ed5bf573e87c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9cd1f306-fe75-4483-85f9-8991a3e61c19)(content(Whitespace\" \ + 15277889-0200-4dde-91c5-71ec68eadc99)(content(Whitespace\" \ \"))))(Secondary((id \ - 0b009971-7be6-4f5a-a976-b05f729296ef)(content(Comment\"#err: \ + 2f15e27b-2392-4415-ad40-7e8379abf40b)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - d921e65a-b36b-40b5-a9fe-cadf0a6eaaac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cb07440d-14f9-4c5b-999a-9de966dd0412)(label(let = \ + 4df8184e-4312-4e2c-acb8-c5ee10245bad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c9f910cb-2fd2-47d6-8168-5fc7fbc22eed)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 01de7a81-45c3-4933-8f75-55c013fc08cf)(content(Whitespace\" \ + c58180a2-e049-43d9-9bad-f92c834a3985)(content(Whitespace\" \ \"))))(Tile((id \ - 9cea3814-76a7-4cbb-827d-971d4877c9cd)(label(_))(mold((out \ + 4062b7bf-5df9-4c00-9402-610143ee006c)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 70adbd13-f652-44e3-bbb7-df4acd5c9051)(label(:))(mold((out \ + 3d8c91f2-1199-4f2b-8be0-4df8f0c5e7a8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 44d9778a-a5ed-483d-b320-180a734179d7)(content(Whitespace\" \ + 08df780b-4967-4ae6-b8f7-835b9a1123e3)(content(Whitespace\" \ \"))))(Tile((id \ - 4d448086-e1ac-44a1-a9c6-55b87c5440d5)(label(Yorp))(mold((out \ + 360ff087-6ce5-44ed-8278-6eb5c71de0e6)(label(Yorp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - db1f92e5-9d4e-40a3-bde2-ad6e2ed431f8)(content(Whitespace\" \ + 25804b46-4434-43af-9d40-9586e09e1ce5)(content(Whitespace\" \ \")))))((Secondary((id \ - 9ea40d04-ab90-458f-b115-a28e9c148a41)(content(Whitespace\" \ + 8dec9189-efa4-4ce3-9077-9d6106c3c6bc)(content(Whitespace\" \ \"))))(Tile((id \ - 0e8afa74-4226-4955-a78c-9c95d5bb8a06)(label(fun \ + 84422b9e-b9e7-43db-ada4-8a2177cc8901)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5bcc3376-e134-42bd-9534-dcf84a76a769)(content(Whitespace\" \ + e18535e2-f9f1-483c-9517-83078bc5ee2e)(content(Whitespace\" \ \"))))(Tile((id \ - 08282231-07dd-42dc-b32a-888f32dc2e7b)(label(_))(mold((out \ + ef219832-75e1-441b-8242-dfd0ccfaa943)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ab96b531-4122-4fa4-aa17-d30da9e8c8bd)(content(Whitespace\" \ + 3198f7fd-fcee-4d60-8d8d-c4ae93b689e1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fb85f35a-3094-4796-938b-ce367925d7b0)(content(Whitespace\" \ + 9676f68c-e9ee-435c-8426-55fb03b74826)(content(Whitespace\" \ \"))))(Tile((id \ - 0111dde3-9015-4f28-a685-efba2430c585)(label(Inside))(mold((out \ + 11c55eaf-752e-434c-8205-aa0979c70a1e)(label(Inside))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d43dc0b4-abcc-4231-8605-be7d310849b1)(content(Whitespace\" \ + 3be6bd7b-123b-401e-b91a-cb0b02b0eb7c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 65fa306c-dd07-462a-9e9f-9f2fa64e1424)(content(Whitespace\" \ + 4272fc24-30cb-494b-a5e9-60979153011d)(content(Whitespace\" \ \"))))(Secondary((id \ - 77be74bf-70fc-4d95-a296-701da26a9a50)(content(Comment\"#no \ + 3bdb9f62-9fbe-40e1-a936-0b0684424ab8)(content(Comment\"#no \ error#\"))))(Secondary((id \ - 65da2cb7-2faa-405a-a60a-0de4dcdd3532)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7ea29e58-e41d-4d6a-9f0f-2a771b685b74)(label(type = \ + c1d66da1-2de4-45f8-b572-9526f49a365b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f3eb8a20-1606-466e-80ee-1f088bb340e1)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a8c94dd6-f6d6-41c3-a38e-851124d4f255)(content(Whitespace\" \ + 9c360795-0f31-496e-a2ab-a77bc0920ed1)(content(Whitespace\" \ \"))))(Tile((id \ - 784162d7-63f2-4f85-8469-2b1e2320c817)(label(Gargs))(mold((out \ + 2f503192-c953-40cc-b196-1d1214f905ef)(label(Gargs))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 175b4850-e7d8-4325-9089-4b163d3888de)(content(Whitespace\" \ + 359fc616-3a4b-4fed-a987-4d7807047de7)(content(Whitespace\" \ \")))))((Secondary((id \ - ee04d44b-1904-408e-b925-cf3c143fe29b)(content(Whitespace\" \ - \"))))(Tile((id a6cf2e3f-6941-4a4c-97f4-cd2c8a96da30)(label([ \ + 3d54b95d-6b3b-4b1a-8a3f-331e9388cc0a)(content(Whitespace\" \ + \"))))(Tile((id 53ae9864-aca9-4018-a3cb-76662425bb1a)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 36aa4130-03a2-47af-9349-522b96d8f199)(label(BigGuy))(mold((out \ + ba0cf0d4-6a4f-4826-a6a0-457bf5fd4209)(label(BigGuy))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - dcb8aa31-3ac4-4b96-b2ba-cf6468ede6f4)(content(Whitespace\" \ + 7ce7f928-26b8-4c47-b868-b942afe727bd)(content(Whitespace\" \ \"))))(Tile((id \ - b789f3e4-ecdb-469c-b262-2a76db3f6894)(label(+))(mold((out \ + c4805da2-317a-420e-b323-9bd9eb774057)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 88dc28e4-609c-465e-a73e-7a063c69eb05)(content(Whitespace\" \ + 0b36e8bc-f4fa-45b1-b3f6-11bb5fef5c0d)(content(Whitespace\" \ \"))))(Tile((id \ - 259909ce-534b-40f0-9d0f-fbc30bee9c6c)(label(Small))(mold((out \ + a3d1a1dd-4eb6-4815-b7ca-baad6d12848f)(label(Small))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 79071c31-8c41-4a02-9dce-ae47656d956e)(content(Whitespace\" \ + 72286b6c-144d-466a-9b7b-dcac3b30df97)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3a0428c8-4272-4911-b85f-9336534077e1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e48d07d2-030e-482d-b6f7-72e17d0a4a37)(label(let = \ + 6f508128-be53-47d7-9740-eef28d7f19d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6bce35d6-75ee-4d08-b9c3-e2a5327f2485)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0e90b094-89c0-4b46-ba9b-5e1070260e9b)(content(Whitespace\" \ + cad7c8a9-49c1-4f5a-9251-58a59b2c7705)(content(Whitespace\" \ \"))))(Tile((id \ - 1fc7fe68-63a5-4967-8af8-896adf4735af)(label(_))(mold((out \ + da19fbb2-f967-4b5a-8161-914738d791d7)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7f3440d2-51fe-4ef7-a976-ee959114985b)(content(Whitespace\" \ + 12f4c6f4-5e75-4676-8fc1-a4190972d660)(content(Whitespace\" \ \")))))((Secondary((id \ - e44f712e-f0be-4fdb-9b7a-924fde75f780)(content(Whitespace\" \ + 153ec2cc-a592-4bd9-8bca-f5ca2f0c32f5)(content(Whitespace\" \ \"))))(Tile((id \ - e7688dd3-5226-43f8-991e-e68f4e07dfe0)(label(BigGuy))(mold((out \ + ab7ae389-6044-4351-97c6-2bee09c2166e)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2185b51f-d263-41b2-83b9-b2492445aeb8)(content(Whitespace\" \ + b1ee7f84-e4bc-4268-800c-c049640e7bda)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 79ebdd9b-b381-4be9-aede-3f693b1a45d7)(content(Whitespace\" \ + 66a51d54-e827-4852-94db-1370f29bb85e)(content(Whitespace\" \ \"))))(Secondary((id \ - 6572a7bd-4a4c-4a8b-afbb-19bacb9624ab)(content(Comment\"#err: \ + 980a8c78-aa73-4018-9bfc-0e207bdba09a)(content(Comment\"#err: \ not defined#\"))))(Secondary((id \ - 69a37450-5ea6-4963-8cc8-4b816cbde54f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 976cabc2-b5d6-47cb-8c34-2e59bc3a266a)(label(let = \ + c7a0c81b-b344-47ba-9245-773a86757cf9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 53dfb2bd-bad6-412c-b6ab-78879e4403ca)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2dafa352-6f12-4e95-92f6-2595d201b540)(content(Whitespace\" \ + d81c625d-ebb9-426b-86f7-13e8bc98c6a2)(content(Whitespace\" \ \"))))(Tile((id \ - 016212af-d424-45d0-ac79-01c2153f4095)(label(_))(mold((out \ + 85617da9-8478-469b-a8e7-cda34854c231)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 315dd016-1d29-4ab7-9f3b-61abe8bd1fe1)(label(:))(mold((out \ + 7297dfc4-5962-4253-bcb6-d309acfcfb7f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7685d7cc-ad63-446f-9657-3a5cdf2e6ecf)(content(Whitespace\" \ + a7c09e56-d6ef-4c42-9ca2-2eb8ca5deda2)(content(Whitespace\" \ \"))))(Tile((id \ - df26fd12-8151-46f2-9564-577058e2f0fa)(label(Gargs))(mold((out \ + fccc6f0c-3f02-41c3-81b7-ad93aea8dbed)(label(Gargs))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c885efba-c282-4c1c-8274-041c72432a92)(content(Whitespace\" \ + 49451f76-6cd9-48d5-a581-278713aaebea)(content(Whitespace\" \ \")))))((Secondary((id \ - add94470-6bc8-4d5b-a37e-7940753c50b2)(content(Whitespace\" \ - \"))))(Tile((id a3c57640-3278-457e-8fb5-3a72fa66a0d7)(label([ \ + 0ed843cf-0d95-459c-8fb7-e58e27a324e5)(content(Whitespace\" \ + \"))))(Tile((id db1c004c-7614-4977-9da5-7085a98e4b62)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 0b6294e6-2bf0-4991-ae7f-0af20554273a)(label(BigGuy))(mold((out \ + cc1be8b8-7922-4929-af7f-ff1e4da6688f)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - eb7b2d81-ba05-4ab3-9a89-a28aafee5224)(content(Whitespace\" \ + 32e124dc-cbc0-4262-a5fe-0c1b168fbb97)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 820922ab-491a-4b7d-ae95-7e703d2d184c)(content(Whitespace\" \ + 7e8879d7-3d03-414d-a3a8-0de23660d184)(content(Whitespace\" \ \"))))(Secondary((id \ - 9825e2ba-4223-4a19-a11f-bd077860d960)(content(Comment\"#no \ + a5f8a52f-0f56-4bd4-bec6-b4e7591c342d)(content(Comment\"#no \ error#\"))))(Secondary((id \ - 8e822759-cd6e-4d1b-b320-1f0fa82bbc5e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 07950888-1ae0-4a58-ae03-e53b76ecbe66)(label(let = \ + a86b7b7d-6fbc-4fab-98f9-e189251fcde1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bcb8b7b5-d04d-4468-b57b-8a8fe8346bbb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2fe07886-2a9f-47b4-b2a4-0cad5c9f09f1)(content(Whitespace\" \ + 892fe1b4-bc15-44ab-a8ac-d9b3e0fc3cfb)(content(Whitespace\" \ \"))))(Tile((id \ - 0856f7fc-9098-413d-a09b-378bb44cc4bc)(label(_))(mold((out \ + 9760067d-18d9-4e53-a3a7-83063c46471c)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1d0cee5d-c88e-4305-ba1d-aac90160ab12)(label(:))(mold((out \ + e0d9c8f9-26e9-4468-9c53-ef358b7375a9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 139bae96-9e8f-47a7-9eba-b07233f0b861)(content(Whitespace\" \ + 76a580f6-97bf-4f8f-b092-6dc14c007099)(content(Whitespace\" \ \"))))(Tile((id \ - 08d31be5-4580-4e27-87e8-1f989015b2d7)(label(Gargs))(mold((out \ + 74dcfd27-8e04-4048-9af6-8f7faa3c6205)(label(Gargs))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3a100426-dfaf-4f58-a9ee-d8b8562efdb2)(content(Whitespace\" \ + 744ac54b-7d7a-4a77-9671-afa4377e0da7)(content(Whitespace\" \ \")))))((Secondary((id \ - dff2591f-a430-4a10-bc31-bc64231f8d80)(content(Whitespace\" \ + 7a45b4c7-1be5-4b93-a83c-063816ecc75a)(content(Whitespace\" \ \"))))(Tile((id \ - 50a16d96-4611-45e8-b115-a57a41380ea6)(label(BigGuy))(mold((out \ + 2210880b-3ca7-4fb7-8ba4-cdf2370fd5e7)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 27932146-7dd3-46f2-91c4-681dc23bb3d3)(content(Whitespace\" \ + 87f1fdb2-694c-429f-8182-2f4d8afa5fa7)(content(Whitespace\" \ \"))))(Tile((id \ - 0f2b9d2b-69f4-467b-abde-197e718324ee)(label(::))(mold((out \ + a5af65b7-739b-4450-a82a-8abfae4ef5e4)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b90c6d5e-8372-4296-bdab-6c604bd64477)(content(Whitespace\" \ - \"))))(Tile((id dd1bcd24-c7c6-4da4-8ef0-aadb68d1c14d)(label([ \ + 5b7e41a8-9c5b-4057-9e85-2d91e682f321)(content(Whitespace\" \ + \"))))(Tile((id 1b855c82-2dca-48f8-80ec-f170ee04cc98)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 323c9734-00ce-4b0b-aaf5-0bd788e68bf0)(label(BigGuy))(mold((out \ + d390eba9-9726-4f6b-9f8d-ae0134346520)(label(BigGuy))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - c62dbc37-b24c-4baa-bf1e-43d7dcf625ca)(content(Whitespace\" \ + 5fbb51d9-4772-4a81-beba-43f39d796d34)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5061740b-b79f-4aeb-a03f-efaf50e757c4)(content(Whitespace\" \ + 6f3fe04b-7b9c-4748-b084-da7657bb7cb0)(content(Whitespace\" \ \"))))(Secondary((id \ - d0e3c1f0-c0cd-4169-a73b-a099a53d2852)(content(Comment\"#no \ + 98fed9d3-9bbc-491c-ad55-49794b84bfdb)(content(Comment\"#no \ error#\"))))(Secondary((id \ - bac315c4-f2ae-48ae-bb04-ec67cb3de0e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 33ab653b-5849-4bf8-aa58-b288ff8174c3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dddee9b8-d1c2-423f-867b-a734af7224a2)(content(Comment\"#unbound \ + 071ab1ab-da5f-4d4f-94d0-a0b69ab6ec3d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b16d13cb-4267-4304-8b52-755c370859d2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a95e82b-b85b-4723-8b24-bfc5f5e2994b)(content(Comment\"#unbound \ tyvars treated as unknown-typehole#\"))))(Secondary((id \ - 4fd36965-8d6a-43cc-81c1-7c17733edd22)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fadf4153-4afe-4e72-9059-700a6fea3664)(label(let = \ + d2cf3c36-b459-43d8-aa91-ae0221ff256c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b9e7ec75-0c3b-466b-bb1c-b6b6215f7727)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 596c93f3-10d4-444e-b72c-2bae3b06476f)(content(Whitespace\" \ + b5419758-62d3-4051-8954-1173793960cd)(content(Whitespace\" \ \"))))(Tile((id \ - aab31b3c-6876-4b75-9f9b-88312601e537)(label(a))(mold((out \ + 856b4cb1-a394-4709-a2d0-036af0f19670)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - da84d488-fe11-47eb-b13a-647c6731a15a)(label(:))(mold((out \ + 4f2ce133-7e82-4eaf-9e1f-031b5fe7fbf0)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - a04db2e9-b0b5-40f6-9d0e-dacf2deb3c46)(label(Bad))(mold((out \ + 2153f84b-2abb-4b57-a8be-5d1fc665615e)(label(Bad))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3ba1dc68-0c14-4ab7-af7b-8d39bd28b355)(content(Whitespace\" \ + a17fefb5-1e4d-41fe-929e-fbce980b67d6)(content(Whitespace\" \ \")))))((Secondary((id \ - 634b036c-d91d-48e4-a1ee-deaf108519d9)(content(Whitespace\" \ + f23000bf-b847-42cf-b29d-69a356970fae)(content(Whitespace\" \ \"))))(Tile((id \ - 230cecce-3b89-4f31-a1fe-0b7cd6b0fa22)(label(0))(mold((out \ + de8d5585-a42b-460a-9796-915ca91c4356)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 16486275-25a7-47c5-8264-e3df1569dc4a)(content(Whitespace\" \ + d8858983-ce84-463c-a302-c45b539cbf7c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fae8f93f-455f-4de1-b043-5c3fe5b10fc2)(content(Whitespace\" \ + 7bd09626-9b70-4fdf-a296-ebb4af0dd9e0)(content(Whitespace\" \ \"))))(Tile((id \ - 09fe7c74-613d-4d1d-bd3d-57ab38816f92)(label(a))(mold((out \ + 02df711b-d66d-4835-8335-fdd3f524712e)(label(a))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e95cde87-6345-491b-b29a-401efaffafc8)(content(Whitespace\" \ + 8ec22496-f1bf-466e-8993-45fed884410a)(content(Whitespace\" \ \"))))(Tile((id \ - dc126979-0ced-49c4-b296-5c635913d6d4)(label(==))(mold((out \ + 6fc53113-fb3a-42c7-819a-be8d9649012b)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5173e9f1-50dc-4a68-b52e-b9e0f99856ac)(content(Whitespace\" \ + 26ab1f83-fce3-46cd-8c21-44013553f7ac)(content(Whitespace\" \ \"))))(Tile((id \ - 41c4256a-822b-44bc-87bc-d15b00d595d6)(label(0))(mold((out \ + fe6adff9-71b5-4800-ae43-9ae4f588a231)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 20496593-240c-4de8-8d38-e572fd722783)(label(\";\"))(mold((out \ + b7d331ee-30f0-4a40-a640-ddd610dc52aa)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 811c65ce-11d8-473b-b49c-7b7104380039)(content(Whitespace\" \ + 86c66d93-4bd9-472e-829a-c115e17106c2)(content(Whitespace\" \ \"))))(Secondary((id \ - c22ebe06-a43c-4030-827a-833e462e79c3)(content(Comment\"#err: \ + c1a9a07f-fc20-4e71-b95b-c5b424a23210)(content(Comment\"#err: \ not bound#\"))))(Secondary((id \ - b0c3a277-c4a3-4812-a140-6e873acf93f2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 54533a63-7ad0-4eb5-b010-9940a2303997)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cf48446a-6d87-42cf-a4cd-5d29de82f757)(content(Comment\"#non-sum-types \ + 8f4f0f64-2f3b-42b4-b20c-d0a9ebbb56cb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a8fae9ba-bd75-44d0-be17-06bba380ccc5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 668a740b-bdd1-4180-9d7b-25471ec9226e)(content(Comment\"#non-sum-types \ cant be recursive#\"))))(Secondary((id \ - 64761da1-646d-43e6-a630-f2b263d0fd1d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 79357723-f5dd-4391-ac2a-c45772ea6cc4)(label(type = \ + 52a8a716-06fb-44dd-b635-3472a9792d61)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3f4bef85-fc5f-49e0-b818-cba9f0778272)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 23c2f5d2-38b5-417e-ba77-6dedd7ca37e0)(content(Whitespace\" \ + ce58cc68-cd82-4524-9d4c-4d1d5047e395)(content(Whitespace\" \ \"))))(Tile((id \ - 61a0fce4-0836-4f18-9f8d-a23734bbe408)(label(Lol))(mold((out \ + 5d934397-aaec-4a28-8c44-eacd648fda6d)(label(Lol))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 027e2f10-aa7d-4b3c-bf52-b75f039c172e)(content(Whitespace\" \ + 4849bc0a-a3ce-450d-b289-ee60cbe65069)(content(Whitespace\" \ \")))))((Secondary((id \ - b0ef397c-5681-4106-89ea-00012ccfaf26)(content(Whitespace\" \ + 573ad4ad-4e13-4420-a6f1-a66f43279941)(content(Whitespace\" \ \"))))(Tile((id \ - b64eb82f-b885-429a-b170-cf68abc94889)(label(Lol))(mold((out \ + addad050-0502-4c05-b6f1-5fce268bb700)(label(Lol))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 39be849b-d5ac-4656-8259-0f19e1a390f6)(content(Whitespace\" \ + 0553f523-a997-4901-bb0b-87a05b432b03)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 10302ae2-d6c3-49c0-a97a-0c333a55c08d)(content(Whitespace\" \ + 9a819086-2078-40ee-9a1a-21606d02b8a1)(content(Whitespace\" \ \"))))(Secondary((id \ - 62ee35f7-a3ae-4523-8c6d-7112a79b50b4)(content(Comment\"#err: \ + 4e27451a-40ef-4ba0-a12a-44643e57fa65)(content(Comment\"#err: \ not bound#\"))))(Secondary((id \ - 85e3bbd4-d6e0-4277-a0e9-d39f2a5cb30a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ae476def-0fd5-44b4-b666-d3add644450c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8413d846-66c3-42d1-9a3f-54d49c7e22c5)(content(Comment\"#no \ + 676e00de-3544-4f33-95aa-e7e322b86be9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 43cd4830-f9d7-48a8-8a40-85f79433fd39)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 731b69d8-dd1a-4ff7-9163-7ce9e016d7a6)(content(Comment\"#no \ errors: analytic shadowing#\"))))(Secondary((id \ - cac017e1-e73b-49bf-8569-e71b6e0d9879)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 14bb8104-238d-416d-9880-237ebad3fc72)(label(type = \ + fb9de40b-6639-4a0c-be97-ca55eee77bc0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 39502d12-2289-4cb5-aa7a-85f2e1d9b629)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5eb44d32-f9cd-4529-8a9e-b68c59f3ba20)(content(Whitespace\" \ + 42b4daad-1a04-410c-a934-c396cc336feb)(content(Whitespace\" \ \"))))(Tile((id \ - 7c1e0603-06ba-4be8-b7e0-646139014e21)(label(Tork1))(mold((out \ + 1a31b4d3-44dd-4bbd-bd16-8f516ad4c165)(label(Tork1))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 87bf3976-3053-497d-a433-d168125abc5d)(content(Whitespace\" \ + a77ad622-e03d-4625-8513-3ce6c86c213d)(content(Whitespace\" \ \")))))((Secondary((id \ - c4b85778-b4d9-4847-80ba-7f633be567aa)(content(Whitespace\" \ + bc4a9379-e76b-4f6a-ae51-6c03368cd39d)(content(Whitespace\" \ \"))))(Tile((id \ - 861cc199-b66c-4a2d-8471-f3c69ed093cd)(label(+))(mold((out \ + fab7bf8e-aa55-4fd3-9bb9-73e89e845a54)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - f8c69811-f5da-47b0-998d-6c867f0ce84e)(label(Blob))(mold((out \ + 267c0915-83c3-489b-b8c9-34f72da1a4b7)(label(Blob))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e9aaf397-d10f-4ce9-8f80-ff421f209e9f)(content(Whitespace\" \ + 1578116b-1db5-45e7-b9ec-22154096c988)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 311c9489-1709-448e-8238-9e99b47d6521)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2fd07eae-7124-4d07-b278-33f356d9c384)(label(type = \ + 8f69102f-a33c-4164-8e74-fd20ed811617)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5494416a-7f58-4f45-9c5e-6b3bcd96984c)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - adcaad39-b81c-4d6d-a372-67c12540310f)(content(Whitespace\" \ + 14171c46-0000-4f49-a18d-5e0685e098b3)(content(Whitespace\" \ \"))))(Tile((id \ - 21ce4c2b-8860-4591-8870-2889e02ddf23)(label(Tork2))(mold((out \ + b12148ff-2252-4d1f-a498-18ff70f482a2)(label(Tork2))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 2fcacfd0-b98b-4168-9490-5709a20840aa)(content(Whitespace\" \ + 30f486e0-9a72-467e-b01a-c88c92b6c5e2)(content(Whitespace\" \ \")))))((Secondary((id \ - 7a5e4428-1ee0-40c7-9053-091351ac9797)(content(Whitespace\" \ + eaf29043-93b7-4b43-a6d4-9d84dced4e6f)(content(Whitespace\" \ \"))))(Tile((id \ - 8d00c7ba-9925-4314-9ee2-25c3d145348a)(label(+))(mold((out \ + 4bdb6b0b-11f0-4f48-97c0-00f3b611a4f3)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 71562cd9-7273-46c9-803a-f2c5820dcd67)(label(Blob))(mold((out \ + bc845647-1464-4956-950a-fcefa5cfa454)(label(Blob))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d5b9b831-c34b-4ed2-a34a-40ffc4ddb3e9)(content(Whitespace\" \ + 4bd9bccc-858d-4fc8-a1e1-45dd6c674c2a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c7b1434c-3c5a-4b94-8f42-a7a0b64a81fa)(content(Whitespace\" \ + 5941d2b6-3311-485b-a367-186680ce45a2)(content(Whitespace\" \ \"))))(Secondary((id \ - 37716e1d-8849-44ef-9b30-2fe2c31abd06)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 38abd967-c609-4ea7-ad9b-98bf746ab7db)(label(let = \ + 30b9b699-1c26-46ee-9d6a-cdb083508986)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 63873fc6-b24c-474c-8451-f0319ea31c48)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 120f6417-5120-4498-abd9-4dd6335462e4)(content(Whitespace\" \ + 8a5a4915-58e6-4f9e-af2a-dd5a6ec31e74)(content(Whitespace\" \ \"))))(Tile((id \ - 11eb7810-85f8-4eb9-88e2-e78c34717ba4)(label(x))(mold((out \ + 44aef16a-7cc6-4170-bb27-1bdd1b46699f)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c7c9683f-84dd-4fa2-85ea-a93cc18d6872)(label(:))(mold((out \ + 84f3b1af-624b-43c9-909e-2ff6c15f324a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - e03ac765-578e-4342-bfad-f20c1d5a86e0)(label(Tork1))(mold((out \ + 563d7c82-ad90-4b47-afed-b9cbdf4f12a1)(label(Tork1))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a6324a47-4636-4006-96a8-9d45acc91cd7)(content(Whitespace\" \ + a6011ca4-93c4-419b-a67d-75e9c863fd9b)(content(Whitespace\" \ \")))))((Secondary((id \ - e32d3aeb-8919-4505-9efa-00ee4ea66b09)(content(Whitespace\" \ + 10f0588d-7294-40e8-9840-f9826db9e133)(content(Whitespace\" \ \"))))(Tile((id \ - 8af921e9-695f-4528-bcc5-13b452c3e9b2)(label(Blob))(mold((out \ + d0ff59ed-ac6c-4d3b-bbfd-8ace04c855fd)(label(Blob))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a46dcefa-ec57-4068-82ee-a90dd68bd423)(content(Whitespace\" \ + ebd81c08-01af-4e2a-be8f-6610e2df9b5a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 75906e32-dc58-445a-9f9f-7a9edd4eda5a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 80299e98-fdee-4552-8f48-3f210266467b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 837e8595-0afd-4e61-b424-14941efd9d6a)(content(Comment\"#exp \ + e8fea8d3-bde2-4255-9da9-6b90e611d582)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5b5026f2-8cb9-49ad-9e5d-ea4d14c0c035)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 00e9c695-8e0c-4ff9-acb4-d7c5024c3479)(content(Comment\"#exp \ tests: happy#\"))))(Secondary((id \ - 4b68c71d-22a1-4311-acb4-1bcdbbac2593)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6831865e-d18d-4c87-bffd-63dd4fbe2c2c)(label(type = \ + 9f913f02-d26b-41a2-9a8a-0aedeeb827cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4182a900-50f0-4321-9cd9-c31e262f6cec)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5d175f0c-a3b8-46ed-95cb-99701a6c1dfc)(content(Whitespace\" \ + c469b0c2-9808-49d9-8de4-2859a73e7d98)(content(Whitespace\" \ \"))))(Tile((id \ - 3b5e84a9-9684-4fd9-9be0-3ae150b79e52)(label(YoDawg))(mold((out \ + 5b48c769-1d49-4aec-ba7a-782b729ec0c2)(label(YoDawg))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0363ac84-e1c3-405a-b7ef-c0c5f17ce0c3)(content(Whitespace\" \ + 9df2cff0-9acc-441c-95bb-62b62988d87b)(content(Whitespace\" \ \")))))((Secondary((id \ - 60c1154b-1909-4275-aace-15536e76b9fa)(content(Whitespace\" \ + 88a87e8c-1f6d-4afd-bae2-501813299849)(content(Whitespace\" \ \"))))(Secondary((id \ - 5cf25833-c236-43f9-b44d-404a0a530d5f)(content(Whitespace\" \ + d71f5c70-8e84-4fe4-8487-f0a372363384)(content(Whitespace\" \ \"))))(Tile((id \ - 81ff3831-01ac-49d8-bd9d-65176c187d2e)(label(Yo))(mold((out \ + 6ec93fab-9058-4dd5-a7f5-bfaaebc268cc)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 1619d870-a4ba-4b89-861b-462b8ea608b6)(label(\"(\"\")\"))(mold((out \ + 20e367dd-ed59-48cf-a9f2-d83f26fc98df)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 09bc9325-bb34-4c37-8bfe-913035b1c212)(label(Int))(mold((out \ + 217d5faf-873c-4015-ae58-f7a9678c0e31)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 952e2540-4400-47c7-b623-520c4b7cad13)(content(Whitespace\" \ + 24adf632-92fc-4100-8f64-4e1a408953f2)(content(Whitespace\" \ \"))))(Tile((id \ - 6746b971-47c9-45af-b45a-d00d210e4cba)(label(+))(mold((out \ + 4a4a927f-90d2-464b-a95d-5bbafbd24056)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 083caf45-7125-404b-854b-0f94fc5a89f2)(content(Whitespace\" \ + 9587ea62-dee9-4b1e-9ad1-ddea2b529084)(content(Whitespace\" \ \"))))(Tile((id \ - 03309c87-c0b5-4875-ba80-f8cd01eadcf7)(label(Bo))(mold((out \ + 4df62e34-08fa-470e-b792-e1c4cc6acbf0)(label(Bo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - cdfa6f77-ed2b-4327-acd5-d2ddae561b18)(label(\"(\"\")\"))(mold((out \ + b284f0c6-7f23-4625-a3ca-65858679d9d2)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 88ca33b7-b505-4ad9-a78e-c3525211fda8)(label(Int))(mold((out \ + 0e485ec7-96b2-435f-9331-d55870bdd079)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - e784c014-b674-45a8-baf7-84e245c73179)(label(+))(mold((out \ + a548fa6f-b407-4b99-80ce-3c47d53886bf)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e1351172-03df-458e-9796-956bb49015c6)(content(Whitespace\" \ + 0741c58d-7c84-4eac-938e-c9ec2fb17845)(content(Whitespace\" \ \"))))(Tile((id \ - f7e496fa-dafb-4477-8419-0717a83a55fd)(label(Dawg))(mold((out \ + ed51fcf7-2b2e-4822-8b12-c6bf2d325112)(label(Dawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d70849ac-407b-4114-b51b-9e3011e3bcba)(label(\"(\"\")\"))(mold((out \ + d7b0d16d-ef67-4086-8797-317f1f927b7c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d58fdf72-d917-46c5-9e0c-54f9b6e39119)(label(Bool))(mold((out \ + 518d24c7-158e-468d-8727-271691e8e966)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - e1a0b239-df48-4273-a1e1-5eef9b0cbc07)(content(Whitespace\" \ + 3a411ead-118d-4d09-8221-5b0008492ded)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 226c1629-506c-4c09-96e5-e385800ffcfd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 24b8565b-cf26-4776-97ae-8177a49db853)(label(let = \ + ba581f63-51bd-4ea8-9ffb-9b7112c94ac9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7ea2869b-d8dc-4d26-80b9-dcf8dd905ebd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 85619906-4ee5-461d-840e-ed8971dd4c3f)(content(Whitespace\" \ + 8611ee0f-e191-4ed6-b93b-0694008bc466)(content(Whitespace\" \ \"))))(Tile((id \ - 0dd0114a-5592-4ca5-86ae-885d584a7c4a)(label(_))(mold((out \ + 3deebda3-10c9-4729-9e69-94f502d90a44)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3c5809b8-ae6e-4fff-b26e-1155a005808e)(content(Whitespace\" \ + c07c68e0-cb81-46c8-a113-3cf234300050)(content(Whitespace\" \ \")))))((Secondary((id \ - 68a92422-0a6c-463b-970f-5bd2f113dfd6)(content(Whitespace\" \ + 5633aeb4-fabd-496e-a88b-481a77aed6b6)(content(Whitespace\" \ \"))))(Tile((id \ - 550e52fd-c10c-4b81-9586-476fd1b2904d)(label(Yo))(mold((out \ + 0609b923-6418-4c8c-aaca-eb1f494e84a0)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4602ee19-bba6-4240-972c-412a33834e35)(label(\"(\"\")\"))(mold((out \ + 018de1d3-a5f4-4082-a5ad-a42bea8c06f4)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a19d0368-5b47-46c2-a1bf-1ef58ff3cd88)(label(1))(mold((out \ + 23e547bd-dee0-4773-a433-3866a7267348)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b88f2a40-e44a-4f34-b5ca-6fcbb6de1d9d)(content(Whitespace\" \ + 69d8352c-9acb-4a0f-b1c7-0e3752a0cf57)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7ebb7580-025e-4f2f-a1ad-2f2f48713676)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fdd00c16-ad86-4854-801d-b096fd92e59e)(label(let = \ + e6934fe0-6183-49f2-bcb9-fb2617ca934d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 758d4f0d-2bff-40a0-bf73-1e3caeaa1fa2)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 740e68c9-3eb8-4553-88ff-d3cc45bed0ba)(content(Whitespace\" \ + a576f3a1-8c9a-4961-9e11-94b0e2883a03)(content(Whitespace\" \ \"))))(Tile((id \ - c5a82470-76d2-4d10-8556-ff610d18f893)(label(_))(mold((out \ + efa64c22-a5eb-4860-894f-6f746b51ba7a)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 000b716e-cae8-4166-9bdb-37b24fc88f29)(content(Whitespace\" \ + a8239952-bdb0-43ef-9064-9bd523f851dd)(content(Whitespace\" \ \"))))(Tile((id \ - 93a423c3-cc81-44e8-9bb6-d919ef19bc60)(label(:))(mold((out \ + 8b547667-485f-4402-99f4-9d83fe051555)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bcf0a48e-dcc0-416c-926c-604f0a7b7918)(content(Whitespace\" \ + 29fa8cba-2a39-46ab-bb61-e3cc1dc81acc)(content(Whitespace\" \ \"))))(Tile((id \ - 3ddd3a34-7db9-4127-b929-7a8ab189b022)(label(YoDawg))(mold((out \ + 3a05b5c2-008f-4806-b0bb-c5bc1b07bd04)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7d7f5c0e-5e5b-40e0-9639-d8f44bfd1415)(content(Whitespace\" \ + 36d9b47a-0198-438a-b69c-5c2a1ee4197d)(content(Whitespace\" \ \")))))((Secondary((id \ - a6f6fe24-e01f-48f0-9559-cb634d0eab1b)(content(Whitespace\" \ + 7afb0598-72b4-499a-a91c-97f43295d956)(content(Whitespace\" \ \"))))(Tile((id \ - 519a8a69-1f5a-4fc8-ae2c-f5648325c5ea)(label(Yo))(mold((out \ + 374f4d02-c663-48b7-898a-05a756f90058)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 127211d2-f216-4272-a87f-e3232a112a93)(label(\"(\"\")\"))(mold((out \ + 88135158-74e8-49e5-8c6b-1e04b4e6e0dc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 91c54255-dcf3-4f17-87f9-f8805e58a83d)(label(2))(mold((out \ + 27c7b963-af6a-4a2f-b844-90d93e5b34d5)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 6b30eca7-6a07-489c-b74d-9a7c9a4b44b2)(content(Whitespace\" \ + 7c0175a7-f9eb-4895-8691-4efe369afc92)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b4fcc95c-b959-4511-b5ae-b5be41a81662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 71e28ebb-8cc9-4f66-8323-175501ee7851)(label(let = \ + 8903a4ef-12cf-49aa-abce-50c0e1a680ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a0d5fac0-2b33-4cf9-8752-2d290ebbd037)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 91b4ff47-a4f1-4ad7-a76c-b6d8765eaf35)(content(Whitespace\" \ + 80490997-4865-40fa-a3dc-9a7227828f75)(content(Whitespace\" \ \"))))(Tile((id \ - 15d2051a-3f2b-4270-bbbf-91e96eca5f74)(label(_))(mold((out \ + a54667e7-1a73-4819-845b-9c5fb6847209)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e5301b98-238e-47cd-82e1-04691579ba72)(content(Whitespace\" \ + 901300c2-00b0-4a66-8d60-bf855b4aa00c)(content(Whitespace\" \ \"))))(Tile((id \ - 47da17fc-b1be-4ec7-a93c-3457a8f246f4)(label(:))(mold((out \ + 3c36dca3-d1a7-41b4-9c24-23510cdec65a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5376e017-91fa-4e3d-b533-7a58f87b6ef9)(content(Whitespace\" \ + 7b209393-e207-49f4-888d-0d0fbee59b76)(content(Whitespace\" \ \"))))(Tile((id \ - 499aebed-8298-40e0-9ef5-8a6c46bdf1eb)(label(+))(mold((out \ + c32e1882-e0c2-4233-9d70-e0fc62430d98)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 1ab2a1f8-1c71-4437-a409-84001d19e584)(label(Yo))(mold((out \ + 5000688e-60b7-4a42-ac2a-614df5411e40)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 65f09b20-4ad3-488a-9641-1a9d8992ea0c)(label(\"(\"\")\"))(mold((out \ + 80ad2888-082c-4a46-b9bf-263fcc096af9)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c4b585dd-801d-49ac-b963-8968066e3deb)(label(Bool))(mold((out \ + ef6f8c87-edda-43ec-92ac-4958593d3718)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 99e349a8-6cb5-41c3-ae33-b24f57b0f03d)(content(Whitespace\" \ + cc9762f8-ee24-4e48-b515-6a1838cdd558)(content(Whitespace\" \ \")))))((Secondary((id \ - 91722274-7576-46a9-a54c-580c7668f195)(content(Whitespace\" \ + 2c7b046a-bbff-45af-8630-a70df49318ce)(content(Whitespace\" \ \"))))(Tile((id \ - e1291828-9ffe-4425-ab12-75ab5c2569da)(label(Yo))(mold((out \ + e22785da-8071-460a-8bd5-468c24fc33c6)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e0caba8d-ced9-4271-9e42-1fa335403c23)(label(\"(\"\")\"))(mold((out \ + f2d4cc0a-29f9-40ca-ba5c-d80ac5b1e925)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - abae89d6-d0cf-411d-b7cb-0edd874ae5e6)(label(true))(mold((out \ + 717ddcd0-da26-4e94-9418-bf511b61d000)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 1077e0f1-6811-4870-9a02-dc130a67db72)(content(Whitespace\" \ + 75a9a7cb-4c09-428e-a033-4e54a5ddb080)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9466d8b1-c617-4ec7-bbb3-1cba8579feb7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 05416b66-302c-4f05-88e7-9a6f03640ebd)(label(let = \ + f415e599-9f2b-49ce-b1c5-a1e09e83bc0f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 00629c83-c79d-48ef-a1d3-0d6a6e48e4fa)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0bba44cd-16e9-4edb-b102-46d53eb63913)(content(Whitespace\" \ + 2ac253e2-e1c6-4bc8-a084-5ed0735d9dd9)(content(Whitespace\" \ \"))))(Tile((id \ - 6cfa7875-0cd0-4198-aef7-aed14c6bc130)(label(_))(mold((out \ + d9870e6e-925a-4928-b300-3f3177886a4b)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3fa61264-cdbe-4489-8260-f909fbe2e1bd)(content(Whitespace\" \ + b5cc3ada-64a5-41d9-943c-b1eb5738ae18)(content(Whitespace\" \ \"))))(Tile((id \ - 90a9d82c-9132-42ab-a881-504f07b031e3)(label(:))(mold((out \ + 08f2a947-1887-4801-a7ff-4047a16decc5)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f5387297-82cb-4db0-83b4-5d4cc6a18bc8)(content(Whitespace\" \ + c4390cfe-f6b7-40ca-b069-e2b2a31c1a76)(content(Whitespace\" \ \"))))(Tile((id \ - e5b5505f-a92a-442c-a4fd-2880d5d8aadf)(label(\"(\"\")\"))(mold((out \ + 658cc676-c304-4f97-a8c9-b4f8dd78ae1c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 22b06aea-ea92-4d1a-9a11-4d0309cf8d23)(label(Yo))(mold((out \ + 8e68bd7c-4aaf-442f-8d61-89a54b44a86b)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3a81cbef-b945-47ec-9e3d-87da7d1446d6)(content(Whitespace\" \ + 77020cad-e77b-470c-9205-5b34a8db8000)(content(Whitespace\" \ \"))))(Tile((id \ - 7bc3b394-2ed0-4504-af88-fe11f1d989d9)(label(+))(mold((out \ + 88c2074c-0d6f-48d8-a589-8e5a9e5ea5f6)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 65cd35b8-683c-45ab-ac03-fa2c2b24855b)(content(Whitespace\" \ + cf4afd65-2f04-4915-b7a0-8f8c8adbc659)(content(Whitespace\" \ \"))))(Tile((id \ - 8f78d519-7707-4b03-86bf-074dfa0a1965)(label(Dawg))(mold((out \ + 7e4de056-3b42-4d31-a720-e4b8a9123b53)(label(Dawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d38cba09-db72-4515-bfe7-6317af3ca192)(label(,))(mold((out \ + 6e0e60db-d22e-47c4-a504-2a866757356e)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a00c8682-b008-45a1-98ce-5cb61aeaf013)(content(Whitespace\" \ + c78001da-a824-4f52-b50f-b5c4196f2fe9)(content(Whitespace\" \ \"))))(Tile((id \ - 254de1db-6815-4958-837a-a42e5271197e)(label(Int))(mold((out \ + db833a2d-eef8-4f61-bf48-b887257553ff)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - dd7a7601-bb5f-4ce9-b7a6-259cfcc34786)(content(Whitespace\" \ + 18825e56-2657-4e8d-84d7-d84eb4cd5b1a)(content(Whitespace\" \ \")))))((Secondary((id \ - 96e61f4e-1336-4ce6-b8ef-2ed13e01aad6)(content(Whitespace\" \ + b36fb0b8-1f59-475a-97ce-6d6c52223de6)(content(Whitespace\" \ \"))))(Tile((id \ - d87ea0b3-3c25-42e7-9e1e-c3ab019e5a53)(label(\"(\"\")\"))(mold((out \ + 3a3bbd7f-51bc-4970-a7ab-6d31bc2b2e4f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 609879ce-93a6-4bde-ad2c-8122af915ffb)(label(Dawg))(mold((out \ + fddaa12b-c8f2-4607-87d1-ef1a04d1a286)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f028bdab-8cf0-45b4-acec-a19acfe88531)(label(,))(mold((out \ + d8e4e469-a96e-40b2-bd84-c8b633c7f347)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 9a7b916b-3baf-4835-a8b6-b84795ae64e1)(label(5))(mold((out \ + 305f396f-76b2-4e64-ad37-32f8f9416252)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f744a767-ab21-401d-9fc0-10af7c64b4f7)(content(Whitespace\" \ + 8e266bfa-c793-4582-89ad-3bc2de0f7c0f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 71c91ec7-5cf3-4c65-afbd-eefd68fe3210)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7d746bc5-b970-4dae-ae2d-8fc3ed5a4732)(label(let = \ + 3077ea8d-15af-4e8f-bc98-fd2351906844)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c5851048-c074-4a28-8ca2-505dfaac422a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 41d3d274-b6d0-4c5a-9d8a-c757bbeff2b5)(content(Whitespace\" \ + e1ba212d-5d7b-4c20-8a00-24b5f09726a0)(content(Whitespace\" \ \"))))(Tile((id \ - 073141f9-7efd-4725-88cf-238eb07587ec)(label(_))(mold((out \ + 1dab764a-2cbe-41c8-b6a0-f3db9d2798fb)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0cfeda56-8d94-46d3-82e1-a4e880ee0277)(content(Whitespace\" \ + 59644349-255f-4870-adbf-0372eb23bd1d)(content(Whitespace\" \ \"))))(Tile((id \ - 550e3dee-e7cd-4f70-9590-c8bdc314c509)(label(:))(mold((out \ + e844b36c-30ed-4bde-b77f-6fe477eb02e1)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - edf9eaee-e757-4062-bdd1-98550a0528fd)(content(Whitespace\" \ + d02658d7-525e-49fe-b351-31a488012226)(content(Whitespace\" \ \"))))(Tile((id \ - e0298e39-721e-4a15-abd6-9c3bf05e9e4a)(label(DoubleAlias))(mold((out \ + 40d0f545-f344-49f9-bbfa-b57a3d6d2dd6)(label(DoubleAlias))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e78f1b4f-bd46-45dd-83e8-d0f05122a56c)(content(Whitespace\" \ + 97e21d03-4db1-4046-bc4e-1525a2f8264d)(content(Whitespace\" \ \")))))((Secondary((id \ - d38c93dc-ec6c-4aa8-afa3-cfb65e1a6ba4)(content(Whitespace\" \ + e86ed589-e41c-46dc-a54e-6222bfdae78d)(content(Whitespace\" \ \"))))(Tile((id \ - d81d5bc0-7722-4b85-a09d-d169d8af06ad)(label(C))(mold((out \ + 26303c5c-343a-40e5-9cc6-7a40a8e508af)(label(C))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dd653590-25c0-4e14-8723-e37e8656c60e)(label(\"(\"\")\"))(mold((out \ + 3b509558-816c-4984-b3f3-91be6bed0933)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3638e5ed-8548-4f5e-978f-37217eea5922)(label(4))(mold((out \ + 0ebe4931-5b86-4c04-a89e-038e093b7fa3)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - fbd192b0-9e19-4659-b682-238dd1664219)(content(Whitespace\" \ + 9da434d0-9649-457b-9a10-77a0c2230f0f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 610bfb9c-7eee-4272-b73d-4c61e1e4f3dc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cfa41b90-de19-4254-8a7c-f6bc8a37fc3e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 88e99a99-99ab-4d44-aae4-f3583ecd3586)(content(Comment\"#exp \ + 172ce5e5-a9ba-4be3-99e4-d9930c8e581d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1729d413-62ce-4ae0-8641-87c9f7d21b55)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + db0ad058-8fe9-4579-9648-b9b254a65481)(content(Comment\"#exp \ tests: errors#\"))))(Secondary((id \ - 4c95811a-a555-4453-b1c5-d498745ac251)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 18718f33-d54b-4157-97c6-a1dc942030d0)(label(let = \ + 10a117eb-4654-4278-9757-988a7ded611d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 73babe77-0cd0-4838-85f3-90e3d6552f96)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fdd0e6b2-5d3b-40f5-92c8-ee240a51b94d)(content(Whitespace\" \ + c85965d9-d8bd-44ee-abb2-c14b5d8b2854)(content(Whitespace\" \ \"))))(Tile((id \ - 00970778-c7e8-48f8-a806-0bc761323140)(label(_))(mold((out \ + 88f05cc5-882e-4aeb-9a69-aec8f1c834a0)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 10d55465-7d2b-4bcb-a4de-8ce030fc2f8a)(content(Whitespace\" \ + 3b358b26-043c-4014-b2b3-17427d0e9e28)(content(Whitespace\" \ \")))))((Secondary((id \ - bb3fc577-1905-4353-87ec-4cc8f6b20640)(content(Whitespace\" \ + 902be936-0f0d-4eae-aac4-bb1520f9e5d2)(content(Whitespace\" \ \"))))(Tile((id \ - 67fbfb4e-8a86-44e7-a04f-0c109b21322e)(label(2))(mold((out \ + e7a77377-dc0b-4e16-9887-10d80eca58a6)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6619f315-39f5-4d2c-a61f-b579a1e39f90)(label(\"(\"\")\"))(mold((out \ + c06f9e60-5269-4a80-8c3f-a619ed8583ff)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3e8dae88-b9a9-492d-828a-ca47fc87a6f6)(label(1))(mold((out \ + 17de1940-b64d-43b9-b345-f0e8e0d116dd)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d8d1d5dc-8e8f-403d-bf57-513a89dc0212)(content(Whitespace\" \ + 61b30a2c-2b2a-4051-81bf-8132887f7407)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9283070a-f8f0-4bd7-b6ef-6b09973e3131)(content(Whitespace\" \ + 2d920922-a509-4841-aca0-54b087f60540)(content(Whitespace\" \ \"))))(Secondary((id \ - f9003896-4dc7-4927-9a2b-28cd82628318)(content(Comment\"#err: \ + 6fcdb14c-abde-4932-95d7-72e7c13ac08b)(content(Comment\"#err: \ incons with arrow#\"))))(Secondary((id \ - cd479c13-375a-4d66-afc3-929398356260)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b5e952eb-cafc-4578-9e01-5ab18d7efade)(label(let = \ + 39442e53-9274-4324-85dd-6cf5bce6b5fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0c223090-20f3-4f22-8efc-fee48df2781c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4f10cc48-2580-4932-bc20-84ac71d92a2c)(content(Whitespace\" \ + c9b02368-418b-4df5-99d1-0ad69958dadd)(content(Whitespace\" \ \"))))(Tile((id \ - b795bf9e-3b14-42d2-bc3e-3acb39ac0ecf)(label(_))(mold((out \ + 5b39fedf-37cc-4f43-838b-39b0f9f1c2f1)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a42fe1bd-f27d-4b3a-9b85-dcb23a02270a)(content(Whitespace\" \ + 3065ec16-72f3-4023-9bb8-445a97f78bc6)(content(Whitespace\" \ \")))))((Secondary((id \ - 10b276ab-e611-48cc-8cdb-819c72e6dbfe)(content(Whitespace\" \ + a0343f13-c93d-4819-9511-ea92cde2096a)(content(Whitespace\" \ \"))))(Tile((id \ - 3ecd5ad5-1f30-4881-bd58-c5ca370ea3fa)(label(Undefined))(mold((out \ + e73e8c8f-3edf-484c-9b9a-f05f00143378)(label(Undefined))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 59154690-1c29-4054-a5bb-92e22423faaf)(label(\"(\"\")\"))(mold((out \ + 16dc6341-d18b-4d97-988a-669f78d198ce)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 09d10f11-c3a2-4741-a446-8114bf6961ee)(label(1))(mold((out \ + 2e2e7a3c-fe6d-4bd5-b56e-b5702fb5c1d2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ceb03570-ba4c-4720-bf12-033c6f2d4dc1)(content(Whitespace\" \ + 85dc7c8f-21d7-4b7d-a9a1-57fd1798aa22)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 85462f8d-c93e-4c47-b07f-0e5315ee3261)(content(Whitespace\" \ + 2c75819e-5ccb-4557-8137-cbbe09c142e6)(content(Whitespace\" \ \"))))(Secondary((id \ - c4a51896-f00c-4079-911f-3bd54660122f)(content(Comment\"#err: \ + 0b1fcc6e-1bb1-4906-9aa3-a2cc51f12a56)(content(Comment\"#err: \ cons undefined#\"))))(Secondary((id \ - 53cbda6b-24c2-4478-802e-bfa68cbbacca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d74e8f8c-7f1b-4e26-8122-df31691ae11f)(label(let = \ + f9753fda-7c14-44e5-9887-2da79acc4ef2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e56f3824-4687-4784-882a-57d25e7b7736)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b58a2832-d00c-462f-b585-40ebfc8590d8)(content(Whitespace\" \ + 39e56916-37bc-4e7c-975a-08b2bdcae0d7)(content(Whitespace\" \ \"))))(Tile((id \ - f0e63c46-dda5-4412-b9d9-8bf2a90035d3)(label(_))(mold((out \ + 94c7474d-c5a7-4649-a426-f940639f2da2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 94b55a49-df96-49fa-a80d-9a7fb226ce2a)(content(Whitespace\" \ + cd1b4bb9-c519-4160-bc92-74fc716c7834)(content(Whitespace\" \ \")))))((Secondary((id \ - 3a3d35df-262f-4734-a764-284a2d9823d4)(content(Whitespace\" \ + 78456efe-a8cd-4942-801e-7c1c568c5ceb)(content(Whitespace\" \ \"))))(Tile((id \ - 4e6ca64e-d391-4424-9889-d47c4327bd2e)(label(B))(mold((out \ + 9aaecd1c-de39-4dde-bf86-80ff9b121174)(label(B))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 21ac9b5d-cfb0-4cd9-8fce-71bd2798f263)(label(\"(\"\")\"))(mold((out \ + 26947d51-19ac-4960-b331-87eb064a9b12)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 662d40f3-01b1-4eb2-8815-5a79d5a9b3a4)(label(\"\\\"lol\\\"\"))(mold((out \ + 2d7ea60c-4cd9-4605-9cb0-aa1f40ea8912)(label(\"\\\"lol\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ed08401a-6756-473e-b1dd-13f7a3778cac)(content(Whitespace\" \ + 6f41caa4-e793-43e5-950b-2451a5cefb75)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9a661316-8230-4b15-930f-527f4423feee)(content(Whitespace\" \ + ac53eca5-8625-407e-a1ad-2281ac35cbb2)(content(Whitespace\" \ \"))))(Secondary((id \ - 84db63ea-a086-4259-b23d-ca1f14d6e9d7)(content(Comment\"#err: \ + 229f231e-9a04-4fd8-bde1-80cc909c2d64)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - aab6ab02-a6cc-4093-b529-7f7be5f33375)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 775f6485-5c7b-4481-be4a-390261d379b7)(label(let = \ + 9ffa0c85-ba8a-4a2b-82fa-ecd84cce8827)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 060d0018-0184-4097-a885-3d64cb237f16)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 45a4a3e4-71a9-4b8d-ac99-c54c38b78e24)(content(Whitespace\" \ + dbab8e3a-df62-4f50-bfde-c7f9e0765a00)(content(Whitespace\" \ \"))))(Tile((id \ - 5e97135c-420d-4e94-b783-f967604ec01d)(label(_))(mold((out \ + 0cf71d90-72c5-40d0-9894-55d940a94d15)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 00e9fc7d-ff44-42cd-b9f9-678630b21085)(content(Whitespace\" \ + 02e6f5ad-23e9-4d1f-a220-4943fbea949e)(content(Whitespace\" \ \"))))(Tile((id \ - 01e8ddfe-e1d9-4dc8-97dc-31113fdd7bb8)(label(:))(mold((out \ + c5bcec1f-7b5d-4f51-b75b-357c4ec79be6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9fbd8017-30e1-4a26-ad88-4ba3e60a694d)(content(Whitespace\" \ + fc764113-9280-4631-a4e0-d3ca3851a486)(content(Whitespace\" \ \"))))(Tile((id \ - 4e55a03b-41e3-44c2-b2f4-ee87dc9372a1)(label(+))(mold((out \ + 894ababd-404e-4611-ab5f-63bc2e441f55)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - daee7156-58dd-45a1-9da0-51c3ff494245)(label(Yo))(mold((out \ + c7a0147e-f286-464f-b21a-3cfc2939722d)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0eb7994b-3d38-44f4-b420-7501b13fed3c)(label(\"(\"\")\"))(mold((out \ + 42a145b5-d264-4ba6-995c-5e91e7e8b217)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 5a8e48e6-8934-47b9-9c2c-1b225173555b)(label(Bool))(mold((out \ + 79ea25ba-5b88-4f75-88a9-707f7e6f056d)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 80b6e4cc-3036-4de0-88e8-4cc7803c147b)(content(Whitespace\" \ + 7e96eda6-a731-44e5-9ab4-5fdd5c6ec3db)(content(Whitespace\" \ \")))))((Secondary((id \ - 0bba84ed-7a96-4ac8-874e-59a2cc71c862)(content(Whitespace\" \ + e4e86da3-8591-4b82-bbf2-6c0100bc5cac)(content(Whitespace\" \ \"))))(Tile((id \ - cde685ac-5fd0-4d08-a8e1-5fca7bffc1e9)(label(Yo))(mold((out \ + d35f6618-a0f1-43a6-bbc3-01f05160ed11)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - feb6cb38-e79f-4881-8f3b-b23d5e9a11eb)(content(Whitespace\" \ + 69962f92-29b4-4699-8b9c-067e1719a34e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b6ebe4f2-c8d9-4b8c-aedf-c62c8568e7e9)(content(Whitespace\" \ + 0cf81286-de18-4452-954d-4c45b694da7f)(content(Whitespace\" \ \"))))(Secondary((id \ - 34c40819-d1be-40b3-a1ad-b1b236c136ac)(content(Comment\"#err: \ + 8ad0ef5f-8824-4367-92bc-6ae3b1602b24)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 9c3900a9-119c-4483-88ce-08bcc1bb25e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1426be3c-40a3-4676-a187-1d4b4c806b0b)(label(let = \ + f46d36e4-93ab-4763-b967-324c23c0a4fb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dc8cd3c7-4a48-4fd9-9174-851a4d1923df)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7f30e696-53b5-4453-a672-a2a8af69ffc9)(content(Whitespace\" \ + 0a2bac0e-f13e-4ac5-9e09-729cb92d6f0d)(content(Whitespace\" \ \"))))(Tile((id \ - 35976ab6-6e70-4422-9587-a0ca4919cddb)(label(_))(mold((out \ + 6462ed56-8be1-4d25-93f0-87f27edf0cda)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f0795f81-a345-43db-b8c4-23517de1479c)(content(Whitespace\" \ + a7b6f370-8124-49c5-8231-95a396b3f505)(content(Whitespace\" \ \"))))(Tile((id \ - c12cb9d9-3c25-47c2-b120-a810aad6f61d)(label(:))(mold((out \ + 3ca81a8a-8b09-4be1-8a31-acea0f5a7247)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a523315f-3e6e-4344-97e6-35c38482a428)(content(Whitespace\" \ + 06d04220-7fda-4d1e-bb35-6f0bb6360d1c)(content(Whitespace\" \ \"))))(Tile((id \ - fcdc783f-8fc3-4400-b8bd-b9885649cdc8)(label(+))(mold((out \ + fc476958-fffc-45af-9b54-080e46c48471)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - b652e55e-4196-4fe0-af5c-a02b039fe830)(label(Yo))(mold((out \ + 04ec44aa-b941-4879-8fd8-849548703d55)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 039713be-46e4-4570-822c-442f4521be75)(content(Whitespace\" \ + bc5b26e8-6ce5-490e-8ced-3e7fdc202999)(content(Whitespace\" \ \")))))((Secondary((id \ - cbc3ba57-f2d2-493f-9db2-dbb547f5c2dc)(content(Whitespace\" \ + 45285b00-e55b-4680-ba77-388c0febbd96)(content(Whitespace\" \ \"))))(Tile((id \ - fd05f3ed-e8a4-4091-93ad-2f1e37bee930)(label(Yo))(mold((out \ + f83ed236-3162-4d6a-8941-f997d85a42c8)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f93bf4cf-e0be-4b6c-8fc0-b1e46b969b12)(label(\"(\"\")\"))(mold((out \ + c33ccba9-5882-4b71-85ac-eb442083ad44)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f29c94fb-3cef-4acb-be79-8cedb7442523)(label(\"\\\"lol\\\"\"))(mold((out \ + 0229a695-22ed-452f-ab17-c69dbd835997)(label(\"\\\"lol\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d1034959-113e-4e5d-ac46-0d02a4e7d195)(content(Whitespace\" \ + 2c3a9067-6693-4c96-998e-028a49f3bd3e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 09d73544-91ce-4e6a-92fb-ef894fc7f31e)(content(Whitespace\" \ + 11029e14-4ee2-4690-88ac-1dc1a96caa7b)(content(Whitespace\" \ \"))))(Secondary((id \ - ccf78a45-9c87-41f7-8d53-e38a4d669e1a)(content(Comment\"#err: \ + 7e89a745-73eb-45ae-8a63-0d2f6fc70a39)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 6227c574-7420-4444-85e1-d1627599455d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f449735d-c022-4173-9f72-3b8c6b301eaf)(label(let = \ + 3b1c7a5f-0e33-49a4-a91e-a6f5fd788e1f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 89221aec-def6-4533-b1d9-d77d394bc462)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - add4a75e-33da-4672-88a5-539267f2f3b6)(content(Whitespace\" \ + 59b6c4a4-38cc-453e-b0ae-d1148a78f1e3)(content(Whitespace\" \ \"))))(Tile((id \ - 11a59868-675b-452d-9a69-e38c48ccc80d)(label(_))(mold((out \ + 281014c0-b42b-4f20-848f-4e0cc7023d09)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 48cce1e0-118e-462e-9d12-01300427cf7c)(content(Whitespace\" \ + aa72d88c-aabe-451c-8efa-8187361eadfa)(content(Whitespace\" \ \"))))(Tile((id \ - 6d90f462-6d89-4159-a6bb-28e637ca71a9)(label(:))(mold((out \ + 5b8e13ec-459b-438d-adfb-a154a2982f19)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2f28735c-9b1a-49c6-89bf-57f3339fda0b)(content(Whitespace\" \ + a3692277-0f9b-4f8c-abd4-b3d2090ce140)(content(Whitespace\" \ \"))))(Tile((id \ - 9412e131-4c48-455b-aee5-424450318fd2)(label(+))(mold((out \ + f56867a0-f29e-457a-a3c5-bcdb758aba49)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 259c796e-446f-4fa1-9606-674d10bddce6)(label(One))(mold((out \ + 52e1f681-b546-47c8-b19d-6471ee733d1b)(label(One))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - ab034185-54ad-428f-aeab-e20939c35568)(content(Whitespace\" \ + 8a891615-85d0-4a08-9215-cb462624c741)(content(Whitespace\" \ \")))))((Secondary((id \ - 8346ff39-0b2f-49c7-99f8-a54c20d0600e)(content(Whitespace\" \ + 2fb4da19-cebc-46b7-bb09-b3098a576148)(content(Whitespace\" \ \"))))(Tile((id \ - cac79c7b-370f-47f8-9b4c-2b7cbd6110bc)(label(Yo))(mold((out \ + 923d34de-ec8a-420c-9590-a36fa2801243)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d399c60c-d9b2-4155-9b28-ffacb4022b9a)(label(\"(\"\")\"))(mold((out \ + 66f5633b-93ab-45aa-8e11-1b8375729418)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7e529b95-a600-4d11-a3f9-49528af17566)(label(1))(mold((out \ + b4b082d1-ece0-43ab-9db8-bbb7f2cfeba4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 7c3d00de-44a8-4c21-9817-2d03ecefa122)(content(Whitespace\" \ + 51432b32-38d5-44d6-ae42-02a0d3575bec)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1c8d61bc-7ee0-4716-8112-02339c97afaa)(content(Whitespace\" \ + a3864107-bfc6-4b34-9f08-ab6571694a12)(content(Whitespace\" \ \"))))(Secondary((id \ - 126baa56-0ac4-455c-ae7c-3ec266f72399)(content(Comment\"#err: \ + 5b226d35-d4db-471f-a332-633e5e84fc28)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - abf3797f-a609-422f-b5ec-649c197df2e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5e62f07d-4a34-42b6-b825-f96478c35066)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 27552146-6403-4323-a816-b61e7d1df912)(content(Comment\"#pat \ + abec3962-ea64-427e-8a56-3570e446a099)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e38dafb5-0007-4aeb-a7cf-20ae51aff3f3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 98367f9a-54e4-4638-b9de-e29f9e3b72b2)(content(Comment\"#pat \ tests: happy (but refutable patterns so \ weird)#\"))))(Secondary((id \ - e43e36d1-efeb-411c-9403-a535e63af514)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 286ed621-bfbd-413d-86c6-29c076254777)(label(let = \ + 82419db0-dbb3-41fa-881c-a0b395420c6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 74ee3271-d727-472c-9b7a-755a81b148c4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ec07d26e-f3cd-481d-8bdb-b4db1a9e8f61)(content(Whitespace\" \ + c37e3135-8c25-4079-983b-7e6d11553e4b)(content(Whitespace\" \ \"))))(Tile((id \ - ed4188ff-4429-4de9-b2bb-e067ac553829)(label(Yo))(mold((out \ + c6c45579-718b-4fbf-b5c2-eb0cb2581e75)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c2643a0b-4ade-40fa-948e-5675bc660f60)(content(Whitespace\" \ + 934de2cf-33f9-4073-90e9-2d99cb12cf2f)(content(Whitespace\" \ \")))))((Secondary((id \ - 9fcd9e91-5ef3-480f-9fdc-c7cb6edfb5b0)(content(Whitespace\" \ + 2ba42a3d-ac18-49d9-b5ee-22aad89796d1)(content(Whitespace\" \ \"))))(Tile((id \ - 9cb9f9b6-2b0b-4966-9b31-a1d83de65352)(label(Bo))(mold((out \ + 09942f4b-696f-4933-9f40-963c1bbc22f3)(label(Bo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 45f855b0-55c3-431b-be9c-a72f1f8fff2f)(content(Whitespace\" \ + a3d4bf99-e1c5-4fac-85d4-0167384467c0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3c8d229b-e0f1-4960-8cca-cf9934ecbaea)(content(Whitespace\" \ + 29e781b4-6d3c-407c-b6d1-33d81b2bb7e8)(content(Whitespace\" \ \"))))(Secondary((id \ - 2ebb951f-45ab-4b4d-b51a-3a9ee86cc02f)(content(Comment\"#kind \ + d92291d1-a349-41e5-b7b0-015b0a846d58)(content(Comment\"#kind \ of a weird edge#\"))))(Secondary((id \ - 93d6e291-4037-4241-8994-b2a92d3a88bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a4946f2d-e73f-416d-9f28-f4d536fd2d0b)(label(let = \ + 04065439-22c2-4a92-a291-1dc6779ccfdd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2987f3c5-988a-4315-a6d9-d6d6b242051c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 25c38ad9-bea0-479b-af6c-12d21eaf9f96)(content(Whitespace\" \ + d296d3c3-63e5-4481-8c2a-07696d29853e)(content(Whitespace\" \ \"))))(Tile((id \ - 43a5b08b-4e98-4a21-b5cb-6d329f3ce9ee)(label(Yo))(mold((out \ + cf24cf90-884f-4d6f-ada6-2b46a8ca6dfc)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9a53d335-0fe6-4e6a-bfbe-46d977f91e33)(label(\"(\"\")\"))(mold((out \ + e17631cc-a217-455d-abca-8b35898ef3a5)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - efd01f23-6612-48a6-b6a3-f731c35864ee)(label(1))(mold((out \ + c040ae99-c01b-4f13-a1fc-1bb028d9f085)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 9681ebc6-4cca-445c-bab6-111649986dd3)(content(Whitespace\" \ + 474c6eee-bb86-4fad-92e6-9ba03ab18537)(content(Whitespace\" \ \")))))((Secondary((id \ - 01c7333a-4b21-4d69-8f74-90d3c71d375a)(content(Whitespace\" \ + e58d09f8-58b1-498b-96d0-dea2fe449ece)(content(Whitespace\" \ \"))))(Tile((id \ - a791c9be-c53c-47b9-ba76-19519839cc5f)(label(Dawg))(mold((out \ + a3613d82-5366-45e7-94f1-b4d43d832ad4)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9fcacf8d-73f0-4deb-acad-f4b4b33d28b1)(label(\"(\"\")\"))(mold((out \ + c6acc4c6-f532-454b-8ae1-3bbb69270eb9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 419c723e-9b95-4beb-bc60-67df1c91901a)(label(true))(mold((out \ + 21399fe0-e53e-4011-9ab2-01b7a3be3ad4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8c185b7b-55b2-43f5-9f7c-890481f4f179)(content(Whitespace\" \ + 1f0d94c0-bd67-4102-9d6f-57e08fa18f6a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 08fcf341-63a7-4659-b912-7f826b167266)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0c8e9154-0b3b-49e1-a066-dd4ddc301a0f)(label(let = \ + 4668e4f7-6556-4105-9e88-e3d624fed446)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4a5e94c4-e144-416b-b7f4-9e9c35a78871)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c314182e-c342-4b21-bb6a-652d877a9ed5)(content(Whitespace\" \ + 552c30fc-8f6f-4e2e-bf18-7b605a87163a)(content(Whitespace\" \ \"))))(Tile((id \ - 061fd5dd-1e0a-4814-bb2a-ed5edd305ba6)(label(Yo))(mold((out \ + 05f3167a-e7bc-4fff-9189-522d2c7748c6)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f78306d0-f898-48e1-9b1f-78a346317a5b)(label(\"(\"\")\"))(mold((out \ + 885ed06b-03d1-4c10-a904-a19cba98c39c)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 36c46e4e-ec58-417f-868a-38b2dc1a0338)(label(1))(mold((out \ + 14e90ca6-5af1-46dc-bbe6-9de949619595)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - cfceb66f-dc26-4745-873e-0c41d9c2fff7)(label(:))(mold((out \ + 7369e8a4-18da-47d4-9f71-797f291e12ae)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c3806326-5586-496a-a7a7-8f0b4a0e6493)(content(Whitespace\" \ + 9bf05f8c-dd06-4b49-afde-8cbff13591ce)(content(Whitespace\" \ \"))))(Tile((id \ - 5a607d01-b15d-41f5-badf-98caab97b27f)(label(YoDawg))(mold((out \ + 3006e375-d4b9-49b3-8ab9-8c70f8e6f00f)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 53cb7dd5-145c-416c-89a3-b4eb3fce3b76)(content(Whitespace\" \ + f029e25b-76f2-4dbb-86af-58be1c8134bc)(content(Whitespace\" \ \")))))((Secondary((id \ - 4c81c04f-ce90-427a-a70a-c1e5aa0979cc)(content(Whitespace\" \ + e6ff0d3d-10c2-4a5a-b29f-ca16071b5cc8)(content(Whitespace\" \ \"))))(Tile((id \ - 0e43c79b-c4e0-47d9-b4b0-2bedcab177f9)(label(Yo))(mold((out \ + 10cc07d5-3f39-404a-9d8f-9ac3d642e79b)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e22268bf-34cc-47ee-abd0-ecc5bf6857a7)(label(\"(\"\")\"))(mold((out \ + 49435d1e-8f89-43c5-b7db-61a04e4050b3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a6cf5782-b832-464a-9f6e-cc1cdad22795)(label(1))(mold((out \ + 043825b9-ea6c-48b0-8063-0e21512dc15a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 5401db8e-4ed1-4114-af47-dbed4fcfe7b0)(content(Whitespace\" \ + dd5d2c31-5b33-4b17-bd03-3e2f7636b4e3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 17c26113-fbbe-4ce6-87f0-f37131595211)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 00e39952-c5cd-47ac-bdf8-5541531eca5e)(label(let = \ + 6d83b889-d239-44e8-a807-e4e2f8b58e84)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ac60c582-7bb8-4778-9559-252d39c7e120)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0c3f9a51-e471-48ce-8641-2d130f77a87e)(content(Whitespace\" \ + 0497a41c-c55b-44af-99c2-319db9cf2ced)(content(Whitespace\" \ \"))))(Tile((id \ - 3e314284-937f-4e84-a9d8-e7483d6607a1)(label(Yo))(mold((out \ + e18d8293-00c5-4588-b6d2-3f6da8ee5de5)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 32219535-a8e5-4f27-8a58-f934f9f92b18)(label(\"(\"\")\"))(mold((out \ + 0ea19010-bf72-4bb6-b0ee-2fd4cfc3e3dd)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 05482c7a-5914-4d83-a12a-1bb3f288b699)(label(1))(mold((out \ + eb35e362-1ddb-4e09-b9d2-07067677f998)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 5d0e6017-b1b7-4b54-b733-6ce43c2cd42f)(label(:))(mold((out \ + 93560007-02f0-403f-b96c-5dfd77520c84)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 30afcf98-bf9a-4060-b70d-8b5233befa27)(content(Whitespace\" \ + 0aa1fd45-6160-4f96-a5d8-008246fc1e39)(content(Whitespace\" \ \"))))(Tile((id \ - 28b321a1-669b-428d-adf5-294a805be905)(label(+))(mold((out \ + b73b1762-d5c7-4662-be47-efd98f8bd301)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 6b9bab33-0d94-437b-91b2-5827cd3c9864)(label(Yo))(mold((out \ + 1605fb6c-33de-4f58-9074-c5c6804afb4b)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - cc42afde-944e-4ef6-bf39-c5e534fadda8)(label(\"(\"\")\"))(mold((out \ + 379c2c3d-f2d2-475a-81ab-23d638698db4)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 9cfd50f0-d05a-4a1c-875b-a222ea97a8fb)(label(Int))(mold((out \ + c5657013-c7c4-4c6a-989a-e10af52d755b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 677d7866-5aaa-48af-b880-3ae6867b3103)(content(Whitespace\" \ + 65e051b4-cc5e-411f-8958-74ad48ab1440)(content(Whitespace\" \ \")))))((Secondary((id \ - fd318dc2-d93d-45c5-8d3e-12e7269c4c29)(content(Whitespace\" \ + 1cfa6465-d43b-4daf-885e-7ccc598f5e90)(content(Whitespace\" \ \"))))(Tile((id \ - 7179786b-d902-4cf0-a265-a78620276f68)(label(Yo))(mold((out \ + d3f0f888-1c3b-4c7a-a868-14332a85da75)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6f27ec08-de95-4954-b60d-1d45eacda71c)(label(\"(\"\")\"))(mold((out \ + 6a0d4b17-d652-43bf-adff-47286219adc9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f34bb5ad-f935-47c0-8583-2d0546bba7b5)(label(1))(mold((out \ + 6e0b7827-3503-4a32-81de-7480f5e13f65)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8a6661e2-cf17-498a-9cc1-fe21ed50343e)(content(Whitespace\" \ + e5ea7a3a-4f95-4eed-ad98-32596b62c0bf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c7f2d89a-6a2e-4087-90f6-0daad066aab4)(content(Whitespace\" \ + 291f46e0-9178-4976-9e86-7b2f332d0ebd)(content(Whitespace\" \ \"))))(Secondary((id \ - f3b7b39e-cf18-4aef-b685-ccca2c7d4332)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5f25f3d0-3dc4-4e42-b3cf-4f5f45363435)(label(let = \ + 0557cefb-0a67-4225-a091-ef042e9bd8d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2400981a-a21b-435f-b4c9-74c170410a3c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a6b3328a-93b2-462d-8ce0-b5c442a28f18)(content(Whitespace\" \ + 5e3af61c-abb6-4ed5-983b-f5ed29403cf4)(content(Whitespace\" \ \"))))(Tile((id \ - 4d72ce34-a3fb-4d58-885c-c1da843e2f6a)(label(Yo))(mold((out \ + 5f1904d3-2c7f-494a-9581-50247918f776)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 277c512e-4b5b-4327-a58f-135603ce644f)(label(:))(mold((out \ + 6cc139e1-2196-47bb-a063-6d0c65a0fde2)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 71299352-17c9-4e52-97a9-4715adba76db)(content(Whitespace\" \ + 4ad5c266-b9f2-49d1-85c0-fa5214b13875)(content(Whitespace\" \ \"))))(Tile((id \ - b11972b2-5cd6-4356-8f8a-e30d765cd092)(label(+))(mold((out \ + 7e6b4d8c-e8f9-4dc9-bb72-d279f9c241eb)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - 60b5da56-246c-42ce-8964-473c64b46825)(label(Yo))(mold((out \ + f147dc6a-5763-4703-9573-c7f83cc62d19)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - a1107073-8d01-43cc-bd65-739e3de33f2a)(content(Whitespace\" \ + c74b0fd0-aa83-4d16-a69b-7040a205c28d)(content(Whitespace\" \ \")))))((Secondary((id \ - 89cb08a6-276b-4a38-8818-a5a9ca5f0e2d)(content(Whitespace\" \ + d24b98e5-8b67-49e1-a8f2-8c6a158dadff)(content(Whitespace\" \ \"))))(Tile((id \ - b73a9708-2b53-4bd4-8ecc-96a071f93213)(label(Yo))(mold((out \ + bc8c255b-06df-46ff-a2df-5b95c0c8d15c)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 232dc3ab-ffee-4b00-9e27-0b7893b90148)(content(Whitespace\" \ + 66ecd51d-2c4c-4871-8d6f-290292f2676c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 03db08a9-36b7-4e76-81bf-31b9133a38d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f50c7c21-acf1-428a-8f24-5136be951281)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fdee04ec-f81d-4a5d-a9bb-0faa7b4ddd2b)(content(Comment\"#pat \ + 47579907-86de-4297-8471-432930da4e96)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf7e940d-b5f0-4b41-94fe-dc8edb452e0f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ac272e0d-2b96-4409-9bc4-7e6df47d7326)(content(Comment\"#pat \ tests: errors#\"))))(Secondary((id \ - 5f0d006d-ad4f-40a2-9d0a-377032482041)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 36806677-d90c-4a00-bc97-5113e7c857cb)(label(let = \ + a6780edf-171e-42ee-8f60-2a36c35a243a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 747964a5-983b-4661-849d-0f45ad0c6372)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d283b3af-6931-4df1-a08c-ce23653f2f56)(content(Whitespace\" \ + 7b4d5727-bb7d-4f18-9fc1-f654732af2c6)(content(Whitespace\" \ \"))))(Tile((id \ - a31e4f9f-a90b-420e-8037-936e643a7ea7)(label(2))(mold((out \ + b4c15fde-eb2a-40a4-873c-090daa97b5ad)(label(2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4736c31a-a395-4f3e-baa5-cb6645ddd943)(label(\"(\"\")\"))(mold((out \ + e3354125-74e9-4ff4-94c6-cd8061f28f44)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - a970820e-d826-4cf1-94f1-37e9ab074928)(label(1))(mold((out \ + 7b7c99a7-82fa-4b6b-8e15-cbab5b13c31c)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 5178f1e6-a83b-427c-9644-5f232804fdd7)(content(Whitespace\" \ + aa274e10-27b5-4c20-b297-f6212a305db1)(content(Whitespace\" \ \")))))((Secondary((id \ - 70da4bbb-4b4f-42bc-93b5-f7269af30bc7)(content(Whitespace\" \ + e18d3fe8-0830-4b6f-a595-01f119415633)(content(Whitespace\" \ \"))))(Tile((id \ - 3e3d7ebd-3fca-4442-9a6d-48e1461f2911)(label(3))(mold((out \ + ff6f023e-de31-4350-b2a6-d6f1e611f521)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bb5a0e4d-6ac8-424a-9f16-ad673c1890df)(content(Whitespace\" \ + 2f9d628d-f7c5-4071-bdd4-2619ab225306)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2fc102cf-f09a-4db8-8127-e086fe481232)(content(Whitespace\" \ + 7a38b925-1325-45c4-bb69-0a36b8d0cdb8)(content(Whitespace\" \ \"))))(Secondary((id \ - 73c066fb-c19d-4685-915c-86ff33f63b45)(content(Comment\"#err: \ + 3a387dcf-0e09-4d30-a83f-a1818624741b)(content(Comment\"#err: \ incons with arrow#\"))))(Secondary((id \ - 7189e975-5560-48d4-ae9e-109081371422)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 58c44e93-40a8-4a3d-9636-8cef9820ab25)(label(let = \ + 68d5dcea-8c23-485e-865a-69fb7d2d0cd5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1cfee09b-9e29-4c55-a3bb-5d82a4654443)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 846916bf-6809-451b-ae1e-a1aae9d816e1)(content(Whitespace\" \ + 45f6c185-2057-40e6-a7b2-f993dee36b38)(content(Whitespace\" \ \"))))(Tile((id \ - f8fa3bbc-53e5-4b4d-be73-42798319a00f)(label(NotDefined))(mold((out \ + 24fcb149-2bc9-4224-ab03-4b73b789c75a)(label(NotDefined))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e0a502a3-5ffb-40c5-935f-433b24d7be58)(label(\"(\"\")\"))(mold((out \ + a3194e38-6789-4ccf-aa76-9e30d81bcaef)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2c614426-c4ad-48b5-9557-41575cdc5242)(label(1))(mold((out \ + 6a56fd51-2c30-42f4-aca4-2b6f2001bad3)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 82d3acd5-1c89-43bc-878e-45e6746644e5)(content(Whitespace\" \ + 2ee595e2-a45e-44fa-944b-a5c5a3980f12)(content(Whitespace\" \ \")))))((Secondary((id \ - 11c851e9-47bc-459d-bda9-dae01fd4eb65)(content(Whitespace\" \ + 097341b1-0662-4d31-b275-7a3250d6df9d)(content(Whitespace\" \ \"))))(Tile((id \ - e44efa44-7ac1-4ee9-9e8c-bfc0d5995650)(label(3))(mold((out \ + 59f9db5d-6597-4b10-bd72-8c4376dd57f3)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 404c5f67-fb3c-4c4b-9d75-e3ecfad5c672)(content(Whitespace\" \ + 552bfeb6-0c14-4e09-8697-f954043641be)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bed1206f-b9b1-467f-ba3c-269ee8decd67)(content(Whitespace\" \ + 6e34c413-854e-4e4e-8e7c-a75d5ad9eccd)(content(Whitespace\" \ \"))))(Secondary((id \ - 19481669-3462-4db3-a065-600f510ff835)(content(Comment\"#err: \ + 6d8ed302-ad46-4a6c-af7d-cf01d4dd8634)(content(Comment\"#err: \ cons undefined#\"))))(Secondary((id \ - 06667d7e-932a-4ca7-b85b-b15a08d1d48b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 890e0665-be23-497e-9417-d4510f79f3c1)(label(let = \ + 1477b677-d5bb-4ef9-a13d-b87c8b91a8e0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3c79f252-7420-4763-8237-112308e155d9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d8ee3164-5de6-4b59-aa08-767d5406473e)(content(Whitespace\" \ + 1dbefa01-f9e5-4e22-b8de-10bd967bd27b)(content(Whitespace\" \ \"))))(Tile((id \ - 1eaa23ba-dc85-46df-993a-ff808fbc8f1f)(label(Yo))(mold((out \ + 4bd1289b-aee7-4514-bbe1-cd35485b60be)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - abfa7933-d7a9-4cc4-a1b8-a2c3af57f820)(content(Whitespace\" \ + f0c94efb-b145-41db-885a-23f645e73f2c)(content(Whitespace\" \ \")))))((Secondary((id \ - 15d00b9a-f864-4dd8-a363-af9a660f68f1)(content(Whitespace\" \ + 496132cd-7941-4aec-8191-6ecaac65c6ef)(content(Whitespace\" \ \"))))(Tile((id \ - 42b505a3-88e0-4417-943d-0c44be3dbe00)(label(Dawg))(mold((out \ + 0740a149-b697-4026-9e9b-ec29c4a7aa66)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 07dae790-8371-484c-9b39-7a5c6e6a1d62)(content(Whitespace\" \ + 5b1d44c6-9417-4d04-bf10-97cbe162afcd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9fda8f33-009e-4131-bccd-d1beca4a07c2)(content(Whitespace\" \ + ef158770-1bc3-4173-b611-b8fbd1f27729)(content(Whitespace\" \ \"))))(Secondary((id \ - 2e973e44-e68d-4474-a1ba-30ec6d43aaba)(content(Comment\"#err: \ + 56d60993-c631-40fa-93bb-4f3b5d79e0d6)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 6586033c-0d47-44c1-847c-cc50cb03323c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3c3ef3e6-5058-40af-879a-76ca4ff7c87a)(label(let = \ + 5467b9d2-f344-4488-8e3b-fa31d1e9fdfb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + fd3189c7-ec41-47d4-924d-722f367814e5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dd10e9a4-4afc-42d9-802b-202edb5b2f96)(content(Whitespace\" \ + abbad808-aeee-4dfd-835c-6242b07d3a66)(content(Whitespace\" \ \"))))(Tile((id \ - 90ca2db9-64d1-40c8-ab7b-222159dcc540)(label(Yo))(mold((out \ + 4ded6b0c-2ffc-466f-a1d9-f1838f88daaf)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 94037630-4f2b-4422-a846-5794c2883d9e)(label(\"(\"\")\"))(mold((out \ + a66a61bc-f07f-4f4d-b2c5-9443c3b92ef8)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - f4da0018-621e-447a-985b-5621e99b31bb)(label(true))(mold((out \ + e3793a27-2fe8-4fe5-8012-f6f93ee0282c)(label(true))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 50358657-b05b-4982-9624-ce0a6d6c7fc8)(content(Whitespace\" \ + 4e2b1df2-acdc-4220-a8d8-bec2da6e8dc6)(content(Whitespace\" \ \")))))((Secondary((id \ - b40a24f9-99ff-455e-8740-d3485f320e4a)(content(Whitespace\" \ + c70d9704-e535-414b-88e9-b2f12a9ff81d)(content(Whitespace\" \ \"))))(Tile((id \ - b3cb3792-1e70-44d4-b211-d5d83e42db8c)(label(Dawg))(mold((out \ + 1838c569-5adf-4504-885b-dc4f2d886cb8)(label(Dawg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 56b06d74-21e5-4704-b08d-234dfad9ae9f)(label(\"(\"\")\"))(mold((out \ + 645e6d17-5158-430d-94e1-2a793fdccf1a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c58cce4e-0b85-4a6a-a98e-41fce0652b4a)(label(true))(mold((out \ + ae692be0-b769-44db-ad29-aea36deb7bb2)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 3a979acf-c763-4cc3-aec6-de801425a09f)(content(Whitespace\" \ + af8963d1-1dc4-4f9f-97ff-ac5005522868)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7d63f50c-e1f0-44b6-942a-295277a64b65)(content(Whitespace\" \ + 7972f163-be4e-4604-9db6-5beb9262aa8d)(content(Whitespace\" \ \"))))(Secondary((id \ - bf9d69eb-2435-4efe-a113-b220aa933342)(content(Comment\"#err: \ + 6cf2575d-0cf6-4514-a0da-412b6ff330fc)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - d0fda05e-b3d2-4e88-b5a9-1933cd4d5e48)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f76ea6c7-9d3d-4ca7-b045-9cd40e17aef1)(label(let = \ + 371c71ca-ce1f-4445-a32e-8cc0d9c787ea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4678bd74-a463-4330-9673-bebaa7171afe)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a4b126f0-ac94-4615-be1e-eeefa0ea618b)(content(Whitespace\" \ + f7722f08-3f4c-47e6-aa34-f74de83df240)(content(Whitespace\" \ \"))))(Tile((id \ - 63893af2-f61d-4788-86c3-68dd7d18ca07)(label(Yo))(mold((out \ + 957b7080-04cf-4239-a808-66bce517a27a)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7f0f5785-9733-4dec-a1eb-42d1d6e11fd5)(label(:))(mold((out \ + a47e1438-766d-422c-bbac-6485cac8ff5b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cde0d851-6dcf-42f1-833d-c1037a04689e)(content(Whitespace\" \ + 3ddd4701-a255-4a9c-9559-a1310a8cef99)(content(Whitespace\" \ \"))))(Tile((id \ - 2a080896-fc44-489c-b530-365d8516c7fd)(label(YoDawg))(mold((out \ + 57b1e5c6-1cfe-47cc-af6e-8fa24d2c4dbe)(label(YoDawg))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 89d0ba9c-e915-496e-8c8c-1c8cb3a0807e)(content(Whitespace\" \ + fdf155d4-47ba-40f7-8b0d-af84ec5ff4e3)(content(Whitespace\" \ \")))))((Secondary((id \ - a6af5494-b27a-4c4d-9152-0e3ecb7636a0)(content(Whitespace\" \ + 5af81087-c4fb-4c6c-b7ef-186ac975dafd)(content(Whitespace\" \ \"))))(Tile((id \ - 28a939d7-e878-4412-83b2-56576eee8413)(label(Yo))(mold((out \ + 283431e9-9b8f-437c-b2e6-0b28dd6e03d2)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b915cb87-c3ac-449d-9233-321e57ead21c)(label(\"(\"\")\"))(mold((out \ + e2546fa0-3f81-4b31-91a2-5b26a8cff08c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a2b2384b-3675-4e22-be78-a42ee9176dcd)(label(1))(mold((out \ + a125e9a1-dc78-4a84-88b7-c88624ab287a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 5a16a59b-a47d-46b4-a1e8-0ff8508944b6)(content(Whitespace\" \ + 51b8f15d-1a4e-41ce-a8cd-11b414c0495b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 88183e73-58f4-4f30-afc9-b3cdd5f52e3e)(content(Whitespace\" \ + 47c794f7-9830-418c-8408-eb4644359bfb)(content(Whitespace\" \ \"))))(Secondary((id \ - a6302504-195f-4852-b30c-a6017717cd68)(content(Comment\"#err: \ + 2fe2672c-a1eb-4422-91c9-28f96189e086)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 932f6fe0-460a-4cb6-a20a-492994a715db)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d1b74d2e-44dd-4bc5-8f63-3e951aa4b77f)(label(let = \ + a21c7c06-d846-4ffd-a66d-0cb8dd3943b3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4a29d2ca-b4fc-4218-81e1-e00d703f1caf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f41ebaee-ba4a-4386-9d38-5777ea1de7f6)(content(Whitespace\" \ + aac398e8-d04e-43a6-82bc-4d6c5b8b01e2)(content(Whitespace\" \ \"))))(Tile((id \ - 0fe37222-1c98-49ec-928f-0d2cf1c52a95)(label(Yo))(mold((out \ + 78c85bb7-d49a-4cd0-9fb1-4504e6a1574e)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - dd8f587a-42ef-40c5-b748-489d03147537)(label(\"(\"\")\"))(mold((out \ + 0419619e-aca5-4a6a-be3b-8713b65ee9de)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 12a01c95-3ad5-4ea4-82d8-30b53d549392)(label(1))(mold((out \ + 239b648d-0d54-47e1-8d64-52f65ea5caab)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 3a418a99-e243-40cb-ad46-61ae603308ba)(label(:))(mold((out \ + d6d46558-6953-4184-8116-29ee654d7f2c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 84e3e8fb-c743-479b-b2e6-bb468fca0976)(content(Whitespace\" \ + 27d85969-1b27-4022-8122-98fea5b240f8)(content(Whitespace\" \ \"))))(Tile((id \ - 9b4ae082-cf26-42b8-a10d-5715bd5b7e1c)(label(+))(mold((out \ + 8f0a8f1a-27fd-45a4-8780-bafc5a81adec)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - cfdf100e-3be2-469a-b83c-23c7d493c93c)(label(Yo))(mold((out \ + 44958aa4-27c6-46ee-acda-3795393e0304)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 37608aed-af36-4796-9f7e-4aec35aab5ab)(content(Whitespace\" \ + 3e45e42d-7d1b-44ef-ba8d-8292d76a4f97)(content(Whitespace\" \ \")))))((Secondary((id \ - 25f76661-465f-4193-9859-e46cfce30083)(content(Whitespace\" \ + d0bfaf87-69c7-4620-9a8b-eaa2a2aa9b79)(content(Whitespace\" \ \"))))(Tile((id \ - 0ea29f5e-e6b1-4b00-8f49-09c7daf5a5cc)(label(Yo))(mold((out \ + ba988a26-e1fe-483a-89a7-e582b5930976)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5ca72902-4780-43ef-b353-41b5dce6a29c)(content(Whitespace\" \ + 23da4a46-5a55-485d-bf49-ca9cb37f9b8e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 907f5ef8-505b-4237-add3-04b717929aa9)(content(Whitespace\" \ + 65b76e43-e90f-4949-a8dc-3f65d02cf433)(content(Whitespace\" \ \"))))(Secondary((id \ - 216139ad-7598-47f2-bceb-1707c71da7ec)(content(Comment\"#err: \ + 4a5337ad-ca72-4bb9-a06e-13d7c445baff)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - 366ac2a1-0bcd-44e7-9938-74548976f224)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bcbbd75b-e8c6-41da-9d2a-b480a52f3e86)(label(let = \ + 8f1a8e25-ed7c-41c1-93ac-315c7d1b78a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6ebabf70-eb4a-4cd1-8dd0-9a5011ea543c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bf9ca39a-ab84-45ce-930f-45b0d6dcae25)(content(Whitespace\" \ + de134bc5-85e5-42ab-b577-641580301cd7)(content(Whitespace\" \ \"))))(Tile((id \ - f377a669-902a-42ce-8a10-4ebbfde8fa0f)(label(Yo))(mold((out \ + 372c9949-0bb7-416f-887f-cdbbc82974cb)(label(Yo))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9174f3eb-5d68-4ccb-bea5-72c5e293ceca)(label(\"(\"\")\"))(mold((out \ + 4b5198e4-8521-44a1-b72f-f1937d92b857)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 5eb4b9de-218b-489c-8ba9-b210a5f5fb95)(label(1))(mold((out \ + da8e6a05-ae9f-43a6-a9a5-749eb1b35ccc)(label(1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - a96ee91a-f91e-4571-889c-a3464b81bfa8)(label(:))(mold((out \ + 69107009-8a96-46f6-b78a-1ec6433104b6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 852f49f5-d537-49e5-ad56-b9d26191ab16)(content(Whitespace\" \ + 5ef53553-c599-4f7c-8006-52b176e08cbc)(content(Whitespace\" \ \"))))(Tile((id \ - c58d7912-82f5-4cb6-9298-71633fe4cfaa)(label(+))(mold((out \ + 664e8b1b-5445-48fc-bca8-5e13ee6a1d14)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Tile((id \ - ab82becd-7563-4976-b41e-42a259a24f2b)(label(Yo))(mold((out \ + e23ff446-f4c4-41f6-84ea-22d262787f42)(label(Yo))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0ff61cdf-91d1-40d9-b74b-ce88b8094753)(label(\"(\"\")\"))(mold((out \ + 8e254e29-b385-4d76-bf22-db4319416fb5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a77c70cd-2cc1-4400-868f-9819361c921b)(label(Bool))(mold((out \ + 999c4101-8ebd-4d93-9906-b556bb305e2a)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 2678451d-ac24-442f-8b3f-cbfe273a2e99)(content(Whitespace\" \ + f0238c1a-3945-4c7f-9966-2545926eb26a)(content(Whitespace\" \ \")))))((Secondary((id \ - 0a3730f0-54b5-4a0c-8b07-660d002e8fa4)(content(Whitespace\" \ + 800201b5-5580-49dd-ad62-99ce0b47c89d)(content(Whitespace\" \ \"))))(Tile((id \ - 81bb9a99-745a-441d-94bb-03521e6da6e3)(label(Yo))(mold((out \ + 5f57a0cd-5a53-4ada-9763-8140b101bb3a)(label(Yo))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8a141746-fbc4-442a-a2fb-d9f269e4951a)(label(\"(\"\")\"))(mold((out \ + fb796612-8216-4817-94fb-3f09f8795f2f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bbb253a2-74b5-41fb-80e9-1cc7eb388218)(label(true))(mold((out \ + b76aa6bc-00a8-4153-89bf-3a9e8789aaf8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e327db3a-646f-46c3-a620-5ec708ea7804)(content(Whitespace\" \ + e8e11231-b230-4b90-b83d-cfdb94b2d52b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5c8ad2ea-ca4c-4fb8-9756-109b872c9b79)(content(Whitespace\" \ + 5f4d8d62-4c94-45cf-8386-31cfcfb681ce)(content(Whitespace\" \ \"))))(Secondary((id \ - 66f42fb6-86e8-4f10-a12c-50153ed58f40)(content(Comment\"#err: \ + 60550c2e-99ea-4d67-a46e-7bfd21e3c12f)(content(Comment\"#err: \ type incons#\"))))(Secondary((id \ - d77ec9a7-2af5-45d9-8702-29aae2820122)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 691d69b5-38fa-4940-89ba-1ca693cee96b)(label(\"\\\"Thats all, \ + a324778b-19b4-4577-b891-afd8d0a8ed6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c2c4604a-ea41-48ed-954c-d825082fac69)(label(\"\\\"Thats all, \ folks\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2e1afed6-18e2-4976-8197-f9e384a1035f)(content(Whitespace\"\\226\\143\\142\")))))))(ancestors())))(caret \ - Outer)(projectors()))"; + f321b9fc-2601-4ac4-a8e8-49860032d8b9)(content(Whitespace\"\\226\\143\\142\")))))))(ancestors())))(caret \ + Outer))"; backup_text = "# Internal Regression Tests: ADT Statics #\n\ # All commented lines should show errors as described #\n\ @@ -9311,7 +9429,7 @@ let startup : PersistentData.t = type VerticalLeading =\n\ + A\n\ + B(GoodSum)\n\ - + C(Bool->Bool) \n\ + + C(Bool->Bool) \n\ in\n\n\ #incorrect or incomplete type definitions#\n\ type badTypeName = in #err: invalid type name#\n\ @@ -9328,7 +9446,7 @@ let startup : PersistentData.t = + notvalid #err: invalid#\n\ + Bool #err: expected cons found type#\n\ + Int(Int) #err: expected cons found type#\n\ - + ( )(Int) #err: expected cons found type#\n\ + + ( )(Int) #err: expected cons found type#\n\ + A(Bool)(Int) in #err: expected cons found app#\n\n\ #sums in compound aliases dont add ctrs to scope#\n\ #but compound alias types should propagate analytically#\n\ @@ -9385,2939 +9503,2838 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 207fd4a9-6af2-4a30-98f9-178342ca5712)(content(Comment\"# \ + 9fe8d24e-4459-42e7-b092-f9c85157bd60)(content(Comment\"# \ Hazel Language Quick Reference #\"))))(Secondary((id \ - f7b5c9a7-d81b-4d71-994b-4a4b447534c0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e372f3c8-a924-49f3-b30f-a8d2312040d0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c07bd6c8-7aa0-4235-96ff-a4d7b987e158)(content(Comment\"# \ + 5d188341-38f4-4931-98b9-6e809a295068)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 58d98c59-2a8c-4752-85c8-8b92bd4a0737)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b3807c1d-917c-4acd-81b9-944da88fd057)(content(Comment\"# \ Empty holes stand for missing expressions, patterns, or types \ #\"))))(Secondary((id \ - 30705f80-1b48-4bd1-b3c2-d8f5e456072a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f9948af7-8baa-4f75-b350-de13c33e10a2)(label(let = \ + 39181f7a-2978-4dae-87f3-7913b799f75f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 353a2dd9-8ca1-4e65-8490-ff136d46fe48)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 98f9a2f5-85c4-44af-8c3d-54e891626ca8)(content(Whitespace\" \ + f0d14f68-e820-4f4c-b3fa-a92f074324ef)(content(Whitespace\" \ \"))))(Tile((id \ - 60662333-8427-4791-85fe-42be81709674)(label(empty_hole))(mold((out \ + 72aec946-f16d-400e-b5f5-c1c82ddd92d4)(label(empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 39c2be21-a236-4d01-983a-30b2629f4904)(content(Whitespace\" \ + ac2d6e87-4b04-4dfc-85ad-b598ad2b388a)(content(Whitespace\" \ \")))))((Secondary((id \ - 57f695f6-8ed7-48ca-a660-3fe9609f5168)(content(Whitespace\" \ - \"))))(Grout((id 5d80b65d-6fba-4664-b5d8-1d0bdbad04e5)(shape \ + 6fdc2452-6a4f-493e-872b-65663e673781)(content(Whitespace\" \ + \"))))(Grout((id 71857c1c-6c8c-429e-86b0-9ba135b152f4)(shape \ Convex)))(Secondary((id \ - 2712e2d5-6c20-4dc5-add9-807f1cfd21b2)(content(Whitespace\" \ + 665f8afe-b25e-47d1-a4bb-3250db0f9020)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee46415a-4436-44b9-8f2c-46ccc7beae00)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1ff46ad9-8a47-461e-acab-1099b29cb067)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e9906d23-c102-4410-a4d7-583428a1678d)(content(Comment\"# \ + 6743c9c3-cfa5-460b-9396-c20992ff60aa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1c57f09d-5c56-4aca-8773-01447c3ce92f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 02cf0c9e-7937-4f24-8428-f465bd2d644d)(content(Comment\"# \ Non-empty holes are the red boxes around type errors \ #\"))))(Secondary((id \ - 69da6284-4a39-4eee-8bd6-7f6fc5b22bbe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7e19037f-9b36-4aa2-93e0-01f8070754b5)(content(Comment\"# (you \ + a3982f09-56a8-4100-a7d1-a3576ede6f42)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 18844e22-3d0f-4516-8fbf-c06700256c15)(content(Comment\"# (you \ can still run programs with non-empty holes) \ #\"))))(Secondary((id \ - 44cbafd2-1d29-400f-93f2-111efc843008)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8eff151a-8916-4848-99be-3190371af0dc)(label(let = \ + 24258781-86cb-416f-9471-db4942417fc0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0299b6d1-1190-43d1-879f-cadbda83ec1f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 59fb6202-8ba4-4844-a2b4-d8baab2030f6)(content(Whitespace\" \ + c80e272c-0aa6-41e0-9707-b6b954d410cc)(content(Whitespace\" \ \"))))(Tile((id \ - fd8181bc-8a1e-482b-9533-757029991ced)(label(non_empty_hole))(mold((out \ + a575cdd2-1555-4d5a-8634-266a9a5788e9)(label(non_empty_hole))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1e223321-649c-421e-ad23-c9f94b4a1d15)(content(Whitespace\" \ + a4ba1968-231d-4bfa-a947-4086e44ef4df)(content(Whitespace\" \ \"))))(Tile((id \ - c00f8699-3ba5-4dc3-bc8b-3638091c4eaa)(label(:))(mold((out \ + 719fa870-5b07-4343-8554-1185febe5e1f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d020291a-9b7b-4565-8cc0-4071bc596978)(content(Whitespace\" \ + 42a91967-48a7-4633-a619-3c13938d8f6b)(content(Whitespace\" \ \"))))(Tile((id \ - beb21e29-6073-4ec6-8041-03ffac7e6d3d)(label(Int))(mold((out \ + 171dc315-b184-47a1-bee7-ec8345fe1ee2)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8e811260-8743-4a46-8650-ac8cf5fe2242)(content(Whitespace\" \ + 1e0d1c5a-1be6-4f9c-91b1-653d8b74479d)(content(Whitespace\" \ \")))))((Secondary((id \ - 5565cff6-7aa5-4570-97fe-87ea5db04a99)(content(Whitespace\" \ + 1b147fa1-3c78-4010-9b9e-0a8a3d71d28d)(content(Whitespace\" \ \"))))(Tile((id \ - 8402b685-1190-4375-b80f-daaee78f8fd3)(label(true))(mold((out \ + b6fb803c-8f96-4309-b4f3-9925a075f469)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 21946d35-ec5a-47e1-9d37-d3ae1c59167a)(content(Whitespace\" \ + d494833b-16cf-461b-88c5-48a8d4abcf34)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 001dbc33-9c9d-4256-8d60-fa36ec544d5b)(content(Whitespace\" \ + 39ae1167-a94e-4ef1-a0de-512264c258a6)(content(Whitespace\" \ \"))))(Secondary((id \ - 1e7dcb71-43b7-4c48-a47e-689b5cf3bc6d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ed47902d-3585-43f0-b4c6-da24b43a7a84)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0921d43c-222f-4430-b02b-ac9b5e5b62aa)(content(Comment\"# \ + 87dd6df6-8799-460a-95e6-4c458b1cc8d6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5d7b7ea8-10b6-414c-8d73-432800d44d90)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7be94fd0-0c43-413d-b801-b909046a0f87)(content(Comment\"# \ Booleans #\"))))(Secondary((id \ - a118ac60-b876-43e3-971d-af7e59ad4adc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d42dbc07-5fee-4843-af05-20971ff0973f)(label(let = \ + 7932fc05-d2ab-4562-b610-f57288a1bee6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 71b77bef-be65-4900-8af3-2cea5bada188)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f30482b1-564c-4724-9d9b-15d520512362)(content(Whitespace\" \ + a102d648-91b3-4dba-9ec6-06c96f1432d8)(content(Whitespace\" \ \"))))(Tile((id \ - b398531a-dec7-4856-848c-22ba9773fd9d)(label(booleans))(mold((out \ + e267c216-b037-4f02-9cd7-a72700e9af1d)(label(bool))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f0f29b5f-47ec-42aa-a7cd-16dcccfc83bf)(label(:))(mold((out \ + 6349b608-ebf7-4d4d-85fb-8c5927baf383)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 64c2a538-8d4e-408f-8cd8-e652708e1c3a)(content(Whitespace\" \ - \"))))(Tile((id \ - 232deac9-7a43-4ce7-8b31-f78e1da21c34)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 9416ed4a-8eb8-422b-9a3e-f963f19e1883)(label(Bool))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 20b0d42e-bee5-4ce5-b8b8-6f747b8254ba)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 15))(sort \ - Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 6bba2033-16e1-4b0a-a47b-fe69af3b1178)(content(Whitespace\" \ + 907ef289-4202-4d1f-8b8d-d4ac0fe6ce81)(content(Whitespace\" \ \"))))(Tile((id \ - c4bb20d0-fb43-47c3-8cd6-b17313b25466)(label(Bool))(mold((out \ + 28f40863-f097-4d03-a4f8-775f3b939cf1)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 28bf9856-2401-4236-842e-19b91844e74d)(content(Whitespace\" \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 837fb968-1120-4504-8e0b-58dec4a21cae)(content(Whitespace\" \ \")))))((Secondary((id \ - 48e7c1d4-1eb4-4d2a-b2b3-d6152956c888)(content(Whitespace\" \ + cc56c5d9-f9dc-485f-ae4a-2cc9eb2707a6)(content(Whitespace\" \ \"))))(Tile((id \ - 171fbd19-896a-4379-8bda-ee4155d0b808)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bf7f2526-0139-4ed1-b451-f6ae54f80127)(label(true))(mold((out \ + 9d749fab-0af3-4e0a-9e7a-70d8bc893334)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7e382b55-6546-444c-a231-5ff7a501e587)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - b70331a3-e153-4c9f-80f2-4a6f92c49867)(content(Whitespace\" \ - \"))))(Tile((id \ - 33d0fa71-7853-402b-8ea4-8608462882e7)(label(false))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 4509e2d2-147a-4f77-88f6-b859643697b4)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + c90f7c90-8d6b-482b-af46-4f4a589124e5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dd2f6dc4-a574-4813-bb2a-f747a835a36c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5b89bcd4-80e8-4869-97cf-bd6ab45d4ca5)(label(let = \ + 7be826c5-f326-473c-8670-e801ebee497c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + df3259bf-445d-47bb-8d76-8258744e4219)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b772b6b8-7437-448c-a6bf-673e4c85034d)(content(Whitespace\" \ + 1acf08d8-12c7-4624-aa2d-1e209a9cc820)(content(Whitespace\" \ \"))))(Tile((id \ - 472fa7b6-b977-4453-9785-51180e3d496e)(label(boolean_ops))(mold((out \ + 4e1756e6-8059-4253-9438-fc566953b60e)(label(operators))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - d343b3c5-ba4a-47b4-984d-f1156c602b05)(content(Whitespace\" \ + 8ac302fc-2891-49a5-bac1-d935dd89cc51)(content(Whitespace\" \ \")))))((Secondary((id \ - e80a22dc-dc49-4fe1-b011-d5f9ca3e6f51)(content(Whitespace\" \ + 29f8defb-b5df-413b-82a0-a96798e3ca19)(content(Whitespace\" \ \"))))(Tile((id \ - 4ab2ac33-cb60-4097-9c66-a29ad457796f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b18607b9-699a-4011-b7d4-4e259f82fff8)(label(!))(mold((out \ + daf8468f-68a3-458d-8ba2-c2f28d7e1104)(label(!))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 5))(sort Exp))))))(shards(0))(children())))(Tile((id \ - e7f3e63b-e924-47f4-b72c-48df8289e29a)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cd044043-edfa-4b2d-8334-88968cf369db)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 48bcc286-7c9f-45b8-be45-ccbf141522fd)(content(Whitespace\" \ - \"))))(Tile((id \ - 0ee0ede0-c4dd-4390-96b4-ff9d65249367)(label(true))(mold((out \ + ba126e1c-af4d-4a77-995b-51d5686bf7af)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 573963b7-e7d1-4a19-bed4-8eb384b86911)(content(Whitespace\" \ + 3f26ed17-b087-42b9-a555-3d3b87326792)(content(Whitespace\" \ \"))))(Tile((id \ - 3611f1d6-a646-49dd-97a1-9b1bcb5f7ff7)(label(&&))(mold((out \ + 3748d746-a5cf-4f26-acce-2786dc082f53)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0c6262a3-c3e3-4d3e-ae95-44f678e8e91e)(content(Whitespace\" \ + 8d428a7b-a61b-4150-9d6c-cb3f1babe0ca)(content(Whitespace\" \ \"))))(Tile((id \ - 51f089de-03d6-4d4e-b57f-791702220404)(label(false))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - cb9e83a7-6e79-4a56-9f58-8511417ece6f)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort \ - Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - d19a65bd-03a8-49d9-a958-72a976b0cac5)(content(Whitespace\" \ - \"))))(Tile((id \ - 3c11a3d4-3eb8-4b4e-aa60-cd8df0e12b8b)(label(false))(mold((out \ + 6fd06bac-a1f2-47f9-85e4-38e18dc3472f)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3e809b37-016e-430c-a5f3-e97a929e5e11)(content(Whitespace\" \ + c7fab919-5d83-4b32-babc-034d530a4541)(content(Whitespace\" \ \"))))(Tile((id \ - 721e18d9-6633-4c68-91c5-2a8a7189429e)(label(||))(mold((out \ + 3feec8d0-1790-43e1-b1c2-8c4eb7520694)(label(||))(mold((out \ Exp)(in_())(nibs(((shape(Concave 11))(sort \ Exp))((shape(Concave 11))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2e895fed-6081-42a5-9466-ff9e698879ef)(content(Whitespace\" \ + d6b2950c-5f15-494e-81b7-c22e402e1674)(content(Whitespace\" \ \"))))(Tile((id \ - 6b0ba2e1-76d9-4233-9ed1-1ea5164fb83a)(label(true))(mold((out \ + f7bdc0ca-3cc1-48cb-853a-68217d7a4106)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - dac59081-e211-44c6-8733-49f689f1b730)(content(Whitespace\" \ + Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ + a4f6e78f-8ace-4152-95ed-ca3988bb1c33)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8dca965d-d922-4fd8-82bf-fa5847705a63)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cb8a127e-063a-4439-842a-52af7b681d25)(label(let = \ + 1c23ea42-6f81-48b1-a462-905abea7ce59)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 654c1e6b-d2b8-4a97-a2fe-ec384b0ccf8e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 679715e4-2a7d-49eb-b3c5-31ec2f562341)(content(Whitespace\" \ + c5dcabc5-5399-4b45-b9ff-822d42328e75)(content(Whitespace\" \ \"))))(Tile((id \ - bbd2fe8a-df87-40a2-bc90-aa1db1e27f87)(label(conditional))(mold((out \ + 95d135cf-2098-4864-846b-beb72b4713cc)(label(conditional))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3476babb-7c42-4a79-8383-789bc7c70101)(content(Whitespace\" \ + cfddd25f-0fae-49e7-9a5d-1faaba2d8e8d)(content(Whitespace\" \ \")))))((Secondary((id \ - fa28d2f9-dd9b-4acb-9ee1-4f277cda9ee4)(content(Whitespace\" \ + 72df48c5-ede3-4d36-88a6-4f7c3f05bbc0)(content(Whitespace\" \ \"))))(Tile((id \ - 0303d18b-9631-4ca4-b117-9df27d062054)(label(if then \ + 08ce9728-806d-4799-86b2-cec936d7b724)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6726b7da-295b-4212-8160-54a77aa4d11a)(content(Whitespace\" \ + eb6407fc-cac1-4d17-b1ac-a87124748e15)(content(Whitespace\" \ \"))))(Tile((id \ - 6530360e-011c-40e8-b8f8-1fd1ab700226)(label(!))(mold((out \ + 99488360-a751-4ebe-bd51-da73cecd770b)(label(!))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 5))(sort Exp))))))(shards(0))(children())))(Tile((id \ - d922f3e5-20e2-47dd-922c-6d2f3c555026)(label(true))(mold((out \ + e8c90ed6-9e07-4b2b-80aa-dfcc2591b11c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0e1f90e3-a641-45f5-bce0-926433cbf3d0)(content(Whitespace\" \ + 74a49966-828c-4ee2-8abe-5d50ddd0f816)(content(Whitespace\" \ \")))))((Secondary((id \ - 7a758eba-6b55-4bcd-b5ca-1694e1ff04c6)(content(Whitespace\" \ + d76456b6-983c-4bf6-a591-d30167634307)(content(Whitespace\" \ \"))))(Tile((id \ - 68ba51a5-2d7d-4c02-81b6-f98ee67a324b)(label(1))(mold((out \ + 39d7350a-fad2-4048-ab55-4a6bcf78b5d7)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 24bedb15-a7a7-4367-9ebe-7fe55b09e9bc)(content(Whitespace\" \ + 036fca0c-cc24-442a-bb79-f8a76975e9dc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 67b81047-852f-4b43-8581-3dead7738240)(content(Whitespace\" \ + 9c712520-1325-4b0f-9551-8740873b3b96)(content(Whitespace\" \ \"))))(Tile((id \ - 19a42349-5e06-45f3-bb62-7c6e676fa1f7)(label(2))(mold((out \ + e17a8ab2-d913-494c-9f80-85868b9ea5d2)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5ba94d8a-e2c9-4d57-98f2-df320ffa814f)(content(Whitespace\" \ + d7cb4619-aea8-4227-a997-b08c21c8d626)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 29e76402-83ac-43b0-b8e3-b58e3ddb8b2f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c1ba26c7-fa67-4d0f-8af5-845b393a1d01)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5e0cb0fe-7ca1-4a51-b1bb-0adeb619b595)(content(Comment\"# \ + 87b2d482-0fe0-41da-8657-bb5db1248a64)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 00bfc7e6-a40c-45dc-a0a2-d8e4d79de409)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + db692335-2da9-453c-8d83-8d8d5f9385d3)(content(Comment\"# \ Integers #\"))))(Secondary((id \ - e3ab45c2-677e-4bd1-a3ce-4a6d8ca497bd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9396ec12-ef33-4f02-81ca-5c575df7966b)(label(let = \ + d5929d56-5152-4fa9-b5a8-09b61a7a775e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2ee43354-5a87-4b29-affd-274cb6db490d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1cb2441a-e677-4286-9422-ff0b2f3fdfeb)(content(Whitespace\" \ + 439deb1b-ea83-4bf3-b264-152e5b1be070)(content(Whitespace\" \ \"))))(Tile((id \ - 9991cb5c-16db-490b-baf7-5d588fd0cd04)(label(int_literal))(mold((out \ + c06f0a2f-c0bb-4743-8af9-f0a2977ba8f7)(label(num))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 420b868b-9936-4f98-9e8c-a89830ef1f2c)(label(:))(mold((out \ + 49cacd53-1c79-4179-9536-ea456a667d37)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 34a762f3-be6c-4a53-8a63-7ccca601cba3)(content(Whitespace\" \ + ac424f0a-f84b-4d7d-a6e8-77dc81deb04d)(content(Whitespace\" \ \"))))(Tile((id \ - f1ea8a48-ea29-4fcf-b00c-f318453c2413)(label(Int))(mold((out \ + e6c1c55e-0478-4461-9d34-1ebf05c07acb)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 44be4ae5-db37-4561-86c4-a906dceed0ac)(content(Whitespace\" \ + 65e9d9cd-7810-4cba-b9b1-95dd1dfebd2c)(content(Whitespace\" \ \")))))((Secondary((id \ - 76831265-2bd2-44ae-92ac-b00b22c3ed81)(content(Whitespace\" \ + d3408be6-6313-46fe-9e11-4d5682b0abc8)(content(Whitespace\" \ \"))))(Tile((id \ - 82ccf1fd-40a4-427d-b7d1-f13eb124edf5)(label(1))(mold((out \ + 12b35c73-b944-4e1c-aaf8-a12c14ab26cc)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 208958e8-8677-4bce-842f-201880b359fe)(content(Whitespace\" \ + a0c718c2-f1e8-4550-a46c-c3af1b01dcf8)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cb0e7d7c-e2cb-40d5-bd38-3ae797539b76)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8b7c80aa-a3e2-4560-be6b-c833c729a696)(label(let = \ + 3d9fd1c8-d383-44f0-8c73-6327a3dd593b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f7d9e3e3-ab35-42ff-b327-d3165d112f44)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7e1ca287-c772-4db4-80e1-819783d1776e)(content(Whitespace\" \ + 370a1707-f974-4471-ad01-53c15a51459c)(content(Whitespace\" \ \"))))(Tile((id \ - f9ebacb2-2597-4363-a002-a676d119daa8)(label(int_negation))(mold((out \ + 10c3cde8-a387-4dbc-8bdc-c7335b2dd3d4)(label(arithmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7894176b-e88f-461d-9d93-e90f0ebbb004)(content(Whitespace\" \ + bb6a3e2f-4ec1-4888-a72d-65839912a015)(content(Whitespace\" \ \")))))((Secondary((id \ - 206d3b4d-6d82-4a3d-b3c5-8b2b684527c1)(content(Whitespace\" \ + add81fee-d897-4686-8daa-e372a077fd16)(content(Whitespace\" \ \"))))(Tile((id \ - 8dd733e2-2c01-41f7-b99e-4485382640f8)(label(-))(mold((out \ + 7b908257-3193-4fe6-a319-8dc42851edc9)(label(-))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape(Concave \ 3))(sort Exp))))))(shards(0))(children())))(Tile((id \ - ea980e62-6d82-4dfd-be17-103774bfd056)(label(int_literal))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ccdeca29-9665-4fe7-9478-8bac111d093d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 1a638419-a6d5-4e20-9ef5-3f84c3e5e393)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 155f4090-d116-47a1-b89e-4d6ea129c555)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 5e1f3677-1dca-431b-aca0-17d6fea58f1f)(content(Whitespace\" \ - \"))))(Tile((id \ - 491f9f4e-96a6-4b5a-919b-0c53e4a223b3)(label(int_arithmetic))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 13cae4d5-4d15-446d-b4b5-3d8e670405da)(content(Whitespace\" \ - \")))))((Secondary((id \ - ed25c10f-4dfe-48c9-a365-e43bc2cab313)(content(Whitespace\" \ - \"))))(Tile((id \ - cc9fdb45-57a2-453d-9bf0-d4faf4fd1b8d)(label(0))(mold((out \ + 63e1e659-e5dc-4a48-a3b7-578a6f9aa4bb)(label(num))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 66b5a5f0-56a5-4929-bcb6-7e174c6f449a)(label(*))(mold((out \ + 4a4b80f8-e752-4066-af5f-bc325cb65353)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 2a96d1c9-3291-4cd7-a82d-792f93a8871c)(label(1))(mold((out \ + af8121bf-0bd3-4718-b2da-f09ce8d6fe71)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c02998a8-b8a3-45f5-a21c-99d582030c1e)(content(Whitespace\" \ + c90acfd8-94da-40b5-9e2c-9a5b775d02f8)(content(Whitespace\" \ \"))))(Tile((id \ - 55dc2548-7322-4151-b170-4b422770f6fb)(label(+))(mold((out \ + 8b787f3c-3b04-4793-9500-521fcf9c3bbd)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4af04b41-15d5-440c-853f-f6b3736277bc)(content(Whitespace\" \ + 6ae3441c-c4d2-4af8-8f07-2431b61c0e53)(content(Whitespace\" \ \"))))(Tile((id \ - 9099be7a-56cf-43cb-ab53-94b49679e21f)(label(2))(mold((out \ + a55a0ad1-4e53-43e9-a5c5-7c4692023c06)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 73f1e0de-00bd-4b18-88da-b8ce1bacc240)(label(/))(mold((out \ + e34774e7-2eff-4188-ac7e-dd56a9865f2f)(label(/))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 8b7d1d1a-0d20-48e9-bd27-58b93e965b3d)(label(3))(mold((out \ + 2141ebeb-b5f8-4c84-81a8-9fc1bc9bb468)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b9a543a2-aa15-40f1-8142-76636c926443)(content(Whitespace\" \ + 2a58a337-583a-4ae7-856e-1298f2221f23)(content(Whitespace\" \ \"))))(Tile((id \ - fe98a704-6743-4a6c-8f44-86371881beb6)(label(-))(mold((out \ + 9e0c0f6d-7c89-4253-a780-4dd00cc01bb2)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9a1a3d40-2520-498c-a1c2-98f9208eea45)(content(Whitespace\" \ + ac829f53-e389-4c76-aac7-a6bc4521dce1)(content(Whitespace\" \ \"))))(Tile((id \ - c4f98272-e8aa-45a4-92fb-b91c57d1e4fd)(label(4))(mold((out \ + f0a8d07d-2e23-424e-ac62-add879fda463)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5dc8ea2f-0f3a-4f04-bfd3-9e9e40130a2d)(label(**))(mold((out \ + 0a8bec70-51af-49e7-b01d-49f12187888c)(label(**))(mold((out \ Exp)(in_())(nibs(((shape(Concave 4))(sort \ Exp))((shape(Concave 4))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 8eaaa137-93c0-499a-babb-2b244d8bd484)(label(5))(mold((out \ + 0726086f-7a14-491f-8ef3-a98c793355c1)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d4d14a4a-8335-4909-8c28-85dcbcd2d370)(content(Whitespace\" \ + 56ac432b-a475-4143-8deb-3c802cb61e79)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c6feb110-e1bb-466b-a557-533434561ceb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b72beb29-607d-4ab8-b628-8edf406791ad)(label(let = \ + afa2800a-456e-45b8-8ade-ac89cae119c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 67cfed8a-71b4-468d-9a40-10e622baeae4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f3d270bf-10a7-49ca-b07c-7b0a46cdf028)(content(Whitespace\" \ + d20cde2f-7764-4e4a-8b69-85e9143e18ca)(content(Whitespace\" \ \"))))(Tile((id \ - 5c825d3c-e03a-4f9c-8882-abf26c0eb2c0)(label(int_comparison))(mold((out \ + b54ad57c-e7e7-42b7-a4dd-0eb7e3a78c7a)(label(comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e0572717-5492-4b74-a9c4-8ba9a8c593c3)(content(Whitespace\" \ + bfd84f89-3580-4d24-b3f6-9e18c82dc7e3)(content(Whitespace\" \ \")))))((Secondary((id \ - d4e0a7c7-aa78-412c-b03b-b28c58d17003)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 62032269-5f26-4c5f-a414-1892878fb641)(label(\"(\"\")\"))(mold((out \ + 18aa7b2d-5114-4444-93e3-fb98c2d70925)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c0e64e79-b6e8-4aff-b930-821a7680b5b8)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c2f9e5d6-d8c1-49fc-b9de-9d826c311798)(label(0))(mold((out \ + b9e594a3-27df-4970-994b-1fb15fab71a9)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 339fa799-7728-4eff-9255-75e750a1d340)(content(Whitespace\" \ + 9bf620d3-7002-458d-a87e-551bc17fb939)(content(Whitespace\" \ \"))))(Tile((id \ - 4d8ebcab-2ca3-41d7-aee1-09a0a77f05fd)(label(==))(mold((out \ + 46a00500-b0a0-44b0-bb50-acd3115e022b)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 229b1f48-0eef-43cc-8121-3e6803ccf0f4)(content(Whitespace\" \ + bcff099b-bc57-47e2-87c8-7e2ac1f797d1)(content(Whitespace\" \ \"))))(Tile((id \ - 50481612-12f2-46d3-b2d5-2e1400f733a3)(label(0))(mold((out \ + 1538c179-4c5a-4d9e-8f6d-a113f592dd2c)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4d9ed71a-30cf-4fd4-a641-323d02b39b0a)(label(,))(mold((out \ + a3fd653d-def4-454c-85d3-adf0e265333c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fc07f2a7-cbfb-426d-ae9b-a899e37349f2)(content(Whitespace\" \ + 95e52a5d-d787-4adc-8a00-78697ae11fb5)(content(Whitespace\" \ \"))))(Tile((id \ - cc69871a-9dee-45c1-a77b-06940159fbef)(label(0))(mold((out \ + db6c5457-4fcc-47d4-a115-ac0dd1bd3d27)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a81877f1-0706-4355-a2be-f73a8ae35c5c)(content(Whitespace\" \ + 9b7f2769-a4f4-480f-a960-227f34d6ef84)(content(Whitespace\" \ \"))))(Tile((id \ - 8baa9216-b73c-462b-97c0-e007b640c29b)(label(<))(mold((out \ + 532687fd-3c26-4980-8835-9c39080651c4)(label(<))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b9c2dc9c-2b5b-4dea-84b4-5aacba1f2e13)(content(Whitespace\" \ + 7aec5c90-1e95-4417-909a-9e760bd2f0d6)(content(Whitespace\" \ \"))))(Tile((id \ - c00528ff-d666-41a3-94aa-e00c92fc2ac6)(label(1))(mold((out \ + 15bfec28-bb2b-4931-983e-65a3f6d78335)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 39560303-1b8b-4b84-b793-8058db5d5267)(label(,))(mold((out \ + 0d4f5aa9-446b-4df3-8ad0-efcb9ed6d43d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 91151128-546c-4d8e-8436-3030e43bb956)(content(Whitespace\" \ + 4c859efb-cd1a-49c6-a761-83df8564584a)(content(Whitespace\" \ \"))))(Tile((id \ - 9692db25-4c4d-4ac9-aeeb-bd1a35710121)(label(1))(mold((out \ + f27f6443-139a-48a4-ab90-aeddb1d6a0ac)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 593aedf0-8172-43d8-8f93-e4d99854451c)(content(Whitespace\" \ + c3ea5990-07f3-4252-b1ac-c18a2abf404c)(content(Whitespace\" \ \"))))(Tile((id \ - f0b044bc-8011-41e9-bf5e-5a1b5661d318)(label(<=))(mold((out \ + 5bc55547-74df-48b1-be82-a897f613864b)(label(<=))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 80ab1291-e199-4ba7-b299-d2cb2ed0e10d)(content(Whitespace\" \ + fbce905d-9795-414d-a346-30707205595b)(content(Whitespace\" \ \"))))(Tile((id \ - 15ab2436-825a-4bbb-b84e-91c1bef056c0)(label(1))(mold((out \ + c2d9e95a-47e5-48a9-a3c4-6365843b573f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 69339a67-19c5-486c-adbd-75d12fd7dc3c)(label(,))(mold((out \ + abe3ccb5-e969-48f0-a91d-f7bdfd42d1a6)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 67043910-c17d-4c1b-bda7-04cbc416a535)(content(Whitespace\" \ + 8502339b-b4ff-4ae6-ab9a-44a0665acd1e)(content(Whitespace\" \ \"))))(Tile((id \ - 29771d39-43fa-4b80-afc7-735d74b594de)(label(2))(mold((out \ + e422a8bb-f00d-4fd5-ab73-510e80bd2ef8)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dca85870-9dee-45a4-bc20-6756d84a8b14)(content(Whitespace\" \ + 2103a43c-fe68-43c2-a9b8-daca802dc5b7)(content(Whitespace\" \ \"))))(Tile((id \ - d6a8e149-d3e5-4f16-a175-3a5528444584)(label(>))(mold((out \ + 8727b24d-e401-4c93-9fb3-9cbdb33e546f)(label(>))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7596fa7a-ffd1-426e-9d45-b1b637e7fba6)(content(Whitespace\" \ + b6d3ac09-ea97-486a-befa-3ccb1350e292)(content(Whitespace\" \ \"))))(Tile((id \ - d0208682-2d4b-4b50-92ec-ac35899e511d)(label(1))(mold((out \ + d33f76ac-74d5-482f-8a13-bd0fbc3ada7d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 79f2d6e4-dfc1-422d-9c82-7f75d844d0a4)(label(,))(mold((out \ + c7352d51-6de0-4dcf-9b1f-b5333afcebfb)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f2b4d97d-c628-4691-969c-0c8955bc693b)(content(Whitespace\" \ + e604bf9a-45f4-47ee-bd65-49236fac2657)(content(Whitespace\" \ \"))))(Tile((id \ - adfc1f57-88cb-4291-81cb-0f6ea32b827e)(label(1))(mold((out \ + 11b44299-7253-43c4-a3b2-13e0702ee3a8)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 85e42d8d-c6a0-4018-be01-b3bf1d1a4659)(content(Whitespace\" \ + 9bd223df-24dd-4148-83a9-35f8f98aa5b7)(content(Whitespace\" \ \"))))(Tile((id \ - 55adba71-6687-4bc5-b9a0-74384e635fcb)(label(>=))(mold((out \ + 3987079a-97a4-4654-9834-846e580b9be3)(label(>=))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ca61a6b5-f37c-4ebb-b0da-bf157456d368)(content(Whitespace\" \ + b7a67628-3395-403a-b804-c6d95223edeb)(content(Whitespace\" \ \"))))(Tile((id \ - 5953648a-b797-49a9-9f08-886a517667b8)(label(1))(mold((out \ + e7ace599-d74c-4d41-970b-685073e200bf)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 79ffdf93-f09c-4a06-ab35-168ae341c602)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 3117c02e-5fc3-4d7a-8101-e19ecf28ff22)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d9edc580-dc69-46d2-ad32-ffef5beb985a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7f9b37b5-20cd-460b-8d98-4ebdd86416f5)(content(Comment\"# \ + 2f41fc2b-7b14-484e-afde-b95fa75a6bec)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + ef01b24c-9a6f-49a5-b0e7-3615f0e3cc2b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b93b0489-0324-44cf-936b-b6b91f49eccb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f99bca73-dc35-4521-90a6-0f5b30ffa006)(content(Comment\"# \ Floating Point Numbers #\"))))(Secondary((id \ - b8b571cb-8cb0-4b07-ad12-efc8d6a515b3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8a82322c-eb18-49dd-a09b-ce211550c7fe)(label(let = \ + 0821624f-4bb7-4625-8572-61c2cd6c5555)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc05419b-f6e6-45bb-b594-c0d01792ee6f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 575fca78-61a8-4940-8d1e-1b414cce6ad9)(content(Whitespace\" \ + 13823135-b606-4d32-ba81-c92ab5ded95f)(content(Whitespace\" \ \"))))(Tile((id \ - ac47b842-19df-4a98-a55f-7484e8cec666)(label(float_literal))(mold((out \ + d21f988e-16b2-457a-b29f-08f5a566e941)(label(float))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2571ad04-0bb4-486d-afb9-2016124fa962)(label(:))(mold((out \ + 8983fa43-0fb1-4284-aea7-5c7c4a7e1d23)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 117ff930-ee1d-4b34-a8bb-7784b7b0052d)(content(Whitespace\" \ + 1c53851b-f375-4f16-80e8-68a6bd2838bf)(content(Whitespace\" \ \"))))(Tile((id \ - 7f694343-b027-4331-8fe7-78c81436948b)(label(Float))(mold((out \ + 01eb14d2-34d2-4217-85e7-9de873368c3e)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 84f88e27-4c61-4e92-a9de-bd5828cc21fc)(content(Whitespace\" \ + d169bf83-037d-4e23-ab56-80d6aa82de7c)(content(Whitespace\" \ \")))))((Secondary((id \ - 01bbd90b-f3bf-4722-8423-ef466ceda13c)(content(Whitespace\" \ + 2b16fb1c-ccb5-4f2c-9527-085973fe5dc1)(content(Whitespace\" \ \"))))(Tile((id \ - 7521c074-1e04-4467-9650-9f884c1033e3)(label(0.1))(mold((out \ + 31e1e065-f73f-4757-a774-2ccb5484e7c6)(label(0.1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - adc9a045-ed56-4e32-ab87-b6a7064c3dd7)(content(Whitespace\" \ + cd22716e-7276-4d73-9106-19672bf61fbe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 97c54af8-ebb3-4ea5-b498-48bf59d30785)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 76a6d873-c4c3-4d01-8cae-14808d2c0bec)(label(let = \ + 3325ac2a-10aa-48ed-98bd-f82aa4dcbca5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1dbcf2b2-18b1-484d-ad46-0559d76973d1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 600dfb53-ecb2-4b72-80fc-56dd9a18c4e3)(content(Whitespace\" \ + 83b96b78-ec90-4e38-8693-5f8e5fb7eb75)(content(Whitespace\" \ \"))))(Tile((id \ - 1cf88027-656d-42db-9d9b-487fdca2aa99)(label(float_artihmetic))(mold((out \ + 6321257a-f90d-492b-a265-7bcd9bdffa0d)(label(artihmetic))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f3c861e8-5f44-4fc7-b9f7-9dee56cc5a22)(content(Whitespace\" \ + 46587eb0-bbd2-42af-abe4-0c8bff3b60ef)(content(Whitespace\" \ \")))))((Secondary((id \ - 181ea8da-df0d-4fec-9506-692894194143)(content(Whitespace\" \ + f23a0a37-10f0-45e1-950d-44fd2edeb380)(content(Whitespace\" \ \"))))(Tile((id \ - f30ab82c-0132-4ea5-81a5-9b93d4502b6d)(label(0.))(mold((out \ + f644e812-7c13-4426-963b-f005de867ecc)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 392863eb-a1d9-463b-b923-32f0c4001bea)(content(Whitespace\" \ + 7b02ad96-8bad-4413-8d6d-ab2fd5a7e17b)(content(Whitespace\" \ \"))))(Tile((id \ - c1e17368-90be-4cad-9f21-7152505de93c)(label(*.))(mold((out \ + 355b0833-ab8c-4edd-bff6-8518907c22cd)(label(*.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d16aacf9-3cd5-49a5-9bda-8adf1f412daf)(content(Whitespace\" \ + b25e556e-274e-47f1-8310-4849a056e518)(content(Whitespace\" \ \"))))(Tile((id \ - d907df40-2b4b-4f41-a291-2c07dd2b4770)(label(1.))(mold((out \ + d79cbf18-d23f-4fee-8174-29b3028a0d46)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4ec35692-99fd-40c3-aea8-5e2efc0b320d)(content(Whitespace\" \ + 6b69eed5-87d1-4654-98eb-fe230c2040f9)(content(Whitespace\" \ \"))))(Tile((id \ - 6702d774-546e-45e5-bb45-c3204871e563)(label(+.))(mold((out \ + a2cad8cf-2ea9-4364-b579-2aba1e468a1d)(label(+.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 081eca38-9b19-4ff7-b321-266707b62dac)(content(Whitespace\" \ + 85c01937-88d5-4c81-a48b-a13030714066)(content(Whitespace\" \ \"))))(Tile((id \ - 814513b7-0d32-4583-be98-c907fe6484c6)(label(2.))(mold((out \ + 791afca7-a276-4075-a208-938465998d30)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c0479a6c-b629-4342-a139-c3d3452c9c44)(content(Whitespace\" \ + de205ef2-9030-4622-873f-4adea5fb280a)(content(Whitespace\" \ \"))))(Tile((id \ - cfbcda5d-fbd8-446e-8bdf-32a2e5997846)(label(/.))(mold((out \ + 8f5ac2d7-1b56-4b35-a112-c3d07ed83358)(label(/.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2097ebb1-efc4-485e-9364-537e37500537)(content(Whitespace\" \ + d8a6ea61-5667-4c1e-bcbd-905aa1fc3cc7)(content(Whitespace\" \ \"))))(Tile((id \ - 08a289d3-b7e4-4ffb-8815-b6c7abe288a9)(label(3.))(mold((out \ + 1103b397-9632-412a-b3f4-e313fd6ea093)(label(3.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4d45acc0-d1c3-4386-99bc-db5d41514d1f)(content(Whitespace\" \ + 15f66c43-a176-4fa9-ab44-904e93e3b9cf)(content(Whitespace\" \ \"))))(Tile((id \ - 1c2c845a-8450-4c86-a4bf-c0b0dc78be82)(label(-.))(mold((out \ + 44142ee6-aee1-4668-91c7-ef3e2546ba89)(label(-.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 71ac633f-c4e0-4b42-bdee-e091602dfcdf)(content(Whitespace\" \ + 7b70d271-3954-4093-9ba7-8ee026fee97e)(content(Whitespace\" \ \"))))(Tile((id \ - b4ce92c0-084e-4a5e-8ea2-1677d2c9ac55)(label(4.))(mold((out \ + b017e83b-9d10-4355-ac4a-158ba41caf9a)(label(4.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0f3cf883-5872-41ab-b9f6-a9fb06afe76b)(content(Whitespace\" \ + 1f95a4c2-3183-443e-9561-484d354de6d0)(content(Whitespace\" \ \"))))(Tile((id \ - 16d0d409-5b0b-4e5d-8ce9-6657b72664f9)(label(**.))(mold((out \ + 7065311e-979d-4149-8561-d67f6788fddc)(label(**.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 4))(sort \ Exp))((shape(Concave 4))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2487f3ce-0dfa-488c-9591-d4b339b693b2)(content(Whitespace\" \ + e1ab1003-1ce1-4c80-9744-7bc57329348e)(content(Whitespace\" \ \"))))(Tile((id \ - 4c6dedad-d00d-41da-b46b-5b744f2389cb)(label(5.))(mold((out \ + ad518ede-171f-4e43-b585-58c9ef4a00d4)(label(5.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 66b8d67f-8e9f-476c-99f4-1bb7982b6068)(content(Whitespace\" \ + 6cadbc9e-e63e-45d3-8e7a-5ba4bdae2d43)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cabd7f96-ad32-496b-9c94-ecbb25e0e1f7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5bb9c199-cf94-41e8-932e-d883acf18478)(label(let = \ + 014944b6-a026-431a-9833-50d1bf2637d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4be7cf94-18ab-4404-84eb-f72e44488e97)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d504e6d0-e6f0-48bf-b054-62f8ebdd889c)(content(Whitespace\" \ + 2a3e64f6-0203-459a-ac6c-668f1a5ba0fd)(content(Whitespace\" \ \"))))(Tile((id \ - d724f010-7866-49c7-a3e6-034a4c654e5c)(label(float_comparison))(mold((out \ + 1e7f01e8-7a3d-492a-a451-6f3d6baaa37a)(label(comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9efc3aa5-881b-4d0b-a7dd-2f2a16338a57)(content(Whitespace\" \ + c84a5659-ccdb-4bc5-994a-8bd2ee1ee3bf)(content(Whitespace\" \ \")))))((Secondary((id \ - a2a58c49-ff08-4896-8f7f-c01b7c07a43a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bc47d88d-e183-4630-b9b9-23cf93735b2b)(label(\"(\"\")\"))(mold((out \ + 453d85df-50d8-4c21-806d-4ec6747ded42)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8caef13c-2544-4f22-986e-4b1f9b7c04e2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bc9c3842-6db2-410e-9493-e5164b89a90e)(label(0.))(mold((out \ + 0c567b59-bbbf-4e53-9894-f92529dea19d)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 43a4cdc9-2d36-452f-b233-a75291ff70db)(content(Whitespace\" \ + ddee6b7b-4ebc-440c-8d20-9c04289545b5)(content(Whitespace\" \ \"))))(Tile((id \ - e8d7e802-a7ef-4572-a175-1074592a187c)(label(==.))(mold((out \ + 87bda52e-196e-48e3-9920-a351d25bc685)(label(==.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 708ba35f-4db7-456c-847b-e0b56cbd7e53)(content(Whitespace\" \ + 1745a4a9-3df2-4b00-bef1-75cd4a8922a9)(content(Whitespace\" \ \"))))(Tile((id \ - 0b3707b7-59a3-4b48-8b72-8b41e2d32820)(label(0.))(mold((out \ + 92829fa8-ca72-49c7-a7e4-df06797b701f)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b33bea76-6c53-4d04-b422-2d6460306c03)(label(,))(mold((out \ + cfb8c6d3-7006-4094-b02b-929734fcda71)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2028eb1d-82bc-491e-9ba9-a323d1740b91)(content(Whitespace\" \ + 47cbe345-3b7c-4a9f-8486-9544438e28ac)(content(Whitespace\" \ \"))))(Tile((id \ - 632564b3-9301-4d27-a56c-e731fb165b48)(label(0.))(mold((out \ + f7d0191e-7ca4-4a6f-80c0-354a9e6b6321)(label(0.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8d8a426c-ce69-4be3-bade-edebd5248618)(content(Whitespace\" \ + 68220915-a67e-4f3e-910f-010fe3e094c7)(content(Whitespace\" \ \"))))(Tile((id \ - b5321f93-642c-4308-a4f5-df4b49bc0df1)(label(<.))(mold((out \ + 9a95aa66-4869-4b1b-99fe-66bc07582ed5)(label(<.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 61b044ab-4f4d-477e-9632-4f99071f93e8)(content(Whitespace\" \ + 396f4584-d645-4d50-a8e3-cb71be5322f7)(content(Whitespace\" \ \"))))(Tile((id \ - 71201312-7efb-4281-ba91-391d0b744f4c)(label(1.))(mold((out \ + b072ee01-8262-4a6f-88e0-62d16f2352ae)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5ef5c78b-1212-416b-94c1-4b49d5f9a08e)(label(,))(mold((out \ + 4941ca2b-64e7-4a3c-a9ce-8034737c764c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - dc89d14b-14ce-4b79-aefb-43c9eeb1a128)(content(Whitespace\" \ + 6250a21c-bd78-4fb4-80a8-1badbf862930)(content(Whitespace\" \ \"))))(Tile((id \ - d8500152-212b-4025-a4d7-e336f274451a)(label(1.))(mold((out \ + d8f937b9-3259-4ac5-bc11-d274a3a7ef24)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 868162d0-7fc7-4832-a90b-1437db77e0b7)(content(Whitespace\" \ + 60d119a8-2fed-45d3-8401-35011a60b25e)(content(Whitespace\" \ \"))))(Tile((id \ - 33446b75-7fe0-4d7b-902f-af6d941d5e21)(label(<=.))(mold((out \ + db5a2cbf-be92-4618-b958-c03957039a55)(label(<=.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1bd7585d-a5d7-4d71-b9bf-30be366d6334)(content(Whitespace\" \ + f859d205-9cd1-4d8d-a0c0-338bbab31756)(content(Whitespace\" \ \"))))(Tile((id \ - 13316a4e-9c03-449f-a41e-8ff6d1b3ace7)(label(1.))(mold((out \ + 501ce284-77aa-4094-be09-cb3db298e0ae)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 57d06fff-a1ae-4d0d-9acc-9511f295a89f)(label(,))(mold((out \ + 8a18e903-f7cd-4d96-b054-eea877cfe2b9)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cfb24e7b-eb23-4b90-8bbb-a681dd8234a1)(content(Whitespace\" \ + 40656805-7cc3-4ec3-8971-2741e02c467d)(content(Whitespace\" \ \"))))(Tile((id \ - 18676db8-7c8e-4145-9209-7b7b860fb265)(label(2.))(mold((out \ + 006124eb-7975-4c3c-a3e4-feb99b1f4b5b)(label(2.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3290432f-3624-4e81-8cef-f0064486be66)(content(Whitespace\" \ + 33bcc229-ddbe-4612-a774-20848a32b1f6)(content(Whitespace\" \ \"))))(Tile((id \ - c5690382-7e3b-4e33-b87f-deeac0a8a08a)(label(>.))(mold((out \ + 8b609d98-5b87-4555-9478-90b78228ffbc)(label(>.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e7edc52a-4926-44d9-a508-38fd3ba42949)(content(Whitespace\" \ + 920342d8-b223-470f-b290-85b50419a87d)(content(Whitespace\" \ \"))))(Tile((id \ - 45d14db0-242c-4cc6-b36e-c1f638672c96)(label(1.))(mold((out \ + af1f3447-7655-41b8-b6c8-4557007f9347)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1388157b-3b50-45af-ba42-efd4566c611c)(label(,))(mold((out \ + 394d8cbf-962c-4e85-9b5e-ddc952656ff8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8afcd4f2-d1d7-469f-a7a9-1cce52bf57b9)(content(Whitespace\" \ + 3af7a9be-1ac3-45da-b914-78364868785c)(content(Whitespace\" \ \"))))(Tile((id \ - 8337b04a-6155-4d42-bdcc-9fa835068cde)(label(1.))(mold((out \ + 4558bbbd-f1f1-419e-920b-04a983a5d9f5)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4f50c520-c2ba-448d-9af2-7219798a59d9)(content(Whitespace\" \ + c284c863-2fbe-4910-9708-d9f7f00855c6)(content(Whitespace\" \ \"))))(Tile((id \ - adb37a00-651d-4bf4-98a7-abbe3764bce8)(label(>=.))(mold((out \ + 4243e5e2-90b4-4175-8a7d-86758fc2fbcf)(label(>=.))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b152ba44-ab21-459e-9612-8ec886dab1e9)(content(Whitespace\" \ + 5e2949bf-9807-4496-8a1e-ab2cbd0b9821)(content(Whitespace\" \ \"))))(Tile((id \ - 4b4d12ba-8757-4ddd-9cc2-b98aa45a90f6)(label(1.))(mold((out \ + aeda4598-c9c9-467f-b705-33cded65fc09)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f5fb67a4-d077-4a8c-8697-52bef3b9460e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 54af4100-094f-465b-80d8-df7c7b38a624)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 05d96dc0-56e7-4ae5-84dc-ad939e394490)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 505c312b-b8c0-4b5e-acbb-7f8232cbde59)(content(Comment\"# \ + 96ac3b66-70e2-4685-9995-7aea15ebf27a)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 6d024d4c-1e95-48ac-9489-ad4fe34cc939)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d6ddc059-b836-43ef-867a-822f89660a1e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 360a8745-d4c4-447f-8996-bdcf55babeae)(content(Comment\"# \ Strings #\"))))(Secondary((id \ - ab67f534-05b4-41b6-a42f-472055a95090)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e9fa826a-f697-4db4-b816-f8a807827806)(label(let = \ + ba5ba924-6cb2-4da9-8af4-fab6f9137a14)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + da10885e-08f8-4c19-b55a-79eb109aa795)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3b51cb8c-03b9-427b-a56c-e67ee93fca5b)(content(Whitespace\" \ + 145551d9-3039-4d4a-9104-aebed6daeb86)(content(Whitespace\" \ \"))))(Tile((id \ - 0b57487c-41f1-4109-a79e-ad51a9016fd2)(label(string_lit))(mold((out \ + 12aac804-f389-4869-9582-34006a225352)(label(string))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f6ab39f4-9eee-43cb-a757-981c074c4315)(content(Whitespace\" \ + 387cce83-54f2-4082-b506-8d3f7a89fc26)(content(Whitespace\" \ \")))))((Secondary((id \ - c6dc0dcf-6e03-4ff8-8f9e-2743f4a404cd)(content(Whitespace\" \ + 780aae27-28e7-48e1-84e0-4019dafe35a8)(content(Whitespace\" \ \"))))(Tile((id \ - 8267f843-78e0-4038-b4aa-8cf4ba98f5b3)(label(\"\\\"Hello, \ + 280a6316-f3f1-4b69-82ff-ccad896afc46)(label(\"\\\"Hello, \ world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b3113855-8eea-4d03-90af-b83c08863e77)(content(Whitespace\" \ + eb76e4f0-bb20-4227-9aa4-16da810a3bd4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9ef2276b-76ba-462e-b8d4-fb379c45bdb6)(content(Whitespace\" \ + 6ecd17dd-7ed4-495a-a426-d09a0f002cf9)(content(Whitespace\" \ \"))))(Secondary((id \ - 836ebd53-7512-4eee-b628-bd080b44e717)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7d0e10a5-2f81-4809-9efb-9885e173872c)(label(let = \ + 37bbe444-2c55-4ec3-811a-f73360ad9861)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 89e544d2-a803-45fe-981e-d2c83826176a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 9fded58e-a584-4a50-9019-05f21bfcf1fb)(content(Whitespace\" \ + dc41e7a6-05c6-4d2a-9c51-eb06514d69a5)(content(Whitespace\" \ \"))))(Tile((id \ - 90724c25-6331-4caa-808a-aee075c46eb2)(label(string_equality))(mold((out \ + ce874ca2-f847-4bf8-9666-b67fdb4cee20)(label(concatenation))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fb10fa30-3929-42e9-93bd-3cb0e8c643e6)(content(Whitespace\" \ + ddada5d0-b0c4-40eb-8698-04d4fc88966e)(content(Whitespace\" \ + \"))))(Secondary((id \ + 12db9b10-f750-47d7-8f9f-665f35ac0886)(content(Whitespace\" \ \")))))((Secondary((id \ - fb15574e-433b-45a0-abd6-0ff6785bc1d6)(content(Whitespace\" \ + 0a032d0b-82fb-4331-9d71-177f3de87f63)(content(Whitespace\" \ \"))))(Tile((id \ - 669e47f2-eb59-4a70-84f4-f843da7de7c1)(label(string_lit))(mold((out \ + 5ef69200-2eea-4f1b-ab1c-799efcf994dc)(label(string))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5b4f1b93-4e72-4c72-a07f-f2f5aaa87433)(content(Whitespace\" \ + e695a98a-1fc1-41b8-a11b-747cd16120a2)(content(Whitespace\" \ \"))))(Tile((id \ - 696847be-a8fa-4b94-b8c7-d6e6d839b20d)(label($==))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort \ - Exp))((shape(Concave 9))(sort \ + ce9f74f4-ef4e-400d-be4f-a49610b975e1)(label(++))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 6))(sort \ + Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7c23d898-9dc6-4526-bc28-799169e68c3e)(content(Whitespace\" \ + 30c1bca0-8963-4c71-bad6-bfb05145e1a3)(content(Whitespace\" \ \"))))(Tile((id \ - d82379ab-7edf-453c-96fa-0ba5db6f1eec)(label(\"\\\"Hello, \ - world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + 4a2b2389-e304-46d4-b233-aa717d6ffe59)(label(\"\\\" \ + Goodbye.\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2216ff15-0bf3-40c1-8c77-6c87119f0f7c)(content(Whitespace\" \ + 0650ece3-9742-454a-a415-84ad5188d4c2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f0db9ea3-de04-4b9f-b7c0-bdb3baac2b6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2faf9314-3569-45c6-9ec8-a29673e399f0)(label(let = \ + 70460d6e-240b-4801-a966-32f05dc66927)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8ea0da28-7594-4b40-b02c-a9b3da439f00)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 82946363-3bee-457d-882c-4d414226f971)(content(Whitespace\" \ + cff6e430-32b2-479e-b04a-610832b0a7e5)(content(Whitespace\" \ \"))))(Tile((id \ - 734c5736-f9ae-4e51-8c9f-e246b73b5230)(label(string_concatenation))(mold((out \ + cfb19168-cac5-47b3-a4bd-3e936877370e)(label(comparison))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b190c511-cae5-418d-a79e-d736cf714f19)(content(Whitespace\" \ - \"))))(Secondary((id \ - e2db09fd-c637-4d7a-a132-4c1abb8caf6b)(content(Whitespace\" \ + 6e20c420-86b4-4fe9-ac30-0a8cc93d4472)(content(Whitespace\" \ \")))))((Secondary((id \ - 41acdc3d-b19c-4fab-bc5c-7bf8d8f1f650)(content(Whitespace\" \ + 8e8c55a0-9a6d-4aa0-894e-0986d025bf45)(content(Whitespace\" \ \"))))(Tile((id \ - 58256bb7-7215-4520-8f91-0de8cbd80a03)(label(string_lit))(mold((out \ + f9d4c641-9f41-4fdd-8fcf-de155f444c13)(label(string))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 929ff7a3-eaff-4c08-a87b-c92d2cb166bb)(content(Whitespace\" \ + 27de87bd-3db4-438e-bb58-f1ca3e42803a)(content(Whitespace\" \ \"))))(Tile((id \ - ad102f15-f853-439b-bc8f-9255b7c4c458)(label(++))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort \ - Exp))((shape(Concave 6))(sort \ + be3b760b-1797-440a-a8e9-f0d9d1f95d61)(label($==))(mold((out \ + Exp)(in_())(nibs(((shape(Concave 9))(sort \ + Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5cec5d63-79ec-472c-95fb-f0f595626ed7)(content(Whitespace\" \ + 04d3872b-6b0e-4cac-8ae3-87371d860d84)(content(Whitespace\" \ \"))))(Tile((id \ - 7415cc4e-dfe5-4c35-b6ad-ade710ee2fe1)(label(\"\\\" \ - Goodbye.\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ + f17868da-7abd-4611-bc12-a03348bf5485)(label(\"\\\"Hello, \ + world!\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 17695860-85d9-44f0-bf5f-cf9ec6ecc2c9)(content(Whitespace\" \ + 363c4746-0d9e-4096-9ec8-42fcbd95843d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f6ba0272-b704-4d22-bacd-2ed1411d151c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8ab702ff-78f0-4bff-aa19-af07c4cd8e72)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ff9a7e18-0120-4af2-a442-82dea2d8ce95)(content(Comment\"# \ - Tuples (Destructure these with let expresions) \ + b59d3ff7-07e1-42ea-b0d9-d9241efdf846)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f64e3edb-5a38-484e-abf4-be02e780300d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf29ec12-1b79-4615-811b-ada7d3aaadc6)(content(Comment\"# \ + Tuples (Destructured with let expressions) \ #\"))))(Secondary((id \ - d7cd3bb6-71de-4469-9bcf-12621e23a1ca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 58863593-cf0d-457a-8bbd-c61c7e21fd11)(label(let = \ + bc9b2117-9c8c-4daa-97ce-0c9c3dbe5e0a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 669eefa6-bf31-44a9-a4d9-d90cf56174c4)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a165e436-14f9-4021-ab13-9df8150f6aac)(content(Whitespace\" \ + 0190826b-6038-4778-b4d1-8f9cd9cd8056)(content(Whitespace\" \ \"))))(Tile((id \ - 577b05cf-024c-4ed9-8b31-edff260b4a3a)(label(tuples))(mold((out \ + e5a17dac-7a74-4727-ba8e-51089affa068)(label(tuple))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5625f7d8-59c7-42c7-8a29-a0362257b3ac)(content(Whitespace\" \ + 8fd6461e-229c-4b69-84ae-8986c0cbd34a)(content(Whitespace\" \ \"))))(Tile((id \ - aa280e8d-849f-4d5b-b986-c284f21ef91b)(label(:))(mold((out \ + 441ad16b-49f8-4cd2-bdc5-e9778a56e91b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 442c198e-1fff-423b-9085-78d29babfa61)(content(Whitespace\" \ + b108e8bb-ec4f-4062-a8aa-a5daccda1f26)(content(Whitespace\" \ \"))))(Tile((id \ - b715f97b-9bb3-466f-b360-f85adbf2951b)(label(\"(\"\")\"))(mold((out \ + f6c5370c-f297-42e4-83f6-6840e2423338)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 8dff018f-7e5a-4e40-ba5c-8505f4b900b0)(label(Int))(mold((out \ + 596d22de-90b2-4a56-8cd9-9e6684aef986)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 8ccb984c-99a9-496d-96e4-bda03375688f)(label(,))(mold((out \ + 09fe318c-f474-48d9-afc7-a8e50c5f4ab3)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 621f2629-d9fa-41c5-b78a-b883195433f6)(content(Whitespace\" \ + c40f491b-0a24-41e3-9d21-1b700f145c3d)(content(Whitespace\" \ \"))))(Tile((id \ - 9df1dfde-58d7-41c7-8715-b2170f3aa32d)(label(Bool))(mold((out \ + eede841a-cebd-43e0-a667-f6d3442830bb)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - dd372155-f13a-4876-8848-a164c2b606e1)(label(,))(mold((out \ + cc41a9b2-095d-4a99-a0db-30d2d6fdaff1)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0ef4ee1b-cf45-44fa-8939-34d099b3d25e)(content(Whitespace\" \ + 0ed6eed1-a12f-48bb-b9c8-a997f95c18ce)(content(Whitespace\" \ \"))))(Tile((id \ - bd72d5b1-e889-4ed5-b6af-5604db8c4091)(label(\"(\"\")\"))(mold((out \ + a178a426-6048-42f1-898d-dcc5513d0ac8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ac30773a-1df4-4f2a-ae87-4ecdb2d8e70a)(label(Bool))(mold((out \ + f844a300-ad30-407b-b2e5-b5054ea6e0af)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 03a7f4f5-c23f-4193-a90a-08d46e14a527)(label(,))(mold((out \ + 7afffabf-e7d0-4327-bc70-c5f3d6bc0534)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 29857a62-b7f1-4c22-890e-e8652a2777aa)(content(Whitespace\" \ + c6132a3d-f327-4446-8928-a5e3fbfcd38e)(content(Whitespace\" \ \"))))(Tile((id \ - 0aaeeb74-508f-4840-9259-cd14326d9ed8)(label(Int))(mold((out \ + 11f268fc-c74a-40b8-b79b-90efa70d1810)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - b6fd53d0-c6ee-4ff0-b9bd-798a1b14de3a)(content(Whitespace\" \ + 88ca7e9c-7374-457a-900e-5370f1b861e9)(content(Whitespace\" \ \")))))((Secondary((id \ - 57e40c6b-cdab-4b07-b546-57ad105f1705)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8cd245b6-8753-4f90-bc3f-c7a68d5c698e)(label(\"(\"\")\"))(mold((out \ + 52de6db4-54f0-4861-a50c-71f63d46019c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a9a7a2a0-9621-4444-a1f6-185dbe603906)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e992ec5a-f518-40b0-8061-1f80d1fcc106)(label(1))(mold((out \ + 70730b5d-d23d-4b40-a853-23b75c3d5b6c)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a34227c2-963b-427d-a383-aa082ac0c5c8)(label(,))(mold((out \ + bec5dc7a-3f33-4c64-b711-320d0d754959)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 32fc8f63-5a40-4262-b68b-2f8758501a60)(content(Whitespace\" \ + 6788600b-82fb-4cb0-9cb7-63de6dfcff1c)(content(Whitespace\" \ \"))))(Tile((id \ - c927e79f-1c84-4026-96f6-8116142309cb)(label(true))(mold((out \ + 19cf8238-1cec-4b59-a097-02a6deac86c8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d7e639b9-b502-4a41-a9f9-215e490c4a9e)(label(,))(mold((out \ + a80146bf-da2e-4005-87d4-2b750cba9ac8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7004b69e-6e66-47d1-abd3-54789ab6de2e)(content(Whitespace\" \ + b06cdedf-59c8-4eb9-b58f-aacdbc721791)(content(Whitespace\" \ \"))))(Tile((id \ - fc9cd11b-9446-4191-ac24-e8b24cf5f868)(label(\"(\"\")\"))(mold((out \ + db9a1390-8d67-4bcb-9e20-8b316cbe03cf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7f268778-faba-4bd4-8bc6-abcd75014e39)(label(false))(mold((out \ + f2970132-edbb-456e-a57a-296079d2fa42)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d89b1cb2-a770-403d-8626-75e49f47d6a1)(label(,))(mold((out \ + 29a5124b-4c6b-4395-ba58-776912f000e8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 234e7486-0bdc-48c7-9aae-c860f0c2b095)(content(Whitespace\" \ + 27184aa4-7780-4224-a09d-ed1d106da2ef)(content(Whitespace\" \ \"))))(Tile((id \ - d089512d-fc64-45db-8443-810150ccbfe2)(label(3))(mold((out \ + bee2003d-a7c3-4205-8f41-4b3aada5cb86)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 57ccdfc8-8061-4ee1-941e-e49fdd1b4b9d)(content(Whitespace\" \ + b1b09a8d-d180-4962-8649-8f667695c8d1)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f80c080e-ff86-46da-b371-428de61d6ec9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 72e1ecb2-0150-478f-8418-c5a0e201082f)(label(let = \ + 0815db12-cf68-4138-8cf6-9a3f863b0ea2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 797513f5-605f-4a1c-8b44-4915e56caac3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f712aa69-4773-4ccc-aeba-a2303a3e799c)(content(Whitespace\" \ + 4228eed2-f1a1-4268-a447-1dacfad58324)(content(Whitespace\" \ \"))))(Tile((id \ - 80e88a87-792c-40fc-a7d4-993601038b02)(label(\"(\"\")\"))(mold((out \ + 813dd780-9a9b-4365-85e9-c2432b7b4e36)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 2969f835-8051-46cd-b5fc-5389e36d0fe5)(label(a))(mold((out \ + 56027328-061c-436a-9346-3aa2e57a8669)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 94d006ee-1328-47cb-bd53-4efe6a346e1b)(label(,))(mold((out \ + 563c2ddd-5bdd-496d-879b-4c2809e4f0dd)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 71661bb8-43ab-40db-b81c-582bf13bda34)(content(Whitespace\" \ + d615015c-ee66-4cd1-86e7-90ff99ff5ed4)(content(Whitespace\" \ \"))))(Tile((id \ - ec9ef33e-5f03-4f6b-8b81-c230dbc40db5)(label(b))(mold((out \ + 5376179b-d15b-4bd9-b21d-90aca9720002)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7e23f18c-30f2-4a75-aa8c-35dc78c689ba)(label(,))(mold((out \ + 8573d1ea-d5c1-4be1-b8fc-b53e0ab2d848)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - aa409778-a628-4544-b020-da6d4e5f180e)(content(Whitespace\" \ + ef59adbd-1efd-49e6-8938-aedeeb4aa412)(content(Whitespace\" \ \"))))(Tile((id \ - f7f623ca-82cf-4ee2-a3bc-93806b54baa9)(label(\"(\"\")\"))(mold((out \ + 5e58d42b-892b-4730-809c-0a9770acf65a)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 9dfe686d-a736-4dc6-be0b-3ac654d5a1ea)(label(c))(mold((out \ + 29870657-7564-477f-8e93-c22b2dbc45cc)(label(c))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9e7a35b8-39ae-4cf0-acb3-e5a590fdbedb)(label(,))(mold((out \ + c55554eb-c2c7-43cf-abff-bd7d926f661c)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 09890a96-3acc-474f-bb4e-4842f85aef55)(content(Whitespace\" \ + bc09f949-f333-4211-b405-612205130b42)(content(Whitespace\" \ \"))))(Tile((id \ - b009677a-6608-4c2b-9c2b-b128e63d91a7)(label(d))(mold((out \ + 183145eb-f51c-4249-98d6-052511a739b9)(label(d))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children())))))))))))))(Secondary((id \ - ed277330-23de-4809-a991-15ab00cb04cf)(content(Whitespace\" \ + 7807c475-8ccd-48a5-b58f-9faff0caf415)(content(Whitespace\" \ \")))))((Secondary((id \ - 20d0c61c-5a29-4d92-bbfa-e1e6b02d19aa)(content(Whitespace\" \ + a852f5b2-a3fd-4f45-96c5-5b74fe8b8c93)(content(Whitespace\" \ \"))))(Tile((id \ - 6231abcf-9c70-43e4-98c9-299200ed1265)(label(tuples))(mold((out \ + 9c711c94-6cd9-4e87-9376-9611d69d7484)(label(tuple))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2a5ad763-ac53-407d-a145-74e998f11f9a)(content(Whitespace\" \ + 5e19b822-e674-460c-8c16-347046377c6e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d1faa776-6092-4ee9-af5a-4e7748cf3b31)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8ad44fe8-05a4-474d-9f7c-8e9e8b24df35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 552e3dc5-bf75-45f1-b40a-578460736659)(content(Comment\"# \ + 22c79ffb-dc66-43f6-8527-c6b5b0b72893)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 825dfc98-df6b-4993-adf6-4f75f9d3f8cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 41337b77-186a-4109-94cb-9855b2164d89)(content(Comment\"# \ Functions (Take a single argument which can be a tuple) \ #\"))))(Secondary((id \ - 26d402e6-be96-49e8-9141-a03ee8b80724)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 24bcb8c8-62ca-493f-a39c-ed5e0d96fb77)(label(let = \ + 533eb191-1632-4715-8d59-9d2a8a93c26f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 87f3f9e9-1023-4ab6-94b9-dce2a3fdffc9)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0a923a3c-b147-4c16-88f4-31dd115e4b7e)(content(Whitespace\" \ + d7afbad1-5f48-4cad-a49a-357284990b38)(content(Whitespace\" \ \"))))(Tile((id \ - fbe19f0e-1326-42ab-9888-cdc4acc68d63)(label(y))(mold((out \ + 301d9898-3629-4a4f-92c2-a92f320c309b)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e534a787-6585-45b9-bed9-3bedaef42592)(content(Whitespace\" \ + 68531be9-6c77-4d48-a52f-b205a6506f94)(content(Whitespace\" \ \"))))(Tile((id \ - cf59e7f9-957b-434c-8534-5bd96cc70c2e)(label(:))(mold((out \ + a8804b05-343f-48d1-94ab-25026a402f17)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d33996cf-f17b-4caa-8ae2-654f042dfbc4)(content(Whitespace\" \ + 760cefd8-a14c-4041-8373-2ded4ff77bf6)(content(Whitespace\" \ \"))))(Tile((id \ - a4c93c5f-561f-4e41-a8fe-5878e6c3b2bd)(label(\"(\"\")\"))(mold((out \ + 56d4c283-cc71-4fbd-b0c6-2f08f24c8f42)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 99302602-072e-4faf-b6b7-a379384071c2)(label(Int))(mold((out \ + 7fbf788c-8851-4413-b149-e7c42fbea21a)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 33fe9e57-7925-487d-9bad-0c752d10b30d)(label(,))(mold((out \ + f1c3a758-a943-48da-879f-5bcab7407ece)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9e4d1819-12e2-4000-b37e-cb79a0e3f45c)(content(Whitespace\" \ + 592850e8-e2f1-4387-a767-3adf76360539)(content(Whitespace\" \ \"))))(Tile((id \ - a9ef5b6b-fc6c-4966-bce0-096a6d5c5381)(label(Int))(mold((out \ + da5dce32-d708-4fab-8073-229049ab3298)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3d1fceef-c8be-4c7c-9879-42a29b672abd)(label(,))(mold((out \ + e943ee76-7a2d-45db-832b-8db067186720)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4615022e-4c5f-4c5c-8263-963bd23b2845)(content(Whitespace\" \ + 568b5eb7-9056-4f85-8126-14b1dd27b819)(content(Whitespace\" \ \"))))(Tile((id \ - 8b02ad79-26d9-4c33-8dac-4f8516c60925)(label(Int))(mold((out \ + cfab3d1b-e8b3-4193-bb4a-5a6aea4abf99)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 624da2fd-881c-40c8-82c5-86f4595f288a)(content(Whitespace\" \ + c0d6810c-5cda-41c4-901f-d03ed234aad2)(content(Whitespace\" \ \"))))(Tile((id \ - 655863a8-237e-4bcf-98e7-c43e222d3365)(label(->))(mold((out \ + 5ee7849d-62fe-4182-a77b-bde54947ae32)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4c232083-70aa-4dca-9c5c-cf75e7e84ae5)(content(Whitespace\" \ + 6ba35706-03ff-4281-add2-273e9e87c03c)(content(Whitespace\" \ \"))))(Tile((id \ - 0524abe1-224f-47a6-a990-553150c8f827)(label(Int))(mold((out \ + 4e966033-1898-4065-8e63-bfcbaa742878)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 73c59415-b115-4fec-9af9-0c3b901ff99f)(content(Whitespace\" \ + 0d7a4a2b-600b-48c6-a476-146c16ac2057)(content(Whitespace\" \ \")))))((Secondary((id \ - 3c9d9243-60fe-4673-abf7-1df5aa193dfa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8369bf13-cc66-466a-ad2b-c52d15f9cd6c)(label(fun \ + 54ee677b-fec9-47c7-9665-b80d68cee0e1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dc288b9b-5cea-4d9e-ad36-35e432468758)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 886f0dfd-ff4c-4455-828d-ff51155492ee)(content(Whitespace\" \ + 38865c2c-d6b9-43e6-a2c2-2390615db9ca)(content(Whitespace\" \ \"))))(Tile((id \ - c8f488ad-d7b5-4a61-8c6d-eac31691e1cf)(label(\"(\"\")\"))(mold((out \ + 1ece0701-825b-4295-9d44-d92ccdd79e88)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8eb443d4-a23b-494b-b659-dacf8aacf828)(label(m))(mold((out \ + 149bbf06-2623-4dab-a4d5-f9bb1eb3b698)(label(m))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9e35ef65-aa4e-4f7e-981a-ecc587ef4822)(label(,))(mold((out \ + bfc8f80e-0e24-4a53-9edc-2f3ea3211936)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 307a102e-ba64-45c4-b844-9a5aa6ccc520)(content(Whitespace\" \ + d69a910b-5aaa-448d-8c85-3e329b4642f0)(content(Whitespace\" \ \"))))(Tile((id \ - 4a8299ea-bcfc-4aee-a838-214cd6c97d55)(label(x))(mold((out \ + eaa2031e-88ef-4310-8105-3f074d24365e)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - adcc6b6d-bd32-4f95-9207-e93f9123b90f)(label(,))(mold((out \ + d43d1eaa-1920-40f1-9f72-74a4f0c6e10c)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 725f35f0-9f14-42d4-af58-48494abdd3bb)(content(Whitespace\" \ + e27c313d-01f4-47ef-9cda-0d15d6f23d3a)(content(Whitespace\" \ \"))))(Tile((id \ - 5730f5d9-656e-4f8a-a391-ca78fc65e366)(label(b))(mold((out \ + 40f07bd3-f9bf-4f32-9364-3b4f2b3a7d1b)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 9676c69c-e775-4807-9416-2f5859fc83af)(content(Whitespace\" \ + da0c6b9f-c51a-47f3-902c-9072d6e5448b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5f0b73fa-c8e9-4575-a038-7fc760a57692)(content(Whitespace\" \ + 6278195c-d527-40b0-91b0-18ef15da6d96)(content(Whitespace\" \ \"))))(Tile((id \ - 07d37aa4-7547-457d-8f3f-1567c81ef2bf)(label(m))(mold((out \ + 04daee96-dc9e-466c-8bbd-c16f0896f07e)(label(m))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cb668b66-f9ea-4bda-a07d-4097d9409806)(content(Whitespace\" \ + 048bb1d3-730b-4134-b476-a8c41c6d38d1)(content(Whitespace\" \ \"))))(Tile((id \ - 37764c33-2e7e-4c4d-bc9b-52f30aa49c46)(label(*))(mold((out \ + 54a18d42-92e4-40c0-a824-fcd8c44d960d)(label(*))(mold((out \ Exp)(in_())(nibs(((shape(Concave 5))(sort \ Exp))((shape(Concave 5))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 502565c3-c715-445a-b21b-a36ac104b8ae)(content(Whitespace\" \ + 98fb231c-dbab-4fc8-bca8-b66730cf4fd8)(content(Whitespace\" \ \"))))(Tile((id \ - 14b40d1b-478f-43e5-99fe-ea7e9f32ee87)(label(x))(mold((out \ + a9fefc75-bb3c-4c08-970f-609f228c76ad)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3bc517b0-33e3-4e1c-9b88-b1ed2952366c)(content(Whitespace\" \ + dbdb950b-eda9-4ff2-99b8-6c709bd4796f)(content(Whitespace\" \ \"))))(Tile((id \ - e2b76739-1a02-4136-b34a-b231fd7ddef8)(label(+))(mold((out \ + 08799c61-d30b-413b-b17c-40addc8ba32a)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2409b7fb-0ffa-4251-ac12-f26a8c256962)(content(Whitespace\" \ + 83ef5ab6-5fb0-4c34-927b-0d45bf89dc6a)(content(Whitespace\" \ \"))))(Tile((id \ - dd807b11-1430-4cde-8bfa-4d0f5a6e3c92)(label(b))(mold((out \ + d0aa2aae-fed0-4460-a710-8c46d82928ca)(label(b))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8e3c8f19-ab1e-4cd1-8e1a-2efdc1a4c5bf)(content(Whitespace\" \ + 3e935497-efab-4385-995c-8481ba722022)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a93a5b8a-695f-4f46-8e9f-53437d2ac117)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0250d6b4-f3e8-46e9-9ee0-0b80a0f593f9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1bf6a1ba-58e3-4d42-b170-b4a12639398d)(content(Comment\"# \ + 8ed09afc-569a-4c21-9498-f8bda1634e44)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 63295f44-306e-4ba3-b4b8-b3fc22a86926)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5754e5e3-6313-43c4-bf7e-6a5802ba8140)(content(Comment\"# \ Recursive Functions (Arrow type annotation required) \ #\"))))(Secondary((id \ - 3a98270e-a970-4b6e-aa0e-78b22afb3e01)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 58f425b6-3901-4cbc-9f4e-341291b4cc45)(label(let = \ + f1d0071b-35af-497c-a070-1e011d6cb648)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7fe4d46c-b4c3-4318-be5f-085fb442db04)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ac30af97-531c-48d0-a7ca-bfb89a6aa5ed)(content(Whitespace\" \ + bdbb309a-2a91-4d5c-8f67-523d00be27c1)(content(Whitespace\" \ \"))))(Tile((id \ - 6e1c8a2e-68e0-40df-b258-f7ad055b2483)(label(double_recursively))(mold((out \ + 4f393caf-34d1-4204-8730-a4c1a49bdad6)(label(double_recursively))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0131899a-ecc2-425b-8c32-03e309537add)(content(Whitespace\" \ + 9234dd7b-9fe6-45b2-ac1c-13c4c7736a6f)(content(Whitespace\" \ \"))))(Tile((id \ - 20f93d12-5cf3-4c8a-b639-94d162dc0770)(label(:))(mold((out \ + fcf0ab63-192b-403e-bddf-cd3b12883a56)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5336148f-8ca6-4d3b-9e39-64c763d92b4a)(content(Whitespace\" \ + 43c38895-66c0-4705-987f-127ba638d3ae)(content(Whitespace\" \ \"))))(Tile((id \ - 7fd60598-b5f9-4596-a28c-7330176bd966)(label(Int))(mold((out \ + edb76a59-c4b0-4361-880b-ec6aa4da3403)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7a812427-7e49-4031-83a7-ecb3912c2fcf)(content(Whitespace\" \ + 66843b7b-f437-4f8b-853d-d0f624e38651)(content(Whitespace\" \ \"))))(Tile((id \ - b3864368-f3f7-4300-a539-d6cea4cbe46d)(label(->))(mold((out \ + 92e40890-f7ab-402a-b7a3-1137455ab34f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1b0feff6-a3f7-48ab-8b63-01bd0e2fe2b5)(content(Whitespace\" \ + d4ca7dd4-140b-4580-8533-58c300140371)(content(Whitespace\" \ \"))))(Tile((id \ - 8097c5e4-210e-4481-9ba8-f134a396da57)(label(Int))(mold((out \ + 4c466497-a265-4969-98ac-4ebc12793489)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 49949f6e-43c1-4333-9115-3d509bafb176)(content(Whitespace\" \ + 9883448e-ca72-40b0-8cba-34dbc195c879)(content(Whitespace\" \ \")))))((Secondary((id \ - da601bd4-4a93-4440-8308-cdc30e39e337)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b6142dfd-bd70-4a7c-9051-bc3a9c7a6c75)(label(fun \ + f74cc9a8-1740-406a-b334-db27828f4ed7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 60d6ca49-1ceb-490d-aba5-7c1aa12967db)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 584e68dc-aa00-46ac-8d9a-3c65a1dc34f6)(content(Whitespace\" \ + ca967743-1e6c-41c0-a69e-5e8c613a5b7f)(content(Whitespace\" \ \"))))(Tile((id \ - fced37d6-3d39-4a12-8069-1dff9dba3204)(label(n))(mold((out \ + 36fa1d74-c54f-40e6-a2e8-ebc41577708a)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ff6d9d83-ff3d-45c6-8d56-f12c6a7576dd)(content(Whitespace\" \ + faae7f3a-dcb5-434c-ae3a-b5941517eab9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6ec56bca-eb53-4248-9aa3-78dee45ff098)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a86d9fea-a2a9-4a08-a113-90dcd901f89d)(label(if then \ + ab1a0425-89ff-418e-9be4-f844e7e923eb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0b996244-53ef-49f5-ba25-0f4971cf4ce3)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b04d8f08-928f-4e56-bc4b-6272d4e7a836)(content(Whitespace\" \ + 953111b9-31a9-41bf-895b-d0e23ee193ea)(content(Whitespace\" \ \"))))(Tile((id \ - d229b78a-73c9-4e09-8540-e66b29539fdc)(label(n))(mold((out \ + 02412946-a79a-474c-ad1a-0401773260b6)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a7f90d59-d22d-4b72-a651-1ce6ea84607d)(content(Whitespace\" \ + 7ac4d9f4-e799-4801-ae6b-360ab5ae1b73)(content(Whitespace\" \ \"))))(Tile((id \ - 9ecfc806-e9ac-44c2-ad63-014356164f8e)(label(==))(mold((out \ + 738b1b17-29e8-4300-8c8f-5ee5cb2ad3b7)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5870369b-a13b-47c7-8b02-cd3b9ede735e)(content(Whitespace\" \ + 24a1997a-4495-485f-a17a-b80547cf5a44)(content(Whitespace\" \ \"))))(Tile((id \ - 17c54ddd-7451-4005-aaec-3b1531bdb4b2)(label(0))(mold((out \ + ae2bd9ef-7274-425e-884b-3ecc8bfbe171)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1325b819-a850-4c37-9c9c-8297fc739c88)(content(Whitespace\" \ - \")))))((Secondary((id \ - 44dd7966-2024-4e2c-8e7d-bb2baac00657)(content(Whitespace\" \ + 1ff8c71b-12d5-4200-8348-04d68f5f26c4)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 1da4a0b7-ce77-4331-8feb-841e73ee9752)(content(Whitespace\" \ \"))))(Tile((id \ - dc116c57-d349-4b6e-b9c2-a2117c1ebe17)(label(0))(mold((out \ + e0ef0dc4-9186-4790-9550-0b9d25d6c6ed)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 38b62dac-f8b5-494a-9316-6a5cd31e79c8)(content(Whitespace\" \ + da9f9b58-ef58-4d4e-9e27-671c17a896cc)(content(Whitespace\" \ \"))))(Secondary((id \ - 6b3865f9-4e3a-4c4d-803c-fbfe39e430c1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 0b712267-97b1-45a9-ad14-5ac637e1aa13)(content(Whitespace\" \ + 33b0649f-fc76-4a84-af22-c189f3490361)(content(Whitespace\" \ + \"))))(Secondary((id \ + ee49b7d8-aa62-4f73-b901-2dc70e844dbb)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + b82262e2-6a43-46b8-9812-e5dba9c21caf)(content(Whitespace\" \ \"))))(Tile((id \ - b7b97d51-2bc1-4261-96b1-1ec5bfba7aa0)(label(double_recursively))(mold((out \ + 4512720c-700a-4f39-bd20-b5731a01e593)(label(double_recursively))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7a6de9e3-2833-4542-9073-755b6792b7f6)(label(\"(\"\")\"))(mold((out \ + 0472ec3b-505b-445a-a1f6-fe687a906d2f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6ce13d39-bb63-40c8-b718-b42914a27fb8)(label(n))(mold((out \ + 27f8cb4c-cef1-44ea-b8b3-744991ba2850)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1bb742f6-75dd-45a3-bcaa-b174908bfcaf)(content(Whitespace\" \ + f118b9b6-8374-4562-9d0a-c769fff2eef3)(content(Whitespace\" \ \"))))(Tile((id \ - 5bb76fe6-4b6a-445c-9033-12d9a65da939)(label(-))(mold((out \ + 6ef9981d-7048-463c-8587-1dda91e4f979)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 766c7916-ff02-410e-adb8-b7e06619857d)(content(Whitespace\" \ + 0b38383b-07b7-462a-a086-a8422cefb268)(content(Whitespace\" \ \"))))(Tile((id \ - 2c0a2a52-d28d-451d-a28b-5da648820120)(label(1))(mold((out \ + 94c7f019-3c6c-4e83-94fd-8f42b6cf8f9f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 32bae59f-8ca9-48eb-ba54-b55b52348473)(content(Whitespace\" \ + 3d3161ef-2b8b-4e0f-9102-eac4024b5f8b)(content(Whitespace\" \ \"))))(Tile((id \ - 11f5639a-3598-4a55-bb5e-3c56bcadf3b2)(label(+))(mold((out \ + 2ffa9ac2-7fed-426a-aac8-2b1990e69866)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 36f50e18-e56d-4274-8c8b-7388125d6449)(content(Whitespace\" \ + db869850-4100-411f-89be-37dce3f1b748)(content(Whitespace\" \ \"))))(Tile((id \ - dd93277b-595d-4b7f-928c-b1484e3278db)(label(2))(mold((out \ + 51b63a18-799f-4a04-98d5-dc588a5f0c7e)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7d4f7d30-3db9-460a-a8b5-f6ac8d52f291)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 6d09f946-48aa-4dfb-8754-5a03fe9dbce9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 475e6f6f-dd86-4038-924d-6e3398187780)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4cdef99d-e23a-438a-b934-5b7d414c22b6)(content(Comment\"# \ + bdc76197-093e-48e0-bc4b-414f7f6031e0)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 89ee5ef1-1887-4cc5-ae57-9e5b3998b40b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a6e653be-97e2-4033-848a-b20b516bef28)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a2092bb6-fa18-4bb7-8254-f06ce681068c)(content(Comment\"# \ Mutual Recursion (bind tuples of functions) \ #\"))))(Secondary((id \ - aacf6a03-1d8a-4ec9-8188-277c8ac600aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ffdaac7b-545c-4969-b530-32af9e589794)(label(let = \ + c528f6b0-e2f8-4458-9f10-e35eb54a83f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 419c15fb-3cee-40b9-bbe7-3fcc2cb08024)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0ea465df-7593-4cc0-8f98-adeb800b8d6f)(content(Whitespace\" \ + cd1bc0f1-9c5e-4cdd-b1b8-d38dcf65b45f)(content(Whitespace\" \ \"))))(Tile((id \ - b9df8aaf-4aff-4990-970a-88ae63feea35)(label(\"(\"\")\"))(mold((out \ + c5acd5e9-d578-49f9-8750-0035a829f06b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - f66b421a-2ce8-4f73-ab7d-d3bf44223e4c)(label(even))(mold((out \ + 71b33cec-bcb6-4f0c-a20e-8db9e8326eae)(label(even))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4f8852a9-e2af-4125-ad77-b5dc73c52aeb)(content(Whitespace\" \ + 511c7180-d10d-44ee-a1e8-e7e2cfe568a3)(content(Whitespace\" \ \"))))(Tile((id \ - 11796501-297d-43e2-8f12-71f92c4a46a4)(label(:))(mold((out \ + 20e59f11-fa80-4f04-9be9-7a49ed887f69)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f66c10a7-8a49-4207-97aa-62ab77f24318)(content(Whitespace\" \ + f10230c8-1655-43b2-8020-9cf1832dae2a)(content(Whitespace\" \ \"))))(Tile((id \ - d1170bbf-b3a9-42d1-9ae6-967efef34905)(label(Int))(mold((out \ + 02e60615-a916-4462-a236-87288c2f1d9e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2500f0c1-a7a3-4a55-81bf-35ad323a7198)(content(Whitespace\" \ + 2db9e607-4382-4eea-9d0e-b5bd865eee11)(content(Whitespace\" \ \"))))(Tile((id \ - 665c778d-df5a-4ecb-a8f0-838bcd5f78df)(label(->))(mold((out \ + 61247fef-30dd-447a-a1a5-7a13d87bd2d9)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3612d5db-888e-4b15-a093-a0593471c9f3)(content(Whitespace\" \ + 6874c38c-e6da-434a-8e58-f377e2041460)(content(Whitespace\" \ \"))))(Tile((id \ - 3d0ceb68-c144-4f04-97f3-2963e9b7b274)(label(Bool))(mold((out \ + 0f07aafc-c7f2-43bb-84e2-9e01793574b4)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9fe3f210-1f66-4981-9820-2c662989d0fd)(label(,))(mold((out \ + e5767ab1-a92e-4f31-aec9-12824488f702)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c4c392f2-9a61-42d0-8612-268eb4cdaa2a)(content(Whitespace\" \ + 768d3304-10e0-4605-91b7-749260222a54)(content(Whitespace\" \ \"))))(Tile((id \ - 33016517-c951-4746-8b49-0bde4cf77a46)(label(odd))(mold((out \ + a006dcab-a858-422c-8a3a-5a38bd72c10d)(label(odd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 56eb04f9-bb42-46e6-bafa-abf47222cd4e)(content(Whitespace\" \ + 5cc01aad-56b9-45f9-81f1-8a613e935177)(content(Whitespace\" \ \"))))(Tile((id \ - 06292b71-a9ff-409e-a0de-673cb686592e)(label(:))(mold((out \ + 4b5180e3-5142-4005-a661-10484eef893b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9db16c80-61de-4fc1-ac3a-a2168e362124)(content(Whitespace\" \ + 7276e4e4-7029-4b71-a6e0-e27be820e9ae)(content(Whitespace\" \ \"))))(Tile((id \ - 406c9d55-c4b4-4294-8133-7068158a12b7)(label(Int))(mold((out \ + 52d04d6d-1e62-456e-9518-0170ebe15b10)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 657bce5c-9bc6-4d94-a01c-92ff2293bf49)(content(Whitespace\" \ + 0c8c8c39-57a8-444f-ae1b-2d6a2dd3ebd7)(content(Whitespace\" \ \"))))(Tile((id \ - fe0e0f92-6671-434e-9ada-aec42b9f3d76)(label(->))(mold((out \ + 653c317d-4a50-4300-9b64-23f73f8a36cc)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 639f85de-c646-4617-b99e-2c58778f0e76)(content(Whitespace\" \ + fdbb48d5-7c8b-4250-adf8-6af88017b9d0)(content(Whitespace\" \ \"))))(Tile((id \ - f104f0a8-5a3c-4e2b-8c65-310b0663a751)(label(Bool))(mold((out \ + 63af1d18-885d-4fd6-aec5-6010c187ab32)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c0a0f384-d96e-4b66-851e-0e6b3e7aa3c3)(content(Whitespace\" \ + 18f574e7-d0e2-48a9-9246-b199c0e456fb)(content(Whitespace\" \ \")))))((Secondary((id \ - 9ba152d5-7580-4088-976a-75cb68bce790)(content(Whitespace\" \ + cf627bce-2d72-421e-84ca-4591a23a9371)(content(Whitespace\" \ \"))))(Secondary((id \ - 4f870c35-2c29-4636-b328-8c161ad0a59b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dd44379d-a615-4dad-8604-6b8a8c9b2cd1)(label(\"(\"\")\"))(mold((out \ + 0f49b0f6-60de-4152-a555-40d56fe208c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 491ab2b5-94a6-4276-bfc8-d46125bb02ee)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 97cf11ea-0f4c-468a-8868-45147007f006)(label(fun \ + 225b4efd-60e7-4037-9e68-929c4309d04f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d22db80d-4761-40b2-9992-eefb50c9d7db)(content(Whitespace\" \ + b3a5f554-62d8-41cf-b8dd-54878e1f1098)(content(Whitespace\" \ \"))))(Tile((id \ - f1fbf06d-b783-48cc-9507-6465a8f1c1cd)(label(n))(mold((out \ + 3caf576d-e457-4dc8-87c8-4a768e42f10b)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 286769d4-fce3-4d8b-bcef-8c247e4a25e0)(content(Whitespace\" \ + 6cc12fbb-6850-4102-bdd8-29c7ec4acc89)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 03bbb21f-6234-4d64-86f2-1cd43f6800c5)(content(Whitespace\" \ + 7b8f9741-7aa3-443d-a386-046b60be85ea)(content(Whitespace\" \ \"))))(Tile((id \ - 80286335-8be0-48dc-84e3-f21272a0acbd)(label(if then \ + 65b04524-fff3-4f1c-9c7b-6379bc281852)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 04f3a99d-a732-419f-95a7-9456f1dfe28d)(content(Whitespace\" \ + 5b2055b7-d4f0-45e3-ba2a-003a24b3ae25)(content(Whitespace\" \ \"))))(Tile((id \ - 20dd315b-b126-4bf9-b66b-15571be097b8)(label(n))(mold((out \ + d3c24059-fe26-460b-9e9f-c4d449e8663b)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 587b86ab-9b16-45f9-a069-d29da8ff5e4b)(content(Whitespace\" \ + 6ed95f38-468c-4783-ab46-656f9b654f36)(content(Whitespace\" \ \"))))(Tile((id \ - 73266223-08dd-4320-9f86-f5ae0472372d)(label(==))(mold((out \ + 06de635b-bf83-4f1f-87e1-b1ece9da72d5)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 33f87f8d-a711-42c9-ad31-1d3e10a4ec11)(content(Whitespace\" \ + e55f692f-29c1-4756-8f46-3d846a981229)(content(Whitespace\" \ \"))))(Tile((id \ - d5c7c1a0-0b69-4cfa-af68-71b882a85849)(label(0))(mold((out \ + a309e744-532a-4fce-b991-87c7b027c96a)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - aaa31e7f-9581-4b76-b151-83703bab8692)(content(Whitespace\" \ + 7185da43-7bb2-42ae-92f7-fab37b3ab0ac)(content(Whitespace\" \ \")))))((Secondary((id \ - 95270875-038b-4d94-b1ee-7b0d2b0ddcff)(content(Whitespace\" \ + 1f28c6ca-f968-4f47-9217-4dcd75fc3f1b)(content(Whitespace\" \ \"))))(Tile((id \ - b61ba6c7-76ac-4091-9cec-9a781ddcffb8)(label(true))(mold((out \ + b6aebffc-d5cf-4671-b907-f6ab32e698f2)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4fa5638a-405c-4d5c-b99c-e89650656ae0)(content(Whitespace\" \ + ca18f9ce-c46b-45c2-a38b-e75640e5d9a0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 07a5efca-db53-482c-a7f8-a98a80a15363)(content(Whitespace\" \ + 80ccabec-a05d-4d60-aeb3-0652155d9528)(content(Whitespace\" \ \"))))(Tile((id \ - 0bf60610-c57f-4e35-9e54-984bb045149f)(label(odd))(mold((out \ + 278ecf77-b4b1-462a-b993-2a6d06711f32)(label(odd))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7c9b716f-8505-466d-b6ae-620f1516bf07)(label(\"(\"\")\"))(mold((out \ + 606fab37-f7af-4b39-8d05-57391cf29e23)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b0f2cfac-7b1e-4aff-b392-0e396586760d)(label(n))(mold((out \ + 738a914a-5de7-4407-b749-257388285619)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 89bbef18-1ce1-4894-8bc1-420f56510788)(content(Whitespace\" \ + d9b29591-51a6-455d-ba97-a1cee86f1764)(content(Whitespace\" \ \"))))(Tile((id \ - 0b563243-1efa-48dc-87f8-555e04cc4199)(label(-))(mold((out \ + 0cbc8116-5f4d-4021-8ef2-3b4f3b03363a)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 258f97d8-5714-4cb1-8fd9-7819c5531cc5)(content(Whitespace\" \ + ad85f158-57ee-4a2a-954d-604bbde7dd53)(content(Whitespace\" \ \"))))(Tile((id \ - cff30700-5a5b-49d4-bc49-ac5b6ec84483)(label(1))(mold((out \ + e60f89aa-6733-42e4-a7db-2b1096f49dfb)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 9101c7e2-846b-40d8-a832-a4a6c7bd0959)(label(,))(mold((out \ + 99bd0c87-3c73-4cf9-8a83-c9cf506dbd9d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a73f7a1c-9b77-4140-b715-08728829da31)(content(Whitespace\" \ - \"))))(Secondary((id \ - a5307103-94f8-4990-bb78-fd954fc0160a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6b07d6dc-e3dc-4d12-b859-2620bea81ed1)(label(fun \ + e2cb5767-52f5-4a3e-9a5f-e83c4bb19324)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4af988eb-5eca-4019-8f29-d0b94b68a8ea)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 45fcc03d-0b15-4512-990f-d6fb13baf552)(content(Whitespace\" \ + 76b3c756-62d4-46e6-b78e-264ddf86a0cc)(content(Whitespace\" \ \"))))(Tile((id \ - 686be96b-0ed6-47b4-aa03-e771e6edfac9)(label(n))(mold((out \ + 31fe75b2-cc12-454f-9740-e3d9121edfdc)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c4870658-3571-475e-ae36-044abfc4ea23)(content(Whitespace\" \ + e9b81034-7bc2-4087-aa96-f491f9ac2b1b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 13002f6b-7b2a-410e-9de9-90c144fe8c65)(content(Whitespace\" \ + ec15407d-9bf0-4a29-97ae-8815524f11e0)(content(Whitespace\" \ \"))))(Tile((id \ - 93aef954-9d0c-4a06-8c39-9d1d61741ce1)(label(if then \ + 05f3846d-8648-4e36-b735-38ec0694041b)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1462070d-9e30-41b3-83aa-0bfa5285c8cf)(content(Whitespace\" \ + 2544da12-7b47-48f3-8e38-d3d792d3abb8)(content(Whitespace\" \ \"))))(Tile((id \ - fec12099-5265-4b1b-af5f-5ff029413ab9)(label(n))(mold((out \ + 06f2cf69-01bc-463e-b3bc-7c41bfea490c)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cd29d61b-6959-4d86-ba94-55c24151ca51)(content(Whitespace\" \ + a637d788-a86c-4835-9fe8-471aa0ea7ee0)(content(Whitespace\" \ \"))))(Tile((id \ - a759f95a-c777-4a95-94a4-454979880ffe)(label(==))(mold((out \ + 702796d5-28bb-4a4a-93da-34baa95bea61)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3cc08a7a-a8fa-4208-ad3a-6c1c8a8844b8)(content(Whitespace\" \ + f4d00aef-9eed-4bc3-b780-a447aeeae3e9)(content(Whitespace\" \ \"))))(Tile((id \ - e1877f9a-f1fe-4af0-bad8-f3d59d8cca3b)(label(0))(mold((out \ + 908abbb4-ff70-40a8-9a8a-e04d73ab0bc7)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d7c6e25b-c46a-4b70-a6fc-ab0a6f9e7bd4)(content(Whitespace\" \ + af05718e-af31-4dcb-ba08-80ade397a923)(content(Whitespace\" \ \")))))((Secondary((id \ - 8457346c-faee-4792-83ab-586a18f1086c)(content(Whitespace\" \ + 35c3f690-c95f-4539-b08c-ce2eec22ef81)(content(Whitespace\" \ \"))))(Tile((id \ - 1b161c1c-165c-4eab-b8a8-524d36f3ed7f)(label(false))(mold((out \ + efbf3d17-b247-4d1a-8d20-bd62be1a4ab9)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 182646d3-e1c5-4672-9ae5-940b4c8aa8e4)(content(Whitespace\" \ + acf0165c-cee3-438e-b273-c596692f64b6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - dfb2ded3-3d5f-4c07-856e-11cb44241a39)(content(Whitespace\" \ + fa829e09-5a79-42aa-928d-6c8da72c21c5)(content(Whitespace\" \ \"))))(Tile((id \ - e659460f-7638-42bf-8426-009a2f0ad80e)(label(even))(mold((out \ + 180d09de-35f6-4880-a3a2-43eebc7ae7f0)(label(even))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 86a0a7b9-1672-41d8-a361-23bbdd5f6afc)(label(\"(\"\")\"))(mold((out \ + ce52e672-062e-4426-9fa6-d203465530be)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - af7eefc6-3f83-460b-ba53-ed5b4119c5e0)(label(n))(mold((out \ + 4d720dd8-860d-4b93-b004-68cae35a1c8a)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b6ec9376-feff-461f-87d2-12131de46018)(content(Whitespace\" \ + cad795fc-743d-483f-af09-dde3e58bf04b)(content(Whitespace\" \ \"))))(Tile((id \ - 245a143a-66be-4545-8479-f4e017041317)(label(-))(mold((out \ + 1a2b968d-496a-49dd-8b2b-e8b54efcaeb0)(label(-))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bb9f09d2-b37d-4829-bb0e-89daa32d6de9)(content(Whitespace\" \ + 8043593e-cfe3-4e48-a5fb-5f076a243ae2)(content(Whitespace\" \ \"))))(Tile((id \ - 584e4cbf-bf24-4c45-b907-8a98305070b9)(label(1))(mold((out \ + cb68385c-08b6-4274-b9cc-802d604a261e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - f71965e9-142d-4eaf-8614-a113bc2e11de)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 18284195-741f-400d-95a2-c4b03b3af4f8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 441b067d-f2c0-4046-a33f-55ad4bd10c32)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f35748c8-f14c-40e0-8017-858934cafb79)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b73aa1ef-e325-4e6f-bb09-2f0dce345f0b)(content(Comment\"# \ + b7d7a4e7-d051-4666-a2a7-4e64f3f79343)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 271c67c1-015e-44f7-aa7d-6f691c96c997)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 14c67c09-f4b8-46be-aa36-f96eb1e19877)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bc7dcb34-373d-4f46-9dc3-fe49724f7d90)(content(Comment\"# \ Lists #\"))))(Secondary((id \ - 228ed902-3179-40e5-a20c-43cfca5c15d8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ae10883d-7d33-434e-a062-6f31419f8c22)(label(let = \ + c39ce83b-4d21-446f-8791-b08c6b5cbdc0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f9d02360-0bf9-4443-9c85-e20af3438852)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - de7642b4-e633-4d7e-ac21-1a1bdab90efc)(content(Whitespace\" \ + bd4279b7-7e06-4558-9d08-f15a8912eef5)(content(Whitespace\" \ \"))))(Tile((id \ - f3fc13ec-5b37-4cd4-b258-933c70fb7242)(label(empty_list))(mold((out \ + 0ba54b70-cb37-4759-a86c-997394fed58c)(label(empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 673227f7-9b95-4ea2-a87c-1b5eb8eee3e5)(content(Whitespace\" \ + 0e9a70fa-a3e2-4c8a-96f6-abd4a3ee2f64)(content(Whitespace\" \ \"))))(Tile((id \ - 61be96f9-b25b-48c4-a6de-198c53cc570f)(label(:))(mold((out \ + c72e6b66-6d59-4db8-8a06-7e4919f13747)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ad59e82a-d430-47c8-b64b-d71abea47e16)(content(Whitespace\" \ - \"))))(Tile((id 5511581d-d481-4347-bc2e-6e0cd1484545)(label([ \ + e7819f84-dd5c-4738-8020-93d73e47aa34)(content(Whitespace\" \ + \"))))(Tile((id 97993ca4-d966-40e9-8693-7ee10404863a)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - c5a4a471-8d21-4169-b84e-b7345fc89746)(label(Int))(mold((out \ + 6a4c2fdc-4685-44e4-b418-ac221fbcf3f4)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 284e946c-ec8c-4512-b2d8-1792556db214)(content(Whitespace\" \ + 0f069430-b9e3-4d54-9305-b5f3e0edaeba)(content(Whitespace\" \ \")))))((Secondary((id \ - 7bff5c9d-1952-4a3f-ae08-cf9394b3e7de)(content(Whitespace\" \ + 607fe3c5-701c-490f-98e2-82151708fd37)(content(Whitespace\" \ \"))))(Tile((id \ - d037dea1-5b70-4042-968b-35fb40bf082b)(label([]))(mold((out \ + 3ac79683-5a25-4ba1-8d51-6ea4634ea7e9)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2d14437a-6842-4fc1-88d4-0531636e2883)(content(Whitespace\" \ + 5ee6cd89-f5bc-4f84-b135-d0b3a19bf2a5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0f451b6b-edf5-45ab-bd36-d5003840504f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 24524764-5151-4d27-b657-3b87d0908025)(label(let = \ + 79d39aec-17cf-48fd-bc03-817aeecfc7a4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 723f0bad-3be8-4d90-b7ef-068a68841c9f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a4422f32-2290-4813-80e0-2d6073c8d6f9)(content(Whitespace\" \ + 87d949db-5354-48c7-9d15-9d7749ef9a35)(content(Whitespace\" \ \"))))(Tile((id \ - 56da3743-643c-40f9-8ad3-f01991f9597b)(label(non_empty_list))(mold((out \ + 8d69fdcd-82a9-4813-b2ef-3d9a831a9576)(label(non_empty_list))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fc42f3ec-127b-4548-8605-8d5462bc8f53)(content(Whitespace\" \ + 42091604-35f8-4d2d-b97b-c05a51cbba6e)(content(Whitespace\" \ \"))))(Tile((id \ - a3b5c679-f8cb-4e10-b4d7-556fa735f4ee)(label(:))(mold((out \ + 33a8392f-8309-4d4e-9a89-87ffdcff0418)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4cb8c9c5-59f2-402d-bce9-4a52ea038688)(content(Whitespace\" \ - \"))))(Tile((id 43032bec-31d8-4314-852f-8dab17b845db)(label([ \ + 44361ed0-635f-45c4-9ccd-bdcd04c94ff9)(content(Whitespace\" \ + \"))))(Tile((id f02eb0c8-8c56-40bd-95f4-cc4f469d4a7c)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 49c7eedf-8256-4441-b367-329eebd0cf6c)(label(Int))(mold((out \ + 2f95205b-2c37-4396-aed7-4fb1e782307a)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 78c462dc-4d4f-4498-aec2-28fd227b5f56)(content(Whitespace\" \ + 73b8f6f4-9412-4112-80af-a8c1d370c249)(content(Whitespace\" \ \")))))((Secondary((id \ - b6d8bb78-3d52-4165-aace-077279a2c61b)(content(Whitespace\" \ + 7b5c9995-e097-4a60-8b86-28a8764ccc9e)(content(Whitespace\" \ \"))))(Tile((id \ - ce4a57a6-cd2d-46c6-9a27-a12e48312bed)(label(1))(mold((out \ + a7b518e0-3aff-4aa2-b115-7250b02cf936)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5564fe00-8842-44ec-b1d5-82e5e5a16b1b)(label(::))(mold((out \ + e3fd8b3b-2ee5-482c-8e7b-cf8718e6ba2a)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - a5c46f84-f7ab-4b4f-b817-eb5a7f8acc58)(label(2))(mold((out \ + 813f3831-3bd7-4e2c-8953-e02fb1b6baa7)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5e6be7ab-1575-4575-b607-eea8d9d038d8)(label(::))(mold((out \ + 37f4c0ac-b4c1-429c-bc40-e0dbd7787c96)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 4fe2a011-bf1b-4961-a6fc-3d864c703551)(label(3))(mold((out \ + f5d5670e-b189-427a-bb40-3c0fbf9d9f30)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e5e6678d-cb6b-4694-866e-2a7f872cd878)(label(::))(mold((out \ + be534baa-2f8e-45c1-93b1-d4caefab8cba)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - b5e972f3-2b54-4bf5-929a-a6a1a908dc02)(label([]))(mold((out \ + 4af3e5f0-1783-4376-8d0b-542c23e1f373)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - df8b8b58-393a-4ed6-ada3-e9bf71d3c164)(content(Whitespace\" \ + a9bdce85-d3dd-4f4e-90ec-86aac022c94b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 12267698-5c48-4945-a14d-2bf966b432c1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0676c88c-60bc-4d10-86c6-c66c165c2550)(label(let = \ + 5163c346-30c2-4680-8ae8-96af2c547c92)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 350fe135-fdbd-4f21-9802-9a0c6ea6252a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2c7137b5-207d-41b8-a095-36390e33d63a)(content(Whitespace\" \ + e5223755-0068-49ad-94a0-3333a5255b29)(content(Whitespace\" \ \"))))(Tile((id \ - 992e7a67-2d4c-4f27-bd5f-e6718fa5593a)(label(list_literals))(mold((out \ + 7d8b8334-87d3-4885-b662-32f21da7f2e4)(label(list_literals))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6d8549a9-ee7e-4800-9dda-bf5f8a7b2093)(content(Whitespace\" \ + 6723185b-f58a-411d-b566-6f0b06832986)(content(Whitespace\" \ \"))))(Tile((id \ - 8a1d5270-cb51-422c-94d9-84570332576f)(label(:))(mold((out \ + f930e052-5b1e-4cfa-b932-e294a91f5d6f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 911222a0-ed6d-4903-a481-09feef910a50)(content(Whitespace\" \ - \"))))(Tile((id 74b13f89-db62-4be9-92b4-8a77de2d9994)(label([ \ + 15d7a1ac-efcf-4495-8047-308d7b303d0f)(content(Whitespace\" \ + \"))))(Tile((id 281611db-01be-4957-af8f-2afced823082)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 0d2a4408-a02d-4692-adc1-64ae07d48699)(label(Int))(mold((out \ + d196344b-4789-42d4-a524-2b4c5ee9240a)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - f3ba4230-e7eb-447d-b64d-5176c7b520b4)(content(Whitespace\" \ + 5df02d11-d511-4a9e-b086-2f5cfe307aaf)(content(Whitespace\" \ \")))))((Secondary((id \ - 859b1eef-8c83-44cd-bef7-009b86a12138)(content(Whitespace\" \ - \"))))(Tile((id a10768f2-9812-467b-ac72-9f12eb10ae0d)(label([ \ + 284ad33e-8b07-4a17-912b-c2297e18b7cc)(content(Whitespace\" \ + \"))))(Tile((id 0daa4b87-d66f-4e26-a802-49a64674417b)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 1587bb1a-9d40-4721-b382-63b2c357b867)(label(1))(mold((out \ + 1b5cf7cb-38fe-4cf3-a56c-b41906e17263)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 831c2c50-c72a-4bef-aadb-1da20622b432)(label(,))(mold((out \ + 2c972641-858d-432e-b4f2-780a87783159)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0899e99d-f7ea-45ea-9100-7e3392fa8aa7)(content(Whitespace\" \ + bffc7101-4e8b-4d66-9670-d6be93a563ec)(content(Whitespace\" \ \"))))(Tile((id \ - fe065d92-806e-42bf-8c0b-c08e74896f56)(label(2))(mold((out \ + 2cefa39a-480c-4137-bd9b-2aa28154bd33)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1e3f2a01-66b8-4e24-bd52-30527ecb9951)(label(,))(mold((out \ + 7b62486c-73fa-4e71-af27-b851f6414318)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 03816591-bcda-49a6-ba37-9c2fa44a4c8e)(content(Whitespace\" \ + 10a688c6-b8a0-4a78-a7f5-64880b43e9ac)(content(Whitespace\" \ \"))))(Tile((id \ - 704da7a4-5e93-49c3-937a-66994e82d487)(label(3))(mold((out \ + 9fbd3d07-c9bd-4603-a507-841570f22789)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b3d4ea40-4660-4433-9398-e163e24a14c6)(content(Whitespace\" \ + becaddff-953b-4182-af32-2104f464c451)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 65440b42-28a5-40f5-bea2-ae10a76c00da)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8edbc6b1-c56d-445a-a447-181fc6c820e9)(label(let = \ + 19cca4e1-2c7e-4462-94da-4fdedceb49e9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 511e0441-e397-46a2-94f5-76fa76b39eec)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cb829536-56b5-41d2-8191-770744d127fd)(content(Whitespace\" \ + 089388aa-883a-420e-bdef-59cac8cc9fa3)(content(Whitespace\" \ \"))))(Tile((id \ - a58ec129-c4c8-4414-92b5-e61b0a87452d)(label(length))(mold((out \ + b27c2506-4aed-4fed-91ba-6ee569991650)(label(length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 3e19eb3f-0693-4bb3-b36d-243234d4e5f3)(content(Whitespace\" \ + edd2773c-8139-43fd-937b-f21a1717948e)(content(Whitespace\" \ \"))))(Tile((id \ - 821dedd6-59ba-46b1-aac0-7e5f3996b941)(label(:))(mold((out \ + 99046603-307e-4511-903e-7a85c9ee23f1)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c3e02149-fbbd-40b7-9a4b-c6756f04d481)(content(Whitespace\" \ - \"))))(Tile((id b927f1f0-cbb4-4eee-b6d5-0deb5927b9f4)(label([ \ + 0ac2ccb1-feba-4d42-850f-a98ff634e7ff)(content(Whitespace\" \ + \"))))(Tile((id 154f1523-cb06-485a-b0e6-aa573b7d8980)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - ef15ad6b-4499-4da8-af25-40ebf818b5ff)(label(Int))(mold((out \ + caeebad6-7198-4fce-95bc-128bdf34cd16)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - dac4bc97-94ea-4c7d-a5e5-d1fead54ea32)(content(Whitespace\" \ + 30a0d116-f8dd-4c22-85dd-de3265c046f7)(content(Whitespace\" \ \"))))(Tile((id \ - c3ff9729-31f3-4d22-ab1d-2743ca028da7)(label(->))(mold((out \ + f0a385f6-5e7d-4858-926d-d31dbbc77b8f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2060fe61-7825-42fa-a3fe-3cef42c3c7fc)(content(Whitespace\" \ + 1800d190-4a3d-4a4f-bff1-e136de1817b5)(content(Whitespace\" \ \"))))(Tile((id \ - 31e81881-16bb-4ef3-b1b5-0906d04972e5)(label(Int))(mold((out \ + 93fe8f44-dae8-4061-a742-8c90ae4b3f43)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b8c635a5-57e4-40f8-a5e5-05aae161c7ce)(content(Whitespace\" \ + b876cab6-eb95-4a51-a52a-5b653d39f7ca)(content(Whitespace\" \ \")))))((Secondary((id \ - 3f345d7f-d8fd-4966-9249-988c8c8f6012)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 97a8ae2a-be62-472a-9e68-7cf2abaa602b)(label(fun \ + 4ea26a84-092a-4c3e-865b-7754f971480d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6718ba03-2933-4a33-b1eb-55a26d45330e)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f0c02721-0ec7-4bb4-9b69-76679b9c3d71)(content(Whitespace\" \ + 444e1ffb-6611-4d86-af54-aedecc5cddde)(content(Whitespace\" \ \"))))(Tile((id \ - 7c179cea-b832-4b9e-a7cb-0c6a25af2027)(label(xs))(mold((out \ + 28709898-b85a-462c-87a4-ce7e7d656b04)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1a1418d4-16e8-48e2-9e6b-7734e0f8f9f5)(content(Whitespace\" \ + f5ecae96-651a-49ce-9e24-3b802f8f3063)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 69231ac1-bfa3-4c3b-bbef-fe16d5d996bd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 08364735-5c04-4ed1-88b1-b36a1c8e9a6e)(label(case \ + fe7563ba-865c-4cc6-95e8-700f5ff79152)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 56955faa-6b0a-4df1-8d17-bb95b53568fc)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3e0ff3c4-9941-45d6-8c3b-c38aa42f2d40)(content(Whitespace\" \ + ef9a125a-4046-451a-8d73-103876097ca7)(content(Whitespace\" \ \"))))(Tile((id \ - b89ed8c3-ba96-428e-b6da-b1caf0778219)(label(xs))(mold((out \ + 324c09d3-7ecf-43b2-a8db-6c5001ed928f)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e003f812-d037-47c4-9d7f-a353477bbc09)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e5a12177-6a4c-4304-a575-513c4c7d9ed3)(label(| =>))(mold((out \ + a18693a6-2ac0-470b-9dab-9c25bacc0396)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 89ee5605-51be-4768-978c-0922bf0f21d1)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 413a7ebe-6162-4c14-878d-f5bb90677116)(content(Whitespace\" \ + 5612b2db-2678-4633-b236-c64f779f7931)(content(Whitespace\" \ \"))))(Tile((id \ - fe218713-c49e-4e02-91a7-b8a51ae40d3d)(label([]))(mold((out \ + 4e6d1a24-561c-43a4-92e2-1281ae1d31a4)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2630efc6-eb30-4e1d-9be7-0738d5203c47)(content(Whitespace\" \ + 3a274d65-b682-4243-84eb-c89038fcd06d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 14e50082-15a3-4248-8335-7745ab820dfc)(content(Whitespace\" \ + 3287df28-ad9a-4bec-abf8-453cb18a2899)(content(Whitespace\" \ \"))))(Tile((id \ - ce2c57e4-5078-4902-bcff-be7065ca0199)(label(0))(mold((out \ + 211378e1-868d-4e31-9304-6989b9a9872d)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0967ddcd-ab6b-4378-bbbd-66c0b5aea91d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 741f27f1-8038-4ca9-a385-792624864dfb)(label(| =>))(mold((out \ + 3824c876-d892-4c77-993d-f66d5217dd6a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 39f9ce91-5147-4139-907d-b94850d7c14a)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 03fb7921-9714-42d6-a7cf-bee0167da2a2)(content(Whitespace\" \ + a11b6281-df23-427d-a5ed-eddabc8e8621)(content(Whitespace\" \ \"))))(Tile((id \ - 43e52583-4e3c-4662-a22a-bbd170fbf0c9)(label(hd))(mold((out \ + f70f9ec1-adc8-41ca-87e8-8299065ade8d)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bbb75b7c-6cd3-4d68-bc7c-3c2dee546ecc)(label(::))(mold((out \ + cdd3132b-17e8-48ec-82f2-21bb17f613e4)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - e91c325c-5469-4bd5-91c4-4b80e6b19a42)(label(tl))(mold((out \ + 14107816-9c53-449d-a120-5247233059bc)(label(tl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 21a586f6-68c8-4b34-9766-d6beefa2159e)(content(Whitespace\" \ + f87d88b5-a003-4fc6-89f4-64725b63d788)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cbee2c0a-f86c-4108-9f4d-8af7d6931952)(content(Whitespace\" \ + dd308a17-0a49-4f91-a289-45e571bd9264)(content(Whitespace\" \ \"))))(Tile((id \ - 8d4b30fa-66d3-456d-801a-55db03868eaf)(label(1))(mold((out \ + 38400b5e-4bd6-4a2e-8f20-da9514eec31b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cc79c1b4-1ada-48a8-bcde-678dfdd4dda7)(content(Whitespace\" \ + 691c31db-2747-4a1e-9825-d0e1026eff3d)(content(Whitespace\" \ \"))))(Tile((id \ - 147ca493-c190-495d-9eab-8cf75a437d14)(label(+))(mold((out \ + 0f17ff86-0d21-4446-b82d-c35a70c750fa)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a99dd3da-c3ca-4303-8991-bfc7a50c834d)(content(Whitespace\" \ + 9e739b59-4ca3-46ca-9530-7e042a2af10f)(content(Whitespace\" \ \"))))(Tile((id \ - e98199e8-c7cb-415b-a2cd-c9a6c5c1aaa4)(label(length))(mold((out \ + e37e4916-2d59-4644-b600-5daa3ade2649)(label(length))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4f860950-f8d9-40cd-abf5-16ee26533ae5)(label(\"(\"\")\"))(mold((out \ + 25a28b2c-c5af-4cbd-922b-ff6c7011e27b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 35bc5268-6043-41c7-83ba-0dbe20a2576d)(label(tl))(mold((out \ + b0215ef5-baab-4271-9e47-b2f76cce04a8)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - ff104c0d-7841-4252-ba74-8163c09080d9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4833d747-28c4-4b70-8342-484e6a2b4a86)(content(Whitespace\" \ - \"))))(Secondary((id \ - e61e9333-12b1-4d9f-a556-ad688c8ec485)(content(Whitespace\" \ - \"))))(Secondary((id \ - 84c420bb-f917-40c9-8408-45a745d2267a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 933896dd-16c6-4356-bb53-38ebe7cbbc75)(content(Whitespace\" \ - \"))))(Secondary((id \ - ad2a7541-a522-48ce-a113-57f467e0f526)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5dbf3ee7-10bb-4204-88b9-229ef715fdf1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 1d4c3639-3f8b-42b5-8ee5-52d7eb56c4ca)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 21755f8e-e6d5-48ca-816c-83721084a45b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5265395a-48df-41fa-a47b-fd087aba48e7)(label(let = \ + f4965de6-7f90-4109-8b6e-590b35a3eca0)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 05ef5e45-07dd-44c6-9afe-b5372cb171d9)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + e0627fdc-e9e1-495a-94c1-d72439a58668)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 53f3f1b0-458e-44a6-bba3-223a485fec62)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4cf95683-d47f-4b77-b19e-42b6bd60d074)(content(Whitespace\" \ + 39daf11f-6a25-488f-884a-97e32e25550b)(content(Whitespace\" \ \"))))(Tile((id \ - c70fa345-d459-41e4-942e-6580beac0180)(label(has_at_least_two_elements))(mold((out \ + 397ae223-e214-4634-8ea9-1f73f4705e67)(label(has_at_least_two_elements))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - bd861aa4-0fff-4e5d-b628-426d1ef9362c)(content(Whitespace\" \ + fdc26b8d-9017-4dfa-8966-5f848f6645da)(content(Whitespace\" \ \"))))(Tile((id \ - 04efadd0-84d9-4b10-8be7-46af1f64b0f4)(label(:))(mold((out \ + 881bf713-bc43-4a94-81b0-42fc3bfa70e3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f8d745c6-99ce-40ae-9cc5-171bc573ac2d)(content(Whitespace\" \ - \"))))(Tile((id 88e2138b-5697-4a7e-bcdb-c2ea6ced15ed)(label([ \ + b1de66b3-642a-4bb6-9273-5d85d5a9bc23)(content(Whitespace\" \ + \"))))(Tile((id 257b6a14-e541-4242-b473-0463582256f8)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 4508debf-eac6-48c1-83c8-0f089ab2352b)(label(Int))(mold((out \ + 6da2abb4-84ec-4841-b85e-f8cfe7a9729d)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 81547a5b-d3c0-46a4-85c8-4f9dbd836d74)(content(Whitespace\" \ + 5b11d893-5740-47cd-9025-81dd0b4d2756)(content(Whitespace\" \ \"))))(Tile((id \ - 2f9dccbe-7979-4e40-90a5-6b83821e9bc8)(label(->))(mold((out \ + ad3accf4-7a6d-4798-bfcb-f0e751532575)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dc51f76b-e7b2-455c-8fab-80a8d00c5904)(content(Whitespace\" \ + b0a84936-58c7-4abd-9b07-fc4d3dd2ec33)(content(Whitespace\" \ \"))))(Tile((id \ - 6975e3d1-8dc7-4a1e-9f32-1aad6a290ba6)(label(Bool))(mold((out \ + bd9e5857-adb5-4148-a5b2-c41b0b3460e7)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4a8dd0aa-6080-41ed-9486-19b58ccaca72)(content(Whitespace\" \ + 2dd3d587-941c-4cc6-a130-6420fb581d33)(content(Whitespace\" \ \")))))((Secondary((id \ - 42cb9847-149f-4ef1-baf0-cc37f41481b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 094afae9-371c-4308-9bac-8aa11f203ea5)(label(fun \ + 8ec6fb67-ef87-444d-a238-131d2587a236)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d9c00cae-53ff-43a7-b891-1f68dad43260)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a7ebdab0-b33d-4d5a-a697-c05ff2cf5e5b)(content(Whitespace\" \ + 236ca38d-bb59-43bd-b58d-b228df6270d3)(content(Whitespace\" \ \"))))(Tile((id \ - 33297030-81aa-4db8-9c17-f6dff5cd69ec)(label(xs))(mold((out \ + a62462b2-af49-4d5a-80c3-958fcfdc6333)(label(xs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 05b343a7-b67a-4686-8c0f-092abeaf4998)(content(Whitespace\" \ + e9df9afe-1b83-4066-9b63-74b209147bbe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9a66f8b3-fb86-4319-9d86-b70acdb045b6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 27b59ebd-d224-43d9-af16-aa43b49a5627)(label(case \ + 0b6745f8-c5d2-4475-935c-fa4dedf40c88)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bd2ad573-101d-49cb-aaff-0a598a1d9de5)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7c71a079-e1f8-4352-ad0b-b09859269a46)(content(Whitespace\" \ + 0bb98bf2-addb-4348-94ae-410e18eb9ea5)(content(Whitespace\" \ \"))))(Tile((id \ - 657ac93a-3238-4628-b635-53a797966a50)(label(xs))(mold((out \ + 625e4390-91bd-4fb3-a549-017064a42249)(label(xs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f1b0d64f-82d8-421f-978d-38e46184484e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 57184b37-b5ea-4cc2-900f-effee2aed3d4)(label(| =>))(mold((out \ + 3ff9bcc0-c120-434b-897f-d00baf77f2c4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5b8eab81-fb7f-45b0-9a9b-29d2dd51115b)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e815e70d-c2d0-4013-85cb-c49f50989529)(content(Whitespace\" \ + 4257ab75-ba84-46db-a119-207da547b29f)(content(Whitespace\" \ \"))))(Tile((id \ - b4948c09-6c17-448f-8b75-54eb0dca20b8)(label([]))(mold((out \ + e8425979-b996-4f7c-a062-e61c5c503a9c)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 89991e1e-59cf-412b-a53e-b716939d16d4)(content(Whitespace\" \ + eba8ed89-a511-4832-991a-913adff25b8b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5e1316dd-6d19-4e81-b336-01efa2a319db)(content(Whitespace\" \ + 2ead0224-0a63-4ab8-93dc-4c2b9226a29e)(content(Whitespace\" \ \"))))(Tile((id \ - 7381b72c-cefc-4f1a-a298-ed6902815506)(label(false))(mold((out \ + 6a533e03-8840-49c9-9674-8c8b9be55276)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 77cbf89a-ce22-4d7f-9625-12dfed499650)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 49f3ccbc-1b59-4ecf-aedd-c04282eea04b)(label(| =>))(mold((out \ + 751ea028-7534-48d8-9096-883ecd69ce5a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5f4c5632-7120-4bce-8bed-124f94d6aecf)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f9961fd7-385b-4927-a47e-8badfc0ab6b8)(content(Whitespace\" \ + e59db608-e829-4bdf-b77c-1a097dce2a60)(content(Whitespace\" \ \"))))(Tile((id \ - 1de1ee08-3980-4942-8915-e95bfa526e4c)(label(hd))(mold((out \ + c4b6504d-3422-4227-8306-67bf0277d665)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8bc0e132-969b-4a50-bb3f-ce6fe98a5627)(label(::))(mold((out \ + abc2f970-4c61-4fbb-9b2e-e34c1d0d3a8b)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - fce2cfa8-f90a-4a86-9042-7c9cbc13b726)(label([]))(mold((out \ + 0fed2066-3b77-4771-b295-62e294aa8f50)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c398bc01-e87e-4cce-afd7-dda8b951c446)(content(Whitespace\" \ + c8a5ee19-a963-4622-a73c-766d2d0c8f62)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ea95eed4-da19-4ab2-9c1a-21f22124a567)(content(Whitespace\" \ + 0cc63b9f-9ed2-4ddf-b977-a7deb76cda61)(content(Whitespace\" \ \"))))(Tile((id \ - e3629de0-43da-469c-a903-7c2ec78879e9)(label(false))(mold((out \ + 95c7c33b-a4ba-4f96-9c12-fee51aa6a99f)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c6669a9b-e74b-40f0-8aa4-711960ca3594)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0ba0798b-4b87-43d0-8fe2-eea014acc9ce)(label(| =>))(mold((out \ + a174d895-fd9f-4fd7-ba3f-75d6e0b82870)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 57d5a323-3030-43e4-b16f-494479c3b848)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 328e67ab-532a-4ab7-a6e7-20bc9506551d)(content(Whitespace\" \ + 3252ad23-a37d-4066-a49c-a0680b1298fa)(content(Whitespace\" \ \"))))(Tile((id \ - b5a65a5d-9bd7-4b69-abfb-7b9aac8a5313)(label(a))(mold((out \ + cdf7fa1f-b385-4ffb-b76e-4d1c11c1f55f)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a45323b5-b3da-4b0b-a559-a3565079490c)(label(::))(mold((out \ + 39cc6837-5078-433b-b91d-5906a5c3fb7a)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 7173ea8e-c735-4cec-b854-968cab645a8d)(label(b))(mold((out \ + a6682ba7-f297-4d28-bbd3-c8214e3447c9)(label(b))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 16dd24b5-50c9-4262-8d84-6e5c7ce2f2a9)(label(::))(mold((out \ + efe16760-513f-451d-bb05-e2d67b40b540)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 23b967ee-b090-485e-8f28-7aa249098c7b)(label([]))(mold((out \ + 280e2eb1-36ae-4658-85ef-a8eb3cc313e0)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 95966712-72e3-4751-a4c7-903c304c7537)(content(Whitespace\" \ + 145b941b-fcb5-4405-91cd-3f593984f3a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9fd054a9-8845-44d3-b547-8cf8a6da4380)(content(Whitespace\" \ + 7c49bc96-efac-4b70-b2f5-867c012e31ab)(content(Whitespace\" \ \"))))(Tile((id \ - 3982586c-7891-44ab-9d3a-f881a1cd9f05)(label(true))(mold((out \ + b74b9dae-90ca-4f4a-9087-930855d664a3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 40cc9646-8c95-4944-a747-9f1fc15aa8ec)(content(Whitespace\" \ - \"))))(Secondary((id \ - ae10bb5b-3983-482f-8953-12b3c80dc73e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ea3a90c0-7124-4233-b5f9-a2c923c810cf)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 57190bad-08bd-4912-af9c-3416af20fd8c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 51c35b6c-6035-4e6a-ad2d-7e5c35523094)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9b25d1e4-8db5-42dd-8d32-84016d0f6070)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5ce4c2bb-97fb-4517-8552-09d78324ab83)(content(Comment\"# \ + d9952e08-fcf0-461f-8401-ef1ff2f4e190)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 2c83af2d-f18a-40ac-947e-478b909117be)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 555643f3-6e8f-4f26-a040-bb2506d0dc6a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a69b41e-0de4-42ed-9657-e89edabc55ae)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 84e1ef36-3654-4190-9b85-77e51f8c28d1)(content(Comment\"# \ Algebraic Data Types #\"))))(Secondary((id \ - 97b76a41-7fe9-4c05-8823-547464b69f52)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c6a68c00-8b01-4722-9aa5-049c0ce99872)(label(type = \ + 83c81a32-c7d0-4141-803b-2ee2b5f8c9eb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9f272ecf-95d5-4692-a041-9cf9d21b30f9)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d1571915-1559-40f1-8d8e-ed24040956ec)(content(Whitespace\" \ + aced6e1a-7220-4732-b120-f1a66c05ff15)(content(Whitespace\" \ \"))))(Tile((id \ - 2c138d6b-a3fc-46cf-91ab-bce50087b037)(label(Exp))(mold((out \ + 6bf9937b-a77d-42a7-9f57-9f9f162e4511)(label(Exp))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 138371d1-9d15-4a35-8af6-eb1edd8d400a)(content(Whitespace\" \ + cbfefc17-61da-4af9-bdc5-fa50a91c549b)(content(Whitespace\" \ \")))))((Secondary((id \ - c74dab91-dd43-4a99-b2e4-f84878d42927)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e72b3747-067c-4f64-ad27-92a483dd30a7)(label(+))(mold((out \ + 6163c6de-6e71-4ef1-8bde-e991d8ccba0b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bcd4fa89-24da-4ac8-8197-0d8872a0834f)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 356aeb17-6143-4172-9cd1-34e0edc27b3e)(content(Whitespace\" \ + dba9b153-a956-46de-9194-cf519c9720ce)(content(Whitespace\" \ \"))))(Tile((id \ - 4631828b-98a4-4adb-acde-60dec10289ed)(label(Var))(mold((out \ + ceb8a6aa-d3bc-4b9d-9fae-2b5b67c837ac)(label(Var))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - eb4f5b8e-4cf6-4a61-9f7b-b75f95db3db8)(label(\"(\"\")\"))(mold((out \ + adc41f09-c3ee-49fa-b525-0426c012826c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 4af2c4e9-4212-420c-a1af-6a730d626ce6)(label(String))(mold((out \ + fd4629c4-949a-4bcf-9696-43a766f68224)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - d04e2f93-d088-41d4-b4d7-165bd8ae9d3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 84bb0d48-c60e-492f-9974-39608462d37e)(label(+))(mold((out \ + f4984136-87b1-44ee-9752-979b14edefc2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d64d7e4e-eb6f-451a-8edd-f23500e14a2e)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6591f018-220b-4578-b83a-a2dd93538706)(content(Whitespace\" \ + 47200951-2264-45a6-bfcd-bfeb8dc8b909)(content(Whitespace\" \ \"))))(Tile((id \ - bf83cfb1-34fc-45ed-9cad-da9b1e70ef46)(label(Lam))(mold((out \ + 611fb2d7-1716-46b1-a8c9-c89dae56c464)(label(Lam))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d7a21532-d413-4b7d-8951-fc2a2c7ef1e3)(label(\"(\"\")\"))(mold((out \ + 8c41f20a-6ea2-419c-a6b2-a8e3e7301fd6)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 84c4b277-d143-422d-94c1-a41b0c32f8e1)(label(String))(mold((out \ + 1d51deb0-a097-4136-a767-6e579b447e4b)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b4560da6-0e43-4ca1-b0b0-1e07a4cad797)(label(,))(mold((out \ + 6218c554-b427-45a8-9bb1-17ef0f5dd836)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8e10e7c8-a0df-42ec-a637-d4112afeb0eb)(content(Whitespace\" \ + bd85bbb7-5d87-4d10-a22e-d6f177554d5f)(content(Whitespace\" \ \"))))(Tile((id \ - 3cccc626-9e27-41f2-8e3a-5ed948a6ba22)(label(Exp))(mold((out \ + 8dda8ef6-3204-43a8-8674-6bacda16cc58)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 85f43748-c420-4f25-b2ab-9d88979be42a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 86b97a89-5b67-4d3e-8fb3-1a90b14cbf3f)(label(+))(mold((out \ + 37da2d62-b361-4bcd-8b31-6a30d4d5924c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 689b5571-3559-4d1c-888c-13469271d261)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3de6cbd4-8245-40f9-95a4-4f80df52adb4)(content(Whitespace\" \ + cb387ae9-8a27-454c-aa28-0090c2355b3b)(content(Whitespace\" \ \"))))(Tile((id \ - b59701f3-e236-4a45-803d-16dbcbf051fe)(label(Ap))(mold((out \ + ed261e20-67be-4be2-a051-a76ea30d8c49)(label(Ap))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d56e4876-a01f-4798-8256-b0ee41620b09)(label(\"(\"\")\"))(mold((out \ + 360a009c-4583-412a-8b35-7bcb0ed8d2cc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ea5e82c6-57c5-40a4-9be6-bd8eb42b9e48)(label(Exp))(mold((out \ + 255d1aa2-f1d5-4074-bf68-2d51ca56dfb8)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 0d95a50f-1912-4fc9-a073-19cde3199387)(label(,))(mold((out \ + 203ccdaf-72b3-477a-8beb-492976d5da4d)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - db93a1a8-e49c-4aa5-8ebc-c6f1031e5e8f)(content(Whitespace\" \ + 87f1847b-f5cd-40fa-9619-ce3a0e72ac91)(content(Whitespace\" \ \"))))(Tile((id \ - fc420d41-b7de-4a3c-a561-3f2737bd19c2)(label(Exp))(mold((out \ + 847e9f2a-bfad-4ab3-a96d-6ce6defb2faf)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 9fceefac-7f2a-44d7-970a-fdad51aaac3f)(content(Whitespace\" \ + c35aab58-00f1-4ca8-bf9b-835aaf6692d0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 27e8ba41-e39a-492a-900f-e7ea032fba52)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d476076b-2192-4ac4-b08e-3900f3bc24a7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3ff6fd7d-2f30-44ed-911b-66b666d492c8)(label(let = \ + f6e7c54f-a114-4b6e-bece-bd3199165792)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 87e2863e-187a-4f11-8545-7da688b70231)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - cd8dd934-f512-4c07-ae0e-a0f78cbeed5b)(content(Whitespace\" \ + 1ef83eb9-3f05-444b-bb7d-068fde2c2c54)(content(Whitespace\" \ \"))))(Tile((id \ - 8f2b5367-5b2c-4279-923a-b433f408ba49)(label(exp_equal))(mold((out \ + bca20118-bd82-4c04-b37d-96bee479e24b)(label(exp_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9310d2cb-ff84-49ce-b4d6-ad3f9e49b4fc)(label(:))(mold((out \ + 6e790186-9611-41f1-b7bc-ddc30aaddd9d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d4dcba8e-9037-46a3-a1b8-7b967791b7bf)(content(Whitespace\" \ + cb8924ca-0d3e-43a7-828e-7eb89e91189b)(content(Whitespace\" \ \"))))(Tile((id \ - 915f0a86-3c26-4efb-9ef0-06687ec9bb01)(label(\"(\"\")\"))(mold((out \ + 1d5f932b-f9a2-4b60-aeb7-4d833793062a)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ba69ec27-add5-4406-8ae0-790ef2c657be)(label(Exp))(mold((out \ + 18fc5c01-c461-4986-b097-c2fec5b3d2d8)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - ebd056b9-0902-482f-9cb2-ed30a61f2575)(label(,))(mold((out \ + 20e497fd-1622-48d5-b219-fa1a5249bdf2)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a975ad88-1c5e-47a0-993e-b4f2bf336d74)(content(Whitespace\" \ + 5f4e45b9-7312-41e5-8de7-d4d80952f70e)(content(Whitespace\" \ \"))))(Tile((id \ - 617ef4f5-1b5e-4484-bbdc-f092c9424e39)(label(Exp))(mold((out \ + 07f9e9e9-f9bc-4987-9f4e-a3e156901cf5)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 9c498af2-374d-49c8-a1dc-5b0bcb180172)(content(Whitespace\" \ + 171462f0-3dd2-4a3a-8067-f21dfb2c7540)(content(Whitespace\" \ \"))))(Tile((id \ - 66f17c5d-b25d-42a9-96cc-db303a57be21)(label(->))(mold((out \ + 939775b2-9ad3-4bce-84e0-48c74cab3dd9)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a6fae7c2-f725-43ee-a87f-5ee7388445be)(content(Whitespace\" \ + 85afcdbf-b94f-4424-bee2-b53def4fac08)(content(Whitespace\" \ \"))))(Tile((id \ - 2031c5af-e21f-4857-854e-3ce448c13a29)(label(Bool))(mold((out \ + 02d7c62c-89e4-4938-a83e-b7d06909b14f)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 25ab0e07-2e18-4fb1-b4d6-5c9a2bd62979)(content(Whitespace\" \ + 087e5b8c-09d1-426d-a013-687161ab2495)(content(Whitespace\" \ \")))))((Secondary((id \ - c098dc3a-e273-4f7b-8a08-12325e681a72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6856b6ff-01ec-44a1-a424-ab3b31602649)(label(fun \ + bdcf7589-e0ee-4131-afb0-c3139a97e18c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5c933499-0bf2-4009-9138-e2d29a443b74)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d046885f-65f0-4175-81ea-5f46cc6b8399)(content(Whitespace\" \ + e7c7ed79-8461-4fab-bd8d-78c6c96abcef)(content(Whitespace\" \ \"))))(Tile((id \ - 55ffd275-9870-4291-b529-d6ef1f13cb10)(label(es))(mold((out \ + 4d9a6083-491f-4f23-9369-1b84e43a01ec)(label(es))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2e5c9834-9623-45f4-a278-e79b39cdcd72)(content(Whitespace\" \ + 5b2590d7-741e-413d-ac7e-5392ac905466)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e71d4326-045a-4d84-b7f4-c0ac5715fa33)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 775e9639-82d6-4367-b2fb-464ee98b155c)(label(case \ + 86e93cac-217b-4dbf-9025-2b8e86e6b81d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1c4ec87e-eaae-4887-878d-f71fd805cce0)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7f05fbc9-d56a-4491-b615-978ba1c53d8a)(content(Whitespace\" \ + e4b89713-e2f1-4622-b6e1-0d51bbe01326)(content(Whitespace\" \ \"))))(Tile((id \ - 28abc66e-2b9a-400b-9cae-bee0efe708b5)(label(es))(mold((out \ + 49604f1f-b83c-4518-a8cb-98aa4cbec2ae)(label(es))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f5402a9b-c581-4f2b-adae-e4484817ab7f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a1204bdd-f46c-4b05-a2cf-c468fd4d4a83)(label(| =>))(mold((out \ + 30ad0e33-d647-43c5-881a-7f1ec14665ac)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 09d15fa1-c56b-4eb5-8ffd-c586ff72b0d9)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 18c63e88-fa31-413e-b92b-fa7d7c63b224)(content(Whitespace\" \ + b1e29443-4215-4cf1-a28f-8ac0b2d54ccf)(content(Whitespace\" \ \"))))(Tile((id \ - bcb9a61b-2270-4baa-8589-224fce9e87d7)(label(Var))(mold((out \ + b3f75b90-0b5c-47df-861d-2f57bc382eaf)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 126ae8a6-1b8c-4920-b8fd-23a6e381e2a3)(label(\"(\"\")\"))(mold((out \ + 991b5158-8682-4695-8354-da44423508a7)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - ff5b63d5-203f-4be7-a10c-8cd20cff350c)(label(x))(mold((out \ + 08bcab16-ff76-40f8-9364-9c83ead35375)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 04618319-74a3-4bdf-9ad0-689ca3f18852)(label(,))(mold((out \ + e12db3c3-bf37-44df-94e5-1cf676b951cb)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - f5a9f073-2796-43e9-8b31-5a663d7375e9)(content(Whitespace\" \ + b870479d-a425-4f58-84dd-1cedf519dd43)(content(Whitespace\" \ \"))))(Tile((id \ - 8a0c4f9d-6960-44da-bb62-3f34fdfa962e)(label(Var))(mold((out \ + 4d8c77cf-69bb-4ae4-b4dd-dc4d794f8897)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 017996fd-f7b2-46ad-9f67-3e764759a0a3)(label(\"(\"\")\"))(mold((out \ + 1794fa56-7d2d-4442-8196-238ba6f91d11)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 132a73f7-3da4-45c4-acef-065a9558a986)(label(y))(mold((out \ + f557fc91-29c8-4812-8042-39ebcd4ccd37)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 3a150d65-4664-4d0b-ab8c-0b00ecf6184a)(content(Whitespace\" \ + 4a06f924-cb34-4388-91e2-85c86e8d3824)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c281b06d-c1aa-4a4a-a43b-3e03de298ee4)(content(Whitespace\" \ + 9c871044-e3c2-4441-8440-445f2528a44f)(content(Whitespace\" \ \"))))(Tile((id \ - 05e5ff5d-5dab-4654-af16-71532427b041)(label(x))(mold((out \ + 99bb6b4e-bba5-4546-b72e-c0d5892fe9d7)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4169c9cd-e49a-470e-b7e9-5aec116f507f)(label($==))(mold((out \ + 177d2206-592e-468b-9ba9-5535d88742fa)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4770a22d-6851-4b17-ac37-27940b4c5174)(content(Whitespace\" \ + c420a695-9eb6-414c-915f-9dac216bf14f)(content(Whitespace\" \ \"))))(Tile((id \ - 7c341b34-91b8-4a53-83c5-ce3543d406fe)(label(y))(mold((out \ + ac0afd6c-f825-40ee-8287-036fbb1bd868)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c8d49c08-33f8-46f0-af49-986b023d800e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b6a8d547-f7f5-4ecf-8547-9f3168d002c0)(label(| =>))(mold((out \ + c7be67d3-af01-4e2f-91b2-8823920ad4a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 88fa2283-e9c2-4506-935d-140d834e0320)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 113e9d3e-4419-4630-8f81-2f13b5875bcc)(content(Whitespace\" \ + 5cc174f7-7957-4188-a7c3-379f04576c02)(content(Whitespace\" \ \"))))(Tile((id \ - 0f466b10-1506-4a52-a0b8-629a8621f348)(label(Lam))(mold((out \ + 483f947a-ac10-4acd-b2de-0a1d2b1b02d9)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e8308f60-1f55-4794-8f40-b0f38c59106a)(label(\"(\"\")\"))(mold((out \ + f784060c-bb78-4f26-97b5-e4ea3c5a22d7)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 37ab0926-942c-43c5-bdac-654bbd27e81a)(label(x1))(mold((out \ + 25dafdf1-78a1-4622-93fd-16366671e489)(label(x1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 17aa91ad-4c57-40d1-984b-6ae9dc9d61ce)(label(,))(mold((out \ + 5824afb7-106d-4f9b-a9ec-94cdf235cb30)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 25c085bb-62bd-46c1-93bb-9cbeb94c9360)(content(Whitespace\" \ + 6943c98f-98e0-4f74-8d15-7eeefe0aeb47)(content(Whitespace\" \ \"))))(Tile((id \ - a366fd85-f010-415d-979f-e3adba5ebfca)(label(e1))(mold((out \ + 2c52d12e-b11b-4538-b0e8-851eb5f10228)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 47feb313-ff57-458a-98d3-8941c5a4853f)(label(,))(mold((out \ + c1054002-5be5-40ee-9248-8cecdcb89534)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 29ed3be8-4ca5-4332-a904-091aebff0c47)(content(Whitespace\" \ + deb91752-01b3-4d15-a78b-4625cdd0bea9)(content(Whitespace\" \ \"))))(Tile((id \ - cca1243e-47c6-474f-b9cd-28fc1581ccbe)(label(Lam))(mold((out \ + ee66d17f-3e5f-4012-adbe-0eea9faca995)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1c4d1794-e0c6-4a0e-ad41-be71e8acaca9)(label(\"(\"\")\"))(mold((out \ + 19018f03-b39d-41e4-afca-efe105aae11f)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - a4bb1b0b-54e8-436f-924d-d212bee337ef)(label(x2))(mold((out \ + c008013d-d23f-4ebb-93f5-987bf182992c)(label(x2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d73ac96f-5ae2-481c-b9e1-ac95fa6d793c)(label(,))(mold((out \ + 0272e87c-0496-4ef1-a601-c8d106166286)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - df942099-3866-4814-ae31-192d1bdd05f0)(content(Whitespace\" \ + b4b09f5a-c7ac-4582-af59-80be1d945d81)(content(Whitespace\" \ \"))))(Tile((id \ - 062d1ce2-9525-4334-aea0-447d037ab810)(label(e2))(mold((out \ + 58ed4423-a42b-4291-93c3-628263b1e036)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - c2533d7a-585c-4983-b7e9-f64648b85a30)(content(Whitespace\" \ + f8f2dc65-4b81-4d57-a8cf-e68ae3df44a4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - bb40f7f3-9bfe-494e-bb4a-c37cba63df8f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - afcf2c84-2c1b-4593-a7e4-4862ce5239cd)(label(x1))(mold((out \ + d3bf75b9-99e0-4176-a05e-cc8c95db8a29)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 57972523-cc02-4acc-bb1a-81ca30cf8583)(label(x1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2d0a52bc-6339-45e1-80a0-e22c792bf0b0)(label($==))(mold((out \ + d7398025-eb11-40e3-9f7e-eaed71dc114e)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 52e51e67-af52-4f1e-a80f-c866eb12f98e)(content(Whitespace\" \ + 8779d04f-fb8c-4fa8-8bfb-213543ad055c)(content(Whitespace\" \ \"))))(Tile((id \ - f0bc6ac1-e2b4-4a24-8e17-382f5a6c24ce)(label(x2))(mold((out \ + 56307951-b996-4547-b64e-cf617c32e704)(label(x2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0808c2ef-3617-456f-acca-ec6e3b1f1b85)(content(Whitespace\" \ + d252745d-e3af-4e1e-b8d0-8b263c5186f8)(content(Whitespace\" \ \"))))(Tile((id \ - 2cc9d91d-b239-4279-b2e3-368d29f92aee)(label(&&))(mold((out \ + c6029ba2-a6e5-4a89-b6ae-57e93bfb7605)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 9e156604-e7f1-4fc8-95b2-b666e205329d)(content(Whitespace\" \ + cfd6db7e-347f-41f6-9fa9-5a435ffd4506)(content(Whitespace\" \ \"))))(Tile((id \ - 19beded0-d470-468b-9c07-21a1b1c4153a)(label(exp_equal))(mold((out \ + 4db0f488-ebc4-4242-9976-3e325b6cea6e)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c3f9fe12-cc9d-478a-85b5-8a576b9aaf3b)(label(\"(\"\")\"))(mold((out \ + 08dc2150-c466-49e0-b318-3a64c4e5b1ab)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b28a7e62-e7a0-4c5e-80a2-f3d9375f1493)(label(e1))(mold((out \ + 89bd3dcc-3908-4d30-962a-d8ab2a16e5b6)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a9579ebf-69e4-4683-918e-fe3a847e1cf2)(label(,))(mold((out \ + da4dba7e-83f9-4ca3-8fa5-183a9eec5d6d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 379502fc-f6cd-42a7-a5ad-87cc9a53fb5a)(content(Whitespace\" \ + 20d35d5f-957f-40db-80f5-46784e84b719)(content(Whitespace\" \ \"))))(Tile((id \ - 79534ecd-68f8-40c3-94e6-158c520e1bb4)(label(e2))(mold((out \ + c3a57a74-3673-4026-a361-e2651da9a036)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 59056ebf-7109-406a-ae06-e2bdd6c91b7c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3431c094-b565-4aa1-b225-45cb0f1c5b92)(label(| =>))(mold((out \ + b42e7c5c-a3b4-42c8-8d71-e9c25061805e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 93e7a1f5-52f2-4545-b5e6-8db273cec273)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c89f70da-923d-47b8-8067-3966ae0d6708)(content(Whitespace\" \ + d8d8e442-5920-46a9-80c2-4e8f3e8f684c)(content(Whitespace\" \ \"))))(Tile((id \ - 852eb701-a4a9-4f98-9f59-9f15554718f5)(label(Ap))(mold((out \ + 7777d925-00b5-4a7a-91d9-0b19dbc932b5)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c46637af-fbad-4cd7-9106-76ff3b6a7974)(label(\"(\"\")\"))(mold((out \ + cd7d67be-e622-4c20-aa81-881e92b0a24e)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - e1b5355d-f779-4764-83ae-027e50157f62)(label(e1))(mold((out \ + c06bcda1-7eb8-4200-ab52-a11675e4bc03)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 249f20e6-4556-49a8-8344-2f3ec92139f5)(label(,))(mold((out \ + a4d1173a-853f-4138-a502-8c548687a849)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0cadaf5c-fc04-4a92-b5f2-a5d286f71ed1)(content(Whitespace\" \ + 3e7bfc30-bb8c-4890-ac2f-bc13baef1792)(content(Whitespace\" \ \"))))(Tile((id \ - 4cc06d1c-2884-4fb3-ae73-e8a8b7b0878f)(label(e2))(mold((out \ + 27b96538-5116-4980-8b98-7e8c2894f5c7)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 927a44f1-7768-414a-b550-b815e379d7e1)(label(,))(mold((out \ + f23c6222-5f24-4f49-ab5b-17af2afae6f9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 8c683626-c44f-494f-94b9-a107a934a415)(content(Whitespace\" \ + 32a82d04-ac99-47a1-a1e7-872b1e60739e)(content(Whitespace\" \ \"))))(Tile((id \ - 8f464a90-291a-45cd-98d8-1af6203a228a)(label(Ap))(mold((out \ + 6c23fc67-96e5-4161-b4e3-8421c76ddd5d)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0b6285ee-7e82-4e98-8e2f-92499e9f0762)(label(\"(\"\")\"))(mold((out \ + 12c4f77e-842a-4195-86a6-950ef14e7d8f)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - b5ae1798-438b-4fd9-81d7-28ef075ebb15)(label(e3))(mold((out \ + fe3a5a72-99fd-46b8-bde1-521d56e240c1)(label(e3))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5c685b5d-8ea1-43f4-8a04-88fd62cc71ea)(label(,))(mold((out \ + d193a973-50fe-4723-9616-cfad0f84b309)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 7cbe4ffa-4db5-4a17-aaf9-1d6134f8b07f)(content(Whitespace\" \ + c9559784-397e-445a-97fa-28bb986f3e23)(content(Whitespace\" \ \"))))(Tile((id \ - 65bfd6a9-1713-42e9-aa34-d6b1c4359ab4)(label(e4))(mold((out \ + 0c150232-39fa-449d-a12a-e3456255d2f9)(label(e4))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 9ec97e81-e00a-499f-838c-a9e0d835518c)(content(Whitespace\" \ + ec24579c-b065-4456-8c54-cd52426ce789)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2341e9d2-1649-475c-a553-cc1eeb546430)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cb880a9d-56ad-4ef6-8fd6-21c2bb16f703)(label(exp_equal))(mold((out \ + 8f9281cf-8e00-435c-b096-533ded2926ec)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0118c709-63ab-4a0b-aeb6-f7fe27f34e2e)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - fa218c65-b3e4-40ee-bd83-bf4b577074d2)(label(\"(\"\")\"))(mold((out \ + d9570de0-2490-4a27-819f-f3e566e4b03b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8390c6c2-6b7d-4dad-99a3-f54220580a43)(label(e1))(mold((out \ + 6fd6e109-842e-4ae2-b224-31105dc1e085)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a349c406-62d5-4c99-b8bb-66df3e14e2b4)(label(,))(mold((out \ + 01e3eabe-be65-4c87-ba8e-b95671f0b0e8)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 062221e3-e10f-4763-a30c-1f9943a609fe)(content(Whitespace\" \ + f89950a8-e39d-4205-a3ae-f0b1d615f826)(content(Whitespace\" \ \"))))(Tile((id \ - a383bd27-b3df-46e0-a9a2-e2202885172a)(label(e3))(mold((out \ + fdd36e5a-1201-4570-a4f0-bdd079780d77)(label(e3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 663402d5-d307-4c6e-9a17-f512bdad54c7)(content(Whitespace\" \ + 8330a8fc-a0d9-47b8-aec2-34217f62d0f3)(content(Whitespace\" \ \"))))(Tile((id \ - b9a7d200-cf57-46a3-be75-be9f0d8814cd)(label(&&))(mold((out \ + 5d31fe6d-674c-4957-bdd8-246461542e1a)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - dd59b20f-d55f-4317-a1b4-617858b49e24)(content(Whitespace\" \ + d09d5ae0-0af0-4756-bd8d-1466366badce)(content(Whitespace\" \ \"))))(Tile((id \ - 83d72ebf-f407-4fa7-9ebf-5bfe83bf24d2)(label(exp_equal))(mold((out \ + 358bb054-a86e-4829-b895-b6533572f20b)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - db523698-c224-4dfb-8c0c-eef884537326)(label(\"(\"\")\"))(mold((out \ + 65364f13-f825-4e78-94cb-996a4d57870a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c92d439b-0709-4618-ab04-ad09abb45294)(label(e2))(mold((out \ + caa1ad83-a436-411e-baa9-6e5abf76b70c)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f410d8e7-20fe-4cdd-8456-860e27578b4e)(label(,))(mold((out \ + 628f63ad-0ef7-48cd-98fe-4b694d2bc65a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4adee34f-36e1-43b0-bf36-f5229fa12e44)(content(Whitespace\" \ + 34325491-2e31-41a9-b150-a6b15d6ee34f)(content(Whitespace\" \ \"))))(Tile((id \ - df8056b7-f259-44ef-9cb1-bba4895fdf87)(label(e4))(mold((out \ + e140d00d-944d-40d4-b082-a20abe5aefe7)(label(e4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f06ca057-5fd0-4f1e-9fdc-f0f40a9958bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4296f516-d59e-4841-b10e-511e59d2cedf)(label(| =>))(mold((out \ + 6f0e1b2a-77c9-49b5-9290-ae7f951b899c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + acf42a0d-0558-4d4d-b50d-d41d50b2bab9)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 69b50ede-03f9-4320-a83f-1c5bebd3fd2d)(content(Whitespace\" \ + 5727107a-776a-4acc-8c7a-96f19a8c4f1c)(content(Whitespace\" \ \"))))(Tile((id \ - e6bf9f85-b4f8-4993-9e66-4dc8c1287e31)(label(_))(mold((out \ + a2cc6b9e-74e3-4747-a5bd-f8ee3148e4ab)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 25b0b7ad-154d-4a9e-8384-0695b197c862)(content(Whitespace\" \ + 87c749c8-e623-4223-9421-12be366240fe)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 27be5ef9-1f5d-4695-aa25-3e5b3d642f41)(content(Whitespace\" \ + a9b239e6-2c97-404f-82b3-4053433501c1)(content(Whitespace\" \ \"))))(Tile((id \ - 1b28968a-f760-48bc-9258-7a09de737135)(label(false))(mold((out \ + 75b1ebc4-eb65-46a8-9341-9e6e3566d804)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 66c56991-9d96-4042-a8e0-9b16ecebb05e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 9c2026d7-b415-48ca-8601-a353118432e0)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 971b24d6-846b-4a0d-9333-196d67a5a503)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 41962403-3570-4e16-9ff4-1736137a5cd7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6d6a355c-b30c-4761-9668-d0ad57f074a0)(content(Comment\"# \ + 0771b350-f378-4a2b-a2b9-021bff0d04ae)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 7c2d8988-697b-41b0-9950-bbfbfa42f319)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 35b974b6-f801-4db8-ad23-cb6f61bab1cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e97172ed-5c21-4bee-a719-d3f768284007)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bed537d7-249a-4801-b0d7-f5e3db6d4866)(content(Comment\"# \ Polymorphic Functions #\"))))(Secondary((id \ - 21905b9a-a6f9-40ac-b2ba-93ee1519a867)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b3d1516a-6289-4357-8fcb-cd31a7417d3d)(label(let = \ + 468d07ad-2072-4600-9f0c-a11ce44fc622)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d860d389-4e70-41d9-8acd-505b3a4449af)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5b8e28da-aba0-477e-8ac3-2c914ee5872b)(content(Whitespace\" \ + 9d7b38c0-2d23-4de6-b6ee-5ec73592e2f2)(content(Whitespace\" \ \"))))(Tile((id \ - 24ba6503-9f9d-4a45-a61d-d651796b076e)(label(poly_id))(mold((out \ + 89ed6472-f8e2-4581-8f0c-f95e762b51a3)(label(poly_id))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 86ff7c62-8a0b-4425-a223-b7ac16c8c63c)(label(:))(mold((out \ + 81fc71f6-7daf-46cd-bdcd-703d8aebdf38)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3c302621-20eb-44f6-8536-f816d5da4934)(content(Whitespace\" \ + d30d1531-7872-4b71-96ca-1ecb96663d30)(content(Whitespace\" \ \"))))(Tile((id \ - e8ce28cd-9851-4be6-9780-4360b3ddb0e5)(label(forall \ + 0aea66fa-1062-4edf-9966-4ab277c15b5d)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 91b433a1-24d8-4758-b965-bd4163d1c67a)(content(Whitespace\" \ + a5122ebb-2dce-4b17-9888-13ae282bd811)(content(Whitespace\" \ \"))))(Tile((id \ - 1d4669e0-cbb6-4944-af0e-1c22d741a180)(label(a))(mold((out \ + 80db071e-74f9-4511-933f-ba4a00e96e5e)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 7254a615-a7a8-48a1-ab11-6779c0b71271)(content(Whitespace\" \ + 9380c2e5-6950-4c62-bb2d-c2b769b87c81)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 647cb177-f75f-4275-93c8-2a1ffafdcd4f)(content(Whitespace\" \ + 48cd48e3-a5bd-4cfe-aaa8-ca70dcc2bda0)(content(Whitespace\" \ \"))))(Tile((id \ - 19c49e0f-33a6-4085-a85b-a177d307a3a6)(label(a))(mold((out \ + 025bda10-00b4-49cc-ab65-fbaf55c0c5f7)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e305cb06-a4c9-4567-b53e-da97948cc664)(content(Whitespace\" \ + 04496ea2-8fbf-423a-bfe9-d0817eb40387)(content(Whitespace\" \ \"))))(Tile((id \ - 6ddee43d-97bc-421f-8f01-c54b59224b17)(label(->))(mold((out \ + 8bef23d0-8423-4dc3-997f-a28cdfa8786f)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - be7f44ca-2476-428a-9e0d-93f41a966d4f)(content(Whitespace\" \ + e6d8b599-7731-4cf4-9bff-cf6b8398c557)(content(Whitespace\" \ \"))))(Tile((id \ - f94def93-71b2-43ab-9214-de44941316cb)(label(a))(mold((out \ + 19442b68-e459-4435-999d-572e78d1ecb1)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 15c59c17-9886-4131-b1e9-f75c36da22af)(content(Whitespace\" \ + 3caa6d98-fbda-4230-8ce1-23e7e59b42ae)(content(Whitespace\" \ \")))))((Secondary((id \ - 214c1174-a5af-4f1f-aa21-2b43305d59c3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4bc17fc3-f298-4dda-8b28-d7e8b0b9371b)(label(typfun \ + fe6d9bc5-d938-4bad-8410-a5644198c1fe)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 10e47702-9ed6-4047-a31e-f60e9c38bfae)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - cee843ec-33e6-4a68-834d-32ae4b681de7)(content(Whitespace\" \ + 4bc235c8-1178-4d45-a843-5921dffb16e3)(content(Whitespace\" \ \"))))(Tile((id \ - dbd2bb66-b044-4c28-aabb-f13a5611d67a)(label(a))(mold((out \ + 86ec1153-2afd-4d96-a855-c5d154d5724e)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 777a2a3f-f230-41bc-be78-9950f83dbe30)(content(Whitespace\" \ + 74fa1515-541c-4384-b42a-5858a648f0a3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fc6108e4-b29a-426b-ad7f-b077cfa57301)(content(Whitespace\" \ + 311381e9-1a33-4257-ad9e-06f0c8dced06)(content(Whitespace\" \ \"))))(Tile((id \ - 3efd1f3d-4d36-421f-8f51-ca1679588976)(label(fun \ + c49b891a-d682-4a16-a988-68d521e157f6)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - c0db07e4-bdf2-44b0-8cf0-5db24f495fe3)(content(Whitespace\" \ + 411c98ed-edcc-4333-83b6-f0000d807ea4)(content(Whitespace\" \ \"))))(Tile((id \ - a9c2455d-fc98-44d4-9176-95c40d8b0b1d)(label(x))(mold((out \ + 98a6ef15-d65b-4349-a9e1-f7d6a62479c4)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b38d2193-cd18-43cb-9040-0c1bf9e2a2c1)(content(Whitespace\" \ + 9642d43f-7a56-4842-bca9-a1df28c161da)(content(Whitespace\" \ \"))))(Tile((id \ - 77573c7e-7bb7-4ac6-a478-833a4619c577)(label(:))(mold((out \ + e6c8ae8a-03e2-4fc5-afa9-2ed13e380f98)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b6b9a9d9-2ca7-4011-b278-12b08d33b5d5)(content(Whitespace\" \ + be3c5855-6d2e-487a-b148-2b8aa325c9b9)(content(Whitespace\" \ \"))))(Tile((id \ - def39d28-d1a1-41fc-b5b1-4ee59a258b9b)(label(a))(mold((out \ + 9bf25180-121f-413c-877a-a6735079fb5a)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 049974eb-7207-4b1c-a87e-15c88cac7859)(content(Whitespace\" \ + 41577e41-f6c4-41b9-83be-b946861b882c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 68d5508a-6bab-438a-b042-750232afe51b)(content(Whitespace\" \ + cad92b1a-627d-49f8-ac8d-e6ce84c1fd78)(content(Whitespace\" \ \"))))(Tile((id \ - e3be5166-2d7e-49c8-9352-00ad0a05eb7a)(label(x))(mold((out \ + f702a918-0911-4e2f-88da-73a513485473)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cf559632-8e94-4b3d-95ee-397f79d2f861)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - f429d62b-a042-4491-9aa9-55439fd6173e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7913a665-6dc5-4b1d-9ed7-d7000473bfe4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1a6be598-d3a2-437d-9483-1c414752ea47)(label(let = \ + 7bf2fe36-0eee-4b09-a1c8-51922cf820f2)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 1d3fb4c2-5f2c-4ff5-8279-e2fd5bfd3c89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 661b025d-e185-4b0c-8b88-235037c32854)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e18ba221-97bf-43b1-a006-00e222b8ea19)(content(Whitespace\" \ + 5adda831-5cbd-4b88-88c6-88bd2b391b2f)(content(Whitespace\" \ \"))))(Tile((id \ - 5c8719df-a29a-44c9-949e-56c5bf1b3c08)(label(apply_both))(mold((out \ + b22e8b4b-785d-459e-8dd8-69171a3b9be2)(label(apply_both))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e806bd56-05b2-47c5-8c6c-1d1067184696)(label(:))(mold((out \ + a00031c1-914c-4302-b39c-3b32083ed388)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2ecb2f93-c7d9-410f-9f37-799519cb8478)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e7c20431-342f-4d76-9fab-e558e5234cdd)(label(forall \ + 6f5db371-9696-4cda-a157-6a6f42a34867)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6e7f11fb-57c3-4878-8ed7-560700b56262)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 7e1226b3-e7fd-4304-8850-a7e18d432e16)(content(Whitespace\" \ + 4bbe0a16-b4a0-4b47-b3c2-e8d4d8ca74fa)(content(Whitespace\" \ \"))))(Tile((id \ - 700e3c27-501e-4b4e-953d-408843253b83)(label(a))(mold((out \ + 5131af46-0937-4f7b-9a4f-3ac376f06dbf)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - c27c2c90-6de7-4698-af81-7fd7156df1f1)(content(Whitespace\" \ + 18a883db-98ac-4d85-b062-0d867c4ab032)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fa32d46a-b496-4211-aa6e-a7f1b1291fdf)(content(Whitespace\" \ + 65838504-ea2b-487f-8f3e-cf6a695718b7)(content(Whitespace\" \ \"))))(Tile((id \ - 72290de7-e529-49ec-9a05-da716bc19f29)(label(forall \ + cd7245b4-d01a-4f43-87f8-dacde22c464a)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 74003f70-6511-4276-bb0c-f29378988bdb)(content(Whitespace\" \ + 9fa93999-4dbc-463f-8bfa-7a68a916efdd)(content(Whitespace\" \ \"))))(Tile((id \ - 2e89feb6-6e16-4754-959d-b924c6814394)(label(b))(mold((out \ + f9959a50-a688-4464-9452-941acf717974)(label(b))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0e8af3ef-31ee-40ba-bf0f-ca84e94c2393)(content(Whitespace\" \ + dd3d924b-68ad-4e85-a18e-657702ff9fa0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1c77ad00-e350-428a-8c1e-8091f973a6ea)(content(Whitespace\" \ + df048d24-dde3-4d48-a3ba-62a4bd9c8d3b)(content(Whitespace\" \ \"))))(Tile((id \ - 81f0604c-ead8-4781-943e-063c54c13ddb)(label(\"(\"\")\"))(mold((out \ + cdd2355a-22e5-4538-9cd5-cc1816f4adbc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c5b9a343-9802-4bb1-b016-c572dc42edf9)(label(forall \ + 8020c164-38c1-4640-9034-9109aa81c621)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - ddea8d53-3400-443e-8d70-bd38431fa369)(content(Whitespace\" \ + eab3f9d2-970d-42fe-a6a2-1ccfee4a97d9)(content(Whitespace\" \ \"))))(Tile((id \ - e907d57c-b477-4744-b0c1-a5939f1cac8d)(label(c))(mold((out \ + f282e64b-67d0-4c82-91d1-6adf3deb142f)(label(c))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 300d687f-39f5-4a42-a916-5c5c39dedb3f)(content(Whitespace\" \ + cc445848-526a-4319-9006-9e2658f2ab3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 638d6964-980f-41f8-94e0-3510a97b38c3)(content(Whitespace\" \ + 3ec1bb75-0e97-42f4-8edb-e02f46a3d18f)(content(Whitespace\" \ \"))))(Tile((id \ - 791406d0-15e8-4738-9de7-ac6e7c0712d4)(label(c))(mold((out \ + 3755ec62-5b56-46b3-afdc-bcfdfeff0cf7)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c5890724-3d93-4da5-981c-de4c26a3bbae)(content(Whitespace\" \ + b9340dda-6392-443f-99ab-a679b128f6ad)(content(Whitespace\" \ \"))))(Tile((id \ - c2d044ec-9450-4fbd-b63c-a15bf6a61418)(label(->))(mold((out \ + 5c5c001a-1ee8-4380-847c-c4e35629e9bc)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f7f742b3-db5d-496f-bc80-2e66f22f36ac)(content(Whitespace\" \ + f6472e4f-741d-45d0-b04e-390cdb001e4e)(content(Whitespace\" \ \"))))(Tile((id \ - 4ee07ef1-9c2f-4a4c-8006-b4ba21fce45e)(label(c))(mold((out \ + 32f123ee-ee2c-4771-bfe8-1171b92d0700)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - ef2eba03-e2e1-491e-a53a-05751ea1a052)(content(Whitespace\" \ + dfa00c39-2b18-486c-b0fe-0bfdef549bb4)(content(Whitespace\" \ \"))))(Tile((id \ - 3d0c7625-8e86-49e2-b066-b558a4f6a100)(label(->))(mold((out \ + 10972e77-d5ab-4763-861c-a65ba5beb6e8)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a49b4172-22fb-4502-8a2f-bfc064b95c38)(content(Whitespace\" \ + 54cfbc38-c6c7-449a-bc4b-bff57a4f79c2)(content(Whitespace\" \ \"))))(Tile((id \ - baa2a430-0774-4caf-895f-873d5c1e8314)(label(\"(\"\")\"))(mold((out \ + 285ec887-4967-4916-a0f1-5538915bf649)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 21e63e6c-ee32-4911-a596-9eabf9f15d3e)(label(\"(\"\")\"))(mold((out \ + 3734a24a-2337-4c55-8d9c-32387556d50a)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 7149dfbf-faca-42dd-a9a8-6b7ac9a3510e)(label(a))(mold((out \ + 8ba6ec34-58b9-4016-8141-b65db3f8dc41)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c2273d8c-16d6-4e07-a524-0428ef184d34)(label(,))(mold((out \ + b4245ba8-6724-4b57-8cb4-f0a9edba38d0)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1698dab5-dd69-47e8-adb0-e8c498d05ca4)(content(Whitespace\" \ + 0b260dac-8d71-4587-84cb-6955f391dbc3)(content(Whitespace\" \ \"))))(Tile((id \ - 6dfc6dc6-f204-40eb-bd04-2767d86b73a7)(label(b))(mold((out \ + bc630349-1ad3-4a44-a88d-1bf03b242c4e)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 49fe5923-e586-45e2-bad4-beacb36f27c5)(content(Whitespace\" \ + 997293f3-cee7-47aa-9723-e4b2d044a4d6)(content(Whitespace\" \ \"))))(Tile((id \ - a7f3dd27-7917-4f32-b680-c20d74110529)(label(->))(mold((out \ + 6662b657-a0ff-447e-97cf-f45e96e9f0e0)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 522303df-0ae0-42b2-b8d6-9593900b289b)(content(Whitespace\" \ + 4f688801-18d0-4acc-8b34-00e89fb9bb4d)(content(Whitespace\" \ \"))))(Tile((id \ - 0a1528e0-9e92-4202-9360-1dc078c85533)(label(\"(\"\")\"))(mold((out \ + 471a85d8-8385-4d8e-b82f-2ed15691a0be)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 6183595a-cfad-4279-90da-73de5c63045f)(label(a))(mold((out \ + 417721e8-d33f-4846-8b5c-162069abd647)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 335f1e78-2738-4219-86d1-55f41fe7c63b)(label(,))(mold((out \ + 6eee2e2a-9fd0-4556-800a-d93b23bfc513)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 57f1b625-61b5-4597-a946-9b1f52e4b541)(content(Whitespace\" \ + 17b5bd6b-aefb-4319-92d5-913460b2a384)(content(Whitespace\" \ \"))))(Tile((id \ - 17578625-5832-411c-bc53-60a0158c93c8)(label(b))(mold((out \ + 634a584c-c2ba-45f0-8feb-6b8e5eafc855)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 23032708-8f4b-4330-9e79-56c7b604656a)(content(Whitespace\" \ + 9fc10d0f-7e38-462f-883d-f6e65e88afa4)(content(Whitespace\" \ \")))))((Secondary((id \ - 495c89f6-fe75-4902-8ddb-f65597dc43be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6ceba9d5-8233-4d5e-858b-816190623301)(label(typfun \ + 8afc84aa-4d5e-4feb-a5a5-991ad2e5ac72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bbc8c0fc-0cd8-413d-a615-42971db86dc7)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b5e6b75b-cf21-47e0-af42-4fd796ca491c)(content(Whitespace\" \ + 43a18c72-5b68-4134-8905-9141115a5bc4)(content(Whitespace\" \ \"))))(Tile((id \ - 3e171e44-65a8-4182-a0eb-af0d55cb22fd)(label(a))(mold((out \ + 422f9659-9f20-472c-a448-8ef55f396827)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 5d422ee8-fc19-42bd-b04e-15fd45ac89f5)(content(Whitespace\" \ + b3c6a197-f594-43d5-8fda-cc9eb49bdaf3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f8b796ea-c37d-4099-b7cb-0816cb2d2e3d)(content(Whitespace\" \ + e4714ad8-87ff-45c2-8f41-e224095f4645)(content(Whitespace\" \ \"))))(Tile((id \ - 3e0ac016-0530-432b-b91c-6c27be2076fe)(label(typfun \ + fc148e9f-54b3-4cad-af66-5b2ee39a1c4d)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 40809fcb-af51-4f66-8e95-973afaa4cc6b)(content(Whitespace\" \ + 19f1a1dc-0ea1-477b-a37f-c84681e70a32)(content(Whitespace\" \ \"))))(Tile((id \ - 4bda2e12-e619-4fa7-aa3a-78db78a17612)(label(b))(mold((out \ + b15ca06c-e9a3-4001-aad0-29021f05f152)(label(b))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0c385d39-545b-4eed-bb72-a76f20ceae13)(content(Whitespace\" \ + 87449a19-2f6c-440a-8204-27c5dff29583)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5f424130-4226-4bf2-b6de-81f3e32d81ef)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 7cfc26a4-f49f-4a09-af5b-25818b7496b3)(label(fun \ + f698173c-4d10-4a9c-a57a-b53ad5b95b62)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 76c601eb-3510-4921-994d-682795ce77ae)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - baae879f-fd48-4c17-8b65-59238b80ff79)(content(Whitespace\" \ + 14be1fed-3350-4143-af0f-5a6213b76582)(content(Whitespace\" \ \"))))(Tile((id \ - c80afa8b-2d72-47d5-925e-32d21e3a197d)(label(f))(mold((out \ + 3263f6f1-5df2-4229-8cd1-68ef144edafc)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 9baf2fcf-75dd-4e42-b633-a0a5045f1eed)(content(Whitespace\" \ + ac54ceaa-c2cc-4438-b1da-660fc67b3e6b)(content(Whitespace\" \ \"))))(Tile((id \ - 03463e7c-a515-42e4-bd24-a8e163876a8c)(label(:))(mold((out \ + fd0dacae-07a5-48cd-83b3-f504b1197c36)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 22638aca-27d9-4511-9789-590b4c79079c)(content(Whitespace\" \ + b4316272-c342-4534-af0e-4094cf3ed0bc)(content(Whitespace\" \ \"))))(Tile((id \ - 91ac4f01-b4d8-428e-9e91-61b9082b7311)(label(forall \ + 59870199-702e-4b0e-8c4f-8f0404620c44)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 13a9e88b-79ee-4f72-ada7-9c94e7fd2f82)(content(Whitespace\" \ + f0f0783d-8963-45fa-bacb-a91508fdb375)(content(Whitespace\" \ \"))))(Tile((id \ - a8533dd8-607a-46e8-be24-93150f3f6be4)(label(c))(mold((out \ + 4e314d63-8685-4667-ae97-6ce82773ec7c)(label(c))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0709b18f-2d26-413b-8102-474edcca2870)(content(Whitespace\" \ + 9ebad39d-31cf-47fd-819a-e8f266f33336)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f498dbe1-c41d-4c5d-b901-ab497d603ecc)(content(Whitespace\" \ + 3a77f61a-71d1-4c18-9ff0-922f16e85733)(content(Whitespace\" \ \"))))(Tile((id \ - 4588dbf1-6168-4a4e-9198-2d75624565a8)(label(\"(\"\")\"))(mold((out \ + d8ba78a8-7f94-4a03-a4e1-09bb4371a4f8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 3ceb4e96-dd18-411f-9a30-345d0fa2acd9)(label(c))(mold((out \ + 88eca7af-b9aa-41c1-ab68-ad9401691be8)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 71e7bbbf-2dce-4b71-a29b-d2b0d814938c)(content(Whitespace\" \ + feb7e83c-7c0e-454e-adca-d5ef1fef33cb)(content(Whitespace\" \ \"))))(Tile((id \ - a198872a-9b3a-4960-8049-7e76fc979b2f)(label(->))(mold((out \ + b505e9c8-475e-4b4b-902d-c957970883d3)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bc85bed6-0b9f-45ed-a8e6-a7f5f083110e)(content(Whitespace\" \ + c7750218-9a40-4725-b8df-3be200b7fb5f)(content(Whitespace\" \ \"))))(Tile((id \ - d164411b-4f2f-4a20-941a-dfd67453a3f5)(label(c))(mold((out \ + c8835d74-624e-416d-9c7e-4b907e265a86)(label(c))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 99a0047e-4230-4e71-9e6f-c3f17f7b5272)(content(Whitespace\" \ + cfd9cde0-f97d-4607-a5df-7e18d41f84ea)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0f2f472a-9399-4706-acce-c9a6a1d417d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 77861bd4-d59e-465b-844b-dd81a4e8cbfe)(label(fun \ + 28ab692d-0726-4739-b34f-0a26dd9e8211)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ba984153-cbec-4dab-8904-8f442c5a0bc5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0ad60cad-1311-4a2f-b2f9-1b3f06d61bc5)(content(Whitespace\" \ + c3e66832-65c7-43dd-9252-f10cb8fa3c9b)(content(Whitespace\" \ \"))))(Tile((id \ - a0fe5e4f-897e-49fd-8281-eaaec43dd461)(label(\"(\"\")\"))(mold((out \ + 96a2c85c-065e-4e50-805e-33cce865c7f1)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 5535941c-450d-4f60-936d-0e879eb05d57)(label(x))(mold((out \ + 95a358e2-4fdb-49c4-a11e-f4b629579ebe)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9c04d0e4-dd16-406b-a490-f217b0b8908b)(label(,))(mold((out \ + 190abcd5-e1ee-4f2f-be68-75d2efde4640)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 1e890653-2a77-4fa8-a88e-5e90eb35f360)(content(Whitespace\" \ + 1d4ca034-4807-4554-b4b9-5230731fa98f)(content(Whitespace\" \ \"))))(Tile((id \ - 1f02e9cd-39a9-4e1d-8ab6-8839c9bc0d40)(label(y))(mold((out \ + 5736e234-5164-4ccc-9dff-7c95e476a1b5)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 1582438e-360e-4db9-9569-300fa112a7ed)(content(Whitespace\" \ + ea99529d-6a8c-4375-a9d8-5d51d45ef2d3)(content(Whitespace\" \ \"))))(Tile((id \ - f7d9f1cb-3276-495b-8efe-5df553b3a7fe)(label(:))(mold((out \ + 32ac740b-11fc-4606-aa19-d654a0e13c94)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7942526f-689c-4ef0-a25a-c0322e5b1671)(content(Whitespace\" \ + 6cd91da2-b589-44ca-84d6-5b77bb88e854)(content(Whitespace\" \ \"))))(Tile((id \ - 4452a803-8664-4a53-b9c7-08c6ff51eca4)(label(\"(\"\")\"))(mold((out \ + c5c4ac29-5745-4ba2-b578-36b6332a6981)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a0aede4d-f0e5-426d-8a27-679fae46da01)(label(a))(mold((out \ + 6119edc5-6358-4f46-b214-2daf5c8e63d3)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c1e1d9c7-88c1-40d2-a35c-46a20aafaea9)(label(,))(mold((out \ + fabf8991-234f-443e-9292-0ddf09c1afaa)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c2614c12-9623-4a15-a6df-ad08454a6778)(content(Whitespace\" \ + 2861bc38-c710-4d58-b3be-63bb94bf9ca5)(content(Whitespace\" \ \"))))(Tile((id \ - 2618a285-c4f7-4162-beee-392581a0db95)(label(b))(mold((out \ + 5813e844-0c1f-4c89-99e9-fceae7910424)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6e79655a-55ed-4521-af63-8637600af0c9)(content(Whitespace\" \ + 52da05ca-74ea-4d56-b53d-74dd627c6327)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cc5ff0c1-5d35-4adb-96b0-f5f3e02b5809)(content(Whitespace\" \ + e36f454f-3262-4c89-b346-4aeff38eb6fb)(content(Whitespace\" \ \"))))(Tile((id \ - 71a73c4a-2bd7-427d-9cd6-9a4ed30163d5)(label(\"(\"\")\"))(mold((out \ + 365d75c8-1c34-4141-ae8c-9d713d74a8fb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0971d7fe-b35d-4b94-a091-e4b4630d94c9)(label(f))(mold((out \ + 1f10bad9-8104-4d64-b770-f60e907db90a)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1c0f9309-f717-49f8-a4a1-a8fdf3090ca0)(label(@< >))(mold((out \ + 267d937f-cdc8-469c-aaac-d353987fff48)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c8d3b901-ac16-4a1f-8962-874c2e3c2cd4)(label(a))(mold((out \ + ef2814ae-4141-4163-a2e7-06eb61133347)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - f95a0a93-f3b8-422b-8db4-490425dfef84)(label(\"(\"\")\"))(mold((out \ + b6a96d63-d7aa-4221-8643-cea5aaebf15c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ef46ea90-6791-4d69-9dda-1acc34ac4f1f)(label(x))(mold((out \ + 85e16f97-0c29-4621-ab3f-94a2fd87bba5)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b0d5eebc-dc12-4565-9d04-eda76fe813ae)(label(,))(mold((out \ + 37bc112a-1cc4-49a7-b20f-1481c0afba00)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e9205adb-ba87-4e82-b9b9-09a9678c2828)(content(Whitespace\" \ + 278e8529-10a3-48ad-a14d-f9a1d5bf525a)(content(Whitespace\" \ \"))))(Tile((id \ - f26167a3-9c4d-4660-a38b-3c42b64cf5ff)(label(f))(mold((out \ + 58408a02-9327-44cd-88de-aaea8be68b71)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 58636026-9be7-41d5-85a3-a9485bf5593c)(label(@< >))(mold((out \ + e0aa8b16-4ff7-4800-932a-904e79da7446)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7c291208-3c61-4179-8751-083e803d636e)(label(b))(mold((out \ + 3465cf4e-0553-4edf-83a4-9b55cb05eb9c)(label(b))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 9b97c064-3b13-47bc-ad37-43f9343f2677)(label(\"(\"\")\"))(mold((out \ + b0798a6b-0776-4175-9214-4b66c469d230)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d0883c1b-544b-4fe6-99a7-0872e7bc3871)(label(y))(mold((out \ + 61b00323-7a85-42ef-be90-37dc1f27f488)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 1dcc5d9a-83a6-49da-b93f-ea38e1eeef78)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 2677caf9-0001-4e08-8ad3-150dde7bb7d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b014cb7a-084a-4c39-863f-e0a39063f87b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c72a4e9e-3777-47c5-8e00-56b52a581a09)(label(let = \ + 470a9dcf-4ae9-4fc1-855a-4d5c90c38e2e)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + a0627768-3df5-47a5-ad14-71d553963ad0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 26365773-d5b1-4e0f-a935-c433d38dd94c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bfe7596b-67d9-4452-b436-d3b1ef2b9f28)(content(Whitespace\" \ + 724c7b8a-a6c4-443d-9904-36c3d9a80730)(content(Whitespace\" \ \"))))(Tile((id \ - 2c80afa2-e80d-4998-9f4e-1cffdb7339fd)(label(list_length))(mold((out \ + 142c63fa-a9dd-4235-8d2f-d8881e9e32fd)(label(list_length))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2e9fa642-9dc2-4bf7-a63b-206d7f1ef6ef)(label(:))(mold((out \ + d93328f8-4dbf-4f56-8703-615fd7adaf72)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0c314942-efeb-4d99-b242-a60c68cf852a)(content(Whitespace\" \ + 412d1103-2efc-48cb-b1b3-22aba875afb4)(content(Whitespace\" \ \"))))(Tile((id \ - 3c3a1b7a-043a-4cfa-ac0d-0116b464d139)(label(forall \ + 4dfe4686-23f1-4267-aaef-6e85a5505df1)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - eb1386ff-5e7d-4a2e-9d46-fa09b79c7429)(content(Whitespace\" \ + 44116b46-ea31-4d35-843e-76b9da22eeee)(content(Whitespace\" \ \"))))(Tile((id \ - 0c518f2e-0c22-4813-bc0e-8532c479794a)(label(a))(mold((out \ + e7ba6de2-87c3-4c7f-a6c8-43b63ac5afb4)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 8ea8b573-5e9d-44a4-83d5-207ac1b661de)(content(Whitespace\" \ + 51bb3e3b-4a3d-442b-b999-640c4a6464f9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a4ef5319-4baa-44a4-8f2b-6f2704f237b8)(content(Whitespace\" \ - \"))))(Tile((id dc2467cb-027c-4241-9b5a-28726b9267ba)(label([ \ + 2179686e-249a-4574-bb23-762bbd86d404)(content(Whitespace\" \ + \"))))(Tile((id 7f3c49d5-4894-4cc5-853f-941cb388465f)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 92f422a8-3924-4b3e-a563-92625b4a01bd)(label(a))(mold((out \ + 6c1ebb4c-5f6b-43df-8036-fbc0f623ad39)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 796d1f0e-2a44-45a4-932d-0ae6d898a97d)(content(Whitespace\" \ + c017de6e-056d-48c8-b72b-4e817faedbf8)(content(Whitespace\" \ \"))))(Tile((id \ - b0f6cb9c-aaf0-44b7-a66f-d9d4ad80d835)(label(->))(mold((out \ + 9c03656d-abef-4f77-8860-2ccebab11d9b)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c6891a10-0036-46ca-9b23-0f762cccc2dd)(content(Whitespace\" \ + f161f838-1dfa-4c5e-bd21-09f376c0503f)(content(Whitespace\" \ \"))))(Tile((id \ - d95d4644-7ed4-4cb8-a1fe-9b78b4a3e98c)(label(Int))(mold((out \ + 93e50ed5-9f77-4eae-b190-af63c0190084)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 97d341bc-1ba7-4643-b54d-ce398cf99eea)(content(Whitespace\" \ + 46f69845-c86c-4fee-a835-0439228cf0a8)(content(Whitespace\" \ \")))))((Secondary((id \ - 0114fff0-b21a-43b2-bd8c-48ec8adcb59a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 615a6d30-91d6-4a56-b2e3-89a5df9ddc6a)(label(typfun \ + 5ce92ad1-ce59-4837-8668-ac86a9a28258)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7418a3ba-c43f-477d-b68b-5d0fbf3b6e84)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b0aed573-0eac-48c5-b594-1b7da6e94335)(content(Whitespace\" \ + 922a9e88-f5b4-487b-959d-ff0a01561866)(content(Whitespace\" \ \"))))(Tile((id \ - 1e4a0083-e594-47c4-8840-d8968c8060c7)(label(a))(mold((out \ + 1e38a9f3-74f8-448c-930e-d4a7880062c7)(label(a))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - fe7cb769-ec5a-4799-90b2-703b0371a6a9)(content(Whitespace\" \ + 95076b73-9f0a-47cf-989a-a8d7dc5209e5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2042c67e-bf1d-4160-b984-ae76bd32cb88)(content(Whitespace\" \ + 6c9e05f9-1320-4bdb-8d33-ed4d4070a123)(content(Whitespace\" \ \"))))(Tile((id \ - 943e587a-b4b4-49a3-ba89-127c889cdac5)(label(fun \ + 53ab56bb-0857-4f4c-90d1-3ff6f1dfc08c)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 90913c27-15f5-459b-b8d6-1548449acb8a)(content(Whitespace\" \ + 774bcaa2-4b4d-4570-8d7a-394823ea2383)(content(Whitespace\" \ \"))))(Tile((id \ - df36292d-fb6c-483e-bcfa-d8903cc22bae)(label(l))(mold((out \ + 259e0b10-2a4f-4208-a5f8-38f03b09840d)(label(l))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 7b08ff1b-c1b8-4075-a857-a663a3e8bfac)(content(Whitespace\" \ + 08c0b5b9-e0f1-4428-9352-65c47eb837b5)(content(Whitespace\" \ \"))))(Tile((id \ - 184a6f46-674a-4327-8344-dfef32b5347b)(label(:))(mold((out \ + de0502d5-ccab-4f0d-9ba3-2ee25fc665e6)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5391766d-2f09-4819-a19e-f08563e9af41)(content(Whitespace\" \ - \"))))(Tile((id b84e8bd7-e78a-4cef-8090-5f2f40da6676)(label([ \ + c9027c57-fe11-49bd-a08b-924140748c85)(content(Whitespace\" \ + \"))))(Tile((id 2d7b58ea-5aff-4cd5-a836-761bb9c1bf74)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - b7ff4370-87c6-4f16-8bb2-02d1faa36a14)(label(a))(mold((out \ + 58754e44-06f5-4de4-a4b3-a481ecdb8725)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c1ce3f5f-6e59-4eaf-910c-1aad6fc76d4b)(content(Whitespace\" \ + b48501e1-48c8-4481-96bd-c31387bd40db)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c0564f45-5ce4-4320-8e5b-5d146050e2b1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 30392d27-d4cc-468e-a118-8afd2536f1cf)(label(case \ + e91b554c-9d29-472d-9b66-3062d2c1eb9e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 079ad602-6b5b-42ab-a424-0680de15de82)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3de7660d-993f-47e4-9198-e2eb9ff6c23c)(content(Whitespace\" \ + cdc959a5-fd2a-4919-92b1-6c2259cf578f)(content(Whitespace\" \ \"))))(Tile((id \ - df36ee16-d2a1-4b9f-b96e-5c12b0eebba2)(label(l))(mold((out \ + 8e4705b2-2268-44e4-976e-f29418c32673)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a344dee3-f3fd-46fd-94a1-0aa47c17ca2c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4ec2373f-2309-447b-a32e-78aa2fb8ff91)(label(| =>))(mold((out \ + fb6a3082-95dc-4f8e-b667-cb183e98336a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2a322566-c078-4492-82f9-8dbc1cd78cce)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f14d180c-a8d1-4e18-afa4-b08087b7dac8)(content(Whitespace\" \ + 1abdaa12-a5c2-47ba-9539-b2eb314e9b8a)(content(Whitespace\" \ \"))))(Tile((id \ - b4ae924a-11d4-4f32-97ad-cf3328fe4600)(label([]))(mold((out \ + 603b3503-0d3c-4f8c-86d6-0cac07a2fdef)(label([]))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - af6667f7-0d6f-49f8-ac87-77ca75f4e792)(content(Whitespace\" \ + 1a35740d-1b43-4463-8c4e-2105eb6abfb2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9dd338cb-01b7-44bc-9315-ce880c8608a5)(content(Whitespace\" \ + 1e9e3384-f5ce-44a0-ab0d-3917291a27a8)(content(Whitespace\" \ \"))))(Tile((id \ - b13d4e14-43e8-4ddc-ba98-ffade553be34)(label(0))(mold((out \ + 74b8932d-2930-4ee1-9940-904599c58c59)(label(0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - afd92b67-adbe-4e08-b9b5-9c6c97f813ee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2dbd3d96-b70b-4479-868a-79355b651e86)(label(| =>))(mold((out \ + 07507cd0-9dad-42d4-872d-66068ad0968f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5d3762ae-9db8-401c-b11d-1f7a33b862a5)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f2db281d-f277-47e1-8973-c500bf37ecd9)(content(Whitespace\" \ + 528286b7-4ba8-4627-9fbf-6b7b79ca0196)(content(Whitespace\" \ \"))))(Tile((id \ - ef39c864-f57e-4bca-859b-94fbc20b1f86)(label(hd))(mold((out \ + f20ecb4c-a4c6-4df9-95fe-b8ee89f044f8)(label(hd))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bf5f14a8-5e88-4f57-a2ed-5f03e3d8902c)(label(::))(mold((out \ + aee01bcd-9b9b-4ee3-bc7d-e9b9bb91f3ee)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 2373cb1f-d6a3-4a28-a745-f7e94b29dbec)(label(tl))(mold((out \ + 797d1732-33cc-4fcc-a169-2bb8b26a0f99)(label(tl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 099e7937-c5b9-403f-8fec-34601a3aa617)(content(Whitespace\" \ + dadbf997-abec-415f-9eba-d13804d29b11)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4f4dec84-a47e-4d48-92a3-a5477c48f292)(content(Whitespace\" \ + 5a0e6ebd-2400-4d75-aa3c-577138d2bff8)(content(Whitespace\" \ \"))))(Tile((id \ - 00a9b0b7-4108-4156-80f5-bdb7fdbeee7f)(label(1))(mold((out \ + 9f0f8b3f-89d8-4306-85f0-7aee2a54dc9b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9ac6f48c-436d-4fd4-a1b7-305ad47651b3)(content(Whitespace\" \ + 18618eb3-8b61-443e-bb36-4878f9bc5ad7)(content(Whitespace\" \ \"))))(Tile((id \ - 3cfeebbf-f2ab-41ce-949d-d051206b2d27)(label(+))(mold((out \ + 956f1acc-abf1-4e42-8a80-625ea0ff68a9)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6d3885c8-0167-4abe-92a0-d9d0ad3e4f43)(content(Whitespace\" \ + f5692310-6225-4814-bd9c-d89d8023dcca)(content(Whitespace\" \ \"))))(Tile((id \ - 2d754ac2-8396-48fa-b841-4ae8df670060)(label(list_length))(mold((out \ + 5a13ca60-9239-4c6c-9b57-405e82f1b48e)(label(list_length))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 00be2680-19b2-4aa0-9d76-9b56e409e84d)(label(@< >))(mold((out \ + 9ec98861-f72f-4ad5-a64e-bc22ab89748d)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 04689cb7-2794-450b-b92a-6782e666e8c4)(label(a))(mold((out \ + 25cd879e-cff6-44e3-ad9b-4ac47bec31d1)(label(a))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - d6d2ae5e-ec0a-4eae-b9af-ac3f547fd57b)(label(\"(\"\")\"))(mold((out \ + 9346dd58-223e-4db8-9bf8-e916121e3404)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fae1a526-0717-4ee8-ad0d-4e8edfe5f7b3)(label(tl))(mold((out \ + 687abddf-5616-4ce6-aea5-e69723fcc70c)(label(tl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - bc0265c2-df2e-4631-bd66-94583037bfba)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 33ccd830-af95-4a8e-a340-734d009783ac)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 41d9e44a-d87d-4320-88a5-690dfb111d58)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ceb1ab9f-f1c3-46ab-99e2-0a558fd79d40)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 41764688-3e37-4dcd-a328-95a760c5d9b6)(content(Comment\"# \ + 9f90e535-7c74-4782-9c16-f48c8ea0224c)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 47593044-e4fe-4cbf-aec0-bbbb1d86405e)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 5729e03e-fd67-4ea1-9ac3-b7c299d53fa0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 14187db3-8588-4af6-9fa8-8597d73633e3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 831bba1e-a237-4817-8dc5-89f62a04cd00)(content(Comment\"# \ Tests, separated by semicolons #\"))))(Secondary((id \ - 6908534e-dad3-49f2-a4f8-86020fc6130a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 88fa8f3c-f0e7-4f2a-b6e1-11f84110ffed)(label(test \ + 281b2122-d6f3-449c-addc-4f94992aaf07)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 66d4fcdc-102e-45cd-84c7-b84ff1b14ba6)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 77744eec-e785-4af4-a60d-b5ff30311048)(content(Whitespace\" \ + 9a2273a6-1302-4919-b901-69f9f6f192b4)(content(Whitespace\" \ \"))))(Tile((id \ - e418acd3-b340-49b6-aa00-c96543fad236)(label(2))(mold((out \ + 9ff47f3d-f41c-4a7f-9f20-24eb5f7c698b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6d8a95ca-9a42-47bd-a9fe-3b930e5514cc)(content(Whitespace\" \ + 2a311f15-ad72-47c2-9dc5-31338e5e5c8d)(content(Whitespace\" \ \"))))(Tile((id \ - 6aa06670-f933-4653-ab43-2268122bf729)(label(+))(mold((out \ + 9e1c36af-38c8-499a-a020-0880d8045ca6)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8b1977a4-cdc8-4986-b327-be4dab2139d2)(content(Whitespace\" \ + cd011aca-3eaa-450e-929d-5c34db834696)(content(Whitespace\" \ \"))))(Tile((id \ - 33f69485-b63e-4b4b-9e86-822064f0b586)(label(2))(mold((out \ + b3e0bfcd-3aa0-4451-8ac2-79091cd11cee)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b93db22d-b0cc-469e-baa3-b76838fa4ceb)(content(Whitespace\" \ + 05d487c5-0f24-41e6-b71b-f6e930ddbdc3)(content(Whitespace\" \ \"))))(Tile((id \ - 219e200f-ad52-4f54-988f-9efe5cf5696a)(label(==))(mold((out \ + d58bb3cf-0909-4d9a-85f3-2cb2718c5b79)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1dc41bd4-2649-42ae-accb-16d878df8631)(content(Whitespace\" \ + c3dd73c8-7d33-48c0-8605-f0b4e86377ae)(content(Whitespace\" \ \"))))(Tile((id \ - 99cf96d4-a20c-4c80-b4ed-32da36451398)(label(4))(mold((out \ + 281f89c7-27b3-4d02-b3c1-af8d5e6dcb4b)(label(4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 81e9b19c-6baa-44b9-ad02-f64483df8b45)(content(Whitespace\" \ + f09c8134-feaf-425d-94f3-99c1f10739a9)(content(Whitespace\" \ \")))))))))(Tile((id \ - 6cb8b87d-3920-4a2c-9f6f-0f014d125a6d)(label(\";\"))(mold((out \ + cf9c41b9-cd57-4605-85c6-297c22036302)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5623770c-b70a-4935-a6b2-ce8fbaa8c6e4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 04b4f2ed-61be-4a15-947d-4c20498e122d)(label(test \ + e429352a-ae52-4eeb-a768-d8e4606affe4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a85663d3-e8fb-41e8-9194-c317dddcc98c)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 9a3052c0-6574-4c5c-b2ed-fe0b867185ad)(content(Whitespace\" \ + 8b787771-4054-4942-be49-0c604486a286)(content(Whitespace\" \ \"))))(Tile((id \ - 98a95902-4575-4485-9359-9cd9de6d6db0)(label(3))(mold((out \ + 2c451d09-a5c4-4dc9-9513-13f84b66b048)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d4da9780-1d09-41ee-8d42-9b96b45cabfe)(content(Whitespace\" \ + 7f3ad449-df14-4f0d-b9a9-475000916468)(content(Whitespace\" \ \"))))(Tile((id \ - 592ad4bc-9ee6-48d1-a96a-1d14330bebd5)(label(+))(mold((out \ + 5088f8d0-bb9d-4134-885f-31e5aba5138d)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 0ce57269-3491-461c-9e95-8e8b0d4a10c8)(content(Whitespace\" \ + a5ca8436-98ea-4351-abcc-512de0392abc)(content(Whitespace\" \ \"))))(Tile((id \ - 5d24cee7-542e-4d93-8fe2-8ab635372fc6)(label(3))(mold((out \ + 0eb1775e-70e8-43da-82b2-e1f86a7180f7)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7313bcf4-de8a-4e0c-a138-9961561f403a)(content(Whitespace\" \ + 8c186497-27df-405e-8aa6-bdfe02e77bcc)(content(Whitespace\" \ \"))))(Tile((id \ - 28675a70-eee0-44a8-8347-00cbc4d7546f)(label(==))(mold((out \ + f8871b06-d345-4ab5-ac98-fec36bcf6a3c)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 24d648e1-0409-4e54-90d7-55141b0fa75d)(content(Whitespace\" \ + 7231b484-5d2f-42cf-8b04-22a13053c75e)(content(Whitespace\" \ \"))))(Tile((id \ - c9b12223-09de-4701-bbff-974c17a30cdb)(label(6))(mold((out \ + f5dc2c24-20e5-4260-82f7-140f8a9a359c)(label(6))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ded5d4da-d7d9-4ed7-8934-661d185a2586)(content(Whitespace\" \ + 09cf26cf-09a0-40a9-9415-4960ccb8283e)(content(Whitespace\" \ \")))))))))(Tile((id \ - 55d79da7-e1da-4b97-9d63-7a747264494b)(label(\";\"))(mold((out \ + d5cc435b-8409-4c75-acff-00810efb7547)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5cbccfd5-cadd-427f-b5bc-6cfff9ce04e0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - db9a0538-900f-433e-827c-02b963833458)(label(test \ + a65205e5-8bd8-43e4-9bb7-13d9842e3639)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d7b2abf7-55fa-45fa-8db4-f608fecbdbcf)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - dcd0187b-fc56-44f5-be6c-6e0501d735bb)(content(Whitespace\" \ + 10d11082-1de5-4074-82c0-39fa76ba1955)(content(Whitespace\" \ \"))))(Tile((id \ - 658f1349-d280-47e6-b76d-db2bfab4e92e)(label(2))(mold((out \ + e9829195-4ff3-4262-bbf4-43fe23daf15b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - dc329ada-5d12-40e1-b1e6-48c3f0444050)(content(Whitespace\" \ + dac4eff2-1554-48a2-a3cb-c706ecb4e3df)(content(Whitespace\" \ \"))))(Tile((id \ - 6b01ef73-cfe7-4493-b31d-cfb92c46b78a)(label(+))(mold((out \ + 69185f86-dd2c-4f14-92ee-a1884ce6828f)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d13432c5-c670-4801-96b5-de6bc44b0875)(content(Whitespace\" \ + 0906514a-810c-44a5-9c23-69ec579a77e7)(content(Whitespace\" \ \"))))(Tile((id \ - 5b4c7010-fd9c-4963-a01f-614e3993c9bb)(label(2))(mold((out \ + a5be4f6d-bd37-4a82-9dad-6ed00dee98ed)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f9d4fb7f-9685-4af6-a138-751a2ee6d8f8)(content(Whitespace\" \ + cf1ce0dd-29f3-4456-8de7-e1bfa88c80d4)(content(Whitespace\" \ \"))))(Tile((id \ - db5c1539-3758-4648-89b1-839e4adbaef7)(label(==))(mold((out \ + 890bd352-5aeb-4263-9bd8-ce45572e4991)(label(==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e8c1bcbe-b61c-4c9e-a590-2c5e99cec323)(content(Whitespace\" \ + 78ad2d0d-6f5f-4f04-a22c-f8bd91fca4c9)(content(Whitespace\" \ \"))))(Tile((id \ - 9aa46b83-ae1b-43ba-a113-0c3245a368c5)(label(5))(mold((out \ + 45b4e475-7e59-45e9-b315-8000ce42c656)(label(5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 142c3764-a337-422b-8d55-ceb69387770d)(content(Whitespace\" \ + 7721a19a-757c-4e39-bbbf-264ef1aac003)(content(Whitespace\" \ \")))))))))(Tile((id \ - cbf13608-9803-468b-9c9b-66a146e8cc10)(label(\";\"))(mold((out \ + 714d6826-fee8-4d3f-abb6-fde287245313)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5c62fcd1-81e3-4c01-8414-7033079b0804)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0fa3b26c-1fba-4272-b989-8d4a46288fd8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 436dfbcc-88ed-4417-9873-b88b775ddedb)(content(Comment\"# The \ + cdf3188d-e726-415c-811f-067bcf1fc78f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e73873db-e78d-44f4-a48e-1909f7b170f9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e8394b15-77bf-49fd-b4c4-7da6d154f9ff)(content(Comment\"# The \ value of the program is shown at the bottom \ #\"))))(Secondary((id \ - 460cde98-3cf7-4229-8b39-53dd253045d8)(content(Whitespace\" \ + cd1a873e-0c16-43f7-84a2-831c662d3935)(content(Whitespace\" \ \"))))(Secondary((id \ - 536b2b4d-7c22-4949-a718-386b98a6039c)(content(Whitespace\" \ + da8c41c7-0d89-4238-b498-5bdb8582a71b)(content(Whitespace\" \ \"))))(Secondary((id \ - a1ef8654-e7f0-4579-8fde-3db994bd6fd9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b3f05f8b-7f09-4de7-8961-9a9c6b3fce28)(label(2))(mold((out \ + 56d69be2-b7d6-4f12-a52d-ac6460d62240)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d05fdaeb-97e2-4da6-95d6-08a5c8f94721)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 25eea2a4-f1a8-40ef-ba42-6875f18135e3)(content(Whitespace\" \ + 92a22db7-5742-4e4c-8d66-a69262b18ccb)(content(Whitespace\" \ \"))))(Tile((id \ - 7b254427-cde0-4698-893c-17a77935d078)(label(+))(mold((out \ + 014e5744-c991-463a-a76d-836cb3c172b5)(label(+))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2dd8ea4d-225a-46d0-9f5f-a9e0f6b33f0f)(content(Whitespace\" \ + f60d53ed-c189-48d4-a544-6a32e33ee5de)(content(Whitespace\" \ \"))))(Tile((id \ - 4576997b-1ed3-4563-a37a-989fd5b21539)(label(2))(mold((out \ + 7ecbd694-78ff-4b06-b502-f7a44db3e419)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer)(projectors()))"; + Outer))"; backup_text = "# Hazel Language Quick Reference #\n\n\ # Empty holes stand for missing expressions, patterns, or \ @@ -12327,40 +12344,44 @@ let startup : PersistentData.t = # (you can still run programs with non-empty holes) #\n\ let non_empty_hole : Int = true in \n\n\ # Booleans #\n\ - let booleans: (Bool, Bool) = (true, false) in\n\ - let boolean_ops = (!true, true && false, false || true) in\n\ + let bool: Bool = true in\n\ + let operators = !true && false || true in\n\ let conditional = if !true then 1 else 2 in\n\n\ # Integers #\n\ - let int_literal: Int = 1 in\n\ - let int_negation = -int_literal in\n\ - let int_arithmetic = 0*1 + 2/3 - 4**5 in\n\ - let int_comparison =\n\ - (0 == 0, 0 < 1, 1 <= 1, 2 > 1, 1 >= 1) in\n\n\ + let num: Int = 1 in\n\ + let arithmetic = -num*1 + 2/3 - 4**5 in\n\ + let comparison =\n\ + (0 == 0, 0 < 1, 1 <= 1, 2 > 1, 1 >= 1)\n\ + in\n\n\ # Floating Point Numbers #\n\ - let float_literal: Float = 0.1 in\n\ - let float_artihmetic = 0. *. 1. +. 2. /. 3. -. 4. **. 5. in\n\ - let float_comparison =\n\ - (0. ==. 0., 0. <. 1., 1. <=. 1., 2. >. 1., 1. >=. 1.) in\n\n\ + let float: Float = 0.1 in\n\ + let artihmetic = 0. *. 1. +. 2. /. 3. -. 4. **. 5. in\n\ + let comparison =\n\ + (0. ==. 0., 0. <. 1., 1. <=. 1., 2. >. 1., 1. >=. 1.)\n\ + in\n\n\ # Strings #\n\ - let string_lit = \"Hello, world!\" in \n\ - let string_equality = string_lit $== \"Hello, world!\" in\n\ - let string_concatenation = string_lit ++ \" Goodbye.\" in\n\n\ - # Tuples (Destructure these with let expresions) #\n\ - let tuples : (Int, Bool, (Bool, Int)) =\n\ + let string = \"Hello, world!\" in \n\ + let concatenation = string ++ \" Goodbye.\" in\n\ + let comparison = string $== \"Hello, world!\" in\n\n\ + # Tuples (Destructured with let expressions) #\n\ + let tuple : (Int, Bool, (Bool, Int)) =\n\ (1, true, (false, 3)) in\n\ - let (a, b, (c, d)) = tuples in\n\n\ + let (a, b, (c, d)) = tuple in\n\n\ # Functions (Take a single argument which can be a tuple) #\n\ let y : (Int, Int, Int) -> Int =\n\ fun (m, x, b) -> m * x + b in\n\n\ # Recursive Functions (Arrow type annotation required) #\n\ let double_recursively : Int -> Int =\n\ fun n ->\n\ - if n == 0 then 0 \n\ - else double_recursively(n - 1) + 2 in\n\n\ + if n == 0\n\ + then 0 \n\ + else double_recursively(n - 1) + 2\n\ + in\n\n\ # Mutual Recursion (bind tuples of functions) #\n\ let (even : Int -> Bool, odd : Int -> Bool) = \n\ - (fun n -> if n == 0 then true else odd(n - 1), \n\ - fun n -> if n == 0 then false else even(n - 1)) in \n\n\ + (fun n -> if n == 0 then true else odd(n - 1),\n\ + fun n -> if n == 0 then false else even(n - 1))\n\ + in\n\n\ # Lists #\n\ let empty_list : [Int] = [] in\n\ let non_empty_list : [Int] = 1::2::3::[] in\n\ @@ -12369,20 +12390,22 @@ let startup : PersistentData.t = fun xs ->\n\ case xs\n\ | [] => 0\n\ - | hd::tl => 1 + length(tl) \n\ - end in\n\ + | hd::tl => 1 + length(tl)\n\ + end\n\ + in\n\ let has_at_least_two_elements : [Int] -> Bool =\n\ fun xs ->\n\ case xs\n\ | [] => false\n\ | hd::[] => false\n\ - | a::b::[] => true \n\ - \ end in\n\n\ + | a::b::[] => true\n\ + end\n\ + in\n\n\ # Algebraic Data Types #\n\ type Exp =\n\ + Var(String)\n\ + Lam(String, Exp)\n\ - + Ap(Exp, Exp) in\n\n\ + + Ap(Exp, Exp) in\n\ let exp_equal: (Exp, Exp) -> Bool =\n\ fun es ->\n\ case es\n\ @@ -12391,21 +12414,27 @@ let startup : PersistentData.t = x1$== x2 && exp_equal(e1, e2)\n\ | Ap(e1, e2), Ap(e3, e4) =>\n\ exp_equal(e1, e3) && exp_equal(e2, e4)\n\ - | _ => false end in\n\n\ + | _ => false\n\ + end\n\ + in\n\n\ # Polymorphic Functions #\n\ let poly_id: forall a -> a -> a =\n\ - typfun a -> fun x : a -> x in\n\n\ + typfun a -> fun x : a -> x\n\ + in\n\ let apply_both:\n\ forall a -> forall b -> (forall c -> c -> c) -> ((a, b) -> \ (a, b)) =\n\ typfun a -> typfun b ->\n\ fun f : forall c -> (c -> c) ->\n\ - fun (x, y) : (a, b) -> (f@(x), f@(y)) in\n\n\ + fun (x, y) : (a, b) -> (f@(x), f@(y))\n\ + in\n\ let list_length: forall a -> [a] -> Int =\n\ typfun a -> fun l : [a] ->\n\ case l\n\ | [] => 0\n\ - | hd::tl => 1 + list_length@(tl) end in\n\n\ + | hd::tl => 1 + list_length@(tl)\n\ + end\n\ + in\n\n\ # Tests, separated by semicolons #\n\ test 2 + 2 == 4 end;\n\ test 3 + 3 == 6 end;\n\ @@ -12418,658 +12447,667 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 280b7b4b-b943-4996-80e5-cdb5abd066a1)(content(Comment\"# \ + c3fe923c-f1b5-4fe4-91f3-1920083a48fd)(content(Comment\"# \ PROJECTORS #\"))))(Secondary((id \ - 766f1c8f-7857-4dbc-bf8f-64354e9ae6db)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ba63231e-2089-4526-a518-779a53eb584f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f7a53c70-80bd-4c47-9fce-8253de57ff18)(content(Comment\"# Some \ + 82e9ab71-8f1a-473b-8719-bca4ac1abb73)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c2aeea8b-6a4b-41c8-ae37-6957844cc632)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5083b6d7-9860-44f2-a372-a7982bac5411)(content(Comment\"# Some \ kinds of syntax have dedicated GUIs. \ #\"))))(Secondary((id \ - 93781f86-8990-4f1b-ae8f-c01314579727)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4bd3ff73-690c-443e-b0e7-35c95ea2181d)(content(Comment\"# The \ + 685340fd-64fc-47d0-9478-1146c2a75fd0)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 95a769cb-ccc7-4050-be14-6c316a60273f)(content(Comment\"# The \ menu at the bottom left shows which GUIs \ #\"))))(Secondary((id \ - 8d1883a0-0e1e-4cca-acf5-184bdd52e5da)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b9bd5d24-df0b-4c30-bd27-9c1721db39b0)(content(Comment\"# (if \ + 1912ca64-3e07-4dcb-9ca7-7d2134c7cf8a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + fcbdfc8d-3d9d-4a71-a6ea-7651147d365f)(content(Comment\"# (if \ any) are applicable to the current term \ #\"))))(Secondary((id \ - a624994d-af3b-4043-a0f8-3f39bcbb925f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b4273de7-e9ce-4798-bee0-e524a5c61f95)(content(Comment\"# \ + d7774693-9d72-4d87-8f4e-b43c785f4251)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7a231164-a872-4d26-8184-823adee3e3d7)(content(Comment\"# \ indicated by the caret. \ #\"))))(Secondary((id \ - 5e496bc7-b23d-496c-a96e-123d295277c2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b68d1612-63b3-48ef-a28b-77d88c0582cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 00402a1e-72d0-41c7-9cc2-cd95ed469787)(content(Comment\"# Fold \ + 013fc5f7-e8d4-48f7-bcbe-9429f55e4fb2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e72ec872-a3c5-4cd3-ad82-c792dcb3c8b8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 13ee2a51-1c77-428b-a88a-86c662cf961c)(content(Comment\"# Fold \ projectors cover terms with abstractions. \ #\"))))(Secondary((id \ - 978c8b35-e5f9-4dca-9460-cd4eac5b8111)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7b6a6697-9f1f-442f-8705-6e6840cadb80)(content(Comment\"# 1. A \ + c3f89d08-bdef-4590-be4f-3072c9bd534a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 77d14b50-f736-4c3f-af1c-e0ada25aaadf)(content(Comment\"# 1. A \ simple fold roles up any term, replacing \ #\"))))(Secondary((id \ - 7a5aa2ff-9c8d-4982-960c-d87c9e46b513)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fbf2618a-324e-47ed-9f91-aa1b511f0a69)(content(Comment\"# \ + de94238a-f9da-4725-a7cd-8c262def9569)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1f4aecb5-7b1d-4516-9689-86d55a50eca8)(content(Comment\"# \ it with ... until it is expanded again. \ #\"))))(Secondary((id \ - a831e29d-cae2-4fd2-a4b5-5060bfebf766)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8a2e26ae-278e-4bfe-af6e-238630e04ada)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5e2cfb81-cbcc-4d1c-9c2e-c6d6f8ebe534)(label(let = \ + 943b3a44-589d-4acb-9ec9-a4335a102c65)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0064f32d-87a1-4d3c-8ca7-2d986a42811c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b3a3bfee-bcdb-438f-ad33-e3f7e336b3ea)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c4fb52f8-000d-4bc4-8166-5ffa254d7c1a)(content(Whitespace\" \ + e992a23f-ce0a-4e05-a49a-09e84388f1d2)(content(Whitespace\" \ \"))))(Tile((id \ - cecbbf14-d168-4734-bf64-dbb3c2b36939)(label(fold))(mold((out \ + d776d3ac-ddeb-4cdc-9bb8-3c3b487840be)(label(fold))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 23813631-1200-4261-a425-8c9e24b61900)(content(Whitespace\" \ + 8e21014a-816f-4572-b065-34a5a04dc6f9)(content(Whitespace\" \ \")))))((Secondary((id \ - 35d8b40b-6450-4ced-849c-cb1900d650d4)(content(Whitespace\" \ - \"))))(Tile((id \ - 2945304f-410e-4c9e-8bef-8dbc37fa52ea)(label(\"(\"\")\"))(mold((out \ + d983dc5b-b4b8-46e8-ab8a-a6c5297ce98b)(content(Whitespace\" \ + \"))))(Projector((id \ + 3d5d8571-e287-4660-889d-019fd826d793)(kind \ + Fold)(syntax(Tile((id \ + 3d5d8571-e287-4660-889d-019fd826d793)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 07430b2e-df7c-4279-b71c-cf218fbfa822)(label(\"(\"\")\"))(mold((out \ + 9403eac8-9e96-4c73-84ab-ff94fbcb1864)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0f3bce5d-b744-4202-a3b4-501bce254cb9)(label(\"(\"\")\"))(mold((out \ + 81926204-d883-4cc9-ae43-6ccc4ab42857)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 5bff7cde-221d-4c2d-8b00-6643566bd9c7)(label(\"(\"\")\"))(mold((out \ + 2cfeb841-d069-4aa6-9ad8-931ef62214bc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c0d204a9-c497-4162-a7c8-364ea067255f)(label(\"(\"\")\"))(mold((out \ + 0b6d67f7-b22c-402e-9fe8-9fa10c54adf2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 410bac0e-1f28-4397-be70-14370200763f)(label(\"(\"\")\"))(mold((out \ + 25ec067f-2025-45f2-bc61-5e1839184086)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2f4553a6-bcfe-40f6-9aa6-d0ebdd1fbdc2)(label(\"(\"\")\"))(mold((out \ + e0716c75-b708-491e-9844-48d0424e6545)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a43bd734-2881-4b05-b5ba-c2edf273d4b8)(label(\"(\"\")\"))(mold((out \ + 6057d41b-727d-4f1d-91b4-4f78e45607a2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7885c8da-7be9-45de-8bed-50eb1adc354d)(label(\"(\"\")\"))(mold((out \ + 33e14eaf-32e1-490d-b554-574e60d7a8ea)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 84954b03-8fcf-4144-b9aa-de5ba758a525)(label(\"(\"\")\"))(mold((out \ + 9ff9a3be-2da6-427c-a42d-0b8f699e4de0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 77a0b4d4-2d4c-4bd3-84ff-bba42abb69dd)(label(\"(\"\")\"))(mold((out \ + a6bb2777-ba78-455a-a252-dcc8f6ac664c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2b0b66e2-64e7-410d-a10f-f061938be285)(label(\"()\"))(mold((out \ + 7269fe06-4f65-439c-a289-dfcdcc6d230a)(label(\"()\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(Secondary((id \ - a36475f6-d8c0-4560-b9b1-32c50ae03e44)(content(Whitespace\" \ + Exp))))))(shards(0))(children())))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(model\"()\")))(Secondary((id \ + 695e3712-f2c0-4fb1-98c8-5c4dae7bef90)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0d42c14c-2a2c-4418-89d9-a488e5970c19)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d9346ab6-c129-44b1-b8f7-555da8036997)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ae3579bd-d7a9-47b4-8bcb-c37878dc92a0)(content(Comment\"# 2. A \ + 0746c10c-3faa-4fca-875f-34dacf07e128)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0116db5a-a7b9-4a59-8f20-bde869ae5cbf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 22e07ba4-9f84-47c8-ac0e-3cbf64f8a41a)(content(Comment\"# 2. A \ semantic fold covers a term with a property: \ #\"))))(Secondary((id \ - c6eff3bc-2910-4bd6-bf10-be121a9d361c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 276e6c8b-09f7-4819-8a52-de19f6372852)(content(Comment\"# \ + 2324126a-fd02-4d46-8dca-f54ecc1f3c53)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3246672d-f43f-48d7-aff8-14b4179ace2a)(content(Comment\"# \ Click to toggle inferred & synthesized types \ #\"))))(Secondary((id \ - 67498fd2-30b6-44ea-9a9b-b9548acfece2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b5beec34-3f84-4026-b1d7-4162502d8f78)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ee4ca68b-1662-44db-aee0-23a9ef8a589f)(label(let = \ + 83092344-09b3-4027-b669-02cd44e7e379)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c2c02009-b47d-4948-8679-da0ed059a6d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 844dec42-9f30-4750-ac38-a51b56142ee3)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0a84de08-707a-4054-bdfe-2f6053dd72dc)(content(Whitespace\" \ + 7bb8fe9e-04a0-4ee7-9d36-4a31dfd14c05)(content(Whitespace\" \ \"))))(Tile((id \ - 3c52b2b5-5144-44dd-a698-4cadf330c295)(label(folds))(mold((out \ + 1865a79f-c653-44f5-8081-ce2c140f2d80)(label(folds))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6db2b3ee-50ca-4a88-add5-be4c2019412e)(label(:))(mold((out \ + e819a137-478c-4ba7-9085-f4cbc8335c7d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ba46f14e-1478-409e-bfe5-29769c84748b)(content(Whitespace\" \ - \"))))(Tile((id \ - 1a1e3b78-a600-4569-9859-ea95d7328e35)(label(\"(\"\")\"))(mold((out \ + d67fb96f-9d3f-4488-b4d9-2a59566cc091)(content(Whitespace\" \ + \"))))(Projector((id \ + 68602b6d-43bb-402b-9a24-bf990bf1c22c)(kind \ + Fold)(syntax(Tile((id \ + 68602b6d-43bb-402b-9a24-bf990bf1c22c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 49883be7-eb2c-4c04-bb5e-4f49038e1588)(label(Int))(mold((out \ + d4f45557-5d33-4376-aacb-21c1e9a1f0b4)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 529e44b0-2b0c-40b6-817b-51e53e3f5b86)(content(Whitespace\" \ + ec4942d0-661e-4086-8ca7-8b076abb5813)(content(Whitespace\" \ \"))))(Tile((id \ - 2bbaae92-0510-418a-b44b-4990f0130c8f)(label(->))(mold((out \ + 1ec7773a-82e6-4fae-aa59-4762e198c98a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 618f9a66-b151-46a8-a848-6fedd59fde17)(content(Whitespace\" \ + a89b1307-c340-4055-9a7a-17d319ac6fcd)(content(Whitespace\" \ \"))))(Tile((id \ - 70d91831-a709-4b72-a413-b3f6116c9786)(label(Bool))(mold((out \ + 54bf5314-84f6-4701-bc2a-008fc9485ee2)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 1351b6ac-e6b9-4661-9dde-0a70f3faaa9a)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))))))))(model\"()\")))(Secondary((id \ + c3061b0b-9b43-4426-b14f-2f08c245f300)(content(Whitespace\" \ \")))))((Secondary((id \ - 1043a9df-4b7b-46e0-aafa-eb42eb4a76ca)(content(Whitespace\" \ - \"))))(Grout((id 68f1e62e-a9ea-49ee-8b23-4c8934f9bdca)(shape \ - Convex)))(Secondary((id \ - c6bd410a-0619-45ac-afeb-fbec4841eb3f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 7626d7be-0125-4562-9d5c-789f6662aa54)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fb2c0cb0-f97b-43e4-853d-d9fd06e9a056)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b883396f-5f50-4b3f-84e9-054fa50dd391)(content(Comment\"# \ + e614e364-e221-402f-8556-50e8caf3b940)(content(Whitespace\" \ + \"))))(Projector((id \ + 2b8a4030-bf70-47b6-8546-4cbe256e5cae)(kind \ + Info)(syntax(Grout((id \ + 2b8a4030-bf70-47b6-8546-4cbe256e5cae)(shape Convex))))(model \ + Expected)))(Secondary((id \ + b6c9f4cd-120e-471a-8874-24b43aab5df9)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + df00c631-b6c1-42ba-b179-22bfbe078fcd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + eb6977fb-0298-4bd6-8106-515bf6274105)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a46616c8-f52b-4755-9bf1-e1a324298a9a)(content(Comment\"# \ Projectors on literal data are called livelits. \ #\"))))(Secondary((id \ - 547bda6a-4a5d-4584-985f-6631b54bfaec)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a720cb86-a73a-4e6f-92b1-294ff4d96e6e)(content(Comment\"# \ + c507ba49-0c28-49ba-ab08-be00b86f7cfe)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7c56f9a4-5c09-4a53-952d-9261a9f17ec8)(content(Comment\"# \ Three base types literals use inline views: \ #\"))))(Secondary((id \ - b1e3cb0a-cbeb-410a-a88d-a30c5ec3e2cf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cce01246-ec26-419d-824b-0deb82f56a65)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 83a82bce-96b7-40bf-904b-45b94576b533)(label(let = \ + 5bd865da-3375-478d-9b93-1d4861cb6a22)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a58a0cc6-4614-440c-8093-c54b3d3b19c2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c2ab8eb6-631f-4976-a9bb-cc92eca07f78)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0cf3d18a-7e60-4397-ac79-1fda65e74203)(content(Whitespace\" \ + 6d0b5f74-5e96-4be7-847d-05afbe3955ab)(content(Whitespace\" \ \"))))(Tile((id \ - 46da3e9e-5e21-4ec8-a39a-f8e9f4a7c3a0)(label(guard))(mold((out \ + 7fd412a0-6516-4d01-bb44-c735d79b4a4b)(label(guard))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c2439a0f-7a55-413a-8155-213f94d73c5a)(label(:))(mold((out \ + 5c956f02-69a9-4dd7-882a-48e8e73f874e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2502d279-371a-40c9-b0b8-4d959887bc5e)(content(Whitespace\" \ + 9e02c123-880b-4f88-9675-501fcc7f2ed2)(content(Whitespace\" \ \"))))(Tile((id \ - 70653dae-ea88-4917-9f03-b9a3cfb3d73b)(label(Bool))(mold((out \ + 0d782687-5bf4-4317-8e23-22bf7f91758e)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fb86db7a-948a-405f-b53c-a25cf5f01849)(content(Whitespace\" \ + ef93835e-4a99-4b7c-824d-b51cf70ddd60)(content(Whitespace\" \ \")))))((Secondary((id \ - 86922ad1-1a63-4407-85a7-99b70be40fd7)(content(Whitespace\" \ - \"))))(Tile((id \ - e442c25d-463b-4706-a43f-393a37010a8e)(label(true))(mold((out \ + 13722973-e012-4c13-b9bb-aa8d9a1de6b8)(content(Whitespace\" \ + \"))))(Projector((id \ + efd30209-5976-4ccc-835c-3ea6ae1ab13b)(kind \ + Checkbox)(syntax(Tile((id \ + efd30209-5976-4ccc-835c-3ea6ae1ab13b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 59100198-9b0d-449c-b56e-4e5ad29354a0)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + e5b36263-d7e9-4927-be88-7d4d9c2924b6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ac3a595e-a0bd-4437-9822-8368184bdc94)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 26566629-5133-42ce-bc09-1f693eb1022a)(label(let = \ + d24bac73-2ba2-4b2f-853e-50c123946a33)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4892097f-1fd3-4a33-abcf-ac4c55757fa6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b920c3cd-bbc7-4f0a-9542-407e62c87faa)(content(Whitespace\" \ + 034b65f9-e9a1-4aa0-9626-b600062d3c11)(content(Whitespace\" \ \"))))(Tile((id \ - 812de672-73b0-42df-be0a-f5d9d6c5075c)(label(phase))(mold((out \ + 112fc7f9-ce6e-41d2-9774-4722ef92bd06)(label(phase))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - a12bd57e-fca5-4d8e-aa90-a8473f09f756)(label(:))(mold((out \ + 3ec69819-dc39-4266-ba08-a08fb08718e7)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6bf29a13-826c-4607-8307-4c98f11ce27c)(content(Whitespace\" \ + 6842035c-1e3f-48a6-b922-78b770510221)(content(Whitespace\" \ \"))))(Tile((id \ - 4e030864-2e72-494c-8a3c-0f80cc75491e)(label(Int))(mold((out \ + 2234dc42-947d-48bd-bae1-b8ce61de2020)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 79357eb1-b5e7-417f-8022-6ce8ee465205)(content(Whitespace\" \ + 8e8e1227-03c6-466d-ae1c-1784bbe5ba33)(content(Whitespace\" \ \")))))((Secondary((id \ - 1f740563-096f-447f-95f9-5ae8df0a9c0b)(content(Whitespace\" \ - \"))))(Tile((id \ - f5ebef37-c9e2-43cf-867e-f150c01f04e9)(label(44))(mold((out \ + ffc5eb91-0f98-4587-a956-f55e0115fcfa)(content(Whitespace\" \ + \"))))(Projector((id \ + 2b03a748-4f50-474d-adae-814785dc3692)(kind \ + Slider)(syntax(Tile((id \ + 2b03a748-4f50-474d-adae-814785dc3692)(label(44))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2cbdbb93-0799-4f0c-b2f6-db814d71a4c9)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + e14500bd-7737-41f9-af43-3e06b6d9d3fd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ea2bb344-8a45-487a-97bd-2a3843db5b73)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1dc9ff7a-58df-47ec-b759-f9349010a68d)(label(let = \ + 0d9164c7-2310-4ce0-8e74-d22008f2984d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cbcc44ec-1ab4-43a8-bd41-1e76afcaa012)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 57997e4a-e8c2-4386-9e06-786d05e4b630)(content(Whitespace\" \ + 7d7b5b27-6af3-4ca1-96f2-c1073ead531d)(content(Whitespace\" \ \"))))(Tile((id \ - 9e080b3b-d60d-4870-8fa9-1d82acd49079)(label(float))(mold((out \ + a42f4aad-ae62-4024-b157-f44502f3f96c)(label(float))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b72854ba-89a7-4eda-89f6-c50cc80b7c46)(label(:))(mold((out \ + 9d656f04-dd32-4594-8b63-a579f2774e9c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - add215ee-692e-48d8-bc93-6e9865febdc4)(content(Whitespace\" \ + 81a8b0cc-0433-4234-938f-f6d16e0cf314)(content(Whitespace\" \ \"))))(Tile((id \ - 2e10542c-4337-485e-b07b-e49ba226b515)(label(Float))(mold((out \ + b9066610-92a5-42df-97be-b261927b7e0e)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 359cc723-833f-4011-9d2c-d434f1e348cd)(content(Whitespace\" \ + eff1cce3-2d0f-4d2c-9d12-a4a4763c6c7f)(content(Whitespace\" \ \")))))((Secondary((id \ - c463b59e-b70a-4dd4-8ee8-b51b1970632e)(content(Whitespace\" \ - \"))))(Tile((id \ - ae2f057e-f44f-4f3b-9fe7-b32acb7881fa)(label(79.00))(mold((out \ + f1df0e58-a7f3-4494-812d-a558c96c0c63)(content(Whitespace\" \ + \"))))(Projector((id \ + 043196ac-dc43-489c-85e8-4bf31d6853c7)(kind \ + SliderF)(syntax(Tile((id \ + 043196ac-dc43-489c-85e8-4bf31d6853c7)(label(79.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 25142929-c5e9-4f93-a3aa-306725561306)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + d2618e65-e9a8-46c1-b5c4-4d6ee1b25a77)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 82c12081-b144-4bf9-b46a-f4d83dc2875d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 25bf6d5f-03e4-4aa7-a428-c031caef715a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1e16ae63-8b4a-4f01-9ea7-1e549409a70a)(content(Comment\"# \ + 47e6a486-67d1-4b89-b005-1aad616e4012)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 0ea2f253-0d49-49f7-88fd-e2775aedbab4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d2a60e8e-a397-4fde-9b3d-8de7d44c435b)(content(Comment\"# \ Inline error decorations (same as for tokens) \ #\"))))(Secondary((id \ - f40c4d9b-87f2-4628-8f86-c0591c56183e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a69a9b53-5e7c-420a-942d-a4a960dcb3a8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c97ed5c7-4f87-4d67-9abe-548c077959e8)(label(let = \ + 89c3bf87-33f1-4bd8-84ac-794962a1b06f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a2b7b074-9f8b-401d-8277-433283b3dd3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5c88bf9f-3a1c-494b-b9b6-ab25e9f8c748)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8b363368-f90b-4003-8193-c6d3636762e4)(content(Whitespace\" \ + ba3c4c94-a6d3-4e67-8f8c-fe1ef283e42a)(content(Whitespace\" \ \"))))(Tile((id \ - d0f6f1d9-d59c-45e1-bcce-0a645bbfc9ca)(label(\"(\"\")\"))(mold((out \ + be3365c0-8223-46e9-bf78-1355cb4b9963)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - e02342a5-d205-445f-8f43-30b04f8cdeec)(label(a))(mold((out \ + 2528ecd7-2bca-4088-8642-07347f97dfe6)(label(a))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 033d035f-d0f0-4d3f-bc6a-30443e136342)(label(:))(mold((out \ + 0d999b5a-f816-4d8d-93ac-31800d93edac)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Tile((id \ - 01e70002-1425-44ff-b2aa-6b82fda66a31)(label(Int))(mold((out \ + 3f3703f7-333f-4e29-b21c-377af36cca38)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c1fdfe0a-bb00-4071-9f9f-ab26980893e1)(label(,))(mold((out \ + d99b5782-c227-4008-9446-c36b0c1b98c9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 06c48451-d284-4c04-9dae-638a9c45021e)(content(Whitespace\" \ + 046a4766-e8ec-41f2-b458-01129c599528)(content(Whitespace\" \ \"))))(Tile((id \ - 93cb7452-5382-42ea-8528-271b34d752a9)(label(f))(mold((out \ + 58292f14-1e4c-4936-93fe-6780f53b9b48)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d161607d-84e4-441d-9ef7-f131c57c7071)(label(:))(mold((out \ + b2844336-ccf3-4198-856e-10181c19b357)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e483d261-9d3b-4a37-9244-9955499ff701)(content(Whitespace\" \ + 6ed09a11-ecba-4d05-9ee6-3aa7ddbe7195)(content(Whitespace\" \ \"))))(Tile((id \ - dce2f146-2b00-4696-b7b6-4808b97c9cc4)(label(Float))(mold((out \ + 8342017f-290a-410a-abeb-99cb7f7c2e12)(label(Float))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - cd47235b-b8bb-4ef7-87f0-67fc20e9cd02)(content(Whitespace\" \ + a0c9eae6-7599-4723-9a73-8739578452dd)(content(Whitespace\" \ \")))))((Secondary((id \ - caa6545b-2662-4f4b-b3e6-419d89d6eeaf)(content(Whitespace\" \ - \"))))(Tile((id \ - 7bc7eb1c-f0ee-48b0-a0cd-aca0aae535ac)(label(true))(mold((out \ + 520a0dab-48a7-4998-af8a-42121ea7c03b)(content(Whitespace\" \ + \"))))(Projector((id \ + 73403eff-1a14-4a95-aa97-08847365f7f7)(kind \ + Checkbox)(syntax(Tile((id \ + 73403eff-1a14-4a95-aa97-08847365f7f7)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d0f275b-fbca-4f59-a5b6-c310f7e6ed1f)(label(,))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Tile((id \ + f2ebe0f4-7569-4327-a816-302a359154dd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b466818e-7b04-4b3c-846c-4109fbba2066)(content(Whitespace\" \ - \"))))(Tile((id \ - ec1558b2-04e6-4323-87ea-2dbfd87a485b)(label(28))(mold((out \ + e22631a3-3621-4bc7-8df0-034c3dd83ef0)(content(Whitespace\" \ + \"))))(Projector((id \ + 1b9c2559-9fa5-45e0-8136-45cf1ba5a153)(kind \ + Slider)(syntax(Tile((id \ + 1b9c2559-9fa5-45e0-8136-45cf1ba5a153)(label(28))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6e45a7c7-f161-47cd-a62f-9c16ab76ebf2)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + d9c1a18b-7ece-4b06-923d-5f41364ee432)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 88f8d592-8b65-44b5-9b10-1174dbc37836)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 39f9992e-3311-4961-9351-722ca50e0b77)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 96a2bf4b-407e-46fb-8248-4d19bbddc48f)(content(Comment\"# The \ + 5a1ba563-db2a-4084-947e-9086b6e75501)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d1e25e85-434f-40d9-b8c8-41ed2e3b5928)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 32f12f1f-4721-4be5-9864-b8a852649666)(content(Comment\"# The \ String base type get a multiline view: #\"))))(Secondary((id \ - 9d1a4033-0dc8-46f8-97da-7d28862984f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9c4e9570-ce0a-433e-912f-51e3fe93806a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3b58d58f-1404-4186-abfa-e9af3020898d)(label(let = \ + b4568a57-45a5-4058-b04c-17693cad93bc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 34e3a828-278f-4b76-9794-a02b9f40ed6e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4757c00d-9783-4b47-806b-872b9728e17c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0442afe8-f16d-4248-bfc1-550681fedf8a)(content(Whitespace\" \ + 25de0cd1-e0cd-40e2-b298-bba63463e402)(content(Whitespace\" \ \"))))(Tile((id \ - 30ac0494-d544-4779-a7a0-f7cc11594c74)(label(_))(mold((out \ + 007595ce-99f5-4d6b-bc0d-157c343ee846)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9fd3d279-4019-4090-96a3-bcf11ea663d0)(label(:))(mold((out \ + 45b45f4c-11a4-43d1-b031-7cd15d0f5d58)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5cdef717-1253-4c2e-b375-28db0a248387)(content(Whitespace\" \ + 000c9f9c-7ffe-4764-b2b1-8c60f81275c2)(content(Whitespace\" \ \"))))(Tile((id \ - c24bfad3-4709-47c6-96da-5e8f373d3082)(label(String))(mold((out \ + 11a34954-6df0-4046-8170-25e79684ba90)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3534c867-5e84-4634-907e-14d4844d9c7e)(content(Whitespace\" \ + 15c0db9c-4ffc-4a65-85bf-1f7663ffb7a6)(content(Whitespace\" \ \")))))((Secondary((id \ - 32c28ea5-2319-478a-b9e4-6f904e97fc56)(content(Whitespace\" \ - \"))))(Tile((id \ - dbb0eaf5-a0cd-4246-b48f-d6cd9d2ee199)(label(\"\\\"\\\"\"))(mold((out \ + 7b655a09-dea7-489f-8c63-4bae6cf1ddb5)(content(Whitespace\" \ + \"))))(Projector((id \ + 56d4b3d2-48ae-485f-ac8f-4465bb35110f)(kind \ + TextArea)(syntax(Tile((id \ + 56d4b3d2-48ae-485f-ac8f-4465bb35110f)(label(\"\\\"\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c16f028a-fe90-4c41-8955-caf524387e22)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 39c7d0a1-2b1c-434e-969e-f3a8d480b98c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3900df20-0ada-4bd7-a60e-ea3385b8f2f3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c868db32-19a4-43c9-b4f8-feded97a287c)(label(let = \ + 5c35b6c4-e575-4907-975b-94ca40431ea4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + cce56473-5258-4c91-8036-41fdfa6ba6b1)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 944e1d5c-655d-411c-837c-e59fb49fa4ee)(content(Whitespace\" \ + 85a1dc46-86fb-4585-aac0-3281491cd83d)(content(Whitespace\" \ \"))))(Tile((id \ - 6464f407-1284-4ebe-a8d5-522b90af7aa6)(label(__))(mold((out \ + 5b032c7b-bcb3-4af2-951e-40f7691af336)(label(__))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0591c330-d99b-4117-b294-ea8d071944e6)(label(:))(mold((out \ + 4aaeb88a-2e60-414f-9ca9-1248a263130f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b6a706cd-592e-4f32-a85c-1780b3a522e9)(content(Whitespace\" \ + 1c38a0fa-bbdd-4335-9def-4dbb9a9c99cf)(content(Whitespace\" \ \"))))(Tile((id \ - e06cdc24-21a5-4bc7-a59a-515e3bb7dfb5)(label(String))(mold((out \ + 07be771c-c05d-4d25-b177-d77c0ac8b377)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4d3406a1-e1e0-4f3b-81c3-48f317d5784a)(content(Whitespace\" \ + 86e081ce-920e-4f89-8ef3-0c54d43d6693)(content(Whitespace\" \ \")))))((Secondary((id \ - 8ee75ddc-3f31-45c2-ab17-209bdfe2ce9c)(content(Whitespace\" \ - \"))))(Tile((id \ - 8c312c27-d8d4-4c06-8b58-ec5aea9826da)(label(\"\\\"\\\\n\\\"\"))(mold((out \ + 2d5a8239-42f4-4bc0-ae3c-ee19a920124f)(content(Whitespace\" \ + \"))))(Projector((id \ + f0c0f5d9-251b-4e16-a0b9-0ea8cd416b67)(kind \ + TextArea)(syntax(Tile((id \ + f0c0f5d9-251b-4e16-a0b9-0ea8cd416b67)(label(\"\\\"\\\\n\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b54b3fba-81d7-4fb7-9fe9-61a3e2d37b4a)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 66e6258f-a354-4df0-950a-5416915fbb9c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0aece2f5-5a93-4582-8da8-e411338d82c4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d2f691ce-98f7-4304-b7b0-fe046096161e)(label(let = \ + 2fe9926a-316d-44ce-b729-6cb5031c1e95)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 95aeb505-339e-4761-bce3-1f39778bb748)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 396fe533-9201-40a9-adcb-25ecfc76bddf)(content(Whitespace\" \ + ada7f019-d3d4-4b7b-8755-e26aa8256731)(content(Whitespace\" \ \"))))(Tile((id \ - 81eafa69-5133-49ea-bdef-586f0c1126ab)(label(___))(mold((out \ + 4c1360b2-dafe-422e-b3b6-b96ec36e7ac8)(label(___))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bd3687d6-811a-4859-80d7-0be40e722a12)(label(:))(mold((out \ + 7cfef1fb-d75a-4674-a0c1-4ce0a5b5ac63)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 23adbcb1-cdc3-45be-b646-5ad4a02a8a71)(content(Whitespace\" \ + 2a1ab4a2-79a1-4a70-ae6e-100d72f1a6da)(content(Whitespace\" \ \"))))(Tile((id \ - 9c25b20f-711e-44f5-a5ad-02a4689bd1bb)(label(String))(mold((out \ + a01655df-d25d-48c1-bff7-011718087cb4)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 3a7aec4b-410d-44b0-ab7c-b28d6a65abfe)(content(Whitespace\" \ + 0d894ba4-cf26-403f-9a23-267609fe46f4)(content(Whitespace\" \ \")))))((Secondary((id \ - ef6fcfc7-5b05-4fdc-a1c7-27e022e925bd)(content(Whitespace\" \ - \"))))(Tile((id \ - 3978bb74-9aef-4b41-adc7-3155736506a6)(label(\"\\\"a\\\"\"))(mold((out \ + 9d4ceb1c-6b22-4a06-a218-633b4a5890dc)(content(Whitespace\" \ + \"))))(Projector((id \ + e7f57a83-ecba-45f4-b7c3-e576c0452edf)(kind \ + TextArea)(syntax(Tile((id \ + e7f57a83-ecba-45f4-b7c3-e576c0452edf)(label(\"\\\"a\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3de95bf9-c6a7-41d2-bdcb-03dcb4843831)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + ed6e4e97-cda5-4f4a-b917-01a2e251030f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ec27f395-d4b7-49b5-934e-df4f6665e218)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a561592a-05d4-45e0-8b1f-30c831da93d9)(label(let = \ + c0e84d18-89a3-456e-ae6f-853eac5c6e24)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0e2a557d-8235-4160-ba5a-137b96581ee7)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8bec02a1-aa58-4aee-a2bc-f8cbac12abde)(content(Whitespace\" \ + d174d025-b139-4cec-94b8-bf1739822683)(content(Whitespace\" \ \"))))(Tile((id \ - ba2bd340-923a-4447-bd50-02fe2942d3d2)(label(____))(mold((out \ + 51b2e64d-97dd-4136-a322-9567742961c7)(label(____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4f0d613a-6c27-45f8-b4cb-eb1d62cf40a6)(label(:))(mold((out \ + 833fe7e6-2b84-431d-9ba1-e9199bbbfb2a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a0233234-fc25-435b-964c-454959058d98)(content(Whitespace\" \ + 59a1090f-04a1-4279-8a13-efe1e9b93925)(content(Whitespace\" \ \"))))(Tile((id \ - 880ecfd9-ee2a-4d49-a5dd-66075cf44033)(label(String))(mold((out \ + 2ee6d39b-ffbf-4b67-90b9-96e09747a011)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4f8eeaa7-6276-448b-9361-82ceb5a6e2b9)(content(Whitespace\" \ + faed1f01-8cd1-48e9-bab5-fcdc4a2a1f2a)(content(Whitespace\" \ \")))))((Secondary((id \ - b38d98bb-99ff-46ad-99a3-fd0c09be43d7)(content(Whitespace\" \ - \"))))(Tile((id \ - c11e3d78-6865-42fa-8d6e-722631ca2d99)(label(\"\\\"shift\\\\n\\\"\"))(mold((out \ + 655b0f6d-81ea-4402-b279-6b1ae84beba4)(content(Whitespace\" \ + \"))))(Projector((id \ + aed58904-b2f8-4101-8472-45e7f1f12683)(kind \ + TextArea)(syntax(Tile((id \ + aed58904-b2f8-4101-8472-45e7f1f12683)(label(\"\\\"shift\\\\n\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5a110fb5-8c8c-4d3f-992b-e6912e6d92de)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 437dcb66-6719-46ca-9822-d869d8e8360c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e1367d1a-ecd0-40bf-9405-5f412986ee82)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 87257fca-b797-4b34-912e-2c3e4d0c67ea)(label(let = \ + 4579fb70-9d19-4a24-abd3-5683a11e35c2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c182f185-1c46-4fbf-8554-8a31b842934b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 180e802f-3412-4eea-be87-135a281e123c)(content(Whitespace\" \ + a256562d-4dd1-4c1f-8b3a-61488ef8203e)(content(Whitespace\" \ \"))))(Tile((id \ - c0364155-ddb7-403a-8496-13e61829b44c)(label(_____))(mold((out \ + 73420d3d-60aa-48f3-af7f-9e0271b218f9)(label(_____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 31dc976d-88e0-4023-8ac9-4a077c3a60b6)(label(:))(mold((out \ + 0fe50299-f1c4-4e4a-aa20-cf9b98ee119f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 244b5c44-880a-44d5-841a-d56a473caaf3)(content(Whitespace\" \ + 8e9d69fe-608c-4aaf-a223-d68581c4febc)(content(Whitespace\" \ \"))))(Tile((id \ - 3867134b-4739-4dd2-a981-a21fae4cae0b)(label(String))(mold((out \ + 1a591779-a79d-46d0-8477-27aa25727b98)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 6fcad9f0-90e0-4b8e-b2a2-60967ef0c3a4)(content(Whitespace\" \ + 04965f33-d5d4-4696-a3ad-52c550762732)(content(Whitespace\" \ \")))))((Secondary((id \ - ff9b2e68-d6f2-49d6-a2d9-c61e4e5f9de7)(content(Whitespace\" \ - \"))))(Tile((id \ - 5a99a998-ee50-40bb-85d5-4e97a05ad9d1)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + fc90fed4-a5d3-4d27-9f7a-cd75421abaee)(content(Whitespace\" \ + \"))))(Projector((id \ + 41dbf9b6-0f60-4ab3-bb0e-a5fdc9512d82)(kind \ + TextArea)(syntax(Tile((id \ + 41dbf9b6-0f60-4ab3-bb0e-a5fdc9512d82)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9e4579d1-74f4-4929-bdcb-bb2cc974bb9b)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + e2d4adfe-b2e5-4e21-a5f0-8f8a1384582c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cc4afe48-537b-4598-8398-b8c01139365c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2f1d48e4-1a68-40a2-a878-8d2d24c18979)(label(let = \ + 941557a3-c4d6-4c32-91c9-8e3ea317335e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1eb285f2-a7d4-4cff-a8a9-79fc4bdc3047)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 012855b9-ee9a-4bcc-a890-5883b47f4988)(content(Whitespace\" \ + 92fa5f2d-59f7-4fe5-91d6-a327ba868447)(content(Whitespace\" \ \"))))(Tile((id \ - 4b3ea6c6-4fd0-4613-bdfb-7ee8e8afe630)(label(______))(mold((out \ + e7dd8df0-14df-41f3-8ebb-747d42daf6ce)(label(______))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - db3f8786-fbb3-4301-9c9a-6d5e77e16e7b)(label(:))(mold((out \ + ebb21b46-dade-4e37-97b7-d1a67ff366ec)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 72a2e5f5-ea83-462f-af2f-9ce637be7334)(content(Whitespace\" \ + 9a9ac643-c500-4d7b-a582-454f82e2c405)(content(Whitespace\" \ \"))))(Tile((id \ - 6f8d0fcb-ec46-487b-aefd-62e28ae15659)(label(String))(mold((out \ + 7bc12c5d-d76c-4f1d-b798-842861613d8d)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f553e9b4-58f7-4c8b-9463-6ebfd5d2d3ed)(content(Whitespace\" \ + 50a8159f-2f81-4ac8-bb46-c93c6d1c3a36)(content(Whitespace\" \ \")))))((Secondary((id \ - ac557ad9-180d-4078-812a-439809ffa638)(content(Whitespace\" \ - \"))))(Tile((id \ - 34f66214-5bab-4857-9224-17a900def84f)(label(\"\\\"a\\\\n \ + c8ba0030-44ed-43ff-915f-1fd4afc25529)(content(Whitespace\" \ + \"))))(Projector((id \ + 7d31fa70-e091-4443-89af-6d6380fe31f0)(kind \ + TextArea)(syntax(Tile((id \ + 7d31fa70-e091-4443-89af-6d6380fe31f0)(label(\"\\\"a\\\\n \ shift\\\\n malicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0366152f-94c7-4c5e-a271-074507242998)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + b30e104e-26d2-48e5-acb1-8b1857c4f7ec)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 769846e6-36b0-43ac-8e38-b5e23b0d9004)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e1f4597c-2baf-4508-b176-7c9854e97c49)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 81faed74-c356-4027-875f-45d40db1cb84)(content(Comment\"# \ + 6d752567-c069-4bc2-aa74-ab77e213936e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 71cd9b4c-db26-4ddf-888d-affbc48abbe9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 934e0d04-e4c9-4442-99c1-3ce6a26cc38f)(content(Comment\"# \ Multiline error decorations #\"))))(Secondary((id \ - fd699eec-99a7-481d-ab8b-06d2458da98f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ca82c3fc-4f4d-440f-a68b-a8fa27592863)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b5301bec-64d4-4aec-b53b-fc2a84e0aa99)(label(let = \ + 1a2d4d43-52ba-4bc2-a92d-72000df5929c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 62f74d6d-efb5-47a4-9512-79ed238f03ae)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 28fef6b0-7141-4ca5-a327-811d58ee2058)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a068066c-3810-4b83-8bf4-13b7b431c4b2)(content(Whitespace\" \ + 8edbca7a-12c5-4751-a236-c6c59f036b4c)(content(Whitespace\" \ \"))))(Tile((id \ - 6a1e5631-0205-4dcf-9dd1-860aec38e3d0)(label(box))(mold((out \ + 96dabc0d-1364-4af0-b557-a01c20442170)(label(box))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - abd42811-2b53-43f6-a3ba-b5e74447953c)(label(:))(mold((out \ + 952e73a0-52ca-4a10-8d5f-11fc0f6e25db)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4c8df25d-e349-4533-a8de-b0a4c1f19aa9)(content(Whitespace\" \ + fcd699c8-85dd-4eaf-98b8-cf8d1749218a)(content(Whitespace\" \ \"))))(Tile((id \ - b4e5f09b-2b19-4ba5-a73e-9a28f14f25eb)(label(Int))(mold((out \ + 9153ca41-34c1-4033-8ea0-07d786aac3b7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 55a1df2f-527d-41af-8277-01a0d9f54cba)(content(Whitespace\" \ + 663d4b08-149b-4a22-a648-28ee7fbaf563)(content(Whitespace\" \ \")))))((Secondary((id \ - 66d77f00-873b-4e87-b073-19ec495401f4)(content(Whitespace\" \ - \"))))(Tile((id \ - 96b6d8d7-1559-46b2-b35b-edc986f476b0)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ + 98446bd1-f187-49a0-88b6-675489b23464)(content(Whitespace\" \ + \"))))(Projector((id \ + c5d4d591-d15a-4c66-88f0-7a88f3a6ce78)(kind \ + TextArea)(syntax(Tile((id \ + c5d4d591-d15a-4c66-88f0-7a88f3a6ce78)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - aed1a8b5-43d5-4a8f-a2f0-a7de13c9a525)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 70a41503-246e-4418-b534-83cdbb15b99f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2f2450b3-ff78-457d-adf4-6456ca3bbff5)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b49d503e-2d0f-46c9-949d-97295ff365f3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9a4f5a7d-ddd5-4b3d-9a6b-d939be419611)(content(Comment\"# \ + 3696b18f-b1e7-4e15-9dbd-f56d1aa7b8d9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 590c1453-d66d-4f00-a5de-8b3f5260eac6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ef7baae7-4b97-4e0a-a47e-46016f4081e5)(content(Comment\"# \ ERRATA: \ #\"))))(Secondary((id \ - 6a0cb44d-ca96-4e18-82f4-b79ee88b2e50)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e78825f2-70c9-4d58-be69-a7bef7f58cb0)(content(Comment\"# The \ + 21fb30f2-004b-4a3a-a1dd-3b91cc0b4e8f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + ff763ee5-f5a4-4e0f-a850-7b9a91a5d58b)(content(Comment\"# The \ bottom toggle can also be used to remove \ #\"))))(Secondary((id \ - 6549a7fa-c69d-47b9-bb99-85875c347753)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2761b913-de2e-42c9-9011-a72426aff2c8)(content(Comment\"# \ + 19b420fc-4ede-4dcd-80d5-b81c38f14ad6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b6babb47-898f-4849-9c28-5b743c812dd0)(content(Comment\"# \ projectors. Currently only bidelmited terms can \ #\"))))(Secondary((id \ - 9cb7117e-da9a-4102-a7b5-f19cad00ea69)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1ffeb118-7484-4516-bbc4-c70a3895e847)(content(Comment\"# \ + cefebeb8-fb83-4c6e-a7fa-84a49405466c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf02836d-ff10-4a96-942a-453c62a31581)(content(Comment\"# \ projected, so some may have to be parenthesized. \ #\"))))(Secondary((id \ - 02854a8c-6ac2-4a79-ba86-9cc8c2faae6b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ae464fce-c593-41ae-be1c-2363f02b4444)(content(Comment\"# \ + bd3e1e37-6d64-4f8b-9ca8-ffbdc7764025)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c2918a56-dd9e-4f8a-a4cd-b2b23942beb2)(content(Comment\"# \ Projectors are persistent across sessions, but \ #\"))))(Secondary((id \ - a8e5b122-e5a3-474c-8f85-f133bb4b7f03)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 410e5672-5fb6-4ee6-9f88-f6bdbcac5aec)(content(Comment\"# \ + 080de242-c6d2-40ca-8fa9-f468ba2a1d38)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 774c7448-85eb-4a6a-a386-85d9b22afaf3)(content(Comment\"# \ currently are lost on cut/copy. Both these \ #\"))))(Secondary((id \ - 9d4b4526-d849-4266-85d7-7aa121011e9c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - db752575-e20e-43c2-92a8-5288127f05f7)(content(Comment\"# \ + 76a6c462-75ad-4993-b3df-7edb908e4ce7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1fd463eb-40fa-45a3-a0ef-2914f7eef9dc)(content(Comment\"# \ restrictions will be removed in a future update. \ #\"))))(Secondary((id \ - 952107b5-deb1-403c-9bc7-3ace08817811)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 291fd742-e902-4301-aeca-de67388bf7d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e79829a6-bfcd-4212-8e44-e096d5e2cd9b)(content(Comment\"# \ - Projectors playfround #\"))))(Secondary((id \ - 8a0bedc7-36e2-4aec-97ee-89b259d63f86)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - beab0865-ec41-4882-9307-445255718618)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - aa8a55bf-2508-4307-b50f-01dcda89f553)(label(if then \ + 0f713bb7-d313-4787-984a-a2eaa053543e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e97ef593-1455-45de-836a-da7c5d454188)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 756174a2-3850-4d3c-8446-6c258a43a511)(content(Comment\"# \ + Projectors playground #\"))))(Secondary((id \ + b7272053-6d1b-4720-90bd-8d6ec1cebe37)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f30d8335-627f-4c75-80ee-5e4cd5fd8f03)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 03bbbeb6-15ad-4496-8d90-07207ebe0b32)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - decb0764-c3e8-4d71-ab53-138c734329df)(content(Whitespace\" \ - \"))))(Tile((id \ - b5089f93-7ffc-4827-8a6d-4c90bc81edf8)(label(true))(mold((out \ + ffc0838c-d5c7-41c9-b38a-0a7a7b9e9d22)(content(Whitespace\" \ + \"))))(Projector((id \ + ab0e5a46-5dc9-41fc-a3eb-fa7092c96743)(kind \ + Checkbox)(syntax(Tile((id \ + ab0e5a46-5dc9-41fc-a3eb-fa7092c96743)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 519e184a-9744-4264-bcf8-f53dcfaef2cb)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 4881d63e-4bbf-4886-b66d-e3cdadc4dcd3)(content(Whitespace\" \ \"))))(Tile((id \ - fc28bbb2-243f-4df3-a864-1d3d76b3b96d)(label(&&))(mold((out \ + 4672dc0c-7aa8-418b-aba0-1ddd7074d933)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 05038a7a-116c-4486-a10f-707032135aff)(content(Whitespace\" \ - \"))))(Tile((id \ - 8a38360f-50ab-412e-aeca-395fa5f3061f)(label(23))(mold((out \ + 51194cca-2e77-473d-b3e3-4254ea244aaf)(content(Whitespace\" \ + \"))))(Projector((id \ + 896fd2a0-1a52-4682-a1a8-339f35598512)(kind \ + Slider)(syntax(Tile((id \ + 896fd2a0-1a52-4682-a1a8-339f35598512)(label(23))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1dec1cda-e010-4aae-a254-4625e8fc2801)(content(Whitespace\" \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Secondary((id \ + 3894d54d-16fc-4c23-9c5c-b79e283a0f75)(content(Whitespace\" \ \"))))(Tile((id \ - dcaad0a5-9ed7-494a-93b9-f675f38bf433)(label(<))(mold((out \ + cc5b00d9-271e-41c6-9240-5efd33ec90eb)(label(<))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 75c5ecf6-7342-44b7-8305-5c37611704b6)(content(Whitespace\" \ - \"))))(Tile((id \ - 25cece41-f9c6-4b2d-992e-22cb39e726d3)(label(int_of_float))(mold((out \ + e54fbf76-4619-4105-ac16-219f9a814f31)(content(Whitespace\" \ + \"))))(Projector((id \ + e558a2ae-0f7c-4b18-8c14-0a74a46d99f3)(kind \ + Fold)(syntax(Tile((id \ + e558a2ae-0f7c-4b18-8c14-0a74a46d99f3)(label(int_of_float))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1634bcf6-ff01-4301-ad47-f25bd3017a74)(label(\"(\"\")\"))(mold((out \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))(model\"()\")))(Tile((id \ + 61f8a887-0683-4244-be2d-9019dab7ca88)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - efbe2f5e-cff3-40e7-9153-b89faa3bc3aa)(label(51.00))(mold((out \ + Convex)(sort Exp))))))(shards(0 1))(children(((Projector((id \ + c3f9b779-70cf-4804-a3fc-e22e6d1f4249)(kind \ + SliderF)(syntax(Tile((id \ + c3f9b779-70cf-4804-a3fc-e22e6d1f4249)(label(51.00))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - df201b1c-83c5-4208-a46f-81e6a76c7436)(content(Whitespace\" \ + Exp))))))(shards(0))(children()))))(model\"()\"))))))))(Secondary((id \ + c0ff7f58-0399-47d4-b09f-514ba8ce40cb)(content(Whitespace\" \ \"))))(Secondary((id \ - c6a4add5-df8c-4b27-a01c-1b82c74ec5b3)(content(Whitespace\" \ + dcf2be48-52ad-4e0b-ad07-9b9f68bc9976)(content(Whitespace\" \ \"))))(Secondary((id \ - daf62ff8-2e36-49c1-bed1-3bab883fbf7a)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 71fadfb9-7aa0-48a4-96fa-ced42195b6ab)(content(Whitespace\" \ + 413f4b3f-f014-4df4-9ce9-014b91e05c00)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8022f14b-5c0a-4049-8c3c-27edb94feb58)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ + 3525db18-faf2-4ec5-ad70-0ac6fdd50fd4)(content(Whitespace\" \ \"))))(Tile((id \ - bd61e7af-e7da-43e9-9281-62b96f6758d4)(label(______))(mold((out \ + e5c608e3-25ea-45ff-8a7a-fad0b8dc7a00)(label(______))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bbf12f95-2c00-4d83-9426-f22c27ed7c7f)(content(Whitespace\" \ + 0db5d3e5-2b7d-45d2-b95b-61d98714837a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e0e78fdf-9502-47d0-85fa-9c8b8ac657f4)(content(Whitespace\" \ + 39204644-e773-4467-851c-fb459c28a6ce)(content(Whitespace\" \ \"))))(Tile((id \ - 094ca6e0-0599-45c7-b9e2-b3fff0ae1bcc)(label(\"\\\"its: \ + 7e1ddfda-aec1-4a60-819f-ae130b1f8bde)(label(\"\\\"its: \ \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4079d8de-834d-424d-a4bb-acd7f99df4fa)(content(Whitespace\" \ + d2f4aa93-bb34-4a08-80fd-8d190108e9b1)(content(Whitespace\" \ \"))))(Tile((id \ - 2b916cf5-a0a3-4118-b7e1-1c6b24c8a8ba)(label(++))(mold((out \ + 1678ec8b-2af6-4026-8a41-6c698dd6f4e7)(label(++))(mold((out \ Exp)(in_())(nibs(((shape(Concave 6))(sort \ Exp))((shape(Concave 6))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 5e5552d1-81f9-42a3-bd86-728309a1d9ab)(content(Whitespace\" \ - \"))))(Tile((id \ - e4645cd3-3cea-4174-992a-4baad88c3c06)(label(box))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e65c1946-9aba-4514-bab9-d500af3b659d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 22318444-30f4-4ae4-8f23-76a28c027c36)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9ca42fff-9ec3-4899-9dd5-228d06b7603e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 38282408-d04b-4de2-984c-d704a3b6be10)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 29f988a3-ab77-4546-b62a-3c5bec85624a)(content(Whitespace\" \ - \")))))))(ancestors())))(caret \ - Outer)(projectors((009307fa-71af-4f48-9fd2-369aad11ff71((kind \ - TextArea)(model\"()\")))(1a1e3b78-a600-4569-9859-ea95d7328e35((kind \ - Fold)(model\"()\")))(25cece41-f9c6-4b2d-992e-22cb39e726d3((kind \ - Fold)(model\"()\")))(2945304f-410e-4c9e-8bef-8dbc37fa52ea((kind \ - Fold)(model\"()\")))(34f66214-5bab-4857-9224-17a900def84f((kind \ - TextArea)(model\"()\")))(38e62114-d7b9-4ed8-a11b-376858934196((kind \ - TextArea)(model\"()\")))(3978bb74-9aef-4b41-adc7-3155736506a6((kind \ - TextArea)(model\"()\")))(432c81db-6a1e-4004-9568-cb79e7e879df((kind \ - Slider)(model\"()\")))(43f38665-0173-4e2b-8084-616dd14d7095((kind \ - Slider)(model\"()\")))(4bc49445-a368-4d5f-98ae-846cada6427a((kind \ - TextArea)(model\"()\")))(522742b5-5981-4a1c-9a74-105e020fad85((kind \ - TextArea)(model\"()\")))(59030dfd-2230-42c4-a2be-e300c627bfc6((kind \ - Fold)(model\"()\")))(5a99a998-ee50-40bb-85d5-4e97a05ad9d1((kind \ - TextArea)(model\"()\")))(68f1e62e-a9ea-49ee-8b23-4c8934f9bdca((kind \ - Info)(model \ - Expected)))(7bc7eb1c-f0ee-48b0-a0cd-aca0aae535ac((kind \ - Checkbox)(model\"()\")))(862881a7-ccc8-4fec-9935-65a21984520d((kind \ - SliderF)(model\"()\")))(891695d6-a7e7-4aa0-8725-673929d05531((kind \ - Fold)(model\"()\")))(8935d807-0b39-468f-9ada-eaa0124d2f4d((kind \ - Info)(model \ - Expected)))(8a38360f-50ab-412e-aeca-395fa5f3061f((kind \ - Slider)(model\"()\")))(8c312c27-d8d4-4c06-8b58-ec5aea9826da((kind \ - TextArea)(model\"()\")))(96b6d8d7-1559-46b2-b35b-edc986f476b0((kind \ - TextArea)(model\"()\")))(9f5fefb9-9cf6-430f-a507-17d7fdf96788((kind \ - Slider)(model\"()\")))(ae2f057e-f44f-4f3b-9fe7-b32acb7881fa((kind \ - SliderF)(model\"()\")))(b5089f93-7ffc-4827-8a6d-4c90bc81edf8((kind \ - Checkbox)(model\"()\")))(c11e3d78-6865-42fa-8d6e-722631ca2d99((kind \ - TextArea)(model\"()\")))(d3c0d680-bfde-4279-adba-79b3a4a64d61((kind \ - Checkbox)(model\"()\")))(d59f30c5-c4e0-4182-be6a-666baba654ea((kind \ - SliderF)(model\"()\")))(d886a161-7377-4404-8099-b36a6e886bc8((kind \ - Checkbox)(model\"()\")))(dbb0eaf5-a0cd-4246-b48f-d6cd9d2ee199((kind \ - TextArea)(model\"()\")))(e442c25d-463b-4706-a43f-393a37010a8e((kind \ - Checkbox)(model\"()\")))(ec1558b2-04e6-4323-87ea-2dbfd87a485b((kind \ - Slider)(model\"()\")))(eecb808d-a186-45fb-8d0a-0c09e9dd87bc((kind \ - Checkbox)(model\"()\")))(efbe2f5e-cff3-40e7-9153-b89faa3bc3aa((kind \ - SliderF)(model\"()\")))(f5ebef37-c9e2-43cf-867e-f150c01f04e9((kind \ - Slider)(model\"()\")))(f98e35be-44d9-4973-8e3f-8739dbddbcf9((kind \ - TextArea)(model\"()\")))(fcfc4a5d-d131-4e19-8641-05887df4f8b4((kind \ - TextArea)(model\"()\")))(fe38a3b6-6401-4631-add3-f0339bd92210((kind \ - TextArea)(model\"()\"))))))"; + 781aa58a-70d0-4c88-864d-ac9970391b53)(content(Whitespace\" \ + \"))))(Tile((id \ + 671dc1bb-b869-4ed2-b37c-76cbfa69df25)(label(box))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ + Outer))"; backup_text = "# PROJECTORS #\n\n\ # Some kinds of syntax have dedicated GUIs. #\n\ @@ -13079,26 +13117,26 @@ let startup : PersistentData.t = # Fold projectors cover terms with abstractions. #\n\ # 1. A simple fold roles up any term, replacing #\n\ # it with ... until it is expanded again. #\n\n\ - let fold = (((((((((((()))))))))))) in\n\n\ + let fold = in\n\n\ # 2. A semantic fold covers a term with a property: #\n\ # Click to toggle inferred & synthesized types #\n\n\ - let folds: (Int -> Bool) = in\n\n\ + let folds: = in\n\n\ # Projectors on literal data are called livelits. #\n\ # Three base types literals use inline views: #\n\n\ - let guard: Bool = true in\n\ - let phase: Int = 44 in\n\ - let float: Float = 79.00 in\n\n\ + let guard: Bool = in\n\ + let phase: Int = in\n\ + let float: Float = in\n\n\ # Inline error decorations (same as for tokens) #\n\n\ - let (a:Int, f: Float) = true, 28 in\n\n\ + let (a:Int, f: Float) = , in\n\n\ # The String base type get a multiline view: #\n\n\ - let _: String = \"\" in\n\ - let __: String = \"\\n\" in\n\ - let ___: String = \"a\" in\n\ - let ____: String = \"shift\\n\" in\n\ - let _____: String = \"\\nmalicious\" in\n\ - let ______: String = \"a\\n shift\\n malicious\" in\n\n\ + let _: String = in\n\ + let __: String = in\n\ + let ___: String = in\n\ + let ____: String = in\n\ + let _____: String = in\n\ + let ______: String = in\n\n\ # Multiline error decorations #\n\n\ - let box: Int = \"\\nmalicious\" in\n\n\ + let box: Int = in\n\n\ # ERRATA: #\n\ # The bottom toggle can also be used to remove #\n\ # projectors. Currently only bidelmited terms can #\n\ @@ -13106,1870 +13144,1918 @@ let startup : PersistentData.t = # Projectors are persistent across sessions, but #\n\ # currently are lost on cut/copy. Both these #\n\ # restrictions will be removed in a future update. #\n\n\ - # Projectors playfround #\n\n\ - if true && 23 < int_of_float(51.00) \n\ - then ______ else \"its: \" ++ box \n\ - \ "; + # Projectors playground #\n\n\ + if && < () \n\ + then ______ else \"its: \" ++ box"; } ); ( "Types & static errors", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 5712047c-e3e9-423a-8beb-0aebc3fe726b)(content(Comment\"# \ + 5da92fc0-10cd-4354-bf0b-1a22accca803)(content(Comment\"# \ Internal Regression Tests: Type errors #\"))))(Secondary((id \ - 25719d37-0273-4700-881d-7c4acd6022d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3f46cd29-760e-4905-94fe-4506288eddc3)(content(Comment\"# Each \ + 42a2f89c-4a95-4199-8800-f53809f593ba)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e86dd07c-7157-40bc-bdaf-59d06e0034c9)(content(Comment\"# Each \ line should show errors or not as indicated \ #\"))))(Secondary((id \ - 32c06278-527f-401c-a578-2716aa5fceaf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4ce27d7e-c0b7-4fb6-877c-7292df539be7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f0e2ffd2-da15-4b6b-abe6-ec495dab317d)(label(let = \ + 1d55398b-0045-41ec-8690-4a4664980596)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5294d45d-964b-45c9-a85c-c0c11464bd39)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 758d9a9b-d1f3-4df6-9100-9f81566a6a37)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - aa13ed8d-bea8-43ee-a690-aa94ce388682)(content(Whitespace\" \ + ecc545ce-876a-4a70-ab47-8bfe9a428248)(content(Whitespace\" \ \"))))(Tile((id \ - 1d0b122b-b380-480b-9330-64f5325fd001)(label(_))(mold((out \ + e16f00db-fd89-4065-b35a-64904016ae29)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 405e2e5b-a21b-41ca-bb59-346149d30734)(content(Whitespace\" \ + 5518e231-da7f-4a7d-8d45-05d910e7f0cf)(content(Whitespace\" \ \")))))((Secondary((id \ - 4275838b-3c79-4354-95a6-2fcadad57470)(content(Whitespace\" \ + a29c4eb6-de40-4bb4-aaac-10f598b07123)(content(Whitespace\" \ \"))))(Tile((id \ - 27b78966-64bc-4811-a6f9-526911238d99)(label(unbound))(mold((out \ + e7743ed3-3268-45dd-be07-e34b23633d36)(label(unbound))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 06b267af-ec90-430c-a3b4-ee1cc6794d10)(content(Whitespace\" \ + 651970c7-502d-48de-b4d4-870b276c3233)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8c6c8c81-5e58-4ef1-a605-adbb9407a432)(content(Whitespace\" \ + e52d4513-49e6-4f2f-8fd1-939e723da309)(content(Whitespace\" \ \"))))(Secondary((id \ - d6a91700-d69d-4e2d-a68e-700ed6f3fa65)(content(Comment \ + d21dcb5b-762f-4047-9a8b-51cff4e4d5d8)(content(Comment \ #err#))))(Secondary((id \ - 2da41d52-07bc-4009-a722-a3500331fac5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 68ad8ccb-bc82-4d52-af0b-5757c4c262f3)(label(let = \ + ab1dff56-08b2-4c50-a2b5-fa5a36fbcdab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4d41990a-b92b-444e-a1a3-bb7844e88871)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5ffdba6c-5cba-4a1b-8f4c-1d3020d92903)(content(Whitespace\" \ + b0ca9c49-112c-47a8-950b-8d0d7bc59a23)(content(Whitespace\" \ \"))))(Tile((id \ - 0cdca946-8d67-482c-b6fa-7acadb320fb3)(label(Undefined))(mold((out \ + 33aec8d3-3eb0-4679-a386-2dac5a304783)(label(Undefined))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - dc3a8db5-2218-4195-afc8-00aa9528f12e)(content(Whitespace\" \ + e5497533-ea66-474d-bd69-cc76b4a5653d)(content(Whitespace\" \ \")))))((Secondary((id \ - 672b8800-98dc-43e8-bfdc-6f64df812aae)(content(Whitespace\" \ + 51530a4b-7d00-47bd-b5ec-10682b5207d9)(content(Whitespace\" \ \"))))(Tile((id \ - bcaacef9-88fd-42f5-bdf8-1a43d8a643ac)(label(Undefined))(mold((out \ + 442205d8-cbd4-4bdc-9066-f486206b94fa)(label(Undefined))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 800f279c-c746-451a-90c9-23ba68c220c1)(content(Whitespace\" \ + 527c9d07-1ec6-4aec-bca1-b1a50cd3af43)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 24478bb1-1b05-4dc9-8c09-4f616970d524)(content(Whitespace\" \ + 3c09f1b8-0796-4cf6-a79c-0bcc0832d91c)(content(Whitespace\" \ \"))))(Secondary((id \ - 83368d83-fc88-4e9d-a9bc-708a98365791)(content(Comment\"# 2x \ + 25d84317-ce77-4faf-9025-10a68eed8e6a)(content(Comment\"# 2x \ err#\"))))(Secondary((id \ - e6117b93-e112-4bfc-ad2a-e33e79d434f2)(content(Whitespace\" \ + 97db46c7-ce76-4cee-9703-f04949d45340)(content(Whitespace\" \ \"))))(Secondary((id \ - f39c5ab6-4780-4d5b-b3f4-8ff33e020ce9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3f73c81c-66e0-4afe-9e22-fdfc4f6f5c59)(label(let = \ + 924f65ec-e7e5-46e4-ab2b-4e652571f60e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 55a5b34b-daf5-48cb-b7de-4b76f16a960f)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7cba5e83-2e6e-48bc-85be-c53200abe117)(content(Whitespace\" \ + 7c0fb53d-c7e1-4548-acb2-8faa621271ce)(content(Whitespace\" \ \"))))(Tile((id \ - 8c9d41ee-131c-406f-a65b-9158f2ff5704)(label(true))(mold((out \ + 21d17081-0c7d-4a64-aead-e9ec099e9eb1)(label(true))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ba9bd158-5bb2-48a7-8596-d4c4a1e9062a)(content(Whitespace\" \ + ed0e1fc1-a44d-44a8-b50e-91e38cf14712)(content(Whitespace\" \ \")))))((Secondary((id \ - b4cc383a-2331-4045-8eba-57de9423ca68)(content(Whitespace\" \ + a297d308-da82-4733-81ba-6c15026cac9d)(content(Whitespace\" \ \"))))(Tile((id \ - e3572e3b-2096-43ca-8ef6-1170c0401778)(label(2))(mold((out \ + 1abd1a01-f0b5-498f-9446-4b285f25055b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 48d5f6ee-ebf0-4b3f-8571-26259982c05f)(content(Whitespace\" \ + 862e2271-7b23-48e6-a013-c50d7e8240eb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 34b71af6-4d47-42a1-a334-26143b01ce4d)(content(Whitespace\" \ + cd54c7ae-3f6a-4aed-bb62-39cab8c5166a)(content(Whitespace\" \ \"))))(Secondary((id \ - 09ed9d4d-3488-4c61-b0de-d84048921b61)(content(Comment\"#2x \ + 526f32dd-17b9-444d-b697-3a49874d86ab)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - 4b3a8054-ec88-40f2-938b-585ad4dc7ef9)(content(Whitespace\" \ + 3fa82081-4e36-4899-83eb-0194fbb8a152)(content(Whitespace\" \ \"))))(Secondary((id \ - a0e8ad90-fa46-4d6d-a834-8cbed02e24e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 56dc81bb-3a37-434d-a488-408d8a90480c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4139997f-e29b-470f-ad5c-8192ada59d2c)(label(let = \ + 22947c17-9809-4e12-b52b-fd9b018be69b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 1a9bbbc8-33ba-42ef-a9a8-96b4936f83d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + d46a196d-925c-4f7f-9d9b-f73ef61410a5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - b62d4e1e-4e3f-4284-b4f5-0e46e3822413)(content(Whitespace\" \ - \"))))(Grout((id 81e178c8-13fe-4b3d-bb5f-ef85dc332141)(shape \ + 2))(children(((Grout((id \ + 2a22b1ff-523a-4274-af9b-2d3840b4ccef)(shape \ Convex)))(Secondary((id \ - 787f1759-c418-496d-87a7-d34b2538e547)(content(Whitespace\" \ + cabf0162-6154-4020-9ff0-f16aa1e5e9a8)(content(Whitespace\" \ + \"))))(Secondary((id \ + d5f86095-dfbc-419e-af83-1419f698f916)(content(Whitespace\" \ + \"))))(Secondary((id \ + 660c2050-c473-44ee-92b7-48c24e4fff1e)(content(Whitespace\" \ \")))))((Secondary((id \ - b6b53f3c-8d88-41f2-b691-81356e9caf10)(content(Whitespace\" \ + 31e7b59a-ecef-4a68-907b-dd2c315acd63)(content(Whitespace\" \ \"))))(Tile((id \ - ea3377fe-5dff-4099-8941-a0c3e9a42302)(label(if then \ + 1fc8b7c5-f735-4e45-9969-d03b430a1f0f)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - eb847401-b2b9-4f71-a1f2-751c8f108c05)(content(Whitespace\" \ + 4c64ce16-b737-4ab9-aac5-2c47d8f59c38)(content(Whitespace\" \ \"))))(Tile((id \ - 25f30b02-01ae-47ba-b6e8-02b911fdecde)(label(true))(mold((out \ + ce6095e0-6573-4575-915d-77625cad241b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - de7806f1-0b43-45aa-8951-e45375fecad2)(content(Whitespace\" \ + 360306a1-d0c2-4b1b-8b91-98050159c120)(content(Whitespace\" \ \")))))((Secondary((id \ - f3b59ecd-35b3-4274-a7df-79b156faaa6a)(content(Whitespace\" \ + 9076b31c-ca93-4931-a1b1-a3c6978acfb0)(content(Whitespace\" \ \"))))(Tile((id \ - c27ec555-e326-4bde-ab25-3dd3355dedbe)(label(1))(mold((out \ + f3d56cf8-047d-4491-990e-2faa2345ed52)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2e2197b6-53f6-42d8-a3ae-7011bc6b2abf)(content(Whitespace\" \ + 163e8baf-71e8-4c62-9bb5-a9789b912f9e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 35152296-da76-43e0-94c3-20a06ab1b3dd)(content(Whitespace\" \ + 35b94740-b1b8-46d1-8c65-a2d9699cf5d7)(content(Whitespace\" \ \"))))(Tile((id \ - 582810a0-0e74-4d0c-a1cf-bb10faa58767)(label(1.))(mold((out \ + 32fd3308-b7d7-46ba-b40b-8c4739821951)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0d18a455-f393-4745-b53a-a6d2e6331123)(content(Whitespace\" \ + 359922bf-8f7c-4756-bce7-dfbdab6768eb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e8ed879d-e20a-4c70-906a-c45add361d52)(content(Whitespace\" \ + 0aef1054-7de3-46de-b629-1712252e36c5)(content(Whitespace\" \ \"))))(Secondary((id \ - 71e51842-f9e5-4994-a4b6-0eb98a8ce5ca)(content(Comment \ + bc921273-eecc-40dc-b037-bd352a9ba17e)(content(Comment \ #err#))))(Secondary((id \ - f572c713-8320-4f17-b6c6-44195ad110c0)(content(Whitespace\" \ + 27b24844-827f-4aaa-ac1f-22be23ed9e04)(content(Whitespace\" \ \"))))(Secondary((id \ - eb088086-86cf-403b-8762-8815af11720f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 95eaaf07-fe37-4d7b-bb74-e42351200292)(label(let = \ + 7f2c237f-d86d-4e3f-afdb-498d07823331)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1c454cf8-ecd5-4033-bbf8-19b68014191e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 0cbd0477-9715-4108-a4a0-b2ca392619c2)(content(Whitespace\" \ + c2387c61-33ff-4a77-a91d-9268e9fbac09)(content(Whitespace\" \ \"))))(Tile((id \ - a141468e-25dc-4477-9423-dfb4088d86a6)(label(_))(mold((out \ + f04265e1-9788-4653-a1d6-e266c5a59d66)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e4b56ad4-fa72-4093-b3ac-7fad3c8c9582)(content(Whitespace\" \ + 3c92d98f-a523-4344-903f-fcd44b7b8d13)(content(Whitespace\" \ \")))))((Secondary((id \ - 4b1f62f8-c221-4910-8bdb-a098bd445b5a)(content(Whitespace\" \ + 1f170ec6-a88f-4e37-98ff-43df1627bb74)(content(Whitespace\" \ \"))))(Tile((id \ - 48ce6f57-43d1-4b0e-b07c-65b697616db7)(label(if then \ + 3b52bb5e-ec3b-484c-ba60-48fb0c1db7d6)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f1b65c28-8fa1-437b-ac2c-684e419aff56)(content(Whitespace\" \ + fb073b60-2128-4c75-b741-84dd5eec14b9)(content(Whitespace\" \ \"))))(Tile((id \ - ad360c56-4354-4e12-bb94-28f601754f49)(label(true))(mold((out \ + 0b5b8922-658a-4a9f-80bd-da3794c121d3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 9618d989-7980-4b42-bc3f-e16002120eaa)(content(Whitespace\" \ + 949b9c01-395e-47f6-8cce-b5e6b6425c8c)(content(Whitespace\" \ \")))))((Secondary((id \ - e8f6bb51-d59f-46b1-9dad-4fa37149115a)(content(Whitespace\" \ + 2cd662be-b43c-439a-a48d-51f072e4b301)(content(Whitespace\" \ \"))))(Tile((id \ - 38aa63e0-0ae9-4541-99bd-f041cdc6c339)(label(1))(mold((out \ + 69458974-8dd8-428a-8cee-887b4d3e1011)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8c493809-9781-4988-bd1b-55a58d82dcbf)(content(Whitespace\" \ + 781060e1-c57d-4d6e-882a-8ad6560f230c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 72aba1da-8a3d-4f66-85e5-5f13f58a30ce)(content(Whitespace\" \ + 1b9ba2c3-4ca1-48d8-90b9-63e250bd1136)(content(Whitespace\" \ \"))))(Tile((id \ - 94ffee3f-75cf-4f90-8b15-4b697df7c1f3)(label(1.))(mold((out \ + 74cc524f-7218-4dba-a0de-0a18046194e9)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 60912364-0046-42a6-95d7-fab576f1d771)(content(Whitespace\" \ + 635bcde5-e132-4058-978c-61533458ed13)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7413cf5d-fc01-4c68-b44c-9d4d12a9268f)(content(Whitespace\" \ + ddc7f71e-ca6a-465b-8c87-5462853072a6)(content(Whitespace\" \ \"))))(Secondary((id \ - bcd6c603-a73d-4507-abd8-e948e64ce91d)(content(Comment \ + 923041c3-09ef-40f0-a53f-de812afcebf8)(content(Comment \ #err#))))(Secondary((id \ - 895c28e6-d5f8-4c85-9e1c-d5245e8680b4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bdeff1bb-a57e-4c8e-b99b-392c49d76796)(label(let = \ + 0bb4658e-b3bd-4d03-bd98-e4d3eb402e32)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2c1d0ea8-7cb7-4202-af0f-9911fbd1ec26)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 31f83bec-123f-466f-a9f6-5dca6f2439a9)(content(Whitespace\" \ + 5b4eeb14-e111-401c-8248-3aaf6b1c554e)(content(Whitespace\" \ \"))))(Tile((id \ - bd32f355-a68a-496d-867a-25a2c90a19a2)(label(_))(mold((out \ + 9e766167-bcea-4bd6-9217-17aa21f80cb8)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2206d924-81b9-44b6-b725-f4a8e4aaa9e3)(label(:))(mold((out \ + 8ef5ab6d-6cc4-4081-b092-6a7721669dda)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 733ce9a3-299d-43a7-8a25-5dd76f196ef4)(content(Whitespace\" \ - \"))))(Grout((id b2b029ca-235d-4c68-9f5c-551c00c15263)(shape \ + Typ))))))(shards(0))(children())))(Grout((id \ + 32d94418-61a4-4333-b295-3947650f3b1d)(shape \ Convex)))(Secondary((id \ - b4703344-736d-4172-9401-47bf1ee8ebd0)(content(Whitespace\" \ + ada81658-b24c-447e-8e91-142f404fe596)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2c8ad945-5cf8-4383-9cc3-cc5e878ec92a)(content(Whitespace\" \ + \"))))(Secondary((id \ + b71ab3ad-733a-4cfa-9fe9-2b006f9179bd)(content(Whitespace\" \ \")))))((Secondary((id \ - 0d34a4c5-a931-4279-838b-482019c0e874)(content(Whitespace\" \ + ff02d723-d855-4161-8cac-3aa34b6249d9)(content(Whitespace\" \ \"))))(Tile((id \ - 8617302f-39ee-4919-acd3-bf2922d3c93c)(label(if then \ + 0fdedef1-300c-4640-9f6b-91b8c72008cb)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e150d31d-c268-4ddf-aca3-138d0e4bd747)(content(Whitespace\" \ + 9b034a88-063b-4b56-805a-c33455450427)(content(Whitespace\" \ \"))))(Tile((id \ - fff3a735-69ab-4bbc-8632-b0ed3db5c9ff)(label(true))(mold((out \ + 668e5861-da35-478b-9c16-76563698bea5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6721b83a-b411-4e09-a8c5-8646237ada59)(content(Whitespace\" \ + 000b9574-ea77-49fe-be7d-4c90e2805ab9)(content(Whitespace\" \ \")))))((Secondary((id \ - c8ed8259-036b-4e73-b652-9ba804395c7f)(content(Whitespace\" \ + 87175621-3ea5-46f2-a49a-b5e5c1cabfcb)(content(Whitespace\" \ \"))))(Tile((id \ - 41e14ccc-3394-4f9b-a61b-01b07b437a36)(label(1))(mold((out \ + 9d8b813e-c6f9-4f92-ba80-5f0ff87be342)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fc429e49-6880-422d-8f71-d995e0461e89)(content(Whitespace\" \ + 8da20320-b9f3-4174-81d7-125940998614)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 27f9cbfd-b512-44d3-9598-b62bd655bf80)(content(Whitespace\" \ + 7c2f93a8-d19a-45f5-a0e3-e927e22231ac)(content(Whitespace\" \ \"))))(Tile((id \ - 9bc45941-5ba3-44c6-b58b-2fee074ab78f)(label(1.))(mold((out \ + 0b07d2df-14f0-4363-bd27-b9869c80d813)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - aa7e6623-8871-4b3f-80c3-579518a6a719)(content(Whitespace\" \ + 81cfd0cc-d03a-4fc8-8fa6-b3a95c031543)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4798a663-83fb-48ae-97f3-d70b48cad698)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f23b9fa7-3c5f-4cb8-ba5c-b79394014ce5)(label(let = \ + be5eb0b5-a089-4a75-90c2-0762c9803900)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1339c79c-f1cb-4065-a6e6-6d93094c6e88)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 646115c6-89a4-4d14-ae66-1ef90b802767)(content(Whitespace\" \ + 3c521c1e-0569-43e8-98eb-13a6e83c0360)(content(Whitespace\" \ \"))))(Tile((id \ - 28e7b10a-c889-43d6-91f1-6ac34348db13)(label(_))(mold((out \ + 171b8fab-f5da-457b-8bfb-0c0ea484b619)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1a3d0d2f-4e56-4487-be1f-fd4c6c63bbc2)(label(:))(mold((out \ + af9669f3-ac9d-4d4e-8178-118a658c1acc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 52505bd0-bc21-40ea-ba59-00addb6b7ecf)(content(Whitespace\" \ + 8c96f25b-ee85-4207-bcfc-92b8c44ad284)(content(Whitespace\" \ \"))))(Tile((id \ - d12fe57b-d01b-4086-817a-17b19a60dac8)(label(Int))(mold((out \ + 95e80aa6-dfe1-449a-bdf4-d98b80a465b6)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 61b4003f-a837-439e-bed6-6c39295ee29f)(content(Whitespace\" \ + e07a80d8-0c00-45d1-8309-5dd1212fb23d)(content(Whitespace\" \ \")))))((Secondary((id \ - 842cdbd7-8bfa-4218-850f-586fdf6af823)(content(Whitespace\" \ + 761c39c7-7f56-4c6e-8301-77177c9271b7)(content(Whitespace\" \ \"))))(Tile((id \ - 06d23843-8fe3-444e-8a87-eb0aa4490cc6)(label(if then \ + 919ca3cd-b67d-4eb8-9a75-712c864a22a5)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - affe2168-684c-4d67-bec5-8228b05937b0)(content(Whitespace\" \ + 273a02dd-9e8e-49bf-8bff-f682950cb549)(content(Whitespace\" \ \"))))(Tile((id \ - 18ffdc70-0a5e-4192-8795-cd4c95035705)(label(true))(mold((out \ + baeddf76-ce9f-493e-aa38-54b5d2ee57d6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 21e6c452-a400-45a2-a721-10714c0f4346)(content(Whitespace\" \ + 0049890b-ab90-4167-b71c-7703d5f2966a)(content(Whitespace\" \ \")))))((Secondary((id \ - 8d733b17-4f6f-4a44-8799-00d93c079077)(content(Whitespace\" \ + 9dbdd12e-99d0-4f1a-b122-44e155bd502b)(content(Whitespace\" \ \"))))(Tile((id \ - f800a7ca-7554-48cd-8f42-4dba03d9a8cf)(label(1))(mold((out \ + 53f267e6-4ae2-4ec2-9da8-0a50a319eaa2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fc7339de-2afd-4b49-acf6-d1ed91ded9f2)(content(Whitespace\" \ + c9cebc13-1f7f-4352-9f4a-4893ea99c2bf)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ec12599b-4c0e-4e46-a376-b6ae40142d05)(content(Whitespace\" \ + 6ebe2987-1ed7-458f-a412-3f95909fbef6)(content(Whitespace\" \ \"))))(Tile((id \ - dd4e1463-ceb4-4355-a51f-49dd4fa24225)(label(1.))(mold((out \ + 8dbb7302-d5b4-4ee8-ba5e-50f0b47ba53d)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e748c816-cfe2-4d54-8212-08f49c707909)(content(Whitespace\" \ + ec52f0b3-744f-4efb-9487-cedac5fa1216)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ca8de082-63b7-49ef-97e5-619ed4b0b05f)(content(Whitespace\" \ + d18b91a6-dc68-4e1b-b84a-02573a655b65)(content(Whitespace\" \ \"))))(Secondary((id \ - c48c4f78-6b82-4236-a7cc-e0dced213ae8)(content(Comment \ + 4179bbc1-2373-4a36-9a36-ae430f8f4e69)(content(Comment \ #err#))))(Secondary((id \ - 1c1a964b-411c-4f94-9476-09115d88d190)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cdcf5ede-13da-454b-9d5d-99fd246b2874)(label(let = \ + 2d009bf6-b3d3-4a73-9a88-3c16ce0c0a22)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 18731ed3-13d7-4121-83cc-dc8da7d518fd)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 635ab09a-8ad0-4de7-b0fe-8cdd984882b4)(content(Whitespace\" \ + d1ec2c86-e9da-4e1d-9e96-cd7c4817bc01)(content(Whitespace\" \ \"))))(Tile((id \ - d9f87dbe-c4ed-4be0-9841-7d85aea57072)(label(_))(mold((out \ + 0dc32826-da12-41a5-a8d9-bf97a424af3c)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1bf5502f-4aa9-4e84-b8b6-ad3f47643044)(label(:))(mold((out \ + bc032bcb-92a5-4c8a-a5b7-e1100f6c16cb)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 509f607f-02b6-4ebb-b972-b9507a4e8763)(content(Whitespace\" \ + 847833a9-9721-4f0c-842e-e7fe5ecb85f5)(content(Whitespace\" \ \"))))(Tile((id \ - bab9d19b-9401-464c-b272-88f447e448f2)(label(Fake))(mold((out \ + b111eada-6fdf-4ff5-935d-a4792d1b1e6a)(label(Fake))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - bd9ea560-a265-416e-9d51-3a76856174d2)(content(Whitespace\" \ + b0409219-b018-4004-ac62-49b4fe302b3f)(content(Whitespace\" \ \")))))((Secondary((id \ - a02666f2-6cab-4928-8385-b46f31fea725)(content(Whitespace\" \ + 1a525c37-234d-425d-9ee5-8ae791190501)(content(Whitespace\" \ \"))))(Tile((id \ - 778e7cdd-96f4-4caa-90ea-62db4df40157)(label(if then \ + e8188ebc-d8b3-4345-b1c5-70e67dee6527)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - daf56b49-9558-4d51-a2de-c1913007233f)(content(Whitespace\" \ + 17677456-b3ca-4d04-9dbc-a7ac432d1fda)(content(Whitespace\" \ \"))))(Tile((id \ - 2cc5115c-c074-4162-8ee3-2a23922c5f8e)(label(true))(mold((out \ + fd34bee1-1b68-4096-80e9-9cd3ae539e12)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 415984f7-6e45-427d-9600-481f16d727ec)(content(Whitespace\" \ + 7e3d2df2-cdd1-4cd9-8398-57f1d67a70d6)(content(Whitespace\" \ \")))))((Secondary((id \ - 37518ac9-c345-400d-aa46-49c4a23d490e)(content(Whitespace\" \ + aa6e7a7a-cf03-4a05-a0cd-5fa657d6d55a)(content(Whitespace\" \ \"))))(Tile((id \ - d0ed9384-93d9-430f-9c33-604e316f9183)(label(1))(mold((out \ + 4bdf9d6a-924c-4f89-8314-7a95270142f2)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f529db5a-86ab-4f69-ac98-5db6afcb2882)(content(Whitespace\" \ + 2211a089-86da-4fd4-8474-fa51c99dcff7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ee0e1431-7744-4ef1-8352-7a0a053215a1)(content(Whitespace\" \ + 1b1e7516-cf21-4360-94ba-5d30aa572f65)(content(Whitespace\" \ \"))))(Tile((id \ - a94dd962-07c6-4cd5-8f74-d7a53b53eb12)(label(true))(mold((out \ + 917ee296-4347-414a-aaae-e2f5a97a87a8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f89e966f-6e46-49af-b97e-2e83a64077b7)(content(Whitespace\" \ + ba6ffa57-1c5d-4b9d-a1b5-3b1328849511)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ea3c38db-1a45-420d-a0b4-a3b7ccb869b6)(content(Whitespace\" \ + 5be2c2bd-da80-4512-bd2a-0a30f87d9958)(content(Whitespace\" \ \"))))(Secondary((id \ - 4e062afa-0b64-4408-bd38-4d69b9ffef79)(content(Comment \ + 21bd2e10-a4d3-4951-a573-87b2c8f4eb1a)(content(Comment \ #err#))))(Secondary((id \ - 56caa885-0a84-4bc2-b108-87b94ab68c1c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 342572c7-0105-4ac7-817b-cb6d580d1ea4)(label(let = \ + f131d865-8f16-4925-8f5b-6c2a42c446ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f4c75534-a83a-4d04-a4fb-7714e1a2be7b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - daa9a999-8d84-4296-a2b0-5b06bfbcd239)(content(Whitespace\" \ + 13883334-6745-4000-8735-9cd577a74d56)(content(Whitespace\" \ \"))))(Tile((id \ - d4f9b1b8-3f3a-4178-b0c0-f8a0d02af8f5)(label(_))(mold((out \ + d7da986a-907c-4d43-ba60-f2868db14ab9)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 33f30d39-2218-4ac4-ba70-df655f93d4ae)(label(,))(mold((out \ + 00317a8c-b6b0-41e7-8284-f69f9970dc32)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 065b19a9-e7a6-4910-ae05-04918e4d163a)(content(Whitespace\" \ + 668a2995-d1b6-48a2-8fd2-8662d288bcd1)(content(Whitespace\" \ \"))))(Tile((id \ - 1f58b747-1208-47e2-bd71-c80c3155ce3a)(label(_))(mold((out \ + 46c49881-a9b2-4dc8-9cf2-c8231ba08662)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 4842f067-1d31-471a-b094-234c8b4cc8fe)(content(Whitespace\" \ + af269db2-934e-4855-b194-d5fc2381b7d2)(content(Whitespace\" \ \")))))((Secondary((id \ - 05cf8cba-cad7-40d6-980c-582c3b2c5ac2)(content(Whitespace\" \ + 19bdbfd5-876f-4ac5-9b43-86c6d99586e0)(content(Whitespace\" \ \"))))(Tile((id \ - fa321989-1769-4d22-8750-b75cdd6bf164)(label(if then \ + 5d8d2765-7c51-41ed-8af9-8f56488444e2)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 22918879-d6ef-478a-8e7d-2cb5ae4a24a0)(content(Whitespace\" \ + 9f5c3366-b61c-4de3-a8b1-9b9513755bd4)(content(Whitespace\" \ \"))))(Tile((id \ - d01bb430-1cc8-4e03-9b44-f8d9d952d3c2)(label(true))(mold((out \ + a1c41de4-fce7-449d-a78d-845ed7b83fc9)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 396b6b7c-f2e5-4b99-b39d-9c8dd5bf1db9)(content(Whitespace\" \ + 95f34ebc-0dbe-439d-95dd-294cee252ec3)(content(Whitespace\" \ \")))))((Secondary((id \ - 23a778a1-585e-4c33-8214-5f0654f864a8)(content(Whitespace\" \ + a567c3ac-db02-4442-ae43-87ea60064fc6)(content(Whitespace\" \ \"))))(Tile((id \ - 59275e06-b264-4739-a072-ab1ec0148f13)(label(1))(mold((out \ + f2c2d679-cf1a-45eb-8e5b-a3fbf5f0d7e7)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 941285bb-8e2c-4144-a623-5b9d02a44c42)(content(Whitespace\" \ + 82fd11dc-9d43-47bb-bba1-107c55f26962)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6d03507f-06d2-4883-9ee5-12bca1353165)(content(Whitespace\" \ + d355dfc2-04e3-4e0e-a8e7-768021d31816)(content(Whitespace\" \ \"))))(Tile((id \ - 95011bbc-b903-42d9-8671-2145be041c3b)(label(1.))(mold((out \ + 4c708eaf-93c2-4d51-81de-2fd3eb5d8d11)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1c1a80bc-62d3-426f-b447-528833b178a4)(content(Whitespace\" \ + dacb6033-fcc9-4b12-9aab-49ea9fc94687)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 42bea2eb-3e14-413c-b555-4b552a780f94)(content(Whitespace\" \ + 8fc791a7-579d-45c6-bd6e-9bb72239af77)(content(Whitespace\" \ \"))))(Secondary((id \ - b628fa13-f01e-4b3a-9221-f2898b4d3d94)(content(Comment\"#2x \ + f0ac9f87-1bf4-4061-90c3-7ed6ff0c9676)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - 044e6d9e-0df3-4384-b375-5ec7fc16219c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 66efa0c7-f05f-4c62-bc61-4cc0e19227c2)(label(let = \ + 62d1b5fe-cc31-4090-9d73-9eb0d2f3f492)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4d1bde0b-6567-41e5-ae93-f10d8db5a6f8)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - ea34e271-aecf-4040-a436-2d4ea169e4ac)(content(Whitespace\" \ + d7c01def-cc22-4d2a-ab20-4592a0774cfc)(content(Whitespace\" \ \"))))(Tile((id \ - de2ba13d-3598-48ed-9601-22a40a08484a)(label(_))(mold((out \ + 16ae4dec-6c75-4fc9-8f43-1846e10b4f4f)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 154a4776-c72c-4604-9136-6525df3e8de8)(label(,))(mold((out \ + 2d5b145d-9d10-42d9-a2c3-ab290a406e98)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 95199192-bcec-400f-ba66-36cc9e6c658d)(content(Whitespace\" \ + ddcfb4d1-ad7e-4511-99dc-d3bc7e287e2e)(content(Whitespace\" \ \"))))(Tile((id \ - 9e5e1496-0d46-4439-a1fe-ba1373a26654)(label(_))(mold((out \ + 72098cb3-4e14-4a8d-aa8f-f549c9ff9c31)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6a10cf63-3b4f-4bf4-8bf0-1aa1b0257676)(content(Whitespace\" \ + 14e3f792-983c-41b7-9613-c5cf7ba10fb9)(content(Whitespace\" \ \")))))((Secondary((id \ - 8d1256cd-3e8b-4447-89a9-1dc6ff9e7e82)(content(Whitespace\" \ + a21af13a-3af9-49c7-a039-10fa5ba0c227)(content(Whitespace\" \ \"))))(Tile((id \ - 859c7bde-0c13-4e42-b718-489cd1284841)(label(\"(\"\")\"))(mold((out \ + ece3978e-1cd4-451b-bf45-7d6afcc0d8e0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 38066c1d-75f9-4090-8f21-d570fba67ea6)(label(if then \ + e9ad479b-4b32-4aa4-95c5-8f2331660129)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 60410b2d-24d1-4289-b7d0-e4f962aceb07)(content(Whitespace\" \ + ee8bde47-cc2b-400c-8842-875321687b3f)(content(Whitespace\" \ \"))))(Tile((id \ - d776be4e-4ce3-4bc6-a1ee-f2fba8baea50)(label(true))(mold((out \ + 3abe37ed-1dc4-403f-9333-13f50ab3c89a)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ffe877ae-5158-454e-8951-1b5a8cf33acc)(content(Whitespace\" \ + 46d7ce17-b064-4267-9d04-d43ff1a44b37)(content(Whitespace\" \ \")))))((Secondary((id \ - 5cca4443-2101-4b76-a636-82283c007c31)(content(Whitespace\" \ + 8e44d5ee-ce2a-4383-9b6a-927091bb8bad)(content(Whitespace\" \ \"))))(Tile((id \ - a37aad0e-b396-4769-bec6-451cde6e6688)(label(1))(mold((out \ + 877923e2-726b-4015-bfb7-5f086e094f31)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - fca6cce7-3124-4fef-89ac-76a969e6dc0f)(content(Whitespace\" \ + 8bacec5f-e164-4eb4-b98e-8cff5fd06fae)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ca9740a9-f9e7-4c52-8619-e530dd207c03)(content(Whitespace\" \ + 13781ee0-dd5a-4c44-a4c6-e6b92703a646)(content(Whitespace\" \ \"))))(Tile((id \ - 1db0d5de-13ba-4537-b327-a971fed29ad5)(label(1.))(mold((out \ + 67fb18f1-dcf0-434d-90d7-12148e6309bd)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - bf3901f7-d8c2-4b87-b353-d348f4de685c)(label(,))(mold((out \ + afccfd4d-9f21-4236-bf03-6b343c979790)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 6a615115-3cab-4892-86d1-a305d1b2f992)(content(Whitespace\" \ - \"))))(Grout((id 09e1cd05-28f6-4e0b-a3d0-8071f1d28c5b)(shape \ + Exp))))))(shards(0))(children())))(Grout((id \ + fd18e452-a794-4379-86b5-8dc753604a8d)(shape \ Convex)))(Secondary((id \ - e70a5c62-5f9f-4196-848b-0b83b5e61901)(content(Whitespace\" \ + 5c9c94b5-7024-4306-bc51-615d6fc286b8)(content(Whitespace\" \ + \"))))(Secondary((id \ + 90824032-b495-4713-aca0-0ddad77318e1)(content(Whitespace\" \ + \"))))(Secondary((id \ + a4e74869-0e3e-4d7a-bf27-333cde7cadc3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c5636dc5-714c-41cf-8f4f-b4964fe82a88)(content(Whitespace\" \ + e627a0a2-dee6-4187-9293-25c03387df95)(content(Whitespace\" \ \"))))(Secondary((id \ - d79b4c14-ed1a-457d-8b7a-58b9a7b5f6d9)(content(Comment \ + 766bc24d-9b24-4e05-975e-dd9e2d97b7e6)(content(Comment \ #err#))))(Secondary((id \ - e98a9d72-009c-4f62-9bcc-92cadbab50c1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 53c1641e-a300-4f92-ba6a-b3c1e055a88b)(label(let = \ + 78f71957-8efa-4d59-a575-caa4cf32bfc1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2d69dac9-2ccb-4011-9aab-4eca07c7c92c)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1c223fbc-bcf7-45f1-bfac-3ce12530aa8e)(content(Whitespace\" \ + 23b22068-b02d-4ab8-89a9-4540fef47d7c)(content(Whitespace\" \ \"))))(Tile((id \ - 7a3d0f54-25c3-4ac8-a53a-7383dd2e3ffe)(label(_))(mold((out \ + 5365281a-a023-4791-9839-87684bdf31e8)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4ec05fa2-3b05-4caa-8cc8-534fce5a0f4c)(label(:))(mold((out \ + 9e80647c-ac36-45a5-b0c0-5fc8961430cf)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - af4973ef-fbaf-4523-b060-cce75af9dc1c)(content(Whitespace\" \ - \"))))(Grout((id d10d135a-77a8-4f41-8ec8-9ed95917f5e8)(shape \ + 06ba9142-925a-46df-964e-9df82c1833c1)(content(Whitespace\" \ + \"))))(Grout((id eb7e2e86-0a63-4bbf-8dae-dd7b6f10c13c)(shape \ Convex)))(Tile((id \ - a72e263e-70bd-4291-b890-64c0fd8f105e)(label(,))(mold((out \ + 90156175-90f3-4dfa-a9f0-56d255aa26c1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ce4dd625-dcbc-4d2c-bd21-ffbdfca0a06c)(content(Whitespace\" \ + 49903fe9-0d39-42b7-9c7a-0f14e4a9fd21)(content(Whitespace\" \ \"))))(Tile((id \ - 7d047d67-cf48-47a4-8ebd-00feb7210bab)(label(_))(mold((out \ + 7dec882a-5c45-424e-8102-6436a5c671f3)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 24f52c42-dcf6-4438-88ff-fb9499394963)(content(Whitespace\" \ + 529eae4c-f6cd-4acd-ae7c-d5b58803bd56)(content(Whitespace\" \ \")))))((Secondary((id \ - ea3fa448-0450-4b26-a9c6-7295a1953844)(content(Whitespace\" \ + c765dacb-776a-45b9-a193-78e5a748c823)(content(Whitespace\" \ \"))))(Tile((id \ - 014476a8-5a81-4b6c-ae41-f99f9fc09ecb)(label(\"(\"\")\"))(mold((out \ + 3e445b08-a4f3-4933-9996-7830a0748b46)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 864d4833-1428-4de0-bf99-98ba828d05a0)(label(if then \ + c9aaa257-c542-4379-ba42-6abf5bf2006e)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3526f94c-f18d-4a8d-9434-3c2954f92bce)(content(Whitespace\" \ + d637ba05-504e-4018-88eb-c977bd5560dc)(content(Whitespace\" \ \"))))(Tile((id \ - 271262c8-bc47-4286-b2c9-d1fd9862e086)(label(true))(mold((out \ + a5f17386-4e7a-4e30-86fb-2abf74b4fc06)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3236f6e9-077b-46fd-9008-60c60961d71e)(content(Whitespace\" \ + 2c0726e0-3036-400a-81c6-70bdc8621e82)(content(Whitespace\" \ \")))))((Secondary((id \ - 5ecc2776-144b-424d-bada-226e6613294c)(content(Whitespace\" \ + 9132c14f-825c-44da-935b-1658fd9cea66)(content(Whitespace\" \ \"))))(Tile((id \ - 6f121f33-4864-4cc9-9e77-4b016ba16a68)(label(1))(mold((out \ + 7f3f8048-bd87-46f0-846b-58d34d6c5f62)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - eacb4f8e-72fb-44c0-be02-5680c9dd4ed4)(content(Whitespace\" \ + 2e982fe5-0106-43be-938e-ac667a719c41)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8ec75ca8-8806-459c-940d-da7962898c98)(content(Whitespace\" \ + be5ed0e3-dc75-4069-bdae-ed34c43bd28e)(content(Whitespace\" \ \"))))(Tile((id \ - 2ed80e37-34ef-4062-9ff5-f191beeae17f)(label(1.))(mold((out \ + a79ea06c-1476-4c69-8beb-4145646d4894)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 421bf5ab-64da-4005-bb31-4cf97fd66cea)(label(,))(mold((out \ + e26977b4-dd03-4e05-8265-c3646e724205)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 234c02df-31e0-46e1-8cd9-871cf50653a5)(content(Whitespace\" \ - \"))))(Grout((id 8ff1d0ba-dbab-4964-9dfe-3eaea376500d)(shape \ + Exp))))))(shards(0))(children())))(Grout((id \ + 29b37a58-9bb0-4715-948c-b7c133046248)(shape \ Convex)))(Secondary((id \ - 683cc5f3-68a0-4073-8d8e-77f04849b9be)(content(Whitespace\" \ + 2cefdb81-8d32-44cf-a3a1-21c297ad2aa1)(content(Whitespace\" \ + \"))))(Secondary((id \ + f3715eff-bae1-4485-b3a7-2e4468b968b6)(content(Whitespace\" \ + \"))))(Secondary((id \ + d76e0966-3276-4ecc-bca4-a948545fe45d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4452c438-712b-47d0-97e3-6ad0c66a851e)(content(Whitespace\" \ + 3b8b0cca-8049-4d93-9103-87ae36c44270)(content(Whitespace\" \ \"))))(Secondary((id \ - eb500109-807c-482b-a1de-1bf415ea6553)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1b331c1c-2ea1-43d4-9100-e1ebcbf74961)(label(let = \ + 0ffc8e0c-89e2-41a1-848b-552c97f843fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2f891405-da40-48a2-b79a-5f3b55251a76)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - c7e31acd-ac68-4dab-b83d-958614ab53f8)(content(Whitespace\" \ - \"))))(Tile((id 9fd92291-69a1-48b3-988d-02c5ff1eb454)(label([ \ + d4fbe7f2-6e55-4160-a618-a1d1a09eb6e9)(content(Whitespace\" \ + \"))))(Tile((id 8dbef8da-e68a-4ec8-b75e-3a29fe9c8502)(label([ \ ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ Pat))((shape Convex)(sort Pat))))))(shards(0 \ 1))(children(((Tile((id \ - cfd14ca3-c72c-4d42-8a76-504c0d64cba2)(label(_))(mold((out \ + a49b7ef5-f798-4643-9265-f8cf8c42b783)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - a7ffc4e2-df54-419d-9a84-dc6bc3fe7287)(content(Whitespace\" \ + 2a4ac6a7-0d55-4174-ab52-697d276c6fa9)(content(Whitespace\" \ \")))))((Secondary((id \ - 27491b7d-700d-4c22-9b8e-dde3fb7c69d1)(content(Whitespace\" \ - \"))))(Tile((id 54da9a9f-372d-426f-b716-d9b5e413a05f)(label([ \ + 61d291b8-7b27-4fa0-ab09-ff412a99362a)(content(Whitespace\" \ + \"))))(Tile((id 6b1de325-1191-4962-8899-bf6988fe56f1)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - d79f6459-df17-47a7-854b-6ac9e5e6d4c7)(label(\"(\"\")\"))(mold((out \ + 7b855072-62f4-415e-8452-952458cffca7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ec84e09f-1bbb-4046-a4d1-18e35096b5bc)(label(if then \ + c790af14-829d-48fa-bd81-ee93a0f1b4dd)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 023011eb-07fc-4fc4-acb7-afc08d167889)(content(Whitespace\" \ + 1ff71883-a48a-4ea0-b098-8d76e476a935)(content(Whitespace\" \ \"))))(Tile((id \ - badc47f6-597d-4f34-8d15-dadd4d102ba1)(label(true))(mold((out \ + c02edbab-daee-4395-98fe-757cd6fee237)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1e7e73c3-0185-4732-afec-c65841f85447)(content(Whitespace\" \ + 8ce9a5b4-babe-4bf5-b061-7f45c282dadf)(content(Whitespace\" \ \")))))((Secondary((id \ - 2c4afb03-65e2-4f7f-8a45-b4cd95340022)(content(Whitespace\" \ + d401bb56-0198-4147-af77-8a5aee9d583a)(content(Whitespace\" \ \"))))(Tile((id \ - 88d930fc-4396-4c85-b193-6231e4ab6903)(label(1))(mold((out \ + 4f91be41-e3df-44a6-8a12-a15454048adb)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b7cc9a31-16e0-4646-bacf-b2cf5fb1ad56)(content(Whitespace\" \ + b5540fb4-c645-42a2-ada2-3b805f1984a5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 16723970-ca28-41a1-962f-f1d6bb3e08ad)(content(Whitespace\" \ + 55622bb1-19e8-46d3-bf1d-e34363fc9e0f)(content(Whitespace\" \ \"))))(Tile((id \ - c8d0507c-498e-4a17-8534-2f9017262ae6)(label(1.))(mold((out \ + 518b51cd-a4c8-404d-a231-6f429a6b644c)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 17a71b04-56ef-4951-9f94-071b1798029c)(content(Whitespace\" \ + 744414ae-d71e-48ae-bb9d-0e578c0459b4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4a78edd8-7cc5-43e7-a5a2-06fd22e09992)(content(Whitespace\" \ + e668a5ad-b385-40ec-b5b3-d04df38d66be)(content(Whitespace\" \ \"))))(Secondary((id \ - 75394c13-0dbc-4c27-b74d-00628415ecd8)(content(Comment\"#2x \ + 18cc6604-fc46-4227-b871-d8c7df7b8bc1)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - d6536aaf-a29f-4dd1-b71d-319a5018d79f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f0ae930d-5ce5-4bc7-90fc-a1766418be73)(label(let = \ + ef4a4191-136e-4ace-976d-39d8e03247b0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9d99af65-a5af-4d6e-af4d-6b454b9bc95a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e65e480e-afca-45fc-892d-842987fb2412)(content(Whitespace\" \ - \"))))(Tile((id 00ff9c0d-2efe-463f-a4ed-df9ab031972b)(label([ \ + 1552bacb-6c53-4dfa-aa28-ce61edcc10f2)(content(Whitespace\" \ + \"))))(Tile((id da3f7767-bd3d-404f-b0df-1a0dcd052f31)(label([ \ ]))(mold((out Pat)(in_(Pat))(nibs(((shape Convex)(sort \ Pat))((shape Convex)(sort Pat))))))(shards(0 \ 1))(children(((Tile((id \ - d5493e59-7583-432e-9bb5-d4bbb87ccab2)(label(_))(mold((out \ + f157a3c6-62bf-4d01-9763-a3a6153af589)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 5fa3f577-12d3-4b1b-afff-231e2afc3aa6)(content(Whitespace\" \ + 113a5483-c7a2-4695-b09b-b299cd18b4ac)(content(Whitespace\" \ \")))))((Secondary((id \ - 07256fa2-325d-4255-9e4c-55441b4054d0)(content(Whitespace\" \ + c9129d4e-3c02-408f-8935-4e72d7010c1f)(content(Whitespace\" \ \"))))(Tile((id \ - 4ad42883-e2b9-410b-9764-466f91a51239)(label(\"(\"\")\"))(mold((out \ + c8e00484-a21c-43e0-8aa5-2b78135f4fa9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 61d1e0c9-09a2-4ad4-bc19-e7f0e4729f5f)(label(if then \ + 217d5fd6-b91e-4473-98bb-42451ad1065c)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b2615842-5e17-44ca-8c65-ec219c8fe771)(content(Whitespace\" \ + 01dff95a-d8a2-4b55-bece-4002bd9c2761)(content(Whitespace\" \ \"))))(Tile((id \ - 7bbebde4-ca9e-4820-9be0-d038e58ec25d)(label(true))(mold((out \ + b41c3a2c-0ba3-4514-8dd6-8e24b395e3e3)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e62b6d09-a35a-4d6b-914b-3651a8d5f9a7)(content(Whitespace\" \ + aad648c6-0b64-42b4-aaa0-7be5f9a8d682)(content(Whitespace\" \ \")))))((Secondary((id \ - 42509d8d-034a-4b96-9d22-7cbaa9234158)(content(Whitespace\" \ + f564477d-3cfa-407d-bc31-1e49f12bc3e8)(content(Whitespace\" \ \"))))(Tile((id \ - cdced581-b02c-4a67-8027-e4c26d422264)(label(1))(mold((out \ + 2b524b9c-6e74-4719-ab54-061b56ec717b)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f888117e-eedb-460c-b572-ace5f8daba54)(content(Whitespace\" \ + 98f6ac6e-62bd-4748-b512-14bf23df07ea)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 008527e5-192b-4003-8db4-2a59e97b4387)(content(Whitespace\" \ + fa485591-489a-43f2-bfaf-6640f7a71d32)(content(Whitespace\" \ \"))))(Tile((id \ - 19eb7fea-2694-4d26-ba41-8d20d21823f3)(label(1.))(mold((out \ + ea5bf365-68b9-4850-a07a-4bc0adce1225)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f7210ca8-5362-43f7-8d94-25e0021b58ad)(content(Whitespace\" \ + 415357bc-ea8e-48b8-91cc-fa0aa13f1633)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6ea51883-d3e4-4ce0-9426-3084aa0b135c)(content(Whitespace\" \ + 8bb6cc99-e72c-47a4-9ff8-6e2286b37a48)(content(Whitespace\" \ \"))))(Secondary((id \ - e5c82c63-a627-40cd-95b4-253918fbde11)(content(Comment\"#3x \ + 80840a69-ffa9-4e74-9d19-09edec73c165)(content(Comment\"#3x \ err#\"))))(Secondary((id \ - 312d8673-95fb-4923-b89f-12d832987894)(content(Whitespace\" \ + 44c39228-da1a-433b-944a-a0c58b70039c)(content(Whitespace\" \ \"))))(Secondary((id \ - ce427b79-7db2-401b-ad95-ed8aa725d295)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a1078844-f689-4645-9517-343fe975b9e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0568fdd2-33e5-44eb-8b5e-282f38520a49)(label(\"(\"\")\"))(mold((out \ + 2c374313-7ea3-4e1f-872b-c4c2af86cdc9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 17ab14c0-8f4b-44cd-a532-9a761a833be0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6a4e05e9-217c-4e45-8de1-c9e392ccb042)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - f875cc06-fde5-4cb2-9fca-99f04ef52207)(shape \ + 7344600d-736b-4fd8-a156-329b825322eb)(shape \ Convex)))(Secondary((id \ - 7631a5db-de3e-43f4-966f-60d53fcca9a5)(content(Whitespace\" \ + 32447f88-c01a-4618-8171-28307e2ea33b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2fbb2438-eda8-46b0-9b56-d0be662c186a)(content(Whitespace\" \ \")))))))))(Tile((id \ - 4eba0c65-acc4-48a6-89a5-b0d9b7be2a00)(label(\"(\"\")\"))(mold((out \ + 869737d1-c23a-476c-ab5e-8aa7861d964b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c6d233fa-f2a0-4a8b-9ea7-4c4beeb049b9)(label(if then \ + 4eace465-2bc1-485e-8071-10d3df39a94b)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d16c94e8-8bbb-48e8-b17d-0ba8f473b850)(content(Whitespace\" \ + 31e06065-f79b-462c-abaa-97f39a7acb2d)(content(Whitespace\" \ \"))))(Tile((id \ - f70a22f9-5654-4681-a7db-c22aff0c899a)(label(true))(mold((out \ + e7b073be-fd7f-4671-a3f2-2b6d25f21d58)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cc82a687-0ffe-4c50-bb5b-7fae7880988b)(content(Whitespace\" \ + ab43243b-e396-418f-b733-4bd210aaae93)(content(Whitespace\" \ \")))))((Secondary((id \ - 907d5571-3099-4f85-a0a7-8de5c3c0163f)(content(Whitespace\" \ + fddf6e72-eedf-43d2-bc92-49aa0a7e9da1)(content(Whitespace\" \ \"))))(Tile((id \ - 70cb1a6d-4331-4b23-a116-000d34c847ee)(label(1))(mold((out \ + d69b9e82-73ed-4431-bd24-53dc723864a7)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5550f2e0-af76-4461-a80d-3e96e5ba8acd)(content(Whitespace\" \ + 0c760bc0-d087-420d-909e-0b87ab92629a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 801cd3b1-428b-4700-ac23-eab47576e4cd)(content(Whitespace\" \ + cd6329dd-1917-4e68-83b6-407560872ef5)(content(Whitespace\" \ \"))))(Tile((id \ - 6db6ceac-823f-4e69-b176-7db9892ae457)(label(1.))(mold((out \ + 8c4024e7-bf7c-4da4-a8ed-043381e009b9)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 883b5469-1df0-4c5b-acbc-48463a056191)(label(\";\"))(mold((out \ + cdf6f11c-509f-4bc7-b86e-a0d84b87b124)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - c2af471c-ae0f-4633-a0e9-960db0dd4ac4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1de8ab2b-4d3e-429f-a223-ea2b0609949f)(label(1))(mold((out \ + 8d5c4873-344e-4b6f-9252-8d16ecea9c89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a7151210-7df0-43fa-b6e8-1522bd2a8d39)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a4cd9904-d73c-46a6-8b08-20ee36507447)(label(\"(\"\")\"))(mold((out \ + 1e2df0fd-2270-4a1f-8fdc-e0a48ecd283a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 77ba6448-fb1e-4cd1-a480-1a8dd8e498b6)(label(if then \ + 4ebe65f5-1866-4b9c-be3f-66ba8b0550f5)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - db25eb1f-525c-4760-a31d-5f45805a1e5e)(content(Whitespace\" \ + 3772625c-8d92-4280-b22c-2178e797e62c)(content(Whitespace\" \ \"))))(Tile((id \ - c78c8812-76c2-4ec2-9e56-2d2f5b931b40)(label(true))(mold((out \ + bcc79751-6308-493e-887d-561862ee221b)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 86011fbd-9fd9-4e51-ad9f-ad5274e4075e)(content(Whitespace\" \ + a51955ae-6487-446c-9257-0716097a9f33)(content(Whitespace\" \ \")))))((Secondary((id \ - 82056694-4008-4d4d-b2e9-5ff2a4368793)(content(Whitespace\" \ + b375eef3-cec3-485b-a38e-1c67e897319b)(content(Whitespace\" \ \"))))(Tile((id \ - 794e45f1-5540-4c08-a3da-891b6b39177d)(label(1))(mold((out \ + a834af07-de84-456c-bd73-62c020367235)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a6f3062a-386e-439d-9356-4a5f9ea52e6b)(content(Whitespace\" \ + 0d719393-3ee1-4354-b2ef-4237e6792a49)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6ad8e8b5-b7ba-43a1-83ee-344506710016)(content(Whitespace\" \ + 08b3171d-c456-4c9d-90a2-15f7be5c40f1)(content(Whitespace\" \ \"))))(Tile((id \ - 221c428a-ff1c-474e-93ff-87dee5369bbd)(label(1.))(mold((out \ + d7f6388d-b809-466e-83de-585d71ffee7c)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b16113b7-d24a-4bcf-882a-a4029176f4e3)(label(\";\"))(mold((out \ + 9feb45b2-455a-4c65-867c-b52c870a7bfc)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 670baa54-2b65-4166-8fdb-43ec1d775096)(content(Whitespace\" \ + f45233ef-9aa6-4b3b-a823-c6e50d713899)(content(Whitespace\" \ \"))))(Secondary((id \ - a29755d5-c34a-42d2-8021-70a9cba51dde)(content(Comment \ + 17715bae-682d-4f0a-a823-afeba96c4317)(content(Comment \ #err#))))(Secondary((id \ - eeb2f985-8055-4827-8305-e8676c0dbe3b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 415d7ed2-5f51-4dfd-8ef9-30dd674627d1)(label(\"(\"\")\"))(mold((out \ + 713db1b1-9bd3-47ff-8f5f-e0430b1e5c69)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e81b155e-d3be-44a5-a6ea-77de93eb55cf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e06f2f6c-a0c0-4f72-ad0e-bafdfecc34f1)(label(1))(mold((out \ + 056c50d0-5bbe-4d9c-aa02-82ef438b87c4)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0f2d15c2-ed4b-487a-8c3f-aacacfe02675)(label(\"(\"\")\"))(mold((out \ + 043b9ece-ebc9-451a-b290-7172b63c9d07)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 71dff8c6-54db-4466-aa7f-fcba27ed7846)(label(if then \ + 69ab3033-df77-4236-8146-8a44543dd271)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - df4a2236-b516-4871-89a4-0724dcbd1de5)(content(Whitespace\" \ + 80013202-921e-4217-839a-f8529889afaa)(content(Whitespace\" \ \"))))(Tile((id \ - 4e296c65-39a1-4e2d-b8e9-65adfd26c3f6)(label(true))(mold((out \ + ad93347c-62c0-4b3f-89f3-b21c87f13fee)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2336abf0-54aa-4ab8-9be7-f49f1098f909)(content(Whitespace\" \ + 37683a2a-fd0e-45ac-a70c-ac005275759d)(content(Whitespace\" \ \")))))((Secondary((id \ - 93c4ec57-a944-49d3-bede-b8e96d2d2f33)(content(Whitespace\" \ + 81c5a39d-cb24-4e1a-ab64-3ceadf99c677)(content(Whitespace\" \ \"))))(Tile((id \ - 3a82f26b-2c70-432e-83aa-ecb81991160b)(label(1))(mold((out \ + 0d7fd7b9-51e1-4d71-8726-cc48db06fb4e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e34df7de-03e6-427e-b694-c37191ab79bd)(content(Whitespace\" \ + 92ffa4ac-0a8d-4a90-9fd8-52eaae6ec3ab)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f4c5eca9-6b92-4d3f-8a84-cdd432b5eed9)(content(Whitespace\" \ + 98c632bc-bd76-4579-afea-b16084f6d9ee)(content(Whitespace\" \ \"))))(Tile((id \ - 0a86ed00-1fe2-4d45-ba9c-81dcb1ae36b1)(label(1.))(mold((out \ + 5a649e1e-8a58-403b-8ae6-f223d71f2969)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 85311ccc-4cdc-42b8-8962-839689f8eac2)(label(\";\"))(mold((out \ + a41ef3b0-6648-4e1f-b11a-d1389eaeb977)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 66d48ce9-3d10-4097-8be8-230d2c985981)(content(Whitespace\" \ + 6330fc76-d937-4dec-95de-19a3b41a37f9)(content(Whitespace\" \ \"))))(Secondary((id \ - 324f8369-f19f-497a-bcdf-bf495a5e8f6a)(content(Comment \ + 784084cc-19ef-4bf4-ae69-a058ee88bea2)(content(Comment \ #err#))))(Secondary((id \ - 768806fc-c624-4f91-bfe3-b80df7116074)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8f1d7eb1-71b7-4e7a-869d-9f7379862283)(label(\"(\"\")\"))(mold((out \ + 6dd9573c-3237-429d-9f67-fa0d3a527ed3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e519a01d-cd0c-4303-8786-16c74b0e28e2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a4bbbc61-ebf3-49a2-9edb-15d0f609eb63)(label(fun \ + b7d43d16-9dd4-4778-95c9-bd6072924dfb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ - 1))(children(((Secondary((id \ - 3f49ca87-30ae-471a-b7fd-6f000e536dd9)(content(Whitespace\" \ - \"))))(Grout((id f8c3c2c8-9c73-435f-b109-0736b22bc9fe)(shape \ + 1))(children(((Grout((id \ + 495fdd0e-0b8c-4bfe-bd78-45d037891589)(shape \ Convex)))(Secondary((id \ - ea1a354e-a8be-4e20-a96e-1df9fbccb3cd)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - cc59ab4f-b3f9-4427-af9f-3705e250021c)(content(Whitespace\" \ - \"))))(Grout((id 729899f1-6cd9-4ef6-9439-d629666e7dc5)(shape \ + f9ee6257-9f48-438f-976b-bf8fe73f6db4)(content(Whitespace\" \ + \"))))(Secondary((id \ + ce864e28-dfe4-45a5-a2e6-058f4c257012)(content(Whitespace\" \ + \"))))(Secondary((id \ + 47b51dd3-6043-4cc6-85c4-427b2b022005)(content(Whitespace\" \ + \")))))))))(Grout((id \ + 5761b5cc-03a4-443a-bdd5-b6dd721f8058)(shape \ Convex)))(Secondary((id \ - 6eb0a2f1-7e6d-4e7b-b88f-b9f68080a2a1)(content(Whitespace\" \ + 297139cb-2f4b-4ee5-9062-56cb5288e247)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6df3c8f7-4b00-4117-aba3-024e6eafe69f)(content(Whitespace\" \ + \"))))(Secondary((id \ + ba3f46c8-10a3-49e0-9e03-41ed167e90e5)(content(Whitespace\" \ \")))))))))(Tile((id \ - cc355deb-6f6d-409c-943e-8ae6d9c2e6dc)(label(\"(\"\")\"))(mold((out \ + e5bd26eb-70de-4d49-9c56-409b67357cc7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d3a02cbd-41e3-4796-ad93-415f9c9db47c)(label(if then \ + 74ef60a5-13d3-4e2f-a547-f3989ce94472)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 853b1c59-2bd5-4fc4-a55b-71f530830220)(content(Whitespace\" \ + 92eac166-584e-479b-b29b-9f99d8b249b1)(content(Whitespace\" \ \"))))(Tile((id \ - 5748a33b-baa2-4480-9685-9da0ed213277)(label(true))(mold((out \ + 371202af-d5bb-4cdf-bd65-27c8b52f92e4)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 4a94b739-f449-450c-99cf-c0dc4574a6b9)(content(Whitespace\" \ + cb068475-531a-4927-b6a1-22e4e9979b50)(content(Whitespace\" \ \")))))((Secondary((id \ - 9deba127-0dd8-440e-9e76-62e41cfe8086)(content(Whitespace\" \ + ee59bc84-5e63-4ae8-a3c6-737e08a12db8)(content(Whitespace\" \ \"))))(Tile((id \ - f8d7dc8c-4493-4ee9-aec8-666d856b79c2)(label(1))(mold((out \ + 725e1f9c-e3d8-4e53-9a89-ae1a18604e66)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d99382e1-7e7b-4ce5-a939-611f6948bade)(content(Whitespace\" \ + 635f53a8-1cbd-4708-8e50-9d63dca1547c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ad4f2e6a-f2b0-4ceb-a279-4fe7efed1a7a)(content(Whitespace\" \ + 22dc26ab-904f-40c4-8dee-00f3305b3ae1)(content(Whitespace\" \ \"))))(Tile((id \ - 9cae6d4d-bb44-4abf-aa51-352efb1603e2)(label(1.))(mold((out \ + 887151b3-cf70-431c-8d2b-3a27fc023f83)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 2c246f08-5268-4e1f-a17d-aa2257d0e2d9)(label(\";\"))(mold((out \ + 1e9cfcc6-d0cb-4b57-82a8-e7ea35bc3205)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3d0da29b-2595-45d9-95a8-309a5e794933)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3bae623a-2b92-48f9-b5a5-44c98d32838c)(label(\"(\"\")\"))(mold((out \ + 09735344-80ff-4b00-a349-0a6b15010e36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5115c75e-67dc-46f3-a332-c00552804ebb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 34bd00fb-4803-403d-9d3c-6f1d850ff083)(label(fun \ + 931e6408-0169-484d-971e-771107a34253)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fc80d587-03e6-4cb1-a620-41e1f52d022b)(content(Whitespace\" \ + f045fc24-9608-4059-a6ba-21e53ed08f31)(content(Whitespace\" \ \"))))(Tile((id \ - 56c2c88c-c604-4f55-8c31-a1575d6d0b87)(label(_))(mold((out \ + 6eb2dfc0-ff7d-414d-83a4-9f931d62c219)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6c5fe730-0978-4a61-839c-bbff0fcf0dac)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 1cc96f69-ae59-4fb7-ab8e-07f5d46d2a49)(content(Whitespace\" \ - \"))))(Grout((id bd8224a1-6098-4410-8558-2c26616ce875)(shape \ + bb26f97d-b97b-4bb7-8bdb-fddecaa2694e)(content(Whitespace\" \ + \")))))))))(Grout((id \ + 2db37ecd-b383-4b82-ae34-e37f269ba089)(shape \ Convex)))(Secondary((id \ - 180923a8-ecf8-4fe5-a277-18ac7043d8ea)(content(Whitespace\" \ + 074dc009-1b8d-4617-8ede-6c11886a24ea)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7cf84134-9785-41b8-9cea-097cad6ba862)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3fd55d40-0194-4066-8c61-e52b2f49c340)(content(Whitespace\" \ \")))))))))(Tile((id \ - b332e54b-ed33-4501-abf5-006cb0be58dd)(label(\"(\"\")\"))(mold((out \ + 936129f1-6df6-49ee-b559-3bdbc23aae6f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 078e7969-a0c2-47f9-955d-2cfd83231d80)(label(if then \ + 1509b818-82f0-459a-92a2-20e0da30ad57)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a35fe9e0-f500-4a83-a309-04f02ee1dc83)(content(Whitespace\" \ + 8dcb0e86-df5c-4570-a764-84e0884e146d)(content(Whitespace\" \ \"))))(Tile((id \ - 3e1fbd94-2f14-4330-a703-08c5b1fde079)(label(true))(mold((out \ + 6602d0f7-cd0a-47f8-b6ad-bcea5de32084)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 700ce00b-a0d0-4972-ab6d-130538b5103a)(content(Whitespace\" \ + 8a7041a4-636f-45e2-9cd6-f662e6fd6e8d)(content(Whitespace\" \ \")))))((Secondary((id \ - 379d6052-5c6d-4ddd-aa0f-2a3ab20101db)(content(Whitespace\" \ + 4110f679-2c69-4fc3-abec-a40becaacd07)(content(Whitespace\" \ \"))))(Tile((id \ - 78c6574f-c3da-4501-bbe0-3cb7cebe0ee1)(label(1))(mold((out \ + 3bdebb97-27d7-46a0-9d87-91c04c4dffae)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7bb2fec6-5d60-4319-8d3e-535c9d4d9a55)(content(Whitespace\" \ + f3e7fd6d-42f7-4d19-8e3f-2b2db52cb74e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d474681d-7f40-4fa7-9bab-45fb33f0ceb7)(content(Whitespace\" \ + f6db3b30-d35e-4b07-aa59-45cf8062b207)(content(Whitespace\" \ \"))))(Tile((id \ - ba66bb22-2d32-4858-a693-16f887bdc543)(label(1.))(mold((out \ + 28941dd4-506f-4e80-a8f4-fc2bb43031a8)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - aa1c578e-9ed1-4bba-bd84-59f06287c134)(label(\";\"))(mold((out \ + 76a1e448-41f0-400c-b7ea-a399a8f5eff7)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3ec7f331-aca9-4646-a99e-5b72e7f372a4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a994996a-dc9c-448a-8fa4-2201962ba545)(label(\"(\"\")\"))(mold((out \ + c6b13e8b-ef44-42eb-a13a-b117143507c3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b835c649-13a0-4402-9809-71a72688b29c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6800d18a-5c5c-4ab0-b223-ff471d9704d3)(label(fun \ + c9b83db9-29c1-4eff-b5cd-d46a43a263fc)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e712730c-895c-4261-9449-e8521e5e910c)(content(Whitespace\" \ + 9ed6e16a-06d8-47fb-a78d-edf20205444a)(content(Whitespace\" \ \"))))(Tile((id \ - e83af0e4-a6ff-4c06-8cc3-f6a49f90625d)(label(_))(mold((out \ + ae369f54-62ef-4e0b-b0ed-972da618fa40)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bae24720-e50f-4d92-8658-fbfb6e71a68a)(label(:))(mold((out \ + 586adcad-0933-4a26-8699-916831c7baca)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 7b75d4c1-39ac-4c42-aa17-2054413deec9)(content(Whitespace\" \ - \"))))(Grout((id 00b3ddce-e18f-4efd-b984-ac788c9e89e3)(shape \ + Typ))))))(shards(0))(children())))(Grout((id \ + 375189cf-d059-4606-a4fe-56e63b2988ec)(shape \ Convex)))(Secondary((id \ - fbc5bd8d-fce5-4ec0-8eab-40748b0b38de)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 3e7f97f5-6952-4f26-969b-08be73843a98)(content(Whitespace\" \ - \"))))(Grout((id 567e2173-0949-4e39-9ba2-4bb179b5c90a)(shape \ + 9ec96788-240f-4611-bb39-c439232ca9b4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 33f3e0fa-102e-4429-8833-89a95d790163)(content(Whitespace\" \ + \"))))(Secondary((id \ + 686781e3-f9ff-40dc-8117-157ca0448dff)(content(Whitespace\" \ + \")))))))))(Grout((id \ + c85b5fd3-8b8a-4895-8c46-08704f81d139)(shape \ Convex)))(Secondary((id \ - 1a8dd4f4-a29f-46b7-800a-4c65ddb53a45)(content(Whitespace\" \ + 901258e8-faba-463d-82d3-ef76e2369acd)(content(Whitespace\" \ + \"))))(Secondary((id \ + 930a3157-9a61-4c2f-871b-88e77d178e1c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3839d36d-39dd-41fc-94b0-1c759f9ad01d)(content(Whitespace\" \ \")))))))))(Tile((id \ - 56e51ba2-0b94-4e23-a2d5-700863a7cba7)(label(\"(\"\")\"))(mold((out \ + ba595eed-171d-420a-b857-5de42ad13c8d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - be943a77-c63a-4670-9916-115215e45433)(label(if then \ + b65bd133-da62-44f4-9704-ca8bc1e0ad62)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 4df443a8-79d1-4a11-b728-482e6a8bee3c)(content(Whitespace\" \ + 6e1dc7f8-c2b3-40a6-b611-1b7f180439d8)(content(Whitespace\" \ \"))))(Tile((id \ - 5863529f-b0c7-4715-8f0c-b9a6c34feb88)(label(true))(mold((out \ + c1e9a35d-4c3b-4fae-964e-9410da8277c6)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 612137d9-651c-4f55-8c1b-173849ec3fdd)(content(Whitespace\" \ + 75e4bbe2-89a0-4793-81ab-a7834cec12dc)(content(Whitespace\" \ \")))))((Secondary((id \ - 7312e418-8f38-47d2-ab9f-2704ef483cab)(content(Whitespace\" \ + f76786ab-d167-41ff-8e29-62be967bd46d)(content(Whitespace\" \ \"))))(Tile((id \ - d26afec8-f3d2-4fe5-921a-61ef48756ec5)(label(1))(mold((out \ + d75262a6-3d43-4a3c-bc32-2bd23385a892)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c8bfa3db-f2ba-4c23-911a-9958295e566a)(content(Whitespace\" \ + 623f7820-12b8-47a4-8822-e05fa8adda06)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6baca28e-b0b4-4065-8d05-203ffa2b6f19)(content(Whitespace\" \ + e62d00c1-aff2-4b59-8b21-b1bc3862a939)(content(Whitespace\" \ \"))))(Tile((id \ - e51f5715-45c6-4060-a9d3-55a7f75e7bbc)(label(1.))(mold((out \ + 324bcc52-4e3a-4618-bfde-19b16def2eb0)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d208e846-b8b9-438d-a1b3-0b37cc102921)(label(\";\"))(mold((out \ + 0ffbf675-d30a-44a6-a433-d5a0468a4a23)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 928db160-6df2-4510-9cee-1f80fdbc0a54)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cdc9a8aa-9d3b-47b5-a840-7e3f6ee8470f)(label(\"(\"\")\"))(mold((out \ + 160ffa92-f86d-4ad3-9acb-d07fee5e3cc1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 46b256a9-ab08-4cb7-ab0e-5041143d5a2a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e10b67e1-6dd7-4aa1-943c-6572ca5f68dd)(label(fun \ + eeae076c-8bbe-4278-84fb-bc2ba52e1f65)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f51c138d-2db2-4869-99ac-4b8519bb1f0f)(content(Whitespace\" \ + 8fa87a25-e4ed-41fe-955e-46434c5eac42)(content(Whitespace\" \ \"))))(Tile((id \ - 30aca6df-6381-44b2-ad8c-35ac0eccc3b5)(label(_))(mold((out \ + b786ec13-021e-4dd3-a6d1-4a91b20ff7a3)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - be8f4180-4a09-4a4f-95ec-c4fe7752a639)(label(:))(mold((out \ + 78bf8675-87f4-4243-abd1-ce3715b2113a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e66dca7c-fbc0-46e4-8dbb-cfb299d8b58a)(content(Whitespace\" \ + 57bb5cca-14a0-47ec-9503-cf45558ffe98)(content(Whitespace\" \ \"))))(Tile((id \ - 5179b21d-6180-4ed6-a37a-f4a76b67e031)(label(Int))(mold((out \ + f3a6ccc8-137d-4842-a5af-393bb13039ee)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 11719b57-87e8-47b8-b9ba-2101b70dc410)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 9035dd5c-668f-4fad-bd04-8939a22ef056)(content(Whitespace\" \ - \"))))(Grout((id 1b56cddd-338c-4229-8f47-87f282c8cd4a)(shape \ + 4eae28bb-5202-482e-a426-8ea5de90686e)(content(Whitespace\" \ + \")))))))))(Grout((id \ + cf773dd6-4610-48f4-b9cd-f6f448a7bd54)(shape \ Convex)))(Secondary((id \ - 8860fd0a-0333-4146-ab70-15801fcfd7f9)(content(Whitespace\" \ + 53d6ee33-01b8-432f-89e9-cb39064bebc5)(content(Whitespace\" \ + \"))))(Secondary((id \ + 6d192db9-1af1-42d7-a3e3-668809aabfb1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8d285564-0bf6-41c4-ba05-15454fd828c9)(content(Whitespace\" \ \")))))))))(Tile((id \ - 0261001a-22a6-4579-941e-fa697e608d18)(label(\"(\"\")\"))(mold((out \ + 6b8568ad-1c91-4af8-b040-d60b863dfabc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2d1c40e7-7013-45bc-b5ab-370afe0a2618)(label(if then \ + 44e841ae-1a43-422e-b403-5ddac077aa63)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b094cfab-c5e3-4898-8ebf-d6c998071d39)(content(Whitespace\" \ + 643d2bde-bf48-49dd-ada0-17db9156819b)(content(Whitespace\" \ \"))))(Tile((id \ - 5a61658b-c49a-4046-8353-cb5de1c9521e)(label(true))(mold((out \ + a73bd640-e074-4b47-93f1-7427b61a41f8)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - ec3520a3-80d9-40ca-bd65-3dafccceb344)(content(Whitespace\" \ + 015da2cc-d1ef-4475-be3a-cdd796acf727)(content(Whitespace\" \ \")))))((Secondary((id \ - 6a293a1a-5b68-4c50-a8d4-6d34f330c518)(content(Whitespace\" \ + 9acb2c30-cf6a-4c24-87df-62bacf1bcfd2)(content(Whitespace\" \ \"))))(Tile((id \ - 5877798d-d601-4f52-8b44-b62398089c90)(label(1))(mold((out \ + be1dca30-6ba9-4c5b-b436-2e3a6eb7487d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7b7e4b79-0113-494f-bf6c-1203f8124405)(content(Whitespace\" \ + 5379412a-df8b-41d6-9f7c-6c8094166b3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b578d4cf-28a6-4b85-9569-8e83a32b06fc)(content(Whitespace\" \ + 5cfc16ae-ad03-47fe-91b1-4ad2d5d44dd2)(content(Whitespace\" \ \"))))(Tile((id \ - 49904658-552f-4d26-830a-6d58c5fdeba5)(label(1.))(mold((out \ + 8d2eea1a-bade-4543-8363-3081f99bd97c)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 0165301e-301e-406d-bd19-11ca5b5d75d0)(label(\";\"))(mold((out \ + 033e58ff-4a73-4b04-8762-634a32b11c52)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 45eb8f1c-44a1-49e5-84a8-3505e96dc2d8)(content(Whitespace\" \ + 7e626298-c9e0-40b4-ab5b-40ebeab4d0bb)(content(Whitespace\" \ \"))))(Secondary((id \ - a186e72b-6987-479a-b8a2-0c7c322c365d)(content(Comment \ + 406feb6e-d83b-415b-a521-d415c5fbe936)(content(Comment \ #err#))))(Secondary((id \ - eac10d79-5ba8-42f6-bf71-8115a62f0736)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 75d6700d-99ac-416a-9c2d-bb6845361491)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 630682cc-e90f-4e0f-ae34-f0bc850cc6e0)(label(let = \ + 96e2f8b6-8d35-45b2-b13e-75766b304fea)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f7cc02ea-9b90-4eee-aae8-3c74a49e26c8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b422ffc8-ca0c-4d6c-bfaa-8571225406a5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 02d305e3-620d-4bd8-b7c3-19e38c9745b9)(content(Whitespace\" \ + da974ecf-0447-4ce1-82a7-74d6055a2ba0)(content(Whitespace\" \ \"))))(Tile((id \ - 4408665d-1b22-4c98-a119-329067a383c8)(label(_))(mold((out \ + 45d6fa4e-07bd-44bf-8a40-7c2265465b4f)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e3b688aa-cb8c-4d09-9c60-a73c45570fee)(content(Whitespace\" \ + 37cde378-ebb2-4488-8317-37496fe3d043)(content(Whitespace\" \ \")))))((Secondary((id \ - e7e30f48-feff-4e09-8e1f-ce2dd9411c9b)(content(Whitespace\" \ + 82e0f7e1-1031-4fab-9e21-20e32a175135)(content(Whitespace\" \ \"))))(Tile((id \ - ee9ea4b8-5e3d-4961-8b86-ff90665bfe97)(label(fun \ + 76114edd-a5ab-4b9e-8603-1e9407eadd56)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 73362696-3c15-4fe8-9d77-290884f55e9b)(content(Whitespace\" \ + 714ff5e2-8029-414a-afaa-abfdbd0695f7)(content(Whitespace\" \ \"))))(Tile((id \ - c6d38bfa-0d23-4423-bb02-23f8cc81c258)(label(x))(mold((out \ + 587277fd-943e-4244-82ce-68a0e05cbacd)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e22486db-cb65-4b8a-8477-9842dd9390f2)(content(Whitespace\" \ + f118590e-ab4f-4ae2-9a6e-552a0f9ab0e5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c2d4d3dc-3bcf-4eea-8604-d9eb6754c1b5)(content(Whitespace\" \ + 5e62d229-6ea4-4ff5-9fa5-bcbf1c2f7e13)(content(Whitespace\" \ \"))))(Tile((id \ - 4c375bef-8b67-4eb2-905e-d14fd854cd0a)(label(if then \ + fd45d53e-f75e-4dc3-baae-4ccbeb673351)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a0a56ede-08f3-4ea0-a0d8-bc5314b6c41d)(content(Whitespace\" \ + 7837008b-e3bb-42f8-8867-a9127126e4fa)(content(Whitespace\" \ \"))))(Tile((id \ - 6872022a-3300-4e9e-ae6a-49daf0b97790)(label(true))(mold((out \ + 49522309-0a28-4550-bd68-6f4af81b20f0)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 2d7c6e87-5b3e-4ff4-8514-d682ec7a05de)(content(Whitespace\" \ + deb3985a-b3eb-4209-81cb-51edfd8e9b11)(content(Whitespace\" \ \")))))((Secondary((id \ - 7a69429a-591c-4f9f-a5d9-439ec1f120cd)(content(Whitespace\" \ + cfb4ee9d-b12f-41d3-b7b4-41b57bb76396)(content(Whitespace\" \ \"))))(Tile((id \ - 14b24f72-ec2b-4589-beb8-4b3314e41498)(label(1))(mold((out \ + 759039b7-c39e-4917-ad26-7768c2441a1e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 91020521-c6dc-4bd8-badd-f3416f3fe93a)(content(Whitespace\" \ + 96676838-abac-4fb0-b053-f3c5a31d4c00)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e7a09ea1-510b-462e-a929-d9bd655b7259)(content(Whitespace\" \ + e426c696-2fda-4120-8fef-c8ff8da2e6dc)(content(Whitespace\" \ \"))))(Tile((id \ - 8387c731-0159-402a-972a-1a8ed7eaecd1)(label(1.))(mold((out \ + e1cc2fdb-246d-4f22-8af0-bccbdb56f732)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6fcf4db7-1323-4584-9915-05dbae661428)(content(Whitespace\" \ + cc99b5f0-a62b-46df-b757-e5a8675aaa6e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c6870c5d-4d41-47d1-8db2-61e108e340ec)(content(Whitespace\" \ + 4ac6d11a-9dd9-4e16-9a51-21e1e8b031ec)(content(Whitespace\" \ \"))))(Secondary((id \ - 6ca1c678-8486-452e-8f06-a5e95d454eec)(content(Comment \ + fdcc919b-9f31-4ef2-abc4-5dea77326375)(content(Comment \ #err#))))(Secondary((id \ - de49e5f0-5a9a-420a-945d-3d5ca433f4c4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cf899405-b2ba-4437-b2ea-e6b1b3eafc4f)(label(let = \ + c4f89285-e554-459e-9bec-d31e32440b0b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 329514a6-42d8-4d4e-bcb2-bfb8d7a8cb25)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3040f666-4ca1-4ec6-9289-cefe043e6ca4)(content(Whitespace\" \ + 50c4e531-b9e0-4f96-a84d-0c99b30659e0)(content(Whitespace\" \ \"))))(Tile((id \ - deed784d-18f6-45e1-b458-4912a2376db5)(label(_))(mold((out \ + 7f89c831-f210-451f-b524-fa4aa79d0f18)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 117e1a3b-efda-49fa-a2b5-3fda0fccb60f)(label(:))(mold((out \ + 9ced8341-5264-41ef-b296-25bf935fa376)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 785fcd91-c046-42db-bb2f-9d75d98976f0)(content(Whitespace\" \ - \"))))(Grout((id 43c44d38-10ee-4fac-9bba-4b1e54a5cad7)(shape \ + Typ))))))(shards(0))(children())))(Grout((id \ + 7c051e70-9e19-4d1c-b11c-d95d49a7aa2a)(shape \ Convex)))(Secondary((id \ - 8f269907-6535-4e08-b51b-9091c5d9d441)(content(Whitespace\" \ + 5c4eb7df-2a0f-4d79-989d-4b0517785895)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9c6901db-158a-4e12-8eea-ec2203b564be)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2a62fcd2-8e96-4bbc-97ba-7d2f211b5355)(content(Whitespace\" \ \")))))((Secondary((id \ - d555a4a0-0b6e-454d-9762-c119366591de)(content(Whitespace\" \ + 89593eff-af8d-4a21-9229-004daae8c739)(content(Whitespace\" \ \"))))(Tile((id \ - f13b0f2a-6321-4dc6-a269-1b807dcd2664)(label(fun \ + eb933724-46a8-4882-9f06-364158da5956)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 04cdbba4-b492-480e-bdb3-3760ee05e70a)(content(Whitespace\" \ + 807a029f-2ebb-4f26-88cb-30137df3bc63)(content(Whitespace\" \ \"))))(Tile((id \ - 62579b9f-9951-495e-b4f1-3af16e705817)(label(x))(mold((out \ + cad8bfd8-9f38-42ff-845e-29709821f378)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 1847fab9-d0fa-4ab1-828a-e2e85ea677d6)(content(Whitespace\" \ + 9ee80e5c-817e-48dd-8512-1e344c939a8e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 1ae7f126-9ade-4bcb-857f-28a5921774ac)(content(Whitespace\" \ + cad256b6-05a8-4712-aa63-8507bd913e6f)(content(Whitespace\" \ \"))))(Tile((id \ - 96071fa4-fe6c-452c-86fa-11fda0fcc1ba)(label(if then \ + ccfb67ea-c47d-4339-a212-5c08a3ccb2fb)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3e5e2802-1bee-492c-bd05-f7a7a99f4f69)(content(Whitespace\" \ + cae5d396-d39f-491c-b923-f0010827f252)(content(Whitespace\" \ \"))))(Tile((id \ - d270ef9d-534f-40b5-af9a-1ca1230ccde6)(label(true))(mold((out \ + e23b54ae-2077-47ac-bc29-2832e0f2ef68)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - b0cbc5dd-341f-45b1-b5f2-d89a443dbded)(content(Whitespace\" \ + cb855eeb-2e65-41c5-b458-953806b60c33)(content(Whitespace\" \ \")))))((Secondary((id \ - c38099ff-4da1-421f-ba6e-066cdbf14b83)(content(Whitespace\" \ + 71b12abe-3a00-4cf5-a7e1-f7c0523c4581)(content(Whitespace\" \ \"))))(Tile((id \ - d8506edc-e8df-485f-9c7a-104fa61efe06)(label(1))(mold((out \ + 4f36fea3-e604-4f77-a0dc-26e4563d3a04)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0a082205-0eff-41cf-88d5-964cc77b9945)(content(Whitespace\" \ + b2ac5c70-f396-480d-95a6-e40ecd776ecd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fb8da1ee-7b45-469f-9a30-214b0fec876c)(content(Whitespace\" \ + e52c206b-91f1-4d12-9c38-39dfa2ce4fba)(content(Whitespace\" \ \"))))(Tile((id \ - 95cf7299-f2ef-4335-a7a4-4b965715629d)(label(1.))(mold((out \ + 479a7dff-73f8-4f19-a00e-975f0647dc77)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3a72a887-0549-429b-bdf5-5e4f4d576fa4)(content(Whitespace\" \ + 46812a90-5acc-4c22-a5ce-92233646948b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 48ace48a-ed83-472d-a862-73e3455fb2de)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 064f3cff-0441-43c1-a967-adad6d386160)(label(let = \ + 5ca0db43-c425-4617-ad97-a87fe9306f8a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4d7fe960-a87f-4ce5-ad32-aa8581035007)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2ed8f4f4-d6d5-4f2a-87f6-8e6285746d2c)(content(Whitespace\" \ + 73b23123-29c3-4fb7-9b8a-05693f256733)(content(Whitespace\" \ \"))))(Tile((id \ - 822c6d9a-07c6-4483-8022-d6a17f0bc077)(label(_))(mold((out \ + 13a3d926-b70d-41ff-8566-3c4c9b2bf99c)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - aee38cbd-3ab4-43b9-a4a0-fa590c53abd9)(label(:))(mold((out \ + 423e0344-be2f-41a9-a456-ce1049a8b0b1)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0d707e62-a533-4dcf-8c58-234a04abede3)(content(Whitespace\" \ - \"))))(Grout((id 0a083e34-4118-4771-9f7e-4a96bab5e133)(shape \ - Convex)))(Secondary((id \ - 4ea0e61f-5db1-4fae-94a0-b206dfcae9b3)(content(Whitespace\" \ - \"))))(Tile((id \ - 85eb2e99-1220-4a46-98a3-5f2b34050242)(label(->))(mold((out \ + 5d7a831b-b8fd-4762-960d-0fba8f5fde2f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 36039aad-4cd9-48c2-a1bf-abfb4dc37cb3)(content(Whitespace\" \ + \"))))(Grout((id e2430ad2-1fe1-4fc0-b2f0-6d7f0633e8fa)(shape \ + Convex)))(Tile((id \ + 0b7ad8bb-266d-46bf-8134-d1bc1ddc8e2d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - c773ff50-6dd9-417f-b9e5-01af2a434b1a)(content(Whitespace\" \ - \"))))(Grout((id f2e751fe-876f-4533-8463-abc68f0d53b2)(shape \ + Typ))))))(shards(0))(children())))(Grout((id \ + ffccd23a-f723-4d7a-ab9b-9f3dc05d3d39)(shape \ Convex)))(Secondary((id \ - aa56d842-4a1e-414f-ac0c-9b7d818689f9)(content(Whitespace\" \ + 6abab41e-89c9-43cd-b7f1-457d5df8684f)(content(Whitespace\" \ + \"))))(Secondary((id \ + 873da007-046b-4cfb-bc04-c37d8de4a77c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 60ba755b-6f24-4592-8b65-45adcfae5b02)(content(Whitespace\" \ \")))))((Secondary((id \ - 773e1734-2619-4307-a0ca-5b2d37e3d703)(content(Whitespace\" \ + cdcbdfd1-d436-4c98-8e0c-327157bb3451)(content(Whitespace\" \ \"))))(Tile((id \ - 70715b3a-c763-4384-b3aa-deb432993c03)(label(fun \ + a705045f-412e-4dad-a2be-d56a1d362101)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d73b3951-2dd5-49e9-868c-15a68e938d6f)(content(Whitespace\" \ + f65af529-4319-4fe6-a9c8-1b716012603d)(content(Whitespace\" \ \"))))(Tile((id \ - 18a27aec-99fb-4526-b012-ff658d71b74f)(label(x))(mold((out \ + 7cea72cc-149b-4e79-a93b-1b192f0668b8)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 00e9634c-0987-49f7-b0a9-2b7ae1957355)(content(Whitespace\" \ + 154047bc-4f40-4d89-90e7-fe3a0d15b2ae)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 21f70fa5-6916-40c1-87df-2bc094477f44)(content(Whitespace\" \ + 70ab61a2-1bf1-470e-9950-a01f76d181d3)(content(Whitespace\" \ \"))))(Tile((id \ - fe517fb3-7e2f-413a-9985-5bf7010219ba)(label(if then \ + 4c2b76d8-f6cf-4832-946b-505151bfe46a)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3d1dfced-c3eb-4c2e-86f8-d7bdf755c8e3)(content(Whitespace\" \ + c36fdf84-9ff3-4eab-8ef7-973b0ba6a57f)(content(Whitespace\" \ \"))))(Tile((id \ - 302dd1bd-0039-4920-8229-5d7126519725)(label(true))(mold((out \ + 8d5079eb-a0e3-40ef-abc3-b075fc44edee)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 26b01537-34e4-4857-8046-0e93cbd5bdbe)(content(Whitespace\" \ + 02f37a6c-8ff6-4798-ab58-7b69b6c17f52)(content(Whitespace\" \ \")))))((Secondary((id \ - 3fd00fed-3bfe-4f3c-a9c5-3e5398415dfc)(content(Whitespace\" \ + 0dbdda0c-6ef3-43bd-af0e-da537f0d2318)(content(Whitespace\" \ \"))))(Tile((id \ - 56400756-047c-47bd-968c-eb8d8b407a08)(label(1))(mold((out \ + 48fbe76e-cf73-4bf3-9b0a-8e0c199f3303)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d2ac233f-d857-431f-aacb-7f41e06fc357)(content(Whitespace\" \ + 92b2cd79-7544-4351-9f37-c05ef9093507)(content(Whitespace\" \ \")))))))))(Secondary((id \ - caeb9b1c-c0a9-4a47-ba1c-1d52c41bc5a9)(content(Whitespace\" \ + 20d3283e-389a-4641-ad6b-5e1484f4d9b5)(content(Whitespace\" \ \"))))(Tile((id \ - e4dd5f47-4d95-486f-84e3-c8cf91879b5c)(label(1.))(mold((out \ + 6f4418d6-ae55-4493-98ed-0497267a72de)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 3ce7105b-92e9-4837-b692-e1aa874e790d)(content(Whitespace\" \ + 78d8f6db-ed2e-4899-8433-68b9625994a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 98c8d6af-39e8-4af6-9c99-ba35ce4a3a25)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 68fadcc7-d4c3-4222-aaa0-590adaa90209)(label(let = \ + 7c24fdf1-2e36-41bf-bae7-c09f116607b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e2cd3fad-540f-415d-8043-63fc31f3b221)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f79c1c00-935c-4015-9d85-9e0f5d140616)(content(Whitespace\" \ + 89b58c46-a94f-453a-965e-a6ba9be57212)(content(Whitespace\" \ \"))))(Tile((id \ - 5e83136a-94aa-4a91-80a3-53e946b862f5)(label(_))(mold((out \ + c76e67a6-df03-44f2-8536-e7936f3fed5d)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - c9f5e43e-4156-4694-aa8b-bdae5a040092)(label(:))(mold((out \ + ff253a88-bd76-45b4-a989-9d9d343aa32d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9abd94ac-c981-477b-b931-bfa8edbb948d)(content(Whitespace\" \ - \"))))(Grout((id d8a7e43c-e62d-4a68-9392-34c3d520ee76)(shape \ - Convex)))(Secondary((id \ - c2ecf45c-d54d-4312-bd7c-1876d09ac852)(content(Whitespace\" \ - \"))))(Tile((id \ - 1329720c-273a-4269-ad71-1a28f3fd2535)(label(->))(mold((out \ + 616d4a4d-a668-4e7a-9da3-340b7ce802f1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 0006a920-97ec-4970-8b1f-cf1a597d3db5)(content(Whitespace\" \ + \"))))(Grout((id 81227d2c-be01-4c94-81c6-eff27092e665)(shape \ + Convex)))(Tile((id \ + 6f5f976f-30ca-4e69-8579-f7ae2a108465)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 868cd88f-7e80-49bb-b3a3-c4a3cb8c9ee0)(content(Whitespace\" \ + fd18ef4f-b609-4bfe-94e0-d296847bc935)(content(Whitespace\" \ \"))))(Tile((id \ - 8f6a27cf-2de2-462b-8b77-649f84c6a6c5)(label(Int))(mold((out \ + 24797b99-a831-4b3c-9560-52080fa62216)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 753de3a0-5a42-49db-bb4e-8466f6a5052f)(content(Whitespace\" \ + 0f23f05b-a326-45bb-822d-1b8e51cb2306)(content(Whitespace\" \ \")))))((Secondary((id \ - 305a5579-fabc-4a3b-a564-28f2d999cc52)(content(Whitespace\" \ + 98d58acd-37ec-406b-8465-291fed880866)(content(Whitespace\" \ \"))))(Tile((id \ - 456377c1-810e-4383-bd2a-b64bc1e5a158)(label(fun \ + bd301626-525b-43fe-9cda-be70912b2f7d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 44ed9cdd-e3a7-4324-a241-ba543cc3a45e)(content(Whitespace\" \ + 3d82ed17-21a6-4257-abe3-805513615e48)(content(Whitespace\" \ \"))))(Tile((id \ - 8d053487-9623-49b8-91da-c79e50ceb1ac)(label(x))(mold((out \ + 7931c017-d228-47da-a700-c35ee6b0eeb7)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8e8e1846-4348-4b5a-878e-cc2c734c0e2a)(content(Whitespace\" \ + 4959e868-d1af-4cd0-a0fd-5dd704b3858a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 51d1c856-593b-4502-b765-6597df73fec9)(content(Whitespace\" \ + 68aea425-3c57-4a6f-a7d2-2c6cc0a87600)(content(Whitespace\" \ \"))))(Tile((id \ - 5db724d3-eebc-4037-af82-ae205ab5e6ab)(label(if then \ + 1de74948-95d6-4086-9e54-46ddefc6bdb0)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d389b6b7-40ef-476a-af68-fccdc0e7e467)(content(Whitespace\" \ + 77837ee0-6d6f-4bd9-8ba8-3156b0b4db67)(content(Whitespace\" \ \"))))(Tile((id \ - dc561af7-7351-4e8c-ad97-8a2fc30b343a)(label(true))(mold((out \ + 80e6a753-5adb-4f2b-984a-50a51e9fed27)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e48d2cf4-8a1f-4b1f-a39e-e3ddea04c282)(content(Whitespace\" \ + 3183cb38-3f1f-460e-a208-2a0f22b10f22)(content(Whitespace\" \ \")))))((Secondary((id \ - 8acb9af5-9917-4f3f-a6e5-1502ff6b759b)(content(Whitespace\" \ + 7bdded42-9f8d-4680-9293-122093727b04)(content(Whitespace\" \ \"))))(Tile((id \ - 82c3ee4d-7220-4614-9549-506547c5acaf)(label(1))(mold((out \ + e123ec12-e7cc-4aa7-9154-79c244bd5228)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - bd36ce97-fde8-4c8d-8b72-d5984f2871f9)(content(Whitespace\" \ + 158e823c-6574-41b9-9424-b9126a6205d9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 53d00df7-b40a-4378-b3c8-d5d73e9877f6)(content(Whitespace\" \ + 87c83d9d-6bc3-4197-bcbe-c8e906b497c2)(content(Whitespace\" \ \"))))(Tile((id \ - 3425209d-3591-4e23-b4c9-faa1a2a22ea0)(label(1.))(mold((out \ + 8961a915-6957-406a-ab70-0da17acdafc8)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d6d6bc35-54ad-4b9c-9027-1d46fa0107d4)(content(Whitespace\" \ + e78aabd6-b2ad-4342-87ac-6740ea32c8ed)(content(Whitespace\" \ \")))))))))(Secondary((id \ - eb62436d-b80b-40b3-af6e-e96565c2eb37)(content(Whitespace\" \ + 7d87fae4-a792-4377-92c6-14316ea90783)(content(Whitespace\" \ \"))))(Secondary((id \ - f335a09b-ce6d-4f17-9fb2-652c203d3d20)(content(Comment \ + b7bd0e63-0e4d-470e-83e8-e721992d87eb)(content(Comment \ #err#))))(Secondary((id \ - 34846444-6996-48d6-9abd-8fd89b065e08)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bc034f74-64e1-4075-9a5c-e50fc037e444)(label(let = \ + 177e50f2-8b1b-420b-b35f-fd34fee54ea6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 20b66c80-1b9f-40ee-8eed-868afc146b88)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a5bfed1c-eb59-4922-98d9-b1de5e57c07d)(content(Whitespace\" \ + 28692c79-024d-45a8-8b4a-5654d5df86d7)(content(Whitespace\" \ \"))))(Tile((id \ - 12565b03-ae6a-4c95-8bbb-8906e752943b)(label(_))(mold((out \ + 179613fb-c76a-4a04-bb32-b3cbfc6f9c3e)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9d24149e-0058-4a88-8509-795db2931cfd)(label(:))(mold((out \ + b23d5491-2fc4-4941-baa1-52a2e48b2ebe)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0cc42648-ef8c-4e16-b848-703d20f09d88)(content(Whitespace\" \ - \"))))(Grout((id 0aabbfea-3979-4116-aa53-0e38d5e3ab9a)(shape \ - Convex)))(Secondary((id \ - 044415e2-5065-486a-a23c-e28304373b07)(content(Whitespace\" \ - \"))))(Tile((id \ - 12685639-fb4d-4ae1-aacb-f7ee76b44e48)(label(->))(mold((out \ + 85989bf6-e65b-4e0d-966f-c79e1a6e2ccd)(content(Whitespace\" \ + \"))))(Secondary((id \ + fce4ca15-e39e-4de1-9f25-c9a05a197444)(content(Whitespace\" \ + \"))))(Grout((id 41187827-255f-4ae2-b455-415324c027e7)(shape \ + Convex)))(Tile((id \ + 57be36ff-3c4d-4d97-a859-7cf78407f249)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - c8202885-1ee0-4736-bc12-5ba937e73829)(content(Whitespace\" \ - \"))))(Tile((id a3dabe24-7c0d-4ab0-b0a6-d202082db47d)(label([ \ + c0aec7b6-dce2-4e31-8a95-afe85d6ad196)(content(Whitespace\" \ + \"))))(Tile((id aeaa175c-40d2-4078-a79d-45a97002ae1e)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Grout((id \ - 667ef115-6b63-46b3-9da6-106b1225816b)(shape \ + 74b128ff-36b7-475c-9069-8c81873243ed)(shape \ Convex)))(Secondary((id \ - a1b161b3-425d-4994-b63a-8126ea823754)(content(Whitespace\" \ + 948aa7ba-2f51-4c21-a4a9-1e1c8ebc8fb4)(content(Whitespace\" \ + \"))))(Secondary((id \ + 1f327350-5396-4f58-9409-e0ab5e63c6a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - cc1b0d4d-3f7e-4f21-9a74-1e3431932d2f)(content(Whitespace\" \ + 1e6a7d87-0b88-4478-ad9d-8076310a0c65)(content(Whitespace\" \ \")))))((Secondary((id \ - c606ecb7-008e-4af1-992c-c592e1933ebf)(content(Whitespace\" \ + cc0cb60b-75fc-4450-ac42-3cafdb5cfeba)(content(Whitespace\" \ \"))))(Tile((id \ - bda9cb2d-1e25-4d02-bdd2-ee2a31c5c746)(label(fun \ + ae53d282-5098-461b-ab95-5f058bc2e7a5)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a25b25c1-74cd-4e58-9ea0-195c88ab7d6a)(content(Whitespace\" \ + 1bd72cb0-1037-4909-b674-45985ac7c1d5)(content(Whitespace\" \ \"))))(Tile((id \ - b17b75ae-abed-4317-a7e6-02aa78a53a78)(label(x))(mold((out \ + 0d421c83-c42c-4774-9249-79434643b47d)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 73b73463-0a74-4475-ae33-3cef3812dda5)(content(Whitespace\" \ + adc3d9fe-730b-4f28-b367-5decaeaed27d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d69e4e3d-e936-4a55-ba6b-bd134db58d6d)(content(Whitespace\" \ + 71b89864-aedf-4a6f-b7d8-a16daa20d32c)(content(Whitespace\" \ \"))))(Tile((id \ - b6104806-53f3-4022-8f61-96a1d49d9632)(label(if then \ + bd635118-71f8-492d-9f8d-faa475c8d7e8)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8035953a-0f49-433d-90f0-4bfc3dca5ca8)(content(Whitespace\" \ + 21dd2afd-0e64-41be-aef1-b8b1b331715a)(content(Whitespace\" \ \"))))(Tile((id \ - d26deb3a-0abf-4794-ba43-64728e5450a1)(label(true))(mold((out \ + 595c431d-1852-49fd-92b7-2aec39c6f666)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 8ffbbf78-bcd6-41b9-9d50-2932a7d4c256)(content(Whitespace\" \ + 255e2326-12f6-411c-a6ac-ee4531c8ca08)(content(Whitespace\" \ \")))))((Secondary((id \ - db7c9da9-3cce-497c-93a1-87e3fbfb40d8)(content(Whitespace\" \ + a0b9b432-9747-4c8e-a7ae-e7419db9c4de)(content(Whitespace\" \ \"))))(Tile((id \ - 27bac803-81dd-4799-b303-7248ed2d209a)(label(1))(mold((out \ + a8973628-7c1f-4ed5-8827-3d539d535199)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e02d8b52-0a2d-41f6-98f2-b20d9021d1cf)(content(Whitespace\" \ + 79a281fd-0316-4d3a-a0e1-c3f1f814246e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b60cc93e-b16b-42e7-933d-63f0e98e73bd)(content(Whitespace\" \ + bbfb1efc-a7eb-4696-8cf7-e8f9f3c6ad72)(content(Whitespace\" \ \"))))(Tile((id \ - 0bd672d0-164e-4012-bfd7-2e74221b3649)(label(1.))(mold((out \ + 00309486-c9af-4d2d-90c8-bc66a511c06a)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - d471b5e1-e2ff-4e62-b9bb-2dbcd3188731)(content(Whitespace\" \ + 2379e9e8-6f16-4225-9a6e-f95440f8c62b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2b8a9180-605f-42bc-bcbe-cfc18a05b40b)(content(Whitespace\" \ + a2eef8d8-db3a-4635-a4b5-404c4c0921f2)(content(Whitespace\" \ \"))))(Secondary((id \ - 71d414e8-1708-46aa-8905-95e07acf1b1a)(content(Comment\"#2x \ + 9612e37e-8400-48ce-948e-d2cafd3095aa)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - c614d0f8-21c9-4d85-a949-6e4e87f46f48)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 54c730c3-7faf-40ea-be28-3388ce87163c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 636162a6-c7da-4066-8f6f-2d412def30c0)(label(\"(\"\")\"))(mold((out \ + 832c68fe-94db-4f81-aaf6-94d9c7c77863)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a5a3b845-0842-4d91-8194-0b98b729c1d5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 16a37cbe-dc5b-4227-b7bc-7f391876ab5f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - 3841372b-09b8-4d63-898e-875a34b3214b)(shape \ - Convex))))))))(Tile((id \ - 4abfdc18-3c1a-41aa-aa78-0d6377a2a70f)(label(::))(mold((out \ + 6d628a17-d807-4119-8660-cfeb6c4399c3)(shape \ + Convex)))(Secondary((id \ + d365c6eb-551d-4e56-b2c5-75d482fca060)(content(Whitespace\" \ + \")))))))))(Tile((id \ + 91727912-05e6-454e-9782-5e618fe6e70a)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - a3bafedc-1548-4893-9f8e-b25d0cc55a8d)(label([ ]))(mold((out \ + 8a13034f-7c7e-49fc-af4a-44261c19e927)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 60f0560b-3ba1-4660-886c-b7dba36edeff)(label(\"(\"\")\"))(mold((out \ + d9ddffb5-5c0f-41ac-8d9f-7631ca1d2ada)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bf9c7ad8-3b88-454c-8cfb-d288b7dccec9)(label(if then \ + f10d6e13-da55-479f-abf2-12475f349978)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3aa5738b-5699-42a8-950a-21b482350f1c)(content(Whitespace\" \ + fbfc5089-c87a-492b-9743-1636d471050e)(content(Whitespace\" \ \"))))(Tile((id \ - 2302cecd-02cc-444d-a264-47d5c302e937)(label(true))(mold((out \ + 9fd0c3db-965c-4c6f-a53f-1ea2a56b6b2c)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - f4629cc0-f6bf-491e-9183-307029a65d83)(content(Whitespace\" \ + 34fb2388-8f32-4f6b-8848-4c0315ccc6e8)(content(Whitespace\" \ \")))))((Secondary((id \ - 261ae6a5-7bfc-4533-8c35-c2e402da95bb)(content(Whitespace\" \ + 6a36d538-f325-4018-9415-eaf91fce7bca)(content(Whitespace\" \ \"))))(Tile((id \ - 0fcaed94-de86-4486-9587-989012c9eb55)(label(1))(mold((out \ + cf3818bc-d193-4ad1-916b-f59ce6f9734e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 1182ff09-84fc-42ab-a622-4def1281e1ac)(content(Whitespace\" \ + af8e1c2b-974d-40dd-85e3-17be1e2eb285)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 41f37e87-03a4-470d-9ce1-4eff1401c050)(content(Whitespace\" \ + b2fde3fe-6850-4aa1-9479-e300e01f0935)(content(Whitespace\" \ \"))))(Tile((id \ - 3aab3daf-8cc8-4c82-bcd9-5ec2314274d8)(label(1.))(mold((out \ + f730e703-9baa-4434-88c3-4d954f0bddca)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 5f3d079d-fe76-4ecd-b8f4-0c46093a6c9a)(label(\";\"))(mold((out \ + e78aaab0-80e3-4256-ada1-49c56d6a86ce)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a8b5a329-de3a-4841-ac8f-82bd2140ffab)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 49e39b6a-2f60-4c51-976a-cb615ea58c2d)(label(1))(mold((out \ + 4452164f-3c96-43fd-b93b-fea5fd8118d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b4e13b72-e4fd-4f1e-8453-c0dcbb78a057)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 94e615d4-8848-475d-9045-c1f37544edc0)(label(::))(mold((out \ + 3030b792-98fc-486e-b2a4-98094744700e)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - c9949ca3-6d3b-408c-bc28-d2fcf6bcd2b7)(label([ ]))(mold((out \ + 92d82649-57d6-4704-8d92-0cf013e1ebd6)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8682fab8-c999-4af5-b82e-f4ee7893f25d)(label(\"(\"\")\"))(mold((out \ + 778d103f-be70-48ab-87e6-200b7accbed0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 66d11400-7cbd-413f-a6b5-85a2fa0e987d)(label(if then \ + a0fdeb11-83f6-4283-a2bd-02a8680c87a5)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 6854cb07-e353-4b9e-8170-065592f7f659)(content(Whitespace\" \ + bb78e77d-600d-487e-80f0-9fb38fd7a115)(content(Whitespace\" \ \"))))(Tile((id \ - 97df045d-668e-4e18-a357-b5eccaf7fb19)(label(true))(mold((out \ + 053aded7-442e-46c2-9f5a-7039c194a87e)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 50295be2-19cf-41a4-9cdf-8a2cd827de1f)(content(Whitespace\" \ + 8f55ad96-a029-4f0c-bdab-e870748666d4)(content(Whitespace\" \ \")))))((Secondary((id \ - 95567b53-0ef9-404d-bcbf-02ff2f835b2e)(content(Whitespace\" \ + 1b67207d-7319-426b-90de-7732f2a13e87)(content(Whitespace\" \ \"))))(Tile((id \ - ff0591cc-58e3-4c60-b040-279a4e7aee46)(label(1))(mold((out \ + 744bec07-0822-4c77-b708-c0927855d960)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 39b24655-432e-4780-b720-53728762e0df)(content(Whitespace\" \ + 12016f4c-9951-450c-b498-eee8dc7ae769)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 180e3b91-e051-4ab0-88db-0896c48528cc)(content(Whitespace\" \ + 3c3d18a0-0022-4ab9-9e40-02e6eaa6ee34)(content(Whitespace\" \ \"))))(Tile((id \ - 4f0129e4-da68-44b5-a71c-29a655da84d2)(label(1.))(mold((out \ + 297dbdb6-6b1d-431d-9a23-3eb22e184cc1)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 87d70ccc-8c82-4f85-96eb-ae0ab9da8b9b)(label(\";\"))(mold((out \ + bcf15c13-6bd4-455d-815c-b295ff1739af)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ea5488f1-6629-4cf9-afd2-cab2de7964f6)(content(Whitespace\" \ + 36542426-c71a-437e-858b-bd3cc5922797)(content(Whitespace\" \ \"))))(Secondary((id \ - 901c15eb-34f2-4a1d-ab7a-19ef62c6d980)(content(Comment \ + ff23ec41-8dd7-4d7c-91a2-339224f8fb09)(content(Comment \ #err#))))(Secondary((id \ - 19d8602a-bf4a-4218-a64f-c26b14657c01)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c89313a-3e00-4ad4-b477-10d05153db22)(label(\"(\"\")\"))(mold((out \ + 8cae60cd-016a-4424-9157-716529f04a4d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 32e2f80b-d83a-4fe6-8ee8-ec4713973ee9)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 69a79e4e-6e3b-4846-b1cf-bf0847154b1e)(label(1))(mold((out \ + ff11824e-80e8-4f41-9f47-52c3f22de996)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b3de2317-c5a5-497e-a39e-7bdfd15cf1bf)(label(,))(mold((out \ + 82717f81-0aa9-46ab-af23-5f4f5bab270b)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2c7de733-826c-4b17-b7df-07902020a47d)(content(Whitespace\" \ + 62191de8-30df-4984-aef7-e5813cafa6ed)(content(Whitespace\" \ \"))))(Tile((id \ - 4548b419-89af-4f32-a37f-82f321a6d64e)(label(1))(mold((out \ + 9440e8cf-5a51-47d9-a888-6ed38bcd6309)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 6750d64f-a8a3-4106-a203-89382a98db38)(label(::))(mold((out \ + 94e4713b-16a1-463e-ae3a-15f3e4ca475d)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 672d67af-99ee-4ac1-82cb-2b2fb08a36f8)(label([ ]))(mold((out \ + 6b5bca5d-99b3-426d-9151-191bb81b4016)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d121cfed-4a09-44e6-b9f7-ba0cec477419)(label(\"(\"\")\"))(mold((out \ + 1917600e-8146-4ae0-921d-a38961fde2c7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1549aea3-e34a-4df4-ba28-56dac1da800b)(label(if then \ + 5b77bc26-647d-49d6-b857-66949d31fad5)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - a9e18854-872a-4510-a927-73f90a9a9f25)(content(Whitespace\" \ + 2d644fdf-b4d6-4f76-90de-b093805bffe2)(content(Whitespace\" \ \"))))(Tile((id \ - d2757960-b19b-4e09-8432-79840ef0b383)(label(true))(mold((out \ + c35f9fdc-6716-401a-aeb2-1ca1fdb8e2b7)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0a518437-9a15-4dc8-8ddb-4ab6f2e846ca)(content(Whitespace\" \ + 2e6140a9-617b-4c61-86c2-d5a6efbef23f)(content(Whitespace\" \ \")))))((Secondary((id \ - 16b7e52e-b50b-4b36-b5de-046bf60b4ea8)(content(Whitespace\" \ + 11450632-e5fe-4edb-93b3-0c033bd175f8)(content(Whitespace\" \ \"))))(Tile((id \ - a005d2ac-4737-4657-a169-faec12ff88ba)(label(1))(mold((out \ + 9d630777-ffe3-4662-aebe-227954581acc)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e89d0641-77cc-41f0-a545-554c6712acb3)(content(Whitespace\" \ + 8f9ac4d3-711f-44e2-bb70-41cf3a5d7ced)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 38925408-d6a4-4a66-8f4c-e9196da15cb1)(content(Whitespace\" \ + e0b40035-4d13-47ab-a4f3-c5f97c8e2923)(content(Whitespace\" \ \"))))(Tile((id \ - b3e06a0b-1391-4d3f-b9c3-00de8b2dff7f)(label(1.))(mold((out \ + 3010a196-1dba-4c06-8d15-b416e805b961)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 386614e0-40df-43a8-be72-9b53e345e123)(label(\";\"))(mold((out \ + ee6da9f8-bc92-4b2d-8a86-46007a1bb18a)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 6f527cf8-c425-4167-bb7e-9d189a776e38)(content(Whitespace\" \ + 1c2b19b1-999e-4f1d-907a-324df3549257)(content(Whitespace\" \ \"))))(Secondary((id \ - 63030444-f03c-4b62-89ab-6fa5e5a12d9c)(content(Comment\"#2x \ + f9ae0f2b-9d16-4ab2-94eb-a1df830bba5c)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - 82ecaeb6-25ea-44dd-9b48-1d118e2e008d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8736a384-0bc8-4ae5-8681-af82deeb09d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25e07714-af67-45f2-8ddb-4ad8108248b2)(label(let = \ + 715595f7-c907-4139-b8eb-e9d61e3dd88e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + bf573312-7a77-4788-b725-962b09bb83d7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + eaed346f-f9a1-4571-a6b0-2408f3b5aa35)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 6ba75e3a-464a-4e7f-8213-73f73c1f4635)(content(Whitespace\" \ - \"))))(Grout((id e1829670-10d4-43b0-ba59-73377143bbc0)(shape \ + 2))(children(((Grout((id \ + 4d9f7649-dbd4-4dd3-a532-84d07ee30d99)(shape \ Convex)))(Secondary((id \ - c035c830-c090-4d8c-9b5a-b81ddcf483e2)(content(Whitespace\" \ + af8a2cad-40e2-45a0-8230-3e3b40da7207)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9dd3b184-e240-418f-8237-48eeb811a098)(content(Whitespace\" \ + \"))))(Secondary((id \ + 800dffc6-685a-4c12-8515-f435afee2fea)(content(Whitespace\" \ \")))))((Secondary((id \ - ad38a685-38f4-48ec-b1be-08dbf34962c0)(content(Whitespace\" \ - \"))))(Tile((id 1235b1a2-6c74-4117-ba60-632df4438912)(label([ \ + 34d97d72-dbee-4cda-92ca-02e3b0813434)(content(Whitespace\" \ + \"))))(Tile((id fe7ce7dc-ccf0-41cf-b61e-58713886b996)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 87795542-aa3a-449f-8386-03804e15a7fe)(label(1))(mold((out \ + b10593ba-bb07-4ff5-9bd1-f22ed0783aa9)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d4081474-89a4-4b8c-8443-dbb20adc97c0)(label(,))(mold((out \ + e85e28c3-991c-46e9-9598-42b2477c865e)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2f4bba19-94b6-4454-847a-6639fdc4a411)(content(Whitespace\" \ + 7dc5f42b-8d36-4373-9d0f-8843fea91a1b)(content(Whitespace\" \ \"))))(Tile((id \ - ff1bd8e8-a1ad-4533-8246-ab506e878935)(label(1.))(mold((out \ + 7ddf8712-61ea-4905-b497-add09996d1c4)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c3da2737-cd9c-4e71-83d0-2563c154cb3e)(label(,))(mold((out \ + eaf9b2dd-0d47-4af1-a5c8-061891ac8f7d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - be0b228f-e3e3-4e09-8d79-84e9eb758d5d)(content(Whitespace\" \ + 08002c61-30fe-4b28-977a-6e168f820884)(content(Whitespace\" \ \"))))(Tile((id \ - ec5c751b-b74c-4bf6-97d6-43098211a260)(label(true))(mold((out \ + 9f837009-fd6a-42e2-9e5e-3b311d3134cf)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - f7a6a130-7d47-4b75-9ee8-41d3e0e0562d)(content(Whitespace\" \ + 91bbf839-f2fc-4312-af44-e8fe70a58b0e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8610d248-d7f6-4b5e-8d91-1e7d9744c95a)(content(Whitespace\" \ + 34cb07ec-c128-4bae-b22b-603778514237)(content(Whitespace\" \ \"))))(Secondary((id \ - 3b3b341f-57c1-44e1-abdf-9b9f5cde7af1)(content(Comment\"#err: \ + edf1f302-ba8d-4a9f-b713-fc18c8beb475)(content(Comment\"#err: \ inconsistent#\"))))(Secondary((id \ - e65afff4-4845-4eb0-a639-e9a8b8a753e2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c8149f7b-465f-4dae-99b7-b0626199840c)(label(let = \ + 1d21fb06-5b8c-403d-9347-ccf6b2fb7427)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8dffbed9-b88c-47d9-a1c0-5b831c9a1e72)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 3c74242f-419b-45f6-b919-4f740697adf4)(content(Whitespace\" \ + 821485af-473b-4a90-bd5b-7589ed9dab33)(content(Whitespace\" \ \"))))(Tile((id \ - e92d4176-b2b2-40da-b251-25908c36aeda)(label(_))(mold((out \ + eef784bc-4e2e-4903-9016-cf8fc863ca19)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - b5932dda-aeec-4a52-98d5-75e9ae8c3fe1)(content(Whitespace\" \ + 10b05fdd-ddae-4124-b9b1-21decc4828d0)(content(Whitespace\" \ \")))))((Secondary((id \ - de1d871e-ae6d-4cc9-9a5a-e0bb71b4f716)(content(Whitespace\" \ - \"))))(Tile((id f4ea1612-4d0b-4c6a-8b8b-51ee6c9148bd)(label([ \ + aaf6379a-c330-4db6-af7b-4dddf9f0b575)(content(Whitespace\" \ + \"))))(Tile((id d8e9da41-110d-4de9-a7de-b44ff0038f24)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 879c0a44-3772-4ba9-9701-f2254c1101ff)(label(1))(mold((out \ + 8b2911fa-2a94-48f5-a573-d17e83dec5b3)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6f168751-d079-4937-aa50-58a6d31f435c)(label(,))(mold((out \ + c1b21d5f-f1cf-4268-8f26-83b92873027a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 29c607c1-7d5f-4e1e-bdc6-d8eaaa314b2d)(content(Whitespace\" \ + 26a10e17-9393-4593-8a58-59124dc53d1d)(content(Whitespace\" \ \"))))(Tile((id \ - bddf7cb4-ae4b-41ac-859d-7477ca11229f)(label(1.))(mold((out \ + 66740b97-c103-4946-a427-e7b398cbb185)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 1346ef22-efac-4705-a792-44c5ddcbf6d9)(label(,))(mold((out \ + a791cfe5-5851-430a-ac3d-e0d46e883523)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3bbb7438-8ce7-450a-a005-e70b3d71690c)(content(Whitespace\" \ + aa9f3248-2856-412e-82a8-dd48d95a1c4c)(content(Whitespace\" \ \"))))(Tile((id \ - 1dea7062-64ac-40b5-8e4c-0df2a54db945)(label(true))(mold((out \ + 7073b5c4-0f33-40ed-9055-9767f0a66124)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 387c6d69-cc10-484e-bc21-243685620535)(content(Whitespace\" \ + 7bfde104-a9c0-4f94-9d06-22beeee37d51)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4f88f168-fd38-4905-ba22-10adb1c4b536)(content(Whitespace\" \ + 45117c72-352b-4c5f-af83-8e36735e7e1a)(content(Whitespace\" \ \"))))(Secondary((id \ - 0ca424fd-6276-47d3-a467-d01ba7511f97)(content(Comment\"#err: \ + f2b7d7e5-72d4-4d1f-b625-e9c3898e5468)(content(Comment\"#err: \ inconsistent#\"))))(Secondary((id \ - 976a7b6d-0bb2-4d6a-9d73-c907f790d8f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f53ced4b-b4e3-4e3a-9828-80f2a5db49be)(label(let = \ + ab630234-78a5-4b9a-8529-f99de22909a2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 65f68252-d38e-4ca1-a53b-f5e5695ec473)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 37595043-73b9-4881-baae-19330a790b17)(content(Whitespace\" \ + a6da039f-4d44-4717-b047-1d45349c39ed)(content(Whitespace\" \ \"))))(Tile((id \ - be03a8d6-b212-4ed8-8739-dae0d4f4ff34)(label(_))(mold((out \ + ddb68bc9-8439-4ce5-8fd0-832fa669dcd4)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 85827f59-8fa2-42b3-b16e-85b16115a71a)(label(:))(mold((out \ + 52625e6f-568c-4303-adbc-109bccc6e8f3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Grout((id \ - 4f805da3-bb11-4abd-80de-3f32590bba4e)(shape \ + 3d2a7eef-5d0b-4c80-bcc0-8f814aa767aa)(shape \ Convex)))(Secondary((id \ - 9bd7ec55-b904-47b7-b5e8-7071ac0fcffc)(content(Whitespace\" \ + f3af026d-83c5-47e3-9808-4da209e81c33)(content(Whitespace\" \ + \"))))(Secondary((id \ + e4d8f77d-0d97-47e6-9f85-e89460bb7b4a)(content(Whitespace\" \ \")))))((Secondary((id \ - cc52ebf6-8415-40fe-aff1-c0f76074243d)(content(Whitespace\" \ - \"))))(Tile((id 7f4f0b94-04e7-40e4-9b50-187c48f41466)(label([ \ + 9d41ec99-7d66-4e27-8410-edea51fb1893)(content(Whitespace\" \ + \"))))(Tile((id c8cf18cd-3cce-4141-93e0-262c397f7378)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 6bcd0145-dd52-4423-8db8-cd16d645dee0)(label(1))(mold((out \ + 7e5af338-1e12-4b77-9ef0-b9435cecbe8e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f6981a38-f10e-4af0-89d6-9d4beee1b089)(label(,))(mold((out \ + ce3cb6e9-ae9b-426e-8ea1-7d34de49cefe)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e1a96205-2433-437c-9f43-8c0dcb2d7270)(content(Whitespace\" \ + eaf9f29f-6f60-4bf4-af45-656bb4cc205c)(content(Whitespace\" \ \"))))(Tile((id \ - a1d84ce8-9aed-424e-b880-4f395fc09505)(label(1.))(mold((out \ + 750c9a5d-7491-492b-833c-7ed0f5fac511)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9daf1c7b-1c6b-4143-877f-1cf0e1891459)(label(,))(mold((out \ + 31ffd780-7310-4df1-8a92-a89e7cff64b5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3786c8dc-be10-4a5a-baa5-cf803d79a6d1)(content(Whitespace\" \ + d07f6877-43fd-42d8-86b5-d08dba26aa21)(content(Whitespace\" \ \"))))(Tile((id \ - 0f470f1a-a504-49e3-b7ad-a479058d2f3b)(label(true))(mold((out \ + dfa5256a-64f0-410e-b802-6ba2406cdde5)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 02f3fe02-2ae0-4bee-ad4d-e93be14f7f93)(content(Whitespace\" \ + 54dad9f1-53be-4a73-bd83-b415d7cd8290)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c9dae562-af8f-4cb7-80b6-833723e10fbb)(content(Whitespace\" \ + 91d07bd1-6bd3-4208-b25f-6eb9a8d4b664)(content(Whitespace\" \ \"))))(Secondary((id \ - 4e3f449c-c053-4442-b560-e8ec3d77db20)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6649de5f-2a55-445a-9775-da3957a88578)(label(let = \ + 345852c2-45de-4087-8256-52e284d261d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0a12dd2c-678e-4455-bd6d-5bc663e5dc56)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - e964dd37-4a98-4fa1-88c0-fb948b0f0c49)(content(Whitespace\" \ + 940e0344-3330-4333-831a-4aea460376bc)(content(Whitespace\" \ \"))))(Tile((id \ - 36d9ba31-b1e4-418f-b940-d2d0ec7a1d07)(label(_))(mold((out \ + 339ffff7-2b83-463e-a854-3c3437ab5d28)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5e47205d-0076-4548-ba48-1a64b99e55fd)(label(:))(mold((out \ + f9197e5c-570e-4ed8-9a4f-29cc5f82adcb)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 634e5209-14b5-43cf-91f9-f14ed847a1e9)(content(Whitespace\" \ - \"))))(Tile((id 4037afeb-e36e-4302-85e7-acf5d9d94468)(label([ \ + e48bb0db-e22f-4d30-8935-f1995d203638)(content(Whitespace\" \ + \"))))(Tile((id e17ae24a-882d-4d6a-9868-25a53e79b1f4)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Grout((id \ - 6adf8caf-e8c9-4693-b6f5-e3ce2ec3f28a)(shape \ - Convex))))))))(Secondary((id \ - 34e5d96f-59dc-4c14-9bba-f0168d0cffd4)(content(Whitespace\" \ + 55f3712a-4eef-46b6-b366-10689ac5fe5d)(shape \ + Convex)))(Secondary((id \ + b62188de-58cb-451c-bbec-10b95d861d0d)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + 0e9b0fa8-2a42-40ee-9b1f-3df9310411ce)(content(Whitespace\" \ \")))))((Secondary((id \ - 29a44afb-3ecc-4b0c-9fe7-fcd55d232c0e)(content(Whitespace\" \ - \"))))(Tile((id 6d08adaf-f1db-4c8d-b60d-95e50086a9d5)(label([ \ + 05e3daf7-8ef4-472f-a181-3f8844bbd44d)(content(Whitespace\" \ + \"))))(Tile((id 381b65da-24d4-4d0a-a530-74f29497b0da)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - d38f39c9-cd02-4eef-a969-312735a9f93b)(label(1))(mold((out \ + ab7bdb41-74f4-422c-8a53-61c996a9fe5e)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f2e8fe38-23aa-4416-a2a6-dc0ce67a8cff)(label(,))(mold((out \ + 86ea2bc8-08b6-4689-a027-a44ba1212a79)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4f4fef1a-3da1-4ffc-b2bb-34b32a42c9af)(content(Whitespace\" \ + 2dff3c19-e5d1-4326-8692-b36e0db3a409)(content(Whitespace\" \ \"))))(Tile((id \ - e28e8421-7528-46be-bfc4-09e408b07328)(label(1.))(mold((out \ + a0bc5a40-469c-46f1-8955-5319a19422fd)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 896819e3-8d36-4785-99b9-5d6410bfc56f)(label(,))(mold((out \ + e75a574c-d344-44d5-8d7e-20ae67e3e853)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 259ec907-ea9d-40c2-8c89-79f929ca9b4e)(content(Whitespace\" \ + feee9ac1-d1ab-4645-b57c-7a03164d1678)(content(Whitespace\" \ \"))))(Tile((id \ - 89472fd7-994d-4d2f-88ce-c9fc76501ebb)(label(true))(mold((out \ + a35b9d67-d86d-4b06-9dd0-4d8be5399211)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - edfaddc8-18f9-4740-a0dc-ffbd73cf02b9)(content(Whitespace\" \ + 6497b3cb-a95d-4442-bcc3-d8090e2e5a22)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 910ce4eb-9ee6-41e5-93b8-88056d4f0a15)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ff9ec9a5-b43e-4997-a182-7ed5af4dc8a7)(label(let = \ + f8e9353a-b5b5-4fbd-8032-b39888fb9411)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7fd18fd5-b4a4-43eb-8749-0e5931a2c580)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 1872aef7-6646-4341-8f28-bd2be80aead1)(content(Whitespace\" \ + 4782f42e-6a21-48eb-bca8-a256a683ff8d)(content(Whitespace\" \ \"))))(Tile((id \ - c6ae5077-2701-4fc4-9276-3d9573e207bb)(label(_))(mold((out \ + 4f66a6ba-5b88-484a-9a2f-263ac3c401d6)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 962cd543-cc61-40bc-981f-016106c5feff)(label(:))(mold((out \ + df6fc56f-db6e-4c65-a21e-d6449d973b24)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e3cd3dea-e503-4cac-be45-4f0c496eae08)(content(Whitespace\" \ - \"))))(Tile((id 50d17fe0-ddeb-4dc7-b80f-44c8f0d9b4f5)(label([ \ + f57a9db2-4b27-4d4e-9011-a65d52f06c8d)(content(Whitespace\" \ + \"))))(Tile((id a5fc12b1-b444-47b3-be8f-64b0cf7c3db4)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 03711217-bb84-4d62-877d-c0e0260eb5f1)(label(Int))(mold((out \ + 89de9b90-f6f6-4cdb-887e-9ac4425f51df)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - b0a3d9fe-e02d-47c6-a664-371feb82886b)(content(Whitespace\" \ + 10368c5e-2795-4710-9718-7eecfcc31f46)(content(Whitespace\" \ \")))))((Secondary((id \ - 233e147d-69ff-4e5a-ba14-4ed62da9f7ff)(content(Whitespace\" \ - \"))))(Tile((id cb7ea76f-9262-4c3e-8ac9-c53322121ecb)(label([ \ + 374708fd-3c1a-4e62-a8c5-211cee8a2c24)(content(Whitespace\" \ + \"))))(Tile((id 0bc48421-27a1-4721-be67-208b92fd3629)(label([ \ ]))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Tile((id \ - 196648d3-e5a9-4947-8360-9f9a9da4654a)(label(1))(mold((out \ + 3ec40dab-a842-48f6-a98f-58c6c4ffc14d)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 12811791-9baf-4419-9595-cb4fb10cd330)(label(,))(mold((out \ + f52a6f4b-48e7-4790-b129-f7dfe605db12)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d5e8f98c-d849-43e4-8b37-0c292b1f3fb9)(content(Whitespace\" \ + 018e1211-5282-465d-aa1e-c01c5a5dd204)(content(Whitespace\" \ \"))))(Tile((id \ - 047516de-584a-4dac-9421-5977a1797f1b)(label(1.))(mold((out \ + 90aa3873-9c7d-42ae-9212-56d5ddb7be25)(label(1.))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8d9a3e7d-5b22-467c-8d08-dbab65b27f0a)(label(,))(mold((out \ + 2de8f116-03fa-4345-b8fb-409a2713a817)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f9f5fb80-80bb-49bd-87e4-3839751bdada)(content(Whitespace\" \ + a606263a-dd65-4228-9392-7320e56a049d)(content(Whitespace\" \ \"))))(Tile((id \ - 7263eb30-a357-4bc0-a921-be521a568292)(label(true))(mold((out \ + 5de1c5ad-a26e-4abb-84e2-9d8885d9c503)(label(true))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 2f193650-a183-450a-85fb-ff921d066e6d)(content(Whitespace\" \ + e11206dc-f3ba-4c8d-b9d7-3729a189997a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 575fdc65-0333-406c-bec3-7182d02b24c9)(content(Whitespace\" \ + 59804776-fbab-4e7f-b4c9-5170c38856cc)(content(Whitespace\" \ \"))))(Secondary((id \ - a6be38f2-b375-4cb9-a423-8a8a65a63a12)(content(Comment\"#2x \ + 49a27604-e1ec-4dd3-9ae0-508c79589a59)(content(Comment\"#2x \ err#\"))))(Secondary((id \ - fffe9321-e2b4-4d5e-bb2e-ad18dc3c1a5e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 606b85c1-8648-4240-ab55-04fc9dc8dfe6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 209259a6-47ba-4793-ae04-7a8f06ee093b)(label(let = \ + bd8644c6-63d6-4e85-b190-e9e79a73221a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 508de859-8307-4c8c-adec-531192ad39aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 09facb73-3cc6-4f2f-a2cb-849b8dfb8905)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f9ea7ac5-4b30-4c56-b41d-5a38f76829ff)(content(Whitespace\" \ + 075b678a-2685-4cb7-b20a-30ec25a8b215)(content(Whitespace\" \ \"))))(Tile((id \ - 6e671de9-1f9b-448b-9e15-a84a28c2d184)(label(_))(mold((out \ + f1fd4bc0-60a6-449a-9520-06e22dd15aae)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d0f6c712-29a5-458a-849d-f5177ae0e99a)(label(:))(mold((out \ + 3ca23a48-76b9-4bb1-b28e-63c4ba2ad8fe)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1eafacf8-ee21-4ed0-9406-d98be777cee2)(content(Whitespace\" \ - \"))))(Tile((id 35376f6d-1bdf-4267-b6d8-20b0b438896a)(label([ \ + f2b2ea56-5eca-4416-8fbf-3d5af26920e9)(content(Whitespace\" \ + \"))))(Tile((id 96f67279-339b-424f-a479-60000f7ed062)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 86903098-1546-4347-bc11-360aa9098c76)(label(Int))(mold((out \ + f3359e4c-cec1-4f38-8557-14bcf32567ad)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - dcc2b675-ad98-42e8-a243-f53e86576658)(content(Whitespace\" \ + 9daeb52d-95b6-48dc-a7aa-86925d532ead)(content(Whitespace\" \ \")))))((Secondary((id \ - 969762ed-babb-40fe-9f1a-9552903cfd8a)(content(Whitespace\" \ + 4b957fd9-eb4b-4937-8d0d-af987a62a66e)(content(Whitespace\" \ \"))))(Tile((id \ - 650b8d11-dcdd-4614-8611-6859baf55a66)(label(1))(mold((out \ + f09855d7-cd50-4a1f-9ed7-85bc7a93832f)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b3bb6263-8c54-4ec5-bb41-d6fc9f97fc64)(label(::))(mold((out \ + 1fe29849-3433-4740-997d-668eef8d71bc)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - e985fe27-f75d-4faf-86ea-ca7e1c996ff8)(label([ ]))(mold((out \ + fddd3561-51a2-491a-97e0-6893154e3b03)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9374efc6-637b-4fc2-9de3-f07405bbb3d8)(label(2))(mold((out \ + 7a30df1d-81b1-46fd-8c4a-bfdfaf7539fc)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a1610521-dbc3-4985-8f4e-a906256ac93a)(content(Whitespace\" \ + d9a4e603-08c1-48ed-b113-0009ac910bfd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5306ebd8-bb3f-4fb7-a852-095e09762309)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d3f479a0-cd47-480b-9805-094e92591f81)(label(let = \ + a4f64779-84df-4eff-ad25-7229fc9add4e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2eaa6225-8b50-4fac-af7c-cdf6ac0f02a6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - afd01019-a633-4e16-a005-0d68721528f5)(content(Whitespace\" \ + 5f0766be-60e9-482f-8a6e-6a64ce842de5)(content(Whitespace\" \ \"))))(Tile((id \ - 2d291ec6-4d51-43af-8afd-f687621533e9)(label(_))(mold((out \ + 6c0df814-7020-470c-97cc-0f341aca78f3)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7b11b2f2-73f8-4ebc-a307-b7fa6a911a0a)(label(:))(mold((out \ + fad6a5cb-f485-4b9f-82a3-b8320e4fa334)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 22f40e32-3b63-4aa1-af0c-0fa15beca6ff)(content(Whitespace\" \ - \"))))(Tile((id 8fc3fbe2-c648-4fb2-8959-5bcb25de2485)(label([ \ + 492524db-e03a-4c8d-9a86-b26f60766009)(content(Whitespace\" \ + \"))))(Tile((id 115fad2d-7365-4eb3-a443-de1405399eb7)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 85f9f8bf-bc3a-476f-a796-e53b510e5fc9)(label(Int))(mold((out \ + 6f8c6706-b54f-4238-a10a-ff9cf1665bef)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c9686799-83b6-4425-9636-ed16b688a3ea)(content(Whitespace\" \ + a3a40f71-1c95-4f85-96a2-fe2a8f17114f)(content(Whitespace\" \ \")))))((Secondary((id \ - 308d2aee-fbf0-4fbd-af60-21be975cec10)(content(Whitespace\" \ + b3ee84c6-5986-4301-8114-32bf685a1d09)(content(Whitespace\" \ \"))))(Tile((id \ - 62ffe449-0402-42f5-bdc4-a3d3cb9e0f55)(label(1.0))(mold((out \ + 474aa01d-ec29-4809-9449-d6bdcf751a01)(label(1.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9fc0cc53-1049-4bc3-9d39-40b42737c72f)(label(::))(mold((out \ + bf89fc82-3456-464c-8b15-538542e3e74d)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 9a2ec1a5-8eef-448d-b2d8-64b2360fee8a)(label([ ]))(mold((out \ + 9af9f47e-fb39-487c-b81b-d7595b7ed4ec)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e63b5de9-b0c8-404b-b2fe-08d050f37171)(label(2))(mold((out \ + d174f6ac-82a8-4e02-a620-0c5f4d69469f)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - afec12f2-fa36-4cf2-92a2-400301ab58cf)(content(Whitespace\" \ + d077972b-d5d8-4f44-9782-2eadffb6362f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f2f7a1a3-ca7d-468f-983c-9409eb28250f)(content(Whitespace\" \ + 8b3b7181-bdce-48f7-a421-444869d6724f)(content(Whitespace\" \ \"))))(Secondary((id \ - 10b89dca-d397-4e68-8b4d-508f49e4aaed)(content(Comment \ + 7fe3f81a-c96a-4136-930e-308dbe1b388a)(content(Comment \ #err#))))(Secondary((id \ - 19d8fd34-be37-4bf2-bb60-368822847164)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 97687bb1-54b0-42b2-8717-ed12f0fd022f)(label(let = \ + 843fd20e-f889-44d5-9b72-a22c3ff45ac3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c332994a-4006-41ad-9b56-aa50ab90e60d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - d2b796b9-1f73-49f9-a1e5-b9021787a084)(content(Whitespace\" \ + be403d06-669b-481c-9837-90f26e2f9277)(content(Whitespace\" \ \"))))(Tile((id \ - a575f95d-135a-4915-9f8b-76eb3ecba427)(label(_))(mold((out \ + 58666b1c-385c-4fcf-bace-08d280664e93)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 8a3492e6-684d-4cb3-ab42-48d03d9cdb1e)(label(:))(mold((out \ + 0b67de8b-c914-41d4-aded-0de955e9e96f)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b949ac5a-f020-411a-bb2b-b2f97258c456)(content(Whitespace\" \ - \"))))(Tile((id 7ac83a5f-90c3-47b9-b6ac-5b0e3dd9619c)(label([ \ + 383def64-d2d5-49e7-b908-233f1356abd0)(content(Whitespace\" \ + \"))))(Tile((id 959d1342-a60f-467c-9e6b-736a06e3b167)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - f8d85fc0-3ef4-4595-a3a0-d20bfa7f4411)(label(Int))(mold((out \ + ed75b169-9e3e-4614-b0ab-bd533e3cb14e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - f184710f-0527-4bdd-809b-4ef02b2486a3)(content(Whitespace\" \ + c081f642-8c3e-44c5-ac73-7096709f2140)(content(Whitespace\" \ \")))))((Secondary((id \ - a089176e-afcf-48a3-8a4e-0938a110f3e7)(content(Whitespace\" \ + 7a586f57-38eb-45d4-b816-acb66c51c1b4)(content(Whitespace\" \ \"))))(Tile((id \ - 24b9cfb9-95aa-4a5e-9a3f-b725d704e8f6)(label(1))(mold((out \ + 9763aeaf-c06f-4b68-a254-a74077d5e931)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e01f1339-3449-42f3-9b06-4b0cbff8632d)(label(::))(mold((out \ + c6fb1be3-3c11-4f07-9fde-7dee7f515a86)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - f6f405c8-481e-44a0-b4a4-6e164add4bef)(label([ ]))(mold((out \ + 4560f41b-0387-4d28-925d-c84471ac0707)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9d9f1bab-a60a-44db-a8ed-a22f022ede3e)(label(2.0))(mold((out \ + 686f2d71-762a-4ab2-aa74-49b68f2c06bf)(label(2.0))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 01d617f9-da2e-48f3-8902-e101d8213b42)(content(Whitespace\" \ + 0be59aeb-1745-4b49-bbb6-8fde7dc8189e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 83b2a78b-d0b2-4163-a0d4-edf81a25ace3)(content(Whitespace\" \ + 863e7f16-0102-446b-b2bf-8b0a77ba6cde)(content(Whitespace\" \ \"))))(Secondary((id \ - 762aabcc-7a53-401b-bc1e-4915309e5dce)(content(Comment \ + ae46b032-fb59-479e-84bb-18846b40ac4a)(content(Comment \ #err#))))(Secondary((id \ - 47755866-0bf9-45ed-b727-45fbf52eaad1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bbd01a32-cb8d-47b3-8c84-e077c869a585)(label(\"\\\"BYE\\\"\"))(mold((out \ + a8f1d162-0617-4555-b6cb-a3921504c7fc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c50d9505-c1c8-4d29-84d6-fa5b82723196)(label(\"\\\"BYE\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ - Outer)(projectors()))"; + Outer))"; backup_text = "# Internal Regression Tests: Type errors #\n\ # Each line should show errors or not as indicated #\n\n\ let _ = unbound in #err#\n\ let Undefined = Undefined in # 2x err# \n\ let true = 2 in #2x err# \n\n\ - let = if true then 1 else 1. in #err# \n\ + let = if true then 1 else 1. in #err# \n\ let _ = if true then 1 else 1. in #err#\n\ - let _: = if true then 1 else 1. in\n\ + let _: = if true then 1 else 1. in\n\ let _: Int = if true then 1 else 1. in #err#\n\ let _: Fake = if true then 1 else true in #err#\n\ let _, _ = if true then 1 else 1. in #2x err#\n\ - let _, _ = (if true then 1 else 1.), in #err#\n\ - let _: , _ = (if true then 1 else 1.), in \n\ + let _, _ = (if true then 1 else 1.), in #err#\n\ + let _: , _ = (if true then 1 else 1.), in \n\ let [_] = [(if true then 1 else 1.)] in #2x err#\n\ let [_] = (if true then 1 else 1.) in #3x err# \n\n\ - ( )(if true then 1 else 1.);\n\ + ( )(if true then 1 else 1.);\n\ 1(if true then 1 else 1.); #err#\n\ (1)(if true then 1 else 1.); #err#\n\ - (fun -> )(if true then 1 else 1.);\n\ - (fun _ -> )(if true then 1 else 1.);\n\ - (fun _: -> )(if true then 1 else 1.);\n\ - (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ + (fun -> )(if true then 1 else 1.);\n\ + (fun _ -> )(if true then 1 else 1.);\n\ + (fun _: -> )(if true then 1 else 1.);\n\ + (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ let _ = fun x -> if true then 1 else 1. in #err#\n\ - let _: = fun x -> if true then 1 else 1. in\n\ - let _: -> = fun x -> if true then 1 else 1. in\n\ + let _: = fun x -> if true then 1 else 1. in\n\ + let _: -> = fun x -> if true then 1 else 1. in\n\ let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ - let _: -> [ ] = fun x -> if true then 1 else 1. in #2x \ + let _: -> [ ] = fun x -> if true then 1 else 1. in #2x \ err#\n\n\ - ( )::[(if true then 1 else 1.)];\n\ + ( )::[(if true then 1 else 1.)];\n\ 1::[(if true then 1 else 1.)]; #err#\n\ (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ - let = [1, 1., true] in #err: inconsistent#\n\ + let = [1, 1., true] in #err: inconsistent#\n\ let _ = [1, 1., true] in #err: inconsistent#\n\ - let _: = [1, 1., true] in \n\ - let _: [ ] = [1, 1., true] in\n\ + let _: = [1, 1., true] in \n\ + let _: [ ] = [1, 1., true] in\n\ let _: [Int] = [1, 1., true] in #2x err#\n\n\ let _: [Int] = 1::[2] in\n\ let _: [Int] = 1.0::[2] in #err#\n\ @@ -14981,1726 +15067,1728 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - fdd8583e-681a-479a-b82c-70150ec064e1)(content(Comment\"# \ + 579a2658-f19d-496b-83bb-3840422b8218)(content(Comment\"# \ Lambda Calculus via evaluation by substitution \ #\"))))(Secondary((id \ - 672d5842-e58a-4612-9844-4269ee7ec11a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 422c29b0-af9d-413b-aa29-4d49c8355499)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 49e56481-afa9-40f7-81ce-6895a7da0e43)(content(Comment\"# An \ + 58d3c269-21cb-4b04-839c-d1e745cd6c9a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b3539b17-f970-4b91-a865-6f442db15e21)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 53f9307e-6888-4508-86de-8c15c2a0b734)(content(Comment\"# An \ Expression is a variable, function, or application \ #\"))))(Secondary((id \ - fbd5a058-1871-45ad-94b6-89b0f9083ea3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d17da4bf-78d0-416e-8038-45b303bcff27)(label(type = \ + c9014d63-730a-4661-b521-6b44ae002db9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 3b6f8f45-d98f-453f-815a-57eaf3789cbd)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5440ba19-b7d9-47b3-9c6d-d9882a8ab04c)(content(Whitespace\" \ + 904b8eb7-4c19-4abf-8637-740ad6c6186a)(content(Whitespace\" \ \"))))(Tile((id \ - ab03c617-2fa7-4ca7-a14f-79867c5b6e7b)(label(Exp))(mold((out \ + 66b489b4-bfd2-406f-810e-f47537d21ae6)(label(Exp))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 8fe8f05c-03aa-4383-b082-b0fddfbc6534)(content(Whitespace\" \ + 6d84ad07-906b-4b91-9aa3-18e606c93cf1)(content(Whitespace\" \ \")))))((Secondary((id \ - 416f926f-55e5-4941-adaf-13964a326bb8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 61827c81-4cc8-4200-9e10-1b9f29ad0978)(label(+))(mold((out \ + e23cac29-dd75-4613-93c9-77f014f56f31)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 81ac84c9-29d1-463c-941e-57b267719ff3)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8f17dd89-3a5d-4c11-846a-cbb418e5aec1)(content(Whitespace\" \ + b4a22f35-2ed9-430f-919e-b2ee80cee5bd)(content(Whitespace\" \ \"))))(Tile((id \ - 07143b7b-1a51-44cc-8d64-453a930f8c4f)(label(Var))(mold((out \ + 8b41055c-70d6-45c2-940f-5c2d826e61db)(label(Var))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d7508e69-bd9f-4d04-88f8-e410491faaee)(label(\"(\"\")\"))(mold((out \ + bb5c65e6-bd07-41b2-a344-a687b0f42718)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 299ce88d-c7dd-4e7c-b3ff-acff6f79cf71)(label(String))(mold((out \ + 6eac0ae4-7b36-443a-88c7-509db5d45436)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 073bb3d0-5742-4e74-aec0-7722a4b4e070)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1a63497e-19dd-404b-99d7-7fc1aadd3a1e)(label(+))(mold((out \ + 354cfa7b-69f9-4d5a-83d6-0a2c199a74c3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 35331ee6-8a63-44da-9424-40ac844466c4)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 44746e59-ab93-4aad-8f18-0e4997eeea05)(content(Whitespace\" \ + 65a261a6-148a-4d37-9ab6-93756a5bc85a)(content(Whitespace\" \ \"))))(Tile((id \ - 14f98ccb-5b30-4bc2-89ad-7aa385523779)(label(Lam))(mold((out \ + e25ed46e-a960-4707-bc68-c0b815371fc1)(label(Lam))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - a74092d3-71ab-49a8-84bf-db34d86a78e1)(label(\"(\"\")\"))(mold((out \ + 36db6124-df59-471f-94fc-3a309d41252c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - fb77a9de-4162-4ed1-b98a-8d0d58086761)(label(String))(mold((out \ + 93389af3-f3ed-495b-85cf-3982c385fa1e)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 62f8ada6-cd85-47d9-a868-381e21fdcb1b)(label(,))(mold((out \ + f32f8b6d-872c-441c-b5f3-77d23dc887e8)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f312e16b-4994-4e39-a319-70adedb1446e)(content(Whitespace\" \ + 3f06cf74-6b7d-47c6-b07f-05c09466cc24)(content(Whitespace\" \ \"))))(Tile((id \ - 617027c0-7107-4bb5-8075-dc78d7121a61)(label(Exp))(mold((out \ + 82369742-b375-4963-99a3-f73ce9d30508)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3e95325e-7507-4faf-bb37-1286caa94fa5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f1ffc168-f8b5-4b91-8a89-b3a061454b3e)(label(+))(mold((out \ + 5be3a31d-1b8e-401e-bde0-14ded0a7ff4c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9246efbe-34a1-41f7-92bf-41568937b53a)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - dfdf7175-7c19-4f50-b5fa-2b164533cbeb)(content(Whitespace\" \ + 68ef1881-fac3-41c7-99ef-a9243d67551f)(content(Whitespace\" \ \"))))(Tile((id \ - 00675cd5-f48e-47d1-b452-afc6068a5023)(label(Ap))(mold((out \ + e8e6e9f3-3788-4813-a8ec-850f7cbe3241)(label(Ap))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 2b6c9e05-12a7-4343-aaf9-0c34af10446f)(label(\"(\"\")\"))(mold((out \ + 2680b9e1-85d9-4910-bfb2-176f29dfa383)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 73b1a0bc-56f4-467e-bed2-9876c4994866)(label(Exp))(mold((out \ + 73ed87ff-dd1a-4f71-aa3a-5dd42e15b926)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b58fcef0-f7f9-42bb-8445-fba173d1b743)(label(,))(mold((out \ + 442dcc5c-8386-4ec1-bc9f-2685b18ab7d0)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - efc37e05-8b7c-4233-a549-6c264507f440)(content(Whitespace\" \ + acf2010e-395f-40c6-a340-59ef389a3e49)(content(Whitespace\" \ \"))))(Tile((id \ - d00b4453-2675-4d36-b92f-48e816e361c1)(label(Exp))(mold((out \ + 7e9227bd-8441-4fa9-9c16-024a91a9e513)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - ec0b546c-b58c-4df0-b28b-fb7e2ca0d2a1)(content(Whitespace\" \ + 39e00c73-a5a2-4249-a0ae-df55a1f0f6b4)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e51bd23b-e7d6-420d-ae5f-96d2383b3d70)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f5a4fa9c-29ab-4f6e-8b8d-58f37326c878)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 17059ed5-6772-466b-a113-a6c34e13d7bf)(content(Comment\"# \ + c2faba41-d1f2-4720-8245-64f06fc2ce13)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4baf2caa-6b6d-4546-b6a2-0cfa47a86289)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 18808867-1152-40f9-ad32-2c142d01d247)(content(Comment\"# \ Syntatic Equality of Expressions #\"))))(Secondary((id \ - 9c98c0c6-2a63-421d-adc9-6d19c37938cb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3e8e28a5-0433-4c8a-a4b9-7c31994001fe)(label(let = \ + 7b04a7ea-2e9a-45bc-bd28-01ca94ab1ce5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9af020ec-3e6a-42b5-ae4a-4416f5b8141a)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f51bcf44-0c1d-4a72-b70f-0db00618028c)(content(Whitespace\" \ + 891fac75-70a7-47a2-ae6c-f264a06875c1)(content(Whitespace\" \ \"))))(Tile((id \ - f6056ad1-996f-4e9f-9856-d1276ea3f8b6)(label(exp_equal))(mold((out \ + e4ca9d4f-8942-4826-9fd7-757ca711a3e2)(label(exp_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5455697a-ba89-4b34-836d-374216fc7f58)(label(:))(mold((out \ + 3505d0bf-0ff7-4e6e-8e69-bb2a191cf4d4)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 60a7568c-b9f0-476a-862a-3cbca4875455)(content(Whitespace\" \ + a497eb20-cf3f-4ef7-b165-45a9e855923a)(content(Whitespace\" \ \"))))(Tile((id \ - 4ff58b9f-2c02-4138-8c7e-3066ddef752e)(label(\"(\"\")\"))(mold((out \ + afe12787-4b57-49c8-baed-316afa71c5fc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 0917f481-96ed-41ed-9e8f-e9edc5b0cff1)(label(Exp))(mold((out \ + 192cce66-f0d9-4434-b6d1-7aa733083586)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 871ebb1d-9d1d-4efe-8362-a97fe5e31385)(label(,))(mold((out \ + 8063def0-fde4-4cab-a9c7-fc7b3f962da9)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2bbb242b-914f-45b2-85e7-2d3bb485f2d8)(content(Whitespace\" \ + 7db42639-afc1-4b83-9b03-639d9edb28b3)(content(Whitespace\" \ \"))))(Tile((id \ - f08f7920-8033-4553-87e0-ea4a3d558213)(label(Exp))(mold((out \ + b2dc55fa-30a5-4cc6-84f7-4c46ad679c4e)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 2dc8ca67-c93e-49ce-b076-a3f193f09180)(content(Whitespace\" \ + d0a96d6b-dff9-48dd-b423-a5968f7e4aed)(content(Whitespace\" \ \"))))(Tile((id \ - f69a5837-9fd6-4587-a2a9-7fe112955047)(label(->))(mold((out \ + c1175695-ebd5-427d-92d3-fb22474cc58c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8bfeb672-bbcf-4d06-a77a-0c348a34ada8)(content(Whitespace\" \ + 770f873e-d093-4861-bee2-11d454695ca5)(content(Whitespace\" \ \"))))(Tile((id \ - 315b5478-3c3f-49e8-954e-178695fab404)(label(Bool))(mold((out \ + ad33920a-601a-4246-9426-7eb90bd7571f)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - bbf80d66-def4-4c91-9f81-b3fcf62e5550)(content(Whitespace\" \ + 05298787-a73a-43ab-8ffc-1046f3fc8b05)(content(Whitespace\" \ \")))))((Secondary((id \ - b84cd083-96f3-4983-922e-c092b17fb028)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f466bc3a-8b6f-4a85-858b-61be4e47e62b)(label(fun \ + 184629c3-7fad-4f2b-9c53-a74ca7a3d63d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 98082679-8cc9-4d38-abe5-4ac6e4cea1cd)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6beeed0d-f3ef-4ff1-9b9c-7fa343ef214a)(content(Whitespace\" \ + 9ec23bc0-f548-42a0-b241-aa75d9fa6527)(content(Whitespace\" \ \"))))(Tile((id \ - a101d38a-d880-4637-a78f-f256127958bc)(label(es))(mold((out \ + 689fed0b-30e9-4ca4-8fe6-fda72c60e103)(label(es))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ca9a7df9-b73e-4eb3-8071-acb2647fe361)(content(Whitespace\" \ + 793d6fcd-45b8-4d78-a38e-d3fd69ca38a7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f068f7f9-a5a5-46d6-8beb-71eb1c18097c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 36ef4244-6c86-4e22-bdb9-aa8a729d1a6c)(label(case \ + 3ac5410d-2711-4db4-9ed1-d65e01c6903b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 180d0645-b358-424c-b871-1289619589bc)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e5ff56e5-3143-46fd-a6ee-8a8cb2f5a056)(content(Whitespace\" \ + 75d98680-2cfe-4d2c-8005-6f770a2c4a58)(content(Whitespace\" \ \"))))(Tile((id \ - e7574986-d77b-40ba-a5e3-e386c6db3c39)(label(es))(mold((out \ + 4d98706e-25e6-4404-bd81-b4c19b19db2d)(label(es))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 225a8cd6-60d1-4c61-a5eb-f8621e15ad6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b68ac9d7-a430-4be2-a5f4-1c04ad598795)(label(| =>))(mold((out \ + cb5d85d8-6c5f-4d35-acf9-2716f96c11fa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f018da47-6f03-4d21-9a18-320122d8ce0d)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e3768340-9ef3-4649-a14c-7207c6742c0b)(content(Whitespace\" \ + 6c565fa4-0199-4227-aad8-50f82c08dad5)(content(Whitespace\" \ \"))))(Tile((id \ - 190016bb-7f5a-4e72-9a77-1f3bd3d7502c)(label(Var))(mold((out \ + d6605b32-8436-481e-a4ab-66074fd68305)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9c6733ce-154e-4688-b0c0-9c2a5eea8d72)(label(\"(\"\")\"))(mold((out \ + dee86624-d32e-4e70-8edd-d4e7d58d37f7)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - cd49e6ba-c89d-452c-8305-bbfb7dac2381)(label(x))(mold((out \ + 13b4fe0e-bcaa-4283-8f3f-a0e13dcd40bb)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - bccb164f-54cd-47e3-b484-7c0cf7d3f56d)(label(,))(mold((out \ + 493926e4-6cbb-44cc-b206-ead1cec82092)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 1ff8775b-ad8f-4ecb-9898-ad245f7ab91a)(content(Whitespace\" \ + 05377add-3eba-48f8-ada1-26eb74fbc3c0)(content(Whitespace\" \ \"))))(Tile((id \ - d5514d67-6f7d-42d4-b896-d25582177d10)(label(Var))(mold((out \ + 7945262f-0e83-4a65-a946-bdab7b39424f)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 340f0ace-29d3-4a3d-bd8e-12c61aee3e6f)(label(\"(\"\")\"))(mold((out \ + 8de1adaa-fa8e-48ce-89ac-d903791c65a7)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 47b2c918-cd20-4414-8f82-320bfaebd061)(label(y))(mold((out \ + 322e956e-a064-4731-8ba3-7b5ded46b0b0)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 94ade3ba-00f3-4dfe-9561-ddc4149a3e56)(content(Whitespace\" \ + 9707713c-a669-437d-9447-58713fb6b8c5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ebb99665-2d12-47d9-bae6-977b1ececb43)(content(Whitespace\" \ + 482ff6f8-2d76-455d-9a94-a1c09b073eac)(content(Whitespace\" \ \"))))(Tile((id \ - 300de022-75e4-4203-b018-600080222882)(label(x))(mold((out \ + ab0ffd4a-8d3a-47d8-9149-2d2b96c45204)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d68f4335-003f-4680-a5bb-9ae0d3395c95)(label($==))(mold((out \ + 309d2d36-e859-448d-a80c-cea3bc9d3454)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 56edde47-e4f1-490c-946c-301e235c8112)(content(Whitespace\" \ + 13d30f0b-ebdb-4498-b392-8aa47b849281)(content(Whitespace\" \ \"))))(Tile((id \ - acf78d5a-547a-478d-a8a6-e09c69201f49)(label(y))(mold((out \ + 32f78d11-4e5c-4bb8-b663-75936231f228)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 79839a3f-5859-41cf-a6e4-9b51af933d3e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 246f4d14-c501-4973-8919-b4de81fda419)(label(| =>))(mold((out \ + a6b02ca9-65a3-423c-8a2d-98b69271daa7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 315a9b91-39f1-4001-9c52-3ee45f73989f)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2056b94b-ca4b-47ea-9794-938b8910b731)(content(Whitespace\" \ + a6917a08-5b7c-4519-a67d-4ea8a31932a6)(content(Whitespace\" \ \"))))(Tile((id \ - 601f5e03-d97e-4b54-9267-523f4bf14797)(label(Lam))(mold((out \ + 58e1ac3f-e659-4372-9510-386d7ebe50f7)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 27155d6d-9954-4c1e-b56b-829d8b28bc0c)(label(\"(\"\")\"))(mold((out \ + 073c5366-7d94-470f-adb5-f383a9eaa4bb)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - fa8be50a-e163-4554-8bea-2f64631fc090)(label(x1))(mold((out \ + 9b281aa5-8d06-4714-9cd2-ffab5b0c71ea)(label(x1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 99102500-9dbb-452e-b577-d0e816c9c67c)(label(,))(mold((out \ + c618ba26-4a6e-4726-bad5-90f9983e6fe5)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0f26f4cd-8687-4898-a5c9-5a1d964486a8)(content(Whitespace\" \ + 29339c3b-fb4e-41f4-8cd4-cad7426fa6c1)(content(Whitespace\" \ \"))))(Tile((id \ - badd3cfa-437b-4c24-b344-d64db5ca6fab)(label(e1))(mold((out \ + fc86dc77-9c0b-4a37-987a-6b9f83dfcd7f)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 53d052fb-ed5f-4e70-bc43-56f34e34108b)(label(,))(mold((out \ + be7a697f-0d3f-498c-b036-bed60ec00fdd)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9ae13cee-7415-4617-90c1-41051572b40a)(content(Whitespace\" \ + c4083882-1dae-4651-ab52-c9b1c4e7ced1)(content(Whitespace\" \ \"))))(Tile((id \ - 98a89911-7079-484f-a8fc-fd33bfda515d)(label(Lam))(mold((out \ + 42b509d9-0759-480f-857c-3d82df96e158)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 12d8a536-43f5-461f-87e9-fdb024bfba72)(label(\"(\"\")\"))(mold((out \ + 02429a5b-fff7-4b42-a5be-9acd44a729fb)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 80d877e6-1597-4b64-8715-257ceb6c46e3)(label(x2))(mold((out \ + c76367a5-6ef8-41f5-9599-faf285ff1878)(label(x2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4d7b2326-17f9-42cf-a815-10cf24c8ae05)(label(,))(mold((out \ + b7b861e4-22d0-437f-bd2c-95d57d7370fc)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - dad4dda5-6e73-4c83-a92c-767cf3ebe147)(content(Whitespace\" \ + b7609391-f2ce-4d1e-bbe6-3a25fa099458)(content(Whitespace\" \ \"))))(Tile((id \ - 745be5b1-748d-4354-8839-d5b4641adab5)(label(e2))(mold((out \ + f3d69f1d-8f6b-4095-a97e-d6e61d97b4b7)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 410fbca2-0acc-4a55-a0fb-98c8c2cbd324)(content(Whitespace\" \ + 0e5305cd-0907-4947-87e9-37da9fcc349d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 78e09b69-587d-48fb-b778-a02b38f412b7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 11f7f15a-84e1-4e34-932c-de815d268393)(content(Whitespace\" \ + 143d94d0-7ea4-4f2d-b70e-e23baf9cd31a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d264c081-8f4b-4254-b6a9-de34f5286a6c)(content(Whitespace\" \ \"))))(Secondary((id \ - 13b24012-476a-4a90-a87a-5d2a16d6c8c5)(content(Whitespace\" \ + c9d7e936-7bc6-4e4e-b0c2-ce0e25fa93e7)(content(Whitespace\" \ \"))))(Tile((id \ - c632c226-1d69-4ead-9733-862140256a54)(label(x1))(mold((out \ + 34583060-75ce-4137-802e-b2a55ff9645e)(label(x1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7e61ca4d-01fa-4b3b-817a-d15fdf27bd12)(label($==))(mold((out \ + 8f95d04f-b61b-4abb-8b77-3d8e0d535d88)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ba82b66f-bf41-443c-a23c-551ae570dcc6)(content(Whitespace\" \ + 0938c068-c702-468e-b785-cf7004de3ca2)(content(Whitespace\" \ \"))))(Tile((id \ - 01976f6d-75c4-4a23-ab9b-2f6bb43d053e)(label(x2))(mold((out \ + f7399b45-070e-47bc-949f-88f0ea9efc49)(label(x2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5a6b9c2a-3e90-442e-95fb-8795edce7e9c)(content(Whitespace\" \ + 62f423d3-1612-47e6-923e-bbae907e2a35)(content(Whitespace\" \ \"))))(Tile((id \ - b7fbb738-cf08-46e2-95f7-9f2d7449da44)(label(&&))(mold((out \ + 63b9d6fd-d888-47b4-8364-49366bc74d65)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - cac711c3-2b8f-4240-92e3-6be062f58fda)(content(Whitespace\" \ + cc2ac2c0-43d5-4ce5-a451-18c097e284c4)(content(Whitespace\" \ \"))))(Tile((id \ - d4642fb3-d50c-4315-8c6c-a8cfa3eea5f7)(label(exp_equal))(mold((out \ + 787f8c3c-346c-4f69-a3d8-14f0ea05d731)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 33b9f05a-00cf-476a-8684-5c5862370385)(label(\"(\"\")\"))(mold((out \ + 70ed7427-b523-4292-9805-08aaca91925a)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - be5b50f3-9ae3-4193-9673-f8c7cfe4a945)(label(e1))(mold((out \ + fb775b01-d8c1-429f-9bcf-f6072243ecfa)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 78789f46-c6a1-424a-b839-89619f337adc)(label(,))(mold((out \ + 71bfde98-6188-4e39-8718-53ab06960fd7)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 75d018d5-c940-4771-8fb5-441d71c3d5d2)(content(Whitespace\" \ + 107a49d0-6226-4c20-b01d-2d186724b94a)(content(Whitespace\" \ \"))))(Tile((id \ - 4078c96f-6b4b-4183-a5c1-23fecf9e6e83)(label(e2))(mold((out \ + 83a585a9-cc40-4183-9910-b70254b15874)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e7af7359-b810-42f5-9d11-9de186bc71f1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1b58e4f3-cb22-4b18-95d4-976e0773a063)(label(| =>))(mold((out \ + d387e36c-ec5c-4782-9d1f-2739c7a7634b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + af626056-2da3-4259-a568-1f8298527f08)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b07dc16b-3745-4cb9-9191-2f353ef155b2)(content(Whitespace\" \ + f58409e9-8883-4d5b-a2fb-238bdcd2f1a9)(content(Whitespace\" \ \"))))(Tile((id \ - 22224420-1665-40fe-bc4c-cc6022149537)(label(Ap))(mold((out \ + 19d627fa-ff3f-4bfd-9b0d-e081a5f093cd)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 636c28ac-b603-448e-bcb8-ffd56e0dfaa7)(label(\"(\"\")\"))(mold((out \ + ecc7492a-35a5-48dd-b314-052701cebe01)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 07578600-2943-46a9-b35d-98dfe74b596e)(label(e1))(mold((out \ + 5634f8f7-a1cc-4d2f-a2d9-ee6dd302559e)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 82987d7f-d5ad-46d6-a050-11197761382a)(label(,))(mold((out \ + 319722e0-1df1-4ff5-85de-637f59e5c6fb)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - ceba5512-21e7-40af-b48b-5857a495e416)(content(Whitespace\" \ + 46f51f43-b3f1-4894-9c36-054921466663)(content(Whitespace\" \ \"))))(Tile((id \ - 7c36d83d-5edd-455e-a67a-bd8983cec466)(label(e2))(mold((out \ + c732f687-3289-4066-b86a-a2d013189e03)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - c829d9ad-6344-4b5c-8cb0-5b40ef52fb3e)(label(,))(mold((out \ + 366fdfb4-ed4b-44ac-9b49-f90cc6f46d8c)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - bf89abca-6048-4fd5-8b48-0db5dbd15864)(content(Whitespace\" \ + 836b7c9b-ed4b-4a8f-be0f-3ff6c4230d84)(content(Whitespace\" \ \"))))(Tile((id \ - 07b2845e-f9c5-4e3a-8235-6a682dd69ab7)(label(Ap))(mold((out \ + a876e608-fe27-4de6-9e60-ce7e6d046f36)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bc67d021-59a1-4c97-8984-2bbac2c8d4f8)(label(\"(\"\")\"))(mold((out \ + da2c7661-ffe8-4fdc-a9f0-0aecec3be262)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 38c962c5-be56-493b-a2e5-f0b2d9e6bd68)(label(e3))(mold((out \ + 9ed91e1a-c75b-48a4-b5aa-c96dd5ad2e82)(label(e3))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 81fea876-ca8e-467d-83f0-e24641ce6e16)(label(,))(mold((out \ + d18abadc-274b-4d01-a47f-745585122bd5)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - de2e8192-66a2-46b0-a6b3-67dd2ec836e5)(content(Whitespace\" \ + b0a80da2-1d57-4710-8cab-e7df5dc3c53e)(content(Whitespace\" \ \"))))(Tile((id \ - 84e87259-351e-4989-9d08-6887492aa5c0)(label(e4))(mold((out \ + 013f27da-4aa0-4581-b824-3e4f008684ed)(label(e4))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - c03b801e-425d-4a0f-9e5e-09f3a3724618)(content(Whitespace\" \ + 3e11240a-71fc-4de0-ba1c-b5d07365de39)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 99e0e359-1813-4dc5-99d7-4e60bcf12b74)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 20702186-5730-46ba-bee2-43084724d324)(content(Whitespace\" \ + 2f614776-e35e-462f-b803-96f9be39c6cb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 9a6e76ae-34e3-453c-b347-801f24f509dd)(content(Whitespace\" \ \"))))(Secondary((id \ - 4a30fcb0-6e37-4ef8-812f-1782bbb6c9f1)(content(Whitespace\" \ + 9488f1ca-eb41-49a0-a0f1-90e9f1864458)(content(Whitespace\" \ \"))))(Tile((id \ - 1f1bab64-3c2c-4eda-8acd-9c090e71f0d3)(label(exp_equal))(mold((out \ + 7750c1a4-f4cf-4976-a9d3-86c65c012652)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 178e43fa-f170-4467-9ba4-8becd467b038)(label(\"(\"\")\"))(mold((out \ + ba7b5f88-404a-42b1-a8c4-b654f3dc59e5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 17b29792-356f-43df-a878-ae1b07162c7c)(label(e1))(mold((out \ + 50c34596-30b6-4b5a-87db-27f96170b6a3)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 49857faa-9a2e-4411-9bd0-3c8f9bdd7c59)(label(,))(mold((out \ + c95da88e-6a74-48d8-9cf6-c605d5c3a701)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1e1d0155-3f97-449a-b46a-bf89789692c3)(content(Whitespace\" \ + 00c73886-9a6c-479a-9a0d-be062ea3910f)(content(Whitespace\" \ \"))))(Tile((id \ - 82f3843b-4ce0-4184-9ee6-47df550a1f1c)(label(e3))(mold((out \ + 26d9bb64-0a0c-4be4-9464-4569661ccf02)(label(e3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 4d036eb9-5fd3-40e7-953d-03feb209158d)(content(Whitespace\" \ + d1c5b415-ed05-498d-bce0-9de00a700394)(content(Whitespace\" \ \"))))(Tile((id \ - a9e80db6-93f0-47da-b48f-3bb99bb2fb62)(label(&&))(mold((out \ + 08303392-a90c-4d31-814a-2a051d9667b0)(label(&&))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f5659aaf-ab00-4145-9c3c-e0ca744fdaa9)(content(Whitespace\" \ + e7677fe6-48be-4899-9e0f-e1b29280e44a)(content(Whitespace\" \ \"))))(Tile((id \ - 46ba930c-5ce2-4256-91b1-91f5fc90336e)(label(exp_equal))(mold((out \ + 516eabb3-4a51-4c59-9940-c492b45f3efe)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9476c40e-8955-4767-ab58-5dbb6591f30e)(label(\"(\"\")\"))(mold((out \ + e68b5ecb-929f-4854-af5a-024f13d8be93)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 52e02080-25cb-4536-8754-367e8af3d333)(label(e2))(mold((out \ + 83fa3d15-4b89-45be-965a-227e4fb29bc8)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dc571ab1-daa7-4876-841f-e8c87050127f)(label(,))(mold((out \ + 3d8e63e4-3075-4185-806e-303e0c85fbf7)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 534a7b32-5205-46b5-b718-55e268cc2a27)(content(Whitespace\" \ + 2337432a-0774-4754-b172-a957d6a5c46a)(content(Whitespace\" \ \"))))(Tile((id \ - c8bba4ef-1b1b-4087-be66-68fc2bbd7a4f)(label(e4))(mold((out \ + 5d704e11-c851-4bee-bd41-fc97c530e003)(label(e4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 7660444d-7a74-4a21-9db5-7b72f351f7fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - da8732c9-313b-4f7f-9ed3-6c2681d9e9c5)(label(| =>))(mold((out \ + 7c28d9c0-a994-4ec0-a985-641ee916988f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 81be554c-d1ad-4215-874d-1f4b370c7ce5)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7db86218-e36b-417c-9e71-a45fac9d26aa)(content(Whitespace\" \ + 3f839aa4-9308-4b6b-a336-ddf2f5a35100)(content(Whitespace\" \ \"))))(Tile((id \ - cedbde71-9734-4938-90f3-6d6651c495cf)(label(_))(mold((out \ + ef9d6fc5-5b9e-4877-bdc5-bcb5edd5e202)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 2cb6f431-953e-4be2-bb1f-4c5155f208ab)(content(Whitespace\" \ + 4734e14d-af00-46ba-8a2c-29a40730d6bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ef30b00a-eb86-4dac-bde7-085db742d500)(content(Whitespace\" \ + d7c88fc6-e58f-42f5-9e34-6d7994d3726f)(content(Whitespace\" \ \"))))(Tile((id \ - a8da92e2-08bf-4228-8212-40eba7b3e156)(label(false))(mold((out \ + 710f92ac-46d8-4cbd-8289-d63621b6a898)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 26d8b9c4-e470-4283-bfc9-5eb1ed6ab37a)(content(Whitespace\" \ + d0c796b9-cf69-4f65-ba17-045f3f632ee3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 243c350d-2557-40a0-8dcc-b7fc8f4ed76f)(content(Whitespace\" \ + d2a47d78-3131-42d9-af47-7a0d98bebc8a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ba37c293-1afc-4401-9e5e-d4eb89f06d71)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - dade819a-140a-48cf-8d1e-bb1f45327d9a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c48d9687-6480-416c-8ad0-3a529f8dcf96)(content(Comment\"# \ + b54c98e0-13ad-4880-9974-791df224ef2a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3da9af7c-a6d2-495f-80d8-adf3cadde53b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 774b07c3-7264-4e6a-a5c9-d702263f7167)(content(Comment\"# \ Substitute Exp v for variable name in Exp e \ #\"))))(Secondary((id \ - 2be5176f-b45a-4a79-9385-6e5a58146952)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ec85c58d-0eb5-4688-8a20-2f3a37470588)(label(let = \ + 426539c8-aaf5-4b69-869e-f7bafc266eea)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 74de8fc5-e81b-4634-b34f-da0dbc8b0957)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 405ed07a-343e-4d9e-bb81-173ac6033950)(content(Whitespace\" \ + 352d8989-84fd-4829-b6cb-5bde729ace4e)(content(Whitespace\" \ \"))))(Tile((id \ - 09cd98fc-b113-4481-a30f-0bda33d20251)(label(subst))(mold((out \ + 6001c0ea-e744-4a22-aafb-7c59f5aecadf)(label(subst))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 08d03f76-6429-4872-991a-2b468ac362aa)(label(:))(mold((out \ + 02602783-0b3d-4b2f-844b-b12be8ed0722)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7628e6fe-2104-47e7-bd0b-c20227a40f69)(content(Whitespace\" \ + a5ed6ba7-8356-475a-a785-d85c450a8bd9)(content(Whitespace\" \ \"))))(Tile((id \ - 328b9536-3d8b-4f7c-b68a-da0a23be4432)(label(\"(\"\")\"))(mold((out \ + c039813e-48cb-4681-98d9-aa8217d8abf5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ed30203f-03ef-449f-adfe-921cd62e7c41)(label(Exp))(mold((out \ + 60f7f455-0187-401b-9f2b-ff349d842ebb)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - d82e22c7-b580-4303-9bac-4f5d4453533d)(label(,))(mold((out \ + f3e7b107-0331-4f65-b4df-85c8a3c7fa6b)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - bdc127ec-fbf2-4499-a5bf-a666ea2af5e5)(content(Whitespace\" \ + 5a467fb2-10e0-444e-8898-530358640fc5)(content(Whitespace\" \ \"))))(Tile((id \ - 072de18f-c83a-40e0-a592-bd85daa96fba)(label(String))(mold((out \ + de6c8d61-c9ac-4bd2-b234-cc4d7540bf25)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 15f5900c-c2e9-4752-9a5f-956e953c145b)(label(,))(mold((out \ + b07a020f-10c5-450f-9678-3a85e99f8624)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 32899a13-4f64-440b-b09d-c845e44c6577)(content(Whitespace\" \ + 8f362010-03af-4c45-8517-208f052ccb4a)(content(Whitespace\" \ \"))))(Tile((id \ - f0daa9cf-8daa-4478-afe0-3bd7ce6f9d7b)(label(Exp))(mold((out \ + 7ac6150e-560d-4d4e-9d2d-47a7e0542779)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - ff8e3c6c-56e9-4d9f-8024-b011f15334f0)(content(Whitespace\" \ + 4ce3976c-3a90-4642-8cb4-4bb534111764)(content(Whitespace\" \ \"))))(Tile((id \ - f9cbcd0b-8ba9-45b8-b5fe-2c5a8170cbce)(label(->))(mold((out \ + 8c17a6ec-792c-4afb-9b98-3e3981290e9b)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a6ceec37-01b9-438b-86a2-0694a666b49f)(content(Whitespace\" \ + 2901741f-ce3a-4628-9de4-84bdf8dc8813)(content(Whitespace\" \ \"))))(Tile((id \ - 3d0ab2af-5483-4f38-b6fc-22e157924b0e)(label(Exp))(mold((out \ + 297eefa1-4efd-450b-8aa2-f78566d739a2)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))((Secondary((id \ - 9a1dcba1-055c-4fc4-b242-5200a380b0f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fa1615bb-52f4-4b78-99b3-05dbfe25de1c)(label(fun \ + ab4e863d-fe5e-4773-aee7-47ea69e9a81f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 219a6daf-2bc5-4d0b-acf0-9dfc2d57fff8)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 839a5cee-8ebb-412c-a231-0cc551bf6c4b)(content(Whitespace\" \ + a196a02c-46be-4da2-9762-5c375d09afe7)(content(Whitespace\" \ \"))))(Tile((id \ - 143a5da1-6980-463c-a863-d94d4c4c60c6)(label(v))(mold((out \ + 71fc3e6a-b851-4014-8194-81012a9e6602)(label(v))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 662368dc-0735-472a-86c1-1429ed512726)(label(,))(mold((out \ + 4318d3e7-c631-4b2e-9a7a-0e5bc7898466)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - c4659fb7-f122-4580-9003-360e413c7321)(content(Whitespace\" \ + 1abe26ac-ac76-4d60-b72d-4c84b71df926)(content(Whitespace\" \ \"))))(Tile((id \ - d5ff774a-5a96-4921-927a-9259927970b3)(label(name))(mold((out \ + dc4f1bd4-abc3-4d55-b0ef-3d06e7d3d2f6)(label(name))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 380a4d3f-6f53-4c3a-9112-f9bea39f6a88)(label(,))(mold((out \ + a1ec902c-e5b7-42e9-b76a-e0f1c1ce1dd4)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 45d5df4d-3c7c-48a0-8c60-ed5a9c4b0084)(content(Whitespace\" \ + f39b26a7-18fa-4d6d-bc10-5a86815b580f)(content(Whitespace\" \ \"))))(Tile((id \ - 3f855486-d77e-4432-909b-36f7a94f2be9)(label(e))(mold((out \ + d0e16c86-d3ec-4e39-98e6-51ab274d8cd1)(label(e))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - c88c6844-f612-46b7-95f2-b8226bee9870)(content(Whitespace\" \ + e8c29ad7-e1eb-488f-9aab-cb88d6a08484)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c7a50681-ed66-4f3a-847a-1b26a93ac408)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b903c02c-0a26-44e9-9f91-cd9449dfcdf9)(label(case \ + 3de61dc3-139e-4ce5-b9c4-92c7d6a7a218)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 9b89f0ba-7886-4803-aa11-c1a693afc3a4)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 890404a0-7e77-4f23-af77-642cd92b6392)(content(Whitespace\" \ + 7becd8a7-6c1c-4f2f-9c6a-2637e7284820)(content(Whitespace\" \ \"))))(Tile((id \ - dfc0c313-ac0c-4946-9436-0604dac935a9)(label(e))(mold((out \ + 58e8f274-fa5c-4a08-a050-7840beca26df)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 6a99e493-0f22-402b-bff8-276c0c8ad5d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 26868137-c288-4b7b-bc52-34b7a6c21906)(label(| =>))(mold((out \ + c917b2fc-b1f6-4494-bae7-fdc5d8314ac0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ffee5d55-f2d7-4b66-91ca-e199c1eedd44)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7dcab924-6e49-4c56-9275-dd049573465e)(content(Whitespace\" \ + fa4628a7-b6e2-40a9-912d-9ab2003e66ab)(content(Whitespace\" \ \"))))(Tile((id \ - 57abb37f-f39b-4a70-b583-996c4acf6c4b)(label(Var))(mold((out \ + 4f300848-04c1-4d28-a9ac-34cb3d72005c)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5643dffa-f320-4c73-b1d6-bf7e716700a8)(label(\"(\"\")\"))(mold((out \ + 5d3a134c-3f74-4fdc-818c-037d3ee533b0)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 98ad8ffa-185b-45bb-b290-5daadf8a5744)(label(n))(mold((out \ + ff0ccc42-3ffd-4432-a1d6-a070e2b6f346)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 409a7cf0-2264-4eae-8dbe-42b831ef2331)(content(Whitespace\" \ + 1561ab66-303f-4871-9b48-1bcc763a671e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 33ebfbb6-01a2-4e2c-a342-c8f58e84286b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 871cce29-ba54-4437-b1fc-bef23daf029a)(content(Whitespace\" \ + 8b9692ba-3782-4f79-a2e9-2ab485357d4d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 96b3ae46-b8c8-432e-8dce-07b229df5a88)(content(Whitespace\" \ \"))))(Secondary((id \ - eb8f0198-3d20-43a0-83ab-86b86486231a)(content(Whitespace\" \ + 2f4a7d91-7dc4-4da6-8371-318822592b07)(content(Whitespace\" \ \"))))(Tile((id \ - ae135983-85c5-4852-a8d0-3c8d3c22e008)(label(\"(\"\")\"))(mold((out \ + 1aedd057-2c2b-455a-a1a2-b5f1e41909e0)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 95727d7c-7b5e-48a4-a717-0a0584880d07)(label(if then \ + 7738b2b4-d591-4ade-b3b6-f05b1907e6d8)(label(if then \ else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 23c549d8-9d67-4640-b7a1-a9aec6baa7c4)(content(Whitespace\" \ + b3306766-434f-425e-bf19-10aeaeec9b99)(content(Whitespace\" \ \"))))(Tile((id \ - 0f137ca8-4d4a-408f-857c-6d04255de5d5)(label(n))(mold((out \ + e7d7a06c-4c8d-4852-b69c-2c5a2836c7fb)(label(n))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 032e7f20-5bcc-4c1b-8fee-e96b955a83af)(label($==))(mold((out \ + 712dad6c-a685-4294-88a3-b79fc2e7950f)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b9d150c2-2139-4a42-907c-537c2fe6fde9)(content(Whitespace\" \ + 87e9ee65-9c06-42ec-acd2-b93b3f777c2f)(content(Whitespace\" \ \"))))(Tile((id \ - b1609e0e-338f-48a3-a852-ae6c44fc2071)(label(name))(mold((out \ + f9e3a6fb-5b11-49c7-b219-741d1ccbd526)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 83429fda-9b79-4f9d-9184-6f6c975b80dd)(content(Whitespace\" \ + 2dc75d3c-7a4f-4b64-9e43-01ac29e2717b)(content(Whitespace\" \ \")))))((Secondary((id \ - 9b565b86-9bdc-4381-8a71-3001049f21dd)(content(Whitespace\" \ + 4683c684-877a-4546-a637-a5a8a03a6822)(content(Whitespace\" \ \"))))(Tile((id \ - c18b5343-10fa-4653-a9f7-b3ea6ff43bd2)(label(v))(mold((out \ + 189fae6c-2558-4681-a09a-1e13f70bb17e)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 7c8469c8-9941-4e61-bd09-eaeea42dbde0)(content(Whitespace\" \ + 67ff8509-6b9f-4707-b3a0-63f33fde3378)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7ea29806-08c1-4771-a33b-bfccf77b348f)(content(Whitespace\" \ + 3d008a86-4add-45b4-ae61-6d0c47eb43ad)(content(Whitespace\" \ \"))))(Tile((id \ - 23f4d7fc-0cf1-4a52-abd3-0dfcc4ac67f6)(label(e))(mold((out \ + 1fd0007d-1e2e-4149-bf0b-e91bb130fef1)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - d1bbad2a-fe98-4428-ba70-7cab54808168)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d533eb92-0771-4ea9-8567-743415f675e1)(label(| =>))(mold((out \ + ad4f733a-2033-4e4a-992b-25cd79c81ec2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 50e8ef28-d17c-4c54-b0a8-20182938f045)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7815bd80-0f97-4779-889d-902206b39e25)(content(Whitespace\" \ + 512cb880-2a52-4828-aa7f-c3a497144c27)(content(Whitespace\" \ \"))))(Tile((id \ - 4f1643a3-2605-4f68-8c29-21a9805e9feb)(label(Lam))(mold((out \ + fe07cd73-0165-4a4e-963d-10c0851148d6)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7369ca30-6aa9-4e4d-81ce-5382fef6a090)(label(\"(\"\")\"))(mold((out \ + 583cd22d-feb9-4699-9d2d-a299de446af4)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - cbe7bb87-0ee5-484f-98e0-76049f55caec)(label(x))(mold((out \ + 0a213226-4739-4717-b595-5a767c2ac08b)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5d812a64-c6ff-4462-953e-f44e9e824cab)(label(,))(mold((out \ + d986e7be-4ba6-4517-ba63-4353fc7a6590)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - a5051252-7def-4e6d-8fea-4260df182ede)(content(Whitespace\" \ + 39255e0e-1274-4798-a161-93c16f0c4f6c)(content(Whitespace\" \ \"))))(Tile((id \ - 05169a5b-7b3a-4c62-9516-404ece134d3c)(label(body))(mold((out \ + 9898ec8e-d5bd-4c3f-b3d5-0f068e906326)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - c4778c20-f4c5-4421-ab56-0f75e2a04953)(content(Whitespace\" \ + 6a4ad6e7-d48b-4866-9ace-cbde29edc492)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c2783ef1-5aeb-4b81-aeb4-eb3b86094230)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1a443d42-d604-41e2-912e-7b97f5cd36cb)(content(Whitespace\" \ + 1b1fd754-1200-4a0a-8df2-27b97617942e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 37fcc3ae-97a7-42f8-b795-90b5305cc46f)(content(Whitespace\" \ \"))))(Secondary((id \ - 2d3b7e3f-ab14-4f97-b404-68f67e6c65bb)(content(Whitespace\" \ + 898a6aea-5011-41cb-bda5-c4844285deec)(content(Whitespace\" \ \"))))(Tile((id \ - 9f78dc9b-136c-46af-864f-b3126d69f238)(label(Lam))(mold((out \ + 4321f0b3-5146-4f8c-9015-3bffaac6537f)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2c4d2669-9b10-4995-8f9c-cfe252685936)(label(\"(\"\")\"))(mold((out \ + c6f6c21b-6ea5-4ef7-bd60-97755a20b4df)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4695a498-1053-429c-b9cc-3e4b301f6545)(label(x))(mold((out \ + 413bd5cb-afce-4a31-bfec-c4c80e708bcb)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 66cf7e4f-a60d-48a3-a6c4-73bd1b2f6f73)(label(,))(mold((out \ + 50cb1442-335b-4cd1-b2e4-867579fdaba6)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 84f3121e-497c-4c92-9adc-469d85da73df)(content(Whitespace\" \ + 2fe3d96e-0c7c-4011-a604-630ca52de2e6)(content(Whitespace\" \ \"))))(Tile((id \ - 56185002-987f-4a21-a49b-0dd03fa81f7c)(label(subst))(mold((out \ + 825ea4de-9981-4dfb-969f-5901d16c14f1)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7ed99b0c-fccd-4cd5-a58c-fdac6cbf1a84)(label(\"(\"\")\"))(mold((out \ + 06e5576f-8c2a-494c-84f0-e6c44b6fc289)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c24098a4-0d7c-4138-9973-bd734a66e939)(label(v))(mold((out \ + 8e94f35f-fc12-4ef8-9b04-07a56fc5fd9b)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 74256627-5c72-452f-922d-f837620ebf6d)(label(,))(mold((out \ + 06a8b8a2-261c-4696-b967-3bc77eafc8b3)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - ef943db9-ad9c-4bb4-933f-4ab2731ab566)(label(name))(mold((out \ + 905c338c-14ca-4660-bf57-ad2505d50f57)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4fd12213-505e-48cd-9e2f-ca24d94e6293)(label(,))(mold((out \ + 8fe769e6-8b88-4faf-ba0f-2fb447414e97)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 226cd797-7fb7-4ba6-968e-c8002f5c8225)(content(Whitespace\" \ + b72b3481-34de-48f9-a5e5-e68d829a24c4)(content(Whitespace\" \ \"))))(Tile((id \ - 6b517e60-11d4-45da-bffd-02d61d96ebf2)(label(body))(mold((out \ + 35e4c324-e7ac-498f-837a-7a9d8d36a734)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 0bc92aab-2442-4a86-a9cf-98cb6d0f0db7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 724421a6-806a-4da1-bd43-6512303e2d70)(label(| =>))(mold((out \ + d98eb89a-235e-4376-8349-0fd15b6fae02)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 198d47d6-6294-43bc-b006-0d85eb8a2669)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 97584f26-5819-477f-b7a6-6d12ad2a5509)(content(Whitespace\" \ + bcc48b90-9af3-4c00-9e0c-ce72bb2b732f)(content(Whitespace\" \ \"))))(Tile((id \ - e0e9b1ac-7fd5-4cd3-8a5f-f1c319a27eb6)(label(Ap))(mold((out \ + 6a1718f8-8022-40b3-ab93-d4211208c29c)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4347b858-4f6b-4123-8cae-b87292b1bb77)(label(\"(\"\")\"))(mold((out \ + b922c7f6-c67c-48f3-8cfb-68c841aa0414)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - c1221926-8d31-41c4-b4fb-f796a63fe9fb)(label(e1))(mold((out \ + 07da188a-2410-44f9-b027-fa69828a2b60)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5da7b1be-6258-4091-9a85-21e8cb745774)(label(,))(mold((out \ + 8ef9466b-7fcc-4137-bfb4-692ccf70dbd4)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - ee5f2f10-9a3f-4151-a03d-40a3f8002851)(label(e2))(mold((out \ + f00bb251-cbab-46be-8173-1f6675ee4c12)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 10e94ecd-6cc4-443a-b0ef-b9e29425a572)(content(Whitespace\" \ + e64b3ba2-1bb9-46f8-af06-493d15f723a6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4f1c0b52-0efb-48ba-8900-ffc564668643)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c7e3bd04-bab1-4d31-bc9f-bd7c35dfad82)(content(Whitespace\" \ + 4e59e4ca-6f08-4448-9c58-9483c07efd66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8ee684cd-2c5a-4253-b301-7cba81099e24)(content(Whitespace\" \ \"))))(Secondary((id \ - 89a32e5d-20a6-4eda-892e-f53a234f3c70)(content(Whitespace\" \ + 49bc3c61-c4d8-4dea-aca2-e338d6badf43)(content(Whitespace\" \ \"))))(Tile((id \ - 0330a53b-04c5-4430-a646-35a184ec31c7)(label(Ap))(mold((out \ + a52cd9fc-0c23-475b-9415-25f6fa9e6efb)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5cd39bdd-16bb-4ccd-81e7-ec6c15c360fd)(label(\"(\"\")\"))(mold((out \ + 691eae01-24d8-4eef-8f2d-fd96f5655ce1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bccf9151-34f8-42e2-a474-88b2dcf31c1a)(label(subst))(mold((out \ + 2b9d4d26-68e0-4bcd-8180-4f5604325e72)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 237d89ec-f4dc-438e-95f5-4ded89739acd)(label(\"(\"\")\"))(mold((out \ + 61a618b7-9ee6-4e7f-a857-70e856565de6)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0a930568-f901-43b2-aef5-2e25509d706d)(label(v))(mold((out \ + 33aed735-bcb4-4f72-90e7-0905627c1328)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a65ffb04-543d-4489-b748-6f976717e9bb)(label(,))(mold((out \ + a962694c-b142-42d8-b708-ece24fe1abd5)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 4ee82f42-6b89-4ce9-9a3a-3920e2e531a0)(content(Whitespace\" \ + 42355414-1a94-465d-b514-efafd3dde3ce)(content(Whitespace\" \ \"))))(Tile((id \ - 7f7b46f9-558b-4ca5-ac8e-2d11d00e108a)(label(name))(mold((out \ + 25868761-b6df-412e-ab62-429c9dd56013)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0acaeff7-eee0-4f3b-8316-de316f210220)(label(,))(mold((out \ + 0c61b948-4a9b-4749-94f4-937e40189067)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - b7d11f72-239f-472b-b216-1d54a69d6f30)(content(Whitespace\" \ + 6f94e0f0-3a32-42d5-a969-04770fb2f6e9)(content(Whitespace\" \ \"))))(Tile((id \ - 1b63becd-5e32-4970-b7da-e06bceb01fc1)(label(e1))(mold((out \ + 05ce26ab-13fe-4ca3-b44b-97e1fabbd9aa)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 10fa6c2c-0bb8-4aa5-a4df-fcd6c5346e82)(label(,))(mold((out \ + e232b397-8a48-4905-9901-a6614c29b148)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 47e30b67-1086-4d31-a7fa-1b27741e097e)(content(Whitespace\" \ + 7cad6a0a-f538-4103-8ea9-a25188ed9c5d)(content(Whitespace\" \ \"))))(Tile((id \ - 410ce6ee-017e-49e1-b5dd-3167baf1b5e7)(label(subst))(mold((out \ + c7974f67-be67-4b25-b4e2-792f6271485c)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 9b2c976d-4734-4dd4-aad1-02151b7a95e1)(label(\"(\"\")\"))(mold((out \ + 33a5c704-20a9-4923-83ee-bc25c55193de)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 11df5403-1a03-4fa5-9028-d10f98bed12c)(label(v))(mold((out \ + 13c5b7a5-2e40-4eb5-a453-69244de39c0f)(label(v))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7f9e8f6a-a8d7-482a-98e1-3ebc829718b0)(label(,))(mold((out \ + 421e99c0-8c79-4eaf-b157-a55567fc08f2)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7a1c9718-da71-4a0e-ac46-4cdfbf6c0d1a)(content(Whitespace\" \ + f7a6368c-22ce-4e48-a850-f2b518249ba2)(content(Whitespace\" \ \"))))(Tile((id \ - 6cc48826-d8d4-43c7-835d-2f261a0c7992)(label(name))(mold((out \ + b5d916c8-ff45-42d4-87e2-b368456a1b0a)(label(name))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b6eab2c5-cc02-42ee-9b57-3002dd0cf090)(label(,))(mold((out \ + 594de8b9-d5e3-4a8a-b6b4-a88747f4976c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - e8ac7d39-a4b0-4d0a-a503-eb8a66259d40)(content(Whitespace\" \ + 4b4d1d9a-6ec5-482a-a2e8-294b620f10b2)(content(Whitespace\" \ \"))))(Tile((id \ - 3e3ddf57-aeca-46c7-8b0f-044792640f03)(label(e2))(mold((out \ + 8255fbeb-57bc-4623-a976-6a77d4f4bd33)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 34534b5b-0113-4667-ad35-8b78215e2a71)(content(Whitespace\" \ + 46c0e133-7139-4de4-b049-ea74f738219d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 755f6441-c1a6-42bd-9a69-4f687ded5923)(content(Whitespace\" \ + 1429043f-125e-47a0-a8fa-ea29e06ec217)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3d33bad6-629b-4377-bc84-08eb8e387966)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a8dbecaa-3f47-4dc3-b63b-365fb9261f89)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6654f63d-e0f7-40a5-b587-82d4600f10ea)(content(Comment\"# \ + 8d62629f-f58f-48a2-b11e-ab9a5b0d075a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a13baae-0472-42c0-b42a-b18bdc028226)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + df60bd6e-a698-4e36-b3df-c41a52d2f078)(content(Comment\"# \ Evaluation can result in either an Exp or an Error \ #\"))))(Secondary((id \ - 7f4428f1-78b1-4639-8d6a-5c7eed8589fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3febd2a3-c1b8-44c2-98fa-96a56e811e68)(label(type = \ + 58373ddf-8053-4524-bca9-0bc2b4fe0c03)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 02740f27-9216-4848-9d7a-bd63546a65b4)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 8f57e053-591f-48ae-b326-e24419c03bbd)(content(Whitespace\" \ + 79574626-e7d5-4469-ac1a-4bf7e1778c90)(content(Whitespace\" \ \"))))(Tile((id \ - 6900c395-caf2-4286-8043-71185f7d24ef)(label(Result))(mold((out \ + 3f3b3e16-d51e-4a5a-9a54-86976313e0b8)(label(Result))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - bcc43ade-ef6f-43a4-b88e-f58e8eb0a2d4)(content(Whitespace\" \ + 9f5f6df9-a373-4dae-bbd5-57b831001900)(content(Whitespace\" \ \")))))((Secondary((id \ - f68b67a6-c7ce-40d0-bd20-8a4228e45813)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8d164db9-3c9d-4c0d-8ede-a22bd6606e21)(label(+))(mold((out \ + 9bb46eba-97cd-417b-a3ca-b29ed881cef1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c9642ca4-854a-4892-b89e-a75bf53fa1ae)(label(+))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape(Concave \ 11))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 9aa41cf6-d565-47fd-ac64-bd06dae827b4)(content(Whitespace\" \ + 8b487485-d296-4025-96e7-946b7004739a)(content(Whitespace\" \ \"))))(Tile((id \ - 7a283153-3a56-4dce-8bac-45a44830e08f)(label(Error))(mold((out \ + 8b5d8559-4260-4d99-81bb-af6daf14f123)(label(Error))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - cdf2d9f9-a5ab-4cf8-888d-71e0e09c1d6f)(label(\"(\"\")\"))(mold((out \ + 7be3a6fd-5e82-4fd9-837e-89fb8c0e366d)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 64fbff4b-d7ef-48c5-9a60-3987b835a6f8)(label(String))(mold((out \ + f4205193-6640-4427-84f4-40ef4f1cedbe)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 330f7361-6f52-4ac9-8177-9a3da0547a33)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fe46ca25-436f-44c1-9d13-c36dcf6e1fad)(label(+))(mold((out \ + 80cdff65-eef1-43f1-97f9-d30e17e39dee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 21ae352a-ef43-4cb3-847e-34e1b1b7a641)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d3a4819b-0519-4054-9f7a-7fd2b49fa742)(content(Whitespace\" \ + c198aad8-d51b-47fd-bef9-4ffea862a94f)(content(Whitespace\" \ \"))))(Tile((id \ - edae8e1d-89ec-4ee0-af8d-2553cf8b15ad)(label(Ok))(mold((out \ + c5ab73a9-2d90-41ea-a258-a15b8378dc66)(label(Ok))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 5df696c3-1af2-4d42-bc0b-802229064093)(label(\"(\"\")\"))(mold((out \ + 1948f709-c832-4bda-b595-d4ba3eec30f3)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - f058a46f-13a3-40d8-ab11-1d0db4ad5038)(label(Exp))(mold((out \ + 02eefc25-152c-4a15-9a3d-0e7b2446aead)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c8ecd3b3-4c52-465f-a9b9-00159993d3b0)(content(Whitespace\" \ + 8a1b9f10-3336-46cb-8d1c-6261b18ec98d)(content(Whitespace\" \ + \"))))(Secondary((id \ + 2fd0b394-0027-409f-b76c-cc62a5341489)(content(Whitespace\" \ \"))))(Secondary((id \ - b4657885-2cbb-418a-a10b-ff948be41b13)(content(Whitespace\" \ + 9a1a0fe3-425e-4faf-84ca-958bf64df153)(content(Whitespace\" \ \"))))(Secondary((id \ - 989eee13-d110-48ef-9082-4f27be775ede)(content(Whitespace\" \ + c026c092-01d1-4a54-876d-a09e2d0b1144)(content(Whitespace\" \ \"))))(Secondary((id \ - d45be707-95fa-46e4-b033-e9f75e669352)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 4bc166bd-7d34-406c-a06d-5a3a4fc3a2f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3ad7d46c-19d8-4d4e-9f98-3ffe919b0143)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3339310b-320f-4f3d-b010-4aa986874d15)(label(let = \ + 88699c23-fc24-4f2f-8eb6-373b8d0976a4)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 04a478f9-dd72-4579-8d63-81d2e206e115)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 28b33fc5-73ac-4067-80c4-4a32271ae16a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + beb81d1a-a198-40d6-9110-1fa2ccc5e769)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - f94284ae-2d88-4057-bc49-351077f07121)(content(Whitespace\" \ + 1a7d9457-56ca-4dda-9e39-c00f4b23cbbd)(content(Whitespace\" \ \"))))(Tile((id \ - c8272a8e-f498-4c2e-a487-023fc5789105)(label(result_equal))(mold((out \ + 2183b6d4-e2cf-4fb2-a1c8-951daffc734b)(label(result_equal))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - f5ee90ea-3b4d-490c-bcc2-b56eb1b07e56)(label(:))(mold((out \ + e5471c3b-9e87-476c-a358-caf951aa9ec9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - f6bd80dc-0326-4637-a7b1-4dfc448ce3c6)(content(Whitespace\" \ + aeb8b92f-9e0b-43c7-83f5-c27d6e09b287)(content(Whitespace\" \ \"))))(Tile((id \ - 980685f2-512a-44a7-a9b5-9ccef9ef09dc)(label(\"(\"\")\"))(mold((out \ + 40d0b893-77a0-4aea-86d4-72ea7904a352)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - c00204a2-d652-4535-bfaf-54c3f5b28e47)(label(Result))(mold((out \ + 1744eba8-f3d0-4e9f-8a60-d120da7f2d99)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - b5f7a8fb-30c6-4a88-adaf-146a149ae536)(label(,))(mold((out \ + 3253b4e3-78bc-45fe-b6d0-9faa079e52a9)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - fb131e26-549f-418c-a080-64ef774e20b9)(content(Whitespace\" \ + f96e2cb6-9d53-4085-9b4f-b88ddfafdaa4)(content(Whitespace\" \ \"))))(Tile((id \ - 981974af-0bf6-433a-b0e5-ed639e63ba32)(label(Result))(mold((out \ + 68ca4d55-b5f6-466f-9baa-36a381ce0116)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - c0d50d1a-2b0c-48d6-839f-1ec13740cf80)(content(Whitespace\" \ + 53c5e2b3-347a-4e30-bd84-0ea4b5a481dd)(content(Whitespace\" \ \"))))(Tile((id \ - 1360f5e8-5b30-491a-a6a3-d8db39e57bf0)(label(->))(mold((out \ + 51039060-7dff-4512-8ad0-b98abe6e6b8c)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0102b6db-945a-437b-80b9-b1b03ba6ddec)(content(Whitespace\" \ + 247d57e8-d7b7-45ca-a53f-f2e0276c7112)(content(Whitespace\" \ \"))))(Tile((id \ - 2a46ed0f-afec-49ce-84fb-2cc8c20e177a)(label(Bool))(mold((out \ + 99201842-52cb-425b-b1d8-8032398f75c9)(label(Bool))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 7d74bc3e-f8db-4f7a-a20d-a0e00ab3947a)(content(Whitespace\" \ + 04507290-1261-42ac-8b6d-69cd54918e86)(content(Whitespace\" \ \")))))((Secondary((id \ - 508c74b9-6093-428d-9bc0-86563f1d5516)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8d15a0cf-b489-4dd3-bd6f-21660dd9868e)(label(fun \ + 85ec6920-78d5-4b9a-9cc9-ed718890c8ce)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ce3ac16e-7ab8-452e-ab4e-dbd87f27856a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fef14404-612a-4942-ac68-bed915802d76)(content(Whitespace\" \ + 88348ff5-afea-4857-8468-ec01391c2297)(content(Whitespace\" \ \"))))(Tile((id \ - c0728287-c057-4fa2-a612-75d3158b7311)(label(rs))(mold((out \ + d1c99579-617d-4b09-8684-1ce1055ed1af)(label(rs))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fa6fe5ef-bcc0-4ab4-89a7-0202affba998)(content(Whitespace\" \ + c0a36a89-6fd6-4b22-a699-b8c021ff931d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ff6effbf-26a3-473b-9cea-01f6ea499eb4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 81aec986-15ae-41ce-928a-9beb675cb48e)(label(case \ + f8f8b6b7-4db6-4aac-9488-d33fecb329c9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 34b48ac0-ccfe-4b44-8559-fd3203569be3)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 61db68d3-320d-4bb8-8195-d667e9c3716c)(content(Whitespace\" \ + 630d743c-9089-4656-9997-66ebf1043f49)(content(Whitespace\" \ \"))))(Tile((id \ - 62d522af-a13e-4a4b-a7b6-ba6dcb04b51f)(label(rs))(mold((out \ + 228fc476-f58d-4823-b65b-e0f3b929553a)(label(rs))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - cabe162f-cfb5-46e7-a1d4-b751d1b9ba72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9172629d-3b54-4382-8091-3f66c7d88f82)(label(| =>))(mold((out \ + de1b5880-6ad1-4bfe-bee1-dbf8b8ff5774)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 602fc195-6627-4402-b215-5ac67d06e852)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 66a3dbfd-772c-48a9-912f-634ab479359e)(content(Whitespace\" \ + c404cd81-10d7-4dce-9052-76296fd5ddd9)(content(Whitespace\" \ \"))))(Tile((id \ - f0dc8cb2-97a9-4995-953c-da7bbc8d12b2)(label(Ok))(mold((out \ + 8bb36d61-04ad-436f-a131-f6177885e537)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 707cd6fe-2e8d-4c36-91d2-6607a18f7b5f)(label(\"(\"\")\"))(mold((out \ + 5b3a9162-cac2-4316-ade9-f44a1409ef9b)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 12180951-3844-4624-b99b-9d6e3c286d9e)(label(e1))(mold((out \ + 9b7c1b11-29e9-4598-9d83-b9e157342f1a)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - 0e93ccc4-3167-4aaf-bb3a-96f53e596a53)(label(,))(mold((out \ + 554759e7-cf6a-43b7-8faf-610d1c87786d)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 454a8046-df52-4e23-8184-8d422219d1bc)(content(Whitespace\" \ + 9a108194-f7a2-4410-bc5e-d95db49fa65c)(content(Whitespace\" \ \"))))(Tile((id \ - 24e7084c-5f76-4028-a3be-1435136a7b01)(label(Ok))(mold((out \ + 2beebdc6-f1da-407f-8ec9-41726ce6e6ef)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - b256025d-9c61-4091-9bce-fde2b16e7cf4)(label(\"(\"\")\"))(mold((out \ + 6e37ed75-a301-47c5-9439-3c27a91a68a6)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 60264c98-c608-4383-8600-e85717410569)(label(e2))(mold((out \ + c5a5d70b-5ccc-44df-b9c9-9e1c85f16172)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 26e14cb7-40ee-4e25-878a-c496aa0f6df7)(content(Whitespace\" \ + 8cad935c-fc62-4ada-9ad0-dc00135ebb51)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8840d2e6-c983-4c1e-b6c8-013e4063db71)(content(Whitespace\" \ + f6ad97cd-c18f-45d2-a8e1-b2b804831906)(content(Whitespace\" \ \"))))(Tile((id \ - c9e591b6-b7be-49cc-9421-8e974ffd15ed)(label(exp_equal))(mold((out \ + e9a8afa3-d10c-4658-881c-a604a93ca8c5)(label(exp_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5eec7b79-6cc0-4f08-95c0-2f4911c2f681)(label(\"(\"\")\"))(mold((out \ + 12fb3aba-0317-4ec4-acb7-a6803d8233b6)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 66bcc7d4-6c5c-44da-b1de-e3222dfcda30)(label(e1))(mold((out \ + dcbacc26-3050-4757-9cb1-b617738358d1)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0977bb86-c4b4-42ee-bf56-efa83425a578)(label(,))(mold((out \ + f1d55cab-92db-44e2-91f7-9a85f1dfafba)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 668ccab0-e97c-4b43-ba65-c5dc79e93d20)(content(Whitespace\" \ + 4dbdd1ba-8270-4bab-9ad3-583b32aa4aaf)(content(Whitespace\" \ \"))))(Tile((id \ - 8a1020ee-f5c8-422f-8eb2-36f18c31e0d8)(label(e2))(mold((out \ + e12e4e79-111f-498f-9d80-ad77f5d565c6)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e31c1ade-e4ce-47df-b15d-64499739f7dd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4681f79b-128c-4c8a-9776-5c169ef35e6a)(label(| =>))(mold((out \ + 2bb90059-0ee9-423c-8684-472175118a48)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + df9db36d-e7b7-4872-b63f-8dc09760c860)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8818b04b-d0cf-43cc-81c7-fdc8da9073da)(content(Whitespace\" \ + 4247b0da-3b47-42f5-998c-f68db67c843b)(content(Whitespace\" \ \"))))(Tile((id \ - 759aa58b-ae8c-403f-bcc5-5c647212eb70)(label(Error))(mold((out \ + 9a19a183-fb5e-443f-af84-f23d720d099a)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1adc69a0-b02f-45d5-83ae-b9a68f2132a0)(label(\"(\"\")\"))(mold((out \ + 41cab548-8d9e-4a99-9406-3ee89d2fc4ee)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - b1364f6f-2547-4da5-9645-7063c58895b8)(label(e1))(mold((out \ + a39c2d6a-6de1-46bc-9240-eeeeeec02eb3)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children()))))))))(Tile((id \ - ab7fa76b-f257-4bdd-bc16-8b5e824fce1c)(label(,))(mold((out \ + 3cca4788-c110-4d27-a8e7-1777c1d9d30f)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9dceec92-e291-4ce8-ae4a-0d6202475e94)(content(Whitespace\" \ + 8287b063-d40b-472d-ae6b-8c392467fbdf)(content(Whitespace\" \ \"))))(Tile((id \ - 77269ffd-f5ad-4812-82fd-0bb3ecdde707)(label(Error))(mold((out \ + 148c57ae-dabb-4487-9fe4-c33c974217f7)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 9369fe6d-ba8d-4c0e-b9f4-c0419feaf5d9)(label(\"(\"\")\"))(mold((out \ + 49335ce1-42aa-412c-9bca-e52a1ee521d6)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 8ffd8fae-dd4f-41ed-b39c-5708cbb176e3)(label(e2))(mold((out \ + da2279e4-e383-4954-ae32-3d6f2b9bc4ed)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 48761ee7-ddb8-4c3b-8eba-f7aa9060c89c)(content(Whitespace\" \ + a62811b8-2ebe-4ccb-89b4-d96760aa3c3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d4733eac-c638-4227-8159-c1719daace18)(content(Whitespace\" \ + 5741626a-a252-4420-a0b9-e1772e1c0ac5)(content(Whitespace\" \ \"))))(Tile((id \ - e55aab24-e42d-4fb9-a1f7-73dc14382fa8)(label(e1))(mold((out \ + 58cf6b30-b7af-4a5f-ad08-dd02d3fa5f22)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e751d6ca-0528-4e8a-9fd5-1d9f8ea89b4e)(label($==))(mold((out \ + c80a8e71-238d-43d0-a8cd-76d4da6c2532)(label($==))(mold((out \ Exp)(in_())(nibs(((shape(Concave 9))(sort \ Exp))((shape(Concave 9))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bf467fcf-28f3-45f6-8683-de38f77ca1ef)(content(Whitespace\" \ + bbd48c2e-cd7b-4f99-b274-e36e6c3ecf5e)(content(Whitespace\" \ \"))))(Tile((id \ - ee40864e-70bc-4733-a5c0-da700d1e2d14)(label(e2))(mold((out \ + 2c75c7b3-db8d-4f1b-ac2a-4b5ff7fa1e64)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 40b62523-c7a9-412b-bbb9-0d1cc06a16d2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 531d21d9-9791-4230-9a92-53caaf0d5a6d)(label(| =>))(mold((out \ + cff7ec82-7993-489f-8385-75b26bf79234)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4111f31d-f74a-41ca-bc02-d29e2a0db0b2)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 31781b90-3d37-4b00-a0a3-351d8748624b)(content(Whitespace\" \ + b2fda54e-371f-4699-a0c5-fd77c89a7a20)(content(Whitespace\" \ \"))))(Tile((id \ - 676f3a88-a751-4852-9145-8cacb526616f)(label(_))(mold((out \ + d5d7f4ab-3067-482a-aefd-9c6a8c4b6fa2)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 976a20da-df0e-42e6-a10c-503615721197)(content(Whitespace\" \ + f92d3f91-2fb1-4412-8a9c-be22c0700ce3)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 79628056-aa48-42e9-9802-6f2896e85d0e)(content(Whitespace\" \ + 04d95ab6-df9a-4cd3-9bed-4ce41cc1647c)(content(Whitespace\" \ \"))))(Tile((id \ - e83564e0-e2b1-4171-a760-d7f491ec6fa2)(label(false))(mold((out \ + 2a98cb80-5b3a-4435-8101-da95240b9f4c)(label(false))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 68f059ca-89de-480f-9ec9-ead418e4c217)(content(Whitespace\" \ + 3176efbf-484a-435a-a07a-675b72c7840a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 44cce680-2db3-4f2a-8624-72470695888b)(content(Whitespace\" \ + 5ad8e2d5-c444-4b65-86f3-6a63013c83eb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9992acb1-4fba-4ac4-8baa-609036962a28)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 40d86858-c6d5-4f3c-80b2-baf99f974c1a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 57e3ef8c-1c35-4297-8089-11f73f032a4b)(content(Comment\"# \ + a3519b0c-9c62-4ec9-a92d-9076f579ffca)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cc8c81e6-bcb9-4122-bceb-05a10ebba3cc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + be744456-0e46-48a8-8f6d-de6f041effad)(content(Comment\"# \ Evaluation by substitution #\"))))(Secondary((id \ - ba1f3bb8-f734-47ff-8b87-05b235e70fc2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6c59ac73-6216-414b-a9c2-2d6ed43b6cc7)(content(Comment\"# \ + 53f494d2-f96b-4730-817f-a7bee7de9a3c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 149c737e-c073-4296-bee6-8355ac15e21b)(content(Comment\"# \ Evaluation by substitution #\"))))(Secondary((id \ - 6fd3d856-8e61-4ffb-9f1b-3de94fdb88d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b5816794-b99b-4def-8401-6ac055c048e9)(label(let = \ + 0a55cbc6-d5b2-4491-9ecf-749d8d7d15d7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1a88620d-7573-48e8-8fe2-667fc6861380)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - b9dae5b2-f1bb-4e69-b8da-b2489b61e0f9)(content(Whitespace\" \ + e8657e19-27a0-4614-8e8c-1f68924c7cdf)(content(Whitespace\" \ \"))))(Tile((id \ - c8830b54-c03c-4fcf-a211-cfca308d97b1)(label(go))(mold((out \ + 510ff9dd-fc7a-4c50-a4ba-ff2284732f2a)(label(go))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 67637dd3-f621-43d5-bc4b-21ad44dc7362)(label(:))(mold((out \ + 2894560c-55f0-4e24-99aa-a120d0db2deb)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2626a9a9-4198-4a86-b8f2-3500e9cb711a)(content(Whitespace\" \ + 595c66cb-8234-4cb9-a195-5611c63d6fe9)(content(Whitespace\" \ \"))))(Tile((id \ - 46fc6260-3a83-41ee-866b-c4cc8cd1111e)(label(Exp))(mold((out \ + 92e454fb-632a-4240-8fae-4684ae730a61)(label(Exp))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - bb64600d-2705-451d-8aa5-6262e7b636ba)(content(Whitespace\" \ + 56244e52-c07b-49cb-bf9c-b4d9091881cf)(content(Whitespace\" \ \"))))(Tile((id \ - a78ed931-8037-4114-ac34-be1ade56048c)(label(->))(mold((out \ + df0286bc-8fff-47d7-85f2-fb19a6fafb12)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9681c2d9-0161-4d99-bfdb-e18e3e1bc9de)(content(Whitespace\" \ + 88832015-a7e6-4ee6-8a16-1a2aa399774f)(content(Whitespace\" \ \"))))(Tile((id \ - 82eee8dc-99a3-4c3e-b156-048d82ff8d5f)(label(Result))(mold((out \ + 237ba37a-5943-47ff-a613-91955a03b50c)(label(Result))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c5fbf234-e043-4a7d-945d-5bb0dc258873)(content(Whitespace\" \ + d6e70935-96cc-4264-8702-1cbb390499fd)(content(Whitespace\" \ \")))))((Secondary((id \ - ed833e4a-3313-4534-a282-4acfd67e4c2b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3403c2b5-b387-4466-97e1-d72fa1ecda86)(label(fun \ + b8dfaa39-225a-47fb-ae01-eda3fa2f52aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + dd454f86-229f-4717-8b8a-aa52bd1c3b31)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - bbff0fa9-4834-4255-9aea-cec151b04b4c)(content(Whitespace\" \ + b4be931c-8a8f-4fec-933e-7a3ed2244406)(content(Whitespace\" \ \"))))(Tile((id \ - 70a5a767-8ebb-4e95-9f03-4c1faa1ec61d)(label(e))(mold((out \ + 9d1f5677-7646-4214-ab92-3767945aa471)(label(e))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6fde9f47-c44c-48c0-9f17-7e8fecc6ec00)(content(Whitespace\" \ + d997484f-4c74-4581-ae0f-9a0b2126a8b0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 461010ea-59b8-4ee4-a732-d77490818a3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ef9037be-faca-4799-9551-302a142c752b)(label(case \ + f76711b8-c30a-48b1-a991-115ef11ab388)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 809ef267-e552-4c23-99d0-b39d7935211a)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - a57457b9-c3e8-4de9-8b9d-97499f1bed88)(content(Whitespace\" \ + 96ef5d3c-d896-4e8c-a68d-3991351f088a)(content(Whitespace\" \ \"))))(Tile((id \ - ba896d6a-c822-44a5-b995-be0c1d761b71)(label(e))(mold((out \ + d496c898-71a0-4f3d-91c7-d7fd166818da)(label(e))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - e4b9e9e3-0313-4142-96f5-f070c4a80d70)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - cc704393-5dd7-4cf7-b560-563d566fa55d)(label(| =>))(mold((out \ + 6ddac7aa-028f-4e3f-9ed1-56b8e5232bbd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 679021bb-0c1b-4cf5-91d7-908a6f9647f4)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e895213d-b36b-4d2f-bae9-d9c185752c71)(content(Whitespace\" \ + aef95ec1-6d5d-4e29-a785-2ea83e1e026a)(content(Whitespace\" \ \"))))(Tile((id \ - 96bbdf9f-e0f5-400c-8afc-7ee2d2d7d7fe)(label(Var))(mold((out \ + 398f1340-2d99-4230-8c20-c51150658002)(label(Var))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d3abb9b8-e69f-4801-b723-cd32c6615f72)(label(\"(\"\")\"))(mold((out \ + 621155bc-7ac6-4d9e-8fd3-4d71ba659185)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 93f7d776-7055-48c0-96ec-e577ab1f7326)(label(n))(mold((out \ + 77f731f7-f0d3-4c1b-9ec3-df7178574c85)(label(n))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 85cc2b53-f588-4b7a-8998-148557183a03)(content(Whitespace\" \ + 586d55ac-d88b-4eca-880f-0852604e45bb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fd193778-0b3d-4304-bf66-495f36204e9b)(content(Whitespace\" \ + bff112db-9788-4cc9-939d-3e731fd51833)(content(Whitespace\" \ \"))))(Tile((id \ - 259d2183-3516-4eec-9a66-4acaffacb15d)(label(Error))(mold((out \ + b15c5cc6-a04f-4345-9a39-bc4112a76752)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - af80c54a-2168-4098-b7ec-dcdf436391dc)(label(\"(\"\")\"))(mold((out \ + 24d9b2ca-a41f-4e3b-9950-9073fc4e7ebe)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8c2871ad-1927-4cbf-95f8-e236b8e5014c)(label(\"\\\"Free \ + fbc61e43-64e8-471e-9297-f8cefa5ece19)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - a7c14b76-668d-4735-b6cb-fd5584c19b72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 563e3159-5703-4282-b834-dedab2d10848)(label(| =>))(mold((out \ + ab5b91a4-43f5-4a63-8b87-9f816a0cd01a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6000c5f4-8ba1-461b-85fc-3381115d5350)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 0ee724d9-8a47-413f-8216-ee4184863734)(content(Whitespace\" \ + 1d231ace-434a-4894-9e67-e1cf43decb46)(content(Whitespace\" \ \"))))(Tile((id \ - be27def7-6a2f-46cc-b6af-0dd5f9b55a43)(label(Lam))(mold((out \ + 9a7125df-c40e-4def-9f53-b40dc32731bd)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cab30b35-7846-4d9d-9392-ad6c3d1b89a1)(label(\"(\"\")\"))(mold((out \ + 2e8b9b90-d82a-4666-9743-ccf496c5d98d)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 31314485-5fd5-4a00-a8f5-953d7fcad2ff)(label(x))(mold((out \ + e64de081-8618-4784-80c7-52d56d51b182)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1a288c4e-0924-4998-b996-c71b86b9b6f0)(label(,))(mold((out \ + 1dad0ef7-3126-499f-91f3-95ef1ee36ea1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 638db553-9091-437b-ba06-e0c0acd7773c)(content(Whitespace\" \ + 47533453-d21e-4f68-986b-9a8707f9acab)(content(Whitespace\" \ \"))))(Tile((id \ - 16e812e7-d529-4cb2-80fe-dbb581ecb435)(label(body))(mold((out \ + 4e872a2d-2d3d-46af-8f0d-3588d8af77af)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - d72d86d5-7c36-4142-bb12-0b764da43ac6)(content(Whitespace\" \ + c1b66e3e-c627-4034-807b-ed0e0aa616e0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b9de2e7a-1513-4ab7-99a5-332a67f8035f)(content(Whitespace\" \ + 8f7f6d34-e271-4055-b7b2-0cd964b2d4e6)(content(Whitespace\" \ \"))))(Tile((id \ - 3b75d7b6-7e4a-45c0-86f4-1ab495361118)(label(Ok))(mold((out \ + f0325f29-e1c9-4b56-b9bf-80db92f5f575)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 6698cb11-bd0a-4cb4-8f9e-cd104bc5ad3f)(label(\"(\"\")\"))(mold((out \ + 922e9ce3-6082-4583-9515-fb888bedc37e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 31b8b482-95f8-433d-b9c5-08e4547f7cea)(label(Lam))(mold((out \ + 5f7769f9-00df-47fd-9555-dda0625d8fad)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3b873fb5-098b-4d83-8a9e-bb35e8fe4aba)(label(\"(\"\")\"))(mold((out \ + e36c23dc-9fc0-41f3-8379-7e6177ca0c1b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 12757c74-ac0b-4e2e-a257-7c6536a5253d)(label(x))(mold((out \ + 009acb40-b1cc-40af-93d7-0fc7d2c1e035)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 797fd0b4-5db4-4688-a9c3-0e2526c9eeee)(label(,))(mold((out \ + ee16fc3d-7b81-47b4-b020-13ebe276dbf0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3c973366-7f34-4998-a8c9-7b9b4d2dbfcf)(content(Whitespace\" \ + 3068a498-a275-4dab-9567-06987ed9c378)(content(Whitespace\" \ \"))))(Tile((id \ - e2c8fc80-7fa8-46dd-a878-ecd2dd111791)(label(body))(mold((out \ + e54a8b40-e6cd-4cef-8fcd-77ab29483140)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - fa2484cd-6929-4b16-a472-0364b11f9e72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 631a2bb6-52a0-47cf-a86b-b0bdecf8e3c7)(label(| =>))(mold((out \ + 2e9ecdd1-7a70-45c5-84e9-ba636e5cc23b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ff2d5608-d410-415b-807a-eda98e6da72d)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2cbb78c7-17b5-4378-95dd-586a55926304)(content(Whitespace\" \ + 362944fd-aa91-4d59-8aff-d0dec93c2b08)(content(Whitespace\" \ \"))))(Tile((id \ - eda7aa5c-9f3b-427b-beaa-67e8f93a7b73)(label(Ap))(mold((out \ + a760ce03-9df0-4d61-89e8-88f092c8d0cf)(label(Ap))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5a8a88a4-02bf-478f-b781-9858d7553651)(label(\"(\"\")\"))(mold((out \ + 0e07e490-0333-4907-aab8-2da6cd300e7d)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - efd2c12d-31d3-466d-b6c9-687b099aa86a)(label(e1))(mold((out \ + 0316ae72-05b7-4de1-8bd6-bfc2f5bc5f75)(label(e1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 2fe116b5-f64c-492d-b02c-cfa2ec68a295)(label(,))(mold((out \ + 5e357626-f992-4f51-9818-0d4409ef920d)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Tile((id \ - 20eb5a27-ba46-4425-a295-8e0ef1f12eff)(label(e2))(mold((out \ + d4cb1b5e-971d-4b62-be08-a6b9c5c93764)(label(e2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 469b4586-a675-4096-9fff-fb1c27fcf2ba)(content(Whitespace\" \ + d8e83bb5-0ceb-4027-b529-92c0a1fec26b)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a1097862-e3eb-4ae0-ae15-457d75864534)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a6e5644c-5640-4680-a5a6-f074bba4a6e8)(label(case \ + 838b52f1-3737-456c-8a98-5849ec89ad58)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 69a21eca-495a-4e72-9503-a52cff7dce27)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fe79657b-a3f7-4dbc-b4db-11558831b94e)(content(Whitespace\" \ + 2e681929-b28a-468f-a959-bfa03d8a3f1a)(content(Whitespace\" \ \"))))(Tile((id \ - 21945605-63af-4196-8333-f8650781a4e2)(label(go))(mold((out \ + e30771f9-69e7-4841-bee0-e93c23a5303d)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 42e86943-109c-4707-9481-f0d995855955)(label(\"(\"\")\"))(mold((out \ + 453d4571-f7b6-4c0d-b921-5c8700b1ac3d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - bd2f1cb3-e9e8-420c-aa3e-92d332a90e90)(label(e1))(mold((out \ + 7711c924-5ddd-42be-92dd-4b89b11d2c8a)(label(e1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 70bfa6c4-9e27-4565-8f79-aecdf1ff4844)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9b262423-fffb-4d1c-a99f-2d1a3018dbfb)(label(| =>))(mold((out \ + 2f435c23-83b7-48cd-8f8e-38093dce4fe1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + f1abca8d-0d37-4661-8b3a-dcae0bd68385)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ab18dc57-b60c-40b8-84b9-9352227993a5)(content(Whitespace\" \ + bae7e074-dc4e-467f-b341-94fe0040c29d)(content(Whitespace\" \ \"))))(Tile((id \ - 635d535b-ab67-4f15-92b0-8b84b594a271)(label(Ok))(mold((out \ + d9236252-5783-4102-8e4d-e7fb3884dc43)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - e0572490-0b5e-449f-952a-c24d3784c2d8)(label(\"(\"\")\"))(mold((out \ + 8ae539db-b703-4a7a-b8c9-032b815e1557)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - adde2067-0554-4be2-bae5-55b50b7f7049)(label(Lam))(mold((out \ + 6a87bcd4-56aa-4c46-8265-e5adfcad8b52)(label(Lam))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - eccf4acc-90e5-4167-ac74-f937a55e9109)(label(\"(\"\")\"))(mold((out \ + ed7009cd-f8f1-47d4-9c56-5b17b16f0158)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 53c99f00-095d-4cba-a9b9-a8e6b140096b)(label(x))(mold((out \ + 6545f504-ff30-47c3-8e4e-8a1e4694211a)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - bfaa630e-15c2-49ea-8f83-79a22d83c91b)(label(,))(mold((out \ + c6954c83-df30-4540-9a20-59139e9e26e1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 7078a79a-4de1-422b-992d-dfef383913f2)(content(Whitespace\" \ + 4d9f6d5f-edeb-482d-a605-156a985bcf20)(content(Whitespace\" \ \"))))(Tile((id \ - abafb7f2-8735-47be-a3a0-76d378914438)(label(body))(mold((out \ + 08368e29-416f-4a72-b04c-4a5998f5a269)(label(body))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ - 234542cf-aa94-4b59-9295-b6f0330b3d88)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9a10f086-5802-48d2-b6b1-106a44b1ab95)(label(case \ + 41d43f00-bb5f-46ae-a974-d479a8b20b36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e8b7e1bb-9de7-44a5-8f5d-912733872cdd)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 41212237-4c04-4dc8-afc3-bb30be4d2e21)(content(Whitespace\" \ + fe56b2ed-f7ee-49b0-9c46-2975ee482181)(content(Whitespace\" \ \"))))(Tile((id \ - 594ab7ab-9dd4-46ff-8c66-20cee405020d)(label(go))(mold((out \ + 80202d99-f4d1-4213-b548-48c8d8234e71)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 3278a946-2a05-4e67-a79f-d72704219c05)(label(\"(\"\")\"))(mold((out \ + 8af022d3-b7c6-4e32-9935-a097ffac8761)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1d662566-cec7-41d0-a431-c64e30ceceb3)(label(e2))(mold((out \ + d85c4d54-db76-4d8c-b4e0-258f6375c624)(label(e2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 776d0819-9903-4357-970e-7c3ee8ac0f79)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - abc35498-fd39-4d4a-8f8b-cadb8a0f90e9)(label(| =>))(mold((out \ + 76db976c-8e31-4f03-a994-d0b352a100d9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 47968f50-8bdf-4a54-960a-76b3d0dafef0)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - e8cc0d8b-a6f5-4ce5-8d87-bbc3398cef21)(content(Whitespace\" \ + f646b10f-c12d-428c-8812-94d97ede1b65)(content(Whitespace\" \ \"))))(Tile((id \ - 5263fafa-c903-4e4b-a427-f713b0b0773c)(label(Error))(mold((out \ + f3dcf27e-10b6-454f-b1b0-cf9f3f813de2)(label(Error))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 55fc3d5b-45eb-47a5-ba84-6c4c035a2183)(label(\"(\"\")\"))(mold((out \ + 2fe04f9c-7570-4ae0-9715-c18a7eec7dda)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 264a1c30-73b4-4d55-83ab-0fbafdca75e4)(label(err))(mold((out \ + b1696163-aab1-451e-967f-90b6cca68795)(label(err))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 2a5a8d54-90c8-4c77-aaba-a78e5a1b79d9)(content(Whitespace\" \ + 5828bb46-4afb-48e6-9c95-df5cce1b22c9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 24465f4c-2416-4452-9eab-0a16fc08a4b4)(content(Whitespace\" \ + 34a5ac81-cac8-4708-aced-1d689ad2820a)(content(Whitespace\" \ \"))))(Tile((id \ - 1fb7ca84-9cd8-4098-bbc7-6bf6215b591c)(label(Error))(mold((out \ + 64564ff8-b2c6-4bd0-a4ca-6f466ec96931)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f6b4c319-31e0-4b8a-9f49-b2692654b5ec)(label(\"(\"\")\"))(mold((out \ + 1f20a945-1d22-401f-936b-a5e0100d66a2)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c8e36181-fb57-4c62-80d5-bea111a15135)(label(err))(mold((out \ + bb35d07d-2253-4623-9d4e-bd7c0e6324ea)(label(err))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 66e3f749-c63a-4d79-b815-752e17743e6d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f184b9ff-efa3-4ac3-95da-78d17b87ecb0)(label(| =>))(mold((out \ + ca8ba32c-a847-439a-9ae1-7f1aba355a63)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bc812682-b5ba-465e-9e42-10463bc6c9f0)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fe6f3526-d3e4-499f-93b1-240c9a28293f)(content(Whitespace\" \ + e24708f2-9045-4f99-a395-16bc8e654a0c)(content(Whitespace\" \ \"))))(Tile((id \ - 41741f6a-52a0-4fa1-ad87-d7bef47a1760)(label(Ok))(mold((out \ + 4f1a95ab-a787-4f13-a7ec-b69880b9a373)(label(Ok))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 5e3112fa-c1b1-45ec-811a-40ad0622cb67)(label(\"(\"\")\"))(mold((out \ + 8f520a4a-0d27-429b-afc2-61aa8bfe52cd)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 4d348a5f-1b37-4ae2-80d4-1a0ee20f0ddc)(label(arg))(mold((out \ + 8465ef7d-029a-4849-9713-a2d69c850ee4)(label(arg))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 3aa6e2a9-6fe0-4653-bdd4-fcb54661f097)(content(Whitespace\" \ + 322f644d-533a-46d6-8a86-690b749e839f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - f514dfc5-6cfc-4c9e-ae39-8c1ed43f3b28)(content(Whitespace\" \ + fd8f8462-8496-432d-be8e-a69a9e87ae2d)(content(Whitespace\" \ \"))))(Tile((id \ - 0374f3a2-0104-41f5-ab3f-a353260f0f22)(label(go))(mold((out \ + efa253d6-e217-48dd-943f-cfbf118c8946)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 38a4fd05-5759-4d39-9f2a-fa83919a6e38)(label(\"(\"\")\"))(mold((out \ + 87eeb534-d395-4c51-b443-be3e4e860a4f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f3c1c0f1-a961-4d88-8485-0c9315ee83ff)(label(subst))(mold((out \ + 908f03b6-631f-48eb-922c-97352dac8886)(label(subst))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 555f55ac-894d-44bb-8266-c1a9682c468e)(label(\"(\"\")\"))(mold((out \ + 50131aba-0fb6-4708-a5ea-0861056a2063)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d0a09e33-b49b-44bb-bde0-2badc0c7d9d2)(label(arg))(mold((out \ + b063ede1-590d-413e-914e-bcef1a6c1301)(label(arg))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 447cace9-0fa3-4fff-b531-b3cbc849435d)(label(,))(mold((out \ + b353f46e-47bc-4009-89c2-aa8946ab4212)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - bf8a262a-5bb7-4138-ad1a-813e1c465fc0)(content(Whitespace\" \ + 18015c36-5bc6-46c1-9c70-c8e6e2343e72)(content(Whitespace\" \ \"))))(Tile((id \ - 6b3f6aff-04a4-46e1-a8a4-f41504c15c0c)(label(x))(mold((out \ + e41a307b-f439-478e-bd2a-d1d0173f2285)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4046df92-b37b-4122-950e-25e7188e90a0)(label(,))(mold((out \ + 17c186af-c531-46f7-8356-85d00a57763d)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 98137c97-221b-4717-acf1-928e65eae632)(content(Whitespace\" \ + e9547011-e87e-4c34-bf9b-655966e58b0a)(content(Whitespace\" \ \"))))(Tile((id \ - 1f77ed77-d070-44fd-bb6e-c42f5ed962cf)(label(body))(mold((out \ + bcb35b72-95d4-4f8a-8e9a-3e302315d1e8)(label(body))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - a7ee3f99-4ca8-4ebe-9f54-40785e5cb780)(content(Whitespace\" \ + 7460ce28-26be-40f0-aaa0-9373606f3a17)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a6a50b08-3fcc-4937-b8ea-de67015bc941)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0442bb30-bbc4-4c21-b116-4c25b717a8f7)(label(| =>))(mold((out \ + 966f0a3b-608b-4080-b391-3d98b6b50492)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2a7b400e-409f-4975-98da-545e7964f7bd)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - f5254011-e85c-4fb6-9309-d6dd51db7449)(content(Whitespace\" \ + d64e9337-93a0-4469-9af0-4ee9d6453881)(content(Whitespace\" \ \"))))(Tile((id \ - e1fe9dcf-1af4-4370-b3f9-52b7fb8c02f6)(label(_))(mold((out \ + dea35fe3-e6cc-43d1-ada2-3d2418e383ba)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0218bc96-de86-4e1b-b004-fc6f4ee34359)(content(Whitespace\" \ + 32471666-95d8-4e06-8cd5-95e05c66fdbb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d95e5e33-8e1d-4826-92d0-a2edbb1334a6)(content(Whitespace\" \ + a2c25044-816d-40d8-ba13-71eeadd1f966)(content(Whitespace\" \ \"))))(Tile((id \ - 93ebb889-6470-47b8-bed9-038bb6067fd1)(label(Error))(mold((out \ + bfb15106-063b-49d1-ac5a-b14164b78f1f)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e431732a-ff7e-4c2d-8577-70f31df6dd2a)(label(\"(\"\")\"))(mold((out \ + 11e31114-5874-4f4a-92e7-a1781c293ac3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 0f49e3db-4e8c-4485-b9ce-566cb07ed83b)(label(\"\\\"Not a \ + 5e356d25-77a5-4339-8a85-5a0a39fc7109)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - e8674c94-d93a-4807-a026-054226eaedb0)(content(Whitespace\" \ + 9b853aaf-1e80-4349-9149-8019538df97d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 55467e2b-a040-47b0-878b-eaa6c51b19c9)(content(Whitespace\" \ + 74ee3ae0-a7fa-4906-b919-7756de9ec844)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7a8d6ec5-05b8-47e8-9b2f-cf106cd2c69c)(content(Whitespace\" \ + eaed0d7b-c28e-4a9e-9af2-4df2bf7b4610)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 45b92fd9-afec-481c-aa1c-11675cfeb305)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e8234637-28bf-449c-a58a-a21f3740669d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1e8a79f2-5adf-45b3-ad8e-8f294ada7e04)(label(test \ + 2742b497-9df3-4103-8300-0ede47600ec9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6c00d79f-55b7-4af5-86ec-39129c6fab6b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + bbcb96a7-a381-4560-a5c0-2b9177973a61)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 6094ebbc-987f-4b3a-ba3b-d4590f5d5122)(content(Whitespace\" \ + c7150dee-d911-4aff-b2b7-1f1a37ebff6c)(content(Whitespace\" \ \"))))(Tile((id \ - a5a6fb47-d197-4169-81ef-3913fd7d121e)(label(result_equal))(mold((out \ + dc1674b9-b1ce-42ee-b61d-0857d13c138c)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 90259ca4-811d-4e5e-82ca-d8b9038f350d)(label(\"(\"\")\"))(mold((out \ + 0e5338e2-c213-444e-b75c-e4116320d833)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 08c57702-d6ab-41ae-963b-889b16006a39)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - a0648b0b-05b2-4b5f-a507-9707f77104d9)(label(go))(mold((out \ + cf5cad9e-e6ec-49c7-bdee-8d4441e325f9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1da27fb9-f992-4af6-8756-1df9c8b59b85)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f9ec2ee8-0fc3-421c-90c3-e97df74b1fea)(label(\"(\"\")\"))(mold((out \ + 524da4d2-1c16-4bf5-90a6-6bef130c603f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - a90263ed-b3c8-4b97-a32a-3b1703eae933)(label(Var))(mold((out \ + fb8d9b13-44d5-4719-9861-0babba4dacff)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7df28413-cbe4-4d9b-892d-735862802f01)(label(\"(\"\")\"))(mold((out \ + cda6402f-9481-4615-aebe-eb224d76a5d1)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 93c72da1-185b-419e-9a6f-a2647aa684f4)(label(\"\\\"yo\\\"\"))(mold((out \ + b44d5596-748a-4cfa-939b-af4d0ca02c5c)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - 1a7c34d9-f50d-457e-a793-4ecf1c232a83)(label(,))(mold((out \ + 4f792941-af4f-40b6-a394-30895e0f00f9)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 003ab1fd-9832-45d1-b4bc-71507ae7efa0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 70b27edd-711f-4a47-b37c-ce94ad2eb672)(label(Error))(mold((out \ + 70332ab5-d800-44ad-86b5-d655a88a2c30)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 413e5e96-795c-4e29-bc37-22acb6c4da0c)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 45121480-ee6d-4407-acaf-f9d2a7a05f74)(label(\"(\"\")\"))(mold((out \ + c3979f6e-937c-4d4c-b9a2-4125ad789bf5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 52856d4d-6cfd-48a7-b67c-67a48dca192a)(label(\"\\\"Free \ + 551d806c-e0aa-4981-b9df-02321c88a553)(label(\"\\\"Free \ Variable\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - b1664e5f-802e-4cd9-ae37-2a17ababbdde)(content(Whitespace\" \ + d6d63453-84ab-4a41-9176-6e7dbb4e1943)(content(Whitespace\" \ \")))))))))(Tile((id \ - c6b8cce8-f0a7-4d81-817f-76c332c61202)(label(\";\"))(mold((out \ + feb5bacd-551d-4d07-a1ea-29c39a1fdb79)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7a10df4a-f107-4a90-b690-efde0cee5118)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b98db53f-b82b-494f-bc54-162c5dbb4e38)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0151d06d-26cd-4a4e-a1f7-4595e62b963b)(label(test \ + bb64080d-1bc6-4fe7-8d05-c5723be59661)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 29176a34-106f-4a75-b5ab-66db54327180)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 46713147-d60e-4dd7-95ec-16dad85d7b9a)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 2be0afaf-0ea0-417a-8b85-13917589fa61)(content(Whitespace\" \ + 7f6d14ef-090b-45ce-aebb-ad1fdb0902ef)(content(Whitespace\" \ \"))))(Tile((id \ - 7485c363-bd50-417d-b2a2-f4e9c04642e1)(label(result_equal))(mold((out \ + 3ff5d80c-e8d0-4a5e-9027-520af94cfc7e)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2895db6a-2296-47be-8070-ebae8674c840)(label(\"(\"\")\"))(mold((out \ + 32c0c246-b8ce-48c6-812d-bd37a7759924)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - a15c093f-7ae0-4576-a671-111ce31e8316)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0d09c652-1c89-4c6a-8f21-6dc56e3c800c)(label(go))(mold((out \ + fb19a67b-b7d3-48f0-b9d1-c98e99c3eae1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + c30ddb2a-c446-4b39-9d3d-cc12f222cee8)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 570331d6-cc2d-442f-8fba-d2c5bf958fd0)(label(\"(\"\")\"))(mold((out \ + e9a2d8bc-9bd2-4f6a-88e6-b3e13488756b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 902d3c61-293b-4559-9d99-c192329f5e5f)(label(Ap))(mold((out \ + 8814f01d-fc0a-432a-95f9-894aae5eeb4a)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f984d7d1-d685-4799-b320-884c762200f8)(label(\"(\"\")\"))(mold((out \ + 772255c2-1dc7-4659-b2fe-e2c6a381c4af)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cd2912c6-c409-4fda-aab8-35956cdd26f5)(label(Var))(mold((out \ + ac43ecad-faa9-44fc-a66d-119773496659)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ea59c66f-6572-4ca8-aeac-bcd270388fbd)(label(\"(\"\")\"))(mold((out \ + c47fd37d-7375-4d29-a778-19c186b85152)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 51a16fb1-c1ef-466a-a33f-ffb7cb80cf33)(label(\"\\\"no\\\"\"))(mold((out \ + fc04ba8b-e863-4d47-84bc-e76f86aedb8b)(label(\"\\\"no\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - b4d9c33f-afad-4030-9e81-ea65a3139dd4)(label(,))(mold((out \ + 56b7e667-52be-4129-a50f-ca4d7b9e860a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - a80fc258-b58e-4978-9e8b-2bdd4d4a68f7)(content(Whitespace\" \ + b701987e-c54f-44fd-b5ac-071e240664fe)(content(Whitespace\" \ \"))))(Tile((id \ - a0af3a35-0d79-4b9c-9592-a4216f0afd34)(label(Lam))(mold((out \ + 348d7a8d-a9cc-4fe8-86a2-3b5400dd4bc2)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 46c8174b-eec5-4ef7-8b69-a0322825a218)(label(\"(\"\")\"))(mold((out \ + 33024117-5eee-49a5-ae56-e27b46432d92)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1ddfd455-7913-4134-80df-0b22160d61f0)(label(\"\\\"bro\\\"\"))(mold((out \ + 8a43d100-7c3b-4f17-86d3-edf03d2e3240)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - ac5e7f7b-60a9-485b-badb-7e1c8fb7a403)(label(,))(mold((out \ + 9de32611-ca41-4e26-a243-6c249cf1909c)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1924204a-227d-466c-ad74-d58628946239)(content(Whitespace\" \ + f8a33080-5694-475e-8e8f-2828c20280dc)(content(Whitespace\" \ \"))))(Tile((id \ - 37f924a4-e678-4bb6-a7c4-7bc7859475d4)(label(Var))(mold((out \ + ef8b3a10-2f0a-4544-9a87-49fc1ed89daa)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5d9ffe55-e724-4f81-9852-3a952f6ee39e)(label(\"(\"\")\"))(mold((out \ + 7cafc442-36fe-42a2-bac6-77d6464b2525)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 08d893d2-8e40-4460-af5c-706f6d3811ae)(label(\"\\\"bro\\\"\"))(mold((out \ + 85f8f49b-9ac0-462f-8ba2-1cfe68a32f2f)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - 8979711e-777a-494e-8f10-a26eb35e7ee1)(label(,))(mold((out \ + 79d44841-8089-4483-8a30-9bd77d80e013)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 868414a7-f682-4dc2-ac82-5d4836fca682)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d0cd5b04-b38b-4b42-9379-3157c07ad1dd)(label(Error))(mold((out \ + f1eaab24-ac64-446c-b110-5081e76460e3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6c62d31e-0cd3-4a93-b3a3-e0bfc2b6ee1d)(label(Error))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 230bec03-8de0-4f59-a6de-e2cfca4cb421)(label(\"(\"\")\"))(mold((out \ + b32d4e0f-bac1-4b15-93eb-b31188f3091c)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 49ad20d7-f3c2-47de-b0ff-870a6be8c8d4)(label(\"\\\"Not a \ + 3f91fda2-74c6-40df-8438-21d9c20b27d6)(label(\"\\\"Not a \ Function\\\"\"))(mold((out Exp)(in_())(nibs(((shape \ Convex)(sort Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 84194f1b-3ec9-4047-afaf-cc110e1535d7)(content(Whitespace\" \ + 6ae76fb0-056b-4992-a831-90d2e231da24)(content(Whitespace\" \ \")))))))))(Tile((id \ - e9f0314f-b20e-4087-9bba-b23644d30076)(label(\";\"))(mold((out \ + 1bc273a7-62f1-458d-a09d-4bc459b51ff9)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 942c0f5e-b689-4bb8-8fc0-7a4c0cd62c0c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5d1dbc4a-da22-417d-87ae-d5bf3974ae05)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 237abbf2-5347-4efd-9e42-ac87987b30ea)(label(test \ + 4db865b2-a2b5-46a2-9b64-eb5c03bba5fc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 5a65f3a4-cccf-47f5-a42c-45f8b6a4c611)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a0f14269-3b6e-4705-ae46-0659522f7eb7)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - cfc0eaf8-a2c8-417c-b9b1-25c24430ac7f)(content(Whitespace\" \ + 60a82b59-576c-466e-b777-162b734366a8)(content(Whitespace\" \ \"))))(Tile((id \ - 75994931-1e08-4310-a5d6-e5725ef06311)(label(result_equal))(mold((out \ + bd26bb81-052b-4000-a91d-b18b5f18304a)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5109b948-0e5f-448b-b955-7ac829c3afd1)(label(\"(\"\")\"))(mold((out \ + e398512c-3c96-421f-a455-0770f2140901)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 07f5536a-509a-4c5d-ac1d-fc9898764ed5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1ed95fba-a9f3-4d96-ae6d-8f9fdd3ae5ac)(label(go))(mold((out \ + c14e1080-d592-4d1a-8d7c-f6a769ac9817)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 01eb8e74-dad2-433e-84a3-6db864b278da)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8c82afd5-a7f7-4d9f-8af7-0758b6b0dfc0)(label(\"(\"\")\"))(mold((out \ + c08d17a3-86f0-44ae-abd8-130ae24f3dc7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b0e4f88f-7a5d-42ff-ac82-a2e00db35470)(label(Lam))(mold((out \ + a3609f3e-e1aa-4710-ab9c-b0a9e1e41cb0)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b43c70aa-3882-4631-af74-fdbbb08ec450)(label(\"(\"\")\"))(mold((out \ + 2e9a1702-d984-4664-8871-2ff384af950f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 89d67f29-9084-4e15-b211-5c66d99c4fc3)(label(\"\\\"yo\\\"\"))(mold((out \ + 7a98a8c9-f5c5-4595-b74c-bd7c57200801)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 158b4637-5f89-40bf-abff-a3191fbc3bbe)(label(,))(mold((out \ + 3092c611-314f-4958-a773-b4972a71e0b1)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 3b9c9dcc-09a4-4afa-b571-63577837dde0)(content(Whitespace\" \ + 635ca0e5-1a66-4e20-b9ba-a5d4856a438d)(content(Whitespace\" \ \"))))(Tile((id \ - f9e0908b-7fa0-418c-b050-19bcd78ccf09)(label(Var))(mold((out \ + 529e16d0-74d0-4670-b329-a329c1f4cea1)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 01ff76a3-9d39-4782-9d03-bc02f98577ae)(label(\"(\"\")\"))(mold((out \ + e246b571-1849-4dc7-b821-1a8acea9f001)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 251c79d1-3b6f-4655-9baa-25be3fdf5e81)(label(\"\\\"yo\\\"\"))(mold((out \ + e65e7f5a-000d-4d97-87af-4e948296bd0b)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))))))))))))(Tile((id \ - eccc83ca-6bf2-4fa4-a569-9b6fd9801d96)(label(,))(mold((out \ + ca97cbc0-b06d-4ae1-a04b-7eb4879c45dd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 51df95ee-9959-4c38-853d-0b9815f2d1d0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 78675b1a-1ebb-48cf-82bf-e428913d42a7)(label(Ok))(mold((out \ + f9f62ab3-94e1-4460-9e1a-282be3745ad7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 48a468f5-bc00-4aa3-811a-50dd0b2e066a)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d7751996-48a9-451c-87a9-c662dc3931b0)(label(\"(\"\")\"))(mold((out \ + 2b2abf13-4865-4d7f-8c3f-abf22f0fe647)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7a1ddecd-15dd-4afd-a2a8-bc61e688f2e6)(label(Lam))(mold((out \ + 60f99f2e-0391-4ab7-bc47-9959fc05c337)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 8989861a-8871-4e45-a02e-49827d163dd3)(label(\"(\"\")\"))(mold((out \ + 545c2d2a-aa3a-431b-b9ca-dd716ca6ee59)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 30acbec3-ad58-4358-b9a7-040a4dcb4f77)(label(\"\\\"yo\\\"\"))(mold((out \ + 8ec6f6db-756f-4b23-b33f-224024733650)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d153a0f1-f2ba-469b-8f79-d628aea52843)(label(,))(mold((out \ + b268b8e2-24f3-41c7-9ceb-614175cbdcfd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 2d0ef5f6-d129-407a-8540-48655fac6119)(content(Whitespace\" \ + 75e15384-186f-409f-8edb-ed5483ef5fe3)(content(Whitespace\" \ \"))))(Tile((id \ - cb93abd5-576a-41f4-b3e1-f48a09a8a6d0)(label(Var))(mold((out \ + 3a4e0acc-7c31-4bea-ae4d-1fe250479d35)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 7c96c433-be79-45b7-a15b-d98400b69007)(label(\"(\"\")\"))(mold((out \ + 2cc0bd9e-7ab2-4053-a6bf-fa47a4fb584d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - dacc91ee-d7b9-46dd-8cb4-2f02552027a9)(label(\"\\\"yo\\\"\"))(mold((out \ + d4f2ee78-1d23-4cba-bd04-cc2a7ceeea0e)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - 8d0107b5-1304-4692-82ad-53469ecf438b)(content(Whitespace\" \ + c53a30a8-81ef-4c7d-a11a-0e8ead9b8adf)(content(Whitespace\" \ \")))))))))(Tile((id \ - a8014788-bd37-4b74-9744-4b3dccb4f929)(label(\";\"))(mold((out \ + 48683a3c-af45-4567-a931-2c397fb9c5df)(label(\";\"))(mold((out \ Exp)(in_())(nibs(((shape(Concave 10))(sort \ Exp))((shape(Concave 10))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 44000c59-c8c4-4384-8c85-832b1ca9e937)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3faee02d-d7c3-4a6c-9031-ee27360a5555)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ae80b8c9-efdc-4936-b58f-c4adf62acce8)(label(test \ + 82e74442-d468-4d67-ab9a-f7283e528d1f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 91ee522a-16d2-4a23-82db-b89e15672bc3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 0d7e8380-fd82-42c1-bd68-6794c7add033)(label(test \ end))(mold((out Exp)(in_(Exp))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 80a4ffda-5aea-40a5-a869-a9f441ec8fcf)(content(Whitespace\" \ + d5bcc48c-02f0-4ec9-9049-dfed5d9d5fd2)(content(Whitespace\" \ \"))))(Tile((id \ - 10309356-b905-4d26-a104-925ec9be1324)(label(result_equal))(mold((out \ + ccde96f9-1245-4968-a65e-090d805d2858)(label(result_equal))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2e0d58fe-0762-406f-b31d-3d1e7e8956e0)(label(\"(\"\")\"))(mold((out \ + 1bccc9ce-f2bd-4975-a1ad-e7b966d4fe9b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Secondary((id \ - 6d550f3f-b227-4653-967c-a3a1ddaa8766)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - df7ce05c-2a6e-4d02-bf4e-0739e936bc6b)(label(go))(mold((out \ + a1b785b5-2829-4837-b045-4d3eab2ccf6c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5db82cd6-7826-40fe-8f3b-06294c9f70b5)(label(go))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5b02ecd7-25eb-4905-aa52-53769ca4e589)(label(\"(\"\")\"))(mold((out \ + 6459ae52-fba1-4422-afed-2af890e89881)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 328826bb-1afb-4dbd-83f5-c7c69193ca45)(label(Ap))(mold((out \ + ba3b4488-1a4c-48b7-9b06-dca7cac506d5)(label(Ap))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2585d4c6-94e1-41c0-bc38-958200e47166)(label(\"(\"\")\"))(mold((out \ + 53b88c98-5573-4b87-8f94-f230648bc9e3)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - be9e6bc2-fa06-4be7-bc0d-6a88f20b7462)(label(Lam))(mold((out \ + a84b125a-eb33-46fb-b8ec-b5d17012da7a)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 016ff999-eb93-429d-82db-de9e3b5d54a7)(label(\"(\"\")\"))(mold((out \ + 1f73579e-4516-4cb5-bee1-5c07600b7a46)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b0364c5b-cd95-456b-ab09-bbac75701c5c)(label(\"\\\"yo\\\"\"))(mold((out \ + eba58ed1-7aad-4613-84f7-63dcd5233c29)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 72dc8733-aa8a-4dd9-9549-07b64b7899c5)(label(,))(mold((out \ + 7e9403ac-bcb9-4fdf-afff-ac51847b82e1)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - d7c0267b-b574-4cf0-9869-bf068fbfdba0)(content(Whitespace\" \ + c56293a7-632e-4074-9039-b929e76fcd6b)(content(Whitespace\" \ \"))))(Tile((id \ - ccb35eea-85b5-4521-bd5a-9e855cd6948b)(label(Var))(mold((out \ + 425c8f21-dda7-4a2b-89a7-4592f5f127c5)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d77c4bfd-da0a-441c-b66e-bdda91c25b80)(label(\"(\"\")\"))(mold((out \ + cf9fe5c2-0358-4bff-93cc-700ee3bd954e)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - fdd79951-cc44-4e10-97bc-f6cab6a88947)(label(\"\\\"yo\\\"\"))(mold((out \ + 1adadbe9-b0d2-4eae-beaf-50e53ff674f9)(label(\"\\\"yo\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ - a4692af1-4104-4acf-ad10-091dea271d54)(label(,))(mold((out \ + c654e02f-6794-4576-8675-0d687e98d297)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 75271912-ffef-4c9f-a2a3-b9adf1c5b957)(content(Whitespace\" \ + 208a5dc5-30ed-4ab5-8a2a-86013c261c73)(content(Whitespace\" \ \"))))(Tile((id \ - 2ea5d37d-4ca6-44dd-b907-1635e1b6cf66)(label(Lam))(mold((out \ + fbd1675f-de3e-4dbc-bb53-63984df85e96)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - b42b9fe6-7f5b-4083-bdde-0542f512248a)(label(\"(\"\")\"))(mold((out \ + b5787e6b-5923-4b1e-9d57-80d0a946ff56)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 39dd7498-15f8-4fd9-b4b0-955d31f8f511)(label(\"\\\"bro\\\"\"))(mold((out \ + ca7d0070-f638-4eca-b9dc-1e61585a2da9)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f8572b4b-ee71-4acf-8cd8-5cd56ec2ec38)(label(,))(mold((out \ + 871b3610-0b08-4b3a-9fd4-b0e507c5352a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - beb02b44-3d46-4eca-bf0e-bb2a8db51024)(content(Whitespace\" \ + 79a5579c-74c7-4376-ab05-b15f16e99472)(content(Whitespace\" \ \"))))(Tile((id \ - 67f5a924-04fe-4ea6-81f2-233fef16c285)(label(Var))(mold((out \ + 58a1aff2-0efc-4809-8bcd-a6807ad6b9da)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5c2be202-b2b9-4ef5-8b61-75546d6140d0)(label(\"(\"\")\"))(mold((out \ + 9f7f577b-6809-486e-a519-9ed71836b2dd)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 580a3ad3-7908-4142-99b5-2a15edfd82b0)(label(\"\\\"bro\\\"\"))(mold((out \ + 60f30909-1f83-4a51-9d98-d259495586ee)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Tile((id \ - b822c800-3312-485f-8aaa-95df1e94d95b)(label(,))(mold((out \ + 5482b64b-93fe-4ddc-b4de-1f4e575d284a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1c58b5f2-2a81-464e-8a0d-81ee0a095acd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 597c3d97-a29c-4ac9-bd09-572a9c969973)(label(Ok))(mold((out \ + 408c92e3-f951-4f31-8752-862356b88882)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a64bc919-82b6-498f-a66c-ab5ff390ad76)(label(Ok))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 5eb946a0-3d3b-4c5a-a666-72368009318d)(label(\"(\"\")\"))(mold((out \ + f49998ee-e91e-4645-9b8b-0ba86a84543d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 348f0580-d617-4e56-94e5-40315ebc8177)(label(Lam))(mold((out \ + 6703e9c9-1ab4-414c-9603-8cd0ddb3c949)(label(Lam))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4d002dab-e9a3-4342-983d-f89d8adf9790)(label(\"(\"\")\"))(mold((out \ + dc85022b-d88e-4d56-9adf-8db59a35a6a7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1e18c60c-8cc2-4888-9a82-de4abb2e8009)(label(\"\\\"bro\\\"\"))(mold((out \ + 84005dd9-b58e-4ca3-9074-0456d2f430c3)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bec1f96e-270b-4b38-ac23-f91a922ecb9d)(label(,))(mold((out \ + 76aa3723-c0f2-41a8-a8aa-ec010969619b)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 05be8227-cbdb-436e-a30a-1f07128600fa)(content(Whitespace\" \ + 478ac908-46d2-4e78-8cae-1a803f6de024)(content(Whitespace\" \ \"))))(Tile((id \ - ac143494-1d0a-44ee-8ec4-eb67fa980bd4)(label(Var))(mold((out \ + c808791b-791c-4340-94b4-23bcf027103a)(label(Var))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 53049946-13b9-4533-90a9-9ae50158b5f4)(label(\"(\"\")\"))(mold((out \ + 66ba6264-558c-45bc-9dde-a6f0e0820b6d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d8925efb-88d4-44b2-b35b-7123979599cd)(label(\"\\\"bro\\\"\"))(mold((out \ + 7df83f37-87bf-4ca7-be5b-76684bd9b70a)(label(\"\\\"bro\\\"\"))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))))))))))))(Secondary((id \ - bd33c025-a7f7-4b24-b2f7-e8a2db44419b)(content(Whitespace\" \ - \"))))))))))))(ancestors())))(caret Outer)(projectors()))"; + ec814595-1e64-49d1-afcf-91e3ff70e2c2)(content(Whitespace\" \ + \"))))))))))))(ancestors())))(caret Outer))"; backup_text = "# Lambda Calculus via evaluation by substitution #\n\n\ # An Expression is a variable, function, or application #\n\ @@ -16731,7 +16819,7 @@ let startup : PersistentData.t = # Evaluation can result in either an Exp or an Error #\n\ type Result =\n\ + Error(String)\n\ - + Ok(Exp) \n\ + + Ok(Exp) \n\ in\n\n\ let result_equal: (Result, Result) -> Bool =\n\ fun rs ->\n\ @@ -16771,1586 +16859,1590 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(()((Secondary((id \ - 651cf426-87e8-4630-b2c1-0dd01f8136e3)(content(Comment\"# \ + f531d966-9656-4cd1-82eb-4a80ce2a0e92)(content(Comment\"# \ Polymorphism #\"))))(Secondary((id \ - 7bf3ea0c-2409-48ec-9cbd-c4db9dd8ceb1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 0065bac6-88df-4f01-9c12-37529a31f12e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f4ba5166-33ae-496d-b91f-0404c44b08f0)(content(Comment\"# We \ + 5d4daeae-ecdc-47bb-9992-ce5024c2275a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + f0d8f788-9aab-4b69-a3f9-3cd9a1a70a34)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cc230dc8-58b5-4cb5-8aa5-0bfbe1177102)(content(Comment\"# We \ can take types as parameters to type functions, \ #\"))))(Secondary((id \ - 0814d398-6324-4ad3-83dc-e4b7c56bd80e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ccedfe2f-e0d6-463b-b311-b2b6ba90da3a)(content(Comment\"# and \ + e3ed5d2e-ab27-412f-943e-879e38ac559b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 4c6236c2-fcd4-436a-8b7c-3d43650efc34)(content(Comment\"# and \ use them in annoatations in the body: #\"))))(Secondary((id \ - 0e7cb272-988b-4b61-b034-9a244cc54af9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e34a81e3-bcbf-42a0-8837-2e1f0aa8f94b)(label(let = \ + a619a88d-7e97-42da-86e7-01cf8dae47f1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8fe814f0-7895-4bcf-8682-048682dafad6)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 74bb7b34-37f4-446d-8da5-224546f72a38)(content(Whitespace\" \ + 7a2fbf23-0e73-48d9-8acb-c44e9de98ab0)(content(Whitespace\" \ \"))))(Tile((id \ - cc14145b-5724-40b4-a2b9-b23cb87aefe6)(label(id))(mold((out \ + 09c2d8c4-44bd-46ac-88e1-4b59ac422cd0)(label(id))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e877174f-3716-4098-8c87-6f95e54dddbf)(content(Whitespace\" \ + 3e02eb03-cc7e-4bf5-aa55-ad0711844d4f)(content(Whitespace\" \ \")))))((Secondary((id \ - 71dddd12-6259-4719-bcea-f90c68bafe6a)(content(Whitespace\" \ + 74d633aa-7732-4047-942f-27acd258c1f2)(content(Whitespace\" \ \"))))(Tile((id \ - 6beca6b0-993d-45a9-a8d1-1ecea1cb2720)(label(typfun \ + b26bcb03-3d9a-4c2d-be3f-114342660b72)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8feee0d6-c747-499e-984d-355a51cedf20)(content(Whitespace\" \ + fed3d945-d2ba-4c7d-882d-fea46a9cfc64)(content(Whitespace\" \ \"))))(Tile((id \ - 9191e0c3-42c6-472b-ae2e-0470c3850e1c)(label(A))(mold((out \ + 97a3afb8-5ba2-41ca-ba64-e1a9927ae4d5)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - f83a7321-1a96-474b-b4d1-2b98eb97c5ad)(content(Whitespace\" \ + fce66ca9-fac6-4fd4-a549-98523b937dac)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 67c0a2f2-1402-4a0e-b4c8-b3769965ca6e)(content(Whitespace\" \ + 7229523f-57df-4078-ae8f-537742066b36)(content(Whitespace\" \ \"))))(Tile((id \ - 98f8bfee-2dea-4ff5-b886-0758d9ee3905)(label(fun \ + f343ddc7-57cf-4625-b9b8-d42e4265375a)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8e89dc9a-cf0e-4b27-8b31-44cffc6eeb38)(content(Whitespace\" \ + e3bf119b-c817-467f-800c-6169bff4819b)(content(Whitespace\" \ \"))))(Tile((id \ - cabb2de8-5036-4b32-99bd-9d17934ae3b6)(label(x))(mold((out \ + 2a54e776-4210-4996-893c-280d9d0544dd)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - cdb068d9-bfe2-452c-9b25-1733771ff10a)(content(Whitespace\" \ + 1e085266-26a8-4803-bdd9-737e13c30194)(content(Whitespace\" \ \"))))(Tile((id \ - ef579416-3560-4e0c-8140-6f254b453343)(label(:))(mold((out \ + c936896e-5dff-49bf-aa98-11b4ce862761)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 370a3fe7-b656-4e1f-af5e-efa134f94d3c)(content(Whitespace\" \ + f6b1032e-1e9e-433e-86ab-456f90af4222)(content(Whitespace\" \ \"))))(Tile((id \ - a4808358-bc09-4bc3-a82f-8df522cb5ff2)(label(A))(mold((out \ + d5a47c6d-d24d-4ef1-a060-606484b965d5)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - e6a4b929-c540-4b17-a8a5-697a51b3a177)(content(Whitespace\" \ + bdcc8870-b74b-4553-977b-757a485b10e5)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a779e49a-6fdc-419d-b601-03c6a6ac330e)(content(Whitespace\" \ + 2072eb8a-d2ee-49a6-b6ec-7cafbbde3033)(content(Whitespace\" \ \"))))(Tile((id \ - 8ff0b984-c4c9-49f5-87ed-561b23763bb1)(label(x))(mold((out \ + 5dca5191-0403-436d-a497-f652cbad5254)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - a9180550-b17a-4456-90c2-e14d50d32be1)(content(Whitespace\" \ + b4cb6907-0c38-4b67-ad96-45b705bfae1a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 9c8b8a0b-c433-4b12-b5b1-201d09d976f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b2061091-bfdf-4c00-a3e5-f598bac1c210)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f4ff2b75-c92b-402c-8ac7-7765067cf9bd)(content(Comment\"# Such \ + 6aff849b-59d0-46a0-b781-8678637e1073)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dd8ae2d5-654a-4b51-9417-480b68a56dc1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8d899bc1-ee49-450e-a084-5ac90ffefc82)(content(Comment\"# Such \ functions are applied like so: #\"))))(Secondary((id \ - c856ef99-4cbe-4df0-a271-323fa199e85b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - bf1d4326-fd6f-4646-bba6-7f3c112a5347)(label(let = \ + a5a251b0-eeff-4256-9c72-996faea5a498)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2a93c2ca-b6ab-4a7a-87b0-839aa512a691)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 402bc02c-9486-4a7c-99bc-726aa01f0b8f)(content(Whitespace\" \ + 9c13bf6a-f462-4648-a65f-2ad55c680536)(content(Whitespace\" \ \"))))(Tile((id \ - d0ad0961-cf37-442e-a94f-606291b0726c)(label(ex1))(mold((out \ + 97c53ee2-470d-4e7d-b812-4d4a69455557)(label(ex1))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 987ac511-1f83-4756-96a4-cfeebe72c062)(content(Whitespace\" \ + 91b09e76-1e5b-4933-80c5-0b9f239a109f)(content(Whitespace\" \ \")))))((Secondary((id \ - 29dac5ed-690a-4a9f-bec6-1faec6bac423)(content(Whitespace\" \ + cb270ebd-2836-4130-8fad-aeaa67b7f980)(content(Whitespace\" \ \"))))(Tile((id \ - cd0eb513-b9df-4308-bf41-3ab098eb0a80)(label(id))(mold((out \ + 7877499d-8e57-4741-a58f-ff125003f013)(label(id))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - e48bf7e2-18ef-412a-8be3-365bc541f4c9)(label(@< >))(mold((out \ + bd57d181-948f-4fb2-8bde-9561b1683c7d)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - eb3c3ccf-8b71-4238-9d97-ea6e269a22ff)(label(Int))(mold((out \ + b605dff8-7b5d-41d7-b163-ed66ada5dad6)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 7676ef9e-b9ef-4203-b42a-4bb17e58ee55)(label(\"(\"\")\"))(mold((out \ + 23a880e4-666f-41fa-acb7-edc3faafe278)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ffc6e3e8-637e-44f4-9b92-a53992d7cf3a)(label(1))(mold((out \ + abd95a67-518c-43cd-b0b0-09139ea11f68)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8cd858b9-7117-4816-a222-b863302a5897)(content(Whitespace\" \ + 6e67188c-d54f-4182-b6e4-e20be7409fe7)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 45ba71db-e020-4dc4-8872-d3eaa161a460)(content(Whitespace\" \ + c856a4ab-7681-4169-85cc-4003aa80bc52)(content(Whitespace\" \ \"))))(Secondary((id \ - e0f69efd-f37c-45ef-b832-e5acec565e55)(content(Comment\"# 1 \ + d01b7960-22ce-4418-92ef-1be2bb1c0fbc)(content(Comment\"# 1 \ #\"))))(Secondary((id \ - e7b6361f-89ac-4dc7-8dd9-5baf787c00a4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b12552dc-e461-4198-9108-62956d2612fc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 19020eb8-64e9-4ade-99b5-770181a4fc9f)(content(Comment\"# We \ + 777d62f8-331f-4d1e-8a5a-1a09a9f89ec3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 90e879b8-483e-4c4c-b233-2b31b7c2dfb7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 491a90e6-ead6-42a9-8284-279180c8c580)(content(Comment\"# We \ can annotate the type of a type function with a forall. \ #\"))))(Secondary((id \ - c6f027cf-02d0-4f02-81cd-86dec8ce7b51)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - fb45c186-1d70-4dbd-8a6f-a5ce690973f4)(label(let = \ + c624f13c-9188-4c91-ace5-e7224e6a6dbc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 1af4a4d0-b52a-4ec9-979a-9ae451f1f848)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 58e9d527-5e8f-4c64-af5b-f661961e8bca)(content(Whitespace\" \ + a719a29e-7014-4e0c-b5e9-cfdfe8d414f5)(content(Whitespace\" \ \"))))(Tile((id \ - f73aca46-0abb-40ad-896f-c8ce8957f631)(label(const))(mold((out \ + c2aabeb4-a488-452f-88a5-0e19c623103c)(label(const))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - e6b15f72-d5f2-4bb1-9554-f7b9564af0d8)(content(Whitespace\" \ + 81273931-7fe2-47cb-a084-f4b062107fab)(content(Whitespace\" \ \"))))(Tile((id \ - 841dfe90-8662-450a-8b27-a6ee0303c590)(label(:))(mold((out \ + 03fb0ac4-7aa9-445f-a553-93f4f07d6e8d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - cca36823-5a38-4ca8-a52b-8a7e7a81697d)(content(Whitespace\" \ + 7b7acab2-079f-41d6-a0e4-baaa4d119467)(content(Whitespace\" \ \"))))(Tile((id \ - 13038321-5b88-4cf2-b830-788950373baf)(label(forall \ + 0980446a-d625-4b8f-990a-e68e1654e767)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 869969ee-455b-4b21-8955-18fe2363d650)(content(Whitespace\" \ + a3659d37-0062-4269-ab07-8d0d7b8495d4)(content(Whitespace\" \ \"))))(Tile((id \ - 25a69abb-673f-4ee2-97e1-0bae3524e9b9)(label(A))(mold((out \ + 880b2494-aae9-4110-8880-1f3ef78c91e4)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - c850e5ba-7870-4230-9555-a1b57cfb33d3)(content(Whitespace\" \ + 9afdb2cc-c50c-438d-b204-af497695d4c6)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 8ff18849-8fe3-482f-b954-256a70beaa88)(content(Whitespace\" \ + 86b64f50-4921-4a9b-8724-dbf6044084fc)(content(Whitespace\" \ \"))))(Tile((id \ - 9e1cc376-b65d-452a-b485-fc33f2b86b37)(label(forall \ + f22c1d66-073c-41f8-8af0-aa16e606fa9f)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 3152b0e9-0ae7-4345-b29f-474b587a5ce9)(content(Whitespace\" \ + 41e37e8e-f6b4-4dfa-adb5-c0ee132c4dc2)(content(Whitespace\" \ \"))))(Tile((id \ - b4164ce3-6b0a-408a-9e8c-20c09c5697ce)(label(B))(mold((out \ + d61481c8-74a7-4f04-a2f6-427060e232b2)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - f5de9b0f-f034-4185-a629-c010cbfb353d)(content(Whitespace\" \ + 4efbad43-f2cf-408e-afbf-d5bffbaf1a6c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 637e506c-0b3c-42d8-b741-f040661ca0a7)(content(Whitespace\" \ + 51b65168-3574-45e5-8451-55997f736b2d)(content(Whitespace\" \ \"))))(Tile((id \ - 95d49d93-3962-40e1-a538-7bf5d11205f3)(label(A))(mold((out \ + ac21fbdf-6530-4b72-b1fb-74abf3975f88)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 86b564c0-c53d-4a9e-aefd-473a538673b7)(content(Whitespace\" \ + aaf75b4a-c5ec-4f37-b2c6-6b4f15dcae18)(content(Whitespace\" \ \"))))(Tile((id \ - f7458113-7cb2-4095-937d-0fea30d3562e)(label(->))(mold((out \ + ffe8fd86-e515-4f69-a4d6-38e4e7ae4d74)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 882f26a5-fe1d-4aec-b84f-c1c846d7ec87)(content(Whitespace\" \ + 7b01f898-6c54-4555-ae46-1e2c9af28bbc)(content(Whitespace\" \ \"))))(Tile((id \ - d809a627-ee26-4346-a085-7b919cab6e22)(label(B))(mold((out \ + 9d309ec8-ddc9-4ffc-80ca-bdec1e3ccffb)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0eb184a3-5de9-4b3e-ad44-7dcb0004e328)(content(Whitespace\" \ + 1eca4b4a-ffa5-46f1-9767-78d4952e1a46)(content(Whitespace\" \ \"))))(Tile((id \ - 6190f58b-6c2b-4807-9966-e8421963b51b)(label(->))(mold((out \ + e1004d45-7d54-4c88-96f1-a90babcf6f9d)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 958d916b-16d9-4610-a0ba-e5de9b314573)(content(Whitespace\" \ + 5d787dd9-3512-4925-be9b-916d5789e28c)(content(Whitespace\" \ \"))))(Tile((id \ - 0a5422e8-79a8-4ca8-b4c3-2a85ca9120b5)(label(A))(mold((out \ + 0c06f6e7-7dd3-48c9-b0a8-117db18aaaab)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 172e3727-8597-40ca-8c72-c6aaa37938c8)(content(Whitespace\" \ + 4af87200-4db4-4611-8a0d-8a0f083f4a7c)(content(Whitespace\" \ \")))))((Secondary((id \ - 656e7908-9b28-41f9-8240-f9cb7bd32096)(content(Whitespace\" \ + d0ee9bca-78ae-47ce-8795-e87c4239c739)(content(Whitespace\" \ \"))))(Secondary((id \ - 04277594-024c-43a5-8e03-52c67aa051f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2b4ca618-a6d8-4dca-83c1-dfd3cd93c7fe)(label(typfun \ + 6a9df067-0f29-4d2b-aba0-a7ab5afc7e21)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e761af48-6948-4c83-883c-0e9fa89f9a1d)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 46c86682-2a03-4f0f-9a83-d1f3a0bf4f82)(content(Whitespace\" \ + f072f4c2-dcb9-4182-adcd-433a36a42b8d)(content(Whitespace\" \ \"))))(Tile((id \ - 2fdb5cf8-f016-4030-bdf9-f90ddc31e407)(label(A))(mold((out \ + 17a08b3c-da24-4e44-8953-921e0c73680e)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - f268bb34-47d2-45d5-964d-9fd8892cb5e5)(content(Whitespace\" \ + 891ca871-9727-4705-b878-5e82d3625ede)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 919f1e7f-8589-4af0-b226-ffc3365cabaf)(content(Whitespace\" \ + 3ff764fb-ef53-4705-8ed6-171207b256fb)(content(Whitespace\" \ \"))))(Tile((id \ - 630d37b0-f9e3-467b-b56e-bc149f0c747f)(label(typfun \ + 2f418fb0-c8ef-4fd9-8b50-ec9575b5a458)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 251fea37-f98d-4020-9645-67e8a6be9b54)(content(Whitespace\" \ + ae807fa3-1fed-4da9-90a6-fc58d4ec301d)(content(Whitespace\" \ \"))))(Tile((id \ - 1414a094-d11e-4442-a5d9-5fbde5540b3c)(label(B))(mold((out \ + c847d8bd-9673-4b12-acb0-02dfba49b563)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1f17d101-dce5-4197-aae0-a59490105768)(content(Whitespace\" \ + 9da551bf-6d99-41f2-9ee7-9ecf8f3cc89e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a61a8ad2-4a66-4ff3-b3fc-60fe02fc13a3)(content(Whitespace\" \ + b68ff96e-5b2c-43f3-97de-2210bc6f45b2)(content(Whitespace\" \ \"))))(Tile((id \ - 9a0080ca-4f36-4bb7-b879-9da8e00b3e5e)(label(fun \ + a82fc1f7-d380-4f4b-a60c-a73fd5d5c4d6)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 470dd5b1-d82a-4de0-a83b-840bf17fd7f2)(content(Whitespace\" \ + 477e839a-f2a5-4369-8b77-c19ce17f5322)(content(Whitespace\" \ \"))))(Tile((id \ - c081aff3-4b4f-467b-a543-0fcd98cd2600)(label(x))(mold((out \ + fef58639-ec8c-4f32-b5cd-c7153ca05b92)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - f44b388d-c8f7-4b33-a020-88ea47316a01)(content(Whitespace\" \ + 3ad7ee34-1220-4bec-a3ef-650c974f359c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0a4bcca5-3000-439f-bac0-93b8a55fb49b)(content(Whitespace\" \ + 1dafda4f-127b-42eb-8b08-55ac80a054aa)(content(Whitespace\" \ \"))))(Tile((id \ - de772b8e-64b5-413c-9ee9-755804b26730)(label(fun \ + e544daee-4385-42a1-9cc2-4708b057889f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 76ca4897-551a-43d8-b0db-0a93e2a237bd)(content(Whitespace\" \ + 0d8d1d8f-8713-421c-baaf-da411dcc7b74)(content(Whitespace\" \ \"))))(Tile((id \ - 61b4803a-bb3f-4ae5-8b7b-d03fed646e4c)(label(y))(mold((out \ + 0dc1646e-31a6-436e-bf65-106fff46a092)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 6be889e0-a1a5-45c5-87f4-61b0aa03816a)(content(Whitespace\" \ + d99c1964-c99f-40b6-9c0a-4d747ec9f86d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - e1c114dc-089f-4152-9300-559d9adf790e)(content(Whitespace\" \ + 0a88281f-b566-455a-b43f-74771b0755dc)(content(Whitespace\" \ \"))))(Tile((id \ - 8b3ab16b-7288-4ac0-a721-106002cc3d87)(label(x))(mold((out \ + 7674afa5-ffc8-4495-841c-a4b824600f71)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 765c9de0-00dd-42e4-ab20-a8ece3fdf3f7)(content(Whitespace\" \ + 25b8b32f-748f-46c7-adf9-8ac6e31f5bfc)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a7d43897-913c-4fcc-a256-ea04e35c0144)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 261534d6-f87d-40f5-b92f-3cd86e78b650)(label(let = \ + 0f10c6ea-fd53-44a7-bb5e-b7544d5afd53)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + ff8bf9e3-827d-4498-b5e3-dc15f2906c9e)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 50fb8f4c-3626-434f-b773-b3c6af853963)(content(Whitespace\" \ + 569eea44-b925-44d3-b672-71aecd314eac)(content(Whitespace\" \ \"))))(Tile((id \ - 1e8f5317-dc3b-4b11-a4ef-9e535438fbd8)(label(ex2))(mold((out \ + 5f78e422-c81d-4645-8f8b-75e5889f43de)(label(ex2))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 64a2cfa4-9905-4fab-a9c4-1415ceb5e987)(content(Whitespace\" \ + 5e458e17-0203-478b-8666-a1e29450d3fb)(content(Whitespace\" \ \")))))((Secondary((id \ - 06470c97-0adc-4dec-b8e0-622c96a8c037)(content(Whitespace\" \ + 190f76c7-6e6b-4c35-8f86-51cef18a3df7)(content(Whitespace\" \ \"))))(Tile((id \ - 0894a5b9-336d-4fb0-8091-97e6870358c9)(label(const))(mold((out \ + 9536d2f4-8316-4978-8371-6d0a86a9b677)(label(const))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d7afd2a3-5140-4002-ba3e-69c82357961c)(label(@< >))(mold((out \ + 5d051810-8d64-40ff-b214-2372624e9bea)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - b4f36ba6-c636-4e6e-a830-804b3e836916)(label(Int))(mold((out \ + 2ae66b1d-78a3-4839-9aef-266d2349c19e)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 28db237c-820b-49ba-b005-aa5fd6b70b7c)(label(@< >))(mold((out \ + ed677876-82d0-4581-914d-359724e7fd53)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cddd2309-4c92-4e99-a90b-5d864669ba51)(label(String))(mold((out \ + 8fa49cf3-08de-4247-97b1-7c323ff7ec6a)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 88073d6c-9d57-479a-b6cb-18d290efd704)(label(\"(\"\")\"))(mold((out \ + 73a0b92a-d758-4398-afbe-c83bc7b23959)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7873eb6f-49d0-4689-ad19-dad3e022c52c)(label(2))(mold((out \ + 9f946b7c-2d19-4a7a-a82d-48b1fb4760ca)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - fa72cc82-f485-4678-9def-ad86277fb385)(label(\"(\"\")\"))(mold((out \ + 708f700a-7a19-4f4a-b6ba-a1241725a0d5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4cb36939-823e-4a26-916f-01af1e458feb)(label(\"\\\"Hello \ + 39e303a9-3721-41a8-b09c-172523651fce)(label(\"\\\"Hello \ World\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 8db22600-3ea0-48b3-add2-f322555f03b5)(content(Whitespace\" \ + 6e81a335-af2e-437f-8aa2-0b009a287a69)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 818f8510-15fd-4196-9a6f-d3882a237d56)(content(Whitespace\" \ + b06989a9-a343-4ed5-aa57-f9b6d96cd364)(content(Whitespace\" \ \"))))(Secondary((id \ - ee71aa33-d4ba-4839-9bea-87e1b8cc17f4)(content(Comment\"# 2 \ + 2c773f43-68f4-4a52-8743-4a890df42a1d)(content(Comment\"# 2 \ #\"))))(Secondary((id \ - 8ad4fbab-598e-4049-83df-9edf049a2472)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9080b404-7266-454e-ae0f-b230de2f5d78)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 549ce031-2347-46e2-b9cc-7b0ce15c4c75)(content(Comment\"# We \ + 0cf2b674-45a3-4693-a653-6691294b21b7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + dfa95686-38ba-4934-9d02-649085112f75)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + e8b4cb22-1948-4261-b2f1-a50eaa6f691a)(content(Comment\"# We \ can go beyond rank 1 polymorphism: #\"))))(Secondary((id \ - b57839ce-7168-45f8-8a11-e08093500f8c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8098e398-8404-4f24-9691-a8966f86b109)(label(let = \ + 864d8804-e86e-4c0b-8572-427b16ba6aa0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a72b10be-c84d-4753-a24c-26b8adb8bfcf)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - bfc24457-95c7-4b96-881f-db1436d82a98)(content(Whitespace\" \ + 74ae57ec-bd10-4ea7-b1b2-108823a70df1)(content(Whitespace\" \ \"))))(Tile((id \ - 9f27784d-1c03-4a7e-8076-d1bc5b3919a6)(label(apply_both))(mold((out \ + 713e8f6b-2bdd-47c4-9c06-4c660db94082)(label(apply_both))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ee9ee1f7-ef5e-421f-a476-fc716903698f)(content(Whitespace\" \ + a773ab3c-890d-4557-a2db-b51c6b7fafdf)(content(Whitespace\" \ \"))))(Tile((id \ - 45630ddf-0318-4169-be5d-7b9d7e6561f1)(label(:))(mold((out \ + 2834a349-3ab1-41cb-9443-12ae9bae030b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 1b63b64c-ea36-42cd-9398-999c8acc9465)(content(Whitespace\" \ + b523b63a-21ad-4097-86fa-01e02f6f2a25)(content(Whitespace\" \ \"))))(Tile((id \ - 58f01d8e-1e2a-4819-8ac2-668248067304)(label(forall \ + a848e5a4-4c65-402a-8343-90394464cae6)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - ae3b1935-bcf2-4fe7-8640-8871bc3344eb)(content(Whitespace\" \ + 5cfd60b2-4a15-4d9e-a3d5-55de09eedd85)(content(Whitespace\" \ \"))))(Tile((id \ - d8c8e319-d10f-4c43-a610-bd357ecc3322)(label(A))(mold((out \ + 7c4d5bc3-ef2b-4c09-a1f8-f3828bfdb18c)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 2ff05487-46fe-4f75-9cdd-22086dd20d79)(content(Whitespace\" \ + 03198080-2201-464f-bc0c-000e1792807c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a3fa4ced-f7b6-40e7-8840-462446fdc8f6)(content(Whitespace\" \ + 45919e57-7c8b-400f-8dca-e663677cc170)(content(Whitespace\" \ \"))))(Tile((id \ - 14b51207-308c-428c-9406-8b0db07fe6c6)(label(forall \ + 588b01fa-731b-4f1a-860e-0acd7e743c69)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - ae7dc30c-bf1b-4573-af51-1172c320b21e)(content(Whitespace\" \ + 9326ba1d-011f-4769-a001-b4430521e63f)(content(Whitespace\" \ \"))))(Tile((id \ - 562b40d5-53a2-4971-a5b7-877df1adefcd)(label(B))(mold((out \ + a2668af7-cfe6-4215-9601-89a5d5b1bfc5)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 9b32a6d2-8e66-4032-a934-793e9a002796)(content(Whitespace\" \ + a9e24fb9-2bf3-467d-a4a1-8acacab7b473)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 321b9392-765c-44e2-b17d-6e4a020f2da7)(content(Whitespace\" \ + bc66f626-a852-4726-93bd-f2980f5aaec8)(content(Whitespace\" \ \"))))(Tile((id \ - 071b0571-a1b9-4d3f-b158-6a3e5ca4408d)(label(\"(\"\")\"))(mold((out \ + 0c3e5b3e-fe7d-400d-b362-a86a1e3930f2)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - e29b5fc4-4c11-4e8a-add6-d64b38892594)(label(forall \ + b8bfdb8d-395b-4dda-b95f-f59d5713d282)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - d7f90e46-dbec-45f0-a968-6b79c749e26f)(content(Whitespace\" \ + 9fff6852-4fc9-45f3-b152-b92118560cac)(content(Whitespace\" \ \"))))(Tile((id \ - 65cbae8c-28a7-4feb-ad79-79c26161b3c4)(label(D))(mold((out \ + d5d76155-964c-4c24-97cb-6e57afe3505b)(label(D))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1daca7f1-b2cf-418f-8108-3f4ca101a29d)(content(Whitespace\" \ + b2b87c72-a6d8-4b92-88de-dc3958f0c10a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ea647757-d4b2-4e1a-8f9a-aea50a4a1f0f)(content(Whitespace\" \ + fb3b11fb-b48b-4686-9c48-1f980298431a)(content(Whitespace\" \ \"))))(Tile((id \ - 598f69b3-9507-4283-a4a9-1268675f82fe)(label(D))(mold((out \ + 5e2daa4e-b957-45c9-ae31-ce9572e54e1c)(label(D))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - cd6e65c4-d838-4e40-95fc-f6321167a3c4)(content(Whitespace\" \ + 5e2702de-94ef-4d9d-9f6e-0ff3a700a4d6)(content(Whitespace\" \ \"))))(Tile((id \ - 6d9fd61b-09d1-44a0-8062-a461dad8b0c1)(label(->))(mold((out \ + 5d0bd610-edb7-46d4-9a35-7197172614ad)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 635725b8-aa8c-42a0-99a9-30342fa63599)(content(Whitespace\" \ + 6687d2fc-ae58-413a-8946-5d969cab3758)(content(Whitespace\" \ \"))))(Tile((id \ - 4775e07e-25b3-4e8e-b742-d7e812ebfc34)(label(D))(mold((out \ + f92d33cc-0f33-481c-ba59-a89e4b7e41d5)(label(D))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 3c57e639-306e-40c2-b625-18551a649e5d)(content(Whitespace\" \ + c7c293db-f64f-4e35-9b7b-652c40a75a45)(content(Whitespace\" \ \"))))(Tile((id \ - 7f5883f6-95ba-4503-adfa-c887af4c4a79)(label(->))(mold((out \ + 7cb8df24-1ad6-428b-a416-719555cfe5bf)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5f36f2bf-f7c0-400d-9670-15ea8d823516)(content(Whitespace\" \ + 789b186e-63d8-447e-83a1-05e97111be8f)(content(Whitespace\" \ \"))))(Tile((id \ - 6874a52d-e80e-4335-be94-b282f9e47412)(label(\"(\"\")\"))(mold((out \ + 1bc3a100-c80b-4ca2-8233-86c17fdc0b4f)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - b5d41b10-39c0-4c01-beee-270a950d4942)(label(A))(mold((out \ + ea90a5ab-dbc4-4473-b6d8-8363af6157e3)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fd561528-3c93-49b4-ab81-5285d6a25c4c)(content(Whitespace\" \ + 49c20c01-3a04-4ade-9c8c-0ecaddc3d912)(content(Whitespace\" \ \"))))(Tile((id \ - 101b98df-0c09-4112-bddf-9cb81a3f57aa)(label(,))(mold((out \ + 961de683-be3c-4ca8-94d4-fcee6c22f4e6)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6afeb706-8e49-4604-bcf9-a4657c2e932a)(content(Whitespace\" \ + 4f1b7cf7-e1ca-4e0e-a6fe-a1b7e2664b41)(content(Whitespace\" \ \"))))(Tile((id \ - 3322e451-6bdd-47c8-9535-60eb0aabe39f)(label(B))(mold((out \ + 99a7b5b3-227b-4a7a-ab49-9b471b1fc858)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 46f8ec17-4feb-4ed4-a00c-7e0568633623)(content(Whitespace\" \ + 7755d5ee-c4cb-442c-8aa5-5a4cd77e6227)(content(Whitespace\" \ \"))))(Tile((id \ - 112c4f5f-e726-48ae-a40f-19f44a529311)(label(->))(mold((out \ + 9f11b960-7216-4e89-8b4c-28de72037f0a)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 0e543f95-498a-4b98-b304-fc55236ad4f1)(content(Whitespace\" \ + f0d0d1bf-38ea-4e45-9c41-3954ce5b1654)(content(Whitespace\" \ \"))))(Tile((id \ - a1ef6090-fa2d-4faf-b425-9cdb6dd4dbd7)(label(\"(\"\")\"))(mold((out \ + 3f10dba0-23b1-4ac4-a39c-79b0953c0b76)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 3aa93ed7-f6ef-4ab5-8be4-920d4d17722f)(label(A))(mold((out \ + 37b9f9c9-3e3d-405a-96f0-50f9dee7bb36)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 798a8f49-c214-408a-be5a-076c4e975f99)(content(Whitespace\" \ + 624c3292-c45c-4e2a-bd5f-71aad635f912)(content(Whitespace\" \ \"))))(Tile((id \ - 4f55a95e-d931-4964-aa30-63db155a7a4d)(label(,))(mold((out \ + f1e7c535-177b-4eb3-b9ef-d108bdf2d80f)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - b85ce220-d7d2-4035-8cd9-b0ddf0892b60)(content(Whitespace\" \ + f0bd4515-5061-4f4f-8135-84b64516baab)(content(Whitespace\" \ \"))))(Tile((id \ - 44b39b29-1e8f-4fca-b9f2-ea0f63fad2a2)(label(B))(mold((out \ + 05f45730-5f3d-493b-be64-15246a06812d)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0b6c6f08-2b92-4617-9a3d-838911de34cc)(content(Whitespace\" \ + aba4127b-a850-46c0-b26a-b98dc86e57f6)(content(Whitespace\" \ \")))))((Secondary((id \ - 1070d425-585e-4f45-a0e4-856896b6dd16)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7114906-3451-48d9-a832-5e8b6378cea9)(label(typfun \ + 0b56511b-f2da-40ca-b25c-6aa12d3d991b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 650e5460-7ac1-458d-bdad-b45f47272b9b)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 4bc7e7fe-446f-41cb-a7d8-7a0975a5477a)(content(Whitespace\" \ + e1bbc884-ca8c-4bac-8867-782a899719b5)(content(Whitespace\" \ \"))))(Tile((id \ - 26325b4c-615c-4650-b623-ff771a30d9e8)(label(A))(mold((out \ + 83491d6b-5752-476f-9801-71d67ff763ba)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - b43fee1e-6658-48bb-acbe-6920b83e2398)(content(Whitespace\" \ + 401e28d4-cedd-4309-aeeb-97e3cfefa369)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2e50cf1e-b164-46a1-b5b3-2df783b55b8b)(content(Whitespace\" \ + b4526770-054a-4f3d-8b82-f7b10924f832)(content(Whitespace\" \ \"))))(Tile((id \ - 519a40ec-1252-4995-815f-144d317fc8f8)(label(typfun \ + 29519b18-fa3e-40f0-b935-42f2e9649315)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 7366da99-781d-4f41-8b1d-f1658bb3e6b1)(content(Whitespace\" \ + fec62505-1774-4ac5-bd9e-437fd59a7495)(content(Whitespace\" \ \"))))(Tile((id \ - 9cfa33bf-81a1-4da2-a957-1633b0b7521a)(label(B))(mold((out \ + 6fcdd577-54a1-4fc2-902b-b4f7aba72836)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 787d232c-637c-457a-9189-c4bd35202cb9)(content(Whitespace\" \ + 00215cff-c2c2-4a20-a461-c004af470500)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 83558ed3-285f-4ef8-8408-238b57c60788)(content(Whitespace\" \ + e86bc17a-2c2d-489d-8bcc-db8ab6738c53)(content(Whitespace\" \ \"))))(Tile((id \ - 820db396-e381-4876-a761-615dc809c60b)(label(fun \ + e2e58581-8998-4472-9247-075785e8292d)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - ddbfc34a-3ca2-4666-ac64-8a4f91ca5409)(content(Whitespace\" \ + 80d1dd00-4243-4383-88d0-0a0d1b71be43)(content(Whitespace\" \ \"))))(Tile((id \ - 6525adf1-f3e7-4d5c-98d8-c171597e04a7)(label(f))(mold((out \ + 3ae90889-b335-4186-9a1a-718431ecc580)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 5f32e7a4-c259-45b7-811b-1209c5e56ffd)(content(Whitespace\" \ + abaddb89-7296-4a54-a8e1-454898bfde1a)(content(Whitespace\" \ \")))))))))(Secondary((id \ - fd53bbc6-b2e5-4978-8463-8111c1f133d4)(content(Whitespace\" \ + 372b86a6-7255-4f30-a517-8e213edb3460)(content(Whitespace\" \ \"))))(Tile((id \ - 7c33c644-0acc-47e1-844b-bde51be8589b)(label(fun \ + 0ed01a72-b787-4568-b0ca-188fdd902f77)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 5713d791-302a-4c92-bf39-7772704c46f1)(content(Whitespace\" \ + 99f48b1f-b2e6-42ab-8f8f-5ba269beeb79)(content(Whitespace\" \ \"))))(Tile((id \ - 66e07b15-6590-4582-a1d3-a5a47fc8309b)(label(\"(\"\")\"))(mold((out \ + b246de16-13f4-487f-8a4f-5549a31246e2)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - d90c1fe6-7821-4027-9003-a1211c306981)(label(x))(mold((out \ + e33d4fd0-7719-4c4a-b71d-2f19a3e4d71b)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 384886e5-2b08-4c33-80cc-312800ba7f9f)(label(,))(mold((out \ + 300cc080-a9db-40fc-adc3-dfa730eb2242)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 9d79977b-b742-4b93-b9aa-48cbe8c44bd8)(content(Whitespace\" \ + 2823bd71-c744-4f9e-9c87-381ef96d340f)(content(Whitespace\" \ \"))))(Tile((id \ - 7fa7cff4-635c-4c65-81af-554edbf731f2)(label(y))(mold((out \ + c5c8f8a2-4d59-4079-acad-b2bcf019f9e3)(label(y))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 26ff2bfe-cc74-4499-947b-9c9920f818a7)(content(Whitespace\" \ + 792f602b-22af-45bb-82be-9c7a00639832)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 7799d317-1b1a-45a4-b351-75153b34a4dd)(content(Whitespace\" \ + aa749037-40ac-4197-8ec8-8fb9e8a2f221)(content(Whitespace\" \ \"))))(Tile((id \ - 0398a841-dc5e-4e34-b14f-e86acee6de12)(label(\"(\"\")\"))(mold((out \ + ed250982-f47f-4d71-a1b4-0a2598ef4c9d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 7645f7df-35cc-476e-9469-ebdc1c13bd8d)(label(f))(mold((out \ + b7ff20f6-7bd1-4981-9578-d35194a1e3ff)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c6e7d695-9cd0-48bb-831f-6fc750bed60a)(label(@< >))(mold((out \ + 5835feb9-874e-4f39-be1a-e2d70ddc7b5b)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cb0835f4-b027-4355-9d69-304c18cd4226)(label(A))(mold((out \ + 206f376a-1102-489d-afaa-ca5b871a1d76)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 74f782dd-595c-4635-88e5-beeab1a696f3)(label(\"(\"\")\"))(mold((out \ + abae9529-6df2-4f38-85f2-cdd005bd7858)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 28cb480b-2194-4074-9027-02e716256b38)(label(x))(mold((out \ + 11dcccae-8205-4517-bad3-1d695be3f4ac)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 2219d566-e1e2-4660-86d0-4e2f09636d4c)(label(,))(mold((out \ + 95ed452a-cac8-4bd7-b366-7c4af6ca74cc)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 99895d96-665c-49e5-beca-d64117706057)(content(Whitespace\" \ + 5ffa3423-f41a-4c16-82b7-43927c0b87a3)(content(Whitespace\" \ \"))))(Tile((id \ - a21a0791-2e79-4357-b4e6-7b585b47a7fb)(label(f))(mold((out \ + 01499c1b-793b-4576-b965-625d42c6cac3)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 08a0365b-ad2a-4205-9f20-48413eeb072a)(label(@< >))(mold((out \ + a21a36c3-c69a-44ef-98fa-bb925f93eaab)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 43aed865-4979-4dcf-98d6-1cbb9fd8bd1c)(label(B))(mold((out \ + 8bae21c0-1ec9-4805-a777-bfb960868dba)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 89aeb7b5-1ea2-4659-9781-2531e18aedd4)(label(\"(\"\")\"))(mold((out \ + 9e93c075-3a9b-4402-8ebd-1746c0a2c533)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3b54796d-6fff-4008-a998-5bb30ecd8068)(label(y))(mold((out \ + 52cb9652-519a-4216-a37e-0a3b99a60f20)(label(y))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - fa7f894c-5b3e-4536-8108-30c456b59382)(content(Whitespace\" \ + a482e6bf-3a73-47c8-ad77-e8da7d060699)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 035285fe-16f6-4c48-a809-7df7617cf981)(content(Whitespace\" \ + 1992530b-83bd-4fc1-b64b-b762337b441a)(content(Whitespace\" \ \"))))(Secondary((id \ - 3192c3fc-4644-4656-b9dd-0d0a824e484c)(content(Whitespace\" \ + 4505e7f8-c371-4d63-9226-2cb1db7a776a)(content(Whitespace\" \ \"))))(Secondary((id \ - 91391c84-9559-48af-b1ed-bc653228a716)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1aab4268-29c2-49e3-88ef-e46c07e877fe)(label(let = \ + 5b2f834a-900e-4712-93d5-8084e2ee105a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + aa131b2f-8fd1-49c0-b1f8-a7a817328684)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 5f8ef648-a9c0-47b2-908f-bba32b360ff7)(content(Whitespace\" \ + 44ac7379-5064-49fa-a47c-5d1f4d7a033a)(content(Whitespace\" \ \"))))(Tile((id \ - 51bbbce7-1d1f-4c19-9acb-1a338937a705)(label(ex3))(mold((out \ + fdf7b9e1-2248-43b7-9d62-bb6c1dfba927)(label(ex3))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - ec8b88aa-bdaa-4bd7-ba78-3c737ff13a42)(content(Whitespace\" \ + 39c1b2cc-b821-40eb-9262-f60d248087c2)(content(Whitespace\" \ \")))))((Secondary((id \ - 3bfaf98c-fad4-4aaf-b109-0d74dd548077)(content(Whitespace\" \ + 8c379c65-4133-4c60-b528-cdd8917a16d5)(content(Whitespace\" \ \"))))(Tile((id \ - 3316543d-c1dc-47ed-a2f9-84e38c8f241a)(label(apply_both))(mold((out \ + 918b43e8-2c6e-4a6d-a23c-b8750fc6fe07)(label(apply_both))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - dc67eec9-764a-45c4-9c23-3a4f5123089e)(label(@< >))(mold((out \ + f59c4fdd-ee19-4416-9b6f-fb530f9313e2)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 980f965d-9afe-40d9-8803-13fdeb57f80b)(label(Int))(mold((out \ + 2e12a616-ad04-4bd7-8bf6-c0d1ff9d3cac)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 3e74553e-02e1-42da-a19b-5e5d5c64bcd6)(label(@< >))(mold((out \ + a873ce8d-436c-4895-bdde-82312941e0b8)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 03b7d01d-9910-4624-b39a-dc0ca9afd983)(label(String))(mold((out \ + 6a3a1811-626a-477f-8703-50c88edc2f7a)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - f6a04b1d-584b-48f5-a394-d86aae5e775e)(label(\"(\"\")\"))(mold((out \ + 7b6d0235-738c-4da8-babe-b43f2c7c2407)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 9f5b73e6-cf9e-4acc-8ad4-67ef0a8e2449)(label(id))(mold((out \ + 44fdf322-e56b-49ed-a990-8c2539103d66)(label(id))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - d7d233b3-8745-4adb-bdca-2a25f6c54038)(label(\"(\"\")\"))(mold((out \ + b2dd10ff-7614-45e0-8e4c-d98cdf93d2a5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 556971e3-4c37-425f-9d0a-e5f476bc9fe4)(label(3))(mold((out \ + 72013761-1107-4eb5-b717-138b1dadebab)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - bbce9c4b-470c-4578-8aa5-7d03a40a5b81)(label(,))(mold((out \ + 6dd2fcc5-d54a-484e-b2c1-e15ac383adfb)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - f4d955a7-b986-47da-b760-723a3f4b7e07)(content(Whitespace\" \ + 6c1129be-37d5-41c4-b1d8-34a5a778e27f)(content(Whitespace\" \ \"))))(Tile((id \ - de4b176f-c1c8-42be-81bf-7c0a951b8cf4)(label(\"\\\"Hello \ + 722e5e59-175f-4825-9f53-4fee84e47110)(label(\"\\\"Hello \ World\\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - b98dcf12-4401-41ea-868e-514470e8fad2)(content(Whitespace\" \ + 620cd7f3-f19a-4a16-8f16-1e5daabdc518)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 39a9a992-1d85-47f6-a70b-dbd3b4d10093)(content(Whitespace\" \ + 36358b92-807c-419e-9c5e-171bac510ab6)(content(Whitespace\" \ \"))))(Secondary((id \ - bf699e1d-9f8d-4fe9-96c3-e93df733d1c5)(content(Comment\"# (3, \ + 0b305e22-e1eb-4c1a-8952-b9da2e034727)(content(Comment\"# (3, \ \\\"Hello World\\\") #\"))))(Secondary((id \ - 940ae705-305e-4492-8d68-8389a9b39dea)(content(Whitespace\" \ + 26d407b0-00c4-4ac0-9ebd-3b2b89d05779)(content(Whitespace\" \ \"))))(Secondary((id \ - 4aabf1af-7375-42ef-9619-eba73e0bcfdf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7edbbfa7-0531-4786-9d81-c2cb94ada018)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 84216e1c-bee1-413d-a570-f5a17d5fe938)(content(Comment\"# \ + 805af9ea-db80-4d26-a3c0-b61e88745606)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 04efc942-ed8e-4ef3-bbd5-76016d5d60aa)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b247ac7f-b577-4dc3-abc8-7975b08a83f7)(content(Comment\"# \ Finally, here is a more in-depth, yet applicable example: \ polymorphic map #\"))))(Secondary((id \ - 10662e83-1910-47f7-84f0-2353f20c5c30)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 939e98a6-16c2-47f1-a6bf-e65338f10cee)(label(let = \ + 89f53214-166d-4338-b236-b772778394cb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + e8b1419e-be47-4665-871c-c6a87c975f3b)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 24633f10-f540-450c-b945-d5093d4d0808)(content(Whitespace\" \ + e8ee7a26-9f5a-445c-b42c-062f082286c0)(content(Whitespace\" \ \"))))(Tile((id \ - 6dec8dc9-7220-4b44-9784-58b29746fda2)(label(emptylist))(mold((out \ + 18a0485c-7e0b-4edc-9526-15dbc922f0d0)(label(emptylist))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - a0e91b19-3b3f-46d6-9010-8e4b54bcfd7b)(content(Whitespace\" \ + 6c173016-999c-4827-acca-0465520e5849)(content(Whitespace\" \ \"))))(Tile((id \ - e2d4e1e3-2153-47b0-89f3-dcaa015cf689)(label(:))(mold((out \ + 718ac4d5-9144-43ce-8790-4bbf79ef7d4d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 3ed14d77-20af-4b23-9260-f98eb233c76c)(content(Whitespace\" \ + fa0fe8d5-10cc-434f-abf5-0b17fd54c6a9)(content(Whitespace\" \ \"))))(Tile((id \ - c0d913e1-2ec3-4550-9032-ddf2a7a4af11)(label(forall \ + 80182513-dc22-4780-bc8b-e20aac6b8720)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - ffbd7e09-f356-44f0-a2ba-dd9b67092cb9)(content(Whitespace\" \ + e5d3eacd-9ebd-4e11-af72-0b0f3d443a93)(content(Whitespace\" \ \"))))(Tile((id \ - 602ba699-d033-42c9-8a19-e15a20c9751f)(label(A))(mold((out \ + 2d09af7d-31c0-481e-ad0a-220902a961be)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 5acf9806-3c0b-4ee6-8153-6ed5b55993bf)(content(Whitespace\" \ + 0e6b2f9d-53a1-4a23-9553-c2ada6a9d200)(content(Whitespace\" \ \")))))))))(Secondary((id \ - c1f5b705-5023-4aa6-916f-3704f6bb9476)(content(Whitespace\" \ - \"))))(Tile((id 178c03b4-55ff-4892-b73e-d31bf5aa3622)(label([ \ + b871237f-ac5e-477d-a034-4fff429fd57e)(content(Whitespace\" \ + \"))))(Tile((id 7d3e5e8b-18a1-4d82-9029-27fd05e6a012)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - fbfcd181-f6ac-4366-bd92-067bdf819b2e)(label(A))(mold((out \ + 9c6fe512-4adc-425f-87d3-9627364feafa)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - d332d9d0-76e3-4d04-986a-473e50994bc7)(content(Whitespace\" \ + 32ec6834-4a0a-4e8c-a425-57b1a58543ea)(content(Whitespace\" \ \")))))((Secondary((id \ - 59ac2e62-5822-46d5-a585-9d4c1b006dee)(content(Whitespace\" \ + e5cf60ff-e708-4f65-93a1-a02ab339984e)(content(Whitespace\" \ \"))))(Tile((id \ - cd66aab6-456f-4abc-b821-75a076fd599b)(label(typfun \ + 1058a77d-cbcf-4256-af65-dd3c9fec0c1c)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - b54ecf9d-a302-4c30-b34c-6379e6bc95e7)(content(Whitespace\" \ + 0ea49e33-0a5f-496b-940d-d5eff5635fe0)(content(Whitespace\" \ \"))))(Tile((id \ - de7f38e1-4da1-45dd-a919-7c6ed0fa6a5c)(label(A))(mold((out \ + a8b79247-8cd1-4b01-8b91-b174f12ad5f7)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - f533338f-eb4e-4843-bfe3-33f2c4350293)(content(Whitespace\" \ + ea9e0ce8-5fa1-463e-a06c-c0a866e52557)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 5ef4ad03-ca84-4276-921a-6b37b4f9e7ca)(content(Whitespace\" \ + b1a7ed0e-f851-4666-94f0-277786e920b5)(content(Whitespace\" \ \"))))(Tile((id \ - da973bb4-f897-4274-8549-4c83543dcf07)(label([]))(mold((out \ + 261b4411-16a5-4c4d-88c3-1fc9612302db)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - c7d1884e-ae08-4d78-8eb5-5d088eb02b78)(content(Whitespace\" \ + 791a7096-cf86-41e0-8bce-690c3e251122)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 01dc7114-1d48-4b28-9f09-372c903f3c6b)(content(Whitespace\" \ + b5dea30c-f191-4a05-9362-74f8de09ffd7)(content(Whitespace\" \ \"))))(Secondary((id \ - a714f7e1-b433-4494-8502-6f5bf9751a62)(content(Comment\"# \ + 45c14057-f7a1-480c-a4fd-ae67e37350af)(content(Comment\"# \ polymorphic constant #\"))))(Secondary((id \ - 303a674d-26ba-46a8-a854-edf5be2946df)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f234f8c5-401b-4ddc-a704-04518144f44c)(label(let = \ + 0491cda9-5ff4-4b07-9c2f-7a056c5f9e75)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a1735f6a-91a6-45be-a84b-c778661af5e0)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 2811e4ca-a6aa-458a-b316-854f77859b70)(content(Whitespace\" \ + 7b451ae0-0a8c-4d45-ab61-f5269d27ad8a)(content(Whitespace\" \ \"))))(Tile((id \ - ef0915dc-c44e-47a3-9d90-391ff290aedf)(label(map))(mold((out \ + 4b4f1fc4-9ced-4da9-affb-120d01001bf1)(label(map))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 97b471f5-a88e-4445-882e-b4a538599810)(content(Whitespace\" \ + f55de4bd-d0ac-4de0-89d2-4cb12b3a1f15)(content(Whitespace\" \ \"))))(Tile((id \ - 5bcedf2e-9493-49c3-9cb2-97fa804e80f4)(label(:))(mold((out \ + e5aa9153-05c2-4371-972c-0ab0469580d3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 29f37871-d8be-425f-96cf-e32e7852a407)(content(Whitespace\" \ + 51b7bf81-8c96-4951-b9c7-3b1a5f78c227)(content(Whitespace\" \ \"))))(Tile((id \ - 3aaa6180-f172-4271-9eaf-71647ffe17ec)(label(forall \ + ef122e48-5039-4710-ab57-637a803eaf65)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - a32fe925-c85a-4d68-8f46-7405cc601728)(content(Whitespace\" \ + afbf62bf-8d85-4750-83ce-142f7857e7ab)(content(Whitespace\" \ \"))))(Tile((id \ - 114fbb0e-83a1-4246-9761-3ee26a5941be)(label(A))(mold((out \ + 716b8698-13f2-4423-93f1-3d41d9077ad1)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0e7158ee-475e-42ba-9e01-b0ab45d22b5d)(content(Whitespace\" \ + 00dcf751-b0bd-4d11-8f85-44704156970d)(content(Whitespace\" \ \")))))))))(Secondary((id \ - d286ece6-55af-4c4f-b935-f9155da446f9)(content(Whitespace\" \ + d8afdcbf-1ff8-462e-9207-cde50bbf928c)(content(Whitespace\" \ \"))))(Tile((id \ - f3df8f06-e2ea-4b94-a81a-adde35276c71)(label(forall \ + 6268905f-a4eb-4089-891e-9715976d05f1)(label(forall \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 53affcda-4a90-4c0f-a284-d55900d8cd5f)(content(Whitespace\" \ + 734d0e70-1b40-400e-97f8-a8927a0b01ee)(content(Whitespace\" \ \"))))(Tile((id \ - 35095934-52d2-4809-a44c-71b154d63e6e)(label(B))(mold((out \ + f30c744b-d461-495e-871a-ef8a00d4925b)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 5ede4985-eb85-4d81-b258-b5c042854b9d)(content(Whitespace\" \ + 43eb5cd4-8dff-445e-ada1-9fb3f2fd01eb)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 062f7286-3c40-4573-a012-458acde45596)(content(Whitespace\" \ + 99d2a63a-c75e-4aac-945b-9b51ef8d3641)(content(Whitespace\" \ \"))))(Tile((id \ - d7e97d8d-0fe9-4092-9333-1b2693fd6e87)(label(\"(\"\")\"))(mold((out \ + d69df440-6bb3-4f1a-9010-8566a674b2f8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 2069ea78-d8f7-4fba-9e62-7bb82c9ee194)(label(A))(mold((out \ + 94017fe0-b9c4-4338-a94e-42968a62582a)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 4b172e7d-8328-4fb3-80b7-95bfc52fb159)(content(Whitespace\" \ + 9d04cf49-aa7d-413c-b7fa-3dcd61dc16df)(content(Whitespace\" \ \"))))(Tile((id \ - 6d69ce82-7b62-4f67-9fcf-6c56a30f89d8)(label(->))(mold((out \ + b0073f69-09ff-4b66-a0e2-8918bfd8e943)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a26895a9-6801-4aa1-8070-6422b9ec98b1)(content(Whitespace\" \ + 763e3955-1401-4bf4-9594-9d49ec111517)(content(Whitespace\" \ \"))))(Tile((id \ - e77597e2-a1ae-494a-9189-a04556fb6603)(label(B))(mold((out \ + ecf07fae-923f-4680-8326-11b86ee80172)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 88d2b632-4fe2-40dd-85f8-025d68f3e6ac)(content(Whitespace\" \ + df13dc42-b21f-4be8-a9ac-b097806b84fe)(content(Whitespace\" \ \"))))(Tile((id \ - c9ecd36e-45f8-433d-bb64-fffa569e8af9)(label(->))(mold((out \ + 0fa9d012-65e9-4d27-8e75-7fc41ea51729)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 5f480605-2f8f-4b67-b4ca-79381f1bed8e)(content(Whitespace\" \ + 3825f0c0-87ce-4775-b2c7-46f44e23e0df)(content(Whitespace\" \ \"))))(Tile((id \ - a2143b7a-c381-4de3-9365-3e72064f77d5)(label(\"(\"\")\"))(mold((out \ + eff4e6d0-751e-4042-8bba-7c83f68313e0)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 8f6d28dc-65ed-4389-951a-bfffde9d0282)(label([ ]))(mold((out \ + efdc7224-f91e-4b3c-b79a-bb62563d3746)(label([ ]))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 75dc103a-f849-427c-8571-f9339e3dc833)(label(A))(mold((out \ + 04f8fb9c-0aa9-460b-b5ae-b03addabf4d3)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 6a9b39c3-ae44-4c88-bc26-2730c13cf3e6)(content(Whitespace\" \ + 8de1b3a4-ef1b-48a9-a559-4e2492b54b6c)(content(Whitespace\" \ \"))))(Tile((id \ - 54e7b2eb-b003-40ac-87c6-4158bdcd3981)(label(->))(mold((out \ + 7a0e1ccc-cec6-45d7-8afe-b2d79bcb5f1b)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 645aacbb-89a5-4a8e-9d37-9463f7b2e7a6)(content(Whitespace\" \ - \"))))(Tile((id c8874776-909c-4c00-8e3c-236daa1ce5bf)(label([ \ + dd513952-8f39-402f-8e97-e0770a847369)(content(Whitespace\" \ + \"))))(Tile((id b1e18385-d748-47ce-abe8-990287bd44a8)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - da884a60-abc4-4f9a-af5d-8fdbde6712e4)(label(B))(mold((out \ + 1c114f9c-2ca6-455d-b507-ad54cfd3dbc2)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 97b07cda-ebbe-4ea8-8f99-c068567b91ca)(content(Whitespace\" \ + 2e0a9417-b7a1-418d-9d3f-d118c41418d7)(content(Whitespace\" \ \")))))((Secondary((id \ - 1bcaa039-2df6-4b4b-9325-69673d0513e9)(content(Whitespace\" \ + 86d559d4-f157-4a10-a1e1-2902c38d915c)(content(Whitespace\" \ \"))))(Secondary((id \ - a68ac431-e072-494f-be32-7f04c8d5ec8c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 10035e4f-fbc0-4686-851a-4ab986dd66a0)(label(typfun \ + fa6eea12-346b-42b9-bc7f-1ef395cdd8aa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + b5d37432-d50b-4a85-8c01-e97f1d51ea7c)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 8f102909-f012-4200-98a2-74b512643d51)(content(Whitespace\" \ + 43b8fd95-6a47-4eb1-a07e-42f02ea31048)(content(Whitespace\" \ \"))))(Tile((id \ - 0911f8f5-a693-4e35-a289-17be59b2fe38)(label(A))(mold((out \ + b462674a-ade0-46de-a2bb-df8d40cc4cd2)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 0cf5a256-4b38-4768-ac08-3d258a667606)(content(Whitespace\" \ + 213d30e7-92d9-4db7-9b44-c9c03fd3c1e2)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 554fec62-4dbf-4797-8ba9-c937d36bce0a)(content(Whitespace\" \ + 1cde8fe3-c1f3-4dc5-8f00-2c14323ad872)(content(Whitespace\" \ \"))))(Tile((id \ - f0cb05c7-fc4e-4a15-821b-8e2a32991c95)(label(typfun \ + e2f7b035-67dd-4408-9a84-554e7dabfe32)(label(typfun \ ->))(mold((out Exp)(in_(TPat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - acec4e31-fdae-4aae-835e-c88b3e6ea011)(content(Whitespace\" \ + 3905d27b-3694-41ca-b39d-345f634ab322)(content(Whitespace\" \ \"))))(Tile((id \ - a232f661-93ff-4eca-8355-2c81b4bff1c4)(label(B))(mold((out \ + 5934c422-2352-46eb-9821-4dbfa3d3743c)(label(B))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 41cc07df-1374-48eb-98b3-38250c9c973f)(content(Whitespace\" \ + ae0e0124-e777-4952-a9b2-d3db1c2ad67e)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 57e3dc1d-a3b4-4005-a844-c0b19dae1eca)(content(Whitespace\" \ + 36082b3c-e70d-44ca-9f49-9eff16b44092)(content(Whitespace\" \ \"))))(Tile((id \ - 61f7be29-d185-4d14-b88d-ef9198a65cbb)(label(fun \ + c9170552-5cd9-406e-aabd-1a68acef88d8)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - fadfb85c-929a-421c-b266-7ff3d3cae242)(content(Whitespace\" \ + 461cfc94-9b02-4990-ba72-860a7f31e177)(content(Whitespace\" \ \"))))(Tile((id \ - 9634108f-5955-4183-aaf0-c37f2d550900)(label(f))(mold((out \ + 91c378c2-c8d0-467e-b8e6-55da3859c11d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fdf03e03-94b8-4817-ac8b-2ffac0370a28)(content(Whitespace\" \ + 2d435273-37ac-42e2-9ae9-5c76164d345a)(content(Whitespace\" \ \"))))(Tile((id \ - 367a4061-b09a-4cde-a50c-834fb9407155)(label(:))(mold((out \ + 3c505ec4-22ee-445e-b548-47704f5adf96)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 19ba5f14-535e-4aa1-a4f7-2ca80887b509)(content(Whitespace\" \ + c8048b99-ea66-4d6f-bd44-afabc4eefda1)(content(Whitespace\" \ \"))))(Tile((id \ - e0c3bbba-f8d9-4b31-821f-999167998c15)(label(\"(\"\")\"))(mold((out \ + 2f725824-dd41-41fc-b46b-97b3474b4299)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - d99383df-d185-4111-8207-f70dd055db65)(label(A))(mold((out \ + 366d80ae-0cb8-44bc-9426-5681aa164bdb)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - de097587-a889-428e-82c2-255d92fe74ec)(content(Whitespace\" \ + c2d5a5d6-d4a0-482f-ac09-77cab97b7ff4)(content(Whitespace\" \ \"))))(Tile((id \ - e6976fda-a985-42ae-857a-6c5f092e7a46)(label(->))(mold((out \ + 8922d842-b30f-49ab-ae7b-f3239cf33dee)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8223ee43-51a0-4f5d-8603-24db3607d136)(content(Whitespace\" \ + a9ae4c3d-3add-4cf6-8325-83afca10417a)(content(Whitespace\" \ \"))))(Tile((id \ - c0a8a979-c7aa-4815-abbc-9026a49dc98d)(label(B))(mold((out \ + 5b480e67-1570-4124-a87a-093e86b7e842)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 5edd3884-5259-41a6-aef5-0a09a82e3b1d)(content(Whitespace\" \ + b6c29744-e6b6-4185-87c0-1e7d4aa69827)(content(Whitespace\" \ \")))))))))(Secondary((id \ - ac576c48-bae5-4dae-88bf-3d09b2f7f578)(content(Whitespace\" \ + 9ab8707c-63cb-4ae5-9b2d-782489b9a3a4)(content(Whitespace\" \ \"))))(Tile((id \ - fc9b9503-238f-4f2b-9971-875ee86392d9)(label(fun \ + 8ab07af7-f6a7-4af5-baae-a52af342e1af)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 464170f1-1786-4257-bdb8-9d4f3378ab73)(content(Whitespace\" \ + 7739dcf7-6b50-42a3-a10b-51d76f23ade8)(content(Whitespace\" \ \"))))(Tile((id \ - c46ac635-4747-4c46-8a36-6e75a17102f6)(label(l))(mold((out \ + a440417f-fb02-4baf-b3bb-be193427f3a4)(label(l))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 8949fbff-ffcb-4acb-90ea-7f20117fd35c)(content(Whitespace\" \ + 023dc101-5cf4-450d-ba7c-de438a849914)(content(Whitespace\" \ \"))))(Tile((id \ - 3eeeaffe-f9b1-4b7a-8951-a649c3e4158d)(label(:))(mold((out \ + d87315f5-bc92-413d-8772-7c4c16800f1c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a8776773-7041-4ef3-9b05-3cc7af14ab31)(content(Whitespace\" \ - \"))))(Tile((id 7096ca3b-07ad-42fc-8874-b0814ed9855a)(label([ \ + b1a43246-b48f-4e40-aec8-589065f0cf79)(content(Whitespace\" \ + \"))))(Tile((id 9e172882-19c8-4234-aa32-97ac31bb7638)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - bb2f3449-0568-4817-8122-c6d523dd6b75)(label(A))(mold((out \ + c4e7ec8d-b9a1-45e3-a7c1-0b5cba65b733)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 0d2f8c5a-1d32-4c84-82a3-80c49dcf8986)(content(Whitespace\" \ + ecad1cc2-2bb7-4030-9c29-4e3394eaea9c)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 92fa8da3-591f-49e0-aa98-2ffca86c1f97)(content(Whitespace\" \ + f273752c-7c93-41f5-a950-efb299c434a5)(content(Whitespace\" \ \"))))(Secondary((id \ - 2f617f5d-70fe-4849-b3ad-9169e5afa5ec)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 37633865-4654-4f24-b7e0-faaabc8c31a3)(label(case \ + 0ffe5898-902f-486c-9ef9-1716c2e56371)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + acf5a599-1e6e-464b-b31b-88f2be84712e)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - bc17e25a-220b-453b-92b1-1e330d17571d)(content(Whitespace\" \ + 231c3ecc-3f5e-4bcc-9a39-cb831c1a82ef)(content(Whitespace\" \ \"))))(Tile((id \ - 3e6fe207-b6ed-4cb1-a4f7-824deb9ccecf)(label(l))(mold((out \ + c8b91530-32ad-4c07-9b11-e5bc10e7a0be)(label(l))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 13709529-a6fb-4732-8f0a-e1b53464f2b0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 3e50ee3c-cd19-4ff4-a0c8-f3b6731c8a5d)(label(| =>))(mold((out \ + d1d46cbc-4b79-4173-a688-494d5586f8a8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 482446aa-235e-4c19-a168-b68a2b8e88e7)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 26fc64a6-4117-441b-9207-6038617779f7)(content(Whitespace\" \ + 0d73225d-f546-4112-af8c-65c0a344e23c)(content(Whitespace\" \ \"))))(Tile((id \ - 69bd225d-e129-421d-92e0-6a02dbf58ace)(label(h))(mold((out \ + a4b17590-c7be-4dcb-b06f-1bc91489f7a3)(label(h))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 96593453-7160-48cb-a729-384f9b1fbfe8)(content(Whitespace\" \ + 03a9b07f-f7e9-4a71-8067-f98f2c939a6e)(content(Whitespace\" \ \"))))(Tile((id \ - 47382712-0f2b-4c2b-97db-3676811bc820)(label(::))(mold((out \ + 9c2381ba-f9bb-4d4a-920c-59e60b2258e7)(label(::))(mold((out \ Pat)(in_())(nibs(((shape(Concave 7))(sort \ Pat))((shape(Concave 7))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 01f89bb1-ae2a-401a-93db-17b6c7f38e10)(content(Whitespace\" \ + d67ae940-b511-4eac-8693-1d1a5ed8015b)(content(Whitespace\" \ \"))))(Tile((id \ - ba81e4c2-c9a7-4752-8628-5c877467ed37)(label(t))(mold((out \ + e8e2dd04-ebdc-44d4-9229-2f8b2ec3927d)(label(t))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 80e49fd8-4e75-44dd-b63e-e99dafbad844)(content(Whitespace\" \ + 89fdee6d-69af-4a14-9fc6-0a38dd72b854)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4b68c656-15de-4d85-9c73-19c6324b2712)(content(Whitespace\" \ + 42385fbd-9a79-48f6-bc6a-647f4b671cfb)(content(Whitespace\" \ \"))))(Tile((id \ - 09b457b9-cd40-4041-af17-6f944973584e)(label(f))(mold((out \ + d7ca47cc-9857-419a-a246-499e7faf6f6b)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 2175f977-a049-42a1-b03f-91f667e2a36a)(label(\"(\"\")\"))(mold((out \ + b5282cc7-7bf8-462c-801c-e295a6c6f541)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 70a834ec-2780-4f9c-a0c7-67f62013de63)(label(h))(mold((out \ + a04da67e-f10f-4641-9e20-413e821900f0)(label(h))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 5d0e7a33-79d5-4b47-8444-a21abb0ddc67)(content(Whitespace\" \ + 72aed549-fe1e-434b-b92b-7f08597c991c)(content(Whitespace\" \ \"))))(Tile((id \ - 42adb628-8b23-41b3-ad70-074f50253ddd)(label(::))(mold((out \ + 9f4a3be0-248c-4c47-8995-9a274fa44087)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - ec881152-b75b-4ff2-8e2d-3fe037def2b7)(content(Whitespace\" \ + 184f51ce-215d-40f3-b804-5f8fdb27a7ca)(content(Whitespace\" \ \"))))(Tile((id \ - 70a54995-925e-45fd-b2dd-c44c129a57c5)(label(map))(mold((out \ + ad3c008f-7301-4c0f-a6f0-fd1c4dcf5be2)(label(map))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - a7aed567-7611-4140-aed6-47cfca19d982)(label(@< >))(mold((out \ + 3fe4dede-7c77-4b75-a5aa-8e87e2c3657d)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3e7e86b3-0bf2-464f-8c14-287749ade0a7)(label(A))(mold((out \ + 10ea9efa-8723-47c2-ab46-cbf31133819d)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 980f6993-ac0f-4e37-a489-30e9e75315f6)(label(@< >))(mold((out \ + 29768b2c-2c2e-48e3-97f0-930e20b8d3e5)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f61821e2-67ba-4f1a-ac19-be6180e79e57)(label(B))(mold((out \ + f2a7ccb0-e9cf-46b2-957e-0ae5066d6a28)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - c669d4ee-ef50-4b63-baa3-5f09bb0ebea3)(label(\"(\"\")\"))(mold((out \ + 157670dc-2108-4052-b2d6-a1b8b00fcfdf)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 6a1c7363-4e51-4e77-b6ad-d42b438c8807)(label(f))(mold((out \ + 7f71b4d1-1220-4eda-a79b-1cdb506714b7)(label(f))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - 61d3f9cc-adc5-42a4-a20d-e744c15e7faa)(label(\"(\"\")\"))(mold((out \ + be25767c-b347-4c12-b126-d24b53066beb)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3fdc2789-e1d6-423d-8914-14e13b8056dc)(label(t))(mold((out \ + 5d6f6685-7205-44ff-874b-0164963452c6)(label(t))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - eb10ad36-970e-4a89-b116-069ffb9b1458)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5c57803e-8a7e-4ccd-9a09-aa38c432ea88)(label(| =>))(mold((out \ + 2f6fe856-ff3f-463c-8fbb-b59ab43afe32)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 8ea66631-5419-43bd-b3ac-76f4f3638cd5)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - d0401065-0a2d-4b70-b9d6-21c4399ec8af)(content(Whitespace\" \ + 492343ae-def9-4122-9f4d-3f567141f17f)(content(Whitespace\" \ \"))))(Tile((id \ - 18e44730-c867-4b7f-822b-a9bdffe40fae)(label(_))(mold((out \ + bff3bb91-04f5-4bf4-a5b2-cb086adf7aff)(label(_))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0ccb7969-3232-4b79-a109-16cbeb2b1ced)(content(Whitespace\" \ + d61a5e2e-7426-48e3-8c83-de59c2acfbe0)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 465fb1d6-0b36-4667-95c9-0f524c6bd778)(content(Whitespace\" \ + 60b24f2d-1c2b-45ab-953a-61279f1caab7)(content(Whitespace\" \ \"))))(Tile((id \ - 867fd8a8-8579-4ac8-909a-734681872eab)(label(emptylist))(mold((out \ + 7aa4bbeb-88cb-477b-96be-aaf33e5e68dd)(label(emptylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 0be00f24-02dd-40c5-8e83-beafd456c77c)(label(@< >))(mold((out \ + 7d3d6781-833b-4b44-a899-a1cf408b4a85)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - c947ddb0-73a0-4044-a626-8a92bdaf56a5)(label(B))(mold((out \ + f85a6825-07e5-4279-b9c0-291b8b46ae96)(label(B))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - b2150275-468a-4c03-aeb6-e2e1c93783a1)(content(Whitespace\" \ + 6ccf14f3-cb77-4918-990e-fb4649d8b6ad)(content(Whitespace\" \ \"))))(Secondary((id \ - fa15e8fa-c55e-4771-be6f-143a036d74c9)(content(Whitespace\" \ + 38056c0c-89be-479c-9bef-9a96d35f3ba9)(content(Whitespace\" \ \"))))(Secondary((id \ - db98ef70-e41c-471b-969a-e48d38db10e1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - c877773f-6884-4bac-a43c-659656214db4)(content(Whitespace\" \ + 89e44c95-f8f9-4cfa-ba91-772c34297f6e)(content(Whitespace\" \ + \"))))(Secondary((id \ + de3c8839-e2ce-4994-94af-08a3eea5c8d1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 49506921-cf28-44b7-85fd-5e91a3efe24f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - a36dc1b8-f510-48f8-9450-b9f9a3ea5ffc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 9c76efef-18ef-4c80-aea2-5588f2bd31ca)(label(let = \ + 232ebce2-9079-48f1-9b5f-5fe8362728cd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 4e48867c-8db2-4567-9fe0-f49d1f02f342)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 11009e58-f59b-4198-a1c6-9086e234d63c)(content(Whitespace\" \ + c8705ea3-ce1b-4bf6-863c-b001f5b1aa3d)(content(Whitespace\" \ \"))))(Tile((id \ - dfb75a4a-eda9-4a5f-a189-a9b61c09d74f)(label(ex4))(mold((out \ + 6e9c34c5-69eb-47a4-bfb9-926fcd58db9d)(label(ex4))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - fe0ece8c-d4fe-43d1-a5ab-c6610d2bb9da)(content(Whitespace\" \ + 4648bbe6-ef61-474a-a912-54436cb9c6d1)(content(Whitespace\" \ \")))))((Secondary((id \ - a5ebb5d8-4270-43b9-9f9c-85724aadf5e6)(content(Whitespace\" \ + 93e5e35f-1cf2-4cce-bc67-651b31e63fe1)(content(Whitespace\" \ \"))))(Tile((id \ - a80b9513-8acd-41a8-9138-3e09755e6146)(label(map))(mold((out \ + 6b6e8972-dfaf-418a-9c17-b1b929935d70)(label(map))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c9425a45-749c-4540-9d5b-3cb75147e6a8)(label(@< >))(mold((out \ + fa2afdb2-d2ca-44af-a3f8-1a9af285341c)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 94233697-d0e8-4d04-a700-5087798f4773)(label(Int))(mold((out \ + 30ceb9f6-3dda-4be6-8866-e1f1a0bd14f0)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 372a79a7-dc27-4439-946d-eb9dc1370162)(label(@< >))(mold((out \ + 36c03a4b-6c7d-4636-a94f-9363a3352b35)(label(@< >))(mold((out \ Exp)(in_(Typ))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8e8f3051-2252-4a97-ae98-252300c848fa)(label(String))(mold((out \ + fb55dd08-3fda-4b09-bc3a-bdbadefbcef5)(label(String))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ - 03437db7-4452-42b7-b844-b2e00520e53a)(label(\"(\"\")\"))(mold((out \ + e4a882cc-37cd-408b-93fb-d99f413a7e1f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - dc879aa4-a827-4594-b26a-955e94472806)(label(string_of_int))(mold((out \ + 85d5ea6d-2039-469e-b784-54ce01255241)(label(string_of_int))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ - f536408e-1a6f-42bc-9ebf-73b1f1ebd2c2)(label(\"(\"\")\"))(mold((out \ + 0a69f22e-0f8c-4a62-9377-a5eed1dae0d5)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - cb127ba7-4153-4717-add7-13d95cd4fecf)(label([ ]))(mold((out \ + 5105173d-d3f0-47ab-887c-cf2dca5961a6)(label([ ]))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 3b9574d7-2da4-407a-bff1-edfc0505f567)(label(1))(mold((out \ + 6b9d93ad-ed2c-4c75-82fa-3d3ec82ac44a)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - d51ca197-6904-48d8-a7e4-e752ce0a7d09)(label(,))(mold((out \ + 420cbfd9-2da6-442b-af95-00f732dd7595)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 652dd523-f8d5-4551-9ee8-0c2b675d7d8b)(label(2))(mold((out \ + 85771edb-344c-410c-82b8-15b3fb67846b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 24aeccbb-4657-481a-a398-514ba50a4aff)(label(,))(mold((out \ + cbbbf31b-cf31-49c6-868b-d4e0d287afe0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Tile((id \ - 52e2149e-0c4f-42b4-9cc1-055c2895f065)(label(3))(mold((out \ + 19b42047-3917-4d09-a639-9e9127314ca2)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Secondary((id \ - 8e4e190f-4c5e-4a5c-842d-56040dfc9521)(content(Whitespace\" \ + eb82736e-0c2c-41f2-a65f-a6ceca289c98)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 18d363f0-c003-4841-b307-cff2e2051e2c)(content(Whitespace\" \ + 447d4a28-2169-48fa-b1ba-a169b2bf0edb)(content(Whitespace\" \ \"))))(Secondary((id \ - aabfae73-ebf6-4539-945e-3ad33afd22d2)(content(Comment\"# \ + 2bdbbe84-65ea-4fe6-8934-0b2eba00f5f8)(content(Comment\"# \ [\\\"1\\\", \\\"2\\\", \\\"3\\\"] #\"))))(Secondary((id \ - af716afa-6733-4a58-a856-5ef9ebbd19f4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - bbc05f67-ab57-4139-a4e4-827e97c4d572)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a73a3b4a-e19c-4bb2-9516-259f7fdd44d1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2371d318-8d2c-4be2-8b5d-20af1c6c0c6b)(content(Comment\"# \ + a318ec9a-6779-4687-8370-bfd52d9d9ded)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 7cc4142f-caeb-44c2-a96a-ee8a36ad04e4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 3dc35bbf-ce65-4d90-8de7-1563f1358fb7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 10fa6385-866d-48e2-858d-30872b6b8c63)(content(Comment\"# \ Recursive types #\"))))(Secondary((id \ - 8e520a6d-ec0f-4b2e-a6a5-5570ed159fac)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 71fe49e3-116e-4e78-924c-b8ab1a6e117e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b9dd0c25-294b-4a16-a8cb-d7fc31a5f9d6)(content(Comment\"# We \ + 9e1352d8-4281-4f4d-9234-44fa1cd202b4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + b81bd44f-73d1-4522-b085-46b3b4bd73c3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c345417f-9c42-4dbb-9d02-79a50271ace3)(content(Comment\"# We \ can express types that are the least fixed point of \ #\"))))(Secondary((id \ - 54979b5d-1a3b-4fab-b3a0-f62dd5ce5426)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 01f03ff8-0847-4fa4-bac5-f81d5f7193be)(content(Comment\"# some \ + 2aed461a-73d2-4b64-8d5d-cce45598d222)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 2965cdfd-570f-40db-bff2-bfb94653c6d6)(content(Comment\"# some \ type function with the rec keyword. #\"))))(Secondary((id \ - dccac3b8-060b-4d30-a446-ac89b4d1dd5b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - ace7ff3c-9467-47be-adc6-8c1987c2a3c3)(label(type = \ + 11563965-8f26-4678-8861-923801a76f11)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + a4e85005-1fd2-4a9b-9563-61fc5bf5a3f4)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - fafd78e3-2676-4994-a593-ffe5651e4632)(content(Whitespace\" \ + 1313decc-3fff-415b-9784-9ed1777b6ee1)(content(Whitespace\" \ \"))))(Tile((id \ - 84289886-6d37-4008-b182-b97cf9b3dccb)(label(MyList))(mold((out \ + f03503f8-ae34-46ab-88c4-ba836dd5e036)(label(MyList))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - b5d68ed8-0443-4010-b351-1aaa1113787c)(content(Whitespace\" \ + d58f98a5-4438-478a-84fa-5b5326249101)(content(Whitespace\" \ \")))))((Secondary((id \ - a1c9fd64-7dd1-4fbd-a3b1-3ab5a9fae5b0)(content(Whitespace\" \ + 9d676f45-e3b7-423a-a893-4b9f5fae84ca)(content(Whitespace\" \ \"))))(Tile((id \ - 9e4be412-ee3c-49dd-b322-bf97d466eb53)(label(rec \ + cc757750-769e-4b66-b934-64bd045e67a1)(label(rec \ ->))(mold((out Typ)(in_(TPat))(nibs(((shape Convex)(sort \ Typ))((shape(Concave 14))(sort Typ))))))(shards(0 \ 1))(children(((Secondary((id \ - 362186f3-a4be-44ad-977a-612dfcda3c91)(content(Whitespace\" \ + 6c01b9a2-369c-41ee-a50a-4ff936cf6429)(content(Whitespace\" \ \"))))(Tile((id \ - 1ac5bdee-f0e8-4371-844e-68e58775f234)(label(A))(mold((out \ + 15dda9dc-54c8-4d69-bc43-152bf92e7739)(label(A))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - 1100fb92-1628-46f9-8baa-9f0eb4be97d2)(content(Whitespace\" \ + 5897403d-b63d-4cc9-b9c2-4507b56a530f)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4fd5c4f9-e0a8-4a89-99a8-7c550503acef)(content(Whitespace\" \ + f1d2d2bc-6d1c-47cf-9285-6c7be2bbea63)(content(Whitespace\" \ \"))))(Tile((id \ - 883fa868-ea2a-4a15-954c-6399569af73a)(label(\"(\"\")\"))(mold((out \ + 87c4686c-9c90-45d4-8ca3-76d1a11b0fda)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 10c749aa-f3d7-4f4b-8b55-90a2d2a08f45)(label(Nil))(mold((out \ + 6d33f00c-fc5f-40f4-be57-abbb5b34d0d9)(label(Nil))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d46836ff-1de3-4cec-ac31-dea38d58b542)(content(Whitespace\" \ + 38d2b064-d7cf-47ce-9617-9de757dffa26)(content(Whitespace\" \ \"))))(Tile((id \ - 5a1c7e00-56e4-471d-b7de-f5ad1918105f)(label(+))(mold((out \ + 6ce4a0e1-1340-41cc-8dbf-28850989cbd1)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 2e8970a2-bf0c-433f-ae95-9173dbfa85b8)(content(Whitespace\" \ + 0beab19f-adb8-4eba-8e76-25744860892a)(content(Whitespace\" \ \"))))(Tile((id \ - ebc889bc-20da-4507-8c9a-9772dee8a5c3)(label(Cons))(mold((out \ + 411e14ae-3702-4e6a-8afc-5c06086d227c)(label(Cons))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3e31e9cc-4533-4450-8873-da3a45f8cdd4)(label(\"(\"\")\"))(mold((out \ + fc18b9e2-16dd-47ea-afef-6614b47baadc)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ed86c144-b905-4d7b-822d-6d4e98f324f8)(label(Int))(mold((out \ + d8141f6d-983b-4e7e-a3e4-ae8d9161dfa7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3eb03795-4bdd-46a4-9344-add816d994f6)(label(,))(mold((out \ + 28f2b782-dbfc-4077-bd76-1fbf1645c838)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ed1fb1d7-8031-4886-9f2a-0844e24786e8)(content(Whitespace\" \ + dc4423b7-c82e-4185-943d-e1f5648ea120)(content(Whitespace\" \ \"))))(Tile((id \ - d32dc58e-4a82-42fa-92b0-b63da586f4ea)(label(A))(mold((out \ + e5d2acce-68db-448d-8cc0-bf4984154edc)(label(A))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - f4bd40f4-5ac1-462f-b8ea-3e42981a1c3a)(content(Whitespace\" \ + 96cf1a82-f8a8-4d80-8913-085df0c08c13)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 3556a58e-9374-432b-bc5c-34d10ee882fb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ecedd7a6-d4b6-4549-a4d8-8629c52be4e7)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e6431041-e48d-41aa-831b-44850f8fb843)(content(Comment\"# \ + ce5f884f-b166-4229-82dc-8f63f57adea9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + caf3425f-2a3b-41a2-a7c1-54b114516486)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + c6048be2-bd6c-4125-81ce-882a9995f8b8)(content(Comment\"# \ Hazel does not (yet) support higher-kinded or existential \ types, #\"))))(Secondary((id \ - bc885522-156d-4c08-a3ea-577f1d9853c3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f64d04ef-13cd-4434-877b-665ce40aaddb)(content(Comment\"# So \ + f599444a-c756-430c-b95e-dfb37ebc5ba3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a4cb6fa4-95c4-4a1e-83e0-aee6faf28274)(content(Comment\"# So \ we cannot implement our own polymorphic lists. \ #\"))))(Secondary((id \ - f81f0b19-edb3-4193-9f69-d75d7fa7e105)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 9e1352e3-0bae-4e3d-bcf7-5cc01e22af0e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 248ef2ce-a413-43a3-8bb1-16c82075d731)(content(Comment\"# Now \ + 459721ed-2da6-4305-84fb-05174d296fb3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 8a4f841b-1d46-456e-83fd-6cc8e0def87f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + de5094a7-d1b1-43b7-80a2-baa03c9ac327)(content(Comment\"# Now \ anything that returns an element of the least fixed point \ matches MyList. #\"))))(Secondary((id \ - da51740b-edd3-4373-bf72-19c5aaf12e65)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c6f1d8ed-1e67-4628-a81d-c94956839d89)(label(let = \ + 0fc57d97-2f81-496e-a0ed-5a29f98f041c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + aa27eca1-91a4-4b37-af52-4696c18b7134)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 87b7b23e-f0a8-4796-9971-3b9979f19875)(content(Whitespace\" \ + e0c4d089-4099-4a1a-83ff-3bd6c3cae9e9)(content(Whitespace\" \ \"))))(Tile((id \ - 04d6e5b2-3e8a-41bb-978d-a47be622fd0c)(label(x))(mold((out \ + aac7f4f6-67c9-45b6-bf86-fd0a783fa2d6)(label(x))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 80e3dea1-d3e4-4390-b5b0-694d93d9ba03)(content(Whitespace\" \ + a15942a7-b0d3-486e-9ad6-21c51ff59e86)(content(Whitespace\" \ \"))))(Tile((id \ - 2dde9ca3-6f9b-4d8e-831b-941e5a818179)(label(:))(mold((out \ + 1143ad5c-81f3-4cee-a0bb-c86feff32bda)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a5d83926-a49d-4a58-89c1-5fc425adec78)(content(Whitespace\" \ + 07ed8ab7-19f9-4ab5-88e8-23238dc52fbe)(content(Whitespace\" \ \"))))(Tile((id \ - ca3edac1-6b65-491d-a363-c50020f31630)(label(MyList))(mold((out \ + a6e8c11f-c7ac-49e0-8f04-dfbc17d94680)(label(MyList))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8737beef-46c4-4073-b060-46a45a5bcff0)(content(Whitespace\" \ + 75005215-aa4e-4590-b0e8-7618b5c239b1)(content(Whitespace\" \ \")))))((Secondary((id \ - 00e2469e-2db3-4f2f-875b-f0b5dfc202cf)(content(Whitespace\" \ + 06154ff2-caa2-46c8-b2af-3d2aaafe9b01)(content(Whitespace\" \ \"))))(Tile((id \ - 5e7734eb-3457-4e72-87ff-3b24e9470b88)(label(Cons))(mold((out \ + 84156c26-cb86-4c86-aec5-9eb23512914e)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 24de7941-c76d-4709-bbbf-c6d0c4fb959f)(label(\"(\"\")\"))(mold((out \ + 9140b606-ad9e-4efe-887b-dd85869dd8fc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e524e4b8-d895-450a-9470-354cad94c77e)(label(1))(mold((out \ + 230d17fc-4ed9-424f-8234-0e104187d4a5)(label(1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 216f8496-94db-4087-bc37-999977628d9d)(label(,))(mold((out \ + d9cbd3c6-b30c-42c9-a5af-e7db45d3c674)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - fb1d0c28-1755-40ce-be5f-5e34fde2687e)(content(Whitespace\" \ + 9b41f61a-4f33-4471-a151-502a75aa797f)(content(Whitespace\" \ \"))))(Tile((id \ - 4683431b-4e46-41ac-a752-e4f5cff82476)(label(Cons))(mold((out \ + cca56564-49cb-4d2c-a41b-90138f5ed45b)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4dbabe03-fc80-4495-a6e8-22b44972b880)(label(\"(\"\")\"))(mold((out \ + 0723f810-c901-4d35-b8c3-879dc47f0011)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 143df52d-6724-47d7-a64d-be9988aab58b)(label(2))(mold((out \ + 308c52b4-8761-4bba-92f9-6d7e551c8e7b)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 75f32a34-a662-4269-8e16-7a2d23deeeb7)(label(,))(mold((out \ + 84174d3d-d8cb-402b-847c-a1ca74a01edd)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 60cc55c9-3bea-4d27-890b-5c0677ff5b83)(content(Whitespace\" \ + 826ba090-6484-407d-8f9d-4fc82aa5e262)(content(Whitespace\" \ \"))))(Tile((id \ - 1841e1f0-0306-48a9-93f4-3b58b173f61f)(label(Cons))(mold((out \ + 6526cc0e-21e6-4999-8165-317606413606)(label(Cons))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f0ba061d-093c-45de-a58b-27797008528f)(label(\"(\"\")\"))(mold((out \ + f5509196-25c5-4078-9f93-79a844ac6a01)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8c304436-f206-4a9d-a65f-3cb47f758253)(label(3))(mold((out \ + cd772d9a-9849-4bdd-b1ce-c112929a6037)(label(3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 594df66c-bffa-4179-9a25-76abd2f52ba2)(label(,))(mold((out \ + b18eca82-fdaa-47f9-a692-dcae6d2d7b9f)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 8551b8e0-fade-42be-816d-460cdd47c557)(content(Whitespace\" \ + bdb4f1fe-b646-4038-a5c6-02fd5180eae6)(content(Whitespace\" \ \"))))(Tile((id \ - ef4ede8c-bcbc-41d1-babe-b18d5428862a)(label(Nil))(mold((out \ + 5b3dc9a2-776a-4f30-a5e4-9ea629c4fc8f)(label(Nil))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))))))))))))(Secondary((id \ - adc39c74-e278-48ff-ae5b-d41c28205bae)(content(Whitespace\" \ + cd14adaf-2eaf-4683-b212-c3f1ae40c258)(content(Whitespace\" \ \")))))))))(Secondary((id \ - b347ad62-3e44-43fe-b551-24843e271ae4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6c36dff8-3d9c-4927-be70-5a97f187b623)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b0860904-30fb-442e-88c0-3b2aa119beca)(content(Comment\"# Note \ + d3c31f12-2f54-4ffe-ac8e-8af9952b4e44)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 45e15030-54bf-4bf6-bb2e-71d3f1393882)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 149652ce-dc20-4064-9798-ae70ad885b09)(content(Comment\"# Note \ that if the sum is the top level operator, \ #\"))))(Secondary((id \ - d1097987-00b4-428d-973e-303d337899e8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c82a8af7-eb80-4d40-8a58-7bfab52e4ede)(content(Comment\"# type \ + c432fee2-53b2-46f9-b952-28c6e199c3d3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 86024019-cc4a-4063-931b-96e183d13bcc)(content(Comment\"# type \ aliases are implicitly least fixed points on their own name: \ #\"))))(Secondary((id \ - 0c9f2980-2c43-43c7-90ed-4bdc410f8db2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - d0b2cf75-5661-4aca-a804-c47e17913eab)(label(type = \ + 02a76b43-546d-4831-9e4f-8224ccbd3f4f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 6d7a7d09-7c09-42ca-af90-ca118d62e09a)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 145b0fe5-1c3d-47b7-9baa-91e9f655a315)(content(Whitespace\" \ + f1ae62e5-5035-4370-b152-33d926dfcb7d)(content(Whitespace\" \ \"))))(Tile((id \ - e115b427-5047-49c7-b024-d0963512cc53)(label(MyList2))(mold((out \ + 156beede-4adc-4099-8bfb-e2392bbb984b)(label(MyList2))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - b696ad25-b36c-47a3-90b3-4002d89da8c7)(content(Whitespace\" \ + 64b19283-c87f-4578-a9eb-cf6c88a7140d)(content(Whitespace\" \ \")))))((Secondary((id \ - d4246a4c-71a4-4732-9f99-313158060078)(content(Whitespace\" \ + c56603ae-3f6f-49ac-b092-9636774b47db)(content(Whitespace\" \ \"))))(Tile((id \ - c05cff13-adbc-4557-9ea6-f884b1fb0356)(label(Nil))(mold((out \ + c608445a-7dc1-4b4d-b59b-476eae965de8)(label(Nil))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - fdc31d31-5fda-474b-a3ba-43465ae742b8)(content(Whitespace\" \ + 318b2a8a-adf4-44d0-921e-20f264679c64)(content(Whitespace\" \ \"))))(Tile((id \ - fbcda478-8bc5-4331-8236-d269ccd0bce5)(label(+))(mold((out \ + 5cd528ef-218c-42a7-a034-6c726453671c)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 99aeef03-5ad7-4ade-bbc1-993e3db8a58e)(content(Whitespace\" \ + effc4dbd-344f-45b7-8f6a-a933b0ab1b15)(content(Whitespace\" \ \"))))(Tile((id \ - f073c150-2a44-4dc0-8af7-50405ffe1caf)(label(Cons))(mold((out \ + 534989eb-ef91-4e5b-9e06-1a6ce71bd4b1)(label(Cons))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 6feee997-742b-44fe-80d0-f157d7e2f3ed)(label(\"(\"\")\"))(mold((out \ + 38dcfa59-8b96-4eef-8f2f-db936f62adde)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - a35cace0-1275-4236-9241-cec4996f9ca8)(label(Int))(mold((out \ + 3acee723-61df-4844-99c8-33376981b6b8)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 5e99fe14-c342-482b-859e-0c4de81782bb)(label(,))(mold((out \ + 80608a67-8896-48ce-b205-419504ae0bec)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 11834d18-f924-49b2-a0f4-e5c83d5bdd6c)(content(Whitespace\" \ + 7042c45e-38e0-4652-94e3-ee244ccb0f7e)(content(Whitespace\" \ \"))))(Tile((id \ - 220372ef-1ba0-4ca5-8162-8e098d7e367d)(label(MyList2))(mold((out \ + 430531d8-b78d-493b-a2d3-0f1d7f06003d)(label(MyList2))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 9929ce23-1085-4719-82fa-463afb53cce7)(content(Whitespace\" \ + edd1fdea-8937-4145-a28c-923838c88dc9)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 2c5154cb-5075-4ce4-90ea-11d350ee2399)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 25b1c459-09b7-4060-b4f7-b289c7ec1aec)(label(type = \ + a21e5bff-afdf-41ee-b14e-7d14671af520)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 647c53f1-a325-49af-847f-7f0367f263e2)(label(type = \ in))(mold((out Exp)(in_(TPat Typ))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 39c76918-671b-42fd-8a94-fd40f7f608c8)(content(Whitespace\" \ + b08631c3-e866-4c41-9dbd-b6730e2ffa34)(content(Whitespace\" \ \"))))(Tile((id \ - eec0fb0c-0a5a-4762-94c4-a865845d4d37)(label(Broken))(mold((out \ + 2dd7c5d1-446b-4a76-90af-cfc9aadebf71)(label(Broken))(mold((out \ TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ Convex)(sort \ TPat))))))(shards(0))(children())))(Secondary((id \ - dfc3b75e-cac6-487c-a2e6-0452868d6358)(content(Whitespace\" \ + 99d8e0e2-641f-4b2e-81f2-e0230a5f1992)(content(Whitespace\" \ \")))))((Secondary((id \ - 1e9d3ba0-4332-4710-a720-d2ae1a3bbfd5)(content(Whitespace\" \ + 435116c5-cace-4bd5-b0bd-2f7d08a1ec67)(content(Whitespace\" \ \"))))(Tile((id \ - 6d364167-e3a0-482a-9384-fd6ae9056a98)(label(Int))(mold((out \ + 71444689-330b-4a1d-84f0-2079af4a5f8b)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - d1cb0b83-203c-4f69-a17d-6f04e3745528)(content(Whitespace\" \ + 024c5fc1-02fd-45cb-99d7-4d3fc6daa657)(content(Whitespace\" \ \"))))(Tile((id \ - 65b03562-5b07-4c35-bac5-55bf0430a38a)(label(->))(mold((out \ + 3188cc81-c93d-4674-98c4-217dac34d119)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 90d48b69-a229-4ea7-8f3c-d59868cc45ff)(content(Whitespace\" \ + 20bd1412-4c8b-4c92-b601-fa2ffc86b1f5)(content(Whitespace\" \ \"))))(Tile((id \ - 38f4d0ea-688c-4250-80fc-b0001a85e0e3)(label(\"(\"\")\"))(mold((out \ + fb0afc69-44de-4c2a-b662-b002dc0b641e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 772d2efa-532f-40a3-a7e9-a76ae497630e)(label(HasInt))(mold((out \ + fa9408d4-ff19-4104-9a28-f15af2ac0cb2)(label(HasInt))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9bda5e46-e39e-4e50-8ee2-a9821926c5b1)(label(\"(\"\")\"))(mold((out \ + 071e5ed6-10d0-4a9e-94c4-abd8515f63a4)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 402d0a38-a6f8-4b62-bc01-c010cff8b712)(label(Int))(mold((out \ + 98baba7d-e8dd-4c5c-a849-665c99f0b805)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children()))))))))(Secondary((id \ - e2166c48-e699-499c-bd0d-cdfe8bd3a081)(content(Whitespace\" \ + 6d6328cb-b0a2-4e6e-8023-93a9b73b2cdf)(content(Whitespace\" \ \"))))(Tile((id \ - d55310aa-acb6-423b-8e72-309c3d2bdfd4)(label(+))(mold((out \ + 7a71eb31-9849-4573-99f5-e6a277ad0c4d)(label(+))(mold((out \ Typ)(in_())(nibs(((shape(Concave 11))(sort \ Typ))((shape(Concave 11))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7049a74c-5da5-403c-98ea-78a76793a4aa)(content(Whitespace\" \ + dea94b6a-85ac-4f1a-bdb7-b8eb0652ae0d)(content(Whitespace\" \ \"))))(Tile((id \ - dbf7edfd-383b-4229-adf8-2ee9ad2c8fb1)(label(HasMore))(mold((out \ + e4a7913a-31f6-48d8-91d2-5e0a12b7714c)(label(HasMore))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 9a962a63-bdb3-4115-858e-ea99880a55a8)(label(\"(\"\")\"))(mold((out \ + 557c9b57-e2a0-4278-bb76-a62b919dd2b8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 8c5f9a72-b004-4038-96c9-fbd03b988f02)(label(Int))(mold((out \ + 4421eb2e-f93d-484a-9792-2cd840406c8f)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 20138d7a-35d6-4710-a1bc-5a8584d44f00)(label(,))(mold((out \ + 4173a4e6-11fa-4063-ab15-dd5a61add46c)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 9a40d629-9fa3-4269-9e55-e29684562968)(content(Whitespace\" \ + 4cfdbfe3-6130-4d32-ae6b-62d74abedca2)(content(Whitespace\" \ \"))))(Tile((id \ - abf438f3-8ca0-4705-8b7a-2b139abb04ea)(label(Broken))(mold((out \ + be40b96d-c951-4309-a15f-5973e0c11660)(label(Broken))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 25c4fd7d-246f-4772-a568-1a8f5d1c8f8c)(content(Whitespace\" \ + 47f144e6-a9a5-4a7d-a860-266826834565)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 99c07290-e1c2-4c7a-b9ca-b6e8fc419ba5)(content(Whitespace\" \ + 5ce94e31-60f7-4774-9ff7-7ca91720ca89)(content(Whitespace\" \ \"))))(Secondary((id \ - 55a5cf7c-9058-43cc-9c68-fb1319066fb1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b3c76bcb-8ac9-41a2-8fe6-d26661cb3730)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - e7e7f66b-3628-4d5a-95cd-d644c8a387f1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - e3c0ad25-7dca-4797-a708-6a2e50a19e31)(label(let = \ + fc799434-6fb9-4755-8743-6a34da9348dc)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 19a903fa-b5cc-44a9-ac71-c1ae0553bbf6)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + 6a50a4e5-30db-4018-bc21-5443216343eb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 83d6e4b0-c6fe-4fd0-bdb6-8266174e1ccb)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 7c89953e-b5a2-4719-ab6f-a40a8215cf8e)(content(Whitespace\" \ + 79b8633d-b993-4c75-adbd-a191454fb8ed)(content(Whitespace\" \ \"))))(Tile((id \ - b7956931-9c86-44e5-8802-64b78ed8dedd)(label(list_of_mylist))(mold((out \ + 1bbe8db1-4775-4b08-bdd2-72d2adcb5fd7)(label(list_of_mylist))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 079320ce-0daf-4bad-b0bf-764bbf0f10ba)(content(Whitespace\" \ + a74ae3db-66e8-4716-9a46-25d33152c1c8)(content(Whitespace\" \ \"))))(Tile((id \ - 24ea3f3c-5bb6-4e53-80c6-35e3378cce96)(label(:))(mold((out \ + 393e1773-3bd4-441a-938b-e28907ba3946)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 8a59678d-1828-4e37-8d68-842a6ccad757)(content(Whitespace\" \ + 77da75ad-e1cf-45f8-8772-fb684f09ffc5)(content(Whitespace\" \ \"))))(Tile((id \ - 8ef449d5-e57a-4ed3-abde-d39c96bd482b)(label(\"(\"\")\"))(mold((out \ + ed987cc5-4219-448f-945a-c55d5c0eac52)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 86f269d3-bac2-46ca-806e-07412dcd5d48)(label(MyList))(mold((out \ + 7f173ed8-2d37-46c7-bed6-0a4afce9fcd7)(label(MyList))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 81b6d173-8a8e-4f9d-8963-2743dec95732)(content(Whitespace\" \ + 43c3df10-d037-4153-b248-e6c3de4ff279)(content(Whitespace\" \ \"))))(Tile((id \ - 33e06d4e-d90f-45ec-a3f9-ef69835ad277)(label(->))(mold((out \ + ac646643-33c2-4b5e-9085-5f99acc62762)(label(->))(mold((out \ Typ)(in_())(nibs(((shape(Concave 6))(sort \ Typ))((shape(Concave 6))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - d7f9d082-c32c-4bfe-abab-61ee5a47dc8b)(content(Whitespace\" \ - \"))))(Tile((id 9c978093-514e-44d1-8dc1-22445ef97223)(label([ \ + 08f93e65-6c66-40cf-825d-132b7c67eeda)(content(Whitespace\" \ + \"))))(Tile((id 3677baf2-d481-4777-bddb-b61cd811e184)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ 1))(children(((Tile((id \ - 5e33c867-ea65-485b-b65a-c01272ec5b1b)(label(Int))(mold((out \ + 11e1e3f4-56cf-48ab-a52c-2bb2f23c66cc)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort \ Typ))))))(shards(0))(children())))))))))))))(Secondary((id \ - 9efa8337-cd21-46d3-8ea0-4a4cda38d0a2)(content(Whitespace\" \ + 202cf2f6-62b2-4c08-a113-534301c3879d)(content(Whitespace\" \ \")))))((Secondary((id \ - 65f09066-5f4c-42b9-9206-66deef228663)(content(Whitespace\" \ + 30e71f4c-4ad9-4692-a970-f874ab571cb5)(content(Whitespace\" \ \"))))(Tile((id \ - dc06532c-dcc7-46f9-b23c-6cde45937838)(label(fun \ + ae51048d-9641-4fd8-a5a0-88740b93275f)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 3e8bc037-4194-4e4b-bb25-e9ade2b49c4c)(content(Whitespace\" \ + 9fc792fb-850f-4fad-a5ca-f69c32d4d9ca)(content(Whitespace\" \ \"))))(Tile((id \ - a5913d90-4485-4b0a-9991-afb6132c4bf5)(label(myl))(mold((out \ + d4fc4896-fe4a-497c-b6de-b6f57b1e5ce7)(label(myl))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - eb0e08d6-179f-4ec9-abf5-79a5d8e6c49f)(content(Whitespace\" \ + 36e3e23a-a76d-4053-a67b-2504f81aa539)(content(Whitespace\" \ \"))))(Tile((id \ - a2ca555f-2b91-456e-a423-1310c3f68910)(label(:))(mold((out \ + 2196e702-dfcc-400b-a60f-c7c70a2d436b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 92deaca5-177c-4631-b792-86fd400f3e5a)(content(Whitespace\" \ + 3fca45c6-7f3c-4747-b148-6a0a7a81a508)(content(Whitespace\" \ \"))))(Tile((id \ - 8e23a485-54ef-437e-887b-2d0ccfc6bd63)(label(MyList))(mold((out \ + cbb9a721-ff64-4b99-8c0b-6efb6af68901)(label(MyList))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 95ca261b-4504-4475-a928-f2448e5a900d)(content(Whitespace\" \ + 07de10c3-5227-44c8-91c5-b418ef6d7d66)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 01c5a8bc-ce88-4017-989b-778c720940d3)(content(Whitespace\" \ + 4524d42f-a7df-45d7-8b6f-2d601a9391fa)(content(Whitespace\" \ \"))))(Secondary((id \ - 9f102c49-365a-4a98-aaee-d73af12b5478)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 416b8bc5-2f8f-4511-9735-5f45c59f28f4)(label(case \ + 887db3b7-3a63-4cb4-b436-13af4cdd550e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 7a60578e-cf14-4c3a-838e-6e8c665e0902)(label(case \ end))(mold((out Exp)(in_(Rul))(nibs(((shape Convex)(sort \ Exp))((shape Convex)(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - bbd2e77a-56aa-4c00-9b14-5d41ca4a4b42)(content(Whitespace\" \ + 8b2c0d0c-487f-4d7d-b1ac-798cdba2b45f)(content(Whitespace\" \ \"))))(Tile((id \ - e6b2b9f9-c4ed-4406-860b-888a51b7a414)(label(myl))(mold((out \ + 477624b4-1c5c-4551-9b6a-7b7b2ebab334)(label(myl))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - be09851d-fb88-44d8-9274-e3786bdbe060)(content(Whitespace\" \ + 7dfe5c52-7562-47d1-816e-5af852d7ba49)(content(Whitespace\" \ \"))))(Secondary((id \ - e3ac8b12-ae97-4d8b-aab6-87b3f98be3a1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 5b63b9ef-ba1a-488f-99c0-a7d2a4d2efc3)(label(| =>))(mold((out \ + 62b0e919-8dd0-48d0-beb2-9d14c902d6bc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 5085a225-6112-41cc-baeb-e897da68b922)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 92592619-8e42-4e6c-aab0-282483b4122a)(content(Whitespace\" \ + f345fd55-3574-4d1d-baa2-5a291243e8aa)(content(Whitespace\" \ \"))))(Tile((id \ - 80011089-91f4-43f5-887e-3e6eb9627a10)(label(Nil))(mold((out \ + f84cd3b0-ea8b-4968-8ede-afe6a0b47838)(label(Nil))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0fd346ad-77c2-4fa6-8ab4-439aafa69c3a)(content(Whitespace\" \ + 5ec88331-d28a-4c0c-85f5-111642556151)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 6bcdc7f5-4e95-4d3d-a6e5-be3ab52aab4c)(content(Whitespace\" \ + 1fecafa6-926e-4939-9d4e-2f60c57ccd20)(content(Whitespace\" \ \"))))(Tile((id \ - b649bf51-fcdb-486a-b83a-f8358a676977)(label([]))(mold((out \ + 252c76b2-4b7c-4150-a3ee-661f3b31719e)(label([]))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 318f53fb-151a-4869-be2b-fb626311089b)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 76a66fbd-e4a5-46fd-afc9-bbcf0ece96cd)(label(| =>))(mold((out \ + 4215632d-7a07-493d-92e7-2b7eb8d80ec4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 2e023d3f-d3c1-4523-989d-b3be6bd3bf07)(label(| =>))(mold((out \ Rul)(in_(Pat))(nibs(((shape(Concave 21))(sort \ Exp))((shape(Concave 21))(sort Exp))))))(shards(0 \ 1))(children(((Secondary((id \ - 97e1ac37-196f-497c-9750-3376083f0f12)(content(Whitespace\" \ + 59e13a8b-9c07-44d3-90df-6d97b7e4682f)(content(Whitespace\" \ \"))))(Tile((id \ - 559c1471-f3b4-47ac-911e-80cfe31e86dd)(label(Cons))(mold((out \ + a01b2174-32af-49c7-ae2f-27d5367651a8)(label(Cons))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6d6ee70b-85a4-424e-bba1-b9cbeacbe43e)(label(\"(\"\")\"))(mold((out \ + ffe18856-82c6-4b9a-aec7-acbe352b2481)(label(\"(\"\")\"))(mold((out \ Pat)(in_(Pat))(nibs(((shape(Concave 2))(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 81a777c7-8a54-4cdb-97e2-8efdc0428460)(label(h))(mold((out \ + 1f132481-79c3-4311-a73f-78431282f222)(label(h))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 86566da8-75c9-4665-b8ce-424b7f975e59)(label(,))(mold((out \ + c1ba4810-ce3f-4c29-92ac-51de5fd6647e)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ Pat))))))(shards(0))(children())))(Secondary((id \ - 0714da52-8a53-4d81-b8ae-ffd79a6b0640)(content(Whitespace\" \ + 3cc5248e-5c9f-4213-980a-4a9954f0d0e5)(content(Whitespace\" \ \"))))(Tile((id \ - 65b12f18-8748-4c77-aca0-0bac20521d54)(label(t))(mold((out \ + e9b7d57a-223a-4f05-a593-7c6dedaf041c)(label(t))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort \ Pat))))))(shards(0))(children()))))))))(Secondary((id \ - 0b2df1ea-958c-4ee2-bc39-27d94c2f094f)(content(Whitespace\" \ + 8a6d6443-ad77-4538-a473-fc7984a46623)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 67484ce1-21f9-4a46-9f36-4c515f06d02a)(content(Whitespace\" \ + 0d200042-cf30-41bb-bc17-e7ec2102adbb)(content(Whitespace\" \ \"))))(Tile((id \ - 0a7de655-885e-4ab3-bd35-46b469fb35e3)(label(h))(mold((out \ + 8c8d8699-5d50-4559-a777-258dc39138af)(label(h))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5da31928-fc8d-49ea-97e2-edb70def8b44)(content(Whitespace\" \ + 7b07f85a-77c6-4892-9b37-ed58ef37de5b)(content(Whitespace\" \ \"))))(Tile((id \ - c6d01b56-77bf-4d1f-82fc-f6bd21db79f6)(label(::))(mold((out \ + 5d697673-224c-4286-b050-2d7b22d45f68)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - aaec52f1-3b9f-4080-92fb-594a990998f5)(content(Whitespace\" \ + abc17ad0-806c-4460-b56f-2d409e1e148c)(content(Whitespace\" \ \"))))(Tile((id \ - df972059-4b53-49eb-8d0d-d0da35b020db)(label(list_of_mylist))(mold((out \ + aaf1bfc4-35db-48dd-bda7-b1998e888b62)(label(list_of_mylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 51cb6036-8efa-4353-94b3-f234a9b9d73a)(label(\"(\"\")\"))(mold((out \ + 4dcc8cc7-da9c-4075-9941-84b547b75443)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 735941b9-2f5d-49e7-a2ce-579e2e8e2c64)(label(t))(mold((out \ + 74b76516-fa73-4e40-88ea-373f0bd66560)(label(t))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 03bed949-5ddc-4354-a482-9778424002b2)(content(Whitespace\" \ + 954678b7-044c-44ae-8009-7ffeaadeb8a2)(content(Whitespace\" \ + \"))))(Secondary((id \ + 9b358a1d-5b2a-4b15-a585-4b48232dd712)(content(Whitespace\" \ \"))))(Secondary((id \ - 92b2d2c9-117f-4db9-888e-ee9c0f8dbccb)(content(Whitespace\" \ + ba59b233-f10e-4c73-915b-a8b8661a612b)(content(Whitespace\" \ \"))))(Secondary((id \ - d9fec6db-9209-4013-80fc-9f6adc26687f)(content(Whitespace\" \ + e69a6392-8b62-4f85-8f81-38ed98e7372f)(content(Whitespace\" \ \"))))(Secondary((id \ - dff01c63-59af-431d-a27d-527ea7b95ae8)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ - 05c4816a-f0cb-4d50-99e6-c2ba35cca0db)(content(Whitespace\" \ + 7a3e1339-6277-42a6-a5a9-6eddf0fdfe2a)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + f537135f-30be-4360-a5b6-90269136e275)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 4dd178da-7d67-457a-8274-1ab4c765eade)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f7cda394-28dd-4ace-af26-a57c2c88b35b)(label(let = \ + 2dd2bf49-93f0-487e-abfc-eb01031c27b2)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + adb827e5-6130-4050-bd5e-2c7d4389a53d)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - dd198eb2-e280-4c71-a2eb-62d2c14e8663)(content(Whitespace\" \ + fa0bf5f6-5a3b-44e8-8bbe-ec3ada77bb93)(content(Whitespace\" \ \"))))(Tile((id \ - 1db6dab4-8b27-4812-b6a5-dc7c6573ebf9)(label(ex5))(mold((out \ + c016161b-23fd-4267-a75a-43218f4b0317)(label(ex5))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 0497fe75-3eed-42e2-b701-1d271a66d6b0)(content(Whitespace\" \ + 20a4148b-853f-484d-8423-bae1dc00286b)(content(Whitespace\" \ \")))))((Secondary((id \ - 5e7c7f78-8268-4b98-ba6b-39a0dc607004)(content(Whitespace\" \ + 9e848c9f-27b0-4b08-ab1b-24b05c16cd00)(content(Whitespace\" \ \"))))(Tile((id \ - ea0a1a14-0131-43dc-a0dc-4af1751ebe24)(label(list_of_mylist))(mold((out \ + 5b494e56-3450-4893-a1ff-780b3264f923)(label(list_of_mylist))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 4566312a-4097-4ddf-8a3a-6ad0187b2086)(label(\"(\"\")\"))(mold((out \ + 43da4f1c-8e84-42c8-9cc9-97d6ebeee657)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8b03159f-58f7-44ac-af06-dddf7b84e4f3)(label(x))(mold((out \ + f559334b-0f30-4e33-be02-af706c8f4d96)(label(x))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children()))))))))(Secondary((id \ - 92b8b1aa-02a9-4ea3-8610-cdcafb8b5f81)(content(Whitespace\" \ + 42b7ffd5-8f17-4ded-aba5-2eadb5821520)(content(Whitespace\" \ \")))))))))(Secondary((id \ - 0c8a6bd6-24e0-4ded-af38-cf121b33b7c2)(content(Whitespace\" \ + fb69fc73-8a28-48a3-aeee-3a75e1cdedb8)(content(Whitespace\" \ \"))))(Secondary((id \ - 4832b326-6b35-4dc7-b50a-b7ef99739eeb)(content(Comment\"# [1, \ + 7a2e9eaa-4405-457f-9e63-36eac807087e)(content(Comment\"# [1, \ 2, 3] #\"))))(Secondary((id \ - ed67f0d1-3502-4091-9826-0c4a4794e710)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7562003d-7b56-4155-97ae-11e28a3a950f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 5a9204f7-2892-4030-b938-e2f7e6798658)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 28da5c64-abd8-44aa-8cc8-2877d2d53d63)(content(Comment\"# All \ + b687ad12-d0bb-4f0d-bde1-0bcb776e4443)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + cda2e5c7-45a8-4879-88dc-9b1b651cdca4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + d8cc89a9-5bf4-4b78-81a0-b1c5d9451ad4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ + a8c91397-927d-46e0-b6ae-8b74ac2a8ad2)(content(Comment\"# All \ output from examples: #\"))))(Secondary((id \ - 55833e6c-46f5-4a60-b151-3e93dcf719ee)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 6c5a94ac-00fd-4601-bb0f-96f360cf20ae)(label(\"(\"\")\"))(mold((out \ + 3b97ec16-3f61-4f68-b248-aaca867a2a49)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ + 179da491-661b-4ba4-a24e-7d00e4062471)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 326e14fa-afc9-48c0-8b78-439a92b7915b)(label(ex1))(mold((out \ + eb8715c6-7afe-4f23-84cf-31c9c391506d)(label(ex1))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - f35896d6-89e9-4b1e-a675-f583ce1f73a4)(label(,))(mold((out \ + 7a46cceb-444c-4343-8d87-a55cd2c1eedc)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 481e7aa2-9c28-4834-ac9f-bda5a5524d0b)(content(Whitespace\" \ + eed590f1-fb2f-4a68-ac6b-c4e93fb9f7e8)(content(Whitespace\" \ \"))))(Tile((id \ - 00a8b270-9f69-4c3c-a094-a0373ff33b70)(label(ex2))(mold((out \ + 07c52a26-01b7-4d87-8cdf-b657273e67e8)(label(ex2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - c533dfe2-b6f9-4107-9cf2-48b94ebe86bd)(label(,))(mold((out \ + e2c29b4c-3e9b-443f-888b-f5df11670119)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 175b130f-85ca-4873-8f4a-0155220f2a18)(content(Whitespace\" \ + 443e38d3-fa67-4415-8b28-5ee13f05f3f6)(content(Whitespace\" \ \"))))(Tile((id \ - 03fa318d-c82f-4c4c-a2a5-8b140da3d6a8)(label(ex3))(mold((out \ + 5cffb2ac-001a-42a6-8ff6-22fd5cb26efc)(label(ex3))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 09830e48-ae8b-49c8-8092-a1c6aa3eee83)(label(,))(mold((out \ + 1522405c-6b51-47bb-aa60-89671a27d71a)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 1c00ba13-3819-4cc7-b1eb-f6370d6f6670)(content(Whitespace\" \ + e5154891-4ad3-4d95-8601-a311f10de5d0)(content(Whitespace\" \ \"))))(Tile((id \ - f1bf0181-4f8e-4624-a47b-a8771faa6fb8)(label(ex4))(mold((out \ + 97f8fd65-6b1c-430f-b73c-50db1333c457)(label(ex4))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ - 165065c6-9d00-4e83-a357-b2fc59a645b9)(label(,))(mold((out \ + 6bd8095b-89b6-419f-9de1-19c5e746c4a9)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ - 7e8a34d3-3457-44d9-b820-7c7cbf87e0dd)(content(Whitespace\" \ + 44c1f515-be13-4026-80b2-48556eee832b)(content(Whitespace\" \ \"))))(Tile((id \ - e52d4b40-a703-48f9-b88a-81e3204309c0)(label(ex5))(mold((out \ + 268a3ed0-8342-423d-a603-7e3b19243afa)(label(ex5))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ Exp))))))(shards(0))(children())))))))))))(ancestors())))(caret \ - Outer)(projectors()))"; + Outer))"; backup_text = "# Polymorphism #\n\n\ # We can take types as parameters to type functions, #\n\ @@ -18377,7 +18469,7 @@ let startup : PersistentData.t = typfun A -> typfun B -> fun f : (A -> B) -> fun l : [A] -> \n\ case l\n\ | h :: t => f(h) :: map@@(f)(t)\n\ - | _ => emptylist@ \n\ + | _ => emptylist@ \n\ end in\n\ let ex4 = map@@(string_of_int)([1,2,3]) in # \ [\"1\", \"2\", \"3\"] #\n\n\n\ @@ -18400,7 +18492,7 @@ let startup : PersistentData.t = let list_of_mylist : (MyList -> [Int]) = fun myl : MyList -> \n\ case myl \n\ | Nil => []\n\ - | Cons(h, t) => h :: list_of_mylist(t) \n\ + | Cons(h, t) => h :: list_of_mylist(t) \n\ end in\n\ let ex5 = list_of_mylist(x) in # [1, 2, 3] #\n\n\n\ # All output from examples: #\n\ @@ -18411,110 +18503,130 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - baa84041-2788-479a-abe3-5cc7ce38f534)(content(Whitespace\" \ + 95e17a56-7595-403d-923d-60f6d1fad48c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 928c135e-228f-4db2-b3f1-3dab2fbfcc2f)(content(Whitespace\" \ \")))))((Grout((id \ - 5d8d9885-fe4f-408b-93da-f765343a60ae)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 527b01da-5acd-4de7-99a0-02510f2fbe0f)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Composing Arithmetic Expressions", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - b2032d38-e001-4f4c-8ad6-8d1d9db9b25e)(content(Whitespace\" \ + c98c482a-094a-404c-843a-ae5602bdb22c)(content(Whitespace\" \ + \"))))(Secondary((id \ + 7fabb272-0901-4ae2-9630-e252e699167f)(content(Whitespace\" \ \")))))((Grout((id \ - f0c03c06-864c-4f9a-8247-0ae3e4d3d21b)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 3767c92f-8a0e-4b82-8407-7e33c55a07be)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Computing Equationally", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - ea22b7c5-89df-45b0-8aa8-040e5aa77dad)(content(Whitespace\" \ + 403cdfa4-a042-43dd-9ea8-4575de1ddff1)(content(Whitespace\" \ + \"))))(Secondary((id \ + 4ffadc3e-c3fe-4ebc-b02e-1f7553b683b0)(content(Whitespace\" \ \")))))((Grout((id \ - e4387022-ae32-4ab5-be7a-9dc95557b431)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 293ef06a-03d2-4770-8282-f6bbc4aeea08)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Variables", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 8da71806-cb3e-4e4b-b4b6-281848dd93a5)(content(Whitespace\" \ + 9444e123-e149-4dea-ad91-b95d36ed6adc)(content(Whitespace\" \ + \"))))(Secondary((id \ + 92e9fb8a-18bc-4c83-bcad-bb3e40756633)(content(Whitespace\" \ \")))))((Grout((id \ - 96e5093a-496d-4ef8-b59d-03f1945f77f7)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 878e0a53-88e7-489c-8f30-b60405bb8eb7)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Compositionality", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 31ba0770-e603-4dca-b190-198ca98028b2)(content(Whitespace\" \ + 4a32efdc-9f75-458a-bc30-2cbc0eaf5332)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5a7df6d9-d4d8-4d65-9a09-554002a19042)(content(Whitespace\" \ \")))))((Grout((id \ - e45206da-d7ff-4a80-bc10-6604b689b0af)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 67f58c5b-14f7-4b5d-9478-1e66a9bb97ba)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Scope", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 5b636cbc-58a9-4a65-a8b8-cf8817807c7f)(content(Whitespace\" \ + 52a43a65-0ce5-4495-96b3-7b2a68e1a282)(content(Whitespace\" \ + \"))))(Secondary((id \ + 3607cc7d-3050-48db-9533-9cc0474b4fe3)(content(Whitespace\" \ \")))))((Grout((id \ - 664d665f-e868-42eb-b505-aaab48bc519b)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + a48ecbfe-f027-4482-b40c-d59c7a79b52e)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Shadowing", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 60079790-fb8e-4b20-a7e4-8af54a01667f)(content(Whitespace\" \ + 7fad2ec1-94b1-430b-a375-d74899fac17b)(content(Whitespace\" \ + \"))))(Secondary((id \ + 02e4e64b-39f6-4551-86a0-00b915016b31)(content(Whitespace\" \ \")))))((Grout((id \ - 14e465fe-ef0a-4f55-baba-3b378a08c00d)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + fa020b7e-8025-47eb-b6ce-5b5797358e67)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Booleans and Types", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 4887e553-d2fb-46c7-b710-0d4ee1dae869)(content(Whitespace\" \ + d9da612b-70e0-4d77-8451-5576e940bd28)(content(Whitespace\" \ + \"))))(Secondary((id \ + 298a3449-9607-4383-be09-0390df08d3f1)(content(Whitespace\" \ \")))))((Grout((id \ - 4a2fd66b-79e3-4706-a15c-ec1c68f3cfd0)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + c19d2704-759a-401a-af23-b6c5263f7c7b)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Conditional Expressions", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - f4bc4d20-0c27-49cc-bf93-8fb6be86ba05)(content(Whitespace\" \ + d20712f1-0845-4f1a-af5f-0313193bf613)(content(Whitespace\" \ + \"))))(Secondary((id \ + 8dd3ff3c-6dcf-4e3f-b6ed-dc44ee50e061)(content(Whitespace\" \ \")))))((Grout((id \ - a08352ba-c945-4491-8b57-0796dd316233)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + 5eb4e750-954c-46e7-a785-d8af9e1b8e40)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ( "Functions", { zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 5e372e72-033f-41ec-8c1d-5eb1e078c7a1)(content(Whitespace\" \ + 226fddf9-66de-47d2-bccc-99f9c32d5152)(content(Whitespace\" \ + \"))))(Secondary((id \ + 5ef7a887-0edf-46e1-85d4-168ef6d130dc)(content(Whitespace\" \ \")))))((Grout((id \ - 5f36a877-e0bd-47cf-a439-41ca8bef21d6)(shape \ - Convex))))))(ancestors())))(caret Outer)(projectors()))"; - backup_text = " "; + a1407558-57b7-45ea-b4d6-83771ae62b46)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; } ); ], [ diff --git a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml index 7976012cc0..ab0a0b5ee7 100644 --- a/src/haz3lweb/exercises/Ex_OddlyRecursive.ml +++ b/src/haz3lweb/exercises/Ex_OddlyRecursive.ml @@ -12,7 +12,6 @@ let exercise : Exercise.spec = { test_validation = 1; mutation_testing = 1; impl_grading = 2 }; prelude = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -259,7 +258,6 @@ let exercise : Exercise.spec = }; correct_impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -802,7 +800,6 @@ let exercise : Exercise.spec = { tests = { - projectors = Id.Map.empty; selection = { focus = Right; content = []; mode = Normal }; backpack = []; relatives = @@ -1057,7 +1054,6 @@ let exercise : Exercise.spec = }; your_impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1242,7 +1238,6 @@ let exercise : Exercise.spec = { impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1449,7 +1444,6 @@ let exercise : Exercise.spec = { impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1656,7 +1650,6 @@ let exercise : Exercise.spec = { impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -2456,7 +2449,6 @@ let exercise : Exercise.spec = { tests = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml index 153ee70192..1e95c4719d 100644 --- a/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml +++ b/src/haz3lweb/exercises/Ex_RecursiveFibonacci.ml @@ -20,11 +20,9 @@ let exercise : Exercise.spec = ancestors = []; }; caret = Outer; - projectors = Id.Map.empty; }; correct_impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -481,7 +479,6 @@ let exercise : Exercise.spec = { tests = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -496,7 +493,6 @@ let exercise : Exercise.spec = }; your_impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -684,7 +680,6 @@ let exercise : Exercise.spec = { impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1407,7 +1402,6 @@ let exercise : Exercise.spec = { impl = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = @@ -1991,7 +1985,6 @@ let exercise : Exercise.spec = { tests = { - projectors = Id.Map.empty; selection = { focus = Left; content = []; mode = Normal }; backpack = []; relatives = diff --git a/src/haz3lweb/explainthis/Example.re b/src/haz3lweb/explainthis/Example.re index 8a54d97bb0..64ab09026b 100644 --- a/src/haz3lweb/explainthis/Example.re +++ b/src/haz3lweb/explainthis/Example.re @@ -49,7 +49,6 @@ let zipper: Zipper.t = { ancestors, }, caret: Outer, - projectors: Id.Map.empty, }; // TODO Make sure using this for all the forms that should, like wild and nil diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index fa91e1327b..d27326ee67 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -137,7 +137,7 @@ let deco = decos @ test_result_layer( ~font_metrics=ui_state.font_metrics, - ~measured=meta.projected.measured, + ~measured=meta.syntax.measured, test_results, ) // TODO move into decos }; diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 1b04cd3e8a..bf9548cdd1 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -184,7 +184,7 @@ let view = ~font_metrics, ~settings: Settings.t, z: Zipper.t, - {projected: {measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, + {syntax: {measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, ) : Node.t => { module Text = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 71f941a6cf..1b082d6106 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -9,10 +9,10 @@ module Deco = (M: { }) => { let font_metrics = M.ui_state.font_metrics; - let tile = id => Id.Map.find(id, M.meta.projected.tiles); + let tile = id => Id.Map.find(id, M.meta.syntax.tiles); let caret = (z: Zipper.t): Node.t => { - let origin = Zipper.caret_point(M.meta.projected.measured, z); + let origin = Zipper.caret_point(M.meta.syntax.measured, z); let shape = Zipper.caret_direction(z); let side = switch (Indicated.piece(z)) { @@ -45,7 +45,7 @@ module Deco = (M: { Measured.find_g( ~msg="Deco.sel_of_piece", g, - M.meta.projected.measured, + M.meta.syntax.measured, ), p, ), @@ -59,7 +59,7 @@ module Deco = (M: { Measured.find_w( ~msg="Deco.sel_of_piece", w, - M.meta.projected.measured, + M.meta.syntax.measured, ), p, ), @@ -75,7 +75,7 @@ module Deco = (M: { } and sel_of_tile = (~start_shape, t: Tile.t): list(option(shard_data)) => { let tile_shards = - Measured.find_shards(~msg="sel_of_tile", t, M.meta.projected.measured) + Measured.find_shards(~msg="sel_of_tile", t, M.meta.syntax.measured) |> List.filter(((i, _)) => List.mem(i, t.shards)) |> List.map(((index, m)) => { let token = List.nth(t.label, index); @@ -95,7 +95,7 @@ module Deco = (M: { and sel_of_projector = (~start_shape, p: Base.projector): list(option(shard_data)) => { let m = - switch (Measured.find_pr_opt(p, M.meta.projected.measured)) { + switch (Measured.find_pr_opt(p, M.meta.syntax.measured)) { | None => failwith("TODO(andrew): Deco.sel_of_projector: missing measurement") | Some(m) => m @@ -156,22 +156,22 @@ module Deco = (M: { let range: option((Point.t, Point.t)) = { // if (Piece.has_ends(p)) { let id = - Id.Map.find(Piece.id(p), M.meta.projected.terms) |> Term.rep_id; - switch (TermRanges.find_opt(id, M.meta.projected.term_ranges)) { + Id.Map.find(Piece.id(p), M.meta.syntax.terms) |> Term.rep_id; + switch (TermRanges.find_opt(id, M.meta.syntax.term_ranges)) { | None => None | Some((p_l, p_r)) => let l = Measured.find_p( ~msg="Deco.indicated", p_l, - M.meta.projected.measured, + M.meta.syntax.measured, ). origin; let r = Measured.find_p( ~msg="Deco.indicated", p_r, - M.meta.projected.measured, + M.meta.syntax.measured, ). last; Some((l, r)); @@ -186,7 +186,7 @@ module Deco = (M: { | None => [] | Some(range) => let tiles = - Id.Map.find(Piece.id(p), M.meta.projected.terms) + Id.Map.find(Piece.id(p), M.meta.syntax.terms) |> Term.ids /* NOTE(andrew): dark_ids were originally filtered here. * Leaving this comment in place in case issues in the @@ -200,13 +200,13 @@ module Deco = (M: { Measured.find_shards( ~msg="Deco.indicated", t, - M.meta.projected.measured, + M.meta.syntax.measured, ), ); }); PieceDec.indicated( ~font_metrics, - ~rows=M.meta.projected.measured.rows, + ~rows=M.meta.syntax.measured.rows, ~caret=(Piece.id(p), index), ~tiles, range, @@ -239,7 +239,7 @@ module Deco = (M: { Measured.find_p( ~msg="Deco.targets", p, - M.meta.projected.measured, + M.meta.syntax.measured, ); Measured.{origin: m.origin, last: m.origin}; | (Some(p), _) => @@ -247,7 +247,7 @@ module Deco = (M: { Measured.find_p( ~msg="Deco.targets", p, - M.meta.projected.measured, + M.meta.syntax.measured, ); Measured.{origin: m.last, last: m.last}; }; @@ -278,7 +278,7 @@ module Deco = (M: { let backpack = (z: Zipper.t): Node.t => BackpackView.view( ~font_metrics, - ~origin=Zipper.caret_point(M.meta.projected.measured, z), + ~origin=Zipper.caret_point(M.meta.syntax.measured, z), z, ); @@ -291,23 +291,22 @@ module Deco = (M: { let term_decoration = (~id: Id.t, deco: ((Point.t, Point.t, SvgUtil.Path.t)) => Node.t) => { - let (p_l, p_r) = TermRanges.find(id, M.meta.projected.term_ranges); + let (p_l, p_r) = TermRanges.find(id, M.meta.syntax.term_ranges); let l = - Measured.find_p(~msg="Deco.term", p_l, M.meta.projected.measured). - origin; + Measured.find_p(~msg="Deco.term", p_l, M.meta.syntax.measured).origin; let r = - Measured.find_p(~msg="Deco.term", p_r, M.meta.projected.measured).last; + Measured.find_p(~msg="Deco.term", p_r, M.meta.syntax.measured).last; open SvgUtil.Path; let r_edge = ListUtil.range(~lo=l.row, r.row + 1) |> List.concat_map(i => { - let row = Measured.Rows.find(i, M.meta.projected.measured.rows); + let row = Measured.Rows.find(i, M.meta.syntax.measured.rows); [h(~x=i == r.row ? r.col : row.max_col), v_(~dy=1)]; }); let l_edge = ListUtil.range(~lo=l.row, r.row + 1) |> List.rev_map(i => { - let row = Measured.Rows.find(i, M.meta.projected.measured.rows); + let row = Measured.Rows.find(i, M.meta.syntax.measured.rows); [h(~x=i == l.row ? l.col : row.indent), v_(~dy=-1)]; }) |> List.concat; @@ -359,7 +358,7 @@ module Deco = (M: { let errors_of_tile = (id: Id.t) => { //TODO(andrew): needs projectors update; err holes on projs crash let tiles = - Id.Map.find(id, M.meta.projected.terms) + Id.Map.find(id, M.meta.syntax.terms) |> Term.ids |> List.map(id => { let t = tile(id); @@ -369,7 +368,7 @@ module Deco = (M: { Measured.find_shards( ~msg="Deco.errors_of_tile", t, - M.meta.projected.measured, + M.meta.syntax.measured, ), ); }); @@ -403,7 +402,7 @@ module Deco = (M: { indication(z), selection(z), backpack(z), - backpack_targets(z.backpack, M.meta.projected.segment), + backpack_targets(z.backpack, M.meta.syntax.segment), errors(), ]; }; diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 9af1a9de8f..21b4d9ee15 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -1,7 +1,7 @@ open Haz3lcore; open Virtual_dom.Vdom; open Node; -open ProjNew; +open ProjectorBase; open Projector; open Util; open Util.OptUtil.Syntax; @@ -103,7 +103,7 @@ let view_wrapper = }; /* Dispatches projector external actions to editor-level actions */ -let handle = (id, action: ProjNew.external_action): Action.project => +let handle = (id, action: external_action): Action.project => switch (action) { | Remove => Remove(id) | Escape(d) => Escape(id, d) @@ -123,11 +123,11 @@ let setup_view = ~indication: option(Direction.t), ) : option(Node.t) => { - let* p = Id.Map.find_opt(id, meta.projected.projectors); + let* p = Id.Map.find_opt(id, meta.syntax.projectors); let* syntax = Some(p.syntax); let ci = Id.Map.find_opt(id, meta.statics.info_map); - let info = ProjNew.{id, ci, syntax}; - let+ measurement = Measured.find_pr_opt(p, meta.projected.measured); + let info = {id, ci, syntax}; + let+ measurement = Measured.find_pr_opt(p, meta.syntax.measured); let (module P) = to_module(p.kind); let parent = a => inject(PerformAction(Project(handle(id, a)))); let local = a => @@ -165,7 +165,7 @@ let all = (z, ~meta: Editor.Meta.t, ~inject, ~font_metrics) => { let indication = indication(z, id); setup_view(id, ~meta, ~inject, ~font_metrics, ~indication); }, - Id.Map.bindings(meta.projected.projectors) |> List.rev, + Id.Map.bindings(meta.syntax.projectors) |> List.rev, ), ); }; From 210204bbed729ad47dc3b63705f9b9dbf860e05f Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 02:05:34 -0400 Subject: [PATCH 136/168] fixed error hole bug, id replacement bug --- src/haz3lcore/Measured.re | 37 +++-------- src/haz3lcore/tiles/Piece.re | 2 +- src/haz3lcore/tiles/Segment.re | 2 +- src/haz3lcore/tiles/Skel.re | 2 +- src/haz3lcore/zipper/Editor.re | 33 +++++----- src/haz3lcore/zipper/Printer.re | 13 ++-- src/haz3lcore/zipper/Projector.re | 16 ++--- src/haz3lcore/zipper/ProjectorBase.re | 11 ++-- src/haz3lcore/zipper/Zipper.re | 2 - .../zipper/action/ProjectorPerform.re | 9 ++- src/haz3lschool/Gradescope.re | 5 +- src/haz3lweb/view/BackpackView.re | 52 +++++++++++++--- src/haz3lweb/view/Code.re | 41 ++++++++----- src/haz3lweb/view/Deco.re | 61 +++++++++---------- src/haz3lweb/view/ExplainThis.re | 3 +- src/haz3lweb/view/dec/PieceDec.re | 3 +- 16 files changed, 161 insertions(+), 131 deletions(-) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 76a5b3754d..fe936ef22e 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -282,7 +282,14 @@ let last_of_token = (token: string, origin: Point.t): Point.t => row: origin.row + StringUtil.num_linebreaks(token), }; -let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { +let of_segment = + ( + ~old: t=empty, + ~touched=Touched.empty, + seg: Segment.t, + info_map: Statics.Map.t, + ) + : t => { let is_indented = is_indented_map(seg); // recursive across seg's bidelimited containers @@ -380,7 +387,8 @@ let of_segment = (~old: t=empty, ~touched=Touched.empty, seg: Segment.t): t => { let map = map |> add_g(g, {origin, last}); (contained_indent, last, map); | Projector(p) => - let token = Projector.placeholder_str(p); + let token = + Projector.placeholder(p, Id.Map.find_opt(p.id, info_map)); let last = last_of_token(token, origin); let map = extra_rows(token, origin, map); let map = add_pr(p, {origin, last}, map); @@ -454,28 +462,3 @@ let length = (seg: Segment.t, map: t): int => let last = find_p(ListUtil.last(tl), map); last.last.col - first.origin.col; }; - -let segment_origin = (seg: Segment.t): option(Point.t) => - Option.map( - first => find_p(first, of_segment(seg)).origin, - ListUtil.hd_opt(seg), - ); - -let segment_last = (seg: Segment.t): option(Point.t) => - Option.map( - last => find_p(last, of_segment(seg)).last, - ListUtil.last_opt(seg), - ); - -let segment_height = (seg: Segment.t) => - switch (segment_last(seg), segment_origin(seg)) { - | (Some(last), Some(first)) => 1 + last.row - first.row - | _ => 0 - }; - -let segment_width = (seg: Segment.t): int => - IntMap.fold( - (_, {max_col, _}: Rows.shape, acc) => max(max_col, acc), - of_segment(seg).rows, - 0, - ); diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 3183b4cc22..240fdb852a 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -151,7 +151,7 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Tile(t) => t.mold | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) - | Projector(p) => ProjectorBase.mold_of(p.kind, Any) + | Projector(_) => ProjectorBase.mold_of(Any) }; let replace_id = (id: Id.t, p: t): t => diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 6847772a6a..cfdf1c8757 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -74,7 +74,7 @@ let shape_affix = (([[w, ...ws], ...wss], gs), s, tl); | Grout(g) => (Aba.cons([], g, wgw), s, tl) | Projector(p) => - //TODO(andrew): ??? + //TODO(andrew): ??? ask d let (l, _) = ProjectorBase.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); (empty_wgw, l, tl); diff --git a/src/haz3lcore/tiles/Skel.re b/src/haz3lcore/tiles/Skel.re index 9d7223e91a..c2482202f7 100644 --- a/src/haz3lcore/tiles/Skel.re +++ b/src/haz3lcore/tiles/Skel.re @@ -78,7 +78,7 @@ let rel = (p1: Piece.t, p2: Piece.t): option(rel) => | Convex => Some(Lt) | Concave => Some(Gt) } - //TODO(andrew):??? + //TODO(andrew):??? ask d | (Projector(_), _) => None | (_, Projector(_)) => None | (Tile(t1), Tile(t2)) => diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 00fff6a4e5..4a4d6e5ca3 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -41,14 +41,14 @@ module CachedSyntax = { projectors: Id.Map.t(Base.projector), segment: Segment.t, measured: Measured.t, + tiles: TileMap.t, + holes: list(Grout.t), term: Term.UExp.t, term_ranges: TermRanges.t, terms: TermMap.t, - tiles: TileMap.t, - holes: list(Grout.t), }; - let init = (z): t => { + let init = (z, info_map): t => { let segment = Zipper.unselect_and_zip(z); //TODO(andrew): avoid remove_all let (term, terms) = @@ -63,13 +63,13 @@ module CachedSyntax = { term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), - measured: Measured.of_segment(segment), + measured: Measured.of_segment(segment, info_map), }; }; - let update = (z, ~touched, ~old): t => { + let update = (z, info_map, ~touched, ~old): t => { let segment = Zipper.unselect_and_zip(z); - let measured = Measured.of_segment(~touched, ~old, segment); + let measured = Measured.of_segment(~touched, ~old, segment, info_map); //TODO(andrew): remove/consolidate remove_all and syntaxMap let (term, terms) = MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); @@ -86,8 +86,9 @@ module CachedSyntax = { }; }; - let next = (a: Action.t, z: Zipper.t, old: t, ~touched) => - Action.is_edit(a) ? update(z, ~touched, ~old=old.measured) : old; + let next = (a: Action.t, z: Zipper.t, info_map, old: t, ~touched) => + Action.is_edit(a) + ? update(z, info_map, ~touched, ~old=old.measured) : old; }; module Meta = { @@ -100,11 +101,14 @@ module Meta = { }; let init = (~settings: CoreSettings.t, z: Zipper.t) => { - col_target: 0, - touched: Touched.empty, - selection_ids: Selection.selection_ids(z.selection), - statics: CachedStatics.mk(~settings, z), - syntax: CachedSyntax.init(z), + let statics = CachedStatics.mk(~settings, z); + { + col_target: 0, + touched: Touched.empty, + selection_ids: Selection.selection_ids(z.selection), + statics, + syntax: CachedSyntax.init(z, statics.info_map), + }; }; module type S = { @@ -140,7 +144,8 @@ module Meta = { print_endline("Editor.next. Action:" ++ Action.show(a)); // Effects disabled below; if nothing breaks due to this then rip them out let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); - let syntax = CachedSyntax.next(~touched, a, z, meta.syntax); + let syntax = + CachedSyntax.next(~touched, a, z, meta.statics.info_map, meta.syntax); let statics = CachedStatics.next(~settings, a, z, meta.statics); let col_target = switch (a) { diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index f3e9ebe324..187c7ffce9 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -61,12 +61,13 @@ let to_rows = }; }; -let pretty_print = - (~holes: option(string)=Some(""), ~measured: Measured.t, z: Zipper.t) - : string => +let measured = z => + z |> Zipper.seg_without_buffer |> Measured.of_segment(_, Id.Map.empty); + +let pretty_print = (~holes: option(string)=Some(""), z: Zipper.t): string => to_rows( ~holes, - ~measured, + ~measured=measured(z), ~caret=None, ~indent=" ", ~segment=seg_of_zip(z), @@ -77,7 +78,7 @@ let zipper_to_string = (~holes: option(string)=Some(""), z: Zipper.t): string => to_rows( ~holes, - ~measured=Zipper.measured(z), + ~measured=measured(z), ~caret=None, ~indent="", ~segment=seg_of_zip(z), @@ -90,7 +91,7 @@ let to_string_editor = let to_string_selection = (editor: Editor.t): string => to_rows( - ~measured=Zipper.measured(editor.state.zipper), + ~measured=measured(editor.state.zipper), ~caret=None, ~indent=" ", ~holes=None, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index caf1e342bc..4cd09c5e32 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -27,9 +27,9 @@ let shape = (p: Base.projector, info: info): shape => { * in the zipper; a tile consisting of any number of whitespaces * is considered a placeholder. This could be made more principled. * Note that a placeholder retains the UUID of the underlying. */ -let placeholder_str = ({id, syntax, _} as p: Base.projector): string => +let placeholder = (p: Base.projector, ci: option(Info.t)): string => //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess - switch (shape(p, {id, syntax, ci: None})) { + switch (shape(p, {id: p.id, syntax: p.syntax, ci})) { | Inline(width) => String.make(width, ' ') | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') }; @@ -162,7 +162,7 @@ module Update = { z |> ZipperBase.put_siblings(sibs); }; - let eff_update = + let fast_update = (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => /* This applies the function to the piece in the zipper having id id, and * then replaces the id of the resulting piece with the idea of the old @@ -223,7 +223,6 @@ module Update = { }; let remove_projector = (id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { | Projector(pr) when pr.id == id => pr.syntax | x => x @@ -232,15 +231,16 @@ module Update = { let update = (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) : ZipperBase.t => - eff_update(update_piece(f, id), id, z); + fast_update(update_piece(f, id), id, z); let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(add_projector(k, id), id, z); + fast_update(add_projector(k, id), id, z); + let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(add_or_remove_projector(k, id), id, z); + fast_update(add_or_remove_projector(k, id), id, z); let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => - eff_update(remove_projector(id), id, z); + fast_update(remove_projector(id), id, z); let remove_all_projectors = (syntax: syntax) => //TODO(andrew): avoid the need to remove all diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 2280097b07..69aeea64c9 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -4,16 +4,15 @@ open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] type t = Base.kind; -//TODO(andrew): docs +/* Projectors are currently all convex */ let shapes = _ => Nib.Shape.(Convex, Convex); -//TODO(andrew): cleanup, docs -let mold_of: (t, Sort.t) => Mold.t = - (p, sort) => { - let (l, r) = shapes(p); +/* Projectors are currentlt all convex and any-sorted */ +let mold_of: Sort.t => Mold.t = + sort => { { nibs: { - ({shape: l, sort}, {shape: r, sort}); + ({shape: Convex, sort}, {shape: Convex, sort}); }, out: sort, in_: [], diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index aa15a0cacd..adf12190d1 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -291,8 +291,6 @@ let caret_direction = (z: t): option(Direction.t) => } }; -let measured = z => z |> unselect_and_zip |> Measured.of_segment; - let base_point = (measured: Measured.t, z: t): Point.t => { switch (representative_piece(z)) { | Some((p, d)) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 48110ebb1f..54dc20d2cb 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -56,7 +56,14 @@ let go = } | Remove(id) => Ok(Projector.Update.remove(id, z)) | SetSyntax(id, syntax) => - Ok(Projector.Update.update(p => {...p, syntax}, id, z)) + /* Note we update piece id to keep in sync with projector id */ + Ok( + Projector.Update.update( + p => {...p, syntax: Piece.replace_id(id, syntax)}, + id, + z, + ), + ) | SetModel(id, model) => Ok(Projector.Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => diff --git a/src/haz3lschool/Gradescope.re b/src/haz3lschool/Gradescope.re index ac9461cc6a..da8e7afba7 100644 --- a/src/haz3lschool/Gradescope.re +++ b/src/haz3lschool/Gradescope.re @@ -62,10 +62,7 @@ module Main = { }; let gen_grading_report = exercise => { let zipper_pp = zipper => { - Printer.pretty_print( - ~measured=Measured.of_segment(Zipper.seg_without_buffer(zipper)), - zipper, - ); + Printer.pretty_print(zipper); }; let model_results = spliced_elabs(settings, exercise) diff --git a/src/haz3lweb/view/BackpackView.re b/src/haz3lweb/view/BackpackView.re index c0400d9cd0..d422458d7d 100644 --- a/src/haz3lweb/view/BackpackView.re +++ b/src/haz3lweb/view/BackpackView.re @@ -1,6 +1,45 @@ open Virtual_dom.Vdom; open Node; open Haz3lcore; +open Util; + +/* Assume this doesn't contain projectors */ +let measured_of = seg => Measured.of_segment(seg, Id.Map.empty); + +let text_view = (seg: Segment.t): list(Node.t) => { + module Text = + Code.Text({ + let map = measured_of(seg); + let settings = Init.startup.settings; + let info_map = Id.Map.empty; /* Assume this doesn't contain projectors */ + }); + Text.of_segment([], true, Any, seg); +}; + +let segment_origin = (seg: Segment.t): option(Point.t) => + Option.map( + first => Measured.find_p(first, measured_of(seg)).origin, + ListUtil.hd_opt(seg), + ); + +let segment_last = (seg: Segment.t): option(Point.t) => + Option.map( + last => Measured.find_p(last, measured_of(seg)).last, + ListUtil.last_opt(seg), + ); + +let segment_height = (seg: Segment.t) => + switch (segment_last(seg), segment_origin(seg)) { + | (Some(last), Some(first)) => 1 + last.row - first.row + | _ => 0 + }; + +let segment_width = (seg: Segment.t): int => + IntMap.fold( + (_, {max_col, _}: Measured.Rows.shape, acc) => max(max_col, acc), + measured_of(seg).rows, + 0, + ); let backpack_sel_view = ( @@ -10,11 +49,6 @@ let backpack_sel_view = opacity: float, {focus: _, content, _}: Selection.t, ) => { - module Text = - Code.Text({ - let map = Measured.of_segment(content); - let settings = Init.startup.settings; - }); // TODO(andrew): Maybe use init sort at caret to prime this div( ~attrs=[ @@ -31,7 +65,7 @@ let backpack_sel_view = ), ], // zwsp necessary for containing box to stretch to contain trailing newline - Text.of_segment([], true, Any, content) @ [text(Unicode.zwsp)], + text_view(content) @ [text(Unicode.zwsp)], ); }; @@ -46,7 +80,7 @@ let view = let height_head = switch (backpack) { | [] => 0 - | [hd, ..._] => Measured.segment_height(hd.content) + | [hd, ..._] => segment_height(hd.content) }; let can_put_down = switch (Zipper.pop_backpack(z)) { @@ -90,7 +124,7 @@ let view = let (_, _, _, selections) = List.fold_left( ((idx, y_offset, opacity, vs), s: Selection.t) => { - let base_height = Measured.segment_height(s.content); + let base_height = segment_height(s.content); let scale = scale_fn(idx); let x_offset = x_fn(idx); let new_y_offset = y_offset -. dy_fn(idx, base_height); @@ -114,7 +148,7 @@ let view = let length = switch (backpack) { | [] => 0 - | [hd, ..._] => Measured.segment_width(hd.content) + | [hd, ..._] => segment_width(hd.content) }; let joiner_style = diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index bf9548cdd1..2f5278e6b2 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -69,10 +69,25 @@ let of_secondary = } ); -module Text = (M: { - let map: Measured.t; - let settings: Settings.t; - }) => { +let of_projector = (p, expected_sort, indent, info_map) => + of_delim'(( + [Projector.placeholder(p, Id.Map.find_opt(p.id, info_map))], + false, + expected_sort, + true, + true, + indent, + 0, + )); + +module Text = + ( + M: { + let map: Measured.t; + let settings: Settings.t; + let info_map: Statics.Map.t; + }, + ) => { let m = p => Measured.find_p(~msg="Text", p, M.map); let rec of_segment = (buffer_ids, no_sorts, sort, seg: Segment.t): list(Node.t) => { @@ -101,15 +116,7 @@ module Text = (M: { | Secondary({content, _}) => of_secondary((content, M.settings.secondary_icons, m(p).last.col)) | Projector(p) => - of_delim'(( - [Projector.placeholder_str(p)], - false, - expected_sort, //TODO(andrew): ?? - true, //TODO(andrew): ?? - true, - m(Projector(p)).origin.col, - 0, - )) + of_projector(p, expected_sort, m(Projector(p)).origin.col, M.info_map) }; } and of_tile = (buffer_ids, expected_sort: Sort.t, t: Tile.t): list(Node.t) => { @@ -151,12 +158,13 @@ let rec holes = ], ); -let simple_view = - (~font_metrics, ~segment, ~map, ~settings: Settings.t): Node.t => { +let simple_view = (~font_metrics, ~segment, ~settings: Settings.t): Node.t => { + let map = Measured.of_segment(segment, Id.Map.empty); module Text = Text({ let map = map; let settings = settings; + let info_map = Id.Map.empty; /* Assume this doesn't contain projectors */ }); let holes = holes(~map, ~font_metrics, segment); div( @@ -184,13 +192,14 @@ let view = ~font_metrics, ~settings: Settings.t, z: Zipper.t, - {syntax: {measured, segment, holes, _}, selection_ids, _}: Editor.Meta.t, + {syntax: {measured, segment, holes, _}, statics, selection_ids, _}: Editor.Meta.t, ) : Node.t => { module Text = Text({ let map = measured; let settings = settings; + let info_map = statics.info_map; }); let buffer_ids = Selection.is_buffer(z.selection) ? selection_ids : []; let code = Text.of_segment(buffer_ids, false, sort, segment); diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 1b082d6106..93ac4292b3 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -100,7 +100,8 @@ module Deco = (M: { failwith("TODO(andrew): Deco.sel_of_projector: missing measurement") | Some(m) => m }; - let token = Projector.placeholder_str(p); + let ci = Id.Map.find_opt(p.id, M.meta.statics.info_map); + let token = Projector.placeholder(p, ci); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] //TODO(andrew): decoration for selections @@ -355,37 +356,35 @@ module Deco = (M: { ); }; - let errors_of_tile = (id: Id.t) => { - //TODO(andrew): needs projectors update; err holes on projs crash - let tiles = - Id.Map.find(id, M.meta.syntax.terms) - |> Term.ids - |> List.map(id => { - let t = tile(id); - ( - id, - t.mold, - Measured.find_shards( - ~msg="Deco.errors_of_tile", - t, - M.meta.syntax.measured, - ), - ); - }); - div_c( - "errors-piece", - List.concat_map(PieceDec.simple_shards_errors(~font_metrics), tiles), - ); - }; + let error_view = (id: Id.t) => + switch (Id.Map.find_opt(id, M.meta.syntax.projectors)) { + | Some(p) => + /* Special case for projectors as they are not in tile map */ + let shapes = ProjectorBase.shapes(p); + let measurement = Id.Map.find(id, M.meta.syntax.measured.projectors); + div_c( + "errors-piece", + [PieceDec.simple_shard_error(~font_metrics, ~shapes, ~measurement)], + ); + | None => + let tiles = + Id.Map.find(id, M.meta.syntax.terms) + |> Term.ids + |> List.map(id => { + let t = tile(id); + let shards = + Measured.find_shards( + ~msg="Deco.errors_of_tile", + t, + M.meta.syntax.measured, + ); + PieceDec.simple_shards_errors(~font_metrics, t.mold, shards); + }); + div_c("errors-piece", List.flatten(tiles)); + }; - let errors = () => { - div_c( - "errors", - //List.concat_map(PieceDec.simple_shards_errors(~font_metrics), tiles), - //TODO(andrew): reinistate - [] //List.map(errors_of_tile, M.meta.statics.error_ids), - ); - }; + let errors = () => + div_c("errors", List.map(error_view, M.meta.statics.error_ids)); let indication = (z: Zipper.t) => switch (Projector.indicated(z)) { diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index abb72d59ef..d3e6734e03 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -259,9 +259,8 @@ let expander_deco = ], List.map( ((id: ExplainThisForm.form_id, segment: Segment.t)): Node.t => { - let map = Measured.of_segment(segment); let code_view = - Code.simple_view(~font_metrics, ~segment, ~map, ~settings); + Code.simple_view(~font_metrics, ~segment, ~settings); let classes = id == doc.id ? ["selected"] @ get_clss(segment) : get_clss(segment); diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index 0b0416b532..b9f98e4f8b 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -164,8 +164,7 @@ let simple_shard_error = ); }; -let simple_shards_errors = - (~font_metrics: FontMetrics.t, (_, mold, shards)): list(t) => +let simple_shards_errors = (~font_metrics: FontMetrics.t, mold, shards) => List.map( ((index, measurement)) => simple_shard_error( From 108b7fbed9a0220c63585900c064dd0364c9c1c4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 15:01:00 -0400 Subject: [PATCH 137/168] rm focus --- src/haz3lweb/Main.re | 1 - src/haz3lweb/Model.re | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index 030ce5cc8c..77e5fb29b7 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -37,7 +37,6 @@ let restart_caret_animation = () => }; let apply = (model: Model.t, action, state, ~schedule_action): Model.t => { - JsUtil.focus(~site="apply", model.ui_state.focus); restart_caret_animation(); if (UpdateAction.is_edit(action)) { last_edit_action := JsUtil.timestamp(); diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index 9c0f080650..30f88274b4 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -25,14 +25,12 @@ type ui_state = { font_metrics: FontMetrics.t, show_backpack_targets: bool, mousedown: bool, - focus: string, }; let ui_state_init = { font_metrics: FontMetrics.init, show_backpack_targets: false, mousedown: false, - focus: "code-container", }; type t = { From 31f900b9009bbdbe4ffc6fc4795add6cc1b7a0f5 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 16:20:48 -0400 Subject: [PATCH 138/168] fix completion bug --- src/haz3lcore/statics/MakeTerm.re | 13 ++++--------- src/haz3lcore/zipper/Editor.re | 22 ++++++---------------- src/haz3lcore/zipper/action/Action.re | 8 ++++---- src/haz3lcore/zipper/action/Perform.re | 26 +++++++++++++++----------- src/haz3lweb/UpdateAction.re | 2 +- 5 files changed, 30 insertions(+), 41 deletions(-) diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index 8f07b63596..35b695c7a5 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -527,20 +527,15 @@ let go = }, ); -let from_zip = (~dump_backpack: bool, ~erase_buffer: bool, z: Zipper.t) => { - let z = Projector.Update.remove_all(z); +let from_zip_for_sem = + (~dump_backpack: bool, ~erase_buffer: bool, z: Zipper.t) => { + let z = Projector.Update.remove_all(z); //TODO(andrew) let seg = Zipper.smart_seg(~dump_backpack, ~erase_buffer, z); go(seg); }; -let from_zip_for_view = - Core.Memo.general( - ~cache_size_bound=1000, - from_zip(~dump_backpack=false, ~erase_buffer=true), - ); - let from_zip_for_sem = Core.Memo.general( ~cache_size_bound=1000, - from_zip(~dump_backpack=true, ~erase_buffer=true), + from_zip_for_sem(~dump_backpack=true, ~erase_buffer=true), ); diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 4a4d6e5ca3..e19e3044f6 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -50,26 +50,24 @@ module CachedSyntax = { let init = (z, info_map): t => { let segment = Zipper.unselect_and_zip(z); - //TODO(andrew): avoid remove_all + //TODO(andrew): remove/consolidate remove_all and syntaxMap let (term, terms) = MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); - //TODO(andrew): consolidate with remove_all? let projectors = Projector.SyntaxMap.go(z); { projectors, segment, - term, - terms, term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), measured: Measured.of_segment(segment, info_map), + term, + terms, }; }; let update = (z, info_map, ~touched, ~old): t => { let segment = Zipper.unselect_and_zip(z); - let measured = Measured.of_segment(~touched, ~old, segment, info_map); //TODO(andrew): remove/consolidate remove_all and syntaxMap let (term, terms) = MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); @@ -77,12 +75,12 @@ module CachedSyntax = { { projectors, segment, - term, - terms, - measured, term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), + measured: Measured.of_segment(~touched, ~old, segment, info_map), + term, + terms, }; }; @@ -216,14 +214,6 @@ let init = (~read_only=false, z, ~settings: CoreSettings.t) => { read_only, }; -let update_z = (f: Zipper.t => Zipper.t, ed: t) => { - ...ed, - state: { - ...ed.state, - zipper: f(ed.state.zipper), - }, -}; - let new_state = ( ~effects: list(Effect.t)=[], diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index 5334a23774..afaac465b8 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -64,6 +64,7 @@ type agent = [@deriving (show({with_path: false}), sexp, yojson)] type buffer = | Set(agent) + | Clear | Accept; [@deriving (show({with_path: false}), sexp, yojson)] @@ -108,15 +109,14 @@ let is_edit: t => bool = fun | Project(Focus(_) | Escape(_)) => false | Project(_) => true //TODO(andrew): revisit - | Buffer(Accept) | Paste(_) | Cut | Reparse | Insert(_) | Destruct(_) | Pick_up - | Put_down => true - | Buffer(Set(_)) + | Put_down + | Buffer(Accept | Clear | Set(_)) => true | Copy | Move(_) | Jump(_) @@ -128,7 +128,7 @@ let is_edit: t => bool = /* Determines whether undo/redo skips action */ let is_historic: t => bool = fun - | Buffer(Set(_)) + | Buffer(Set(_) | Clear) | Copy | Move(_) | Jump(_) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 5eb2a3678d..42aed21094 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -9,7 +9,7 @@ let is_write_action = (a: Action.t) => { | Unselect(_) | Jump(_) | Select(_) => false - | Buffer(Set(_) | Accept) + | Buffer(Set(_) | Accept | Clear) | Cut | Paste(_) | Reparse @@ -127,6 +127,7 @@ let go_z = | None => Error(CantAccept) | Some(z) => Ok(z) } + | Buffer(Clear) => Ok(buffer_clear(z)) | Project(a) => ProjectorPerform.go(Move.jump_to_id, Move.primary, a, z) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) @@ -278,19 +279,22 @@ let go = Ok(ed); } else if (settings.assist && settings.statics) { open Result.Syntax; - let ed = a == Buffer(Accept) ? ed : Editor.update_z(buffer_clear, ed); + let ed = + a == Buffer(Accept) + ? ed + : ( + switch (go_history(~settings, Buffer(Clear), ed)) { + | Ok(ed) => ed + | Error(_) => ed + } + ); let* ed = go_history(~settings, a, ed); Action.is_edit(a) ? { - //TODO(andrew): fix completion bug - // let _ = - // switch (go_history(~settings, Buffer(Set(TyDi)), ed)) { - // | Error(err) => Error(err) - // | Ok(ed) => Ok(ed) - // }; - Ok( - Editor.update_z(set_buffer(ed.state.meta.statics.info_map), ed), - ); + switch (go_history(~settings, Buffer(Set(TyDi)), ed)) { + | Error(err) => Error(err) + | Ok(ed) => Ok(ed) + }; } : Ok(ed); } else { diff --git a/src/haz3lweb/UpdateAction.re b/src/haz3lweb/UpdateAction.re index 0aa026ad32..264d828633 100644 --- a/src/haz3lweb/UpdateAction.re +++ b/src/haz3lweb/UpdateAction.re @@ -237,7 +237,7 @@ let should_scroll_to_caret = | Put_down | RotateBackpack | MoveToBackpackTarget(_) - | Buffer(Set(_) | Accept) + | Buffer(Set(_) | Accept | Clear) | Paste(_) | Copy | Cut From 1cd22eba5ebeba8eff99f8173d279991b1daa0c6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 18:45:04 -0400 Subject: [PATCH 139/168] debtably fixed crash in exercises mode --- src/haz3lcore/dune | 4 +++- src/haz3lcore/prog/CachedStatics.re | 35 ----------------------------- src/haz3lcore/zipper/Projector.re | 4 ---- src/haz3lweb/dune | 4 +++- src/haz3lweb/view/Deco.re | 9 +++++++- src/haz3lweb/view/ExerciseMode.re | 24 ++++++++++---------- src/util/dune | 4 +++- 7 files changed, 29 insertions(+), 55 deletions(-) delete mode 100644 src/haz3lcore/prog/CachedStatics.re diff --git a/src/haz3lcore/dune b/src/haz3lcore/dune index 3ed6d6a078..0cd61c2c77 100644 --- a/src/haz3lcore/dune +++ b/src/haz3lcore/dune @@ -15,7 +15,9 @@ ppx_deriving.show))) (rule - (write-file js-of-ocaml-flags-dev "(:standard --debuginfo --noinline)")) + (write-file + js-of-ocaml-flags-dev + "(:standard --debug-info --no-inline --pretty --source-map)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) diff --git a/src/haz3lcore/prog/CachedStatics.re b/src/haz3lcore/prog/CachedStatics.re deleted file mode 100644 index f918dc73e5..0000000000 --- a/src/haz3lcore/prog/CachedStatics.re +++ /dev/null @@ -1,35 +0,0 @@ -open Util; - -[@deriving (show({with_path: false}), sexp, yojson)] -type statics = { - term: Term.UExp.t, - info_map: Statics.Map.t, - error_ids: list(Id.t), -}; - -let empty_statics: statics = { - term: Term.UExp.{ids: [Id.invalid], term: Triv}, - info_map: Id.Map.empty, - error_ids: [], -}; - -module Key = { - include String; - [@deriving (show({with_path: false}), sexp, yojson)] - type t = string; -}; - -module M = Util.MapUtil.Make(Key); -include M; - -[@deriving (show({with_path: false}), sexp, yojson)] -type t = M.t(statics); - -let mk = (ds: list((Key.t, statics))): t => - ds |> List.to_seq |> of_seq |> map(Fun.id); - -let lookup = (results: t, key: Key.t) => - switch (find_opt(key, results)) { - | None => empty_statics - | Some(statics) => statics - }; diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 4cd09c5e32..fbfda0025a 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -171,13 +171,10 @@ module Update = { * be O(1) when the piece is directly to the left or right of the cursor, * otherwise it is O(|zipper|) */ if (left_sib_has_id(z, id)) { - print_endline("Projector.Update.update: left_sib_has_id"); update_left_sib(f, z); } else if (right_sib_has_id(z, id)) { - print_endline("Projector.Update.update: right_sib_has_id"); update_right_sib(f, z); } else { - print_endline("Projector.Update.update: MapPiece.go"); MapPiece.go(f, z); }; @@ -243,7 +240,6 @@ module Update = { fast_update(remove_projector(id), id, z); let remove_all_projectors = (syntax: syntax) => - //TODO(andrew): avoid the need to remove all switch (syntax) { | Projector(pr) => pr.syntax | x => x diff --git a/src/haz3lweb/dune b/src/haz3lweb/dune index 1dccf62b8d..c88e1c2c27 100644 --- a/src/haz3lweb/dune +++ b/src/haz3lweb/dune @@ -92,7 +92,9 @@ (flags (:standard))))) (rule - (write-file js-of-ocaml-flags-dev "(:standard --debuginfo --noinline)")) + (write-file + js-of-ocaml-flags-dev + "(:standard --debug-info --no-inline --pretty --source-map)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 93ac4292b3..db44591fde 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -384,7 +384,14 @@ module Deco = (M: { }; let errors = () => - div_c("errors", List.map(error_view, M.meta.statics.error_ids)); + div_c( + "errors", + try(List.map(error_view, M.meta.statics.error_ids)) { + | Not_found => + print_endline("WARNING: Deco.errors: Not_found"); + []; + }, + ); let indication = (z: Zipper.t) => switch (Projector.indicated(z)) { diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 281f51d630..3594bbb457 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -26,6 +26,7 @@ let view = ~stitched_dynamics, ~highlights, ) => { + print_endline("AAA"); let Exercise.{eds, pos} = exercise; // let stitched_dynamics = // Exercise.stitch_dynamic( @@ -43,11 +44,11 @@ let view = hidden_tests: _, }: Exercise.stitched(Exercise.DynamicsItem.t) = stitched_dynamics; - + print_endline("DDD"); let grading_report = Grading.GradingReport.mk(eds, ~stitched_dynamics); - + print_endline("EEE"); let score_view = Grading.GradingReport.view_overall_score(grading_report); - + print_endline("FFF"); let editor_view = ( ~editor: Editor.t, @@ -72,14 +73,14 @@ let view = editor, ); }; - + print_endline("GGG"); let title_view = Cell.title_cell(eds.title); let prompt_view = Cell.narrative_cell( div(~attrs=[Attr.class_("cell-prompt")], [eds.prompt]), ); - + print_endline("HHH"); let prelude_view = Always( editor_view( @@ -101,7 +102,7 @@ let view = ~di=instructor, ), ); - + print_endline("III"); // determine trailing hole // TODO: module let correct_impl_ctx_view = @@ -148,7 +149,7 @@ let view = ]); }, ); - + print_endline("JJJ"); let your_tests_view = Always( editor_view( @@ -166,7 +167,7 @@ let view = ], ), ); - + print_endline("KKK"); let wrong_impl_views = List.mapi( (i, (Exercise.{impl, _}, di)) => { @@ -182,7 +183,7 @@ let view = }, List.combine(eds.hidden_bugs, hidden_bugs), ); - + print_endline("LLL"); let mutation_testing_view = Always( Grading.MutationTestingReport.view( @@ -191,7 +192,7 @@ let view = grading_report.point_distribution.mutation_testing, ), ); - + print_endline("MMM"); let your_impl_view = { Always( editor_view( @@ -211,7 +212,6 @@ let view = ), ); }; - let syntax_grading_view = Always(Grading.SyntaxReport.view(grading_report.syntax_report)); @@ -253,7 +253,7 @@ let view = ~max_points=grading_report.point_distribution.impl_grading, ), ); - + print_endline("CCC"); [score_view, title_view, prompt_view] @ render_cells( settings, diff --git a/src/util/dune b/src/util/dune index 683dd0aa7c..b5faa5838a 100644 --- a/src/util/dune +++ b/src/util/dune @@ -8,7 +8,9 @@ (pps ppx_let ppx_sexp_conv ppx_deriving.show ppx_yojson_conv))) (rule - (write-file js-of-ocaml-flags-dev "(:standard)")) + (write-file + js-of-ocaml-flags-dev + "(:standard --debug-info --no-inline --pretty --source-map)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) From 0172e27fbe5cc7dfdacff24a6a963d6bd9439fe0 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 23:01:54 -0400 Subject: [PATCH 140/168] fix can't jump to checkbox with not operator in front bug --- src/haz3lcore/zipper/action/Move.re | 49 +++++++++++++++++++ src/haz3lcore/zipper/action/Perform.re | 8 ++- .../zipper/action/ProjectorPerform.re | 37 ++++---------- 3 files changed, 65 insertions(+), 29 deletions(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 9cc511c290..607fe7deba 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -232,6 +232,14 @@ module Make = (M: Editor.Meta.S) => { | Some(z) => Some(z) }; + /* Jump to id moves the caret to the leftmost edge of + * the piece with the target id. Note that this may not + * mean that the piece at that id will be considered + * indicate from the point of view of the code decorations + * and cursor info display, since for example in the + * expression with (caret "|") "true && !|flag", the + * caret is at the leftmost edge of flag, but the not + * operator ("!") is indicated */ let jump_to_id = (z: t, id: Id.t): option(t) => { let* {origin, _} = Measured.find_by_id(id, M.measured); let z = @@ -245,6 +253,47 @@ module Make = (M: Editor.Meta.S) => { }; }; + let jump_to_side_of_id = (d: Direction.t, z, id) => { + let z = + switch (jump_to_id(z, id)) { + | Some(z) => z /* Move to left of id */ + | None => z + }; + switch (d) { + | Left => z + | Right => + switch (primary(ByToken, Right, z)) { + | Some(z) => z + | None => z + } + }; + }; + + /* Same as jump to id, but if the end position doesn't + * indicate the target id, move one token to the right. + * This is an approximate solution (that I believe works + * for all current cases) */ + let jump_to_id_indicated = (z: t, id: Id.t): option(t) => { + let* {origin, _} = Measured.find_by_id(id, M.measured); + let z = + switch (to_start(z)) { + | None => z + | Some(z) => z + }; + switch (do_towards(primary(ByChar), origin, z)) { + | None => Some(z) + | Some(z) => + switch (Indicated.index(z)) { + | Some(indicated_id) when id == indicated_id => Some(z) + | _ => + switch (primary(ByToken, Right, z)) { + | Some(z) => Some(z) + | None => Some(z) + } + } + }; + }; + let vertical = (d: Direction.t, z: t): option(t) => z.selection.content == [] ? do_vertical(primary(ByChar), d, z) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 42aed21094..4de0d813f3 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -128,7 +128,13 @@ let go_z = | Some(z) => Ok(z) } | Buffer(Clear) => Ok(buffer_clear(z)) - | Project(a) => ProjectorPerform.go(Move.jump_to_id, Move.primary, a, z) + | Project(a) => + ProjectorPerform.go( + Move.jump_to_id_indicated, + Move.jump_to_side_of_id, + a, + z, + ) | Move(d) => Move.go(d, z) |> Result.of_option(~error=Action.Failure.Cant_move) | Jump(jump_target) => diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index 54dc20d2cb..bb0ebb0b52 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -14,27 +14,8 @@ let move_out_of_piece = }; let go = - ( - jump_to_id, - primary: - (Zipper.chunkiness, Util.Direction.t, Zipper.t) => option(Zipper.t), - a: Action.project, - z: Zipper.t, - ) + (jump_to_id_indicated, jump_to_side_of_id, a: Action.project, z: Zipper.t) : result(ZipperBase.t, Action.Failure.t) => { - let switch_side = z => - switch (primary(ByToken, Right, z)) { - | Some(z) => z - | None => z - }; - let jump = (z, id) => - switch (jump_to_id(z, id)) { - /* Moves to right side, as right side always implies it's indicated. - * For example,"(|x)" or "!|x" wouldn't have "x" indicated */ - //TODO(andrew): just making this change breaks escape - | Some(z) => z //switch_side(z) - | None => z - }; switch (a) { | SetIndicated(p) => switch (Indicated.for_index(z)) { @@ -67,8 +48,13 @@ let go = | SetModel(id, model) => Ok(Projector.Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => - //TODO(andrew): this fails if moving to e.g. "![checkbox]" - let z = jump(z, id); + let z = + switch (d) { + | None => + /* d==None means a mouse click */ + jump_to_id_indicated(z, id) |> Option.value(~default=z) + | Some(_) => z + }; switch (Projector.indicated(z)) { | Some((_, p)) => let (module P) = to_module(p.kind); @@ -76,11 +62,6 @@ let go = Ok(z); | None => Error(Cant_project) }; - | Escape(id, d) => - let z = jump(z, id); - switch (d) { - | Left => Ok(z) - | Right => Ok(switch_side(z)) - }; + | Escape(id, d) => Ok(jump_to_side_of_id(d, z, id)) }; }; From de639131d5a4565debeb4a194db90921f508fb1e Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 23:05:19 -0400 Subject: [PATCH 141/168] fixed completion in exercises mode --- src/haz3lweb/Editors.re | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 054ae22b89..54b643bcc8 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -53,7 +53,7 @@ let perform_action = | Exercises(_) => /* If we're in exercises mode, statics is calculated externally, * so we set it to off here to disable internal calculation*/ - CoreSettings.off + CoreSettings.on | _ => settings }; switch (Perform.go(~settings, a, get_editor(editors))) { From 473ecdf1aa5ba98c41e819793634bdd153d707c8 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 25 Jul 2024 23:30:48 -0400 Subject: [PATCH 142/168] move JsUtil to Util. move TextArea to Util.Web --- src/haz3lcore/JsUtil.re | 278 ------------------------------ src/haz3lweb/Benchmark.re | 2 +- src/haz3lweb/Log.re | 1 - src/haz3lweb/LogEntry.re | 1 - src/haz3lweb/Main.re | 1 + src/haz3lweb/Update.re | 1 + src/haz3lweb/view/Cell.re | 1 + src/haz3lweb/view/DebugMode.re | 2 +- src/haz3lweb/view/ExerciseMode.re | 1 + src/haz3lweb/view/NutMenu.re | 1 + src/haz3lweb/view/Page.re | 1 + src/haz3lweb/view/ScratchMode.re | 1 + src/util/Util.re | 1 + src/util/Web.re | 103 +++++++++++ src/util/dune | 9 +- 15 files changed, 120 insertions(+), 284 deletions(-) delete mode 100644 src/haz3lcore/JsUtil.re diff --git a/src/haz3lcore/JsUtil.re b/src/haz3lcore/JsUtil.re deleted file mode 100644 index 257ca52157..0000000000 --- a/src/haz3lcore/JsUtil.re +++ /dev/null @@ -1,278 +0,0 @@ -open Util; -open Js_of_ocaml; -open Virtual_dom.Vdom; - -let get_elem_by_id = id => { - let doc = Dom_html.document; - Js.Opt.get( - doc##getElementById(Js.string(id)), - () => { - print_endline(id); - assert(false); - }, - ); -}; - -let get_elem_by_selector = selector => { - let doc = Dom_html.document; - Js.Opt.get( - doc##querySelector(Js.string(selector)), - () => { - print_endline(selector); - assert(false); - }, - ); -}; - -let date_now = () => { - [%js new Js.date_now]; -}; - -let timestamp = () => date_now()##valueOf; - -let get_key = evt => - Js.to_string(Js.Optdef.get(evt##.key, () => failwith("JsUtil.get_key"))); - -let ctrl_held = evt => Js.to_bool(evt##.ctrlKey); -let shift_held = evt => Js.to_bool(evt##.shiftKey); -let alt_held = evt => Js.to_bool(evt##.altKey); -let meta_held = evt => Js.to_bool(evt##.metaKey); - -let num_clicks = (evt: Js.t(Js_of_ocaml.Dom_html.mouseEvent)): int => - Js.Unsafe.coerce(evt)##.detail; - -let is_double_click = (evt: Js.t(Js_of_ocaml.Dom_html.mouseEvent)): bool => - num_clicks(evt) == 2; - -let download_string_file = - (~filename: string, ~content_type: string, ~contents: string) => { - let blob = File.blob_from_string(~contentType=content_type, contents); - let url = Dom_html.window##._URL##createObjectURL(blob); - - let link = Dom_html.createA(Dom_html.document); - link##.href := url; - link##setAttribute(Js.string("download"), Js.string(filename)); - link##.onclick := Dom_html.handler(_ => {Js._true}); - link##click; -}; - -let download_json = (filename, contents): unit => - download_string_file( - ~filename=filename ++ ".json", - ~content_type="application/json", - ~contents=contents |> Yojson.Safe.to_string, - ); - -let read_file = (file, k) => { - let reader = [%js new File.fileReader]; - reader##readAsText(file); - reader##.onload := - Dom.handler(_ => { - let result = reader##.result; - let option = Js.Opt.to_option(File.CoerceTo.string(result)); - let data = Option.map(Js.to_string, option); - k(data); - Js._true; - }); -}; - -let set_localstore = (k: string, v: string): unit => { - let local_store = - Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); - local_store##setItem(Js.string(k), Js.string(v)); -}; - -let get_localstore = (k: string): option(string) => - try({ - let local_store = - Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); - local_store##getItem(Js.string(k)) - |> ( - x => Js.Opt.get(x, () => assert(false)) |> Js.to_string |> Option.some - ); - }) { - | _ => None - }; - -let clear_localstore = () => { - let local_store = - Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); - local_store##clear; -}; - -let confirm = message => { - Js.to_bool(Dom_html.window##confirm(Js.string(message))); -}; - -let log = data => { - Firebug.console##log(data); -}; - -let focus = (~site="", id: string) => - try(get_elem_by_id(id)##focus) { - | _ => - print_endline( - "WARNING: Failed to focus in update: " ++ id ++ " site: " ++ site, - ) - }; - -let clipboard_shim_id = "clipboard-shim"; - -let focus_clipboard_shim = () => get_elem_by_id(clipboard_shim_id)##focus; - -let clipboard_shim = { - Node.textarea(~attrs=[Attr.id(clipboard_shim_id)], []); -}; - -let copy = (str: string) => { - focus_clipboard_shim(); - Dom_html.document##execCommand( - Js.string("selectAll"), - Js.bool(false), - Js.Opt.empty, - ); - Dom_html.document##execCommand( - Js.string("insertText"), - Js.bool(false), - Js.Opt.option(Some(Js.string(str))), - ); - Dom_html.document##execCommand( - Js.string("selectAll"), - Js.bool(false), - Js.Opt.empty, - ); -}; - -let scroll_cursor_into_view_if_needed = () => - try({ - let caret_elem = get_elem_by_id("caret"); - let main = get_elem_by_id("main"); - let main_rect = main##getBoundingClientRect; - let caret_rect = caret_elem##getBoundingClientRect; - - if (caret_rect##.top < main_rect##.top) { - caret_elem##scrollIntoView(Js._true); - } else if (caret_rect##.bottom > main_rect##.bottom) { - caret_elem##scrollIntoView(Js._false); - }; - }) { - | Assert_failure(_) => - print_endline("WARNING: caret not found"); - (); - }; - -module Fragment = { - let set_current = frag => { - let frag = - switch (frag) { - | "" => "" - | frag => "#" ++ frag - }; - let history = Js_of_ocaml.Dom_html.window##.history; - history##pushState(Js.null, Js.string(""), Js.some(Js.string(frag))); - }; - - let get_current = () => { - let fragment_of_url = (url: Url.url): string => - switch (url) { - | Http({hu_fragment: str, _}) - | Https({hu_fragment: str, _}) - | File({fu_fragment: str, _}) => str - }; - Url.Current.get() |> Option.map(fragment_of_url); - }; -}; - -module TextArea = { - type t = Js.t(Dom_html.textAreaElement); - - [@deriving (show({with_path: false}), sexp, yojson)] - type pos = { - row: int, - col: int, - }; - - [@deriving (show({with_path: false}), sexp, yojson)] - type rel = - | First - | Middle - | Last; - - [@deriving (show({with_path: false}), sexp, yojson)] - type rel_pos = { - rows: rel, - cols: rel, - }; - - let get = (id: string): Js.t(Dom_html.textAreaElement) => - id - |> get_elem_by_id - |> Dom_html.CoerceTo.textarea - |> Js.Opt.get(_, _ => failwith("TextArea.get")); - - let lines = (textarea: t): list(string) => - StringUtil.to_lines(Js.to_string(textarea##.value)); - - let caret_pos = (textarea: t): pos => { - let rec find_position = (lines, cur_pos, row, col) => { - switch (lines) { - | [] => {row, col} - | [line, ...rest] => - let line_length = String.length(line); - if (cur_pos <= line_length) { - {row, col: cur_pos}; - } else { - find_position(rest, cur_pos - line_length - 1, row + 1, 0); - }; - }; - }; - let lines = lines(textarea); - let caret_position = textarea##.selectionStart; - find_position(lines, caret_position, 0, 0); - }; - - let rel = (current: int, max: int): rel => - if (current == 0) { - First; - } else if (current == max) { - Last; - } else { - Middle; - }; - - let caret_rel_pos = (textarea: t): rel_pos => { - /* precondition: lines nonempty */ - let lines = textarea |> lines; - let {row, col} = caret_pos(textarea); - let full_row = List.nth(lines, row); - { - rows: rel(row, List.length(lines) - 1), - cols: rel(col, String.length(full_row)), - }; - }; - - let caret_at_start = (textarea: t): bool => { - let {rows, cols} = caret_rel_pos(textarea); - rows == First && cols == First; - }; - - let caret_at_end = (textarea: t): bool => { - /* precondition: lines nonempty */ - let lines = lines(textarea); - let {rows, cols} = caret_rel_pos(textarea); - switch (rows, cols, List.rev(lines)) { - | (Last, Last, _) => true - | (Last, First, ["", ..._]) => true - | (First, Last, [_]) => true - | (First, First, [""]) => true - | _ => false - }; - }; - - let set_caret_to_end = (textarea: t): unit => { - textarea##focus; - let content_length = String.length(Js.to_string(textarea##.value)); - textarea##.selectionStart := content_length; - textarea##.selectionEnd := content_length; - }; -}; diff --git a/src/haz3lweb/Benchmark.re b/src/haz3lweb/Benchmark.re index 067166af8b..84512bca78 100644 --- a/src/haz3lweb/Benchmark.re +++ b/src/haz3lweb/Benchmark.re @@ -1,4 +1,4 @@ -open Haz3lcore; +open Util; let sample_1 = {|# Hazel Language Quick Reference # diff --git a/src/haz3lweb/Log.re b/src/haz3lweb/Log.re index 861acd3bf5..43fb157c7e 100644 --- a/src/haz3lweb/Log.re +++ b/src/haz3lweb/Log.re @@ -1,7 +1,6 @@ /* Logging system for actions. Persists log via IndexedDB */ open Util; -open Haz3lcore; let is_action_logged: UpdateAction.t => bool = fun diff --git a/src/haz3lweb/LogEntry.re b/src/haz3lweb/LogEntry.re index c43c4241b0..bf7d9dfd59 100644 --- a/src/haz3lweb/LogEntry.re +++ b/src/haz3lweb/LogEntry.re @@ -1,5 +1,4 @@ open Util; -open Haz3lcore; [@deriving (show({with_path: false}), yojson, sexp)] type t = (float, UpdateAction.t); diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index 77e5fb29b7..25ae319b12 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -1,3 +1,4 @@ +open Util; open Js_of_ocaml; open Incr_dom; open Haz3lweb; diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 820466498d..71e77e163e 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -1,3 +1,4 @@ +open Util; open Haz3lcore; include UpdateAction; // to prevent circularity diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index d27326ee67..e07c9efa82 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -1,3 +1,4 @@ +open Util; open Virtual_dom.Vdom; open Haz3lcore; open Node; diff --git a/src/haz3lweb/view/DebugMode.re b/src/haz3lweb/view/DebugMode.re index 4ef0ea7a04..543e7cc757 100644 --- a/src/haz3lweb/view/DebugMode.re +++ b/src/haz3lweb/view/DebugMode.re @@ -1,5 +1,5 @@ open Virtual_dom.Vdom; -open Haz3lcore; +open Util; [@deriving (show({with_path: false}), sexp, yojson)] type action = diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 3594bbb457..7a009dfbdd 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -1,3 +1,4 @@ +open Util; open Haz3lcore; open Virtual_dom.Vdom; open Node; diff --git a/src/haz3lweb/view/NutMenu.re b/src/haz3lweb/view/NutMenu.re index 15fbec063d..c3b99df899 100644 --- a/src/haz3lweb/view/NutMenu.re +++ b/src/haz3lweb/view/NutMenu.re @@ -1,3 +1,4 @@ +open Util; open Virtual_dom.Vdom; open Js_of_ocaml; open Node; diff --git a/src/haz3lweb/view/Page.re b/src/haz3lweb/view/Page.re index c439425a36..6fea2c2666 100644 --- a/src/haz3lweb/view/Page.re +++ b/src/haz3lweb/view/Page.re @@ -1,3 +1,4 @@ +open Util; open Js_of_ocaml; open Haz3lcore; open Virtual_dom.Vdom; diff --git a/src/haz3lweb/view/ScratchMode.re b/src/haz3lweb/view/ScratchMode.re index 9e4b3a4657..4967f13b6d 100644 --- a/src/haz3lweb/view/ScratchMode.re +++ b/src/haz3lweb/view/ScratchMode.re @@ -1,3 +1,4 @@ +open Util; open Haz3lcore; type state = (Id.t, Editor.t); diff --git a/src/util/Util.re b/src/util/Util.re index f7f55a2a9e..1a8126d464 100644 --- a/src/util/Util.re +++ b/src/util/Util.re @@ -15,6 +15,7 @@ module StringUtil = StringUtil; module TimeUtil = TimeUtil; module TupleUtil = TupleUtil; module Web = Web; +module JsUtil = JsUtil; // Used by [@deriving sexp, yojson)] include Sexplib.Std; diff --git a/src/util/Web.re b/src/util/Web.re index 9b81f63302..0620a73026 100644 --- a/src/util/Web.re +++ b/src/util/Web.re @@ -1,5 +1,9 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv; open Virtual_dom.Vdom; open Node; +open JsUtil; +open Js_of_ocaml; let clss = Attr.classes; @@ -25,3 +29,102 @@ let range = (~attrs=[], ~min="0", ~max="100", value) => @ attrs, (), ); + +module TextArea = { + type t = Js.t(Dom_html.textAreaElement); + + [@deriving (show({with_path: false}), sexp, yojson)] + type pos = { + row: int, + col: int, + }; + + [@deriving (show({with_path: false}), sexp, yojson)] + type rel = + | First + | Middle + | Last; + + [@deriving (show({with_path: false}), sexp, yojson)] + type rel_pos = { + rows: rel, + cols: rel, + }; + + let get = (id: string): Js.t(Dom_html.textAreaElement) => + id + |> get_elem_by_id + |> Dom_html.CoerceTo.textarea + |> Js.Opt.get(_, _ => failwith("TextArea.get")); + + let content = (textarea: t): string => Js.to_string(textarea##.value); + + let lines = (textarea: t): list(string) => + textarea |> content |> StringUtil.to_lines; + + let caret_pos = (textarea: t): pos => { + let rec find_position = (lines, cur_pos, row, col) => { + switch (lines) { + | [] => {row, col} + | [line, ...rest] => + let line_length = String.length(line); + if (cur_pos <= line_length) { + {row, col: cur_pos}; + } else { + find_position(rest, cur_pos - line_length - 1, row + 1, 0); + }; + }; + }; + let lines = lines(textarea); + let caret_position = + try(textarea##.selectionStart) { + | _ => 0 + }; + find_position(lines, caret_position, 0, 0); + }; + + let rel = (current: int, max: int): rel => + if (current == 0) { + First; + } else if (current == max) { + Last; + } else { + Middle; + }; + + let caret_rel_pos = (textarea: t): rel_pos => { + /* precondition: lines nonempty */ + let lines = textarea |> lines; + let {row, col} = caret_pos(textarea); + let full_row = List.nth(lines, row); + { + rows: rel(row, List.length(lines) - 1), + cols: rel(col, String.length(full_row)), + }; + }; + + let caret_at_start = (textarea: t): bool => { + let {rows, cols} = caret_rel_pos(textarea); + rows == First && cols == First; + }; + + let caret_at_end = (textarea: t): bool => { + /* precondition: lines nonempty */ + let lines = lines(textarea); + let {rows, cols} = caret_rel_pos(textarea); + switch (rows, cols, List.rev(lines)) { + | (Last, Last, _) => true + | (Last, First, ["", ..._]) => true + | (First, Last, [_]) => true + | (First, First, [""]) => true + | _ => false + }; + }; + + let set_caret_to_end = (textarea: t): unit => { + textarea##focus; + let content_length = String.length(content(textarea)); + textarea##.selectionStart := content_length; + textarea##.selectionEnd := content_length; + }; +}; diff --git a/src/util/dune b/src/util/dune index b5faa5838a..e220e1f2fb 100644 --- a/src/util/dune +++ b/src/util/dune @@ -1,11 +1,16 @@ (library (name util) - (libraries re base ptmap incr_dom) + (libraries re base ptmap incr_dom virtual_dom yojson) (js_of_ocaml (flags (:include js-of-ocaml-flags-%{profile}))) (preprocess - (pps ppx_let ppx_sexp_conv ppx_deriving.show ppx_yojson_conv))) + (pps + ppx_yojson_conv + js_of_ocaml-ppx + ppx_let + ppx_sexp_conv + ppx_deriving.show))) (rule (write-file From 7e35c058a63252eb45d54872ad2f8b518e0d6c04 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 00:14:01 -0400 Subject: [PATCH 143/168] move key, os to util --- src/haz3lcore/Key.re | 76 -------------------------------------------- src/haz3lcore/Os.re | 1 - src/haz3lweb/Main.re | 1 - src/util/Util.re | 2 ++ 4 files changed, 2 insertions(+), 78 deletions(-) delete mode 100644 src/haz3lcore/Key.re delete mode 100644 src/haz3lcore/Os.re diff --git a/src/haz3lcore/Key.re b/src/haz3lcore/Key.re deleted file mode 100644 index 7380426a12..0000000000 --- a/src/haz3lcore/Key.re +++ /dev/null @@ -1,76 +0,0 @@ -open Util; -open Js_of_ocaml; - -[@deriving (show({with_path: false}), yojson)] -type dir = - | KeyUp - | KeyDown; - -[@deriving (show({with_path: false}), yojson)] -type key = - | D(string) - | U(string); - -[@deriving (show({with_path: false}), yojson)] -type sys = - | Mac - | PC; - -[@deriving (show({with_path: false}), yojson)] -type held = - | Down - | Up; - -[@deriving (show({with_path: false}), yojson)] -type t = { - key, - sys, - shift: held, - meta: held, - ctrl: held, - alt: held, -}; - -let get_key = evt => - Js.to_string(Js.Optdef.get(evt##.key, () => failwith("JsUtil.get_key"))); - -let ctrl_held = evt => Js.to_bool(evt##.ctrlKey); -let shift_held = evt => Js.to_bool(evt##.shiftKey); -let alt_held = evt => Js.to_bool(evt##.altKey); -let meta_held = evt => Js.to_bool(evt##.metaKey); - -let key_of = (dir: dir, evt): key => { - let key = get_key(evt); - switch (dir) { - | KeyUp => U(key) - | KeyDown => D(key) - }; -}; - -let to_held: bool => held = b => b ? Down : Up; - -let mk = (dir, evt): t => { - key: key_of(dir, evt), - sys: Os.is_mac^ ? Mac : PC, - shift: to_held(shift_held(evt)), - meta: to_held(meta_held(evt)), - ctrl: to_held(ctrl_held(evt)), - alt: to_held(alt_held(evt)), -}; - -let modifier_string = (h: held, m): string => h == Down ? " + " ++ m : ""; - -let modifiers_string = (key: t): string => - modifier_string(key.shift, "SHIFT") - ++ modifier_string(key.meta, "META") - ++ modifier_string(key.ctrl, "CTRL") - ++ modifier_string(key.alt, "ALT"); - -let key_dir_string = (key: t): string => - switch (key.key) { - | U(key) => "(UP): " ++ key - | D(key) => "(DN): " ++ key - }; - -let to_string = (key: t): string => - "KEY" ++ key_dir_string(key) ++ modifiers_string(key); diff --git a/src/haz3lcore/Os.re b/src/haz3lcore/Os.re deleted file mode 100644 index a3666ca793..0000000000 --- a/src/haz3lcore/Os.re +++ /dev/null @@ -1 +0,0 @@ -let is_mac = ref(false); diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index 25ae319b12..35244d33f1 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -2,7 +2,6 @@ open Util; open Js_of_ocaml; open Incr_dom; open Haz3lweb; -open Haz3lcore; let scroll_to_caret = ref(true); let edit_action_applied = ref(true); diff --git a/src/util/Util.re b/src/util/Util.re index 1a8126d464..4d64d16646 100644 --- a/src/util/Util.re +++ b/src/util/Util.re @@ -16,6 +16,8 @@ module TimeUtil = TimeUtil; module TupleUtil = TupleUtil; module Web = Web; module JsUtil = JsUtil; +module Key = Key; +module Os = Os; // Used by [@deriving sexp, yojson)] include Sexplib.Std; From be5986578d797cbc121c67d556eef2c44c359949 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 00:14:24 -0400 Subject: [PATCH 144/168] accidentally some files --- src/util/JsUtil.re | 269 +++++++++++++++++++++++++++++++++++++++++++++ src/util/Key.re | 76 +++++++++++++ src/util/Os.re | 1 + 3 files changed, 346 insertions(+) create mode 100644 src/util/JsUtil.re create mode 100644 src/util/Key.re create mode 100644 src/util/Os.re diff --git a/src/util/JsUtil.re b/src/util/JsUtil.re new file mode 100644 index 0000000000..b2f4aa6b60 --- /dev/null +++ b/src/util/JsUtil.re @@ -0,0 +1,269 @@ +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv; +open Js_of_ocaml; +open Virtual_dom.Vdom; + +let get_elem_by_id = id => { + let doc = Dom_html.document; + Js.Opt.get( + doc##getElementById(Js.string(id)), + () => { + print_endline(id); + assert(false); + }, + ); +}; + +let get_elem_by_selector = selector => { + let doc = Dom_html.document; + Js.Opt.get( + doc##querySelector(Js.string(selector)), + () => { + print_endline(selector); + assert(false); + }, + ); +}; + +let date_now = () => { + [%js new Js.date_now]; +}; + +let timestamp = () => date_now()##valueOf; + +let get_key = evt => + Js.to_string(Js.Optdef.get(evt##.key, () => failwith("JsUtil.get_key"))); + +let ctrl_held = evt => Js.to_bool(evt##.ctrlKey); +let shift_held = evt => Js.to_bool(evt##.shiftKey); +let alt_held = evt => Js.to_bool(evt##.altKey); +let meta_held = evt => Js.to_bool(evt##.metaKey); + +let num_clicks = (evt: Js.t(Js_of_ocaml.Dom_html.mouseEvent)): int => + Js.Unsafe.coerce(evt)##.detail; + +let is_double_click = (evt: Js.t(Js_of_ocaml.Dom_html.mouseEvent)): bool => + num_clicks(evt) == 2; + +let download_string_file = + (~filename: string, ~content_type: string, ~contents: string) => { + let blob = File.blob_from_string(~contentType=content_type, contents); + let url = Dom_html.window##._URL##createObjectURL(blob); + + let link = Dom_html.createA(Dom_html.document); + link##.href := url; + link##setAttribute(Js.string("download"), Js.string(filename)); + link##.onclick := Dom_html.handler(_ => {Js._true}); + link##click; +}; + +let download_json = (filename, contents): unit => + download_string_file( + ~filename=filename ++ ".json", + ~content_type="application/json", + ~contents=contents |> Yojson.Safe.to_string, + ); + +let read_file = (file, k) => { + let reader = [%js new File.fileReader]; + reader##readAsText(file); + reader##.onload := + Dom.handler(_ => { + let result = reader##.result; + let option = Js.Opt.to_option(File.CoerceTo.string(result)); + let data = Option.map(Js.to_string, option); + k(data); + Js._true; + }); +}; + +let set_localstore = (k: string, v: string): unit => { + let local_store = + Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); + local_store##setItem(Js.string(k), Js.string(v)); +}; + +let get_localstore = (k: string): option(string) => + try({ + let local_store = + Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); + local_store##getItem(Js.string(k)) + |> ( + x => Js.Opt.get(x, () => assert(false)) |> Js.to_string |> Option.some + ); + }) { + | _ => None + }; + +let clear_localstore = () => { + let local_store = + Js.Optdef.get(Dom_html.window##.localStorage, () => assert(false)); + local_store##clear; +}; + +let confirm = message => { + Js.to_bool(Dom_html.window##confirm(Js.string(message))); +}; + +let log = data => { + Firebug.console##log(data); +}; + +let clipboard_shim_id = "clipboard-shim"; + +let focus_clipboard_shim = () => get_elem_by_id(clipboard_shim_id)##focus; + +let clipboard_shim = { + Node.textarea(~attrs=[Attr.id(clipboard_shim_id)], []); +}; + +let copy = (str: string) => { + focus_clipboard_shim(); + Dom_html.document##execCommand( + Js.string("selectAll"), + Js.bool(false), + Js.Opt.empty, + ); + Dom_html.document##execCommand( + Js.string("insertText"), + Js.bool(false), + Js.Opt.option(Some(Js.string(str))), + ); + Dom_html.document##execCommand( + Js.string("selectAll"), + Js.bool(false), + Js.Opt.empty, + ); +}; + +let scroll_cursor_into_view_if_needed = () => + try({ + let caret_elem = get_elem_by_id("caret"); + let main = get_elem_by_id("main"); + let main_rect = main##getBoundingClientRect; + let caret_rect = caret_elem##getBoundingClientRect; + + if (caret_rect##.top < main_rect##.top) { + caret_elem##scrollIntoView(Js._true); + } else if (caret_rect##.bottom > main_rect##.bottom) { + caret_elem##scrollIntoView(Js._false); + }; + }) { + | Assert_failure(_) => () + }; + +module Fragment = { + let set_current = frag => { + let frag = + switch (frag) { + | "" => "" + | frag => "#" ++ frag + }; + let history = Js_of_ocaml.Dom_html.window##.history; + history##pushState(Js.null, Js.string(""), Js.some(Js.string(frag))); + }; + + let get_current = () => { + let fragment_of_url = (url: Url.url): string => + switch (url) { + | Http({hu_fragment: str, _}) + | Https({hu_fragment: str, _}) + | File({fu_fragment: str, _}) => str + }; + Url.Current.get() |> Option.map(fragment_of_url); + }; +}; + +module TextArea = { + type t = Js.t(Dom_html.textAreaElement); + + [@deriving (show({with_path: false}), sexp, yojson)] + type pos = { + row: int, + col: int, + }; + + [@deriving (show({with_path: false}), sexp, yojson)] + type rel = + | First + | Middle + | Last; + + [@deriving (show({with_path: false}), sexp, yojson)] + type rel_pos = { + rows: rel, + cols: rel, + }; + + let get = (id: string): Js.t(Dom_html.textAreaElement) => + id + |> get_elem_by_id + |> Dom_html.CoerceTo.textarea + |> Js.Opt.get(_, _ => failwith("TextArea.get")); + + let lines = (textarea: t): list(string) => + StringUtil.to_lines(Js.to_string(textarea##.value)); + + let caret_pos = (textarea: t): pos => { + let rec find_position = (lines, cur_pos, row, col) => { + switch (lines) { + | [] => {row, col} + | [line, ...rest] => + let line_length = String.length(line); + if (cur_pos <= line_length) { + {row, col: cur_pos}; + } else { + find_position(rest, cur_pos - line_length - 1, row + 1, 0); + }; + }; + }; + let lines = lines(textarea); + let caret_position = textarea##.selectionStart; + find_position(lines, caret_position, 0, 0); + }; + + let rel = (current: int, max: int): rel => + if (current == 0) { + First; + } else if (current == max) { + Last; + } else { + Middle; + }; + + let caret_rel_pos = (textarea: t): rel_pos => { + /* precondition: lines nonempty */ + let lines = textarea |> lines; + let {row, col} = caret_pos(textarea); + let full_row = List.nth(lines, row); + { + rows: rel(row, List.length(lines) - 1), + cols: rel(col, String.length(full_row)), + }; + }; + + let caret_at_start = (textarea: t): bool => { + let {rows, cols} = caret_rel_pos(textarea); + rows == First && cols == First; + }; + + let caret_at_end = (textarea: t): bool => { + /* precondition: lines nonempty */ + let lines = lines(textarea); + let {rows, cols} = caret_rel_pos(textarea); + switch (rows, cols, List.rev(lines)) { + | (Last, Last, _) => true + | (Last, First, ["", ..._]) => true + | (First, Last, [_]) => true + | (First, First, [""]) => true + | _ => false + }; + }; + + let set_caret_to_end = (textarea: t): unit => { + textarea##focus; + let content_length = String.length(Js.to_string(textarea##.value)); + textarea##.selectionStart := content_length; + textarea##.selectionEnd := content_length; + }; +}; diff --git a/src/util/Key.re b/src/util/Key.re new file mode 100644 index 0000000000..f235cb99fe --- /dev/null +++ b/src/util/Key.re @@ -0,0 +1,76 @@ +open Ppx_yojson_conv_lib.Yojson_conv; +open Js_of_ocaml; + +[@deriving (show({with_path: false}), yojson)] +type dir = + | KeyUp + | KeyDown; + +[@deriving (show({with_path: false}), yojson)] +type key = + | D(string) + | U(string); + +[@deriving (show({with_path: false}), yojson)] +type sys = + | Mac + | PC; + +[@deriving (show({with_path: false}), yojson)] +type held = + | Down + | Up; + +[@deriving (show({with_path: false}), yojson)] +type t = { + key, + sys, + shift: held, + meta: held, + ctrl: held, + alt: held, +}; + +let get_key = evt => + Js.to_string(Js.Optdef.get(evt##.key, () => failwith("JsUtil.get_key"))); + +let ctrl_held = evt => Js.to_bool(evt##.ctrlKey); +let shift_held = evt => Js.to_bool(evt##.shiftKey); +let alt_held = evt => Js.to_bool(evt##.altKey); +let meta_held = evt => Js.to_bool(evt##.metaKey); + +let key_of = (dir: dir, evt): key => { + let key = get_key(evt); + switch (dir) { + | KeyUp => U(key) + | KeyDown => D(key) + }; +}; + +let to_held: bool => held = b => b ? Down : Up; + +let mk = (dir, evt): t => { + key: key_of(dir, evt), + sys: Os.is_mac^ ? Mac : PC, + shift: to_held(shift_held(evt)), + meta: to_held(meta_held(evt)), + ctrl: to_held(ctrl_held(evt)), + alt: to_held(alt_held(evt)), +}; + +let modifier_string = (h: held, m): string => h == Down ? " + " ++ m : ""; + +let modifiers_string = (key: t): string => + modifier_string(key.shift, "SHIFT") + ++ modifier_string(key.meta, "META") + ++ modifier_string(key.ctrl, "CTRL") + ++ modifier_string(key.alt, "ALT"); + +let key_dir_string = (key: t): string => + switch (key.key) { + | U(key) => "(UP): " ++ key + | D(key) => "(DN): " ++ key + }; + +let to_string = (key: t): string => + "KEY" ++ key_dir_string(key) ++ modifiers_string(key); diff --git a/src/util/Os.re b/src/util/Os.re new file mode 100644 index 0000000000..a3666ca793 --- /dev/null +++ b/src/util/Os.re @@ -0,0 +1 @@ +let is_mac = ref(false); From 36d6dd56b7608b6c08e6def71ea58d1a106d5374 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 00:20:00 -0400 Subject: [PATCH 145/168] move Point to Util --- src/haz3lcore/Measured.re | 29 ++--------------------------- src/haz3lweb/view/dec/CaretDec.re | 4 ++-- src/haz3lweb/view/dec/DecUtil.re | 6 +++--- src/{haz3lcore => util}/Point.re | 3 ++- src/util/Util.re | 1 + 5 files changed, 10 insertions(+), 33 deletions(-) rename src/{haz3lcore => util}/Point.re (93%) diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index fe936ef22e..78d294656b 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -258,7 +258,7 @@ let is_indented_map = (seg: Segment.t) => { ) | Secondary(_) | Grout(_) => (is_indented, map) - | Projector(_) => (is_indented, map) // TODO(andrew): ?? + | Projector(_) => (is_indented, map) | Tile(t) => let is_indented = is_indented || post_tile_indent(t); let map = @@ -276,7 +276,7 @@ let is_indented_map = (seg: Segment.t) => { }; let last_of_token = (token: string, origin: Point.t): Point.t => - // Adjustment for multi-line tokens e.g. projector placeholders + /* Supports multi-line tokens e.g. projector placeholders */ Point.{ col: origin.col + StringUtil.max_line_width(token), row: origin.row + StringUtil.num_linebreaks(token), @@ -401,31 +401,6 @@ let of_segment = let map = add_s(t.id, shard, {origin, last}, map); (last, map); }; - //TODO(andrew) - // let add_shard = (origin, shard, map) => { - // let token = List.nth(t.label, shard); - // // Adjustment for multi-line tokens e.g. projector placeholders - // let last = - // Point.{ - // col: origin.col + StringUtil.max_line_width(token), - // row: origin.row + StringUtil.num_linebreaks(token), - // }; - // let map = map |> add_s(t.id, shard, {origin, last}); - // let row_indent = container_indent + contained_indent; - // let rec add_n_rows = (n, map) => - // switch (n) { - // | 0 => map - // | _ => - // map - // |> add_n_rows(n - 1) - // |> add_row( - // origin.row + n - 1, - // {indent: row_indent, max_col: origin.col}, - // ) - // }; - // let map = map |> add_n_rows(StringUtil.num_linebreaks(token)); - // (last, map); - // }; let (last, map) = Aba.mk(t.shards, t.children) |> Aba.fold_left( diff --git a/src/haz3lweb/view/dec/CaretDec.re b/src/haz3lweb/view/dec/CaretDec.re index e2bf1c4d55..850c29d7bb 100644 --- a/src/haz3lweb/view/dec/CaretDec.re +++ b/src/haz3lweb/view/dec/CaretDec.re @@ -1,5 +1,5 @@ -open Util; open SvgUtil; +open Util; let caret_width_straight = 0.1; let caret_width_bent = 0.1; @@ -8,7 +8,7 @@ let caret_bend = DecUtil.tip_width; module Profile = { type t = { side: Direction.t, - origin: Haz3lcore.Point.t, + origin: Point.t, shape: option(Direction.t), }; }; diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 7404f01124..7c43dcef8a 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -105,7 +105,7 @@ let position = ~height_fudge=0.0, ~scale=1., ~font_metrics: FontMetrics.t, - origin: Haz3lcore.Point.t, + origin: Point.t, ) => Attr.create( "style", @@ -128,7 +128,7 @@ let abs_position = ~height_fudge=0.0, ~scale=1., ~font_metrics: FontMetrics.t, - origin: Haz3lcore.Point.t, + origin: Point.t, ) => { position( ~style="position: absolute", @@ -145,7 +145,7 @@ let abs_position = let code_svg = ( ~font_metrics: FontMetrics.t, - ~origin: Haz3lcore.Point.t, + ~origin: Point.t, ~base_cls=[], ~path_cls=[], ~left_fudge=0.0, diff --git a/src/haz3lcore/Point.re b/src/util/Point.re similarity index 93% rename from src/haz3lcore/Point.re rename to src/util/Point.re index 16a0d147e2..6a8f80b698 100644 --- a/src/haz3lcore/Point.re +++ b/src/util/Point.re @@ -1,4 +1,5 @@ -open Util; +open Sexplib.Std; +open Ppx_yojson_conv_lib.Yojson_conv; [@deriving (show({with_path: false}), sexp, yojson)] type row = int; diff --git a/src/util/Util.re b/src/util/Util.re index 4d64d16646..c901907b60 100644 --- a/src/util/Util.re +++ b/src/util/Util.re @@ -18,6 +18,7 @@ module Web = Web; module JsUtil = JsUtil; module Key = Key; module Os = Os; +module Point = Point; // Used by [@deriving sexp, yojson)] include Sexplib.Std; From 41db5426dffabdfff5fc70ddcfbb46ff83da38de Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 01:09:44 -0400 Subject: [PATCH 146/168] eliminate the need for whole syntax pass to erase and extract projectors. move syntax mapping stuff to ZipperBase from Projector --- src/haz3lcore/statics/MakeTerm.re | 37 ++++-- src/haz3lcore/zipper/Editor.re | 12 +- src/haz3lcore/zipper/Projector.re | 177 ++++------------------------- src/haz3lcore/zipper/ZipperBase.re | 99 ++++++++++++++++ src/haz3lschool/Exercise.re | 2 +- src/haz3lschool/Grading.re | 2 +- 6 files changed, 157 insertions(+), 172 deletions(-) diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index a7bbc850e5..c29afab406 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -19,7 +19,7 @@ let tokens = _ => [], _ => [" "], (t: Tile.t) => t.shards |> List.map(List.nth(t.label)), - _ => [] //TODO(andrew) + _ => [], ); [@deriving (show({with_path: false}), sexp, yojson)] @@ -94,6 +94,12 @@ let kids_of_unsorted = | Post(l, tiles) => [l] @ kids_of_tiles(tiles) | Bin(l, tiles, r) => [l] @ kids_of_tiles(tiles) @ [r]; +type data = { + term: Term.UExp.t, + terms: TermMap.t, + projectors: Id.Map.t(Piece.projector), +}; + // Need this map to collect all structural terms, // not just the ones recognized in Statics. // TODO unhack @@ -103,6 +109,21 @@ let return = (wrap, ids, tm) => { tm; }; +/* Map to collect projector ids */ +let projectors: ref(Id.Map.t(Piece.projector)) = ref(Id.Map.empty); + +/* Strip a projector from a segment and log it in the map */ +let rm_and_log_projectors = (seg: Segment.t): Segment.t => + List.map( + fun + | Piece.Projector(pr) => { + projectors := Id.Map.add(pr.id, pr, projectors^); + pr.syntax; + } + | x => x, + seg, + ); + let parse_sum_term: UTyp.t => UTyp.variant = fun | {term: Var(ctr), ids} => Variant(ctr, ids, None) @@ -468,14 +489,14 @@ and rul = (unsorted: unsorted): URul.t => { } and unsorted = (skel: Skel.t, seg: Segment.t): unsorted => { + /* Remove projectors. We do this here as opposed to removing + * them in an external call to save a whole-syntax pass. */ + let seg = rm_and_log_projectors(seg); let tile_kids = (p: Piece.t): list(any) => switch (p) { | Secondary(_) | Grout(_) => [] - | Projector(p) => - let s = Sort.Any; //TODO(andrew) - let kid = Projector.seg_for_maketerm(p); - [go_s(s, Segment.skel(kid), kid)]; + | Projector(_) => [] | Tile({mold, shards, children, _}) => Aba.aba_triples(Aba.mk(shards, children)) |> List.map(((l, kid, r)) => { @@ -523,14 +544,14 @@ let go = ~cache_size_bound=1000, seg => { map := TermMap.empty; - let e = exp(unsorted(Segment.skel(seg), seg)); - (e, map^); + projectors := Id.Map.empty; + let term = exp(unsorted(Segment.skel(seg), seg)); + {term, terms: map^, projectors: projectors^}; }, ); let from_zip_for_sem = (~dump_backpack: bool, ~erase_buffer: bool, z: Zipper.t) => { - let z = Projector.Update.remove_all(z); //TODO(andrew) let seg = Zipper.smart_seg(~dump_backpack, ~erase_buffer, z); go(seg); }; diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index e19e3044f6..ceeeff2ddc 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -16,7 +16,7 @@ module CachedStatics = { let mk = (~settings: CoreSettings.t, z: Zipper.t): t => { // Modify here to allow passing in an initial context let ctx_init = Builtins.ctx_init; - let term = MakeTerm.from_zip_for_sem(z) |> fst; + let term = MakeTerm.from_zip_for_sem(z).term; let info_map = Statics.mk(settings, ctx_init, term); let error_ids = Statics.Map.error_ids(info_map); {term, info_map, error_ids}; @@ -50,10 +50,7 @@ module CachedSyntax = { let init = (z, info_map): t => { let segment = Zipper.unselect_and_zip(z); - //TODO(andrew): remove/consolidate remove_all and syntaxMap - let (term, terms) = - MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); - let projectors = Projector.SyntaxMap.go(z); + let MakeTerm.{term, terms, projectors} = MakeTerm.go(segment); { projectors, segment, @@ -68,10 +65,7 @@ module CachedSyntax = { let update = (z, info_map, ~touched, ~old): t => { let segment = Zipper.unselect_and_zip(z); - //TODO(andrew): remove/consolidate remove_all and syntaxMap - let (term, terms) = - MakeTerm.go(Zipper.unselect_and_zip(Projector.Update.remove_all(z))); - let projectors = Projector.SyntaxMap.go(z); + let MakeTerm.{term, terms, projectors} = MakeTerm.go(segment); { projectors, segment, diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index fbfda0025a..c41d0d7425 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -1,7 +1,5 @@ open ProjectorBase; -let seg_for_maketerm = (p: Base.projector): Base.segment => [p.syntax]; - /* After adding a new projector module, add it here so that * it can be instantiated. The first-class module created by * this function must be reified whenever projector methods @@ -58,126 +56,8 @@ let indicated = (z: ZipperBase.t) => { (id, projector); }; -module MapPiece = { - type updater = Piece.t => Piece.t; - - let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { - seg |> List.map(p => f(p)) |> List.map(of_piece(f)); - } - and of_piece = (f: updater, piece: Piece.t): Piece.t => { - switch (piece) { - | Tile(t) => Tile(of_tile(f, t)) - | Grout(_) - | Projector(_) - | Secondary(_) => piece - }; - } - and of_tile = (f: updater, t: Tile.t): Tile.t => { - {...t, children: List.map(of_segment(f), t.children)}; - }; - - let of_siblings = (f: updater, sibs: Siblings.t): Siblings.t => ( - of_segment(f, fst(sibs)), - of_segment(f, snd(sibs)), - ); - - let of_ancestor = (f: updater, ancestor: Ancestor.t): Ancestor.t => { - { - ...ancestor, - children: ( - List.map(of_segment(f), fst(ancestor.children)), - List.map(of_segment(f), snd(ancestor.children)), - ), - }; - }; - - let of_generation = - (f: updater, generation: Ancestors.generation): Ancestors.generation => ( - of_ancestor(f, fst(generation)), - of_siblings(f, snd(generation)), - ); - - let of_ancestors = (f: updater, ancestors: Ancestors.t): Ancestors.t => - List.map(of_generation(f), ancestors); - - let of_selection = (f: updater, selection: Selection.t): Selection.t => { - {...selection, content: of_segment(f, selection.content)}; - }; - - let go = (f: updater, z: ZipperBase.t): ZipperBase.t => { - ...z, - selection: of_selection(f, z.selection), - relatives: { - ancestors: of_ancestors(f, z.relatives.ancestors), - siblings: of_siblings(f, z.relatives.siblings), - }, - }; -}; - -//TODO(andrew): refine or remove -module SyntaxMap = { - let projectors_map: ref(Id.Map.t(Base.projector)) = ref(Id.Map.empty); - - let placehold = (syntax: syntax) => { - let id = Piece.id(syntax); - switch (syntax) { - | Projector(pr) => - projectors_map := Id.Map.add(id, pr, projectors_map^); - syntax; - | _ => syntax - }; - }; - - let go = (z: ZipperBase.t): Id.Map.t(Base.projector) => { - projectors_map := Id.Map.empty; - MapPiece.go(placehold, z) |> ignore; - projectors_map^; - }; -}; - /* Updates the underlying piece of syntax for a projector */ module Update = { - let sib_has_id = (get, z: ZipperBase.t, id: Id.t): bool => { - switch (z.relatives.siblings |> get) { - | Some(l) => Piece.id(l) == id - | _ => false - }; - }; - - let left_sib_has_id = sib_has_id(Siblings.left_neighbor); - let right_sib_has_id = sib_has_id(Siblings.right_neighbor); - - let update_left_sib = (f: syntax => syntax, z: ZipperBase.t) => { - let (l, r) = z.relatives.siblings; - let sibs = (List.map(f, l), List.map(f, r)); - z |> ZipperBase.put_siblings(sibs); - }; - - let update_right_sib = (f: syntax => syntax, z: ZipperBase.t) => { - let sibs = - switch (z.relatives.siblings) { - | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) - | sibs => sibs - }; - z |> ZipperBase.put_siblings(sibs); - }; - - let fast_update = - (f: Piece.t => Piece.t, id: Id.t, z: ZipperBase.t): ZipperBase.t => - /* This applies the function to the piece in the zipper having id id, and - * then replaces the id of the resulting piece with the idea of the old - * piece, ensuring that the root id remains stable. This function assumes - * the cursor is not inside the piece to be updated. This is optimized to - * be O(1) when the piece is directly to the left or right of the cursor, - * otherwise it is O(|zipper|) */ - if (left_sib_has_id(z, id)) { - update_left_sib(f, z); - } else if (right_sib_has_id(z, id)) { - update_right_sib(f, z); - } else { - MapPiece.go(f, z); - }; - let update_piece = (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => switch (syntax) { @@ -185,66 +65,57 @@ module Update = { | x => x }; - let init = (kind, id, syntax): option(Base.projector) => { + let init = (kind: t, syntax: syntax): syntax => { + /* We set the projector id equal to the Piece id for convienence + * including cursor-info association. We maintain this invariant + * when we update a projector's contained syntax */ let (module P) = to_module(kind); - P.can_project(syntax) ? Some({id, kind, model: P.init, syntax}) : None; + switch (P.can_project(syntax)) { + | false => syntax + | true => Projector({id: Piece.id(syntax), kind, model: P.init, syntax}) + }; }; let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { - | Projector(pr) when Piece.id(syntax) == id => - // Or Replace - switch (init(kind, id, pr.syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } - | syntax when Piece.id(syntax) == id => - switch (init(kind, id, syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } + | Projector(pr) when Piece.id(syntax) == id => init(kind, pr.syntax) + | syntax when Piece.id(syntax) == id => init(kind, syntax) + | x => x + }; + + let remove_projector = (id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => pr.syntax | x => x }; let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - //TODO(andrew): same id still? make sure these aren't creating dupes somewhere switch (syntax) { | Projector(pr) when Piece.id(syntax) == id => pr.syntax - | syntax when Piece.id(syntax) == id => - switch (init(kind, id, syntax)) { - | None => syntax - | Some(pr) => Base.Projector(pr) - } + | syntax when Piece.id(syntax) == id => init(kind, syntax) | x => x }; - let remove_projector = (id: Id.t, syntax: syntax) => + let remove_any_projector = (syntax: syntax) => switch (syntax) { - | Projector(pr) when pr.id == id => pr.syntax + | Projector(pr) => pr.syntax | x => x }; let update = (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) : ZipperBase.t => - fast_update(update_piece(f, id), id, z); + ZipperBase.MapPiece.fast_local(update_piece(f, id), id, z); let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - fast_update(add_projector(k, id), id, z); + ZipperBase.MapPiece.fast_local(add_projector(k, id), id, z); let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - fast_update(add_or_remove_projector(k, id), id, z); + ZipperBase.MapPiece.fast_local(add_or_remove_projector(k, id), id, z); let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => - fast_update(remove_projector(id), id, z); - - let remove_all_projectors = (syntax: syntax) => - switch (syntax) { - | Projector(pr) => pr.syntax - | x => x - }; + ZipperBase.MapPiece.fast_local(remove_projector(id), id, z); let remove_all = (z: ZipperBase.t): ZipperBase.t => - MapPiece.go(remove_all_projectors, z); + ZipperBase.MapPiece.go(remove_any_projector, z); }; diff --git a/src/haz3lcore/zipper/ZipperBase.re b/src/haz3lcore/zipper/ZipperBase.re index 34af4fc0e0..cb6311a4b8 100644 --- a/src/haz3lcore/zipper/ZipperBase.re +++ b/src/haz3lcore/zipper/ZipperBase.re @@ -61,3 +61,102 @@ let sibs_with_sel = | Left => (l_sibs, content @ r_sibs) | Right => (l_sibs @ content, r_sibs) }; + +module MapPiece = { + type updater = Piece.t => Piece.t; + + let rec of_segment = (f: updater, seg: Segment.t): Segment.t => { + seg |> List.map(p => f(p)) |> List.map(of_piece(f)); + } + and of_piece = (f: updater, piece: Piece.t): Piece.t => { + switch (piece) { + | Tile(t) => Tile(of_tile(f, t)) + | Grout(_) + | Projector(_) + | Secondary(_) => piece + }; + } + and of_tile = (f: updater, t: Tile.t): Tile.t => { + {...t, children: List.map(of_segment(f), t.children)}; + }; + + let of_siblings = (f: updater, sibs: Siblings.t): Siblings.t => ( + of_segment(f, fst(sibs)), + of_segment(f, snd(sibs)), + ); + + let of_ancestor = (f: updater, ancestor: Ancestor.t): Ancestor.t => { + { + ...ancestor, + children: ( + List.map(of_segment(f), fst(ancestor.children)), + List.map(of_segment(f), snd(ancestor.children)), + ), + }; + }; + + let of_generation = + (f: updater, generation: Ancestors.generation): Ancestors.generation => ( + of_ancestor(f, fst(generation)), + of_siblings(f, snd(generation)), + ); + + let of_ancestors = (f: updater, ancestors: Ancestors.t): Ancestors.t => + List.map(of_generation(f), ancestors); + + let of_selection = (f: updater, selection: Selection.t): Selection.t => { + {...selection, content: of_segment(f, selection.content)}; + }; + + /* Maps the updater over all pieces in the zipper + * (that are not currently unzipped) */ + let go = (f: updater, z: t): t => { + ...z, + selection: of_selection(f, z.selection), + relatives: { + ancestors: of_ancestors(f, z.relatives.ancestors), + siblings: of_siblings(f, z.relatives.siblings), + }, + }; + + let sib_has_id = (get, z: t, id: Id.t): bool => { + switch (z.relatives.siblings |> get) { + | Some(l) => Piece.id(l) == id + | _ => false + }; + }; + + let left_sib_has_id = sib_has_id(Siblings.left_neighbor); + + let right_sib_has_id = sib_has_id(Siblings.right_neighbor); + + let update_left_sib = (f: Piece.t => Piece.t, z: t) => { + let (l, r) = z.relatives.siblings; + let sibs = (List.map(f, l), List.map(f, r)); + put_siblings(sibs, z); + }; + + let update_right_sib = (f: Piece.t => Piece.t, z: t) => { + let sibs = + switch (z.relatives.siblings) { + | (l, [hd, ...tl]) => (l, [f(hd), ...tl]) + | sibs => sibs + }; + put_siblings(sibs, z); + }; + + let fast_local = (f: Piece.t => Piece.t, id: Id.t, z: t): t => + /* This applies the function to the piece in the zipper having id id, and + * then replaces the id of the resulting piece with the idea of the old + * piece, ensuring that the root id remains stable. This function assumes + * the cursor is not inside the piece to be updated. This is optimized to + * be O(1) when the piece is directly to the left or right of the cursor, + * otherwise it is O(|zipper|) */ + if (left_sib_has_id(z, id)) { + update_left_sib(f, z); + } else if (right_sib_has_id(z, id)) { + update_right_sib(f, z); + } else { + go(f, z); + }; +}; diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 3e4d22b858..0785ad9ffa 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -580,7 +580,7 @@ module F = (ExerciseEnv: ExerciseEnv) => { }; let term_of = (editor: Editor.t): Term.UExp.t => - MakeTerm.from_zip_for_sem(editor.state.zipper) |> fst; + MakeTerm.from_zip_for_sem(editor.state.zipper).term; let stitch3 = (ed1: Editor.t, ed2: Editor.t, ed3: Editor.t) => EditorUtil.append_exp( diff --git a/src/haz3lschool/Grading.re b/src/haz3lschool/Grading.re index 0beb8c989d..9e0f577772 100644 --- a/src/haz3lschool/Grading.re +++ b/src/haz3lschool/Grading.re @@ -172,7 +172,7 @@ module F = (ExerciseEnv: Exercise.ExerciseEnv) => { let mk = (~your_impl: Editor.t, ~tests: syntax_tests): t => { let user_impl_term = - MakeTerm.from_zip_for_sem(your_impl.state.zipper) |> fst; + MakeTerm.from_zip_for_sem(your_impl.state.zipper).term; let predicates = List.map(((_, p)) => SyntaxTest.predicate_fn(p), tests); From e81895ce22df199560a9b782b532044712b915bd Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 01:37:41 -0400 Subject: [PATCH 147/168] removed legacy Touched subsystem. Editor cleanup --- src/haz3lcore/Measured.re | 42 +------------------- src/haz3lcore/statics/Statics.re | 7 +--- src/haz3lcore/statics/TypBase.re | 3 +- src/haz3lcore/tiles/Base.re | 3 ++ src/haz3lcore/tiles/Segment.re | 5 +-- src/haz3lcore/tiles/Skel.re | 1 - src/haz3lcore/zipper/Editor.re | 61 +++++++----------------------- src/haz3lcore/zipper/Touched.re | 24 ------------ src/haz3lweb/view/Code.re | 2 +- src/haz3lweb/view/ProjectorView.re | 2 +- src/util/ListUtil.re | 12 ++++++ 11 files changed, 38 insertions(+), 124 deletions(-) delete mode 100644 src/haz3lcore/zipper/Touched.re diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 78d294656b..0111721e62 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -282,14 +282,7 @@ let last_of_token = (token: string, origin: Point.t): Point.t => row: origin.row + StringUtil.num_linebreaks(token), }; -let of_segment = - ( - ~old: t=empty, - ~touched=Touched.empty, - seg: Segment.t, - info_map: Statics.Map.t, - ) - : t => { +let of_segment = (seg: Segment.t, info_map: Statics.Map.t): t => { let is_indented = is_indented_map(seg); // recursive across seg's bidelimited containers @@ -301,24 +294,6 @@ let of_segment = seg: Segment.t, ) : (Point.t, t) => { - let first_touched_incomplete = - switch (Segment.incomplete_tiles(seg)) { - | [] => None - | ts => - ts - |> List.map((t: Tile.t) => Touched.find_opt(t.id, touched)) - |> List.fold_left( - (acc, touched) => - switch (acc, touched) { - | (Some(time), Some(time')) => Some(Time.min(time, time')) - | (Some(time), _) - | (_, Some(time)) => Some(time) - | _ => None - }, - None, - ) - }; - // recursive across seg's list structure let rec go_seq = ( @@ -351,20 +326,7 @@ let of_segment = | Secondary(w) when Secondary.is_linebreak(w) => let row_indent = container_indent + contained_indent; let indent = - if (Segment.sameline_secondary(tl)) { - 0; - } else { - switch ( - Touched.find_opt(w.id, touched), - first_touched_incomplete, - find_opt_lb(w.id, old), - ) { - | (Some(touched), Some(touched'), Some(indent)) - when Time.lt(touched, touched') => indent - | _ => - contained_indent + (Id.Map.find(w.id, is_indented) ? 2 : 0) - }; - }; + contained_indent + (Id.Map.find(w.id, is_indented) ? 2 : 0); let last = Point.{row: origin.row + 1, col: container_indent + indent}; let map = diff --git a/src/haz3lcore/statics/Statics.re b/src/haz3lcore/statics/Statics.re index 30748962a0..bdfc3b7cd9 100644 --- a/src/haz3lcore/statics/Statics.re +++ b/src/haz3lcore/statics/Statics.re @@ -909,11 +909,8 @@ let mk = uexp_to_info_map(~ctx, ~ancestors=[], e, Id.Map.empty) |> snd }); -let mk = (core: CoreSettings.t, ctx, exp) => { - //print_endline("RETICULATING SPLINES"); - core.statics - ? mk(ctx, exp) : Id.Map.empty; -}; +let mk = (core: CoreSettings.t, ctx, exp) => + core.statics ? mk(ctx, exp) : Id.Map.empty; let collect_errors = (map: Map.t): list((Id.t, Info.error)) => Id.Map.fold( diff --git a/src/haz3lcore/statics/TypBase.re b/src/haz3lcore/statics/TypBase.re index 5a38f745b6..e23793a4bd 100644 --- a/src/haz3lcore/statics/TypBase.re +++ b/src/haz3lcore/statics/TypBase.re @@ -496,8 +496,7 @@ module rec Typ: { | Sum(_) => true /* disambiguate between (A + B) -> C and A + (B -> C) */ }; - /* Essentially recreates haz3lweb/view/Type.re's view_ty but with string output. - * NOTE: Projectors rely on this including whitespace agreeing with view */ + /* Essentially recreates haz3lweb/view/Type.re's view_ty but with string output */ let rec pretty_print = (ty: t): string => switch (ty) { | Unknown(_) => "?" diff --git a/src/haz3lcore/tiles/Base.re b/src/haz3lcore/tiles/Base.re index 339c81fca7..8c127d83ba 100644 --- a/src/haz3lcore/tiles/Base.re +++ b/src/haz3lcore/tiles/Base.re @@ -1,5 +1,8 @@ open Util; +/* The different kinds of projector. New projectors + * types need to be registered here in order to be + * able to create and update their instances */ [@deriving (show({with_path: false}), sexp, yojson)] type kind = | Fold diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index cfdf1c8757..3ae65c5c66 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -74,7 +74,6 @@ let shape_affix = (([[w, ...ws], ...wss], gs), s, tl); | Grout(g) => (Aba.cons([], g, wgw), s, tl) | Projector(p) => - //TODO(andrew): ??? ask d let (l, _) = ProjectorBase.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); (empty_wgw, l, tl); @@ -724,8 +723,8 @@ let ids_of_incomplete_tiles_in_bidelimiteds = (seg: t): list(Id.t) => get_childrens(seg) |> List.concat |> get_incomplete_ids; let push_right = ((ls: t, rs: t)): (t, t) => - switch (ls |> List.rev) { - | [l, ...ls] => (ls |> List.rev, [l, ...rs]) + switch (List.rev(ls)) { + | [l, ...ls] => (List.rev(ls), [l, ...rs]) | [] => (ls, rs) }; diff --git a/src/haz3lcore/tiles/Skel.re b/src/haz3lcore/tiles/Skel.re index c2482202f7..00a18786e1 100644 --- a/src/haz3lcore/tiles/Skel.re +++ b/src/haz3lcore/tiles/Skel.re @@ -78,7 +78,6 @@ let rel = (p1: Piece.t, p2: Piece.t): option(rel) => | Convex => Some(Lt) | Concave => Some(Gt) } - //TODO(andrew):??? ask d | (Projector(_), _) => None | (_, Projector(_)) => None | (Tile(t1), Tile(t2)) => diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index ceeeff2ddc..0b234c3bca 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -13,7 +13,7 @@ module CachedStatics = { error_ids: [], }; - let mk = (~settings: CoreSettings.t, z: Zipper.t): t => { + let init = (~settings: CoreSettings.t, z: Zipper.t): t => { // Modify here to allow passing in an initial context let ctx_init = Builtins.ctx_init; let term = MakeTerm.from_zip_for_sem(z).term; @@ -22,8 +22,8 @@ module CachedStatics = { {term, info_map, error_ids}; }; - let mk = (~settings: CoreSettings.t, z: Zipper.t) => - settings.statics ? mk(~settings, z) : empty; + let init = (~settings: CoreSettings.t, z: Zipper.t) => + settings.statics ? init(~settings, z) : empty; let next = (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, old_statics: t): t => @@ -32,79 +32,56 @@ module CachedStatics = { } else if (!Action.is_edit(a)) { old_statics; } else { - mk(~settings, z); + init(~settings, z); }; }; module CachedSyntax = { type t = { - projectors: Id.Map.t(Base.projector), segment: Segment.t, measured: Measured.t, tiles: TileMap.t, holes: list(Grout.t), + selection_ids: list(Id.t), term: Term.UExp.t, term_ranges: TermRanges.t, terms: TermMap.t, + projectors: Id.Map.t(Base.projector), }; let init = (z, info_map): t => { let segment = Zipper.unselect_and_zip(z); let MakeTerm.{term, terms, projectors} = MakeTerm.go(segment); { - projectors, segment, term_ranges: TermRanges.mk(segment), tiles: TileMap.mk(segment), holes: Segment.holes(segment), measured: Measured.of_segment(segment, info_map), + selection_ids: Selection.selection_ids(z.selection), term, terms, - }; - }; - - let update = (z, info_map, ~touched, ~old): t => { - let segment = Zipper.unselect_and_zip(z); - let MakeTerm.{term, terms, projectors} = MakeTerm.go(segment); - { projectors, - segment, - term_ranges: TermRanges.mk(segment), - tiles: TileMap.mk(segment), - holes: Segment.holes(segment), - measured: Measured.of_segment(~touched, ~old, segment, info_map), - term, - terms, }; }; - let next = (a: Action.t, z: Zipper.t, info_map, old: t, ~touched) => - Action.is_edit(a) - ? update(z, info_map, ~touched, ~old=old.measured) : old; + let next = (a: Action.t, z: Zipper.t, info_map, old: t) => + Action.is_edit(a) ? init(z, info_map) : old; }; module Meta = { type t = { col_target: int, - touched: Touched.t, - selection_ids: list(Id.t), statics: CachedStatics.t, syntax: CachedSyntax.t, }; let init = (~settings: CoreSettings.t, z: Zipper.t) => { - let statics = CachedStatics.mk(~settings, z); - { - col_target: 0, - touched: Touched.empty, - selection_ids: Selection.selection_ids(z.selection), - statics, - syntax: CachedSyntax.init(z, statics.info_map), - }; + let statics = CachedStatics.init(~settings, z); + {col_target: 0, statics, syntax: CachedSyntax.init(z, statics.info_map)}; }; module type S = { - let touched: Touched.t; let measured: Measured.t; let term_ranges: TermRanges.t; let col_target: int; @@ -112,7 +89,6 @@ module Meta = { let module_of_t = (m: t): (module S) => (module { - let touched = m.touched; let measured = m.syntax.measured; let term_ranges = m.syntax.term_ranges; let col_target = m.col_target; @@ -134,10 +110,7 @@ module Meta = { ) : t => { print_endline("Editor.next. Action:" ++ Action.show(a)); - // Effects disabled below; if nothing breaks due to this then rip them out - let touched = meta.touched; //Touched.update(Time.tick(), effects, meta.touched); - let syntax = - CachedSyntax.next(~touched, a, z, meta.statics.info_map, meta.syntax); + let syntax = CachedSyntax.next(a, z, meta.statics.info_map, meta.syntax); let statics = CachedStatics.next(~settings, a, z, meta.statics); let col_target = switch (a) { @@ -145,13 +118,7 @@ module Meta = { | Select(Resize(Local(Up | Down))) => meta.col_target | _ => (Zipper.caret_point(syntax.measured))(. z).col }; - { - touched, - col_target, - syntax, - selection_ids: Selection.selection_ids(z.selection), - statics, - }; + {col_target, syntax, statics}; }; }; @@ -227,7 +194,7 @@ let new_state = let update_statics = (~settings: CoreSettings.t, ed: t): t => { /* Use this function to force a statics update when (for example) * changing the statics settings */ - let statics = CachedStatics.mk(~settings, ed.state.zipper); + let statics = CachedStatics.init(~settings, ed.state.zipper); { ...ed, state: { diff --git a/src/haz3lcore/zipper/Touched.re b/src/haz3lcore/zipper/Touched.re deleted file mode 100644 index 2a428deb28..0000000000 --- a/src/haz3lcore/zipper/Touched.re +++ /dev/null @@ -1,24 +0,0 @@ -include Id.Map; -type t = Id.Map.t(Time.t); - -module type S = { - let touched: t; -}; - -let update = (t: Time.t, es: list(Effect.t), td: t) => - es - |> List.fold_left( - (td, e: Effect.t) => - switch (e) { - | Delete(id) => td |> remove(id) - | Touch(id) => - td - |> update( - id, - fun - | None => Some(t) - | Some(t') => Some(Time.max(t, t')), - ) - }, - td, - ); diff --git a/src/haz3lweb/view/Code.re b/src/haz3lweb/view/Code.re index 2f5278e6b2..9cc249acfe 100644 --- a/src/haz3lweb/view/Code.re +++ b/src/haz3lweb/view/Code.re @@ -192,7 +192,7 @@ let view = ~font_metrics, ~settings: Settings.t, z: Zipper.t, - {syntax: {measured, segment, holes, _}, statics, selection_ids, _}: Editor.Meta.t, + {syntax: {measured, segment, holes, selection_ids, _}, statics, _}: Editor.Meta.t, ) : Node.t => { module Text = diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 21b4d9ee15..0b6547e835 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -138,7 +138,7 @@ let setup_view = ~measurement, ~indication, ~info, - ~selected=List.mem(id, meta.selection_ids), + ~selected=List.mem(id, meta.syntax.selection_ids), p, P.view(p.model, ~info, ~local, ~parent), ); diff --git a/src/util/ListUtil.re b/src/util/ListUtil.re index 20195c8a84..7244e440d8 100644 --- a/src/util/ListUtil.re +++ b/src/util/ListUtil.re @@ -480,3 +480,15 @@ let first_and_last = (xss: list(list('a))): list(('a, 'a)) => | [x] => Some((x, x)) | [x, ...xs] => Some((x, last(xs))), ); + +let rec unsnoc = (xs: list('a)): option(('a, list('a))) => { + switch ((xs: list('a))) { + | [] => None + | [head, ...tail] => + switch (unsnoc(tail)) { + | None => Some((head, [])) + | Some((tail_last: 'a, tail_init: list('a))) => + Some((tail_last, [head, ...tail_init])) + } + }; +}; From 90c30e6f6a89308a33a6eaf3b1d7b64850b4de79 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 01:50:51 -0400 Subject: [PATCH 148/168] move projector update logic from Projector to ProjectorPerform. clarify projector shape function arguments --- src/haz3lcore/tiles/Piece.re | 2 +- src/haz3lcore/tiles/Segment.re | 6 +- src/haz3lcore/zipper/IncompleteBidelim.re | 1 - src/haz3lcore/zipper/Printer.re | 4 - src/haz3lcore/zipper/Projector.re | 65 -------------- src/haz3lcore/zipper/ProjectorBase.re | 30 +++---- .../zipper/action/ProjectorPerform.re | 84 ++++++++++++++++--- 7 files changed, 92 insertions(+), 100 deletions(-) delete mode 100644 src/haz3lcore/zipper/IncompleteBidelim.re diff --git a/src/haz3lcore/tiles/Piece.re b/src/haz3lcore/tiles/Piece.re index 240fdb852a..fd37cfa1d2 100644 --- a/src/haz3lcore/tiles/Piece.re +++ b/src/haz3lcore/tiles/Piece.re @@ -151,7 +151,7 @@ let mold_of = (~shape=Nib.Shape.Convex, p: t) => | Tile(t) => t.mold | Grout(g) => Mold.of_grout(g, Any) | Secondary(_) => Mold.of_secondary({sort: Any, shape}) - | Projector(_) => ProjectorBase.mold_of(Any) + | Projector(p) => ProjectorBase.mold_of(p, Any) }; let replace_id = (id: Id.t, p: t): t => diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 3ae65c5c66..9464d69607 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -521,10 +521,10 @@ and regrout_affix = switch (p) { | Secondary(w) => (Trim.cons_w(w, trim), r, tl) | Grout(g) => (Trim.(merge(cons_g(g, trim))), r, tl) - | Projector(p) => - let p = Piece.Projector(p); + | Projector(pr) => + let p = Piece.Projector(pr); let (l', r') = - ProjectorBase.shapes(p) |> (d == Left ? TupleUtil.swap : Fun.id); + ProjectorBase.shapes(pr) |> (d == Left ? TupleUtil.swap : Fun.id); let trim = Trim.regrout(d, (r', r), trim); (Trim.empty, l', [p, ...Trim.to_seg(trim)] @ tl); | Tile(t) => diff --git a/src/haz3lcore/zipper/IncompleteBidelim.re b/src/haz3lcore/zipper/IncompleteBidelim.re deleted file mode 100644 index 8b13789179..0000000000 --- a/src/haz3lcore/zipper/IncompleteBidelim.re +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 187c7ffce9..268821c049 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -85,10 +85,6 @@ let zipper_to_string = ) |> String.concat("\n"); -let to_string_editor = - (~holes: option(string)=Some(""), editor: Editor.t): string => - zipper_to_string(~holes, editor.state.zipper); - let to_string_selection = (editor: Editor.t): string => to_rows( ~measured=measured(editor.state.zipper), diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index c41d0d7425..ab1a467106 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -26,7 +26,6 @@ let shape = (p: Base.projector, info: info): shape => { * is considered a placeholder. This could be made more principled. * Note that a placeholder retains the UUID of the underlying. */ let placeholder = (p: Base.projector, ci: option(Info.t)): string => - //TODO(andrew): pipe InfoMap to Measured/Code/Deco so can get it here i guess switch (shape(p, {id: p.id, syntax: p.syntax, ci})) { | Inline(width) => String.make(width, ' ') | Block({row, col}) => String.make(row - 1, '\n') ++ String.make(col, ' ') @@ -55,67 +54,3 @@ let indicated = (z: ZipperBase.t) => { }; (id, projector); }; - -/* Updates the underlying piece of syntax for a projector */ -module Update = { - let update_piece = - (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when pr.id == id => Base.Projector(f(pr)) - | x => x - }; - - let init = (kind: t, syntax: syntax): syntax => { - /* We set the projector id equal to the Piece id for convienence - * including cursor-info association. We maintain this invariant - * when we update a projector's contained syntax */ - let (module P) = to_module(kind); - switch (P.can_project(syntax)) { - | false => syntax - | true => Projector({id: Piece.id(syntax), kind, model: P.init, syntax}) - }; - }; - - let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when Piece.id(syntax) == id => init(kind, pr.syntax) - | syntax when Piece.id(syntax) == id => init(kind, syntax) - | x => x - }; - - let remove_projector = (id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when pr.id == id => pr.syntax - | x => x - }; - - let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => - switch (syntax) { - | Projector(pr) when Piece.id(syntax) == id => pr.syntax - | syntax when Piece.id(syntax) == id => init(kind, syntax) - | x => x - }; - - let remove_any_projector = (syntax: syntax) => - switch (syntax) { - | Projector(pr) => pr.syntax - | x => x - }; - - let update = - (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) - : ZipperBase.t => - ZipperBase.MapPiece.fast_local(update_piece(f, id), id, z); - - let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - ZipperBase.MapPiece.fast_local(add_projector(k, id), id, z); - - let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => - ZipperBase.MapPiece.fast_local(add_or_remove_projector(k, id), id, z); - - let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => - ZipperBase.MapPiece.fast_local(remove_projector(id), id, z); - - let remove_all = (z: ZipperBase.t): ZipperBase.t => - ZipperBase.MapPiece.go(remove_any_projector, z); -}; diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 69aeea64c9..99e87c5bb5 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -4,21 +4,6 @@ open Virtual_dom.Vdom; [@deriving (show({with_path: false}), sexp, yojson)] type t = Base.kind; -/* Projectors are currently all convex */ -let shapes = _ => Nib.Shape.(Convex, Convex); - -/* Projectors are currentlt all convex and any-sorted */ -let mold_of: Sort.t => Mold.t = - sort => { - { - nibs: { - ({shape: Convex, sort}, {shape: Convex, sort}); - }, - out: sort, - in_: [], - }; - }; - /* Projectors currently have two options for placeholder * shapes: A inline display of a given length, or a block * display with given length & height. Both of these can @@ -153,3 +138,18 @@ module Cook = (C: Projector) : Cooked => { C.update(m |> deserialize_m, a |> deserialize_a) |> serialize_m; let focus = C.focus; }; + +/* Projectors currently are all convex */ +let shapes = (_: Base.projector) => Nib.Shape.(Convex, Convex); + +/* Projectors currently have a unique molding */ +let mold_of = (p, sort: Sort.t): Mold.t => { + let (l, r) = shapes(p); + { + nibs: { + ({shape: l, sort}, {shape: r, sort}); + }, + out: sort, + in_: [], + }; +}; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index bb0ebb0b52..bcd6271d5c 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -1,4 +1,69 @@ open Projector; +open ProjectorBase; + +/* Updates the underlying piece of syntax for a projector */ +module Update = { + let update_piece = + (f: Base.projector => Base.projector, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => Base.Projector(f(pr)) + | x => x + }; + + let init = (kind: t, syntax: syntax): syntax => { + /* We set the projector id equal to the Piece id for convienence + * including cursor-info association. We maintain this invariant + * when we update a projector's contained syntax */ + let (module P) = to_module(kind); + switch (P.can_project(syntax)) { + | false => syntax + | true => Projector({id: Piece.id(syntax), kind, model: P.init, syntax}) + }; + }; + + let add_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => init(kind, pr.syntax) + | syntax when Piece.id(syntax) == id => init(kind, syntax) + | x => x + }; + + let remove_projector = (id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when pr.id == id => pr.syntax + | x => x + }; + + let add_or_remove_projector = (kind: Base.kind, id: Id.t, syntax: syntax) => + switch (syntax) { + | Projector(pr) when Piece.id(syntax) == id => pr.syntax + | syntax when Piece.id(syntax) == id => init(kind, syntax) + | x => x + }; + + let remove_any_projector = (syntax: syntax) => + switch (syntax) { + | Projector(pr) => pr.syntax + | x => x + }; + + let update = + (f: Base.projector => Base.projector, id: Id.t, z: ZipperBase.t) + : ZipperBase.t => + ZipperBase.MapPiece.fast_local(update_piece(f, id), id, z); + + let add = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + ZipperBase.MapPiece.fast_local(add_projector(k, id), id, z); + + let add_or_remove = (k: Base.kind, id: Id.t, z: ZipperBase.t): ZipperBase.t => + ZipperBase.MapPiece.fast_local(add_or_remove_projector(k, id), id, z); + + let remove = (id: Id.t, z: ZipperBase.t): ZipperBase.t => + ZipperBase.MapPiece.fast_local(remove_projector(id), id, z); + + let remove_all = (z: ZipperBase.t): ZipperBase.t => + ZipperBase.MapPiece.go(remove_any_projector, z); +}; /* If the caret is inside the indicated piece, move it out * NOTE: Might need to be updated to support pieces with more than 2 delims */ @@ -21,10 +86,7 @@ let go = switch (Indicated.for_index(z)) { | None => Error(Cant_project) | Some((piece, d, rel)) => - Ok( - move_out_of_piece(d, rel, z) - |> Projector.Update.add(p, Piece.id(piece)), - ) + Ok(move_out_of_piece(d, rel, z) |> Update.add(p, Piece.id(piece))) } | ToggleIndicated(p) => switch (Indicated.for_index(z)) { @@ -32,26 +94,26 @@ let go = | Some((piece, d, rel)) => Ok( move_out_of_piece(d, rel, z) - |> Projector.Update.add_or_remove(p, Piece.id(piece)), + |> Update.add_or_remove(p, Piece.id(piece)), ) } - | Remove(id) => Ok(Projector.Update.remove(id, z)) + | Remove(id) => Ok(Update.remove(id, z)) | SetSyntax(id, syntax) => - /* Note we update piece id to keep in sync with projector id */ + /* Note we update piece id to keep in sync with projector id; + * See intial id setting in Update.init */ Ok( - Projector.Update.update( + Update.update( p => {...p, syntax: Piece.replace_id(id, syntax)}, id, z, ), ) - | SetModel(id, model) => - Ok(Projector.Update.update(pr => {...pr, model}, id, z)) + | SetModel(id, model) => Ok(Update.update(pr => {...pr, model}, id, z)) | Focus(id, d) => let z = switch (d) { | None => - /* d==None means a mouse click */ + /* d == None means focus by mouse click */ jump_to_id_indicated(z, id) |> Option.value(~default=z) | Some(_) => z }; From 647d0f37bfc9bace56b359e82e431c9e7386288a Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 02:26:50 -0400 Subject: [PATCH 149/168] projectors cleanup --- src/haz3lschool/Exercise.re | 1 - src/haz3lweb/Main.re | 2 +- src/haz3lweb/Model.re | 3 +-- src/haz3lweb/Update.re | 2 +- src/haz3lweb/view/ExerciseMode.re | 18 ------------------ src/haz3lweb/view/dec/DecUtil.re | 4 ++-- 6 files changed, 5 insertions(+), 25 deletions(-) diff --git a/src/haz3lschool/Exercise.re b/src/haz3lschool/Exercise.re index 0785ad9ffa..fccbf242eb 100644 --- a/src/haz3lschool/Exercise.re +++ b/src/haz3lschool/Exercise.re @@ -633,7 +633,6 @@ module F = (ExerciseEnv: ExerciseEnv) => { (settings: CoreSettings.t, t: stitched(TermBase.UExp.t)) : stitched_statics => { let mk = (term: TermBase.UExp.t): Editor.CachedStatics.t => { - //NOTE: this is expensive and _almost_ redundant to the statics in Editor let info_map = Statics.mk(settings, Builtins.ctx_init, term); {term, error_ids: Statics.Map.error_ids(info_map), info_map}; }; diff --git a/src/haz3lweb/Main.re b/src/haz3lweb/Main.re index 35244d33f1..98e41a529d 100644 --- a/src/haz3lweb/Main.re +++ b/src/haz3lweb/Main.re @@ -36,7 +36,7 @@ let restart_caret_animation = () => | _ => () }; -let apply = (model: Model.t, action, state, ~schedule_action): Model.t => { +let apply = (model, action, state, ~schedule_action): Model.t => { restart_caret_animation(); if (UpdateAction.is_edit(action)) { last_edit_action := JsUtil.timestamp(); diff --git a/src/haz3lweb/Model.re b/src/haz3lweb/Model.re index 30f88274b4..839c07a0c8 100644 --- a/src/haz3lweb/Model.re +++ b/src/haz3lweb/Model.re @@ -112,8 +112,7 @@ let reset = (model: t): t => { /* Reset model to default, including in localstorage, but don't otherwise erase localstorage, allowing e.g. api keys to persist */ - let settings = Store.Settings.init(); - let settings = settings.core; + let settings = Store.Settings.init().core; ignore(Store.ExplainThisModel.init()); ignore(Store.Scratch.init(~settings)); ignore(Store.Documentation.init(~settings)); diff --git a/src/haz3lweb/Update.re b/src/haz3lweb/Update.re index 71e77e163e..0ca89b84c4 100644 --- a/src/haz3lweb/Update.re +++ b/src/haz3lweb/Update.re @@ -215,7 +215,7 @@ let schedule_evaluation = (~schedule_action, model: Model.t): unit => let update_cached_data = (~schedule_action, update, m: Model.t): Model.t => { let update_dynamics = reevaluate_post_update(update); - /* If we swtich editors, or change settings which require statics + /* If we switch editors, or change settings which require statics * when statics was previously off, we may need updated statics */ let non_edit_action_requiring_statics_refresh = update_dynamics diff --git a/src/haz3lweb/view/ExerciseMode.re b/src/haz3lweb/view/ExerciseMode.re index 7a009dfbdd..03623acfed 100644 --- a/src/haz3lweb/view/ExerciseMode.re +++ b/src/haz3lweb/view/ExerciseMode.re @@ -27,14 +27,7 @@ let view = ~stitched_dynamics, ~highlights, ) => { - print_endline("AAA"); let Exercise.{eds, pos} = exercise; - // let stitched_dynamics = - // Exercise.stitch_dynamic( - // settings.core, - // exercise, - // settings.core.dynamics ? Some(results) : None, - // ); let { test_validation, user_impl, @@ -45,11 +38,8 @@ let view = hidden_tests: _, }: Exercise.stitched(Exercise.DynamicsItem.t) = stitched_dynamics; - print_endline("DDD"); let grading_report = Grading.GradingReport.mk(eds, ~stitched_dynamics); - print_endline("EEE"); let score_view = Grading.GradingReport.view_overall_score(grading_report); - print_endline("FFF"); let editor_view = ( ~editor: Editor.t, @@ -74,14 +64,12 @@ let view = editor, ); }; - print_endline("GGG"); let title_view = Cell.title_cell(eds.title); let prompt_view = Cell.narrative_cell( div(~attrs=[Attr.class_("cell-prompt")], [eds.prompt]), ); - print_endline("HHH"); let prelude_view = Always( editor_view( @@ -103,7 +91,6 @@ let view = ~di=instructor, ), ); - print_endline("III"); // determine trailing hole // TODO: module let correct_impl_ctx_view = @@ -150,7 +137,6 @@ let view = ]); }, ); - print_endline("JJJ"); let your_tests_view = Always( editor_view( @@ -168,7 +154,6 @@ let view = ], ), ); - print_endline("KKK"); let wrong_impl_views = List.mapi( (i, (Exercise.{impl, _}, di)) => { @@ -184,7 +169,6 @@ let view = }, List.combine(eds.hidden_bugs, hidden_bugs), ); - print_endline("LLL"); let mutation_testing_view = Always( Grading.MutationTestingReport.view( @@ -193,7 +177,6 @@ let view = grading_report.point_distribution.mutation_testing, ), ); - print_endline("MMM"); let your_impl_view = { Always( editor_view( @@ -254,7 +237,6 @@ let view = ~max_points=grading_report.point_distribution.impl_grading, ), ); - print_endline("CCC"); [score_view, title_view, prompt_view] @ render_cells( settings, diff --git a/src/haz3lweb/view/dec/DecUtil.re b/src/haz3lweb/view/dec/DecUtil.re index 7c43dcef8a..a2f8b853a1 100644 --- a/src/haz3lweb/view/dec/DecUtil.re +++ b/src/haz3lweb/view/dec/DecUtil.re @@ -3,8 +3,8 @@ open Node; open Util; let tip_width = 0.32; -let concave_adj = 0.15; //0.25; -let convex_adj = 0.; //(-0.13); +let concave_adj = 0.15; +let convex_adj = 0.; let shadow_adj = 0.015; let caret_adjust = (side: Direction.t, shape: option(Direction.t)) => From acf3faa597bd5e8ac06ae2d1d7f3f3d122a25d53 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 02:37:56 -0400 Subject: [PATCH 150/168] fix selection bug --- src/haz3lcore/zipper/Editor.re | 4 +++- src/haz3lweb/view/Deco.re | 25 ++++++++++--------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 0b234c3bca..ff0573bb98 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -66,7 +66,9 @@ module CachedSyntax = { }; let next = (a: Action.t, z: Zipper.t, info_map, old: t) => - Action.is_edit(a) ? init(z, info_map) : old; + Action.is_edit(a) + ? init(z, info_map) + : {...old, selection_ids: Selection.selection_ids(z.selection)}; }; module Meta = { diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index db44591fde..cac57ab2b5 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -81,9 +81,9 @@ module Deco = (M: { let token = List.nth(t.label, index); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index, m, Tile(t)))] - //TODO(andrew): decoration for selections - /* No deco for multi-line tokens e.g. projector placeholders, - * but need to leave some blank lines */ + //TODO(andrew): clarify + /* Deco for multi-line tokens e.g. projector placeholders + * handled in ProjectorsView but need to leave some blank lines */ | num_lb => List.init(num_lb, _ => None) }; }); @@ -104,9 +104,9 @@ module Deco = (M: { let token = Projector.placeholder(p, ci); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] - //TODO(andrew): decoration for selections - /* No deco for multi-line tokens e.g. projector placeholders, - * but need to leave some blank lines */ + //TODO(andrew): clarify + /* Deco for multi-line tokens e.g. projector placeholders + * handled in ProjectorsView but need to leave some blank lines */ | num_lb => List.init(num_lb, _ => None) }; } @@ -189,10 +189,6 @@ module Deco = (M: { let tiles = Id.Map.find(Piece.id(p), M.meta.syntax.terms) |> Term.ids - /* NOTE(andrew): dark_ids were originally filtered here. - * Leaving this comment in place in case issues in the - * future are traced back to here. - * |> List.filter(id => id >= 0)*/ |> List.map(id => { let t = tile(id); ( @@ -337,9 +333,8 @@ module Deco = (M: { * than just the editor to which it's statics are being applied, so there may * be error holes that don't occur in the editor. However, any errors that do * occur in the editor will be represented, so this hack works for now */ - //TODO(andrew) - print_endline("WARNING: Deco.term_highlight: Not found"); - Node.div([]); + //TODO(andrew): clarify + Node.div([]) }; let color_highlights = (colorings: list((Id.t, string))) => { @@ -388,8 +383,8 @@ module Deco = (M: { "errors", try(List.map(error_view, M.meta.statics.error_ids)) { | Not_found => - print_endline("WARNING: Deco.errors: Not_found"); - []; + //TODO(andrew): clarify + [] }, ); From 3ba632ef961b6faefab16d7ea57f1fc573e299be Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 02:43:33 -0400 Subject: [PATCH 151/168] fixes per PR review --- src/haz3lcore/zipper/ProjectorBase.re | 28 +++++++++++++-------------- src/util/StringUtil.re | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 99e87c5bb5..4f08073155 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -37,30 +37,35 @@ type info = { /* To add a new projector, implement this module signature */ module type Projector = { - [@deriving (show({with_path: false}), sexp, yojson)] - type model; /* The internal model type of the projector which will * be serialized and persisted. Use `unit` if you don't * need other state beyond the underlying syntax */ [@deriving (show({with_path: false}), sexp, yojson)] - type action; + type model; /* An internal action type to be used in actions which * update the model. Use `unit` if the basic projector * actions (type `action`) above suffice */ - let init: model; + [@deriving (show({with_path: false}), sexp, yojson)] + type action; /* Initial state of the model */ - let can_project: Base.piece => bool; + let init: model; /* A predicate determining if the given underlying * syntax (currently limited to convex pieces) is * supported by this projector. This is used to gate * adding the projector */ - let can_focus: bool; + let can_project: Base.piece => bool; /* Does this projector have internal position states, * overriding the editor caret & keyboard handlers? * If yes, the focus method will be called when this * projector is either clicked on or if left/right * is pressed when the caret is to the immediate * right/left of the projector */ + let can_focus: bool; + /* Renders a DOM view for the projector, given the + * model, an info packet (see info type for details), + * and has two callbacks: ~parent for parent editor + * actions(see external_action type above), and ~local + * for this projector's local update function. */ let view: ( model, @@ -69,12 +74,6 @@ module type Projector = { ~parent: external_action => Ui_effect.t(unit) ) => Node.t; - /* Renders a DOM view for the projector, given the - * model, an info packet (see info type for details), - * and has two callbacks: ~parent for parent editor - * actions(see external_action type above), and ~local - * for this projector's local update function. */ - let placeholder: (model, info) => shape; /* How much space should be left in the code view for * this projector? This determines how the base code * view is laid out, including how movement around the @@ -82,14 +81,15 @@ module type Projector = { * from the view, but this is awkward to do so for now * projector writers are responsible for keeping these * in sync with each other. */ - let update: (model, action) => model; + let placeholder: (model, info) => shape; /* Update the local projector model given an action */ - let focus: ((Id.t, option(Direction.t))) => unit; + let update: (model, action) => model; /* Does whatever needs to be done to give a projector * keyboard focus. Right now this is only for side * effects but could be extended in the future to * take/return the model if the projector needs to * maintain a complex internal position state */ + let focus: ((Id.t, option(Direction.t))) => unit; }; /* Projector model and action are serialized so that diff --git a/src/util/StringUtil.re b/src/util/StringUtil.re index 2214dcce75..a4fedde846 100644 --- a/src/util/StringUtil.re +++ b/src/util/StringUtil.re @@ -36,7 +36,7 @@ let replace = Js_of_ocaml.Regexp.global_replace; let split = Js_of_ocaml.Regexp.split; -let to_lines = (s: string): list(string) => split(regexp("\n"), s); +let to_lines = String.split_on_char('\n'); let line_widths = (s: string): list(int) => s |> to_lines |> List.map(String.length); @@ -46,9 +46,9 @@ let max_line_width = (s: string): int => let num_lines = (s: string): int => s |> to_lines |> List.length; -let num_linebreaks = (s: string) => - List.init(String.length(s), String.get(s)) - |> List.fold_left((acc, c) => c == '\n' ? acc + 1 : acc, 0); +let num_linebreaks = (s: string) => { + s |> String.to_seq |> Seq.filter((==)('\n')) |> Seq.length; +}; // let escape_linebreaks: string => string = replace(regexp("\n"), "\\n"); // let unescape_linebreaks: string => string = replace(regexp("\\\\n"), "\n"); From 71859f9a70f98f1421a779e8fa343fdc3ce1a4d1 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 17:35:15 -0400 Subject: [PATCH 152/168] fix expander deco --- src/haz3lweb/www/style.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index aacac6a6a6..cda220b246 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -1908,6 +1908,7 @@ svg.tile-selected { } div.expandable-target { + display: flex; cursor: pointer; z-index: 40; } @@ -1920,9 +1921,13 @@ div.expandable-target { .arrow { width: 0; height: 0; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid var(--light-text-color); + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid #a69460; +} +div.expandable-target:hover .arrow, +.arrow:hover { + border-top: 6px solid black; } svg.expandable { From 6054105a6b9aa7cd95bace8117730e4d44ff5e2e Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 17:55:34 -0400 Subject: [PATCH 153/168] fix arrow precedence in init slides. change holes to ? on regression test slides to stop grout dancing on regen --- src/haz3lweb/Init.ml | 2840 ++++++++++++++++++------------------------ 1 file changed, 1246 insertions(+), 1594 deletions(-) diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 744aaa62d3..5c3a3b28bd 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -9,7 +9,7 @@ let startup : PersistentData.t = statics = true; elaborate = false; assist = true; - dynamics = false; + dynamics = true; evaluation = { show_case_clauses = true; @@ -28,7 +28,7 @@ let startup : PersistentData.t = instructor_mode = true; benchmark = false; explainThis = - { show = false; show_feedback = false; highlight = NoHighlight }; + { show = true; show_feedback = false; highlight = NoHighlight }; mode = Exercises; }; scratch = @@ -781,7 +781,7 @@ let startup : PersistentData.t = ], [ ("scratch_0", Evaluation); ("scratch_1", Evaluation) ] ); documentation = - ( "Projectors", + ( "Basic Reference", [ ( "Casting", { @@ -811,25 +811,22 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ cdf12728-5f08-4e00-adff-8d203d2e1406)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + cdeb3cfe-8cac-4efa-856c-92ffd856fba9)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 006b25b5-ccc3-430f-a8ef-0af78f24133d)(content(Whitespace\" \ - \"))))(Grout((id 82bdac5f-a8bc-49c5-aaf8-c8626bd1aaaf)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 39909202-da1c-4570-80d2-3144f7ec1544)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7214e1a3-10e6-41a3-b38b-6e0029268c2e)(shape \ - Convex)))(Secondary((id \ - 80e3a9a3-5d6d-46d7-ace0-620267ff4c52)(content(Whitespace\" \ - \"))))(Secondary((id \ - fef4623f-387d-4b3e-a954-ca5becab31b0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4dc169da-d912-4571-bf44-e96ef78f46f9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2abb0229-e337-47d4-91f0-49ad4420874d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9879f996-22b4-4d72-b87e-6c03717798b7)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 5f48f03b-fb47-4e0d-8b41-f8fb95081600)(content(Whitespace\" \ + \"))))(Tile((id \ + 56ad0cba-9a95-48f0-bc83-75203f7500fa)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 36f39a5d-453f-46f8-84a0-0e54a571aa3d)(content(Whitespace\" \ \")))))((Secondary((id \ acaad34c-1ef9-4103-8cc7-a315cb16766c)(content(Whitespace\" \ \"))))(Tile((id \ @@ -866,8 +863,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ cd5a1c96-d516-4740-a615-f329ded8cbb3)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4f1e5988-02d8-4e2f-8809-130c13e5bedb)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ a39a6432-d075-43de-821c-91c593ee68b7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ @@ -925,8 +922,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4c25952b-6297-4560-b56a-3c162d83c8e5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 1e81390d-b689-482e-924e-77c9c8ce4484)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ ec4b55d8-e8ee-4c10-a340-a04819b633c3)(label(let = \ @@ -954,18 +951,13 @@ let startup : PersistentData.t = 3b0b22c1-8b06-454b-bc5b-3bcd047b858e)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 3ad438f5-eedf-4c63-b276-c8fe3e4c6622)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e4490437-dff5-4fac-aaf8-25017c9da92c)(content(Whitespace\" \ + \"))))(Tile((id \ + 5898078f-2261-4a01-ba61-529e85c7a1a8)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 518a4068-d476-4b78-a51d-71da3483d9a4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 25e640db-08a3-49aa-becd-835cfc80763c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3fe64100-5b8c-4e0b-9cb2-cdb9c41e562c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7c114496-fa35-45b7-8b56-64219a25937f)(content(Whitespace\" \ - \"))))(Secondary((id \ - bd028bd4-7a3c-4b73-bdc4-cb71ae4dabcf)(content(Whitespace\" \ \")))))))))(Secondary((id \ 7b57f276-9239-48a5-959b-439c645e6b9b)(content(Whitespace\" \ \"))))(Tile((id \ @@ -997,8 +989,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 5c651383-18c1-48b1-8e66-b03c769f3bde)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ f7390a85-d74e-4b67-98d5-bb26e8b8865f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 0a704a14-505d-4c2d-a6de-ae4517221ab9)(label(let = \ @@ -1064,8 +1056,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ e4482912-39b0-49e3-82dd-4a222f6baad5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ f528425c-fe76-45e2-aaf0-3fce94886371)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ e9ba542f-8cee-4258-97e3-b92404ca2681)(label(let = \ @@ -1080,18 +1072,13 @@ let startup : PersistentData.t = 27e7e63c-ca04-4945-af58-848913dbf40b)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - df8e3f00-cc95-458b-a422-8cdb9e15d285)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 3b93dd7d-8393-4fe2-9060-72c4fab8280f)(content(Whitespace\" \ + \"))))(Tile((id \ + 143ea473-7035-4a1b-b70d-04cc0ece0c64)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ ee09a346-60da-4faf-af20-4ada2033a7b8)(content(Whitespace\" \ - \"))))(Secondary((id \ - fe3c1157-b579-4ee1-85db-dd3970fadcc8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 723bda35-ccff-45b5-bc97-a0abffe79563)(content(Whitespace\" \ - \"))))(Secondary((id \ - ff0307f1-17f9-4e0f-81ab-7765ac58e62d)(content(Whitespace\" \ - \"))))(Secondary((id \ - f1baf6dd-8d9a-4bc6-9f74-fb176f11854a)(content(Whitespace\" \ \")))))((Secondary((id \ 8904533a-4cdf-4111-b504-dc6c88ea0996)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1136,8 +1123,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ d20c5d46-a170-4403-a97e-a7011ff7cd9d)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 68beb6cf-6acf-4189-a0bd-e243d91237fa)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ f8a81479-e26e-4a45-9dcb-4c5fe7d14ab8)(label(let = \ @@ -1152,18 +1139,13 @@ let startup : PersistentData.t = 2d8453ea-d5be-40c8-ba37-3cb7862e3536)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 480f930c-710b-4641-9eb1-655779af6646)(shape \ - Convex)))(Secondary((id \ - 866488a0-d5a8-49c6-93bb-be5bee900cc4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 72c7edd0-0227-4a57-87dc-a388f9417b28)(content(Whitespace\" \ - \"))))(Secondary((id \ - d1b5bc7a-9cc4-44f0-b193-807db15818cc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 380ecbc5-422a-44fc-80bf-0190ecae0722)(content(Whitespace\" \ - \"))))(Secondary((id \ - 66421242-3d8b-4498-b3e1-7e1589086eab)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 373f84cf-3935-4a76-b6a5-2553ab4f34ea)(content(Whitespace\" \ + \"))))(Tile((id \ + b6814e99-f3f7-4444-89d1-f5569a465c60)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 02e548b0-bfe6-419b-811a-96f0a293ccb5)(content(Whitespace\" \ \")))))((Secondary((id \ f7773304-b9e1-4487-ae33-452466e47a8e)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1179,18 +1161,13 @@ let startup : PersistentData.t = cb957614-fcf7-4785-b6e3-be86272e251c)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 75bd82c3-b6a3-4407-a0bd-280b491932ff)(shape \ - Convex)))(Secondary((id \ - 85967488-1ba8-4dd8-b873-ec56d4ac51a8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 471f70ac-51c4-478e-aaf9-2c1a0bb23adb)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0a340ac0-3e04-4003-8c83-96d6dbe464d8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 15be90aa-5534-43e2-9ebf-a33f0c249cc9)(content(Whitespace\" \ - \"))))(Secondary((id \ - e61828d1-9d80-4b5a-92f8-cceea7fc1986)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + d66453af-7a7b-4659-b53c-8413552ad7e3)(content(Whitespace\" \ + \"))))(Tile((id \ + 194cfbbc-41e4-4896-9af4-a06fe2ec7c6d)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 95d63e9d-e9d1-432e-9738-bcf398544bed)(content(Whitespace\" \ \")))))))))(Secondary((id \ 1ebcd64c-8de0-4d29-a255-24f923bcc1cd)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1222,8 +1199,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4e933200-863d-4a1c-88e2-8bfa23c82acb)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ ad93dbcb-2b79-4ea8-9140-71fc17f4882d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ f4641efb-5ac2-4a73-86ce-4d8253be45bb)(label(let = \ @@ -1238,18 +1215,13 @@ let startup : PersistentData.t = 39c34523-e878-40a5-bc8c-cdd3a3f6f049)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - d4d5219c-be8b-4dcd-b57b-442f8965a748)(shape \ - Convex)))(Secondary((id \ - b01b77b0-8b99-4514-aed9-263f02029ab2)(content(Whitespace\" \ - \"))))(Secondary((id \ - c2e8ff5b-bc62-4e2e-aade-78f05fe6a6cb)(content(Whitespace\" \ - \"))))(Secondary((id \ - af1bf930-3e63-4335-bc7b-6b030cfc1360)(content(Whitespace\" \ - \"))))(Secondary((id \ - 171256f9-b4c9-4188-8ec3-175c12c06487)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4523a20a-a1ff-4de2-a689-1592b3b69750)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 1e90aa13-be44-40a4-85b0-181ba16ab080)(content(Whitespace\" \ + \"))))(Tile((id \ + fff73ac1-c9d7-4e01-94fd-9ed3f0564eae)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + b6ee7de0-8d58-414c-be1c-33091bb7ca04)(content(Whitespace\" \ \")))))((Secondary((id \ b5cd6e6e-9aab-4679-998b-f7d1085e0440)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1303,8 +1275,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ fe87eae2-aa00-4eb0-a785-fda1a4dc121f)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 727a5f75-ac95-4668-9085-b98ec78ab510)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ d30f154d-3759-4ca5-ad0d-d4b7a2b99fc9)(label(let = \ @@ -1320,26 +1292,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 4982da82-00d6-4c7e-8bac-343e08953bcd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1b11ae38-069e-4223-977f-236e39a50c17)(content(Whitespace\" \ - \"))))(Grout((id 83ceadf7-3610-48dd-8fd9-b87bd662c90a)(shape \ - Convex)))(Tile((id \ + ac994817-9b21-4f4e-87aa-95a03a6cad5f)(content(Whitespace\" \ + \"))))(Tile((id \ + 5ba369b1-179f-4407-98af-d586fad1b6c8)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + ccfd944f-3870-46ce-82b5-cbc33b7a5303)(content(Whitespace\" \ + \"))))(Tile((id \ bbf8d0c6-d491-427e-83ae-c75b3db010fc)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - c1f4eaab-433b-4d42-8091-6e1f603f9e3a)(shape \ - Convex)))(Secondary((id \ - 4b7b93f4-7639-4e2c-bc2c-3cc40f1c9e8c)(content(Whitespace\" \ - \"))))(Secondary((id \ - cd20c4bc-cb28-4d0c-9908-340e019d4d77)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1edcb7d7-d12f-406a-9d79-456fb99d6adb)(content(Whitespace\" \ - \"))))(Secondary((id \ - c89e2ba4-b8c4-4151-a1d6-3b87a278b7bf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9441c1d0-4e60-489c-a9f9-4d3eff77315a)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4428fb07-9c36-4477-9c69-466fbd28b185)(content(Whitespace\" \ + \"))))(Tile((id \ + 9d420a65-9363-43b1-b700-ce4a4233b7eb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 1db2e4ba-abc4-4e92-b34a-e1783befad0a)(content(Whitespace\" \ \")))))((Secondary((id \ 3ed6de05-238b-44d8-97b7-b426127d6b52)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1384,8 +1353,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 888fccf9-8e5f-4760-be1c-d606300b7bc2)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4cc6a91c-e1dd-4f59-ba75-897ebface5dc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 44395e54-de4a-4d4a-866d-31c6991e7004)(label(let = \ @@ -1401,26 +1370,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a8adfc83-5436-423b-bb9b-96ce8d2e2ebc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 44a16ef5-adbb-4044-9de5-9844fa570598)(content(Whitespace\" \ - \"))))(Grout((id 339c0c6d-0a89-4052-9bb5-bf42eeac7f1d)(shape \ - Convex)))(Tile((id \ + a649fdc8-3ec7-48a7-81e9-e9f3bf1c066a)(content(Whitespace\" \ + \"))))(Tile((id \ + ed9f4c24-134a-486f-b3bf-6acf3c08a6dd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 49cde020-1dcb-44be-9005-1f389e617d82)(content(Whitespace\" \ + \"))))(Tile((id \ 3905e512-9aa4-4ab0-b04e-f4786812da9e)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - eaf562ad-0f2d-4bdf-90ef-31d39a5a7da6)(shape \ - Convex)))(Secondary((id \ - dbabd996-4165-454f-a9bc-ead809c6296e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7722b379-aa97-467b-869e-4d767d260321)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8662bc94-3013-415a-869d-1d1f89baf83b)(content(Whitespace\" \ - \"))))(Secondary((id \ - b1098d8f-181c-492e-9ffa-58422fca5328)(content(Whitespace\" \ - \"))))(Secondary((id \ - b7de2c10-4dcd-472c-854e-a3b7b64058e4)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2654b246-89c3-420a-86c6-1aed89b67173)(content(Whitespace\" \ + \"))))(Tile((id \ + d74ee9b8-3a04-4ede-af2a-a963db19675f)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 5c13fc12-9be4-42e2-951e-68ef1cce1da3)(content(Whitespace\" \ \")))))((Secondary((id \ a6201111-d191-46c7-9586-e5ea7a0d332e)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1436,18 +1402,13 @@ let startup : PersistentData.t = e56cab14-55c6-4029-9154-6de5d2dc909a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 9e985d5c-3879-4ca0-9147-32e752f1786e)(shape \ - Convex)))(Secondary((id \ - 151feaa4-e7ec-46fc-a17c-3ca0c5cfd5e0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4a4192a7-aa36-4575-a3b2-932cfe77d763)(content(Whitespace\" \ - \"))))(Secondary((id \ - 54cbf34a-1ef4-44f7-9ab1-c92024f9bc7f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5bf19363-b78a-4da6-9d20-b0b585ec440d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8b4e4e2d-8c54-4a39-855c-faf7f151aa94)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 558941d2-7be4-4065-83ef-93649f6d8cde)(content(Whitespace\" \ + \"))))(Tile((id \ + 23c9a9af-4407-4213-8ea2-455466c46119)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 0cde4e0a-98dc-468f-8a44-ba2fea56ed49)(content(Whitespace\" \ \")))))))))(Secondary((id \ 023ddf1d-110e-4830-aecc-8bc19be454da)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1479,8 +1440,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 236d7b22-3415-4a10-a0d6-785e958aef93)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 3e9d1246-8a0f-424c-b70f-49f31459b670)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 01d328d8-5a45-44cf-88a6-779b0b5a6614)(label(let = \ @@ -1496,26 +1457,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 35f9d94b-bb11-43e3-807d-cc592596f670)(content(Whitespace\" \ - \"))))(Secondary((id \ - f2b4dc48-256b-446c-aa2b-0490fb0862be)(content(Whitespace\" \ - \"))))(Grout((id 11bdafd0-4f45-469b-84e2-21b566b0283a)(shape \ - Convex)))(Tile((id \ + ff8074b7-adc2-49bb-b955-ebffae9334cb)(content(Whitespace\" \ + \"))))(Tile((id \ + 399dd3a5-47b0-495b-a0b3-0adb588825d6)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + e24191c1-bd1a-4198-a7b1-f01bee5b76f4)(content(Whitespace\" \ + \"))))(Tile((id \ 9dfef0a4-c410-40bb-9769-66b71533bf42)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 235a8992-c930-4ed8-b8ea-ff8485e62472)(shape \ - Convex)))(Secondary((id \ - 9a97bebe-6401-464d-a7e6-6326dfd82f79)(content(Whitespace\" \ - \"))))(Secondary((id \ - eed78917-2805-4dd9-ab2f-578dc40d493d)(content(Whitespace\" \ - \"))))(Secondary((id \ - ce69949f-2cc1-4dd8-bb6f-eb0441d28fd8)(content(Whitespace\" \ - \"))))(Secondary((id \ - f4ffca34-7871-48d0-909b-f768d52182b1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 68d33e96-e2f6-49d0-9e52-0d50b83e4b63)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a09d3373-094a-440f-8943-680149da8066)(content(Whitespace\" \ + \"))))(Tile((id \ + 86932dbf-7439-46c0-90d4-455c052f4abd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + ff13a0b9-b50e-40df-b336-a3eadb46b42c)(content(Whitespace\" \ \")))))((Secondary((id \ 4c325100-74c7-4bd2-8a89-232f0a0b414f)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1569,8 +1527,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 5d58099d-f550-455e-b274-b8d44b673764)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4ba5ad49-1425-44ea-9961-3bb16e514206)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 96ec8227-f5f6-4d9a-beb1-b6de5b4cfafc)(label(let = \ @@ -1594,20 +1552,15 @@ let startup : PersistentData.t = c96d378e-344c-4693-92f9-f4f822a91c0e)(content(Whitespace\" \ \"))))(Tile((id \ 620e8167-f2be-4612-8a71-713085cd3c55)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 9692a327-cb2d-410f-a3f3-17876dbefa6c)(shape \ - Convex)))(Secondary((id \ - 1fe2bfe4-02f8-41ff-ae0e-e2d599cd1c61)(content(Whitespace\" \ - \"))))(Secondary((id \ - eebaa091-1ad8-4a9f-b9f8-e4704cf2b787)(content(Whitespace\" \ - \"))))(Secondary((id \ - b87b6471-1c91-4f85-8bae-fa61c7e9da6c)(content(Whitespace\" \ - \"))))(Secondary((id \ - e07768f1-be7e-4d7c-b24c-df2241caeff7)(content(Whitespace\" \ - \"))))(Secondary((id \ - bbbf4ea7-5fe0-4c21-b88d-20f99e2c19a5)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + be87fa75-2b97-4248-9a33-688b219e0eee)(content(Whitespace\" \ + \"))))(Tile((id \ + 4491f8bd-ab06-4105-be04-e3332da642d4)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 54f32652-50c6-412e-ae71-c9b4822dec4b)(content(Whitespace\" \ \")))))((Secondary((id \ 97cfd64c-f6ed-4827-b18c-b37ff8ee0ab1)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1652,8 +1605,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ cc7f868d-169b-48a1-8776-708fdbb271f6)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ aefaefe0-c489-459c-a90f-676a273e45d3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ dfb2c3d9-d26c-41ac-acd4-331d8f18fb38)(label(let = \ @@ -1677,20 +1630,15 @@ let startup : PersistentData.t = 4dd87f5a-457d-4000-84d8-6981913a19a3)(content(Whitespace\" \ \"))))(Tile((id \ 4db7eb0d-f6bb-4382-8e9d-7d5855f2e45a)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 199f7341-a052-4082-b8dc-3beb7f770f2b)(shape \ - Convex)))(Secondary((id \ - 6ad8f43e-b537-475e-92d8-a183e2671f09)(content(Whitespace\" \ - \"))))(Secondary((id \ - 22e493c1-5a71-4364-8ff3-e8dd42ffae23)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6d68c6a5-992f-43af-afd9-2c1a3485be89)(content(Whitespace\" \ - \"))))(Secondary((id \ - 56a53905-0b29-44d5-ad1a-1a9a367ccafd)(content(Whitespace\" \ - \"))))(Secondary((id \ - fda42f56-3909-41ab-adbe-b4e3ffba46b4)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4c5bd26c-d016-4aab-a760-87732dc66df4)(content(Whitespace\" \ + \"))))(Tile((id \ + 6a34b025-738a-4211-b0bb-e3aa3bcfaf15)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 2762c599-df68-46c2-ab8f-e71ee885f3ff)(content(Whitespace\" \ \")))))((Secondary((id \ 5b312070-fc46-4386-9087-2e4eb7a90a40)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1706,18 +1654,13 @@ let startup : PersistentData.t = 9faf313a-e902-4342-8bd8-60e31698845d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 0a141009-2224-4fe7-aedc-57808fd406b9)(shape \ - Convex)))(Secondary((id \ - f6e2c333-3948-4ed0-bb23-52de82e718d7)(content(Whitespace\" \ - \"))))(Secondary((id \ - 35f1c7ad-3ce7-4820-b4a3-898c428da870)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8cb15049-4f0e-4edd-a312-526f63325b47)(content(Whitespace\" \ - \"))))(Secondary((id \ - fa43b01b-cb39-4cad-968b-654553ea709a)(content(Whitespace\" \ - \"))))(Secondary((id \ - e0d4cb94-44b0-413e-aea7-e8ff5defbea0)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c70579cf-0afa-4105-a2d8-e1c1e4ef7757)(content(Whitespace\" \ + \"))))(Tile((id \ + 1d95e5e3-df69-4520-99af-3d7ddf297ae8)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 086964f8-ab1a-46c6-9f7b-9e1dbc607452)(content(Whitespace\" \ \")))))))))(Secondary((id \ a11341f9-b8a9-44e5-a04c-2579378cfd2b)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1749,8 +1692,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4baf1e3f-8382-4e98-8e80-184b54aec095)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ c0dc0ee4-46c5-4477-9cc6-807e9177f9a4)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 51b97558-4055-45df-927b-fb265bdf5bfa)(label(let = \ @@ -1774,20 +1717,15 @@ let startup : PersistentData.t = b9de13d2-fdb7-495f-8439-3b556350ec62)(content(Whitespace\" \ \"))))(Tile((id \ 1f096804-096d-4e60-a161-aa5b8fd96038)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 22ddace9-28eb-4ecc-9d3f-fcdd87ad469c)(shape \ - Convex)))(Secondary((id \ - 3ce9bcc4-159c-4acc-9672-d5c5f9f794c8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 01d48d24-742e-4597-bae0-165889ab457e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2b9b0e3b-e927-439b-b0c9-5e7ba1da88f8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5ea3e328-ebf6-4aa0-a1c1-09a86ea5453c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 82d5d81c-83cd-4543-8a68-59ba34e77972)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 1f258ee2-fade-4ba4-8bd5-7b29b09d788a)(content(Whitespace\" \ + \"))))(Tile((id \ + 7b548d5f-1146-4d20-99ef-463d3ef58ee2)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 28e73001-ebd8-4fde-9258-f4c1246abea3)(content(Whitespace\" \ \")))))((Secondary((id \ 7d2fb8a0-183b-4461-94c0-22094f91e3da)(content(Whitespace\" \ \"))))(Tile((id \ @@ -1841,8 +1779,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 0e6526da-0046-4138-94de-e82946772cfc)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 2ef640fe-5954-4cbb-b021-55b3b587cc04)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ a19c56f1-a816-4e38-aea5-0d6f420485a9)(label(let = \ @@ -1919,8 +1857,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4d2fa6a7-1ce4-452d-9d9f-87c6e90ff090)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 2eb49856-902d-404a-b748-5feea0ca1768)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7a8e41c6-5e9d-44cc-b4eb-7cbfdacc1553)(label(let = \ @@ -1968,18 +1906,13 @@ let startup : PersistentData.t = 86642454-aab9-4523-ab80-bdd57e8959d8)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 9441d59f-1241-4f7f-95b3-5dbaa808989d)(shape \ - Convex)))(Secondary((id \ - 65913e11-3203-4336-9321-c22a775f2ed6)(content(Whitespace\" \ - \"))))(Secondary((id \ - e438a443-ab82-4444-96ac-a79f88fa6043)(content(Whitespace\" \ - \"))))(Secondary((id \ - f92a6dcd-708b-44ba-9111-1b95448c0e39)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5389d635-f2a9-4c54-bd67-ba2d40f02507)(content(Whitespace\" \ - \"))))(Secondary((id \ - b4b18b98-2ec8-429f-93c9-db90a4a18da5)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 77a85ab8-e478-4505-90ef-92be37a3e9ae)(content(Whitespace\" \ + \"))))(Tile((id \ + 161cc43e-ec94-429e-b91b-c19ba5b78531)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 150ae360-22f9-404a-89d0-5e3ff3b04a35)(content(Whitespace\" \ \")))))))))(Secondary((id \ 9483c348-a09b-47fc-a3df-0ac8e8b889d3)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2011,8 +1944,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4ddd71d0-4bb2-48d2-955c-ef3328946282)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 2152af54-f0c0-470c-8813-e58a1d7bbb60)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 65043ff3-6dce-41bf-86f4-e2f2702de6fd)(label(let = \ @@ -2098,8 +2031,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4f7a1bd8-b0ef-409e-9271-181dcb58722b)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4d3f9222-9f37-4c30-8509-f9dc9613027e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8c441a61-9777-4b1c-9259-86b90fbc4718)(label(let = \ @@ -2115,14 +2048,16 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - e31fb855-a7c5-4aef-9380-35b2e43b3f82)(content(Whitespace\" \ - \"))))(Secondary((id \ - fd521f2b-4755-4628-ba87-298d885279a7)(content(Whitespace\" \ - \"))))(Grout((id c44133e4-9123-414b-b10a-6f39c31594dc)(shape \ - Convex)))(Tile((id \ + 1db23200-8e64-4e54-bd1c-7b5cea608b19)(content(Whitespace\" \ + \"))))(Tile((id \ + cfc31226-9350-4c16-a3f8-050d949a08cd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 742f7569-f38a-4c57-aa28-d88b71a6f552)(content(Whitespace\" \ + \"))))(Tile((id \ 12f7912f-1216-41db-b8a2-eb9671e4d468)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 3be812d9-6334-4edb-aa0a-4a806380e5f2)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2174,8 +2109,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ ca684f2b-9a71-4356-b6ce-ca0f3c9bc0d5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 59f87025-ba17-4b81-9244-ee934bb37bc8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ dff3d135-c383-41ef-8950-14ecf1c29366)(label(let = \ @@ -2191,14 +2126,16 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - abc01434-012f-4fb3-b00b-5899fa3a3215)(content(Whitespace\" \ - \"))))(Secondary((id \ - 38ae8470-6e06-44d7-b9c8-338da130c48d)(content(Whitespace\" \ - \"))))(Grout((id aa9e5b36-4759-4a2a-8f34-1bd8342325e2)(shape \ - Convex)))(Tile((id \ + 4fd5037e-379f-4df1-9013-708cd696a48a)(content(Whitespace\" \ + \"))))(Tile((id \ + 669c0122-a10e-4943-b931-f9543b5628bb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 02199619-4219-4b1c-b040-791e682292b3)(content(Whitespace\" \ + \"))))(Tile((id \ b4bd5b28-d004-4cb1-a7af-ef7f614e6e53)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ fce3b39c-6801-499c-9a84-5503fac6c37b)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2221,18 +2158,13 @@ let startup : PersistentData.t = af4d8b0d-3b42-4710-8c71-f3f442894293)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - f445f138-245f-49a3-a3e4-10f560594e51)(shape \ - Convex)))(Secondary((id \ - f4fde577-b16f-4e90-832b-1df3d1b7b6ca)(content(Whitespace\" \ - \"))))(Secondary((id \ - c1200ba0-8081-44c5-8e31-afe171355cac)(content(Whitespace\" \ - \"))))(Secondary((id \ - 45e27cbc-2362-4216-b998-bf4a86ab1de4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 922b73cc-48c9-45a5-85bd-57163eeed22a)(content(Whitespace\" \ - \"))))(Secondary((id \ - d0418412-d1c5-4708-81cc-9e532e283a5f)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 12b568fe-a2b7-4bd2-8340-8d7c9b125b64)(content(Whitespace\" \ + \"))))(Tile((id \ + 954ca980-5411-4dbe-b228-00efb66fa054)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 47fcc2af-ae97-4341-ad02-a256b2b8d307)(content(Whitespace\" \ \")))))))))(Secondary((id \ d517deff-6469-4b0a-811c-b247359750de)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2264,8 +2196,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 9e5e8178-381e-4c10-b980-7ec168184efa)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 497a0d60-0ab7-4d96-9ac1-717fbaf1efca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8f7563b2-9455-4599-9ff5-75ed69af637a)(label(let = \ @@ -2281,14 +2213,16 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 096599db-71e7-41ae-b73c-353dfeee0ae4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 586f8980-456e-47d4-8d62-96560f4f8cde)(content(Whitespace\" \ - \"))))(Grout((id 84efce2d-74fa-425d-bb7f-5851b47fc038)(shape \ - Convex)))(Tile((id \ + f750c67d-0faa-436c-a510-1e2827d91b5b)(content(Whitespace\" \ + \"))))(Tile((id \ + 61b971be-4988-4f4a-9c17-4b0348f43f99)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 6a466449-56eb-4788-a403-6ecd5a78608c)(content(Whitespace\" \ + \"))))(Tile((id \ a60b549c-f762-4be1-9777-6089b8b65f28)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 1a7206f3-795e-419e-86c4-8ddd15a4b177)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2349,8 +2283,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 142047ba-cd7f-4827-85e4-06aa322c1c3f)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 24c62fb1-1c75-4a40-a4c0-72f2195e96da)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -2424,8 +2358,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 04b6f724-922b-4c05-a750-a42532383cd9)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 24fdccaa-d71c-4b52-a79e-6b8c0a2f85a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7ed645bf-2e8d-4227-8531-c2d26da9e73b)(label(let = \ @@ -2453,18 +2387,13 @@ let startup : PersistentData.t = 38f334e1-4d7f-4c63-a4a7-a7dc8abb96c9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - c359c705-b4a0-48ed-86d2-13932971b7eb)(shape \ - Convex)))(Secondary((id \ - 488a6d06-c8b3-46cf-b74e-fe29329ccd33)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9f33b2e5-1550-41f2-aaf9-e529786df9f0)(content(Whitespace\" \ - \"))))(Secondary((id \ - bd6c1bb4-2553-4904-840e-00af37ac723e)(content(Whitespace\" \ - \"))))(Secondary((id \ - ba8b844c-a8c1-4bba-a442-29b671816290)(content(Whitespace\" \ - \"))))(Secondary((id \ - b29e3338-7a60-48d7-9f6a-0652b4bcedc7)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 551804aa-483e-4ccc-ae87-0a5030faf713)(content(Whitespace\" \ + \"))))(Tile((id \ + f38402bc-8b52-4db6-a19d-92b4b9fd6be2)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f73c851c-7dd6-471f-bbfe-7c6a2cfb9626)(content(Whitespace\" \ \")))))))))(Secondary((id \ f5862777-feaa-4502-8c3c-aada463eeb74)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2508,8 +2437,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ f3f502a0-e05e-4c5d-bac4-0940a4384e5b)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 5e566bac-f713-43cf-9a1c-a446bb10fd72)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ b5e39763-e6ac-4504-ace9-2f702b3bf054)(label(let = \ @@ -2587,8 +2516,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 3ef9f1f9-d033-4992-897e-5f2ef8513183)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 15eee5c4-d26a-427d-84d7-1569e3cb4919)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7274d08c-4615-4c9b-be36-990fd467e475)(label(let = \ @@ -2597,24 +2526,19 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 39de470e-3675-47b3-aacf-e34fe1e8dca8)(content(Whitespace\" \ \"))))(Tile((id \ - 902ba6b8-eb31-4ba7-a6fa-96df20d2864c)(label(f))(mold((out \ + e3df9d58-e01b-4746-9765-90403ce3d455)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 80d018fa-cb2e-483f-8939-e35ba76975af)(label(:))(mold((out \ + 739a28db-0cea-479b-b49a-b7dfed077cf9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - ef849061-6164-420e-82f8-317d023d5104)(shape \ - Convex)))(Secondary((id \ - 8f768566-fc9f-4e4f-95a1-74592ee51228)(content(Whitespace\" \ - \"))))(Secondary((id \ - bbd5b7a9-de93-4892-ad1c-465f0da1221a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1b5f395d-8f7a-49c8-b561-22948f9a7e74)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7d6677cf-b44a-44c0-b54a-6883c5f75d12)(content(Whitespace\" \ - \"))))(Secondary((id \ - ee3ad412-cc95-49c8-9f0e-61de4d8c6aa7)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7c23aec8-8fac-409b-b4ff-ea0c11e1e064)(content(Whitespace\" \ + \"))))(Tile((id \ + 826a23ac-d204-4d9b-b3b2-5ff68758b09c)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 26f344fd-6114-4200-bcfc-0caa5f0cadb6)(content(Whitespace\" \ \")))))((Secondary((id \ 7c2e966c-b4d4-42d2-a1b4-fce00bbf6196)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2671,8 +2595,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ bb9c6f93-31f0-481d-ae6c-80cab1902cb9)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 068e9875-3e6a-475d-bfc0-9f2f443b7b63)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 592c390c-1f19-422c-a471-a5ce868a91cf)(label(let = \ @@ -2681,24 +2605,19 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 683e9248-b7fc-4e13-9d75-9e62b8af677a)(content(Whitespace\" \ \"))))(Tile((id \ - 788a1fff-9abf-4460-8c06-332a8796d6dc)(label(f))(mold((out \ + c96dc41f-dcf9-46c6-9448-d39a4c55d37d)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 6c89bae2-8501-4c11-8f12-9ef16f71adae)(label(:))(mold((out \ + 7efd59fe-7c4e-49c8-8559-fce18a73cc39)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 01ab497c-5faa-4e55-8cec-a4bb60cbddd5)(shape \ - Convex)))(Secondary((id \ - 82e3390e-c6ac-4a90-97ae-7449b5f0806c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 95493832-367f-4c1e-a502-90fd0a0b4525)(content(Whitespace\" \ - \"))))(Secondary((id \ - fa9e793d-92f7-4baa-96ce-fc070bc2e185)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1dfebe5b-b167-44f1-afa1-742190a7e70a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5b8a0e6b-97ae-437c-8a68-887f434c5b55)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + fcb10726-1403-423f-b442-cdd48dd5d77e)(content(Whitespace\" \ + \"))))(Tile((id \ + 1feba6eb-ebdd-441e-9797-175c910892a3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 7cde917c-acb0-4f97-9b14-647110bb3aa2)(content(Whitespace\" \ \")))))((Secondary((id \ f7d1ce1e-d5f6-4fde-a8b5-3f62db021689)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2714,18 +2633,13 @@ let startup : PersistentData.t = 7cfddcc5-641c-413f-91ea-383848351b32)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 91232f17-47a9-4ce2-86ce-45859f009a46)(shape \ - Convex)))(Secondary((id \ - ec20996d-7a9f-4807-9973-35b685527d21)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2ce73cb8-4040-417a-bc08-8d8a8cc52121)(content(Whitespace\" \ - \"))))(Secondary((id \ - ea87b70a-b71c-4ce2-b82b-b30201086209)(content(Whitespace\" \ - \"))))(Secondary((id \ - b40e83fa-59da-4f96-aa36-46b6e3b96efc)(content(Whitespace\" \ - \"))))(Secondary((id \ - ecc8c1a7-cb57-4a36-b082-863944108f7c)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ac7369fe-9d08-4a4f-b91b-b16761e38d31)(content(Whitespace\" \ + \"))))(Tile((id \ + d4a163e4-32d4-489b-a8e4-7c6d24447c05)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 95ec139b-f320-41a8-a7b1-2ce340b5ad26)(content(Whitespace\" \ \")))))))))(Secondary((id \ 04807fbe-1bc7-4bf3-b615-6c68a47735d3)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2769,8 +2683,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 7b8dee0e-55f7-4b8f-bceb-960272396728)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 9584580c-62ff-45e7-86dc-b5d559efdf21)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 2e8deaa1-fad9-42f6-b2a2-cc74257fad3f)(label(let = \ @@ -2779,24 +2693,19 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 6691d181-75e0-432c-867a-2d3f7b3087fe)(content(Whitespace\" \ \"))))(Tile((id \ - 238e206a-8751-40d7-99da-a8105a4055e2)(label(f))(mold((out \ + c759eba4-9329-43f9-bb98-7a4e0d8fc9d3)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - eee88fd3-c0c0-4ca5-96ba-2f834624a547)(label(:))(mold((out \ + be8e424d-40a2-4be5-988a-077f9141f67a)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - a378535c-f2d2-42cb-ab1f-df6b5c1e9321)(shape \ - Convex)))(Secondary((id \ - 53d3be40-16ec-444b-89e0-82504ca7899c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0fdba49c-527d-4238-ab80-146ec677bbdf)(content(Whitespace\" \ - \"))))(Secondary((id \ - ec61d8d0-bae8-4c4f-9f0b-7dc4c88bfee5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 36caf6e5-60ac-497d-9f85-2ddaaed534cc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0af47010-ac83-45d3-a6c0-1a38117f5925)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4f6b2f24-dd3c-44b2-8445-323f5602a79c)(content(Whitespace\" \ + \"))))(Tile((id \ + b53300b8-7886-4124-bf81-47e1c1888c89)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f4d020b8-97e2-416a-8985-ebfbb4a45b95)(content(Whitespace\" \ \")))))((Secondary((id \ 46143bec-11d8-45bf-9ffc-d4cc5cf06448)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2862,8 +2771,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 57ce7d30-b2e6-4185-8b69-8909a2fa2657)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 7aedf271-fdbd-4ab0-a7bf-cff3ddf5d7a6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 9eb6a887-66ed-4e6f-abb1-0fd18cc232a2)(label(let = \ @@ -2879,26 +2788,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - a5e00130-9fa2-41a0-8234-28ca3baba902)(content(Whitespace\" \ - \"))))(Secondary((id \ - 16d34ea7-44f2-4faa-bc07-b4679ee9ac88)(content(Whitespace\" \ - \"))))(Grout((id 17ae806e-1dc6-47b3-af8d-a1193f451a01)(shape \ - Convex)))(Tile((id \ - 71e37eb1-4a8e-4477-b6e6-3d22fa8744ca)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - e886e87b-531b-4dcb-af2a-708ba8ba0222)(shape \ - Convex)))(Secondary((id \ - 38a9c301-9f10-4689-9d0e-8a6dfcf055e5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0ff8eae2-1c57-4348-9973-374b884fc0d4)(content(Whitespace\" \ - \"))))(Secondary((id \ - de480e87-c164-4699-9d52-f9ca0fce51db)(content(Whitespace\" \ - \"))))(Secondary((id \ - e022ed77-aa6a-439e-82be-501008d82adf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2070cccd-7c74-46e5-a86b-e759a77b9fad)(content(Whitespace\" \ + ff9beba5-4d7e-438f-a67e-fa1cc6377635)(content(Whitespace\" \ + \"))))(Tile((id \ + 22c91783-af31-4c63-b95e-aba695f8dea1)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4b97bca4-7324-4df0-940c-f378350c6b7f)(content(Whitespace\" \ + \"))))(Tile((id \ + 0487b328-02db-42ab-8717-e0c2e9ed5013)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 01854715-708b-4087-bde1-070444b998af)(content(Whitespace\" \ + \"))))(Tile((id \ + 849a5e18-db86-48e2-8e1c-90e6d0bff021)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 28071aa9-83fa-4426-8463-3a32fcbc59f2)(content(Whitespace\" \ \")))))((Secondary((id \ ba98ff4a-41ff-4029-90cd-ae83979916ca)(content(Whitespace\" \ \"))))(Tile((id \ @@ -2955,8 +2861,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 095ded62-7845-4ab1-b493-867e9ee579b1)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ fbb796fa-219b-46cd-b36f-ca75d1a64a3d)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 31bf6267-878e-4291-8605-72974e318b28)(label(let = \ @@ -2972,26 +2878,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - fd6ab311-a796-40fa-8dc6-647660ae60f1)(content(Whitespace\" \ - \"))))(Secondary((id \ - c912d664-2faf-495d-9bea-e742b8189585)(content(Whitespace\" \ - \"))))(Grout((id 2d3ddd04-87e2-46fc-a7fa-d913c513d4d3)(shape \ - Convex)))(Tile((id \ - f88f9c63-4a55-4f62-808b-6f75a08cc614)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - ec9a09e8-c256-4e2a-984b-d78d0f0d32f1)(shape \ - Convex)))(Secondary((id \ - 2ebb233c-d2b4-4f79-85a8-989b89908a9a)(content(Whitespace\" \ - \"))))(Secondary((id \ - de3dc889-bae6-4a59-a963-44d9cc68a182)(content(Whitespace\" \ - \"))))(Secondary((id \ - c43178d1-de35-4843-9bf7-931def214d44)(content(Whitespace\" \ - \"))))(Secondary((id \ - 38a2299e-8516-4201-a545-f6f4b4fa4d8b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 90ad3009-01e4-4620-8ed5-bf8cfc581f41)(content(Whitespace\" \ + 4facc02d-9485-45c5-8ffd-6e31b4561856)(content(Whitespace\" \ + \"))))(Tile((id \ + 8c129e44-abf5-46b1-909c-12f7a5fd0678)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + cea8313f-e717-476f-a6cf-b8d6a3cacc46)(content(Whitespace\" \ + \"))))(Tile((id \ + 88cf845d-19b6-4bbc-832c-b6f3cc362b84)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e44bbf8f-56b5-4d01-a729-f4f01bd36794)(content(Whitespace\" \ + \"))))(Tile((id \ + c405397e-8e8d-46c8-91f4-0fbfbefe836a)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 94a49b3d-a15d-4d2d-a922-1ef745a5fb12)(content(Whitespace\" \ \")))))((Secondary((id \ bfbc29bc-ce2e-4086-a397-a391dfbf04a0)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3007,18 +2910,13 @@ let startup : PersistentData.t = a00c688e-3015-4b40-bcd7-dbf738e7760d)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 05680e6e-0b3c-4934-9a61-435ac8fdc944)(shape \ - Convex)))(Secondary((id \ - c2e2f523-d982-45a6-a118-561b3e11a8cc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3706ac8a-79b7-43b3-860a-d6408eb0b109)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6535ad0c-56ec-43bc-949c-920d24528632)(content(Whitespace\" \ - \"))))(Secondary((id \ - c6b41176-9bba-4a80-afcd-be190b267668)(content(Whitespace\" \ - \"))))(Secondary((id \ - 37607c93-3b86-47ee-95bf-0a51c5bf290e)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 555b1c1a-4bd3-4ae3-83d2-f18125b5bf2b)(content(Whitespace\" \ + \"))))(Tile((id \ + 2c6324e9-7640-4b34-9ccc-777428a6a097)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + d05188c6-65a0-4faf-bd90-87e61219f6b4)(content(Whitespace\" \ \")))))))))(Secondary((id \ 626c5d8c-9b0a-4eaf-b93e-f2fccc236f33)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3062,8 +2960,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 22a96e4c-dd62-46b6-8ce0-891312cc0ab3)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 5577a324-0232-40b8-bfc7-cfa11ce76a42)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ aba93dc0-e541-408d-9776-49ac3e7852c9)(label(let = \ @@ -3079,26 +2977,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 6ddbed28-47ca-4ed7-ae0d-cb0dbead3f92)(content(Whitespace\" \ - \"))))(Secondary((id \ - 23a7afa2-b2db-4b17-a80e-115acab722a8)(content(Whitespace\" \ - \"))))(Grout((id 7c07d640-531b-4cd3-87bb-35835dde8e0e)(shape \ - Convex)))(Tile((id \ - 2b78b82b-63e9-4042-9b42-68b5fe26d7c4)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 50277b6c-6a0d-401a-982a-88b0c3dfd860)(shape \ - Convex)))(Secondary((id \ - 464fb60f-c5f9-4dd9-88c7-a276ac3774ae)(content(Whitespace\" \ - \"))))(Secondary((id \ - 41bfb844-ff21-4944-93d8-0a2722526d48)(content(Whitespace\" \ - \"))))(Secondary((id \ - 699bfb3a-9f6d-4180-a0cf-901cbf112a31)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7f4e1132-fe15-4607-8f96-29e3a973c1e2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 40807720-bbbb-4af2-a773-02d34bfd999c)(content(Whitespace\" \ + ebe0f0ea-6143-4542-86cf-7c6f1100a634)(content(Whitespace\" \ + \"))))(Tile((id \ + 858d90c3-9942-45b1-8d27-b42614d47f4d)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 27e8dcb6-2f86-4d82-a27e-03e2093b365f)(content(Whitespace\" \ + \"))))(Tile((id \ + e5437087-ecd8-4120-bfae-bd3bf4c1f9ca)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7f824a44-5d05-4254-b5e4-2b110d549a72)(content(Whitespace\" \ + \"))))(Tile((id \ + f758da13-d9e4-478a-abca-b3727c19e952)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 08006c22-cdee-47f2-8c9f-c4d51bae502e)(content(Whitespace\" \ \")))))((Secondary((id \ efdc2871-cdbe-479a-9108-be021edb0265)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3164,8 +3059,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 57758ed1-ab57-4e3d-aef9-aa7d1fbf04d5)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ e7628ab6-c525-4065-80ea-893de72fa236)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8cf8b117-3717-4ce8-bed2-54a0036715cc)(label(let = \ @@ -3189,20 +3084,15 @@ let startup : PersistentData.t = 2176d7bf-847e-45e9-ad8e-143fc5b7c945)(content(Whitespace\" \ \"))))(Tile((id \ f70c5e0c-61c4-4ec8-9b51-a630959eba84)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - bb324f28-a8ef-4f23-9059-5a399484c2c6)(shape \ - Convex)))(Secondary((id \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + dcc53af8-a281-4ed8-93a3-a33783043649)(content(Whitespace\" \ + \"))))(Tile((id \ + 69b78a78-6519-424e-97ab-fedcc9002ff0)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ eb70dc44-fd3e-421d-a873-272e02dd88be)(content(Whitespace\" \ - \"))))(Secondary((id \ - 99f5a121-99b7-4506-a466-bd7b6105a6fa)(content(Whitespace\" \ - \"))))(Secondary((id \ - ba8923b2-389e-4c39-b1ae-49066a3cf36b)(content(Whitespace\" \ - \"))))(Secondary((id \ - f9433098-c530-416e-be0a-732eec1909b7)(content(Whitespace\" \ - \"))))(Secondary((id \ - f4f67fa7-ae86-46e7-9be2-eeba26bfd98b)(content(Whitespace\" \ \")))))((Secondary((id \ 5d6f4679-6a1b-40b4-b3ef-ef15cec637ac)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3259,8 +3149,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ bfbcec2b-6879-44ef-81f4-46bde8f68a94)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 90aceb86-483e-4844-b758-9c04a734f56c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 5e772249-f1bb-44d3-b037-cbfa1746ebae)(label(let = \ @@ -3284,20 +3174,15 @@ let startup : PersistentData.t = 9ecb9b9b-fded-468c-8cf7-2e3729056b37)(content(Whitespace\" \ \"))))(Tile((id \ 00e07324-83e7-4df7-a772-22d1d8de54b8)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - c1f33aba-6e3a-4c8f-b4d2-574ce5b4f216)(shape \ - Convex)))(Secondary((id \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 88fd3332-464a-4fca-8af8-d49c003ff470)(content(Whitespace\" \ + \"))))(Tile((id \ + 3f0cb206-538c-40ec-9d39-03a3390cbb8e)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ db022bb8-9aca-48fd-9690-ae1d6c5bb490)(content(Whitespace\" \ - \"))))(Secondary((id \ - 027d8ca2-1b81-442b-8cf1-cdf2d1c76e91)(content(Whitespace\" \ - \"))))(Secondary((id \ - a2cd2ce4-0fdb-428d-9a51-13701d0fa4a0)(content(Whitespace\" \ - \"))))(Secondary((id \ - a5cf72cf-677f-4aaf-9ec6-09e91c1f525a)(content(Whitespace\" \ - \"))))(Secondary((id \ - db235a2f-8387-4e02-babf-2199d2c272ea)(content(Whitespace\" \ \")))))((Secondary((id \ 2d450b70-0ed5-42be-85f1-f0f933a8483c)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3313,18 +3198,13 @@ let startup : PersistentData.t = c25b9f07-e439-4dfe-a263-5bcaed84a1de)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - e7b5912a-155e-41f9-89af-6ec00d4d5001)(shape \ - Convex)))(Secondary((id \ - f918b9a6-55f3-4a16-8ba1-a00fbd9bb382)(content(Whitespace\" \ - \"))))(Secondary((id \ - fbadb3c6-02ac-4ca5-90f8-9e5d3a219ab9)(content(Whitespace\" \ - \"))))(Secondary((id \ - dadb658a-0b61-420f-b1b5-4771a9a987a0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1a9310c9-0c07-4dab-8af5-02d6135cca25)(content(Whitespace\" \ - \"))))(Secondary((id \ - b8907280-6edc-4fd9-b5bc-c6fd56283b0b)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 9ccf8e55-fcd4-493a-a201-e42102d1e8d0)(content(Whitespace\" \ + \"))))(Tile((id \ + 34769c15-47a8-4e46-aeb5-6eeb8b0807fd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + a87d5b15-7d32-4daf-abc6-1bcc2b50bd34)(content(Whitespace\" \ \")))))))))(Secondary((id \ c036a747-29d0-4d85-b17b-6d6b56ffadd9)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3368,8 +3248,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 3db940c0-7cd1-46ff-bd95-848686d62bc2)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ baf9fff8-bdad-4120-a57d-609684b3c00e)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ ced662d0-40b1-49d2-aeed-14e5b19b9bf8)(label(let = \ @@ -3393,20 +3273,15 @@ let startup : PersistentData.t = 6b8e383d-3bd1-478d-85f4-89ab10769816)(content(Whitespace\" \ \"))))(Tile((id \ 045eb834-c416-4178-9684-65571b11ca00)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - d3aa535f-e3f5-4110-a904-fbc7b46296e4)(shape \ - Convex)))(Secondary((id \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 9c4a59c1-43fd-4310-825b-aef7ffa892a9)(content(Whitespace\" \ + \"))))(Tile((id \ + 50526889-cf1a-45a8-a289-9e5eef58949e)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 19011eab-4218-454d-8de9-0801934b624e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 720ea606-dd60-4a44-8355-85dd8d5c9eea)(content(Whitespace\" \ - \"))))(Secondary((id \ - b203fe9c-9bdc-457b-b73b-c2e99bf1679f)(content(Whitespace\" \ - \"))))(Secondary((id \ - 70d499ed-5ea8-4bf6-85a1-8f2117bba5c9)(content(Whitespace\" \ - \"))))(Secondary((id \ - a6a0f9b8-fc54-4438-bd31-e4e977eb675f)(content(Whitespace\" \ \")))))((Secondary((id \ 158e221a-8e5d-4652-b0d9-a558c0313529)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3472,8 +3347,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ eccbf863-8826-4c0f-8e23-8eafad3eb9ef)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 7aa73962-e3ff-4888-9f19-14fc18bce03c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 4c006c03-ca73-450e-a26c-2ede30e78b09)(label(let = \ @@ -3562,8 +3437,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 5dd2d4ab-a2b7-482d-8140-78790ff8c623)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ be1ba7de-ec19-4672-8cb3-0e7482ee9237)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 226f8cc3-31fa-48a6-bc2a-9fe5bc8b8046)(label(let = \ @@ -3611,18 +3486,13 @@ let startup : PersistentData.t = a05299d1-ee0e-4551-b400-02f082bfbdcc)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 17a574f7-a714-437e-adbd-9e33a68def0e)(shape \ - Convex)))(Secondary((id \ - cccbe27b-53e4-4bff-8cc9-bfb4fa2e0e01)(content(Whitespace\" \ - \"))))(Secondary((id \ - b6e40f4e-c8fb-4f75-8cf2-07cff0cdaf76)(content(Whitespace\" \ - \"))))(Secondary((id \ - e2ae5512-6800-4e98-a93a-3eb56f6c2465)(content(Whitespace\" \ - \"))))(Secondary((id \ - ad64908c-bf0f-44a2-afd0-169ff9da9176)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6498c90e-11d9-41ea-9caf-282c151d43ec)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 4bc14b38-90c0-42b0-95ee-e4b609dbbb1b)(content(Whitespace\" \ + \"))))(Tile((id \ + fffb4962-d18c-449e-be30-dc73ed7c3a87)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + a406f0cd-29da-4b48-be85-2fae11da87bd)(content(Whitespace\" \ \")))))))))(Secondary((id \ e640fd12-11c1-40ab-92bb-051cdf2a111e)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3666,8 +3536,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 1ec6b086-98b7-4bcc-acff-3e2ee3747026)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 21363ebd-d485-44f1-ab7e-1007beaffef1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 35ec3a37-980a-4deb-9e53-47f783d84412)(label(let = \ @@ -3765,8 +3635,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ a0b183bd-484a-4a7f-9ab8-e8c7c2bf2a13)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 95b8cb50-ee78-4de8-803f-a219c8e99e24)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 1665684e-79cf-41ac-bb87-3b785fd83ba8)(label(let = \ @@ -3775,21 +3645,23 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 420f3e72-db0b-458b-a278-2eb3141fe707)(content(Whitespace\" \ \"))))(Tile((id \ - b0dccd5c-cae5-4ec6-bf11-39f8bf6de1b7)(label(f))(mold((out \ + ac9456a0-a4df-4a4a-a01e-3c61afc49e3f)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - cd4a97d0-ea15-4063-a59b-cdd00067da43)(label(:))(mold((out \ + 2042021f-8855-4b02-a0bc-2e0b97717108)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 25a37cea-d563-425d-9376-a25f60abf27d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6d39e6e7-ac05-4bab-8ef2-c3e1f260aef6)(content(Whitespace\" \ - \"))))(Grout((id 066892cc-dfc1-45bd-8f37-fed4afed1097)(shape \ - Convex)))(Tile((id \ - 78d7d760-6c93-4534-a1d9-f95c02de8c87)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + 0a812609-dea7-4f7d-af3a-e1ee023ce806)(content(Whitespace\" \ + \"))))(Tile((id \ + b1c10962-4a74-423e-8097-7589d7ca18ef)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 84dad8ea-8e76-4145-98cf-e8ac1720e2bc)(content(Whitespace\" \ + \"))))(Tile((id \ + 3c048fd3-81d3-4b96-9508-74eee76c9bf5)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 5f1d6a94-de73-4914-a521-cb718d275a54)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3853,8 +3725,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ 21e4563f-b90c-4e2d-9c5e-4f113b210207)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4205826b-a066-481f-9870-987bd9896244)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ cee321fa-2443-4038-a148-61a759151c2b)(label(let = \ @@ -3863,21 +3735,23 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ a8a4d5ee-d14f-4435-bdc8-c03d5c572e08)(content(Whitespace\" \ \"))))(Tile((id \ - 69615ff1-dcc7-4b9f-940a-a00c8b8d24a9)(label(f))(mold((out \ + ab5c9b8f-4cd8-47bd-ad7b-896e127394e5)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - d6cd7db1-8308-4874-8ff1-d6907319e7c4)(label(:))(mold((out \ + c57bdcda-7c9d-42da-8bf0-a017399dea55)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 431d66e3-2e57-4a64-9024-31dedc02084e)(content(Whitespace\" \ - \"))))(Secondary((id \ - e2105f87-fa3d-44cf-b18a-cc9eafd83d00)(content(Whitespace\" \ - \"))))(Grout((id 64a9f0b2-3518-4d6a-9c82-d2fe9551e04c)(shape \ - Convex)))(Tile((id \ - b964ec13-f861-4525-bca0-51a2fc701d3c)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + 3450d3eb-af8f-4fa5-ac4d-8251ffe96db5)(content(Whitespace\" \ + \"))))(Tile((id \ + cb3bebfd-611f-4f89-aca6-48289afa5c69)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 014406c2-02dd-4aee-acaa-8f2899602fc5)(content(Whitespace\" \ + \"))))(Tile((id \ + 8839ec01-9b9c-43ed-8f6a-c9db60caec52)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 3cf0d400-0787-4327-b46a-7180d93d129c)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3900,18 +3774,13 @@ let startup : PersistentData.t = 9a3fccf7-bb56-4d6a-aa7a-9fb7b7735be9)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 5c73e3f5-e5d4-4374-82e2-39159cd14b0a)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2625294e-7343-4fa6-8efa-e8492aca2192)(content(Whitespace\" \ + \"))))(Tile((id \ + c15d7c3e-bf3e-44da-8997-2afc9a4ee9a5)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 2ee1898a-0e53-46fd-8c8e-38e670fdd897)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4109f53a-51e6-4eb8-ade2-ec96623ace12)(content(Whitespace\" \ - \"))))(Secondary((id \ - 58d0de2b-8d5c-40cf-b5b4-7306a8adb70e)(content(Whitespace\" \ - \"))))(Secondary((id \ - df586f74-1e98-4b51-a367-a3ad8866f8b6)(content(Whitespace\" \ - \"))))(Secondary((id \ - 13451dc7-126c-4dd7-a809-4de4aeb373b2)(content(Whitespace\" \ \")))))))))(Secondary((id \ cf2250a8-a2b1-4f6c-977f-3614e6b8915d)(content(Whitespace\" \ \"))))(Tile((id \ @@ -3955,8 +3824,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ b1bf835a-595d-4097-90ba-27001a850978)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 3aafdf26-ef40-4068-85d9-f27d95ef2621)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 1abb53f5-ad2b-474d-8c52-4fc4f1d7fd6a)(label(let = \ @@ -3965,21 +3834,23 @@ let startup : PersistentData.t = 2))(children(((Secondary((id \ 5188bb35-71ce-4a97-bde0-e7c7af9ecbdf)(content(Whitespace\" \ \"))))(Tile((id \ - 7926d935-cd9d-4e6a-a353-502f45d51642)(label(f))(mold((out \ + 0ae1b856-b7b8-4294-8cea-51ebd49ac543)(label(f))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 1b599c7f-d95d-41f3-9aba-6836d9c6ee1d)(label(:))(mold((out \ + 7a888086-5e3c-44a1-afa5-b071561256f7)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - ab673bb9-a1a3-4d8e-b626-0316fc513c69)(content(Whitespace\" \ - \"))))(Secondary((id \ - e1119c84-f258-4ead-b463-52b649d3db2f)(content(Whitespace\" \ - \"))))(Grout((id fccd8138-9d93-4fc0-9415-115d430d1f7f)(shape \ - Convex)))(Tile((id \ - c0e6e685-585c-4d8e-a441-19570c52bb30)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + f8a7feb1-35ea-420e-82a0-ab43d55262b5)(content(Whitespace\" \ + \"))))(Tile((id \ + 127ac2ba-9dc6-4a90-b232-e69d258d94ad)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 408eba72-bae5-4791-96fe-3aa8415131df)(content(Whitespace\" \ + \"))))(Tile((id \ + 5c37f8d8-046b-442f-b258-3f010c032b77)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 7714e2f8-31d4-46ad-8346-4a47913e9f37)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4052,8 +3923,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ b5b3f373-ffb6-4353-89bc-934c4c890136)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ ab179275-22b6-4232-a44e-2c0e3c044bc8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 5f555c1f-ff3c-485b-9c47-514ee5f9d4ba)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ @@ -4129,8 +4000,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 2efb5f7f-eece-4042-ae3e-86b8417c643a)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 0ceef89a-c47f-4b07-a58d-7268b8b11f6f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 21af2be8-1468-43e1-bc58-0e103ff4a70c)(label(let = \ @@ -4159,9 +4030,11 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7c0780bd-651e-4324-8eb7-b3c824076241)(content(Whitespace\" \ - \"))))(Grout((id 2fca0530-56b3-4917-ac7e-a79ed934923e)(shape \ - Convex)))(Tile((id \ + e90819b1-7393-495c-a509-9bf0d646fa01)(content(Whitespace\" \ + \"))))(Tile((id \ + d32ee69b-6b2d-4f5a-8bac-0ff4ade92fdd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 1e2e65a3-81da-4de1-8eaf-8c7529d36556)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -4214,8 +4087,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 3508ff9c-84c8-4f0c-8f66-b0bd05fcb640)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ c9b1ef3b-5b9b-495e-9f82-a67443c39051)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ a5474569-9485-4402-ba63-ee8df3f8a489)(label(let = \ @@ -4299,8 +4172,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 43038ffb-081a-4011-9594-ede00e3f4958)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ a91c2cb6-4a1a-480b-ae2d-d9c8f6d4f10f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 76a63418-74bb-4235-821e-0b41e8dd5274)(label(let = \ @@ -4352,17 +4225,13 @@ let startup : PersistentData.t = 721ff006-dad0-4010-bde6-e9d592c91227)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 0a2bd9e5-66e7-43b7-84e5-fca00b91d825)(shape \ - Convex)))(Secondary((id \ - 78e2aacd-3c06-4335-a5f6-1749e67d79b7)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8eef25c7-6b9e-456b-9a21-c1d99d59f0bb)(content(Whitespace\" \ - \"))))(Secondary((id \ - 02493026-d109-4923-8110-37417a520ae9)(content(Whitespace\" \ - \"))))(Secondary((id \ - fe0c91b3-96b2-4203-bb6a-2a4bb29a990e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 68624def-48c6-45c8-bb9c-1f846819dde8)(content(Whitespace\" \ + \"))))(Tile((id \ + 20623eba-2cda-413a-8c58-1fa4399cea17)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 2566dfae-edd4-4ffe-80a4-56968a475285)(content(Whitespace\" \ \")))))))))(Secondary((id \ 52609218-3a2a-4dfd-8f40-0ae4e783a13a)(content(Whitespace\" \ @@ -4404,8 +4273,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ a40df762-a8b8-428c-83ac-0ec6b8cab1d8)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ a3dd9552-89c8-482f-8c6d-8b4cc77e1687)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ ebf4c810-7207-451f-a1fc-8c7dfb7a941e)(label(let = \ @@ -4420,18 +4289,13 @@ let startup : PersistentData.t = b22cfa0c-f400-4401-9cf6-72815348b350)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 42374115-3428-4e0a-beb9-e31e89b0b4e6)(shape \ - Convex)))(Secondary((id \ - c23b6ae7-ea8c-491b-add8-2eb5ca47141f)(content(Whitespace\" \ - \"))))(Secondary((id \ - fe25ea13-0cdc-4ce5-906f-a844878aeec9)(content(Whitespace\" \ - \"))))(Secondary((id \ - b190d877-da10-4e10-8a31-e3d8bf33c294)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2dbe94e4-db24-4c13-a5f0-b68e28fde039)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3d63a36b-5d26-4d0f-abe9-a58147d417a6)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 922b9ec9-9048-438c-b763-dbcc0f0d9bc5)(content(Whitespace\" \ + \"))))(Tile((id \ + fb0a5657-3ebb-498f-81d1-d6a49c21382a)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + e88ccac9-5c7e-465a-8352-c440c1948a24)(content(Whitespace\" \ \")))))((Secondary((id \ 7b732b12-0b14-4aaf-9f1f-b74b9ffc2d2f)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4494,8 +4358,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ e185d3b6-73bc-44e6-b252-c688f844855a)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 2b1f34b8-5a8d-40d4-acd3-b5c0d7f3f520)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 8667d8c0-adfa-405b-9da1-5f703ef0a4fb)(label(let = \ @@ -4510,18 +4374,13 @@ let startup : PersistentData.t = 4d6b24f4-e671-44af-8f93-e57285d8cd72)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 5596a196-aaac-4af3-b3db-dbb7b06531fc)(shape \ - Convex)))(Secondary((id \ - 908cede4-8d2a-4d92-a2b1-bcd00555ded5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8acc3954-9c5a-410e-9b37-3efca660b6ae)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4f01b693-e232-4784-a7b5-0850f2f91584)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6ec3e612-7695-4c0d-afa7-aa9c415fa765)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0728b94b-8098-4974-9bbe-72f1a1471b2c)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 248638bf-01e8-48b0-974b-a95cac9fe3e8)(content(Whitespace\" \ + \"))))(Tile((id \ + 38b3e39e-bd0f-43ef-acb8-819b06a70b92)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 6c4024cd-2e5b-403b-9526-cbdd6541af54)(content(Whitespace\" \ \")))))((Secondary((id \ 44eb6358-ca32-4982-9ff1-4c32ebc3ed0a)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4539,8 +4398,12 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ bf609873-bca2-4b7d-a177-2161e68345ac)(content(Whitespace\" \ - \"))))(Grout((id 0548ec7a-014e-4439-859c-e2310dcd63d7)(shape \ - Convex)))(Tile((id \ + \"))))(Secondary((id \ + d03e9b31-6164-4e7d-92f5-cfae09c720b4)(content(Whitespace\" \ + \"))))(Tile((id \ + 3fc47261-10c6-470c-91ad-2f7b04fbcbf4)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 8dc4e8f5-4f89-418d-bed7-967bb6611d59)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -4593,8 +4456,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 266cf2d9-ddca-4fdf-aae5-8ce12ddca4b0)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 3fe35443-0e62-4b24-88e5-f750b4aad0ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7aac6064-64b6-4e06-99c6-487a152c14a9)(label(let = \ @@ -4609,18 +4472,13 @@ let startup : PersistentData.t = 568ccf78-b847-4ac7-bbb5-a9bd7b19e077)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - d33cbb82-586f-4971-a4a5-042338dd1d99)(shape \ - Convex)))(Secondary((id \ - 29e9a2ff-0aba-4b44-a89a-dd903bd893d8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 79b615b7-8131-4d46-825c-b66024126adf)(content(Whitespace\" \ - \"))))(Secondary((id \ - fc364ba9-e446-4675-95a7-d3656f5c564e)(content(Whitespace\" \ - \"))))(Secondary((id \ - e43fb7fb-d82c-4d1d-a335-371ff03bbec4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4a8177de-7020-497e-b5c0-81f50bac2ed3)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 5040036b-e561-42dd-887a-c7d4fbd5f55c)(content(Whitespace\" \ + \"))))(Tile((id \ + 42e92110-d918-41d5-83d3-e60a335946bc)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 8d5e246c-1cbb-4271-a185-9f3a60ddcc12)(content(Whitespace\" \ \")))))((Secondary((id \ 09dc5081-5c6d-4b8b-b376-2a009458d5d4)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4692,8 +4550,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 235f8bc3-e437-402e-85b4-7771adb8778e)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 30d18eac-2393-47ed-9358-bdefc31e58e6)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 4780eb65-8f0e-4a67-bab8-107f251ae3f1)(label(let = \ @@ -4708,18 +4566,13 @@ let startup : PersistentData.t = f9aaed1a-dc5e-4306-bcba-869a3725b6ee)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - c553e28a-d12b-4915-8f9b-6bfc8b8c4a57)(shape \ - Convex)))(Secondary((id \ - cc0b1d4a-abe5-4924-9ae2-e3b0629e3f89)(content(Whitespace\" \ - \"))))(Secondary((id \ - 74a71cc7-8510-438d-b27f-7cebab161836)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2e12ed36-f19c-4e9c-b9f5-e529c13b470e)(content(Whitespace\" \ - \"))))(Secondary((id \ - cf52f316-7e6f-41cd-94ca-8d0a82248baf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6ef7a264-d389-4009-8435-2cc4470c931c)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 9cc431fb-b855-4794-b524-c477c0d9aadd)(content(Whitespace\" \ + \"))))(Tile((id \ + c78cd1f1-2e8c-48e2-9f2e-3adcf55f9768)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 321eac64-1c4f-43a1-b76f-06ac833a5a73)(content(Whitespace\" \ \")))))((Secondary((id \ c0a5a1df-825b-49e0-ac29-c186dc016512)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4759,17 +4612,13 @@ let startup : PersistentData.t = fa29e80b-ee90-4ca7-8887-96d4dad7e206)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 4ee5945a-6712-4749-b669-68ad80cacb1a)(shape \ - Convex)))(Secondary((id \ - 7202df72-9810-447d-9097-58e0915f2533)(content(Whitespace\" \ - \"))))(Secondary((id \ - 53c0d272-049c-4c9a-b2fa-521a2ece62ed)(content(Whitespace\" \ - \"))))(Secondary((id \ - d8603266-973f-4524-9006-6f14a62197e2)(content(Whitespace\" \ - \"))))(Secondary((id \ - fba650fc-ee5a-42ad-884d-7e121466d566)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 7709b111-a6f6-4879-9e99-5441ab2571ca)(content(Whitespace\" \ + \"))))(Tile((id \ + d935b558-7c35-46ba-8ec7-58d61f343648)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 973270cb-406f-4118-885e-204c4574a814)(content(Whitespace\" \ \")))))))))(Secondary((id \ 1656182a-3530-4fad-b7af-19adeb223861)(content(Whitespace\" \ @@ -4811,8 +4660,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 91c71496-e60d-4e86-82c0-5f0e8d875382)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ b29c15d6-e2e2-496e-9c3d-ae025d33a239)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 9daa0d58-3873-40e3-94f5-35732774bcd3)(label(let = \ @@ -4828,26 +4677,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 327e1af8-43e9-4d09-a9ce-92b25b1e828d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5bfb47cd-051d-4eb2-8e89-b4fe353b5224)(content(Whitespace\" \ - \"))))(Grout((id 37a657ca-67bf-431a-b585-683b8696a621)(shape \ - Convex)))(Tile((id \ + 31d43ab2-3fdf-497c-a6b4-41f7a796085b)(content(Whitespace\" \ + \"))))(Tile((id \ + 810c4be4-6469-49b8-9415-7bc6938a7bad)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 9c7b8ecf-a1a2-4c06-a36d-7b5dfcba096a)(content(Whitespace\" \ + \"))))(Tile((id \ 5fce45d1-4122-42c2-a799-a65bc416d8e3)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 003d5f89-103d-447d-8c60-cb98613a5ab0)(shape \ - Convex)))(Secondary((id \ - 333d1e3a-133d-4a9e-baa6-ad2a1a29599c)(content(Whitespace\" \ - \"))))(Secondary((id \ - c0d31cab-4498-4314-b924-fd98d6d22d92)(content(Whitespace\" \ - \"))))(Secondary((id \ - 479154a5-c1c6-4db7-893d-f31993628e79)(content(Whitespace\" \ - \"))))(Secondary((id \ - 09625be9-cf5b-4685-ad06-82440dc9a17a)(content(Whitespace\" \ - \"))))(Secondary((id \ - c2d6e30a-443b-41a7-b9f6-d446b4c3adc6)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 04201a4b-4a9c-44cc-b345-52c52304caa6)(content(Whitespace\" \ + \"))))(Tile((id \ + d5781b3a-a856-49dc-940c-2300f377cdcd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 3c58a8ab-71b8-4d3f-bf5b-1f1297ce4581)(content(Whitespace\" \ \")))))((Secondary((id \ 9f0d4a23-cc87-4332-8e8f-cec5fa3fc45d)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4910,8 +4756,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ fc3577dc-45a5-4c31-a027-091beae08b06)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 32e0f96a-c442-478b-80d1-0823411a57a3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 7d3171f1-f0fd-47ba-917d-0c00f109962c)(label(let = \ @@ -4927,26 +4773,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 7d6464f1-c86d-4003-be14-9a597d6aac37)(content(Whitespace\" \ - \"))))(Secondary((id \ - d5c969e0-6792-431e-b074-8827826108f2)(content(Whitespace\" \ - \"))))(Grout((id 5991e71b-b4b1-4482-9784-ae273a6102e4)(shape \ - Convex)))(Tile((id \ + a5ce904d-687c-4c40-9557-83d581fa8645)(content(Whitespace\" \ + \"))))(Tile((id \ + 4ac34072-e313-4591-b660-02ec83bdd182)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c4d930e3-2153-4558-aac4-272b881ba1ce)(content(Whitespace\" \ + \"))))(Tile((id \ 6a81dc28-84d9-41a5-a122-27e7d6d2dc4a)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7cd82c1f-9951-486c-aece-5537007ede80)(shape \ - Convex)))(Secondary((id \ - fbe47a62-a6e7-4580-a7c2-ee6c516e044d)(content(Whitespace\" \ - \"))))(Secondary((id \ - a4f58f66-1aac-4a3a-866e-260f6b8c3020)(content(Whitespace\" \ - \"))))(Secondary((id \ - 468c830a-f36a-41d3-bca0-d5e203cfd9f9)(content(Whitespace\" \ - \"))))(Secondary((id \ - a40f53f5-9dd4-4a15-9fd0-44d9e83e79b1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 29e4a103-847a-445c-82b6-52f6c54ad7da)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c424dc63-fc09-4504-bdb4-99a9ba65bf91)(content(Whitespace\" \ + \"))))(Tile((id \ + d78e2dd4-ed3b-4412-944c-23e702be7034)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 0d350bb5-3fbb-4cb6-ae79-670c92b1e235)(content(Whitespace\" \ \")))))((Secondary((id \ 917381e3-6d3b-4275-8e13-9ebdde15ae75)(content(Whitespace\" \ \"))))(Tile((id \ @@ -4964,10 +4807,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 8ff2c6ec-1259-4d1d-a73f-069dc7176a60)(content(Whitespace\" \ - \"))))(Secondary((id \ - f7ca66de-f307-45bf-b733-6a27598bd228)(content(Whitespace\" \ - \"))))(Grout((id 5222d1eb-91a0-40a5-8374-4362ec54269e)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + a0bffd21-7c6e-4aa0-9bbe-92d42b9526b4)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ fa65330c-032c-4bdc-be72-60d2c19c5515)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -5020,8 +4863,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 22583b1d-a3dc-4cc1-a660-1474e6cf0172)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 913e9b67-b810-4f88-9542-c93baf9535e7)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ f0c54c7e-e7ed-4f1b-8a2f-0e0ae502cb8f)(label(let = \ @@ -5037,26 +4880,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 53a7580f-36d0-44fd-88a0-a946f408724e)(content(Whitespace\" \ - \"))))(Secondary((id \ - fc19cda9-5518-4a30-b7b4-691cb41bb0a9)(content(Whitespace\" \ - \"))))(Grout((id 0ed4e28a-96e6-47fa-a873-0ce1a7ca41bc)(shape \ - Convex)))(Tile((id \ + 0eafd477-2595-4374-8ce2-dabe0cf00c47)(content(Whitespace\" \ + \"))))(Tile((id \ + 2d83c80d-076a-4d2c-830b-5c996ea46e64)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 0bd5d294-03f8-4a7a-953d-d66fcdf542de)(content(Whitespace\" \ + \"))))(Tile((id \ 74f87761-a327-4d21-844e-2cc249a3e722)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - b996df8d-2912-4ea7-8b22-9f57a4e84ec3)(shape \ - Convex)))(Secondary((id \ - 17d920d2-a18b-43b3-a1ba-90bd3c7d2001)(content(Whitespace\" \ - \"))))(Secondary((id \ - b87f7dae-6fe9-49b5-b1d7-791876b5d2d8)(content(Whitespace\" \ - \"))))(Secondary((id \ - cf2cf415-6e87-46bf-bd01-62b7247eab78)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3421cc3a-ae54-4fb6-b641-5243bd1235f6)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9d5550b8-33e8-4d15-9a36-25500b9c3c0d)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + af55299c-11eb-4104-8a7c-db502b572d66)(content(Whitespace\" \ + \"))))(Tile((id \ + 78fa88f9-d0cb-4d36-adf9-1377897f3b64)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c39ae7f9-7aab-45dd-88db-f98605040197)(content(Whitespace\" \ \")))))((Secondary((id \ 38123bbf-a8c5-4134-8127-e7099abfad6d)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5128,8 +4968,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 395ff835-cd43-4f7e-804a-8f7751d883c6)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 3822a97c-909e-4e0f-9783-aa511ae2e4be)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ dbc95f6f-0dac-413b-9a57-875c91d1bc19)(label(let = \ @@ -5145,26 +4985,23 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 870ec8b2-886e-42ec-a35a-efd1ecc926ce)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4ef72b5a-1f48-41d1-9c08-e4726c798517)(content(Whitespace\" \ - \"))))(Grout((id 1de99ca5-1fcd-4073-a10c-b0bbb595db3b)(shape \ - Convex)))(Tile((id \ + 849c5444-d52d-407b-a91a-78ecd49eaec7)(content(Whitespace\" \ + \"))))(Tile((id \ + d99c9e74-3821-438c-8a00-2990985f1b27)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + f23c1d14-e2c2-45b8-a766-af783330ef62)(content(Whitespace\" \ + \"))))(Tile((id \ 3254d589-fc8c-44bd-af59-b32f30bf2194)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 802da816-8705-4c69-b8ad-10e81ab6d78e)(shape \ - Convex)))(Secondary((id \ - 28b6de81-ebd9-49a3-8e14-f7ad344fe62a)(content(Whitespace\" \ - \"))))(Secondary((id \ - d2866f2b-fb55-4a40-b3f6-c0e1985552a4)(content(Whitespace\" \ - \"))))(Secondary((id \ - a51a2228-de9b-48f1-83a5-7cf73dc96f6c)(content(Whitespace\" \ - \"))))(Secondary((id \ - cf7a673a-7e78-43fd-a753-9c1a93382419)(content(Whitespace\" \ - \"))))(Secondary((id \ - 51870ac0-3cbd-4f8b-8f9c-0aefe4224d1a)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 00c77afb-bc00-49a8-8e14-8b24e92793b3)(content(Whitespace\" \ + \"))))(Tile((id \ + cbcd2b8f-95e4-431c-853e-1bd3ebc0c0bd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + d9b539b4-0ed0-4ce0-a3c4-7c796959d9b2)(content(Whitespace\" \ \")))))((Secondary((id \ 005e18cc-6749-4a8d-85f5-513cf98bcbf1)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5204,17 +5041,13 @@ let startup : PersistentData.t = 58d2c431-0b68-485f-9fa5-3fbf8823a165)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - e06415ce-d4ab-499d-ae69-a6e703a8cfdb)(shape \ - Convex)))(Secondary((id \ - f6a37369-b94e-436a-8e0d-4c9252b3301b)(content(Whitespace\" \ - \"))))(Secondary((id \ - f1cb0bef-e154-49e4-afd3-af4d1b9d40b4)(content(Whitespace\" \ - \"))))(Secondary((id \ - ef3492bf-4a17-47b4-80a9-c3830ce5ee6d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 482b5e91-502e-4c58-b4c1-3cbb5a938642)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + b8d97744-b2d7-43d6-a0e0-4cb376efb927)(content(Whitespace\" \ + \"))))(Tile((id \ + 8e3dd6c0-0cd8-4006-a23d-ac23094f5564)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 6cfb4cb5-8066-4a65-b197-b4155ba475f8)(content(Whitespace\" \ \")))))))))(Secondary((id \ e547925e-3719-4132-a268-711329c13791)(content(Whitespace\" \ @@ -5256,8 +5089,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ bb0c1e89-3047-414b-b445-dd343fe3f874)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ e0011fca-0dfd-4ec7-a74f-0d8a3cdb2eff)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 0a16c719-e6b8-4ae8-8602-074ee1ce69f6)(label(let = \ @@ -5277,40 +5110,32 @@ let startup : PersistentData.t = \"))))(Tile((id \ e9d13a71-fd23-4b27-a9e9-d5a395ce52d8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 52eab2a5-dd03-4361-b914-9c6ed6fb05e1)(shape \ - Convex)))(Tile((id \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 3e809ff9-9891-4c99-a3d1-573f52645e17)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ da2dccb5-7ad0-4606-9e5b-24011989db77)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7c1c45ff-5fad-4ba5-b5ae-85f245d8c58e)(shape \ - Convex)))(Secondary((id \ - ab0a9027-fc24-4ca9-8b7f-5898fa85bdba)(content(Whitespace\" \ - \"))))(Secondary((id \ - d6f818d4-12ab-4e67-ab8d-93f1fbc63c0e)(content(Whitespace\" \ - \"))))(Secondary((id \ - b365e442-ce2f-4881-98d0-1b4026046238)(content(Whitespace\" \ - \"))))(Secondary((id \ - 85ce8539-faf3-48b1-a5ff-af55970e644c)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c86d66f4-84b5-4250-b8ec-f48697881277)(content(Whitespace\" \ + \"))))(Tile((id \ + 0d86b99c-4cd2-4db8-bb41-fa737b3b8098)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ b4431d08-0ed8-4bc4-8e01-83476e937af1)(content(Whitespace\" \ \"))))(Tile((id \ 776b88a1-6a5e-4c61-bfee-61b48058cb19)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - ed55839d-6dc1-4f04-8664-17a5cf5f7644)(shape \ - Convex)))(Secondary((id \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 9bba64e9-2c26-4c96-b5b3-661db6e4bac9)(content(Whitespace\" \ + \"))))(Tile((id \ + f7cd4a7e-d29d-4758-863a-8d1f40db78b3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 794f9424-8d84-4c66-8436-da7e719d51cf)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9e35d395-af06-4e46-b702-695394335802)(content(Whitespace\" \ - \"))))(Secondary((id \ - ba13bb65-b990-43fc-bef8-4a54908611d0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4a0c3966-55c4-490b-a893-a0ab692bd113)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3c2f3ae2-6252-4faf-b153-ebddd32605a6)(content(Whitespace\" \ \")))))((Secondary((id \ a23ce396-a5e1-49e1-8344-a2fb1fcee0dc)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5373,8 +5198,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 6b955a59-ba44-4b65-99c1-1418fb72ef21)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 954c6c0f-e515-4725-808b-2f4220144f8c)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 741f0667-79a0-4c27-bd96-bbea5a774a54)(label(let = \ @@ -5392,42 +5217,34 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ d3470c02-0b2b-43cf-bdfc-25ea54aac84f)(content(Whitespace\" \ \"))))(Tile((id \ - 47f24a67-fc77-4416-91ac-d211e6490e28)(label(\"(\"\")\"))(mold((out \ + 86d8bc13-4d1c-44d8-9f74-a523ca09d63c)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 72803098-a0f1-411e-a6cb-9d1b1c25b8a2)(shape \ - Convex)))(Tile((id \ - 0dba3d2a-ec6d-4f24-81ab-386ef5224508)(label(,))(mold((out \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + da203b49-ec57-48ec-883f-66907d129de3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + d48ad174-a0c6-45e0-b006-25be499197cd)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - b91b91be-7cd8-413e-b8e5-11c9efb23b15)(shape \ - Convex)))(Secondary((id \ - 4e08ce96-0ea2-4a03-8d8c-3faa133cfcad)(content(Whitespace\" \ - \"))))(Secondary((id \ - fcf2f592-3e3d-470e-aba3-f554bad5356b)(content(Whitespace\" \ - \"))))(Secondary((id \ - ebd88262-8e27-48f9-acf3-b6db69ad9588)(content(Whitespace\" \ - \"))))(Secondary((id \ - f66b9c8d-019c-4a90-9743-7fe7134e7d06)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a9d5ea5e-2fd7-4231-8811-cffb5f1211a9)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 76528446-265a-4f6c-bda3-7bdee9f7ffa1)(content(Whitespace\" \ \"))))(Tile((id \ - 4a11b5ae-5814-4b5f-806d-fe716d6cd067)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - fe02e4f1-7076-466e-91be-c6171bd1c719)(shape \ - Convex)))(Secondary((id \ - 0fea00fd-2a8e-401f-bd2e-0ec7d68ef841)(content(Whitespace\" \ - \"))))(Secondary((id \ - efa5207b-754c-4739-87c3-db220c259c2e)(content(Whitespace\" \ - \"))))(Secondary((id \ - a6a915cf-6d19-4ad3-a394-5630e091cb36)(content(Whitespace\" \ - \"))))(Secondary((id \ - 488311f0-d58c-4c08-baaf-c5a021605e58)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9af43606-b1ff-4096-96a4-aa061492c9e3)(content(Whitespace\" \ + c1e234b2-70ef-4de7-b98d-fc895acb7dd2)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 54e6d15d-c657-4496-8223-8536938d609a)(content(Whitespace\" \ + \"))))(Tile((id \ + e943d407-db80-472e-90cb-114c35e58969)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 53caf4f7-40d6-44d3-a8b7-e039f221cba8)(content(Whitespace\" \ + \"))))(Tile((id \ + 06707990-cdfe-4aa4-bd7b-c1162c4a4112)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 4ed8f66e-efe9-46a0-ad84-5d342b89034b)(content(Whitespace\" \ \")))))((Secondary((id \ 72286cbc-1586-45ab-acbd-831dcef7356e)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5445,8 +5262,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 1e0e0dae-5435-4a5f-96b8-30ecbd84f935)(content(Whitespace\" \ - \"))))(Grout((id 530afce9-1d03-4fe4-ae88-6a4094d0b1ca)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + 59546d31-22b8-459f-8a9a-153d9a0e4eb1)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 94233aef-7819-4eee-934b-7e7e41136c21)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -5497,8 +5316,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 3ef219e5-fe9a-4c23-aaa4-9f20dc05c015)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 02a2101b-a82e-4cb8-b24a-53d750216c90)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 2f5e8f90-2224-4d16-a860-0c7d00780419)(label(let = \ @@ -5516,42 +5335,34 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 7b153ae1-dcf3-450a-b553-f434c5930837)(content(Whitespace\" \ \"))))(Tile((id \ - c94179c3-10c7-4844-a48c-097655ae0b64)(label(\"(\"\")\"))(mold((out \ + 3a536989-5de0-48bf-ac04-ff566f8638f8)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 2dd4bdf0-376c-447e-87c7-2a763b5d8f87)(shape \ - Convex)))(Tile((id \ - 43a96673-815e-432d-86b0-fc1c73dbf8de)(label(,))(mold((out \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 0cd7bac8-34b0-49a4-a098-b5c71b6349f3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 676531bc-ff4f-40a5-81c0-16b7d027f0e9)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 61e8a84d-5df5-447a-9c4d-cf828feac612)(shape \ - Convex)))(Secondary((id \ - 3c11d380-9576-4ab2-a0e5-6c3669df819e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2c5d1c88-f521-4fbb-bc73-d421471d3a86)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4eb6f941-0f58-4d01-a538-cb6c4fb725ab)(content(Whitespace\" \ - \"))))(Secondary((id \ - d64110ac-2576-4623-be39-9f5e6176008e)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 28054157-7acb-4122-926d-0e95d271f42f)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 0f508fc9-6f42-43e1-8098-873e33df79e6)(content(Whitespace\" \ \"))))(Tile((id \ - 91efc9c5-4a90-4aa2-9264-df0a4cb8628f)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 398b6b51-1a01-4ca5-8edf-b31f0bd1480e)(shape \ - Convex)))(Secondary((id \ - 77d30d19-18d0-48f0-8682-132d5a445b24)(content(Whitespace\" \ - \"))))(Secondary((id \ - 34975782-36b1-41e5-9746-eea1fbc1ea12)(content(Whitespace\" \ - \"))))(Secondary((id \ - cebbb640-3c46-47b5-a4df-1101c9a4b76a)(content(Whitespace\" \ - \"))))(Secondary((id \ - e67262c9-9e7b-44cd-8886-0a7cbb291e59)(content(Whitespace\" \ - \"))))(Secondary((id \ - 533d408c-e58c-4473-980a-5b930cd01d33)(content(Whitespace\" \ + 48b8b67b-fcb4-4c51-824a-b835f38dd563)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 7bcff800-5950-4388-ac86-3dd35ba91aa5)(content(Whitespace\" \ + \"))))(Tile((id \ + 73998d82-f3cf-4b57-82b0-5f863ec75a37)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + ac690e38-efaa-40ca-92ca-6d886b0ad0af)(content(Whitespace\" \ + \"))))(Tile((id \ + e689edd7-c1b2-4a19-83ce-96083ef41241)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + c17d167e-66ab-4d55-9c8f-f02f1174147d)(content(Whitespace\" \ \")))))((Secondary((id \ 354edd89-4de1-4cb3-a062-5cbcc62faded)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5623,8 +5434,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 65ecec74-10b5-4d65-9d07-547469eebbbd)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ b2c53c9e-6b7d-40e3-ad2d-9b52e1629baf)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 0cd2dc3e-b0e1-4e8f-befb-f8c713347207)(label(let = \ @@ -5644,40 +5455,32 @@ let startup : PersistentData.t = \"))))(Tile((id \ 64dd32f3-466a-45d3-8a9d-416d49c7c47e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 41425a49-b7d3-426a-9882-74e3c0b846fb)(shape \ - Convex)))(Tile((id \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + d74d4b0c-ce2b-44ef-83ff-143918d607bb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 00c4e1ae-f97c-4dc8-8a34-2880447762e6)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 0406f8f9-debe-4e45-a39e-5d128ac393af)(shape \ - Convex)))(Secondary((id \ - b7f7e12f-849b-4fc1-b120-4617cb2cadb2)(content(Whitespace\" \ - \"))))(Secondary((id \ - 278b8ffd-0809-4c03-9439-06a1aba32af0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5612c8d4-cfdc-4948-8755-950eed970985)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7dd5bdbf-94e3-4f07-a5d2-7e36a73ba077)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 051317d4-7a19-40b5-ab5b-480bc2189611)(content(Whitespace\" \ + \"))))(Tile((id \ + 64c5f634-8dbc-4e96-86fc-aa459e60a7e4)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ f72f09a2-4927-4efa-aef0-e607f7395640)(content(Whitespace\" \ \"))))(Tile((id \ 6f2156c2-f276-4f03-98f4-fb329a4aa303)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - e75c67fa-82f4-4b67-a9e4-a7d3df3cebf9)(shape \ - Convex)))(Secondary((id \ - 3aa18005-afad-47ee-8597-4b92f321ffc0)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9bcebaa5-27f2-42a7-a67f-864f9ffb62ff)(content(Whitespace\" \ - \"))))(Secondary((id \ - cdea2b41-b80f-480b-9f3c-a089656829ee)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3d2865f8-2ec2-4e64-9a6b-3dbd8a2fc507)(content(Whitespace\" \ - \"))))(Secondary((id \ - 31f299a1-0bd3-435e-abda-5f6e01b727c3)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a4056e5b-d4ae-4f43-adec-8b10b535403d)(content(Whitespace\" \ + \"))))(Tile((id \ + ee11d786-4484-49b4-abad-35c0ae7313fb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 1f580963-ebca-4c1d-ac42-8d6a8f0f23a8)(content(Whitespace\" \ \")))))((Secondary((id \ 67e2966b-fdf7-41ba-b8b1-a08a2a357889)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5708,26 +5511,22 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 5105f7c4-b37b-4830-b60a-8074fd6e6679)(content(Whitespace\" \ \"))))(Tile((id \ - 500203e4-409b-4b08-baa8-502a0a7079d0)(label(\"(\"\")\"))(mold((out \ + 916b59a6-7696-4c2b-8401-7a096d90377a)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 480c4fca-47b4-45aa-9f0e-c07d191ee6b1)(label(Int))(mold((out \ + d153adf1-31c6-4bde-8248-e8aa30b6d5bd)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - df2b07d9-36a6-4bd9-a14f-4558066cde5a)(label(,))(mold((out \ + d4b4cfe7-fa85-44e0-82e3-ad28e9b01562)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - f9601b2b-1d04-4f90-8b5d-439a2ee32da5)(shape \ - Convex)))(Secondary((id \ - 8a6f8329-d817-47df-88f4-976c226c1d3a)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0bd21b6b-cfdc-4d45-85a5-130e16ed40f2)(content(Whitespace\" \ - \"))))(Secondary((id \ - ea5d9586-89fc-42b8-8bf3-6af88a2f3a61)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8829156b-02f6-400a-a14e-21d09bd60a72)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 069aa331-8134-41ef-96fd-04218183a31e)(content(Whitespace\" \ + \"))))(Tile((id \ + d52e2889-7799-4cb8-b089-dfe46a94a1dd)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 97627ef0-8e55-449c-a860-31b892a436ff)(content(Whitespace\" \ \")))))))))(Secondary((id \ 0ce934a9-0108-43fa-9ae7-dd73215f01e3)(content(Whitespace\" \ @@ -5769,8 +5568,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 98605f14-241b-41b1-ad67-5795c7a108f0)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 376a93e5-d19e-46fe-97a1-75092092e4f8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 23838c85-4434-427c-bbf6-ad7216161cae)(label(let = \ @@ -5797,34 +5596,25 @@ let startup : PersistentData.t = 3f78bcb7-af28-4b2f-9018-374c7035517e)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - dc28a809-ad5f-4b4f-b705-4c6385fb1606)(shape \ - Convex)))(Secondary((id \ - df0b188c-e996-4f96-aeda-979ed61f05b4)(content(Whitespace\" \ - \"))))(Secondary((id \ - ee0383bd-3a94-4e3c-8a65-41b9953e9f74)(content(Whitespace\" \ - \"))))(Secondary((id \ - e1372379-1ea4-4026-bb6c-821f78901b69)(content(Whitespace\" \ - \"))))(Secondary((id \ - 07919393-9019-4470-ad4a-122a3af3fdfa)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + c63464ac-b79b-4269-8530-54cc046de68d)(content(Whitespace\" \ + \"))))(Tile((id \ + 4329b2b6-e7ad-4296-88ac-6005713f8cc5)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 0e68f20e-300f-40ff-ae48-bb60dc210e7e)(content(Whitespace\" \ \"))))(Tile((id \ 32c8ebbb-222e-432f-a69b-79988c6b6913)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - c0b6ed31-5ff6-4f32-8e91-ecd171dfbaa9)(shape \ - Convex)))(Secondary((id \ - 2230b86f-f3f2-41e1-83a9-aa998d43d1da)(content(Whitespace\" \ - \"))))(Secondary((id \ - a22a55df-9c4f-4d51-a547-b80a9eda66a1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 39bd9ece-0a1b-4407-985b-4599d728b730)(content(Whitespace\" \ - \"))))(Secondary((id \ - 71dabf03-7366-4d84-a5a1-456504e56658)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5e3bb7dd-cfeb-4ed8-a618-d59de00c95a2)(content(Whitespace\" \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 2e2be603-d2fb-4ecc-997a-adb69d159cd3)(content(Whitespace\" \ + \"))))(Tile((id \ + bf1f0cef-5c7e-4f51-bbda-f85adecf318e)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 8f5b33e8-8b1d-44d5-8638-9c330744c979)(content(Whitespace\" \ \")))))((Secondary((id \ 4d1a8a7c-79ba-490f-a797-e438b620fa67)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5887,8 +5677,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ a444a690-dd1f-46f0-8b32-673d85a87cfd)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 3c720d05-2dd6-474f-8aef-6c537bc99012)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 1b3c8184-481b-41ed-af13-ecaee014db19)(label(let = \ @@ -5906,43 +5696,34 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 13e0fa19-3bdd-4e2f-aa95-9b0e64c4c4ca)(content(Whitespace\" \ \"))))(Tile((id \ - e0a085b9-f283-4851-a41b-48cc0ae9e1ea)(label(\"(\"\")\"))(mold((out \ + e62e7a04-b4ab-4012-bae2-f736e9069860)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 98e49a14-fe3c-4361-8d32-e265df4593e3)(label(Int))(mold((out \ + 807e8383-0fb4-4ab4-8573-db7379c9a427)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 37e84984-ba15-45b9-9e43-4f56ea4f2e64)(label(,))(mold((out \ + dc8738cf-c053-4b5a-96fc-da5b208201a0)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7706b218-33a2-4467-907c-169311545674)(shape \ - Convex)))(Secondary((id \ - caed6707-0175-4e93-a4f5-f1759b88ffab)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4e7b340f-0ca8-40b0-abcf-6a2c55cf23f8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 97900902-4145-4f7f-8c05-61c29385bf36)(content(Whitespace\" \ - \"))))(Secondary((id \ - 13362c79-231f-4968-8730-8c21ef4804c8)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 77db3bca-6ff9-4602-ba5d-1c4263324260)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + aae82972-a68b-4ac8-8641-a3dff81bfed9)(content(Whitespace\" \ \"))))(Tile((id \ - 86524a59-20d2-4c2b-8e31-73ea1ff21f73)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 5dabd025-9a4a-4b25-b46a-04135f86f38e)(shape \ - Convex)))(Secondary((id \ - 6cc35a0a-db18-4021-9c00-2e849fd14921)(content(Whitespace\" \ - \"))))(Secondary((id \ - 07df44d0-d30d-4127-8eee-8c777ec2295d)(content(Whitespace\" \ - \"))))(Secondary((id \ - aed047df-d10b-4d0d-92e6-dd98d262ee96)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9a58ad54-af4e-44fd-92da-01dc6b9eee1d)(content(Whitespace\" \ - \"))))(Secondary((id \ - c7939a2a-0d12-4c73-9b89-038385098f37)(content(Whitespace\" \ + a5ef2480-3805-4e78-8d27-429423d972b8)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 6e73393c-97e4-4bb4-8b6b-025eb39410ac)(content(Whitespace\" \ + \"))))(Tile((id \ + 09f746b3-e174-4027-b328-f256404e5d07)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 0c86de59-8038-40e5-b224-c9090e7f449b)(content(Whitespace\" \ + \"))))(Tile((id \ + 9e2a96b2-d16e-4e02-bbd4-254037dc6100)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 351e167f-b09b-4c76-bbcf-992cfdc6c9a9)(content(Whitespace\" \ \")))))((Secondary((id \ d9c64d40-e20a-403b-ad8c-39006832a360)(content(Whitespace\" \ \"))))(Tile((id \ @@ -5960,8 +5741,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ c695b1c2-ced5-4122-84fb-5cc028d9d361)(content(Whitespace\" \ - \"))))(Grout((id da1dc92b-8a60-4221-9935-d265ba85c38f)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + dfa59620-e6a9-4077-b9d1-1a4e2ddb714e)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 214ff7f9-27a3-41f1-a3a1-c5d465e3c5f9)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -6014,8 +5797,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4fe2861a-a3b4-41fa-83ee-8214e7390ce0)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ cea6e21d-7c1c-4617-8ca0-f4f26295f1ad)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ c5630b4f-d0cc-4423-b9df-6c2a5d338e84)(label(let = \ @@ -6033,43 +5816,34 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 8203e6a2-b957-49a7-9846-7d0321d6de81)(content(Whitespace\" \ \"))))(Tile((id \ - ec878a97-6eda-499e-a880-b044822f30da)(label(\"(\"\")\"))(mold((out \ + 8fee1d03-c759-4bc4-8f2f-c63312efdf58)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 19e1e0b9-6ce1-4ac2-a627-d41fda0263d4)(label(Int))(mold((out \ + 862b2430-3972-4107-b0d9-4a591e811442)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 94fc3f58-9b9a-4b77-a847-458fadbaf22f)(label(,))(mold((out \ + 2f675e69-419a-471b-a24c-768cdfe9d195)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 9e4ad59c-e695-443a-90aa-0f94a8b98148)(shape \ - Convex)))(Secondary((id \ - bb1e5259-8c9f-46b9-af6d-78fe92c57acd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 926aa843-6b9c-440c-978e-db004471c8a7)(content(Whitespace\" \ - \"))))(Secondary((id \ - b3188b67-8ff6-47f0-86e1-8f710d1a65e3)(content(Whitespace\" \ - \"))))(Secondary((id \ - d2db19fb-9c24-4982-a2bc-eeedb64dd1e3)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - dde093b9-cf10-4e73-a440-7e90dd5c9d90)(content(Whitespace\" \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 3f4de23b-dcb2-4c83-8b92-499167ac65c9)(content(Whitespace\" \ \"))))(Tile((id \ - 04369264-36df-48df-b04a-e126460e18ae)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - a3fd69c5-104e-4ed7-abc6-0757fdda5855)(shape \ - Convex)))(Secondary((id \ - 0ddd36ed-6522-477c-8041-593f86d948e3)(content(Whitespace\" \ - \"))))(Secondary((id \ - 90340f37-26cb-47f3-9393-ec027b3acc4d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1ec31dfb-2da2-42cf-a2f9-8f917f70ec59)(content(Whitespace\" \ - \"))))(Secondary((id \ - a181ec33-4129-4b6f-95f6-8dbfc2bd09e7)(content(Whitespace\" \ - \"))))(Secondary((id \ - 71a83fa2-26d4-43e3-9b27-df38e3f8af10)(content(Whitespace\" \ + 9fceb4b1-bc3d-4a75-840e-3d210eb4c3bf)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + e2a7fc27-64d6-4193-87a0-1a81b005d189)(content(Whitespace\" \ + \"))))(Tile((id \ + a2d90a4d-622f-420f-a01f-604e567a11c1)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + de74e75d-9c88-433d-afce-914ef03f07b7)(content(Whitespace\" \ + \"))))(Tile((id \ + 10ac9c16-ea4a-4595-8a1d-8fdc9afdb13d)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + bffcfa1f-f040-4d33-8a4a-2758d7a4ac9a)(content(Whitespace\" \ \")))))((Secondary((id \ adf7b8e1-aa0c-439a-8191-28d3bb86d59f)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6141,8 +5915,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 4c26285b-99ab-425b-8eb5-e76daf1d0d54)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 7c81343d-3896-40ff-9b94-4fe477cfdcfb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ bc97567d-b5e7-4cbd-8ed9-b977b4202305)(label(let = \ @@ -6158,45 +5932,36 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ - 530c0bde-85f2-47f1-a63c-cdeee2e4d904)(content(Whitespace\" \ + 530c0bde-85f2-47f1-a63c-cdeee2e4d904)(content(Whitespace\" \ + \"))))(Tile((id \ + dba55abd-232c-4612-b620-8169e50591e7)(label(\"(\"\")\"))(mold((out \ + Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 44916c8d-978d-41d2-b474-d3bd7cc91117)(label(Int))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ + 4a19a9fd-2065-4544-824d-000c076f622b)(label(,))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 15))(sort \ + Typ))((shape(Concave 15))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 55a7648e-3dbe-4016-b2c3-964605fcc1e3)(content(Whitespace\" \ + \"))))(Tile((id \ + 9738a782-bfb7-43df-8335-ff637f58f825)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ + 8a4e86bd-016e-4831-ab72-02b5c3a011d6)(content(Whitespace\" \ + \"))))(Tile((id \ + f966a034-25c1-4736-89c7-fe57d129e3f3)(label(->))(mold((out \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e42f3030-e41c-4328-b559-5e79d4241f23)(content(Whitespace\" \ \"))))(Tile((id \ - 964f8a79-4858-4b0a-9d18-351a407b6d13)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - ca16f358-b1a0-46ee-8c4b-e68b7fdab91e)(label(Int))(mold((out \ + 1dfe097a-be5b-45a8-8351-33883acebc2c)(label(?))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 88aca6e4-7e80-4b2e-bcb1-2498d163d22f)(label(,))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 15))(sort \ - Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - b131201e-ad94-4252-bcf2-4bd3abfae44d)(shape \ - Convex)))(Secondary((id \ - 20ab0045-1334-4d84-8137-7cb9e12d10eb)(content(Whitespace\" \ - \"))))(Secondary((id \ - 071cd63d-fd54-479f-a58a-8881ad0ba046)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2911033e-f7ea-426c-b83b-fd304bab2de5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4deb5421-32b0-4857-bdc4-bc0ecd61ead3)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - fb6209e1-3b79-4832-983d-9a284819df7a)(content(Whitespace\" \ - \"))))(Tile((id \ - 98463ed0-2c82-4534-9a88-8ec780d92da1)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - b84f9fe5-fa23-4eb1-bee4-13e7fa696e9e)(shape \ - Convex)))(Secondary((id \ - 0d24b517-6b7c-49e7-82e8-19ad9ec2e2ed)(content(Whitespace\" \ - \"))))(Secondary((id \ - 09c74518-9ee5-4915-bf22-ed5f2f5be7d8)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1ebbdef5-4a32-44d8-953f-c90562371bd9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0a027f6f-7e7b-4326-8a85-af465f0a7420)(content(Whitespace\" \ - \"))))(Secondary((id \ - 00323927-5cf1-4060-bd12-74aa08327cd0)(content(Whitespace\" \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + b93a67ae-2c8f-4c20-9346-0c462298f519)(content(Whitespace\" \ \")))))((Secondary((id \ 6a25cc2a-69cc-4864-a54b-a7764c1676d3)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6227,26 +5992,22 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 30ab007c-c5a6-4d59-99b1-56bac0bb7160)(content(Whitespace\" \ \"))))(Tile((id \ - ad228b99-dc84-43a0-90ed-3aa1b3967a0f)(label(\"(\"\")\"))(mold((out \ + e3c6e770-7a03-4d1f-a8e9-7feae2a10adb)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 81a21b7b-5287-4171-90c8-70391ea8d5d9)(label(Int))(mold((out \ + b37f7679-d081-4ec7-97c6-b049015500c7)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 02a3fa44-e0c8-4aa5-9616-b7d83ba546ec)(label(,))(mold((out \ + b3a36d6f-2523-4a44-a591-49b433fee592)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 591d2a94-e810-48af-8cbf-3197cd72c327)(shape \ - Convex)))(Secondary((id \ - f06af234-1165-493d-b873-b47f5b297dad)(content(Whitespace\" \ - \"))))(Secondary((id \ - d8a9307e-78ec-4d1b-ac51-8668fc6a10af)(content(Whitespace\" \ - \"))))(Secondary((id \ - c171c70f-f9b9-424d-b686-1766708c21a7)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9490824d-3073-4e55-b6ac-e3601f09bd0a)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + b593a8d9-e18d-41d9-9097-0ed1dfe24101)(content(Whitespace\" \ + \"))))(Tile((id \ + 6f8b7845-29d1-4f3f-90ef-4e4044b448d8)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 5a427452-2351-440f-bf7f-0a5ba3f2946c)(content(Whitespace\" \ \")))))))))(Secondary((id \ c5ab0cfd-d873-4b9f-9372-3369a86a25fb)(content(Whitespace\" \ @@ -6288,8 +6049,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ cfcced1d-e9f8-473e-8f80-46e5d60af422)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ f9042aa1-ef31-4dfa-ab93-72eb124c811f)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ b94fc01e-4a92-4ae9-bcb6-e4083f81350b)(label(let = \ @@ -6307,31 +6068,27 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ f9d6db4e-df30-4d88-9b2c-73dbf42b8c61)(content(Whitespace\" \ \"))))(Tile((id \ - 0e2b7ffc-c426-45b7-9b0c-af09166d8f25)(label(\"(\"\")\"))(mold((out \ + 162e2661-8105-4e12-ac58-66021e5d958f)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 7f85d424-2112-4b31-8c3a-6e834736c85d)(label(Int))(mold((out \ + 4c332712-ca44-4cb4-afd4-cdfe5a432b50)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 75e56734-d29c-4516-890d-f962a1f9d267)(label(,))(mold((out \ + 9409dddc-4c29-4a44-b6b4-cb1110246ac9)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 6e2cc051-0193-4716-a53c-c00ae9bb00b9)(shape \ - Convex)))(Secondary((id \ - 810b6986-5a00-4ded-8cf7-6bcee986006d)(content(Whitespace\" \ - \"))))(Secondary((id \ - 14a526c4-340b-4cd1-9ddd-c610df7dfa91)(content(Whitespace\" \ - \"))))(Secondary((id \ - 664ef446-c9a3-45ec-bc98-256d32ac08a5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6e98b565-d231-483a-8dc1-f4793df47b4f)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 01fd3e4c-700c-4c66-a5f1-1337c1d20bbd)(content(Whitespace\" \ + \"))))(Tile((id \ + 39d7039f-2ea3-471d-be75-b46eac839be6)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ e897e0ab-e739-4196-aaef-f309c2e6c87b)(content(Whitespace\" \ \"))))(Tile((id \ 6fef2665-08d4-4fd9-b7af-45b02a4ff70c)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 498f37b3-1be3-4414-95ec-bbf672821622)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6401,8 +6158,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 5471073b-c26c-4631-85c6-e5ace2e10f5f)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ ebc4fcb0-e14c-4cdc-bbd6-72c4124013e5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ a9d79ee8-1272-4310-adbc-d930a3cd5312)(label(let = \ @@ -6420,31 +6177,27 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ dc5f6381-8b71-4359-8379-da4f9686e73e)(content(Whitespace\" \ \"))))(Tile((id \ - c86ef10b-ccf7-4129-a5fb-f49e3484a0c1)(label(\"(\"\")\"))(mold((out \ + 67192a2d-7b66-47a5-9a19-173ffa270e84)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 970851d6-aca2-47ba-971e-1b7e5676f049)(label(Int))(mold((out \ + 7bbe238e-30c4-4032-b5cc-b751f99fe3a0)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 4c6dc8ca-4503-4e33-8cf1-8e3f7689ba8d)(label(,))(mold((out \ + 817ba7d5-6946-4522-84d8-3a143da3e087)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 440d7842-f720-4f15-8168-1b4be6f555aa)(shape \ - Convex)))(Secondary((id \ - 4563b440-4280-4ef4-a76a-5e945581a84e)(content(Whitespace\" \ - \"))))(Secondary((id \ - 42315039-ee3b-41d1-89b5-68d4eeb1f683)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3ccd1d96-1197-4daa-bb31-2d074baa28ac)(content(Whitespace\" \ - \"))))(Secondary((id \ - 135da9e1-5038-461c-8757-b27e0b9834ce)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e8f2b9fb-8129-4644-943e-7da00eae86f5)(content(Whitespace\" \ + \"))))(Tile((id \ + 5c334cb8-937b-4791-91eb-90b2a452ac3c)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 6300e6bb-c002-4c64-939c-32f1d635db62)(content(Whitespace\" \ \"))))(Tile((id \ 3e209554-611c-4b99-adce-f78c142f9678)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 10677ba9-8355-4637-849f-55b0ac355ecb)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6469,8 +6222,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 399b04af-4a93-4d90-9a23-6e064ffaedf1)(content(Whitespace\" \ - \"))))(Grout((id 1baefb26-ff9b-4306-94b1-81362a14b692)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + d8f0975b-c738-4835-b3db-04cf1bf48628)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 73330c4a-f166-4af0-9195-ab12a83b9ed5)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -6523,8 +6278,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 637c43d2-1fea-48ed-88b8-ee598e1bfd2a)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ f5d78c30-4c90-4561-9e6c-538ec0121217)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ f1c6a454-343d-4eb1-a928-8d96eff67dc3)(label(let = \ @@ -6542,31 +6297,27 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 965ba50a-8122-4719-8826-5f71e7f9fb88)(content(Whitespace\" \ \"))))(Tile((id \ - 51e02eb3-bc19-4ba2-b6d1-95dafa2aaef2)(label(\"(\"\")\"))(mold((out \ + 9a6597f7-ff96-416e-9518-505eb5591474)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 7f3bead6-0563-4b15-b1b0-301554a47386)(label(Int))(mold((out \ + 629c3337-c818-4637-91fc-d49038ab4153)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c12282a0-45b8-497b-a1c6-3d4306404484)(label(,))(mold((out \ + 93b277e8-a338-4b0c-bb42-d8311ac8dbfb)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 42fba9f5-0f85-4b25-af9f-90cb591354e5)(shape \ - Convex)))(Secondary((id \ - 1b15a8fa-3e30-462e-8a59-a7c2454e5b64)(content(Whitespace\" \ - \"))))(Secondary((id \ - e281a711-f035-4b03-8be5-2ae31ea86cee)(content(Whitespace\" \ - \"))))(Secondary((id \ - 0e51023b-be8b-4dec-9a24-32e6ea3e0495)(content(Whitespace\" \ - \"))))(Secondary((id \ - a148a37b-022a-4922-a78d-0ee9358e6333)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + faecc857-6573-402e-ba8f-84b59ba2b292)(content(Whitespace\" \ + \"))))(Tile((id \ + ed411ef4-9705-4e3f-a138-e14c8f3d52bb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 6d921357-b093-4504-b2d5-2f4bc42d12a5)(content(Whitespace\" \ \"))))(Tile((id \ 131e03f2-d8ba-446b-9416-9721b12e8ad1)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ c18f456d-bfd6-4ca8-aec1-0420159dc26c)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6645,8 +6396,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 87c698cf-8aba-44ba-bb79-a223a452b823)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 241640f0-109f-4e09-b4cc-efc7c097a369)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ fa7004cc-6f59-4317-8084-9b2583a1838e)(label(let = \ @@ -6664,31 +6415,27 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 850d0e94-3118-4f4a-8e9f-fc6d16f20d59)(content(Whitespace\" \ \"))))(Tile((id \ - bad1a8f8-98ab-4e9f-98e5-fa3af6648df8)(label(\"(\"\")\"))(mold((out \ + e73df443-f777-493e-a8e4-8c25d4cb96c1)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 8485cdf8-1f0d-4c19-af1a-f4047f63db6b)(label(Int))(mold((out \ + d9673b28-8854-43f9-bcb2-d1ebfee5d845)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - c430e9b9-5362-4565-87fb-35164c25fbcf)(label(,))(mold((out \ + 35e9c745-e4a9-4450-9ca9-81830b721e61)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 0a97dbc8-0db5-401c-ba09-1ac84dd40a4f)(shape \ - Convex)))(Secondary((id \ - 36182a45-1c4d-4edf-88d2-b7359c118b60)(content(Whitespace\" \ - \"))))(Secondary((id \ - 19a0b589-b7fb-4c5a-b196-60414355f924)(content(Whitespace\" \ - \"))))(Secondary((id \ - 15c7dfec-19d3-4fda-95ff-802d797065dd)(content(Whitespace\" \ - \"))))(Secondary((id \ - c687fbe7-74f5-4f51-b980-dd1b6034ac2d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + f7c92250-a128-4f09-ad57-e72d878ef5ac)(content(Whitespace\" \ + \"))))(Tile((id \ + c7a7ed1d-a4cf-4787-bdf1-43aeb80f0709)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 733bf0c2-6254-4827-b718-4ba5a5db9ba4)(content(Whitespace\" \ \"))))(Tile((id \ 07bd9b7e-200a-411e-ad5d-9e9d526147bf)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 36f66486-5dfb-4b38-830f-02c75a905c49)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6726,26 +6473,22 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 835b7059-495d-4581-b226-930f0aa2d0c6)(content(Whitespace\" \ \"))))(Tile((id \ - 7c06401a-3c56-4e3e-8b7c-7140f27f2fcf)(label(\"(\"\")\"))(mold((out \ + 3041ff42-d3c7-4ec1-ae59-8eb66fb8ed53)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 25f1ebe6-5693-4a55-8031-c0f87b04b9fd)(label(Int))(mold((out \ + c8de1d8b-098a-40cf-aede-66cbe492a023)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - 3f447514-7da4-4285-bc4c-f14f0ff134e3)(label(,))(mold((out \ + 015aeb7e-d5d3-46a3-938c-d10d8e0d2218)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - a617f497-94ad-43f7-aeba-98f0d64fa6c7)(shape \ - Convex)))(Secondary((id \ - d6d411e5-06c0-40a3-a8c6-ae65e0da3922)(content(Whitespace\" \ - \"))))(Secondary((id \ - 316c247d-f869-49b2-a4ca-cfb4f94f037d)(content(Whitespace\" \ - \"))))(Secondary((id \ - e0cb5f29-56e4-4bb1-b77c-4a2f1f2dda3f)(content(Whitespace\" \ - \"))))(Secondary((id \ - dff703fb-9c48-4cb6-8008-ef9021a8e557)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + a093ceeb-07d2-406c-ae44-0fdcf3472e69)(content(Whitespace\" \ + \"))))(Tile((id \ + efbccf6d-0d8b-478a-a595-1413475959f2)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 1c6a2c54-98e3-423f-b2fa-04a0f31c176d)(content(Whitespace\" \ \")))))))))(Secondary((id \ b7e696ee-0072-4504-b813-66ad684ceebd)(content(Whitespace\" \ @@ -6787,8 +6530,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 84842094-9cfd-44b0-a616-59a635d135a7)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ c08a517c-7d31-491a-8ca0-bdb311cdd1fd)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 973aca77-7a2e-447f-9b8b-79d46c90d289)(label(let = \ @@ -6805,13 +6548,15 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 138862a5-5864-4e64-8d38-a7733be25a9e)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + c85f2fbd-f802-43df-a8cc-b16441205ddf)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ cccc5c68-3881-48ee-875f-36701f4416cc)(content(Whitespace\" \ - \"))))(Grout((id f5d1cabe-ba44-4687-a6e2-d44d016f60cd)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 1c7771cf-00e8-40bd-87df-b14712ddb613)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 62318fea-bb9c-48db-895c-93fccb51a26a)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6881,8 +6626,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 8996cc25-1f48-4ca3-94ce-6eaa7498aa5a)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 0a78844d-935d-498c-9a44-a68f43962170)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 47790c08-a9e1-47d3-95ce-6030c0d06c09)(label(let = \ @@ -6899,13 +6644,15 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 06199b86-2bc6-46f3-95c7-dd38fa7f9044)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + a7ba4ee6-1a03-404a-9900-b08e2d86b8de)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 98d56171-c361-4f62-abcd-d7fd00394a67)(content(Whitespace\" \ - \"))))(Grout((id 007a7168-e3ea-4347-86d7-51613e6e77d1)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ fb920087-9166-4c09-8737-8c90bbbe6c9f)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 0f7c6467-0079-417b-818c-1fafb365ec21)(content(Whitespace\" \ \"))))(Tile((id \ @@ -6930,10 +6677,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 4a4ca8a2-7112-4fba-867a-c4a9ed22d911)(content(Whitespace\" \ - \"))))(Secondary((id \ - 75ebd88d-965d-47d9-af58-cfa8c116bced)(content(Whitespace\" \ - \"))))(Grout((id 631a3c14-fc3b-48ed-9fa4-be2489fbdc42)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + 82cafc59-177f-42cd-8838-13edbfec33cb)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 37a5fd62-d26b-48c6-85b9-277d9b99787b)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -6986,8 +6733,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ b5e14b9b-d4f7-4c17-befb-ce5bd8c907cf)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 623f89b2-f4b9-4708-abd9-4858f4b6c685)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 2a11ed63-c77a-41a5-98c6-9944b775106b)(label(let = \ @@ -7003,14 +6750,16 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ + 902e2355-2372-4218-be02-7a49ab8671dd)(content(Whitespace\" \ + \"))))(Tile((id \ + 3939a4ec-1d35-4fa8-bb31-b2a2b7e17313)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ c64c35d5-b8ed-4955-9f83-b5c301360a61)(content(Whitespace\" \ - \"))))(Secondary((id \ - dee528cd-578e-4612-838d-4e1e5a85bc53)(content(Whitespace\" \ - \"))))(Grout((id 8c1c628b-4c15-42bb-b034-0e104c37522c)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 78b3eee1-7d12-470b-9f9c-145e913c9167)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 4ceadb13-0558-406b-b5fb-7e50ee87fdf8)(content(Whitespace\" \ \"))))(Tile((id \ @@ -7089,8 +6838,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ f8b67ad0-d8da-4614-b1e7-0dbcc7b19ae1)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 225913ec-3b8f-46d7-a43f-1ff784f26662)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ e14eec4b-d7f7-4085-902f-c5b99493873a)(label(let = \ @@ -7107,15 +6856,15 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ f765efa2-eab5-4665-9965-c4ed7f3b5400)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + 3241dc2e-cbe0-4905-b83d-63d45dacc896)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 0f4ce747-c45a-427d-8f29-29f50f4d0036)(content(Whitespace\" \ - \"))))(Secondary((id \ - 818436f5-06d1-4d53-a81a-5ebe6ef8a77c)(content(Whitespace\" \ - \"))))(Grout((id d172bd5d-67d9-4ad4-900c-aa7850aab13f)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ edb6f7cb-4f54-44ff-b297-9e4e6e80d8b5)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ c4c4173d-2af1-415e-8f02-2415ed7e6892)(content(Whitespace\" \ \"))))(Tile((id \ @@ -7153,26 +6902,22 @@ let startup : PersistentData.t = Typ))))))(shards(0))(children())))(Secondary((id \ 783606ed-bd62-4b30-bae2-b3c9125c6582)(content(Whitespace\" \ \"))))(Tile((id \ - 0aaa7391-9ccc-47a4-b561-38c7f1cac1c7)(label(\"(\"\")\"))(mold((out \ + 658854e3-0c3b-4297-b35c-f9f082a3b7fd)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 5a61e355-ee4a-48b1-b3f4-dd6b7bea72b5)(label(Int))(mold((out \ + 41a1d469-33c7-427a-bf48-cf9dc5011380)(label(Int))(mold((out \ Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ - bbb5fbd6-ea5b-424e-a403-2851794e75e0)(label(,))(mold((out \ + 37c77d32-4cca-4788-8b0b-9cff76192356)(label(,))(mold((out \ Typ)(in_())(nibs(((shape(Concave 15))(sort \ Typ))((shape(Concave 15))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 6fd5520f-841f-463c-8780-42573be8b976)(shape \ - Convex)))(Secondary((id \ - b93f2697-a4e9-48de-ac5d-f144a1a3ce60)(content(Whitespace\" \ - \"))))(Secondary((id \ - 929bb152-5ea8-45fb-9fb0-5f0ac3211db9)(content(Whitespace\" \ - \"))))(Secondary((id \ - 887b6e32-3d1d-45dc-8c43-bab69be84ce0)(content(Whitespace\" \ - \"))))(Secondary((id \ - d557d37f-7499-4f6c-9cb7-2e7bb12aa34d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8b12e819-c936-468b-af2c-7b2e0eb84f8b)(content(Whitespace\" \ + \"))))(Tile((id \ + 90c22047-605e-4f41-9b93-d7cd0404ded9)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ d35fea4a-36de-4e10-9512-1873c1965654)(content(Whitespace\" \ \")))))))))(Secondary((id \ 8b51bb9e-3510-4ca9-afaf-579d5e4d05a6)(content(Whitespace\" \ @@ -7214,8 +6959,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ f485a019-0a07-40d3-899a-9512d4def50c)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 5633975f-c769-481e-9b92-68cb2685176c)(content(Whitespace\"\\226\\143\\142\"))))(Grout((id \ ec5fef77-52f4-4093-a5fa-7e07d30a822b)(shape \ @@ -7223,79 +6968,75 @@ let startup : PersistentData.t = backup_text = "# Internal Regression Tests: Function literal casting #\n\ # None of the below should trigger runtime exceptions #\n\n\ - let g: -> = fun _ -> 9 in -g(1);\n\n\ + let g: ? -> ? = fun _ -> 9 in -g(1);\n\n\ let f = fun b -> b && true in f(true);\n\ - let f = fun b: -> b && true in f(true);\n\ + let f = fun b: ? -> b && true in f(true);\n\ let f = fun b: Bool -> b && true in f(true);\n\ - let f: = fun b -> b && true in f(true);\n\ - let f: = fun b: -> b && true in f(true);\n\ - let f: = fun b: Bool -> b && true in f(true);\n\ - let f: -> = fun b -> b && true in f(true);\n\ - let f: -> = fun b: -> b && true in f(true);\n\ - let f: -> = fun b: Bool -> b && true in f(true);\n\ - let f: Bool -> = fun b -> b && true in f(true);\n\ - let f: Bool -> = fun b: -> b && true in f(true);\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true);\n\ + let f: ? = fun b -> b && true in f(true);\n\ + let f: ? = fun b: ? -> b && true in f(true);\n\ + let f: ? = fun b: Bool -> b && true in f(true);\n\ + let f: ? -> ? = fun b -> b && true in f(true);\n\ + let f: ? -> ? = fun b: ? -> b && true in f(true);\n\ + let f: ? -> ? = fun b: Bool -> b && true in f(true);\n\ + let f: Bool -> ? = fun b -> b && true in f(true);\n\ + let f: Bool -> ? = fun b: ? -> b && true in f(true);\n\ + let f: Bool -> ? = fun b: Bool -> b && true in f(true);\n\ let f: Bool -> Bool = fun b -> b && true in f(true);\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true);\n\ + let f: Bool -> Bool = fun b: ? -> b && true in f(true);\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true);\n\ - let f: -> Bool = fun b -> b && true in f(true);\n\ - let f: -> Bool = fun b: -> b && true in f(true);\n\ - let f: -> Bool = fun b: Bool -> b && true in f(true); #ERR#\n\n\ + let f: ? -> Bool = fun b -> b && true in f(true);\n\ + let f: ? -> Bool = fun b: ? -> b && true in f(true);\n\ + let f: ? -> Bool = fun b: Bool -> b && true in f(true); #ERR#\n\n\ let f = fun b -> b && true in f(true) && true;\n\ - let f = fun b: -> b && true in f(true) && true;\n\ + let f = fun b: ? -> b && true in f(true) && true;\n\ let f = fun b: Bool -> b && true in f(true) && true;\n\ - let f: = fun b -> b && true in f(true) && true;\n\ - let f: = fun b: -> b && true in f(true) && true;\n\ - let f: = fun b: Bool -> b && true in f(true) && true;\n\ - let f: -> = fun b -> b && true in f(true) && true;\n\ - let f: -> = fun b: -> b && true in f(true) && true;\n\ - let f: -> = fun b: Bool -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> = fun b: -> b && true in f(true) && \ - true;\n\ - let f: Bool -> = fun b: Bool -> b && true in f(true) && \ - true;\n\ + let f: ? = fun b -> b && true in f(true) && true;\n\ + let f: ? = fun b: ? -> b && true in f(true) && true;\n\ + let f: ? = fun b: Bool -> b && true in f(true) && true;\n\ + let f: ? -> ? = fun b -> b && true in f(true) && true;\n\ + let f: ? -> ? = fun b: ? -> b && true in f(true) && true;\n\ + let f: ? -> ? = fun b: Bool -> b && true in f(true) && true;\n\ + let f: Bool -> ? = fun b -> b && true in f(true) && true;\n\ + let f: Bool -> ? = fun b: ? -> b && true in f(true) && true;\n\ + let f: Bool -> ? = fun b: Bool -> b && true in f(true) && true;\n\ let f: Bool -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: Bool -> Bool = fun b: -> b && true in f(true) && \ - true;\n\ + let f: Bool -> Bool = fun b: ? -> b && true in f(true) && true;\n\ let f: Bool -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\ - let f: -> Bool = fun b -> b && true in f(true) && true;\n\ - let f: -> Bool = fun b: -> b && true in f(true) && true;\n\ - let f: -> Bool = fun b: Bool -> b && true in f(true) && \ + let f: ? -> Bool = fun b -> b && true in f(true) && true;\n\ + let f: ? -> Bool = fun b: ? -> b && true in f(true) && true;\n\ + let f: ? -> Bool = fun b: Bool -> b && true in f(true) && \ true;\n\n\ let f = fun a, b -> a + 1 in f(1, 2);\n\ - let f = fun a: , b -> a + 1 in f(1, 2);\n\ + let f = fun a: ?, b -> a + 1 in f(1, 2);\n\ let f = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: = fun a, b -> a + 1 in f(1, 2);\n\ - let f: = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: ( , ) -> = fun (a, b): (Int, ) -> a + 1 \ - in f(1, 2);\n\ - let f: (Int, ) -> = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> = fun (a, b): (Int, ) -> a + 1 \ - in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: (Int, ) -> Int = fun (a, b): (Int, ) -> a + 1 \ - in f(1, 2);\n\ - let f: -> Int = fun a, b -> a + 1 in f(1, 2);\n\ - let f: -> Int = fun a: , b -> a + 1 in f(1, 2);\n\ - let f: -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ - let f: -> Int = fun (a, b): (Int, ) -> a + 1 in f(1, 2);\n\ + let f = fun (a, b): (Int, ?) -> a + 1 in f(1, 2);\n\ + let f: ? = fun a, b -> a + 1 in f(1, 2);\n\ + let f: ? = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: ? = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: ? = fun (a, b): (Int, ?) -> a + 1 in f(1, 2);\n\ + let f: ? -> ? = fun a, b -> a + 1 in f(1, 2);\n\ + let f: ? -> ? = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: ? -> ? = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: ? -> ? = fun (a, b): (Int, ?) -> a + 1 in f(1, 2);\n\ + let f: (?, ?) -> ? = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (?, ?) -> ? = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: (?, ?) -> ? = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (?, ?) -> ? = fun (a, b): (Int, ?) -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> ? = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> ? = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> ? = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> ? = fun (a, b): (Int, ?) -> a + 1 in f(1, \ + 2);\n\ + let f: (Int, ?) -> Int = fun a, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> Int = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: (Int, ?) -> Int = fun (a, b): (Int, ?) -> a + 1 in \ + f(1, 2);\n\ + let f: ? -> Int = fun a, b -> a + 1 in f(1, 2);\n\ + let f: ? -> Int = fun a: ?, b -> a + 1 in f(1, 2);\n\ + let f: ? -> Int = fun a: Int, b -> a + 1 in f(1, 2);\n\ + let f: ? -> Int = fun (a, b): (Int, ?) -> a + 1 in f(1, 2);\n\ \ "; } ); ( "ADT Statics", @@ -7322,13 +7063,18 @@ let startup : PersistentData.t = Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ a72a561d-27a9-41f2-8ef3-8065d19a5fde)(content(Whitespace\" \ - \"))))(Grout((id d0cd5bbc-3883-4fe8-a9d8-67bf7ba77f68)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 850533e9-4d0b-46dd-ba43-5be3eef2406a)(label(?))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ fadcfc44-7cdf-4c69-9f56-1a64ce2ae893)(content(Whitespace\" \ \")))))((Secondary((id \ fb0ed68b-3058-49d0-a2d0-658170c04016)(content(Whitespace\" \ - \"))))(Grout((id 50707bcd-d303-4f2c-8dd9-019e87497b95)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 1e0c1cb1-d251-4e7b-86c2-e7b1cc089924)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 606fc561-7a9f-4c4c-81ab-f4b09c51a78a)(content(Whitespace\" \ \")))))))))(Secondary((id \ 90da604d-57b1-465b-b94e-da7571018abb)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ @@ -7453,18 +7199,22 @@ let startup : PersistentData.t = Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 23ae11d9-84ba-4845-856c-a6ae7bfd231e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - fb06ce02-44a2-49b8-9842-b2b49418acc1)(shape \ - Convex))))))))(Secondary((id \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 25765f53-2720-4ddb-b92f-01e30b090d2b)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ a3fbdb78-95db-4b70-9085-2b346153bc9d)(content(Whitespace\" \ \"))))(Tile((id \ c9c8b322-afcd-4739-ad8b-d91db8b9b9fd)(label(+))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 11))(sort \ - Typ))((shape(Concave 11))(sort \ + Typ)(in_())(nibs(((shape(Concave 4))(sort \ + Typ))((shape(Concave 4))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 4156bc1b-fa1f-410a-b4c1-2ce7c746e3f1)(content(Whitespace\" \ - \"))))(Grout((id fe7e519c-2461-4dd7-9746-49c3af96df9d)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + cff577c5-d75e-4b4d-b9de-4e60864398b9)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ e55f0796-7068-490e-8de1-3f3c58002c3f)(content(Whitespace\" \ \")))))))))(Secondary((id \ 114869ba-22a8-49c8-9c73-a3fe57060dc9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ @@ -7579,8 +7329,10 @@ let startup : PersistentData.t = a7d39551-cdfc-4990-9f97-923c226ca6da)(content(Whitespace\" \ \")))))((Secondary((id \ f43043f5-2d04-47f9-8c63-f7d6a2ded9f3)(content(Whitespace\" \ - \"))))(Grout((id f77ea8ed-753b-4efc-85e7-a059acab6299)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 845cc059-2fe3-44d1-9fa3-25eb07e67e41)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 35957e0c-336f-4eca-bad5-41e410c3e733)(content(Whitespace\" \ \")))))))))(Secondary((id \ 62c1a220-7594-4725-b900-92624aee8c45)(content(Whitespace\" \ @@ -7596,21 +7348,27 @@ let startup : PersistentData.t = \"))))(Tile((id \ 417bcb5d-9cb2-4517-9ecd-8b4b4bd4953b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - 5206689f-03c8-4a86-830c-d83f82774620)(shape \ - Convex)))(Tile((id \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 4ebd01e6-6e0d-48e6-be97-7e9b9e3023e7)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ ffab4ae0-0982-43d4-9142-646be82ce4a0)(label(,))(mold((out \ Exp)(in_())(nibs(((shape(Concave 15))(sort \ Exp))((shape(Concave 15))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 831e5d76-6628-4ac5-832d-a5d0973f9cfa)(content(Whitespace\" \ - \"))))(Grout((id 5e5fc062-ee9f-467a-ae61-1484577a9a04)(shape \ - Convex))))))))(Secondary((id \ + \"))))(Tile((id \ + 1152135c-eb19-4e21-9a70-6705b8eb3c01)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort \ + Exp))))))(shards(0))(children()))))))))(Secondary((id \ 226c107d-b679-4359-b700-0af5fb9c0fef)(content(Whitespace\" \ \")))))((Secondary((id \ 9a69480f-3749-46b7-b006-3782a8a22bee)(content(Whitespace\" \ - \"))))(Grout((id 5f4e6ebf-6e2d-4122-8dce-e1b65c16a987)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 3e670739-b668-428b-94bd-89f9357a6c93)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 560d14c8-767f-4b3f-bf8e-4262f4e955d8)(content(Whitespace\" \ \")))))))))(Secondary((id \ 2f5b0d39-8a13-4ddb-8ba5-e2835d9098c8)(content(Whitespace\" \ @@ -7623,8 +7381,11 @@ let startup : PersistentData.t = Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ 7003d5c2-5b64-4a4e-885d-9920ef0ff644)(content(Whitespace\" \ - \"))))(Grout((id bbe86a36-4e04-4b52-a6af-d722d52e8c5e)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 827977a7-08d5-4025-b655-27cc3f0e00e0)(label(?))(mold((out \ + TPat)(in_())(nibs(((shape Convex)(sort TPat))((shape \ + Convex)(sort \ + TPat))))))(shards(0))(children())))(Secondary((id \ 2cbc15af-8797-4931-8a58-70050e5d26d4)(content(Whitespace\" \ \")))))((Secondary((id \ afedc638-2702-4c31-880c-49e842d7f452)(content(Whitespace\" \ @@ -7683,8 +7444,10 @@ let startup : PersistentData.t = 2d1cfbbd-67cd-45cd-8fb1-ffa8aaf9606a)(content(Whitespace\" \ \")))))((Secondary((id \ 712836fd-f2d8-4ae8-b834-2a5aa6b977aa)(content(Whitespace\" \ - \"))))(Grout((id 5993dbe9-38ec-48b8-9b20-f2453559df6e)(shape \ - Convex)))(Secondary((id \ + \"))))(Tile((id \ + 6ebc6774-4004-4a73-b437-2fced0dd6e1d)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 9fc204c2-7649-4f75-a90b-14786125145d)(content(Whitespace\" \ \")))))))))(Secondary((id \ d9987d7d-53c3-4a6a-bfd9-381501eb8fab)(content(Whitespace\" \ @@ -7852,9 +7615,10 @@ let startup : PersistentData.t = \"))))(Tile((id \ 71968b46-dda7-41c3-bd0c-ec1ae8e9d8e5)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Grout((id \ - 75f8c6a6-949f-420b-a151-631ffd8d30ec)(shape \ - Convex))))))))(Tile((id \ + Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ + 4d687c4d-078a-447f-89e2-de2bfaf42ddc)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children()))))))))(Tile((id \ 976267ab-9b5c-4220-846e-1b135314b98e)(label(\"(\"\")\"))(mold((out \ Typ)(in_(Typ))(nibs(((shape(Concave 2))(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ @@ -8346,8 +8110,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children())))(Tile((id \ b7d331ee-30f0-4a40-a640-ddd610dc52aa)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 86c66d93-4bd9-472e-829a-c115e17106c2)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -9420,11 +9184,11 @@ let startup : PersistentData.t = # All commented lines should show errors as described #\n\ # No other lines should show errors #\n\n\ #type definitions: no errors#\n\ - type = in\n\ + type ? = ? in\n\ type SingleNull = +One in\n\ type Single = +F(Int) in\n\ type GoodSum = A + B + C(Int) in\n\ - type Partial = Ok( ) + in\n\ + type Partial = Ok(?) + ? in\n\ type DoubleAlias = GoodSum in\n\ type VerticalLeading =\n\ + A\n\ @@ -9432,11 +9196,11 @@ let startup : PersistentData.t = + C(Bool->Bool) \n\ in\n\n\ #incorrect or incomplete type definitions#\n\ - type badTypeName = in #err: invalid type name#\n\ - type ( , ) = in #err: invalid type name#\n\ - type = badTypeToken in #err: invalid type token#\n\ + type badTypeName = ? in #err: invalid type name#\n\ + type (?, ?) = ? in #err: invalid type name#\n\ + type ? = badTypeToken in #err: invalid type token#\n\ type NotASum = NotInSum(Bool) in #err: cons not in sum#\n\ - type Bool = in #err: shadows base type#\n\ + type Bool = ? in #err: shadows base type#\n\ type Dupes =\n\ + Guy(Bool) #no err#\n\ + Guy(Int) #err: already used#\n\ @@ -9446,7 +9210,7 @@ let startup : PersistentData.t = + notvalid #err: invalid#\n\ + Bool #err: expected cons found type#\n\ + Int(Int) #err: expected cons found type#\n\ - + ( )(Int) #err: expected cons found type#\n\ + + (?)(Int) #err: expected cons found type#\n\ + A(Bool)(Int) in #err: expected cons found app#\n\n\ #sums in compound aliases dont add ctrs to scope#\n\ #but compound alias types should propagate analytically#\n\ @@ -9502,7 +9266,7 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ + Normal)))(backpack())(relatives((siblings(()((Secondary((id \ 4b993118-7181-44f4-9ebc-5135577cb42e)(content(Comment\"# \ Hazel Language Quick Reference #\"))))(Secondary((id \ 3d39cc52-4179-4dbd-8d7f-8444c8c48de9)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -9521,14 +9285,11 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ a3705e23-36e4-49d6-bc51-c89215d22537)(content(Whitespace\" \ - \")))))((Grout((id \ - 736aa798-6b99-4d74-90b5-86362fac847f)(shape \ + \")))))((Secondary((id \ + fa5cdc0b-fca9-4405-924f-26e7854788c0)(content(Whitespace\" \ + \"))))(Grout((id 736aa798-6b99-4d74-90b5-86362fac847f)(shape \ Convex)))(Secondary((id \ 9b90b22f-953c-4c44-b66d-f9775ffbf704)(content(Whitespace\" \ - \"))))(Secondary((id \ - b72bc8b5-3b36-4f7f-9cd9-8f0e994d492b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 29544027-297d-4570-8e12-83fc84add8cf)(content(Whitespace\" \ \")))))))))(Secondary((id \ d6de8893-5e8f-499e-a60b-4bb98d8287ac)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 7c56a6a5-2b97-43a2-bcb7-8427d98d4b25)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ @@ -9899,7 +9660,7 @@ let startup : PersistentData.t = Exp))))))(shards(0))(children()))))))))(Secondary((id \ 67a01455-da82-4d7f-aca2-3e9990af1a3a)(content(Whitespace\" \ \"))))(Secondary((id \ - 57a26735-8310-4692-8fc1-58697308f0a1)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + 9bee5285-97dd-4029-94ef-ae48c856d65f)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ ba596e6e-a4fa-4145-b7d3-5f40b7a7ab5b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 22297d6c-432e-4b8f-8e77-6a0b2fa0d02c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 162e13c3-0a85-4d8f-b2e7-d5a33bfe3cb3)(content(Comment\"# \ @@ -11239,7 +11000,7 @@ let startup : PersistentData.t = 9905ba19-d790-441d-9010-05a7a0304a9d)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ baf3910c-3a5c-4c5d-811a-3a25993dd369)(content(Whitespace\" \ \"))))(Secondary((id \ - 8e314f04-632a-4a35-975f-eb654c84824a)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ + b46e0619-eaa5-4c79-990f-468bc2f95032)(content(Whitespace\"\\226\\143\\142\")))))))))(Secondary((id \ 1647be06-245d-42a3-8385-5a71c4af1766)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ 40d25578-5212-461c-92f6-ae14a391e37b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ b4f27a9f-6db2-41b8-8abb-e5dc432174c6)(content(Comment\"# \ @@ -12378,13 +12139,13 @@ let startup : PersistentData.t = f31878be-5cd4-4e79-827d-a1d16c837a27)(label(2))(mold((out \ Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort \ - Exp))))))(shards(0))(children()))))()))(ancestors())))(caret \ + Exp))))))(shards(0))(children()))))))(ancestors())))(caret \ Outer))"; backup_text = "# Hazel Language Quick Reference #\n\n\ # Empty holes stand for missing expressions, patterns, or \ types #\n\ - let empty_hole = in\n\n\ + let empty_hole = in\n\n\ # Non-empty holes are the red boxes around type errors #\n\ # (you can still run programs with non-empty holes) #\n\ let non_empty_hole : Int = true in \n\n\ @@ -12818,20 +12579,11 @@ let startup : PersistentData.t = in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ 2))(children(((Secondary((id \ - 25de0cd1-e0cd-40e2-b298-bba63463e402)(content(Whitespace\" \ - \"))))(Tile((id \ - 007595ce-99f5-4d6b-bc0d-157c343ee846)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 45b45f4c-11a4-43d1-b031-7cd15d0f5d58)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 000c9f9c-7ffe-4764-b2b1-8c60f81275c2)(content(Whitespace\" \ + 25de0cd1-e0cd-40e2-b298-bba63463e402)(content(Whitespace\" \ \"))))(Tile((id \ - 11a34954-6df0-4046-8170-25e79684ba90)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + 007595ce-99f5-4d6b-bc0d-157c343ee846)(label(_))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 15c0db9c-4ffc-4a65-85bf-1f7663ffb7a6)(content(Whitespace\" \ \")))))((Secondary((id \ 7b655a09-dea7-489f-8c63-4bae6cf1ddb5)(content(Whitespace\" \ @@ -12853,16 +12605,7 @@ let startup : PersistentData.t = \"))))(Tile((id \ 5b032c7b-bcb3-4af2-951e-40f7691af336)(label(__))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 4aaeb88a-2e60-414f-9ca9-1248a263130f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 1c38a0fa-bbdd-4335-9def-4dbb9a9c99cf)(content(Whitespace\" \ - \"))))(Tile((id \ - 07be771c-c05d-4d25-b177-d77c0ac8b377)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 86e081ce-920e-4f89-8ef3-0c54d43d6693)(content(Whitespace\" \ \")))))((Secondary((id \ 2d5a8239-42f4-4bc0-ae3c-ee19a920124f)(content(Whitespace\" \ @@ -12884,16 +12627,7 @@ let startup : PersistentData.t = \"))))(Tile((id \ 4c1360b2-dafe-422e-b3b6-b96ec36e7ac8)(label(___))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 7cfef1fb-d75a-4674-a0c1-4ce0a5b5ac63)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 2a1ab4a2-79a1-4a70-ae6e-100d72f1a6da)(content(Whitespace\" \ - \"))))(Tile((id \ - a01655df-d25d-48c1-bff7-011718087cb4)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 0d894ba4-cf26-403f-9a23-267609fe46f4)(content(Whitespace\" \ \")))))((Secondary((id \ 9d4ceb1c-6b22-4a06-a218-633b4a5890dc)(content(Whitespace\" \ @@ -12915,17 +12649,8 @@ let startup : PersistentData.t = \"))))(Tile((id \ 51b2e64d-97dd-4136-a322-9567742961c7)(label(____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 833fe7e6-2b84-431d-9ba1-e9199bbbfb2a)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 59a1090f-04a1-4279-8a13-efe1e9b93925)(content(Whitespace\" \ - \"))))(Tile((id \ - 2ee6d39b-ffbf-4b67-90b9-96e09747a011)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - faed1f01-8cd1-48e9-bab5-fcdc4a2a1f2a)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 5975f35a-5be5-487c-9c60-684e8196ee5e)(content(Whitespace\" \ \")))))((Secondary((id \ 655b0f6d-81ea-4402-b279-6b1ae84beba4)(content(Whitespace\" \ \"))))(Projector((id \ @@ -12946,17 +12671,8 @@ let startup : PersistentData.t = \"))))(Tile((id \ 73420d3d-60aa-48f3-af7f-9e0271b218f9)(label(_____))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - 0fe50299-f1c4-4e4a-aa20-cf9b98ee119f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 8e9d69fe-608c-4aaf-a223-d68581c4febc)(content(Whitespace\" \ - \"))))(Tile((id \ - 1a591779-a79d-46d0-8477-27aa25727b98)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 04965f33-d5d4-4696-a3ad-52c550762732)(content(Whitespace\" \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + 09b22cf6-e566-43df-a6ef-9a2b8cc5b124)(content(Whitespace\" \ \")))))((Secondary((id \ fc90fed4-a5d3-4d27-9f7a-cd75421abaee)(content(Whitespace\" \ \"))))(Projector((id \ @@ -12977,16 +12693,7 @@ let startup : PersistentData.t = \"))))(Tile((id \ e7dd8df0-14df-41f3-8ebb-747d42daf6ce)(label(______))(mold((out \ Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0))(children())))(Tile((id \ - ebb21b46-dade-4e37-97b7-d1a67ff366ec)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort \ - Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 9a9ac643-c500-4d7b-a582-454f82e2c405)(content(Whitespace\" \ - \"))))(Tile((id \ - 7bc12c5d-d76c-4f1d-b798-842861613d8d)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 50a8159f-2f81-4ac8-bb46-c93c6d1c3a36)(content(Whitespace\" \ \")))))((Secondary((id \ c8ba0030-44ed-43ff-915f-1fd4afc25529)(content(Whitespace\" \ @@ -13174,12 +12881,12 @@ let startup : PersistentData.t = # Inline error decorations (same as for tokens) #\n\n\ let (a:Int, f: Float) = , in\n\n\ # The String base type get a multiline view: #\n\n\ - let _: String = in\n\ - let __: String = in\n\ - let ___: String = in\n\ - let ____: String = in\n\ - let _____: String = in\n\ - let ______: String = in\n\n\ + let _ = in\n\ + let __ = in\n\ + let ___ = in\n\ + let ____ = in\n\ + let _____ = in\n\ + let ______ = in\n\n\ # Multiline error decorations #\n\n\ let box: Int = in\n\n\ # ERRATA: #\n\ @@ -13283,14 +12990,13 @@ let startup : PersistentData.t = d46a196d-925c-4f7f-9d9b-f73ef61410a5)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - 2a22b1ff-523a-4274-af9b-2d3840b4ccef)(shape \ - Convex)))(Secondary((id \ + 2))(children(((Secondary((id \ + ae1c0f3c-1692-4f10-9076-bcda8da909fd)(content(Whitespace\" \ + \"))))(Tile((id \ + 685cd41c-494d-42eb-803e-262e8ebeb39a)(label(?))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ cabf0162-6154-4020-9ff0-f16aa1e5e9a8)(content(Whitespace\" \ - \"))))(Secondary((id \ - d5f86095-dfbc-419e-af83-1419f698f916)(content(Whitespace\" \ - \"))))(Secondary((id \ - 660c2050-c473-44ee-92b7-48c24e4fff1e)(content(Whitespace\" \ \")))))((Secondary((id \ 31e7b59a-ecef-4a68-907b-dd2c315acd63)(content(Whitespace\" \ \"))))(Tile((id \ @@ -13381,14 +13087,13 @@ let startup : PersistentData.t = 8ef5ab6d-6cc4-4081-b092-6a7721669dda)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 32d94418-61a4-4333-b295-3947650f3b1d)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 34d1a24a-41ae-4d51-8f5e-2a1d0570a6ef)(content(Whitespace\" \ + \"))))(Tile((id \ + 5e923e13-50b3-40a1-8a29-2f66a2693330)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ ada81658-b24c-447e-8e91-142f404fe596)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2c8ad945-5cf8-4383-9cc3-cc5e878ec92a)(content(Whitespace\" \ - \"))))(Secondary((id \ - b71ab3ad-733a-4cfa-9fe9-2b006f9179bd)(content(Whitespace\" \ \")))))((Secondary((id \ ff02d723-d855-4161-8cac-3aa34b6249d9)(content(Whitespace\" \ \"))))(Tile((id \ @@ -13653,8 +13358,10 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 06ba9142-925a-46df-964e-9df82c1833c1)(content(Whitespace\" \ - \"))))(Grout((id eb7e2e86-0a63-4bbf-8dae-dd7b6f10c13c)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ + 02a74c5f-e222-4858-a38f-42908b41c0d3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Tile((id \ 90156175-90f3-4dfa-a9f0-56d255aa26c1)(label(,))(mold((out \ Pat)(in_())(nibs(((shape(Concave 15))(sort \ Pat))((shape(Concave 15))(sort \ @@ -13819,13 +13526,10 @@ let startup : PersistentData.t = 17ab14c0-8f4b-44cd-a532-9a761a833be0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 6a4e05e9-217c-4e45-8de1-c9e392ccb042)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - 7344600d-736b-4fd8-a156-329b825322eb)(shape \ - Convex)))(Secondary((id \ - 32447f88-c01a-4618-8171-28307e2ea33b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2fbb2438-eda8-46b0-9b56-d0be662c186a)(content(Whitespace\" \ - \")))))))))(Tile((id \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + 062c107b-c14c-4c45-aa0c-c9ffa4d5dbb1)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 869737d1-c23a-476c-ab5e-8aa7861d964b)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -13853,8 +13557,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ cdf6f11c-509f-4bc7-b86e-a0d84b87b124)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 8d5c4873-344e-4b6f-9252-8d16ecea9c89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ a7151210-7df0-43fa-b6e8-1522bd2a8d39)(label(1))(mold((out \ @@ -13887,8 +13591,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 9feb45b2-455a-4c65-867c-b52c870a7bfc)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ f45233ef-9aa6-4b3b-a823-c6e50d713899)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -13928,8 +13632,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ a41ef3b0-6648-4e1f-b11a-d1389eaeb977)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 6330fc76-d937-4dec-95de-19a3b41a37f9)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -13942,23 +13646,19 @@ let startup : PersistentData.t = b7d43d16-9dd4-4778-95c9-bd6072924dfb)(label(fun \ ->))(mold((out Exp)(in_(Pat))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 14))(sort Exp))))))(shards(0 \ - 1))(children(((Grout((id \ - 495fdd0e-0b8c-4bfe-bd78-45d037891589)(shape \ - Convex)))(Secondary((id \ - f9ee6257-9f48-438f-976b-bf8fe73f6db4)(content(Whitespace\" \ - \"))))(Secondary((id \ - ce864e28-dfe4-45a5-a2e6-058f4c257012)(content(Whitespace\" \ - \"))))(Secondary((id \ - 47b51dd3-6043-4cc6-85c4-427b2b022005)(content(Whitespace\" \ - \")))))))))(Grout((id \ - 5761b5cc-03a4-443a-bdd5-b6dd721f8058)(shape \ - Convex)))(Secondary((id \ - 297139cb-2f4b-4ee5-9062-56cb5288e247)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6df3c8f7-4b00-4117-aba3-024e6eafe69f)(content(Whitespace\" \ - \"))))(Secondary((id \ - ba3f46c8-10a3-49e0-9e03-41ed167e90e5)(content(Whitespace\" \ - \")))))))))(Tile((id \ + 1))(children(((Secondary((id \ + d529608c-40dc-4a8c-b119-bee30c8b71f8)(content(Whitespace\" \ + \"))))(Tile((id \ + 11558ad7-43da-468c-8b47-5f9cb488f89e)(label(?))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ + f5c16f08-3051-4023-aabf-3e1bb1df78e1)(content(Whitespace\" \ + \")))))))))(Secondary((id \ + c6b8f9e4-6282-4559-9e72-9d225d03b1d3)(content(Whitespace\" \ + \"))))(Tile((id \ + f7c8f41a-07fb-4e4a-b5ea-629ae0f2ccd4)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ e5bd26eb-70de-4d49-9c56-409b67357cc7)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -13986,8 +13686,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 1e9cfcc6-d0cb-4b57-82a8-e7ea35bc3205)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 09735344-80ff-4b00-a349-0a6b15010e36)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 5115c75e-67dc-46f3-a332-c00552804ebb)(label(\"(\"\")\"))(mold((out \ @@ -14003,15 +13703,12 @@ let startup : PersistentData.t = Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ bb26f97d-b97b-4bb7-8bdb-fddecaa2694e)(content(Whitespace\" \ - \")))))))))(Grout((id \ - 2db37ecd-b383-4b82-ae34-e37f269ba089)(shape \ - Convex)))(Secondary((id \ - 074dc009-1b8d-4617-8ede-6c11886a24ea)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7cf84134-9785-41b8-9cea-097cad6ba862)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3fd55d40-0194-4066-8c61-e52b2f49c340)(content(Whitespace\" \ - \")))))))))(Tile((id \ + \")))))))))(Secondary((id \ + 9136d4b6-ce1e-4392-9601-3d0c035a14ca)(content(Whitespace\" \ + \"))))(Tile((id \ + cfa13869-9098-440c-9570-f22d5a3f7add)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 936129f1-6df6-49ee-b559-3bdbc23aae6f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -14039,8 +13736,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 76a1e448-41f0-400c-b7ea-a399a8f5eff7)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ c6b13e8b-ef44-42eb-a13a-b117143507c3)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ b835c649-13a0-4402-9809-71a72688b29c)(label(\"(\"\")\"))(mold((out \ @@ -14058,23 +13755,19 @@ let startup : PersistentData.t = 586adcad-0933-4a26-8699-916831c7baca)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 375189cf-d059-4606-a4fe-56e63b2988ec)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 58f64c30-9c76-4f77-a0c0-9ffc572ad5c5)(content(Whitespace\" \ + \"))))(Tile((id \ + 1bc83856-75a5-47dc-b03f-aeaf9e5fd6e3)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 9ec96788-240f-4611-bb39-c439232ca9b4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 33f3e0fa-102e-4429-8833-89a95d790163)(content(Whitespace\" \ - \"))))(Secondary((id \ - 686781e3-f9ff-40dc-8117-157ca0448dff)(content(Whitespace\" \ - \")))))))))(Grout((id \ - c85b5fd3-8b8a-4895-8c46-08704f81d139)(shape \ - Convex)))(Secondary((id \ - 901258e8-faba-463d-82d3-ef76e2369acd)(content(Whitespace\" \ - \"))))(Secondary((id \ - 930a3157-9a61-4c2f-871b-88e77d178e1c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3839d36d-39dd-41fc-94b0-1c759f9ad01d)(content(Whitespace\" \ - \")))))))))(Tile((id \ + \")))))))))(Secondary((id \ + 9e8fe634-54dd-443d-ab4a-521abd8964c2)(content(Whitespace\" \ + \"))))(Tile((id \ + 3e7fc2eb-06bd-4be2-abaf-584b32e12d45)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ ba595eed-171d-420a-b857-5de42ad13c8d)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -14102,8 +13795,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 0ffbf675-d30a-44a6-a433-d5a0468a4a23)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 160ffa92-f86d-4ad3-9acb-d07fee5e3cc1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 46b256a9-ab08-4cb7-ab0e-5041143d5a2a)(label(\"(\"\")\"))(mold((out \ @@ -14128,15 +13821,12 @@ let startup : PersistentData.t = Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 4eae28bb-5202-482e-a426-8ea5de90686e)(content(Whitespace\" \ - \")))))))))(Grout((id \ - cf773dd6-4610-48f4-b9cd-f6f448a7bd54)(shape \ - Convex)))(Secondary((id \ - 53d6ee33-01b8-432f-89e9-cb39064bebc5)(content(Whitespace\" \ - \"))))(Secondary((id \ - 6d192db9-1af1-42d7-a3e3-668809aabfb1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8d285564-0bf6-41c4-ba05-15454fd828c9)(content(Whitespace\" \ - \")))))))))(Tile((id \ + \")))))))))(Secondary((id \ + 8ca9da11-11a3-4737-8491-33d1cdc88f14)(content(Whitespace\" \ + \"))))(Tile((id \ + ac57a649-a903-4e08-8fda-7c24db523cf4)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 6b8568ad-1c91-4af8-b040-d60b863dfabc)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ @@ -14164,8 +13854,8 @@ let startup : PersistentData.t = Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 033e58ff-4a73-4b04-8762-634a32b11c52)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 7e626298-c9e0-40b4-ab5b-40ebeab4d0bb)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -14241,14 +13931,13 @@ let startup : PersistentData.t = 9ced8341-5264-41ef-b296-25bf935fa376)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 7c051e70-9e19-4d1c-b11c-d95d49a7aa2a)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 8dac34f3-bed8-4320-aeee-0c44f64ce226)(content(Whitespace\" \ + \"))))(Tile((id \ + f9d98bae-249a-4c23-831c-623bcfc26fd6)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 5c4eb7df-2a0f-4d79-989d-4b0517785895)(content(Whitespace\" \ - \"))))(Secondary((id \ - 9c6901db-158a-4e12-8eea-ec2203b564be)(content(Whitespace\" \ - \"))))(Secondary((id \ - 2a62fcd2-8e96-4bbc-97ba-7d2f211b5355)(content(Whitespace\" \ \")))))((Secondary((id \ 89593eff-af8d-4a21-9229-004daae8c739)(content(Whitespace\" \ \"))))(Tile((id \ @@ -14305,20 +13994,23 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 5d7a831b-b8fd-4762-960d-0fba8f5fde2f)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + 28842be8-0534-4ab1-bf86-12781a28769b)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 36039aad-4cd9-48c2-a1bf-abfb4dc37cb3)(content(Whitespace\" \ - \"))))(Grout((id e2430ad2-1fe1-4fc0-b2f0-6d7f0633e8fa)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 0b7ad8bb-266d-46bf-8134-d1bc1ddc8e2d)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - ffccd23a-f723-4d7a-ab9b-9f3dc05d3d39)(shape \ - Convex)))(Secondary((id \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ + Typ))))))(shards(0))(children())))(Secondary((id \ + 08aba5c3-d8c5-4297-b74a-a4d302a166d9)(content(Whitespace\" \ + \"))))(Tile((id \ + 62589bdb-8179-451e-8780-c8e4bf33b206)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 6abab41e-89c9-43cd-b7f1-457d5df8684f)(content(Whitespace\" \ \"))))(Secondary((id \ - 873da007-046b-4cfb-bc04-c37d8de4a77c)(content(Whitespace\" \ - \"))))(Secondary((id \ 60ba755b-6f24-4592-8b65-45adcfae5b02)(content(Whitespace\" \ \")))))((Secondary((id \ cdcbdfd1-d436-4c98-8e0c-327157bb3451)(content(Whitespace\" \ @@ -14376,13 +14068,15 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 616d4a4d-a668-4e7a-9da3-340b7ce802f1)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + 0458726d-4ccf-483c-be1d-547c65ad6b0a)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ 0006a920-97ec-4970-8b1f-cf1a597d3db5)(content(Whitespace\" \ - \"))))(Grout((id 81227d2c-be01-4c94-81c6-eff27092e665)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 6f5f976f-30ca-4e69-8579-f7ae2a108465)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ fd18ef4f-b609-4bfe-94e0-d296847bc935)(content(Whitespace\" \ \"))))(Tile((id \ @@ -14450,25 +14144,25 @@ let startup : PersistentData.t = Pat))((shape(Concave 12))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 85989bf6-e65b-4e0d-966f-c79e1a6e2ccd)(content(Whitespace\" \ - \"))))(Secondary((id \ + \"))))(Tile((id \ + d4fbd548-6f00-4b4c-8ce6-f914b2f927ec)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ fce4ca15-e39e-4de1-9f25-c9a05a197444)(content(Whitespace\" \ - \"))))(Grout((id 41187827-255f-4ae2-b455-415324c027e7)(shape \ - Convex)))(Tile((id \ + \"))))(Tile((id \ 57be36ff-3c4d-4d97-a859-7cf78407f249)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ c0aec7b6-dce2-4e31-8a95-afe85d6ad196)(content(Whitespace\" \ \"))))(Tile((id aeaa175c-40d2-4078-a79d-45a97002ae1e)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Grout((id \ - 74b128ff-36b7-475c-9069-8c81873243ed)(shape \ - Convex)))(Secondary((id \ - 948aa7ba-2f51-4c21-a4a9-1e1c8ebc8fb4)(content(Whitespace\" \ - \"))))(Secondary((id \ - 1f327350-5396-4f58-9409-e0ab5e63c6a6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + 1))(children(((Tile((id \ + da4b5c25-5b93-47b9-a4e5-792658f4d1d7)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 1e6a7d87-0b88-4478-ad9d-8076310a0c65)(content(Whitespace\" \ \")))))((Secondary((id \ cc0cb60b-75fc-4450-ac42-3cafdb5cfeba)(content(Whitespace\" \ @@ -14519,11 +14213,10 @@ let startup : PersistentData.t = a5a3b845-0842-4d91-8194-0b98b729c1d5)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ 16a37cbe-dc5b-4227-b7bc-7f391876ab5f)(label(\"(\"\")\"))(mold((out \ Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Grout((id \ - 6d628a17-d807-4119-8660-cfeb6c4399c3)(shape \ - Convex)))(Secondary((id \ - d365c6eb-551d-4e56-b2c5-75d482fca060)(content(Whitespace\" \ - \")))))))))(Tile((id \ + Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ + e22a7750-a4f2-4ebd-93c0-175b6c723266)(label(?))(mold((out \ + Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape \ + Convex)(sort Exp))))))(shards(0))(children()))))))))(Tile((id \ 91727912-05e6-454e-9782-5e618fe6e70a)(label(::))(mold((out \ Exp)(in_())(nibs(((shape(Concave 7))(sort \ Exp))((shape(Concave 7))(sort \ @@ -14559,8 +14252,8 @@ let startup : PersistentData.t = Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ e78aaab0-80e3-4256-ada1-49c56d6a86ce)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 4452164f-3c96-43fd-b93b-fea5fd8118d1)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ b4e13b72-e4fd-4f1e-8453-c0dcbb78a057)(label(1))(mold((out \ @@ -14601,8 +14294,8 @@ let startup : PersistentData.t = Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ bcf15c13-6bd4-455d-815c-b295ff1739af)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 36542426-c71a-437e-858b-bd3cc5922797)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -14659,8 +14352,8 @@ let startup : PersistentData.t = Convex)(sort \ Exp))))))(shards(0))(children())))))))))))))(Tile((id \ ee6da9f8-bc92-4b2d-8a86-46007a1bb18a)(label(\";\"))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort \ - Exp))((shape(Concave 10))(sort \ + Exp)(in_())(nibs(((shape(Concave 16))(sort \ + Exp))((shape(Concave 16))(sort \ Exp))))))(shards(0))(children())))(Secondary((id \ 1c2b19b1-999e-4f1d-907a-324df3549257)(content(Whitespace\" \ \"))))(Secondary((id \ @@ -14671,14 +14364,13 @@ let startup : PersistentData.t = eaed346f-f9a1-4571-a6b0-2408f3b5aa35)(label(let = \ in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Grout((id \ - 4d9f7649-dbd4-4dd3-a532-84d07ee30d99)(shape \ - Convex)))(Secondary((id \ - af8a2cad-40e2-45a0-8230-3e3b40da7207)(content(Whitespace\" \ - \"))))(Secondary((id \ + 2))(children(((Secondary((id \ + 24ba7e71-c265-47d8-b043-fb9571296c81)(content(Whitespace\" \ + \"))))(Tile((id \ + a721ed93-334e-4a5e-b279-54818064df5d)(label(?))(mold((out \ + Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape \ + Convex)(sort Pat))))))(shards(0))(children())))(Secondary((id \ 9dd3b184-e240-418f-8237-48eeb811a098)(content(Whitespace\" \ - \"))))(Secondary((id \ - 800dffc6-685a-4c12-8515-f435afee2fea)(content(Whitespace\" \ \")))))((Secondary((id \ 34d97d72-dbee-4cda-92ca-02e3b0813434)(content(Whitespace\" \ \"))))(Tile((id fe7ce7dc-ccf0-41cf-b61e-58713886b996)(label([ \ @@ -14771,12 +14463,13 @@ let startup : PersistentData.t = 52625e6f-568c-4303-adbc-109bccc6e8f3)(label(:))(mold((out \ Pat)(in_())(nibs(((shape(Concave 12))(sort \ Pat))((shape(Concave 12))(sort \ - Typ))))))(shards(0))(children())))(Grout((id \ - 3d2a7eef-5d0b-4c80-bcc0-8f814aa767aa)(shape \ - Convex)))(Secondary((id \ + Typ))))))(shards(0))(children())))(Secondary((id \ + e99eb9ec-1890-4588-bc89-81b5d2c7cc89)(content(Whitespace\" \ + \"))))(Tile((id \ + feb58019-e9b3-4ab8-aac6-50469697595e)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort Typ))))))(shards(0))(children())))(Secondary((id \ f3af026d-83c5-47e3-9808-4da209e81c33)(content(Whitespace\" \ - \"))))(Secondary((id \ - e4d8f77d-0d97-47e6-9f85-e89460bb7b4a)(content(Whitespace\" \ \")))))((Secondary((id \ 9d41ec99-7d66-4e27-8410-edea51fb1893)(content(Whitespace\" \ \"))))(Tile((id c8cf18cd-3cce-4141-93e0-262c397f7378)(label([ \ @@ -14827,11 +14520,11 @@ let startup : PersistentData.t = \"))))(Tile((id e17ae24a-882d-4d6a-9868-25a53e79b1f4)(label([ \ ]))(mold((out Typ)(in_(Typ))(nibs(((shape Convex)(sort \ Typ))((shape Convex)(sort Typ))))))(shards(0 \ - 1))(children(((Grout((id \ - 55f3712a-4eef-46b6-b366-10689ac5fe5d)(shape \ - Convex)))(Secondary((id \ - b62188de-58cb-451c-bbec-10b95d861d0d)(content(Whitespace\" \ - \")))))))))(Secondary((id \ + 1))(children(((Tile((id \ + af0fc4b3-ab89-401c-ae3c-0b81a39ec383)(label(?))(mold((out \ + Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape \ + Convex)(sort \ + Typ))))))(shards(0))(children()))))))))(Secondary((id \ 0e9b0fa8-2a42-40ee-9b1f-3df9310411ce)(content(Whitespace\" \ \")))))((Secondary((id \ 05e3daf7-8ef4-472f-a181-3f8844bbd44d)(content(Whitespace\" \ @@ -15071,36 +14764,35 @@ let startup : PersistentData.t = let _ = unbound in #err#\n\ let Undefined = Undefined in # 2x err# \n\ let true = 2 in #2x err# \n\n\ - let = if true then 1 else 1. in #err# \n\ + let ? = if true then 1 else 1. in #err# \n\ let _ = if true then 1 else 1. in #err#\n\ - let _: = if true then 1 else 1. in\n\ + let _: ? = if true then 1 else 1. in\n\ let _: Int = if true then 1 else 1. in #err#\n\ let _: Fake = if true then 1 else true in #err#\n\ let _, _ = if true then 1 else 1. in #2x err#\n\ let _, _ = (if true then 1 else 1.), in #err#\n\ - let _: , _ = (if true then 1 else 1.), in \n\ + let _: ?, _ = (if true then 1 else 1.), in \n\ let [_] = [(if true then 1 else 1.)] in #2x err#\n\ let [_] = (if true then 1 else 1.) in #3x err# \n\n\ - ( )(if true then 1 else 1.);\n\ + (?)(if true then 1 else 1.);\n\ 1(if true then 1 else 1.); #err#\n\ (1)(if true then 1 else 1.); #err#\n\ - (fun -> )(if true then 1 else 1.);\n\ - (fun _ -> )(if true then 1 else 1.);\n\ - (fun _: -> )(if true then 1 else 1.);\n\ - (fun _: Int -> )(if true then 1 else 1.); #err#\n\n\ + (fun ? -> ?)(if true then 1 else 1.);\n\ + (fun _ -> ?)(if true then 1 else 1.);\n\ + (fun _: ? -> ?)(if true then 1 else 1.);\n\ + (fun _: Int -> ?)(if true then 1 else 1.); #err#\n\n\ let _ = fun x -> if true then 1 else 1. in #err#\n\ - let _: = fun x -> if true then 1 else 1. in\n\ - let _: -> = fun x -> if true then 1 else 1. in\n\ - let _: -> Int = fun x -> if true then 1 else 1. in #err#\n\ - let _: -> [ ] = fun x -> if true then 1 else 1. in #2x \ - err#\n\n\ - ( )::[(if true then 1 else 1.)];\n\ + let _: ? = fun x -> if true then 1 else 1. in\n\ + let _: ? -> ? = fun x -> if true then 1 else 1. in\n\ + let _: ? -> Int = fun x -> if true then 1 else 1. in #err#\n\ + let _: ? -> [?] = fun x -> if true then 1 else 1. in #2x err#\n\n\ + (?)::[(if true then 1 else 1.)];\n\ 1::[(if true then 1 else 1.)]; #err#\n\ (1, 1)::[(if true then 1 else 1.)]; #2x err#\n\n\ - let = [1, 1., true] in #err: inconsistent#\n\ + let ? = [1, 1., true] in #err: inconsistent#\n\ let _ = [1, 1., true] in #err: inconsistent#\n\ - let _: = [1, 1., true] in \n\ - let _: [ ] = [1, 1., true] in\n\ + let _: ? = [1, 1., true] in \n\ + let _: [?] = [1, 1., true] in\n\ let _: [Int] = [1, 1., true] in #2x err#\n\n\ let _: [Int] = 1::[2] in\n\ let _: [Int] = 1.0::[2] in #err#\n\ @@ -17068,8 +16760,8 @@ let startup : PersistentData.t = aaf75b4a-c5ec-4f37-b2c6-6b4f15dcae18)(content(Whitespace\" \ \"))))(Tile((id \ ffe8fd86-e515-4f69-a4d6-38e4e7ae4d74)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 7b01f898-6c54-4555-ae46-1e2c9af28bbc)(content(Whitespace\" \ \"))))(Tile((id \ @@ -17079,8 +16771,8 @@ let startup : PersistentData.t = 1eca4b4a-ffa5-46f1-9767-78d4952e1a46)(content(Whitespace\" \ \"))))(Tile((id \ e1004d45-7d54-4c88-96f1-a90babcf6f9d)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 5d787dd9-3512-4925-be9b-916d5789e28c)(content(Whitespace\" \ \"))))(Tile((id \ @@ -17272,8 +16964,8 @@ let startup : PersistentData.t = 5e2702de-94ef-4d9d-9f6e-0ff3a700a4d6)(content(Whitespace\" \ \"))))(Tile((id \ 5d0bd610-edb7-46d4-9a35-7197172614ad)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 6687d2fc-ae58-413a-8946-5d969cab3758)(content(Whitespace\" \ \"))))(Tile((id \ @@ -17284,8 +16976,8 @@ let startup : PersistentData.t = c7c293db-f64f-4e35-9b7b-652c40a75a45)(content(Whitespace\" \ \"))))(Tile((id \ 7cb8df24-1ad6-428b-a416-719555cfe5bf)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ 789b186e-63d8-447e-83a1-05e97111be8f)(content(Whitespace\" \ \"))))(Tile((id \ @@ -17310,8 +17002,8 @@ let startup : PersistentData.t = 7755d5ee-c4cb-442c-8aa5-5a4cd77e6227)(content(Whitespace\" \ \"))))(Tile((id \ 9f11b960-7216-4e89-8b4c-28de72037f0a)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort \ - Typ))((shape(Concave 6))(sort \ + Typ)(in_())(nibs(((shape(Concave 5))(sort \ + Typ))((shape(Concave 5))(sort \ Typ))))))(shards(0))(children())))(Secondary((id \ f0d0d1bf-38ea-4e45-9c41-3954ce5b1654)(content(Whitespace\" \ \"))))(Tile((id \ @@ -18547,131 +18239,91 @@ let startup : PersistentData.t = { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 95e17a56-7595-403d-923d-60f6d1fad48c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 928c135e-228f-4db2-b3f1-3dab2fbfcc2f)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 527b01da-5acd-4de7-99a0-02510f2fbe0f)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Composing Arithmetic Expressions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - c98c482a-094a-404c-843a-ae5602bdb22c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7fabb272-0901-4ae2-9630-e252e699167f)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 3767c92f-8a0e-4b82-8407-7e33c55a07be)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Computing Equationally", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 403cdfa4-a042-43dd-9ea8-4575de1ddff1)(content(Whitespace\" \ - \"))))(Secondary((id \ - 4ffadc3e-c3fe-4ebc-b02e-1f7553b683b0)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 293ef06a-03d2-4770-8282-f6bbc4aeea08)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Variables", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 9444e123-e149-4dea-ad91-b95d36ed6adc)(content(Whitespace\" \ - \"))))(Secondary((id \ - 92e9fb8a-18bc-4c83-bcad-bb3e40756633)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 878e0a53-88e7-489c-8f30-b60405bb8eb7)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Compositionality", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 4a32efdc-9f75-458a-bc30-2cbc0eaf5332)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5a7df6d9-d4d8-4d65-9a09-554002a19042)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 67f58c5b-14f7-4b5d-9478-1e66a9bb97ba)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Scope", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 52a43a65-0ce5-4495-96b3-7b2a68e1a282)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3607cc7d-3050-48db-9533-9cc0474b4fe3)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ a48ecbfe-f027-4482-b40c-d59c7a79b52e)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Shadowing", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 7fad2ec1-94b1-430b-a375-d74899fac17b)(content(Whitespace\" \ - \"))))(Secondary((id \ - 02e4e64b-39f6-4551-86a0-00b915016b31)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ fa020b7e-8025-47eb-b6ce-5b5797358e67)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Booleans and Types", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - d9da612b-70e0-4d77-8451-5576e940bd28)(content(Whitespace\" \ - \"))))(Secondary((id \ - 298a3449-9607-4383-be09-0390df08d3f1)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ c19d2704-759a-401a-af23-b6c5263f7c7b)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Conditional Expressions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - d20712f1-0845-4f1a-af5f-0313193bf613)(content(Whitespace\" \ - \"))))(Secondary((id \ - 8dd3ff3c-6dcf-4e3f-b6ed-dc44ee50e061)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ 5eb4e750-954c-46e7-a785-d8af9e1b8e40)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ( "Functions", { zipper = "((selection((focus Left)(content())(mode \ - Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 226fddf9-66de-47d2-bccc-99f9c32d5152)(content(Whitespace\" \ - \"))))(Secondary((id \ - 5ef7a887-0edf-46e1-85d4-168ef6d130dc)(content(Whitespace\" \ - \")))))((Grout((id \ + Normal)))(backpack())(relatives((siblings(()((Grout((id \ a1407558-57b7-45ea-b4d6-83771ae62b46)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; } ); ], [ From e33f672faaf5b184a8c107c2a82b97c101fbaaf5 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 18:11:56 -0400 Subject: [PATCH 154/168] fix indentation bug. rm unused modules --- src/haz3lcore/Measured.re | 6 ++++- src/haz3lcore/dynamics/ExpandingKeyword.re | 31 ---------------------- src/haz3lcore/zipper/Time.re | 15 ----------- src/haz3lcore/zipper/action/Perform.re | 2 +- 4 files changed, 6 insertions(+), 48 deletions(-) delete mode 100644 src/haz3lcore/dynamics/ExpandingKeyword.re delete mode 100644 src/haz3lcore/zipper/Time.re diff --git a/src/haz3lcore/Measured.re b/src/haz3lcore/Measured.re index 0111721e62..61dad8a831 100644 --- a/src/haz3lcore/Measured.re +++ b/src/haz3lcore/Measured.re @@ -326,7 +326,11 @@ let of_segment = (seg: Segment.t, info_map: Statics.Map.t): t => { | Secondary(w) when Secondary.is_linebreak(w) => let row_indent = container_indent + contained_indent; let indent = - contained_indent + (Id.Map.find(w.id, is_indented) ? 2 : 0); + if (Segment.sameline_secondary(tl)) { + 0; + } else { + contained_indent + (Id.Map.find(w.id, is_indented) ? 2 : 0); + }; let last = Point.{row: origin.row + 1, col: container_indent + indent}; let map = diff --git a/src/haz3lcore/dynamics/ExpandingKeyword.re b/src/haz3lcore/dynamics/ExpandingKeyword.re deleted file mode 100644 index 58ecbe7553..0000000000 --- a/src/haz3lcore/dynamics/ExpandingKeyword.re +++ /dev/null @@ -1,31 +0,0 @@ -[@deriving (show({with_path: false}), sexp, yojson)] -type t = - | Let - | Case - | Fun - | Test; - -let is_Let = String.equal("let"); -let is_Case = String.equal("case"); -let is_Fun = String.equal("fun"); -let is_Test = String.equal("test"); - -let mk = (text: string): option(t) => - if (text |> is_Let) { - Some(Let); - } else if (text |> is_Case) { - Some(Case); - } else if (text |> is_Fun) { - Some(Fun); - } else if (text |> is_Test) { - Some(Test); - } else { - None; - }; - -let to_string = - fun - | Let => "let" - | Case => "case" - | Fun => "fun" - | Test => "test"; diff --git a/src/haz3lcore/zipper/Time.re b/src/haz3lcore/zipper/Time.re deleted file mode 100644 index 34a363f279..0000000000 --- a/src/haz3lcore/zipper/Time.re +++ /dev/null @@ -1,15 +0,0 @@ -type t = int; -let t = ref(0); - -let tick = (): t => { - let time = t^; - t := time + 1; - time; -}; - -let lt = (<); - -let min = min; -let max = max; - -let max_time = Int.max_int; diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 4de0d813f3..55ccad41b8 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -271,7 +271,7 @@ let go_history = let Editor.State.{zipper, meta} = ed.state; Effect.s_clear(); let+ z = go_z(~settings, ~meta, a, zipper); - Editor.new_state(~effects=Effect.s^, ~settings, a, z, ed); + Editor.new_state(~settings, a, z, ed); }; let go = From c66fa7d4a8946fca97366ace115c710e9f06da12 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 18:30:43 -0400 Subject: [PATCH 155/168] rm effects. this may have molding-related perf effects i don't understand. let --- src/haz3lcore/zipper/Editor.re | 32 ++++---------------------- src/haz3lcore/zipper/Zipper.re | 10 -------- src/haz3lcore/zipper/action/Effect.re | 12 ---------- src/haz3lcore/zipper/action/Perform.re | 10 ++++++-- 4 files changed, 13 insertions(+), 51 deletions(-) delete mode 100644 src/haz3lcore/zipper/action/Effect.re diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index ff0573bb98..e82f89791c 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -102,15 +102,7 @@ module Meta = { let yojson_of_t = _ => failwith("Editor.Meta.yojson_of_t"); let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); - let next = - ( - ~effects as _: list(Effect.t)=[], - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - meta: t, - ) - : t => { + let next = (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, meta: t): t => { print_endline("Editor.next. Action:" ++ Action.show(a)); let syntax = CachedSyntax.next(a, z, meta.statics.info_map, meta.syntax); let statics = CachedStatics.next(~settings, a, z, meta.statics); @@ -137,16 +129,9 @@ module State = { meta: Meta.init(zipper, ~settings), }; - let next = - ( - ~effects: list(Effect.t)=[], - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - state, - ) => { + let next = (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, state) => { zipper: z, - meta: Meta.next(~effects, ~settings, a, z, state.meta), + meta: Meta.next(~settings, a, z, state.meta), }; }; @@ -178,15 +163,8 @@ let init = (~read_only=false, z, ~settings: CoreSettings.t) => { }; let new_state = - ( - ~effects: list(Effect.t)=[], - ~settings: CoreSettings.t, - a: Action.t, - z: Zipper.t, - ed: t, - ) - : t => { - let state = State.next(~effects, ~settings, a, z, ed.state); + (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, ed: t): t => { + let state = State.next(~settings, a, z, ed.state); let history = Action.is_historic(a) ? History.add(a, ed.state, ed.history) : ed.history; diff --git a/src/haz3lcore/zipper/Zipper.re b/src/haz3lcore/zipper/Zipper.re index adf12190d1..18ce31dffc 100644 --- a/src/haz3lcore/zipper/Zipper.re +++ b/src/haz3lcore/zipper/Zipper.re @@ -171,9 +171,6 @@ let pick_up = (z: t): t => { |> Segment.trim_grout_around_secondary(Left) |> Segment.trim_grout_around_secondary(Right) |> Selection.mk; - Segment.tiles(selection.content) - |> List.map((t: Tile.t) => t.id) - |> Effect.s_touch; let backpack = Backpack.push(selection, z.backpack); {...z, backpack}; }; @@ -192,7 +189,6 @@ let destruct = (~destroy_kids=true, z: t): t => { let to_pick_up = destroy_kids ? List.map(Tile.disintegrate, to_pick_up) |> List.flatten : to_pick_up; - Effect.s_touch(List.map((t: Tile.t) => t.id, to_pick_up)); let backpack = backpack |> Backpack.remove_matching(to_remove) @@ -208,9 +204,6 @@ let delete = (d: Direction.t, z: t): option(t) => let put_down = (d: Direction.t, z: t): option(t) => { let z = destruct(z); let* (_, popped, backpack) = pop_backpack(z); - Segment.tiles(popped.content) - |> List.map((t: Tile.t) => t.id) - |> Effect.s_touch; let z = {...z, backpack} |> put_selection(popped) |> unselect; switch (d) { | Left => Some(z) @@ -229,7 +222,6 @@ let rec construct = /* Special case for comments, can't rely on the last branch to construct */ let content = Secondary.construct_comment(content); let id = Id.mk(); - Effect.s_touch([id]); let z = destruct(z); let selections = [Selection.mk(Base.mk_secondary(id, content))]; let backpack = Backpack.push_s(selections, z.backpack); @@ -238,7 +230,6 @@ let rec construct = | [content] when Form.is_secondary(content) => let content = Secondary.Whitespace(content); let id = Id.mk(); - Effect.s_touch([id]); z |> update_siblings(((l, r)) => (l @ [Secondary({id, content})], r)); | _ => let z = destruct(z); @@ -247,7 +238,6 @@ let rec construct = // initial mold to typecheck, will be remolded let mold = List.hd(molds); let id = Id.mk(); - Effect.s_touch([id]); let selections = Tile.split_shards(id, label, mold, List.mapi((i, _) => i, label)) |> List.map(Segment.of_tile) diff --git a/src/haz3lcore/zipper/action/Effect.re b/src/haz3lcore/zipper/action/Effect.re deleted file mode 100644 index 8567cb44d1..0000000000 --- a/src/haz3lcore/zipper/action/Effect.re +++ /dev/null @@ -1,12 +0,0 @@ -[@deriving (show({with_path: false}), sexp, yojson)] -type t = - | Touch(Id.t) - | Delete(Id.t); - -// used to record effects over the course of a single action -let s: ref(list(t)) = ref([]); -let s_clear = () => s := []; -let s_touch = (ids: list(Id.t)) => - s := List.map(id => Touch(id), ids) @ s^; - -let s_touched = (id: Id.t): bool => List.mem(Touch(id), s^); diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 55ccad41b8..43e6d4f43f 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -269,9 +269,15 @@ let go_history = open Result.Syntax; /* This function is responsible for the action history */ let Editor.State.{zipper, meta} = ed.state; - Effect.s_clear(); + //Effect.s_clear(); let+ z = go_z(~settings, ~meta, a, zipper); - Editor.new_state(~settings, a, z, ed); + Editor.new_state( + /*~effects=Effect.s^,*/ + ~settings, + a, + z, + ed, + ); }; let go = From b32e569ea3e33258c653d1232367b4373ac25e05 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 18:34:34 -0400 Subject: [PATCH 156/168] forgot to save a file from prev --- src/haz3lcore/tiles/Segment.re | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/haz3lcore/tiles/Segment.re b/src/haz3lcore/tiles/Segment.re index 9464d69607..fb438eab24 100644 --- a/src/haz3lcore/tiles/Segment.re +++ b/src/haz3lcore/tiles/Segment.re @@ -114,10 +114,7 @@ and remold_tile = (s: Sort.t, shape, t: Tile.t): option(Tile.t) => { let child = if (l + 1 == r - && ( - List.nth(remolded.mold.in_, l) != List.nth(t.mold.in_, l) - || Effect.s_touched(remolded.id) - )) { + && List.nth(remolded.mold.in_, l) != List.nth(t.mold.in_, l)) { remold(child, List.nth(remolded.mold.in_, l)); } else { child; From 963a07e9e62051fccdeecd97337f79d924415fcc Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 26 Jul 2024 18:38:27 -0400 Subject: [PATCH 157/168] tests --- test/Test_Elaboration.re | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test_Elaboration.re b/test/Test_Elaboration.re index e7df7b59cd..5c53b5510c 100644 --- a/test/Test_Elaboration.re +++ b/test/Test_Elaboration.re @@ -19,7 +19,7 @@ let dhexp_typ = testable(Fmt.using(dhexp_print, Fmt.string), dhexp_eq); let ids = List.init(12, _ => Id.mk()); let id_at = x => x |> List.nth(ids); -let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); +let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); let dhexp_of_uexp = u => Elaborator.dhexp_of_uexp(mk_map(u), u, false); let alco_check = dhexp_typ |> Alcotest.check; From d2a995003c294f55a35c2960b27807db665050aa Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 27 Jul 2024 16:33:46 -0400 Subject: [PATCH 158/168] clarify deco exception catching --- src/haz3lcore/zipper/Editor.re | 2 +- src/haz3lweb/view/Deco.re | 91 ++++++++++++++++------------------ test/Test_Elaboration.re | 2 +- 3 files changed, 46 insertions(+), 49 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index e82f89791c..73142dc6d8 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -103,7 +103,7 @@ module Meta = { let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); let next = (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, meta: t): t => { - print_endline("Editor.next. Action:" ++ Action.show(a)); + //print_endline("Editor.next. Action:" ++ Action.show(a)); let syntax = CachedSyntax.next(a, z, meta.statics.info_map, meta.syntax); let statics = CachedStatics.next(~settings, a, z, meta.statics); let col_target = diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index cac57ab2b5..948445c34a 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -326,67 +326,64 @@ module Deco = (M: { ) ) ) { - | _ => + | Not_found => /* This is caused by the statics overloading for exercise mode. The overriding - * Exercise mode statics is calculated based on splicing together multiple - * editors; the way the splicings are designed, a given splicing might cover more - * than just the editor to which it's statics are being applied, so there may - * be error holes that don't occur in the editor. However, any errors that do - * occur in the editor will be represented, so this hack works for now */ - //TODO(andrew): clarify + * Exercise mode statics maps are calculated based on splicing together multiple + * editors, but error_ids are extracted generically from the statics map, so + * there may be error holes that don't occur in the editor being rendered. + * Additionally, when showing color highlights when the backpack is non-empty, + * the prospective completion may have different ids than the displayed code. */ Node.div([]) }; let color_highlights = (colorings: list((Id.t, string))) => { - List.filter_map( + List.map( ((id, color)) => - /* HACK(andrew): Catching exceptions since when showing - term highlights when the backpack is non-empty, the - prospective completion may have different term ids - than the displayed code. */ - try(Some(term_highlight(~clss=["highlight-code-" ++ color], id))) { - | Not_found => None - }, + term_highlight(~clss=["highlight-code-" ++ color], id), colorings, ); }; let error_view = (id: Id.t) => - switch (Id.Map.find_opt(id, M.meta.syntax.projectors)) { - | Some(p) => - /* Special case for projectors as they are not in tile map */ - let shapes = ProjectorBase.shapes(p); - let measurement = Id.Map.find(id, M.meta.syntax.measured.projectors); - div_c( - "errors-piece", - [PieceDec.simple_shard_error(~font_metrics, ~shapes, ~measurement)], - ); - | None => - let tiles = - Id.Map.find(id, M.meta.syntax.terms) - |> Term.ids - |> List.map(id => { - let t = tile(id); - let shards = - Measured.find_shards( - ~msg="Deco.errors_of_tile", - t, - M.meta.syntax.measured, - ); - PieceDec.simple_shards_errors(~font_metrics, t.mold, shards); - }); - div_c("errors-piece", List.flatten(tiles)); + try( + switch (Id.Map.find_opt(id, M.meta.syntax.projectors)) { + | Some(p) => + /* Special case for projectors as they are not in tile map */ + let shapes = ProjectorBase.shapes(p); + let measurement = Id.Map.find(id, M.meta.syntax.measured.projectors); + div_c( + "errors-piece", + [ + PieceDec.simple_shard_error(~font_metrics, ~shapes, ~measurement), + ], + ); + | None => + let tiles = + Id.Map.find(id, M.meta.syntax.terms) + |> Term.ids + |> List.map(id => { + let t = tile(id); + let shards = + Measured.find_shards( + ~msg="Deco.errors_of_tile", + t, + M.meta.syntax.measured, + ); + PieceDec.simple_shards_errors(~font_metrics, t.mold, shards); + }); + div_c("errors-piece", List.flatten(tiles)); + } + ) { + | Not_found => + /* This is caused by the statics overloading for exercise mode. The overriding + * Exercise mode statics maps are calculated based on splicing together multiple + * editors, but error_ids are extracted generically from the statics map, so + * there may be error holes that don't occur in the editor being rendered */ + Node.div([]) }; let errors = () => - div_c( - "errors", - try(List.map(error_view, M.meta.statics.error_ids)) { - | Not_found => - //TODO(andrew): clarify - [] - }, - ); + div_c("errors", List.map(error_view, M.meta.statics.error_ids)); let indication = (z: Zipper.t) => switch (Projector.indicated(z)) { diff --git a/test/Test_Elaboration.re b/test/Test_Elaboration.re index 5c53b5510c..e7df7b59cd 100644 --- a/test/Test_Elaboration.re +++ b/test/Test_Elaboration.re @@ -19,7 +19,7 @@ let dhexp_typ = testable(Fmt.using(dhexp_print, Fmt.string), dhexp_eq); let ids = List.init(12, _ => Id.mk()); let id_at = x => x |> List.nth(ids); -let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); +let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); let dhexp_of_uexp = u => Elaborator.dhexp_of_uexp(mk_map(u), u, false); let alco_check = dhexp_typ |> Alcotest.check; From cd53d6f2f4c64dab0fb0c1a7d90d5916a2d2cf2c Mon Sep 17 00:00:00 2001 From: disconcision Date: Sat, 27 Jul 2024 17:02:37 -0400 Subject: [PATCH 159/168] tests --- test/Test_Elaboration.re | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Test_Elaboration.re b/test/Test_Elaboration.re index e7df7b59cd..5c53b5510c 100644 --- a/test/Test_Elaboration.re +++ b/test/Test_Elaboration.re @@ -19,7 +19,7 @@ let dhexp_typ = testable(Fmt.using(dhexp_print, Fmt.string), dhexp_eq); let ids = List.init(12, _ => Id.mk()); let id_at = x => x |> List.nth(ids); -let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); +let mk_map = Statics.mk(CoreSettings.on, Builtins.ctx_init); let dhexp_of_uexp = u => Elaborator.dhexp_of_uexp(mk_map(u), u, false); let alco_check = dhexp_typ |> Alcotest.check; From 0044c297e67a7d00bc4d3e0e3d1a4efa33b3a16d Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 28 Jul 2024 00:00:57 -0400 Subject: [PATCH 160/168] deco cleanup --- src/haz3lweb/view/Cell.re | 25 ++-- src/haz3lweb/view/Deco.re | 170 +++++++++++----------- src/haz3lweb/view/ExplainThis.re | 1 + src/haz3lweb/view/ProjectorView.re | 10 +- src/haz3lweb/view/dec/PieceDec.re | 180 +++++++---------------- src/haz3lweb/www/style.css | 223 +++++++++++++---------------- 6 files changed, 260 insertions(+), 349 deletions(-) diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index e07c9efa82..b340e06cd2 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -119,6 +119,7 @@ let deco = Deco.Deco({ let ui_state = ui_state; let meta = meta; + let highlights = highlights; }); let decos = selected ? Deco.all(z) : Deco.always(); let decos = @@ -131,21 +132,15 @@ let deco = ~font_metrics=ui_state.font_metrics, ), ]; - let decos = - switch (test_results) { - | None => decos - | Some(test_results) => - decos - @ test_result_layer( - ~font_metrics=ui_state.font_metrics, - ~measured=meta.syntax.measured, - test_results, - ) // TODO move into decos - }; - switch (highlights) { - | Some(colorMap) => - decos @ Deco.color_highlights(ColorSteps.to_list(colorMap)) - | _ => decos + switch (test_results) { + | None => decos + | Some(test_results) => + decos + @ test_result_layer( + ~font_metrics=ui_state.font_metrics, + ~measured=meta.syntax.measured, + test_results, + ) // TODO move into decos }; }; diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 948445c34a..862d8bed37 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -3,68 +3,34 @@ open Util; open Util.Web; open Haz3lcore; -module Deco = (M: { - let ui_state: Model.ui_state; - let meta: Editor.Meta.t; - }) => { - let font_metrics = M.ui_state.font_metrics; - - let tile = id => Id.Map.find(id, M.meta.syntax.tiles); - - let caret = (z: Zipper.t): Node.t => { - let origin = Zipper.caret_point(M.meta.syntax.measured, z); - let shape = Zipper.caret_direction(z); - let side = - switch (Indicated.piece(z)) { - | Some((_, side, _)) => side - | _ => Right - }; - CaretDec.view(~font_metrics, ~profile={side, origin, shape}); - }; - - type shard_data = (Measured.measurement, Nibs.shapes); +type shard_data = (Measured.measurement, Nibs.shapes); - let sel_shard_svg = - (~index=?, ~start_shape, measurement: Measured.measurement, p) - : (Measured.measurement, Nibs.shapes) => ( - measurement, - Mold.nib_shapes(~index?, Piece.mold_of(~shape=start_shape, p)), - ); - - let rec sel_of_piece = +let sel_shard_svg = + (~index=?, ~start_shape, measurement: Measured.measurement, p) + : (Measured.measurement, Nibs.shapes) => ( + measurement, + Mold.nib_shapes(~index?, Piece.mold_of(~shape=start_shape, p)), +); +module HighlightSegment = + ( + M: { + let measured: Measured.t; + let info_map: Statics.Map.t; + let font_metrics: FontMetrics.t; + }, + ) => { + let find_g = Measured.find_g(~msg="Highlight.of_piece", _, M.measured); + let find_w = Measured.find_w(~msg="Highlight.of_piece", _, M.measured); + let rec of_piece = (start_shape: Nib.Shape.t, p: Piece.t) : (Nib.Shape.t, list(option(shard_data))) => { let shard_data = switch (p) { - | Tile(t) => sel_of_tile(~start_shape, t) - | Projector(p) => sel_of_projector(~start_shape, p) - | Grout(g) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_g( - ~msg="Deco.sel_of_piece", - g, - M.meta.syntax.measured, - ), - p, - ), - ), - ] + | Tile(t) => of_tile(~start_shape, t) + | Projector(p) => of_projector(~start_shape, p) + | Grout(g) => [Some(sel_shard_svg(~start_shape, find_g(g), p))] | Secondary(w) when Secondary.is_linebreak(w) => [None] - | Secondary(w) => [ - Some( - sel_shard_svg( - ~start_shape, - Measured.find_w( - ~msg="Deco.sel_of_piece", - w, - M.meta.syntax.measured, - ), - p, - ), - ), - ] + | Secondary(w) => [Some(sel_shard_svg(~start_shape, find_w(w), p))] }; let start_shape = switch (Piece.nibs(p)) { @@ -73,9 +39,9 @@ module Deco = (M: { }; (start_shape, shard_data); } - and sel_of_tile = (~start_shape, t: Tile.t): list(option(shard_data)) => { + and of_tile = (~start_shape, t: Tile.t): list(option(shard_data)) => { let tile_shards = - Measured.find_shards(~msg="sel_of_tile", t, M.meta.syntax.measured) + Measured.find_shards(~msg="sel_of_tile", t, M.measured) |> List.filter(((i, _)) => List.mem(i, t.shards)) |> List.map(((index, m)) => { let token = List.nth(t.label, index); @@ -89,18 +55,18 @@ module Deco = (M: { }); let shape_at = index => snd(Mold.nibs(~index, t.mold)).shape; let children_shards = - t.children |> List.mapi(index => sel_of_segment(shape_at(index))); + t.children |> List.mapi(index => of_segment(shape_at(index))); ListUtil.interleave(tile_shards, children_shards) |> List.flatten; } - and sel_of_projector = + and of_projector = (~start_shape, p: Base.projector): list(option(shard_data)) => { let m = - switch (Measured.find_pr_opt(p, M.meta.syntax.measured)) { + switch (Measured.find_pr_opt(p, M.measured)) { | None => failwith("TODO(andrew): Deco.sel_of_projector: missing measurement") | Some(m) => m }; - let ci = Id.Map.find_opt(p.id, M.meta.statics.info_map); + let ci = Id.Map.find_opt(p.id, M.info_map); let token = Projector.placeholder(p, ci); switch (StringUtil.num_linebreaks(token)) { | 0 => [Some(sel_shard_svg(~start_shape, ~index=0, m, Projector(p)))] @@ -110,36 +76,68 @@ module Deco = (M: { | num_lb => List.init(num_lb, _ => None) }; } - and sel_of_segment = + and of_segment = (start_shape: Nib.Shape.t, seg: Segment.t): list(option(shard_data)) => { seg - |> ListUtil.fold_left_map(sel_of_piece, start_shape) + |> ListUtil.fold_left_map(of_piece, start_shape) |> snd |> List.flatten; } - and selected_pieces = (z: Zipper.t): list(Node.t) => + and go = (segment: Segment.t, shape_init, classes): list(Node.t) => /* We draw a single deco per row by dividing partionining the shards * into linebreak-seperated segments, then combining the measurements * and shapes of the first and last shard of each segment. Ideally we * could just get this info from the row measurements, but we have no * current way of figuring out shapes for whitespace without traversing */ - sel_of_segment( - fst(Siblings.shapes(z.relatives.siblings)), - z.selection.content, - ) + of_segment(shape_init, segment) |> ListUtil.split_at_nones |> ListUtil.first_and_last |> List.map((((m1, (l1, _)): shard_data, (m2, (_, r2)): shard_data)) => (({origin: m1.origin, last: m2.last}, (l1, r2)): shard_data) ) |> List.map(((measurement, shapes)) => - PieceDec.simple_shard_selected( - ~buffer=Selection.is_buffer(z.selection), - ~font_metrics, - ~measurement, - ~shapes, + PieceDec.simple_shard( + {font_metrics: M.font_metrics, measurement, shapes}, + classes, ) ); +}; + +module Deco = + ( + M: { + let ui_state: Model.ui_state; + let meta: Editor.Meta.t; + let highlights: option(ColorSteps.colorMap); + }, + ) => { + module Highlight = + HighlightSegment({ + let measured = M.meta.syntax.measured; + let info_map = M.meta.statics.info_map; + let font_metrics = M.ui_state.font_metrics; + }); + let font_metrics = M.ui_state.font_metrics; + + let tile = id => Id.Map.find(id, M.meta.syntax.tiles); + + let caret = (z: Zipper.t): Node.t => { + let origin = Zipper.caret_point(M.meta.syntax.measured, z); + let shape = Zipper.caret_direction(z); + let side = + switch (Indicated.piece(z)) { + | Some((_, side, _)) => side + | _ => Right + }; + CaretDec.view(~font_metrics, ~profile={side, origin, shape}); + }; + + let segment_selected = (z: Zipper.t) => + Highlight.go( + z.selection.content, + fst(Siblings.shapes(z.relatives.siblings)), + ["selected"] @ (Selection.is_buffer(z.selection) ? ["buffer"] : []), + ); let indicated_piece_deco = (z: Zipper.t): list(Node.t) => { switch (Indicated.piece(z)) { @@ -336,13 +334,18 @@ module Deco = (M: { Node.div([]) }; - let color_highlights = (colorings: list((Id.t, string))) => { - List.map( - ((id, color)) => - term_highlight(~clss=["highlight-code-" ++ color], id), - colorings, + let color_highlights = () => + div_c( + "color-highlights", + List.map( + ((id, color)) => + term_highlight(~clss=["highlight-code-" ++ color], id), + switch (M.highlights) { + | Some(colorMap) => ColorSteps.to_list(colorMap) + | _ => [] + }, + ), ); - }; let error_view = (id: Id.t) => try( @@ -353,9 +356,7 @@ module Deco = (M: { let measurement = Id.Map.find(id, M.meta.syntax.measured.projectors); div_c( "errors-piece", - [ - PieceDec.simple_shard_error(~font_metrics, ~shapes, ~measurement), - ], + [PieceDec.simple_shard_error({font_metrics, shapes, measurement})], ); | None => let tiles = @@ -391,7 +392,7 @@ module Deco = (M: { | None => div_c("indication", indicated_piece_deco(z)) }; - let selection = (z: Zipper.t) => div_c("selects", selected_pieces(z)); + let selection = (z: Zipper.t) => div_c("selects", segment_selected(z)); let always = () => [errors()]; @@ -402,5 +403,6 @@ module Deco = (M: { backpack(z), backpack_targets(z.backpack, M.meta.syntax.segment), errors(), + color_highlights(), ]; }; diff --git a/src/haz3lweb/view/ExplainThis.re b/src/haz3lweb/view/ExplainThis.re index 7f8a4f4d97..dcae41b89a 100644 --- a/src/haz3lweb/view/ExplainThis.re +++ b/src/haz3lweb/view/ExplainThis.re @@ -245,6 +245,7 @@ let expander_deco = ~settings=CoreSettings.off, Zipper.unzip(doc.syntactic_form), ); + let highlights: option(ColorSteps.colorMap) = None; }); let Model.{font_metrics, _} = ui_state; switch (doc.expandable_id, List.length(options)) { diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 0b6547e835..caac2a0ead 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -47,7 +47,12 @@ let backing_deco = ) => switch (shape) { | Inline(_) - | Block(_) => PieceDec.convex_shard(~font_metrics, ~measurement) + | Block(_) => + PieceDec.relative_shard({ + font_metrics, + measurement, + shapes: (Convex, Convex), + }) }; /* Adds attributes to a projector UI to support @@ -81,7 +86,6 @@ let view_wrapper = p: Base.projector, view: Node.t, ) => { - let fudge = selected ? PieceDec.selection_fudge : DecUtil.fzero; let shape = Projector.shape(p, info); let focus = (id, _) => Effect.( @@ -96,7 +100,7 @@ let view_wrapper = ["projector", name(p.kind)] @ status(indication, selected, shape), ), Attr.on_mousedown(focus(info.id)), - DecUtil.abs_style(measurement, ~fudge, ~font_metrics), + DecUtil.abs_style(measurement, ~font_metrics), ], [view, backing_deco(~font_metrics, ~measurement, ~shape)], ); diff --git a/src/haz3lweb/view/dec/PieceDec.re b/src/haz3lweb/view/dec/PieceDec.re index b9f98e4f8b..46f25d4331 100644 --- a/src/haz3lweb/view/dec/PieceDec.re +++ b/src/haz3lweb/view/dec/PieceDec.re @@ -14,27 +14,26 @@ let adj: Nib.Shape.t => float = | Convex => DecUtil.convex_adj | Concave(_) => DecUtil.concave_adj; -let l_hook = (l: Nib.Shape.t): list(Path.cmd) => [ - H_({dx: -. adj(l)}), - L_({dx: -. run(l), dy: (-0.5)}), - L_({dx: +. run(l), dy: (-0.5)}), - H_({dx: +. adj(l)}), +let chevron = (a: float, b: float, c: float): list(Path.cmd) => [ + H_({dx: -. a}), + L_({dx: -. b, dy: c}), + L_({dx: +. b, dy: c}), + H_({dx: +. a}), ]; -let r_hook = (r: Nib.Shape.t): list(Path.cmd) => [ - H_({dx: +. adj(r)}), - L_({dx: +. run(r), dy: 0.5}), - L_({dx: -. run(r), dy: 0.5}), - H_({dx: -. adj(r)}), -]; +let left_chevron = (l: Nib.Shape.t): list(Path.cmd) => + chevron(adj(l), run(l), -0.5); + +let right_chevron = (l: Nib.Shape.t): list(Path.cmd) => + chevron(-. adj(l), -. run(l), 0.5); -let simple_shard_path = ((l, r): Nibs.shapes, length: int): list(Path.cmd) => +let _simple_shard_path = ((l, r): Nibs.shapes, length: int): list(Path.cmd) => List.flatten( Path.[ [m(~x=0, ~y=0), h(~x=length)], - r_hook(r), + right_chevron(r), [h(~x=0)], - l_hook(l), + left_chevron(l), ], ); @@ -43,29 +42,31 @@ let chonky_shard_path = List.flatten( Path.[ [m(~x=0, ~y=0), h(~x=length), v(~y=height)], - r_hook(r), + right_chevron(r), [h(~x=0), v(~y=1)], - l_hook(l), + left_chevron(l), ], ); +type shard_dims = { + font_metrics: FontMetrics.t, + shapes: Nibs.shapes, + measurement: Measured.measurement, +}; + let simple_shard = ( - ~font_metrics, - ~shapes, - ~path_cls, - ~base_cls, - ~fudge=DecUtil.fzero, + {font_metrics, shapes, measurement}: shard_dims, ~absolute=true, - measurement: Measured.measurement, + classes, ) : t => DecUtil.code_svg_sized( ~font_metrics, ~measurement, - ~base_cls, - ~path_cls, - ~fudge, + ~base_cls=["shard"] @ classes, + ~path_cls=[], + //~fudge, ~absolute, chonky_shard_path( shapes, @@ -74,119 +75,46 @@ let simple_shard = ), ); -let _simple_shard = - ( - ~font_metrics, - ~shapes, - ~path_cls, - ~base_cls, - ~fudge=DecUtil.fzero, - ~absolute=true, - measurement: Measured.measurement, - ) - : t => - DecUtil.code_svg_sized( - ~font_metrics, - ~measurement, - ~base_cls, - ~path_cls, - ~fudge, - ~absolute, - simple_shard_path(shapes, measurement.last.col - measurement.origin.col), - ); - -let relative_shard = - (~font_metrics, ~shapes, ~measurement: Measured.measurement) => - simple_shard( - ~absolute=false, - ~font_metrics, - ~shapes, - ~path_cls=[], - ~base_cls=[], - measurement, - ); - -let convex_shard = relative_shard(~shapes=(Convex, Convex)); +let relative_shard = (shard_dims: shard_dims) => + simple_shard(~absolute=false, shard_dims, []); -let selection_fudge: DecUtil.fdims = { - height: 0.3, - top: 0., - width: 0., - left: 0., -}; - -let simple_shard_selected = - (~font_metrics, ~shapes, ~measurement: Measured.measurement, ~buffer): t => { - let path_cls = [ - "tile-path", - "raised", - buffer ? "selected-buffer" : "selected", - ]; - let base_cls = ["tile-selected"]; - simple_shard( - /* Increase height slightly to avoid leaving spaces between selected lines */ - ~fudge=selection_fudge, - ~font_metrics, - ~shapes, - ~path_cls, - ~base_cls, - measurement, +let simple_shards_indicated = + (~font_metrics: FontMetrics.t, (id, mold, shards), ~caret: (Id.t, int)) + : list(t) => + List.map( + ((index, measurement)) => + simple_shard( + {font_metrics, measurement, shapes: Mold.nib_shapes(~index, mold)}, + ["indicated", Sort.to_string(mold.out)] + @ (caret == (id, index) ? ["caret"] : []), + ), + shards, ); -}; -let simple_shard_indicated = - ( - ~font_metrics, - ~has_caret, - ~shapes, - ~sort, - ~measurement: Measured.measurement, - ) - : t => { - let path_cls = - ["tile-path", "raised", Sort.to_string(sort)] - @ (has_caret ? ["indicated-caret"] : ["indicated"]); - let base_cls = ["tile-indicated"]; - simple_shard(~font_metrics, ~shapes, ~path_cls, ~base_cls, measurement); -}; +let simple_shard_selected = (shard_dims, buffer): t => + simple_shard(shard_dims, ["selected"] @ (buffer ? ["buffer"] : [])); -let simple_shard_error = - (~font_metrics, ~shapes, ~measurement: Measured.measurement): t => { - let path_cls = ["tile-path", "error"]; - let base_cls = ["tile-error"]; - simple_shard( - ~fudge=selection_fudge, - ~font_metrics, - ~shapes, - ~path_cls, - ~base_cls, - measurement, - ); -}; - -let simple_shards_errors = (~font_metrics: FontMetrics.t, mold, shards) => +let simple_shards_selected = + (~font_metrics: FontMetrics.t, mold, buffer, shards) => List.map( ((index, measurement)) => - simple_shard_error( - ~font_metrics, - ~shapes=Mold.nib_shapes(~index, mold), - ~measurement, + simple_shard_selected( + {font_metrics, measurement, shapes: Mold.nib_shapes(~index, mold)}, + buffer, ), shards, ); -let simple_shards_indicated = - (~font_metrics: FontMetrics.t, ~caret: (Id.t, int), (id, mold, shards)) - : list(t) => +let simple_shard_error = simple_shard(_, ["error"]); + +let simple_shards_errors = (~font_metrics: FontMetrics.t, mold, shards) => List.map( ((index, measurement)) => - simple_shard_indicated( - ~font_metrics, - ~has_caret=caret == (id, index), - ~shapes=Mold.nib_shapes(~index, mold), - ~sort=mold.out, - ~measurement, - ), + simple_shard_error({ + font_metrics, + measurement, + shapes: Mold.nib_shapes(~index, mold), + }), shards, ); diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index cda220b246..959a7a46de 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -699,14 +699,18 @@ select { .projector.indicated > svg { fill: var(--exp-bg-off-color); } +.projector > svg > path { + vector-effect: non-scaling-stroke; +} +.projector.block.selected > svg > path { + vector-effect: non-scaling-stroke; + filter: url(#raised-drop-shadow-Nul) !important; +} .projector.selected > svg, .projector.selected.indicated > svg, .projector.block.selected.indicated > svg { fill: var(--selection-color); } -.projector > svg > path { - vector-effect: non-scaling-stroke; -} /* PROJECTOR: FOLD */ @@ -961,9 +965,103 @@ select { border-radius: 4px; } -.tile-indicated { +/* SHARD DECORATIONS */ +svg.shard > path { + vector-effect: non-scaling-stroke; +} + +svg.shard.Nul > path { + filter: url(#drop-shadow-Nul); +} +svg.shard.Any > path { + filter: url(#drop-shadow-Any); +} +svg.shard.Exp > path { + filter: url(#drop-shadow-Exp); +} +svg.shard.Pat > path { + filter: url(#drop-shadow-Pat); +} +svg.shard.Typ > path { + filter: url(#drop-shadow-Typ); +} +svg.shard.Rul > path { + filter: url(#drop-shadow-Rul); +} +svg.shard.TPat > path { + filter: url(#drop-shadow-TPat); +} + +svg.shard.indicated.Nul > path { + fill: var(--nul-bg-color); + filter: url(#raised-drop-shadow-Nul); +} +svg.shard.indicated.Any > path .indicated { + fill: var(--any-bg-color); + filter: url(#raised-drop-shadow-Any); +} +svg.shard.indicated.Exp > path { + fill: var(--exp-bg-color); + filter: url(#raised-drop-shadow-Exp); +} +svg.shard.indicated.Pat > path { + fill: var(--pat-bg-off-color); + filter: url(#raised-drop-shadow-Pat); +} +svg.shard.indicated.Typ > path { + fill: var(--typ-bg-off-color); + filter: url(#raised-drop-shadow-Typ); +} +svg.shard.indicated.Rul > path { + fill: var(--rul-bg-color); + filter: url(#raised-drop-shadow-Rul); +} +svg.shard.indicated.TPat > path { + fill: var(--tpat-bg-off-color); + filter: url(#raised-drop-shadow-TPat); +} + +svg.shard.indicated.caret.Exp > path { + fill: var(--exp-bg-off-color); +} +svg.shard.indicated.caret.Pat > path { + fill: var(--pat-bg-color); +} +svg.shard.indicated.caret.Typ > path { + fill: var(--typ-bg-color); +} +.svg.shard.indicated.caret.TPat > path { + fill: var(--tpat-bg-color); +} + +svg.shard.indicated { + z-index: var(--tile-z); +} +svg.shard.selected { z-index: var(--tile-z); } +svg.shard.error { + z-index: var(--err-hole-z); +} + +svg.shard.selected > path { + fill: var(--selection-color); + stroke-width: 0.5px; + stroke: var(--selection-color); + filter: url(#raised-drop-shadow-Nul); +} +svg.shard.selected.buffer > path { + fill: #fbf3de; +} +svg.shard.error > path { + fill: #ff00000a; + stroke: #ff000087; + stroke-width: 0.75px; + stroke-dasharray: 1, 1; + stroke-linecap: butt; +} + +/* END SHARD DECORATIONS */ .current-caret-pos-container { z-index: var(--current-caret-pos-z); @@ -1024,23 +1122,6 @@ select { z-index: -1; } -svg.tile-selected { - z-index: var(--tile-z); -} - -.tile-path.selected { - fill: var(--selection-color); -} - -.tile-path.selected-buffer { - fill: #fbf3de; -} - -/* TODO(andrew): hack important */ -.tile-path.raised.selected { - filter: url(#raised-drop-shadow-Nul) !important; -} - .caret-position-path { vector-effect: non-scaling-stroke; stroke-width: 0.1px; @@ -1092,94 +1173,6 @@ svg.tile-selected { color: var(--tpat-text-color); } -.tile-path.Nul { - filter: url(#drop-shadow-Nul); -} -.tile-path.Any { - filter: url(#drop-shadow-Any); -} -.tile-path.Exp { - filter: url(#drop-shadow-Exp); -} -.tile-path.Pat { - filter: url(#drop-shadow-Pat); -} -.tile-path.Typ { - filter: url(#drop-shadow-Typ); -} -.tile-path.Rul { - filter: url(#drop-shadow-Rul); -} -.tile-path.TPat { - filter: url(#drop-shadow-TPat); -} - -.tile-path.Nul.indicated { - fill: var(--nul-bg-color); -} -.tile-path.Any.indicated { - fill: var(--any-bg-color); -} -.tile-path.Exp.indicated { - fill: var(--exp-bg-color); -} -.tile-path.Pat.indicated { - fill: var(--pat-bg-off-color); -} -.tile-path.Typ.indicated { - fill: var(--typ-bg-off-color); -} -.tile-path.Rul.indicated { - fill: var(--rul-bg-color); -} -.tile-path.TPat.indicated { - fill: var(--tpat-bg-off-color); -} - -.tile-path.Nul.indicated-caret { - fill: var(--nul-bg-color); -} -.tile-path.Any.indicated-caret { - fill: var(--any-bg-color); -} -.tile-path.Exp.indicated-caret { - fill: var(--exp-bg-off-color); -} -.tile-path.Pat.indicated-caret { - fill: var(--pat-bg-color); -} -.tile-path.Typ.indicated-caret { - fill: var(--typ-bg-color); -} -.tile-path.Rul.indicated-caret { - fill: var(--rul-bg-color); -} -.tile-path.TPat.indicated-caret { - fill: var(--tpat-bg-color); -} - -.tile-path.Nul.raised { - filter: url(#raised-drop-shadow-Nul); -} -.tile-path.Any.raised { - filter: url(#raised-drop-shadow-Any); -} -.tile-path.Exp.raised { - filter: url(#raised-drop-shadow-Exp); -} -.tile-path.Pat.raised { - filter: url(#raised-drop-shadow-Pat); -} -.tile-path.Typ.raised { - filter: url(#raised-drop-shadow-Typ); -} -.tile-path.Rul.raised { - filter: url(#raised-drop-shadow-Rul); -} -.tile-path.TPat.raised { - filter: url(#raised-drop-shadow-TPat); -} - .child-line.Nul { stroke: var(--nul-shadow-color); } @@ -1847,18 +1840,6 @@ svg.tile-selected { white-space: normal; } -.tile-error { - z-index: var(--err-hole-z); -} -.tile-path.error { - fill: #ff00000a; - stroke: #ff000087; - stroke-width: 0.75px; - vector-effect: non-scaling-stroke; - stroke-dasharray: 1, 1; - stroke-linecap: butt; -} - .highlight-blue { background-color: rgb(255 0 255 / 20%); } From e59e082299c72f19edff64dc4ce9b18bc44900b6 Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 31 Jul 2024 20:29:06 -0400 Subject: [PATCH 161/168] minor PR comment fixes --- src/haz3lcore/statics/MakeTerm.re | 16 +++---- src/haz3lcore/zipper/Editor.re | 13 ++++++ src/haz3lcore/zipper/Projector.re | 12 ++--- src/haz3lcore/zipper/ProjectorBase.re | 44 +++++++++---------- .../{CheckboxCore.re => CheckboxProj.re} | 0 .../projectors/{FoldCore.re => FoldProj.re} | 0 .../projectors/{InfoCore.re => InfoProj.re} | 0 .../{SliderFCore.re => SliderFProj.re} | 0 .../{SliderCore.re => SliderProj.re} | 0 .../{TextAreaCore.re => TextAreaProj.re} | 0 src/haz3lweb/Keyboard.re | 6 ++- src/haz3lweb/view/ProjectorView.re | 8 ++-- src/haz3lweb/www/style.css | 8 ++-- 13 files changed, 61 insertions(+), 46 deletions(-) rename src/haz3lcore/zipper/projectors/{CheckboxCore.re => CheckboxProj.re} (100%) rename src/haz3lcore/zipper/projectors/{FoldCore.re => FoldProj.re} (100%) rename src/haz3lcore/zipper/projectors/{InfoCore.re => InfoProj.re} (100%) rename src/haz3lcore/zipper/projectors/{SliderFCore.re => SliderFProj.re} (100%) rename src/haz3lcore/zipper/projectors/{SliderCore.re => SliderProj.re} (100%) rename src/haz3lcore/zipper/projectors/{TextAreaCore.re => TextAreaProj.re} (100%) diff --git a/src/haz3lcore/statics/MakeTerm.re b/src/haz3lcore/statics/MakeTerm.re index 784230d18d..82f5172c09 100644 --- a/src/haz3lcore/statics/MakeTerm.re +++ b/src/haz3lcore/statics/MakeTerm.re @@ -35,6 +35,12 @@ type unsorted = | Post(t, tiles) | Bin(t, tiles, t); +type t = { + term: UExp.t, + terms: TermMap.t, + projectors: Id.Map.t(Piece.projector), +}; + let is_nary = (is_sort: Any.t => option('sort), delim: Token.t, (delims, kids): tiles) : option(list('sort)) => @@ -94,12 +100,6 @@ let kids_of_unsorted = | Post(l, tiles) => [l] @ kids_of_tiles(tiles) | Bin(l, tiles, r) => [l] @ kids_of_tiles(tiles) @ [r]; -type data = { - term: UExp.t, - terms: TermMap.t, - projectors: Id.Map.t(Piece.projector), -}; - // Need this map to collect all structural terms, // not just the ones recognized in Statics. // TODO unhack @@ -139,7 +139,7 @@ let mk_bad = (ctr, ids, value) => { }; }; -let rec go_s = (s: Sort.t, skel: Skel.t, seg: Segment.t): t => +let rec go_s = (s: Sort.t, skel: Skel.t, seg: Segment.t): Term.Any.t => switch (s) { | Pat => Pat(pat(unsorted(skel, seg))) | TPat => TPat(tpat(unsorted(skel, seg))) @@ -518,7 +518,7 @@ and unsorted = (skel: Skel.t, seg: Segment.t): unsorted => { /* Remove projectors. We do this here as opposed to removing * them in an external call to save a whole-syntax pass. */ let seg = rm_and_log_projectors(seg); - let tile_kids = (p: Piece.t): list(t) => + let tile_kids = (p: Piece.t): list(Term.Any.t) => switch (p) { | Secondary(_) | Grout(_) => [] diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index b8e608532f..01346536e5 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -44,6 +44,19 @@ module CachedSyntax = { holes: list(Grout.t), selection_ids: list(Id.t), term: UExp.t, + /* This term, and the term-derived data structured below, may differ + * from the term used for semantics. These terms are identical when + * the backpack is empty. If the backpack is non-empty, then when we + * make the term for semantics, we attempt to empty the backpack + * according to some simple heuristics (~ try to empty it greedily + * while moving rightwards from the current caret position). + * this is currently necessary to have the cursorinfo/completion + * workwhen the backpack is nonempty. + * + * This is a brittle part of the current implementation. there are + * some other comments at some of the weakest joints; the biggest + * issue is that dropping the backpack can add/remove grout, causing + * certain ids to be present/non-present unexpectedly. */ term_ranges: TermRanges.t, terms: TermMap.t, projectors: Id.Map.t(Base.projector), diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index ab1a467106..38a23d88e1 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -6,12 +6,12 @@ open ProjectorBase; * are to be called; see `shape` below for an example */ let to_module = (kind: Base.kind): (module Cooked) => switch (kind) { - | Fold => (module Cook(FoldCore.M)) - | Info => (module Cook(InfoCore.M)) - | Slider => (module Cook(SliderCore.M)) - | SliderF => (module Cook(SliderFCore.M)) - | Checkbox => (module Cook(CheckboxCore.M)) - | TextArea => (module Cook(TextAreaCore.M)) + | Fold => (module Cook(FoldProj.M)) + | Info => (module Cook(InfoProj.M)) + | Slider => (module Cook(SliderProj.M)) + | SliderF => (module Cook(SliderFProj.M)) + | Checkbox => (module Cook(CheckboxProj.M)) + | TextArea => (module Cook(TextAreaProj.M)) }; let shape = (p: Base.projector, info: info): shape => { diff --git a/src/haz3lcore/zipper/ProjectorBase.re b/src/haz3lcore/zipper/ProjectorBase.re index 4f08073155..5abe811d76 100644 --- a/src/haz3lcore/zipper/ProjectorBase.re +++ b/src/haz3lcore/zipper/ProjectorBase.re @@ -35,7 +35,19 @@ type info = { ci: option(Info.t), }; -/* To add a new projector, implement this module signature */ +/* To add a new projector: + * 1. Create a new module implementing Projector (e.g. FoldCore) + * 2. Add an entry for it in Base.projector_kind + * 3. Register the module in Projector.to_module + * 4. If you want to expose the projector via a keyboard + * shortcut, see the existing entry for Fold in Keyboard + * 5. If you want to expose the projector in the projector + * panel bottom bar UI, update ProjectorView.name, + * ProjectorView.of_name, and ProjectorView.applicable_projectors + * 6. If you want to manually manage the projector as part of + * the update cycle, see the implementations of the SetIndicated + * and Remove actions in ProjectorPerform for how to manually + * add/remove projectors from an editor */ module type Projector = { /* The internal model type of the projector which will * be serialized and persisted. Use `unit` if you don't @@ -92,32 +104,18 @@ module type Projector = { let focus: ((Id.t, option(Direction.t))) => unit; }; -/* Projector model and action are serialized so that +/* A cooked projector is the same as the base module + * signature except model & action are serialized so * they may be used by the Editor without it having * specialized knowledge of projector internals */ -type serialized_model = string; -type serialized_action = string; - -/* A cooked projector is the same as the base module - * signature except model & action are serialized */ -module type Cooked = { - let init: serialized_model; - let can_project: Base.piece => bool; - let can_focus: bool; - let view: - ( - serialized_model, - ~info: info, - ~local: serialized_action => Ui_effect.t(unit), - ~parent: external_action => Ui_effect.t(unit) - ) => - Node.t; - let placeholder: (serialized_model, info) => shape; - let update: (serialized_model, serialized_action) => serialized_model; - let focus: ((Id.t, option(Direction.t))) => unit; -}; +module type Cooked = + Projector with type model = string and type action = string; module Cook = (C: Projector) : Cooked => { + [@deriving (show({with_path: false}), sexp, yojson)] + type model = string; + [@deriving (show({with_path: false}), sexp, yojson)] + type action = string; let serialize_m = m => m |> C.sexp_of_model |> Sexplib.Sexp.to_string; let deserialize_m = s => s |> Sexplib.Sexp.of_string |> C.model_of_sexp; let serialize_a = a => a |> C.sexp_of_action |> Sexplib.Sexp.to_string; diff --git a/src/haz3lcore/zipper/projectors/CheckboxCore.re b/src/haz3lcore/zipper/projectors/CheckboxProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/CheckboxCore.re rename to src/haz3lcore/zipper/projectors/CheckboxProj.re diff --git a/src/haz3lcore/zipper/projectors/FoldCore.re b/src/haz3lcore/zipper/projectors/FoldProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/FoldCore.re rename to src/haz3lcore/zipper/projectors/FoldProj.re diff --git a/src/haz3lcore/zipper/projectors/InfoCore.re b/src/haz3lcore/zipper/projectors/InfoProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/InfoCore.re rename to src/haz3lcore/zipper/projectors/InfoProj.re diff --git a/src/haz3lcore/zipper/projectors/SliderFCore.re b/src/haz3lcore/zipper/projectors/SliderFProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/SliderFCore.re rename to src/haz3lcore/zipper/projectors/SliderFProj.re diff --git a/src/haz3lcore/zipper/projectors/SliderCore.re b/src/haz3lcore/zipper/projectors/SliderProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/SliderCore.re rename to src/haz3lcore/zipper/projectors/SliderProj.re diff --git a/src/haz3lcore/zipper/projectors/TextAreaCore.re b/src/haz3lcore/zipper/projectors/TextAreaProj.re similarity index 100% rename from src/haz3lcore/zipper/projectors/TextAreaCore.re rename to src/haz3lcore/zipper/projectors/TextAreaProj.re diff --git a/src/haz3lweb/Keyboard.re b/src/haz3lweb/Keyboard.re index b368ba3dc7..fd9ebde091 100644 --- a/src/haz3lweb/Keyboard.re +++ b/src/haz3lweb/Keyboard.re @@ -106,9 +106,13 @@ let handle_key_event = (k: Key.t): option(Update.t) => { | "e" => now(Move(Extreme(Right(ByToken)))) | _ => None } + | {key: D("f"), sys: PC, shift: Up, meta: Up, ctrl: Up, alt: Down} => + Some(PerformAction(Project(ToggleIndicated(Fold)))) + | {key: D("ƒ"), sys: Mac, shift: Up, meta: Up, ctrl: Up, alt: Down} => + /* Curly ƒ is what holding option turns f into on Mac */ + Some(PerformAction(Project(ToggleIndicated(Fold)))) | {key: D(key), sys: _, shift: Up, meta: Up, ctrl: Up, alt: Down} => switch (key) { - | "ƒ" => Some(PerformAction(Project(ToggleIndicated(Fold)))) | "ArrowLeft" => now(MoveToBackpackTarget(Left(ByToken))) | "ArrowRight" => now(MoveToBackpackTarget(Right(ByToken))) | "Alt" => Some(SetMeta(ShowBackpackTargets(true))) diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index caac2a0ead..8fcfab1285 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -17,8 +17,8 @@ let name = (p: kind): string => | Fold => "fold" | Info => "type" | Checkbox => "check" - | Slider => "slide" - | SliderF => "slidef" + | Slider => "slider" + | SliderF => "sliderf" | TextArea => "text" }; @@ -30,8 +30,8 @@ let of_name = (p: string): kind => | "fold" => Fold | "type" => Info | "check" => Checkbox - | "slide" => Slider - | "slidef" => SliderF + | "slider" => Slider + | "sliderf" => SliderF | "text" => TextArea | _ => failwith("Unknown projector kind") }; diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 959a7a46de..b8a21894e2 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -750,15 +750,15 @@ select { /* PROJECTOR: SLIDERS (INT & FLOAT) */ -.projector.slide input, -.projector.slidef input { +.projector.slider input, +.projector.sliderf input { margin: 0; width: 90%; filter: sepia(1); cursor: pointer; } -.projector.slide:not(.indicated):not(:hover) > svg, -.projector.slidef:not(.indicated):not(:hover) > svg { +.projector.slider:not(.indicated):not(:hover) > svg, +.projector.sliderf:not(.indicated):not(:hover) > svg { fill: #0000; } From 59ba1eea6010d51489b90bfc642704078f870a7b Mon Sep 17 00:00:00 2001 From: disconcision Date: Wed, 31 Jul 2024 22:22:57 -0400 Subject: [PATCH 162/168] supress quote entry in string projector. clean up scratch slides --- .../zipper/projectors/TextAreaProj.re | 3 + src/haz3lweb/Init.ml | 650 +----------------- 2 files changed, 18 insertions(+), 635 deletions(-) diff --git a/src/haz3lcore/zipper/projectors/TextAreaProj.re b/src/haz3lcore/zipper/projectors/TextAreaProj.re index f66fba5a64..bee33b2fc9 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaProj.re +++ b/src/haz3lcore/zipper/projectors/TextAreaProj.re @@ -44,6 +44,9 @@ let key_handler = (id, ~parent, evt) => { | D("ArrowLeft" | "ArrowUp") when is_first_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; Many([parent(Escape(Left)), Stop_propagation]); + | D("\"") => + /* Hide quotes from both the textarea and parent editor */ + Many([Prevent_default, Stop_propagation]) | _ => Stop_propagation }; }; diff --git a/src/haz3lweb/Init.ml b/src/haz3lweb/Init.ml index 5c3a3b28bd..ee8087c7a2 100644 --- a/src/haz3lweb/Init.ml +++ b/src/haz3lweb/Init.ml @@ -29,7 +29,7 @@ let startup : PersistentData.t = benchmark = false; explainThis = { show = true; show_feedback = false; highlight = NoHighlight }; - mode = Exercises; + mode = Documentation; }; scratch = ( 0, @@ -38,636 +38,16 @@ let startup : PersistentData.t = zipper = "((selection((focus Left)(content())(mode \ Normal)))(backpack())(relatives((siblings(((Secondary((id \ - 839d3632-542c-4664-9b9f-991ca1ebdfbe)(content(Comment\"# \ - PROJECTORS #\"))))(Secondary((id \ - 7852672c-1f78-4cd4-975b-53ce4b49c74f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 40d40fd1-640a-44df-9be7-c3aa0d878983)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 66540dac-21e0-42cd-94a2-d632df946806)(content(Comment\"# Some \ - kinds of syntax have dedicated GUIs. \ - #\"))))(Secondary((id \ - 44a2d412-ea2c-42b0-93af-6ab71ae6947a)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 76c40380-769b-4e08-a2ed-f97270bbf7b8)(content(Comment\"# The \ - menu at the bottom left shows which GUIs \ - #\"))))(Secondary((id \ - f01b0776-1ae2-4a04-8b7c-33b90d1a2d7f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b79fb05b-5698-4dae-8a74-918847e09087)(content(Comment\"# (if \ - any) are applicable to the current term \ - #\"))))(Secondary((id \ - 5de09f9f-7cff-4fc7-91e0-4d32c875a1cd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 24629d6d-f74e-4707-b171-d39b3878dcfb)(content(Comment\"# \ - indicated by the caret. \ - #\"))))(Secondary((id \ - b4aec306-3a4a-4324-b3be-17b5674e6e1d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 049b4942-f842-4dc4-9d8d-71d25f356799)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - d7889f6a-394f-453f-8dc6-00aed3a0c741)(content(Comment\"# Fold \ - projectors cover terms with abstractions. \ - #\"))))(Secondary((id \ - e5994a1a-ef46-46fb-9000-1420ec521e4b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - cf954a50-524c-4574-8d84-cf615024a484)(content(Comment\"# 1. A \ - simple fold roles up any term, replacing \ - #\"))))(Secondary((id \ - b33a1b26-4f01-4ee6-adb0-be298cba1a3b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - c5197aa1-bba5-4a1c-b4ba-ff947e181b23)(content(Comment\"# it \ - with ... until it is expanded again. \ - #\"))))(Secondary((id \ - a2e0fb0e-f392-47b9-ba7d-a14f0ff9d73b)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 03002626-68ae-4caa-b0d7-c700b854f783)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 1bd97d7a-27ab-44dd-ad74-c347f02e1358)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - b1800a80-c7da-466f-abe1-f1ea77ce1cb5)(content(Whitespace\" \ - \"))))(Tile((id \ - e0ddc8fc-2990-4485-b911-5968a402e930)(label(fold))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Secondary((id \ - eb16b8b3-4cc6-4d27-a098-784a586742b1)(content(Whitespace\" \ - \")))))((Secondary((id \ - b1a52743-8b9e-4381-a6eb-baeb198c1dd5)(content(Whitespace\" \ - \"))))(Tile((id \ - 9965e1fa-27b0-4b2f-adc6-851c3408413b)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 19912e02-424d-48a1-add8-d49c57610c61)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - ca57a8e1-1449-4eed-9a06-679e89a47166)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1215d8f5-242c-40f4-a63c-5827bd922228)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - d9468bf5-d453-493c-a653-b43acc9d9380)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - f4c124bf-1fd9-4f21-8dc8-62244bc7fde9)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 4d17ef11-4d13-41b0-80e2-a0400113d25e)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 169d2be7-e89a-4073-80ba-3219d3e5fa55)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 2ab02541-7ebb-4f37-abfe-131932adc96c)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 8ac33df1-d7a6-44da-ace8-fa718ef85256)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 59fa8438-17e4-427d-9b38-b2433a463b9f)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape Convex)(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - e1933fee-1819-4f8f-9286-3aa6a273f937)(label(\"()\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))(Secondary((id \ - 68ccf417-53c7-41de-97ca-32e131f1871b)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 59478e6b-0639-40f7-b9f8-f95b6f280c56)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 51f724a2-5f49-4850-bc66-9a525e67350e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 73b09732-95a9-4f19-9dc1-0e7417aa5020)(content(Comment\"# 2. A \ - semantic fold covers a term with a property: \ - #\"))))(Secondary((id \ - c1b9dbee-35c0-4d1e-8320-439f3292869f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - a0382b44-f7ca-4ba5-b511-e22edcc8fda5)(content(Comment\"# \ - Click to toggle inferred & synthesized types \ - #\"))))(Secondary((id \ - 716bc6ec-c0cd-453c-9b58-4549973f3966)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 39371a43-1d6e-4d01-bca9-ff9245f72a6a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - b55740a9-239c-4a9f-aa2e-00572a916cc4)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 22581933-45f1-400b-a105-b1f43ecac7cf)(content(Whitespace\" \ - \"))))(Tile((id \ - f136ce22-2983-4343-b7c7-9508f3a23569)(label(folds))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - e1195181-4d6b-44ba-ac0e-f540c0a9f2c8)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - c9d586da-f68d-4bab-9f11-4687eed1cb8e)(content(Whitespace\" \ - \"))))(Tile((id \ - 22a6d81b-2d46-4ca3-b6df-af82841356d6)(label(\"(\"\")\"))(mold((out \ - Typ)(in_(Typ))(nibs(((shape Convex)(sort Typ))((shape \ - Convex)(sort Typ))))))(shards(0 1))(children(((Tile((id \ - 87de0e4a-eb13-4d2b-b831-7a5549754ddd)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 36070a1c-0f8b-4f39-95a0-70df3d90acb0)(content(Whitespace\" \ - \"))))(Tile((id \ - 1f23f0a0-9d6e-43e7-8590-93751c4c7b7d)(label(->))(mold((out \ - Typ)(in_())(nibs(((shape(Concave 6))(sort Typ))((shape(Concave \ - 6))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - f757daf9-0456-4349-9503-56f20f095bd1)(content(Whitespace\" \ - \"))))(Tile((id \ - e470b910-7c44-4590-ab94-92b1fa956a10)(label(Bool))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 747b1c0e-27eb-4bca-ac18-2b95e25f6777)(content(Whitespace\" \ - \")))))((Grout((id b91bf7a7-bce7-4454-9c98-72e8dbc3825f)(shape \ - Convex)))(Secondary((id \ - 89036531-ec98-4137-9432-7adb0e25f2c5)(content(Whitespace\" \ - \"))))(Secondary((id \ - eb4c10b9-a1d3-4d40-8fbd-d97a6234693c)(content(Whitespace\" \ - \"))))(Secondary((id \ - 96a1a7fb-bf6d-4144-aa0e-576d21c56660)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 68a8ba48-f056-4fab-ba87-ad1652406841)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1ec93f5e-8539-4275-94bd-3da9ad12f029)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - b8f0815c-71e4-4b26-965f-826fe8006bbc)(content(Comment\"# \ - Projectors on literal data are called livelits. \ - #\"))))(Secondary((id \ - bb46a6cf-8d4f-4c5a-8ecd-e97ad673325f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2c50b4ef-1329-40f0-9591-697fde800c22)(content(Comment\"# Three \ - base types literals use inline views: \ - #\"))))(Secondary((id \ - e58256d4-c344-4002-b38c-c83b916344d2)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 698805b1-972f-4967-a92c-475799b0e28a)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - f3a5128b-830a-48ac-96d9-36e4c5940f46)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 187fae87-efa0-4435-8716-55412cca57b8)(content(Whitespace\" \ - \"))))(Tile((id \ - ed3eb462-ef47-4daf-8f6a-37be6e7d8ada)(label(guard))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - b773c416-ab2f-4715-be45-97bde6800bbc)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - dfa002bb-ca23-4a63-b110-97558702330a)(content(Whitespace\" \ - \"))))(Tile((id \ - e9792ded-9b39-4ca7-8a8a-c9facbb9731d)(label(Bool))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - ebf57d60-c922-4d8b-b15e-51801e111404)(content(Whitespace\" \ - \")))))((Secondary((id \ - eb2a9f3f-4e39-4c2d-84e6-4b6f0ce83e8a)(content(Whitespace\" \ - \"))))(Tile((id \ - f6919fea-2166-4729-ad2a-760836b59b9d)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 47f4b5ec-1b70-4f6d-b72f-e7a1f3f073e6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 50873043-dc1f-4390-adb8-64eb3f1b1500)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - edc37e22-efb3-46df-84db-9fa28ba977de)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - df26fb0f-bf28-4434-a362-f6adc2ab7594)(content(Whitespace\" \ - \"))))(Tile((id \ - 00ef5c50-189e-4407-a261-c315638414e0)(label(phase))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 1cf88388-1634-4341-879f-e2acf0032018)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 8af8bd92-9b73-49d5-9f76-b5042135aa1f)(content(Whitespace\" \ - \"))))(Tile((id \ - 675d05b7-637c-447c-8dc9-c894b8d349ac)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 8c5b596d-9200-462a-ad9d-0364695bc346)(content(Whitespace\" \ - \")))))((Secondary((id \ - 12dc2951-7e8b-48d2-a9c7-3f34a1417350)(content(Whitespace\" \ - \"))))(Tile((id \ - d6880462-81c7-4fa1-b374-c493cc1828e5)(label(44))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - ee8f026d-19d1-4a7f-bf8c-85d7869ab9b7)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 2fcf937c-6f2c-4c0b-a465-12f0973971f0)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - de181b8e-97f7-42f1-963d-79176e4d21d1)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 609bc50b-4dfd-43e0-afae-a7799aa6d79e)(content(Whitespace\" \ - \"))))(Tile((id \ - ae0bb825-2c30-4c14-be37-b24d1bd94f24)(label(float))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 6f220eb2-b439-4059-8e5e-554c01b9c47d)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0bba02b8-ad92-4cff-85d8-211b6b66c444)(content(Whitespace\" \ - \"))))(Tile((id \ - 80e208c4-b6c0-4af5-a123-eb86cd93c489)(label(Float))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 30c04170-2e05-4511-8a36-10120c297b55)(content(Whitespace\" \ - \")))))((Secondary((id \ - 39347a69-1faf-49a2-91d9-0533db9697dc)(content(Whitespace\" \ - \"))))(Tile((id \ - 039fcdc6-4035-4944-9980-53ac5e9603ef)(label(79.00))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - f818e814-2233-4df7-b564-78b21de722e6)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 678ca4b6-1929-44b9-985f-1ba6cc735caf)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ffbe3dad-2d25-4b29-bdfd-f88fc54f6a92)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 8fe2ddff-4179-4d7b-b80a-45a413b4cf14)(content(Comment\"# Inline \ - error decorations (same as for tokens) #\"))))(Secondary((id \ - fc6e186e-0741-4f54-b3fe-15bf1b7fb899)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - def56754-af6d-4896-a59e-0eae7f219001)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 07170c0b-020c-44f1-adfd-da1b5b26f0af)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - f2710892-ac0a-4ca3-88a4-73d52b0fefe5)(content(Whitespace\" \ - \"))))(Tile((id \ - 96290555-dfc9-4309-8f47-9f81b2e0cba0)(label(\"(\"\")\"))(mold((out \ - Pat)(in_(Pat))(nibs(((shape Convex)(sort Pat))((shape \ - Convex)(sort Pat))))))(shards(0 1))(children(((Tile((id \ - 1cdacf98-9383-4806-8b73-f8e654ed0570)(label(a))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - c6a78de3-9eff-4898-b0b8-373a3fdfb589)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Tile((id \ - a7a2b48c-5fef-45d4-b95f-382006ab5d56)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Tile((id \ - 08c75481-f7a9-45e9-b987-99e5670d9230)(label(,))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 15))(sort Pat))((shape(Concave \ - 15))(sort Pat))))))(shards(0))(children())))(Secondary((id \ - 102832b6-0668-408f-a78f-cbdbcc267d68)(content(Whitespace\" \ - \"))))(Tile((id \ - 61336953-3b37-4a9e-802b-fa09c2fb1de9)(label(f))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 7a7dfe66-9c7f-4a34-8153-6c7862556406)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - b399ab42-72ea-413e-9b0d-bc9e512a2df5)(content(Whitespace\" \ - \"))))(Tile((id \ - 67d99393-1a85-461d-aa60-e50ede33bba6)(label(Float))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children()))))))))(Secondary((id \ - 79e6ba9b-22b2-4f8d-a116-2c40511654b0)(content(Whitespace\" \ - \")))))((Secondary((id \ - 896f68dc-75de-4fb9-85eb-8bb9f8a4a79e)(content(Whitespace\" \ - \"))))(Tile((id \ - 9ad71f62-f693-4412-8b5f-2ccaf4d30ea8)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 21b6784a-4ef6-45f8-9419-9d33b5186b98)(label(,))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 15))(sort Exp))((shape(Concave \ - 15))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 0bb6d4f2-7a4c-44b8-8904-1d9ac54baf40)(content(Whitespace\" \ - \"))))(Tile((id \ - ca930d70-7af6-49bb-a15b-5a2c45ed3ef2)(label(28))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - c3f711c1-a0b6-4628-bc01-f77346e01f99)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - e86efb2d-8296-4644-be39-7dddae194b35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 979429e8-a444-48af-a358-814b5d8a3f35)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 3365667c-c484-41be-9fe8-f0bbd89bc0a0)(content(Comment\"# The \ - String base type get a multiline view: #\"))))(Secondary((id \ - b026a077-d94a-4d61-9e76-ef6c6cf60add)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fc4af030-e857-4260-a90a-249c8dd69e98)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 4cce1cfe-2ec4-4e80-9542-d35e98a41bb3)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 0b5f1c33-3aba-485d-a121-381c02a933ee)(content(Whitespace\" \ - \"))))(Tile((id \ - f9580b33-7de6-419e-a6c4-25fd0872e54b)(label(_))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 199d7f9d-96c1-4dc3-b3d1-18f994640c58)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 0adf0994-46eb-4c56-ab40-b6fd4088a073)(content(Whitespace\" \ - \"))))(Tile((id \ - 53a98ffc-0a04-4c75-ae71-9fb18e1e56b2)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 120b3b57-5124-4fff-aac9-63f11c51ec75)(content(Whitespace\" \ - \")))))((Secondary((id \ - a0eb09be-46ac-4018-8761-a8aefecae3ba)(content(Whitespace\" \ - \"))))(Tile((id \ - fbe62b63-c07e-4017-9c6c-a8c99d2cb333)(label(\"\\\"a\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 3453ff35-5faf-450e-b528-818492f09e34)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - a38dc73d-a7d2-4fd2-a056-65ea78c50eca)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - dd3726b8-5611-4fda-b7ad-cd966012a640)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - f424b92e-ef00-4332-8520-63a320749876)(content(Whitespace\" \ - \"))))(Tile((id \ - fb096b51-aee1-499e-bceb-319be015b8a7)(label(__))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 83e7b9b2-9297-4b2e-a4ec-4de76044a7db)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 973187f1-98ad-4c7a-a5b4-bb103bd5dde6)(content(Whitespace\" \ - \"))))(Tile((id \ - 518ba4c0-71ab-4eab-89ac-942ed9ddc99a)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 71812c46-4ca4-4ec8-906c-3e32f4813308)(content(Whitespace\" \ - \")))))((Secondary((id \ - c2cacfb8-fe15-4219-8f87-cc49b1c4e96f)(content(Whitespace\" \ - \"))))(Tile((id \ - 6933776c-5618-4e4f-b618-17c44b9f2380)(label(\"\\\"\\\\n\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - b4efd185-9b2e-448d-b8a4-e66b8704a524)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 60824984-80f3-4af0-bfaa-3e0cdc4fb5b9)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 0cb7893a-abe6-4357-9ada-08475043643a)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 99fe31ef-a411-4ba8-b70a-e8018c99c543)(content(Whitespace\" \ - \"))))(Tile((id \ - c3e5f545-957e-46b4-85f2-81136c37e9d3)(label(___))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 3d056330-a6d3-4ba4-9026-19d12169efdf)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 2b1dd229-e949-47ef-90de-c6c03c92aa40)(content(Whitespace\" \ - \"))))(Tile((id \ - 74c741d7-ca4c-48b8-b77a-4fd1a9f03d9a)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - a2afb218-2987-4121-9b9a-d2489efb5fd0)(content(Whitespace\" \ - \")))))((Secondary((id \ - 2156eb35-c6e8-4901-9930-6d83a7757366)(content(Whitespace\" \ - \"))))(Tile((id \ - ae96e48b-2900-4418-aaa2-021c7f9e2445)(label(\"\\\"a\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 7aee6d0a-34c7-4410-b740-c29c9e87d147)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 64a004c5-9e17-40d2-a032-0065c7681a29)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 8a42b824-69ea-478f-a054-6fbdb0989492)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 466f984b-a359-4bf9-8a37-6ca5ed434322)(content(Whitespace\" \ - \"))))(Tile((id \ - ccc8f5c0-68b7-4d88-9046-7b9b5c992f2a)(label(____))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - fa7d3ffe-9f7b-4b7a-9bf3-a96e2d823f74)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 9d9197ee-c296-4aac-8444-c32b8b0ab927)(content(Whitespace\" \ - \"))))(Tile((id \ - c18ac778-b646-4196-a1ff-a44e3bee969f)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - ab964d90-7b6d-460d-b381-017c18d835db)(content(Whitespace\" \ - \")))))((Secondary((id \ - abf7af94-43de-44e3-9d8d-e6ebc530db65)(content(Whitespace\" \ - \"))))(Tile((id \ - 290e3659-6fa6-40cb-8c1b-ac6cd023ec24)(label(\"\\\"d\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 6a7d93a2-5994-430e-9af0-bd9589322e11)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 5ecffb3e-af50-42df-8261-297971ecbc89)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 63be4dcd-6732-407b-8d53-7fea1afada1f)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 8f6b259a-e911-4142-8ace-856894a600dd)(content(Whitespace\" \ - \"))))(Tile((id \ - e9c88b7e-0cbb-4ba0-b05b-9e35aab816ca)(label(_____))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 68690388-7f05-484a-845d-4210edcd623f)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 034a90cc-adac-41c8-a4bb-9ccd31f81fb1)(content(Whitespace\" \ - \"))))(Tile((id \ - 7ea24ee5-62eb-4681-957b-94cc65fa88bf)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - 8f6a6709-590c-47b9-869f-774410834477)(content(Whitespace\" \ - \")))))((Secondary((id \ - efffbaf4-9dbb-4d2a-bb71-678fb2bcc249)(content(Whitespace\" \ - \"))))(Tile((id \ - f39a6db7-0ada-441d-bc1e-1fb36ed32248)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 1986daba-75a5-4f61-9ccf-61a32ee8ee67)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 29174a34-6c9f-4797-9f06-2e50cc04e5cc)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 05bc12b0-f868-4792-aec7-42e3fbdf994c)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - c793020b-da6e-4fac-a02e-a9244c9576c2)(content(Whitespace\" \ - \"))))(Tile((id \ - 4ce05d8f-7462-479d-93e5-5ef0086c1239)(label(______))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - efb087af-8603-4537-86f5-4740752cb24e)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 348ebb56-49ab-467a-b731-701787ce3e51)(content(Whitespace\" \ - \"))))(Tile((id \ - fd09e0a1-9951-47f4-9812-c956334fc474)(label(String))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - b7f61923-bdaf-40d6-beb2-cd4ac111cd71)(content(Whitespace\" \ - \")))))((Secondary((id \ - 53b5a950-623a-4a8d-aa06-132c20bd067f)(content(Whitespace\" \ - \"))))(Tile((id \ - bf698fb4-161c-4661-bee0-83b364d487af)(label(\"\\\"a\\\\n \ - shift\\\\n malicious\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 9f127ead-825b-425a-917c-75891e493bb7)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - f170b9ec-8415-4394-b4af-f4847ab94cdd)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6c929f6f-be4b-4d3d-aea6-5484e367554c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - ad2620ef-2a85-4c89-8355-d70ad982c0a7)(content(Comment\"# \ - Multiline error decorations #\"))))(Secondary((id \ - d111adca-6c14-4686-8e2b-3bc92a7af55e)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 2ecc1f28-c69c-4ac5-8097-419208fdfdb8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - c67a841c-8dd5-4bd8-a383-2bc00dee4dae)(label(let = \ - in))(mold((out Exp)(in_(Pat Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 17))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 7aeb7199-8735-49a5-bbaf-ab59465b963b)(content(Whitespace\" \ - \"))))(Tile((id \ - e927333d-2b99-4d83-8c60-fa6b98852d35)(label(box))(mold((out \ - Pat)(in_())(nibs(((shape Convex)(sort Pat))((shape Convex)(sort \ - Pat))))))(shards(0))(children())))(Tile((id \ - 0eed961b-cd89-4067-a0ad-d019d3e31f1b)(label(:))(mold((out \ - Pat)(in_())(nibs(((shape(Concave 12))(sort Pat))((shape(Concave \ - 12))(sort Typ))))))(shards(0))(children())))(Secondary((id \ - 72fc515f-0889-451d-80e7-550b7e0404bd)(content(Whitespace\" \ - \"))))(Tile((id \ - de5b6a9d-6428-47ec-9862-dbf2d397e63e)(label(Int))(mold((out \ - Typ)(in_())(nibs(((shape Convex)(sort Typ))((shape Convex)(sort \ - Typ))))))(shards(0))(children())))(Secondary((id \ - b5e15dce-f327-41e6-83de-799753bb7341)(content(Whitespace\" \ - \")))))((Secondary((id \ - d4249c41-86a1-4f85-b5d3-48146f0d3c67)(content(Whitespace\" \ - \"))))(Tile((id \ - 6b4aa5cf-e622-4e83-82e7-e7e2ad2c3b3d)(label(\"\\\"\\\\nmalicious\\\"\"))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - d200a081-f7d0-49ba-8c4b-1c0037f2d013)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 4569aec5-ba4c-4487-abd8-092ea882ab66)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 12a34fa0-0ca0-4a69-b498-15659cb8f3b1)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 530085f2-2212-4a55-a274-ba32f0c3ce50)(content(Comment\"# \ - ERRATA: \ - #\"))))(Secondary((id \ - 34905c96-347d-4641-8f79-9dd417212011)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 4aa999e5-4f22-492c-942f-00fb5d848a29)(content(Comment\"# The \ - bottom toggle can also be used to remove \ - #\"))))(Secondary((id \ - df7de2c6-f7f0-4d59-b327-1a2501ef954f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 1159c000-d2cb-4e8f-a669-142abe4a1fa3)(content(Comment\"# \ - projectors. Currently only bidelmited terms can \ - #\"))))(Secondary((id \ - 53f2f478-b0da-41bf-956a-67907f01d2b3)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 19deddeb-57b4-4bf9-b5a6-b2798fe597d3)(content(Comment\"# \ - projected, so some may have to be parenthesized. \ - #\"))))(Secondary((id \ - c4c5d0b0-ff38-4a92-903f-637294181b46)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - f3664d26-7fa8-49e6-b7ce-d75393d732d6)(content(Comment\"# \ - Projectors are persistent across sessions, but \ - #\"))))(Secondary((id \ - 0e2c9dad-8073-4e76-9a6d-00e84900e80f)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 02c27b2c-f3c2-47f3-9899-ff6528fc118f)(content(Comment\"# \ - currently are lost on cut/copy. Both these \ - #\"))))(Secondary((id \ - 21cf74b6-347e-4fbe-90b1-6c9027195092)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fea6fc11-dea6-4601-9cb1-35c049e73d1b)(content(Comment\"# \ - restrictions will be removed in a future update. \ - #\"))))(Secondary((id \ - e2d90882-38a7-43b2-87bd-6531c4ace16d)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - fb06c653-855e-4a1e-9bd3-ba8c295705f8)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 7ac61350-55c3-488b-9984-809f5cea9317)(content(Comment\"# \ - Projectors playfround #\"))))(Secondary((id \ - b90f7fd8-b537-4544-a73b-da45d028e9d4)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 6de16b65-ab01-4d8a-a1dd-10cb3d79f9b8)(content(Whitespace\"\\226\\143\\142\"))))(Tile((id \ - 2f5bb63c-ff21-429a-9eff-5abdc07598e2)(label(if then \ - else))(mold((out Exp)(in_(Exp Exp))(nibs(((shape Convex)(sort \ - Exp))((shape(Concave 13))(sort Exp))))))(shards(0 1 \ - 2))(children(((Secondary((id \ - 8e6ffe46-c2a8-4024-bdf3-90e2395116d4)(content(Whitespace\" \ - \"))))(Tile((id \ - 134a6b2e-017a-4e9f-a782-4e0a19915d53)(label(true))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 2603b8be-54cf-4cb4-acab-705ec10faecc)(content(Whitespace\" \ - \"))))(Tile((id \ - 5e5beeab-eb63-40d8-b87a-1f54371ffcf4)(label(&&))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 10))(sort Exp))((shape(Concave \ - 10))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 928e83cd-3dc0-48df-987f-c678ecf2b3a2)(content(Whitespace\" \ - \"))))(Tile((id \ - f4c7e1ad-d473-492d-abac-b73aa09a6d6d)(label(79))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 81319825-690a-444a-bc5a-0899cafd61c1)(content(Whitespace\" \ - \"))))(Tile((id \ - 9d746c4e-50ef-4078-a79d-e5a66e9012c1)(label(<))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 9))(sort Exp))((shape(Concave \ - 9))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 472690e7-361d-4676-a18c-b2257f1bec47)(content(Whitespace\" \ - \"))))(Tile((id \ - a5163c00-6bea-40e5-be4c-6c0db74cb34f)(label(int_of_float))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Tile((id \ - 008dd76c-e655-4bfe-a1a5-f9a97ce28fa7)(label(\"(\"\")\"))(mold((out \ - Exp)(in_(Exp))(nibs(((shape(Concave 2))(sort Exp))((shape \ - Convex)(sort Exp))))))(shards(0 1))(children(((Tile((id \ - 1ace692e-4c16-4bc1-9ade-5766b434f6bb)(label(60.00))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children()))))))))(Secondary((id \ - af346370-49c0-45b8-b6b5-54abf58a1b80)(content(Whitespace\" \ - \"))))(Secondary((id \ - 3b307b64-01a7-43ce-8ae4-033b84a8f050)(content(Whitespace\" \ - \"))))(Secondary((id \ - 7fe31a60-667c-479c-a6a9-ee957d73a626)(content(Whitespace\"\\226\\143\\142\")))))((Secondary((id \ - 38a576c9-7afe-4cf0-9e75-67f205d5bebd)(content(Whitespace\" \ - \"))))(Tile((id \ - e3967e60-29a2-4922-82ee-6f61b28e8794)(label(______))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - a72c77e7-c784-48d7-a4d9-3d3d4b6581ae)(content(Whitespace\" \ - \")))))))))(Secondary((id \ - 7a8789b3-f717-4966-b8b1-71c5a632d92d)(content(Whitespace\" \ - \"))))(Tile((id \ - 83d899b7-bb2d-4280-8115-04b0c6631efe)(label(\"\\\"its: \ - \\\"\"))(mold((out Exp)(in_())(nibs(((shape Convex)(sort \ - Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - 4c67ffdb-9786-42aa-a030-79463d29bda7)(content(Whitespace\" \ - \"))))(Tile((id \ - 17e70cd8-a542-485b-ae0b-7674f6ea211a)(label(++))(mold((out \ - Exp)(in_())(nibs(((shape(Concave 6))(sort Exp))((shape(Concave \ - 6))(sort Exp))))))(shards(0))(children())))(Secondary((id \ - 5a785e13-d82f-4d8b-9cde-b23f1661c9ff)(content(Whitespace\" \ - \"))))(Tile((id \ - 1185f1ef-5d8b-4ce7-b21d-893e42f8c4fa)(label(box))(mold((out \ - Exp)(in_())(nibs(((shape Convex)(sort Exp))((shape Convex)(sort \ - Exp))))))(shards(0))(children())))(Secondary((id \ - b7de0cc9-4ee0-408c-a2db-2247fe81adab)(content(Whitespace\" \ + 299e87e3-9a79-4c7c-9dcb-cbe50454f629)(content(Whitespace\" \ \"))))(Secondary((id \ - 3c6fda68-dbd7-4803-8332-567ba25e5a24)(content(Whitespace\" \ + 61e4e570-3297-4243-8228-d5fb99bb62a0)(content(Whitespace\" \ \"))))(Secondary((id \ - 469cf969-6d5f-4389-8368-be473d01a24e)(content(Whitespace\" \ + 8cbb8685-419f-4716-9fa2-35d7cc92c7bd)(content(Whitespace\" \ \"))))(Secondary((id \ - ca43d8ea-0085-4f4c-862f-76db5d5da98c)(content(Whitespace\"\\226\\143\\142\"))))(Secondary((id \ - 000fa47e-e8ed-44e0-a47f-303cda505ff2)(content(Whitespace\" \ - \")))))()))(ancestors())))(caret Outer))"; - backup_text = - "# PROJECTORS #\n\n\ - # Some kinds of syntax have dedicated GUIs. #\n\ - # The menu at the bottom left shows which GUIs #\n\ - # (if any) are applicable to the current term #\n\ - # indicated by the caret. #\n\n\ - # Fold projectors cover terms with abstractions. #\n\ - # 1. A simple fold roles up any term, replacing #\n\ - # it with ... until it is expanded again. #\n\n\ - let fold = (((((((((((()))))))))))) in\n\n\ - # 2. A semantic fold covers a term with a property: #\n\ - # Click to toggle inferred & synthesized types #\n\n\ - let folds: (Int -> Bool) = in\n\n\ - # Projectors on literal data are called livelits. #\n\ - # Three base types literals use inline views: #\n\n\ - let guard: Bool = true in\n\ - let phase: Int = 44 in\n\ - let float: Float = 79.00 in\n\n\ - # Inline error decorations (same as for tokens) #\n\n\ - let (a:Int, f: Float) = true, 28 in\n\n\ - # The String base type get a multiline view: #\n\n\ - let _: String = \"a\" in\n\ - let __: String = \"\\n\" in\n\ - let ___: String = \"a\" in\n\ - let ____: String = \"d\" in\n\ - let _____: String = \"\\nmalicious\" in\n\ - let ______: String = \"a\\n shift\\n malicious\" in\n\n\ - # Multiline error decorations #\n\n\ - let box: Int = \"\\nmalicious\" in\n\n\ - # ERRATA: #\n\ - # The bottom toggle can also be used to remove #\n\ - # projectors. Currently only bidelmited terms can #\n\ - # projected, so some may have to be parenthesized. #\n\ - # Projectors are persistent across sessions, but #\n\ - # currently are lost on cut/copy. Both these #\n\ - # restrictions will be removed in a future update. #\n\n\ - # Projectors playfround #\n\n\ - if true && 79 < int_of_float(60.00) \n\ - then ______ else \"its: \" ++ box \n\ - \ "; + eec5bd58-1af6-402d-a3a8-754b1c08e48c)(content(Whitespace\" \ + \")))))((Grout((id e87c8d67-9374-4a6f-ba01-5ec8f300b924)(shape \ + Convex))))))(ancestors())))(caret Outer))"; + backup_text = " "; }; { zipper = @@ -682,7 +62,7 @@ let startup : PersistentData.t = eec5bd58-1af6-402d-a3a8-754b1c08e48c)(content(Whitespace\" \ \")))))((Grout((id e87c8d67-9374-4a6f-ba01-5ec8f300b924)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -697,7 +77,7 @@ let startup : PersistentData.t = eebed27e-13cd-4df4-a1fe-02068ca455e1)(content(Whitespace\" \ \")))))((Grout((id defe91b0-3d3a-4a13-97ab-5c90d5b10a81)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -712,7 +92,7 @@ let startup : PersistentData.t = 06f79f3b-d319-4878-a1cb-d3f09a410e4d)(content(Whitespace\" \ \")))))((Grout((id 62472d55-f985-4caf-9e1f-749c338d0397)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -727,7 +107,7 @@ let startup : PersistentData.t = f23de1f5-396e-4e7c-b126-8cd7c6f78417)(content(Whitespace\" \ \")))))((Grout((id 39cacada-31f6-4a82-9739-e7a46cfa50d1)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -742,7 +122,7 @@ let startup : PersistentData.t = f52b2872-d6ce-4a89-99d7-1ade17e605cc)(content(Whitespace\" \ \")))))((Grout((id cf50313e-1875-41c1-bbb9-ca6ddf012775)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -757,7 +137,7 @@ let startup : PersistentData.t = 45e00143-e851-4efd-a36f-cbd5c057c5ad)(content(Whitespace\" \ \")))))((Grout((id bd9ea551-2060-47ad-bb83-252df293d38c)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; { zipper = @@ -776,7 +156,7 @@ let startup : PersistentData.t = a330f312-3e60-4b93-86fc-ef0d6ef08c7d)(content(Whitespace\" \ \")))))((Grout((id 0078ad5b-23c0-45ab-afa4-be2fec6a958d)(shape \ Convex))))))(ancestors())))(caret Outer))"; - backup_text = " "; + backup_text = " "; }; ], [ ("scratch_0", Evaluation); ("scratch_1", Evaluation) ] ); From c3535b49f26fa36cb3cfc1f404e611b5f80226c7 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 1 Aug 2024 15:39:37 -0400 Subject: [PATCH 163/168] fix DOM state sync bug for projectors. fix projector outline showing on keyboard actions. supress textarea DOM undo/redo for now. don't record projector focus etc actions in history. --- src/haz3lcore/zipper/action/Action.re | 27 +++++++++++++++---- .../zipper/projectors/TextAreaProj.re | 10 ++++++- src/haz3lweb/Editors.re | 1 + src/haz3lweb/www/style.css | 4 ++- src/util/Web.re | 2 +- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/haz3lcore/zipper/action/Action.re b/src/haz3lcore/zipper/action/Action.re index afaac465b8..71c426a53f 100644 --- a/src/haz3lcore/zipper/action/Action.re +++ b/src/haz3lcore/zipper/action/Action.re @@ -107,8 +107,6 @@ module Result = { let is_edit: t => bool = fun - | Project(Focus(_) | Escape(_)) => false - | Project(_) => true //TODO(andrew): revisit | Paste(_) | Cut | Reparse @@ -123,7 +121,17 @@ let is_edit: t => bool = | Select(_) | Unselect(_) | RotateBackpack - | MoveToBackpackTarget(_) => false; + | MoveToBackpackTarget(_) => false + | Project(p) => + switch (p) { + | SetSyntax(_) + | SetModel(_) + | SetIndicated(_) + | ToggleIndicated(_) + | Remove(_) => true + | Focus(_) + | Escape(_) => false + }; /* Determines whether undo/redo skips action */ let is_historic: t => bool = @@ -140,8 +148,17 @@ let is_historic: t => bool = | Buffer(Accept) | Paste(_) | Reparse - | Project(_) | Insert(_) | Destruct(_) | Pick_up - | Put_down => true; + | Put_down => true + | Project(p) => + switch (p) { + | SetSyntax(_) + | SetModel(_) + | SetIndicated(_) + | ToggleIndicated(_) + | Remove(_) => true + | Focus(_) + | Escape(_) => false + }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaProj.re b/src/haz3lcore/zipper/projectors/TextAreaProj.re index bee33b2fc9..fe6bb3d4b7 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaProj.re +++ b/src/haz3lcore/zipper/projectors/TextAreaProj.re @@ -44,6 +44,12 @@ let key_handler = (id, ~parent, evt) => { | D("ArrowLeft" | "ArrowUp") when is_first_pos(id) => JsUtil.get_elem_by_id(of_id(id))##blur; Many([parent(Escape(Left)), Stop_propagation]); + /* Defer to parent editor undo for now */ + | D("z" | "Z" | "y" | "Y") when Key.ctrl_held(evt) || Key.meta_held(evt) => + Many([Prevent_default]) + | D("z" | "Z") + when Key.shift_held(evt) && (Key.ctrl_held(evt) || Key.meta_held(evt)) => + Many([Prevent_default]) | D("\"") => /* Hide quotes from both the textarea and parent editor */ Many([Prevent_default, Stop_propagation]) @@ -66,11 +72,13 @@ let textarea = Attr.on_copy(_ => Effect.Stop_propagation), Attr.on_cut(_ => Effect.Stop_propagation), Attr.on_paste(_ => Effect.Stop_propagation), + Attr.string_property("value", text), ], - [Node.text(text)], + [], ); let view = (_, ~info, ~local as _, ~parent) => { + print_endline("TextAreaProj.view"); let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[Attr.classes(["wrapper"])], diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index f8fa4e0b06..3f255ee3f2 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -56,6 +56,7 @@ let perform_action = CoreSettings.on | _ => settings }; + print_endline("ACT: " ++ Action.show(a)); switch (Perform.go(~settings, a, get_editor(editors))) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => Ok(put_editor(ed, editors)) diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index b8a21894e2..7e2350b98e 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -743,6 +743,7 @@ select { margin: 0; filter: sepia(1); cursor: pointer; + outline: none; } .projector.check:not(.indicated):not(:hover) > svg { fill: #0000; @@ -753,9 +754,10 @@ select { .projector.slider input, .projector.sliderf input { margin: 0; - width: 90%; filter: sepia(1); cursor: pointer; + outline: none; + width: 90%; } .projector.slider:not(.indicated):not(:hover) > svg, .projector.sliderf:not(.indicated):not(:hover) > svg { diff --git a/src/util/Web.re b/src/util/Web.re index 0620a73026..29d5929342 100644 --- a/src/util/Web.re +++ b/src/util/Web.re @@ -22,7 +22,7 @@ let range = (~attrs=[], ~min="0", ~max="100", value) => ~attrs= [ Attr.create("type", "range"), - Attr.create("value", value), + Attr.string_property("value", value), Attr.create("max", max), Attr.create("min", min), ] From 96e10c4264fec88bb9d3c974b73204ff04792969 Mon Sep 17 00:00:00 2001 From: disconcision Date: Thu, 1 Aug 2024 15:56:25 -0400 Subject: [PATCH 164/168] don't attempt to project non-convex things. rm printlns --- src/haz3lcore/zipper/Editor.re | 1 - src/haz3lcore/zipper/Projector.re | 7 ------- src/haz3lcore/zipper/action/ProjectorPerform.re | 2 +- src/haz3lcore/zipper/projectors/TextAreaProj.re | 1 - src/haz3lweb/Editors.re | 1 - src/haz3lweb/view/ProjectorView.re | 5 ++++- 6 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/haz3lcore/zipper/Editor.re b/src/haz3lcore/zipper/Editor.re index 01346536e5..cd05476fd9 100644 --- a/src/haz3lcore/zipper/Editor.re +++ b/src/haz3lcore/zipper/Editor.re @@ -116,7 +116,6 @@ module Meta = { let t_of_yojson = _ => failwith("Editor.Meta.t_of_yojson"); let next = (~settings: CoreSettings.t, a: Action.t, z: Zipper.t, meta: t): t => { - //print_endline("Editor.next. Action:" ++ Action.show(a)); let syntax = CachedSyntax.next(a, z, meta.statics.info_map, meta.syntax); let statics = CachedStatics.next(~settings, a, z, meta.statics); let col_target = diff --git a/src/haz3lcore/zipper/Projector.re b/src/haz3lcore/zipper/Projector.re index 38a23d88e1..82b036b821 100644 --- a/src/haz3lcore/zipper/Projector.re +++ b/src/haz3lcore/zipper/Projector.re @@ -35,13 +35,6 @@ let placeholder = (p: Base.projector, ci: option(Info.t)): string => let minimum_projection_condition = (syntax: syntax): bool => Piece.is_convex(syntax); -/* Add a new projector, gated on the predicated on the syntax */ -let create = (kind: Base.kind, syntax: syntax): option((Base.kind, string)) => { - let (module P) = to_module(kind); - P.can_project(syntax) && minimum_projection_condition(syntax) - ? Some((kind, P.init)) : None; -}; - /* Returns the projector at the caret, if any */ let indicated = (z: ZipperBase.t) => { open Util.OptUtil.Syntax; diff --git a/src/haz3lcore/zipper/action/ProjectorPerform.re b/src/haz3lcore/zipper/action/ProjectorPerform.re index bcd6271d5c..a0996437bd 100644 --- a/src/haz3lcore/zipper/action/ProjectorPerform.re +++ b/src/haz3lcore/zipper/action/ProjectorPerform.re @@ -15,7 +15,7 @@ module Update = { * including cursor-info association. We maintain this invariant * when we update a projector's contained syntax */ let (module P) = to_module(kind); - switch (P.can_project(syntax)) { + switch (P.can_project(syntax) && minimum_projection_condition(syntax)) { | false => syntax | true => Projector({id: Piece.id(syntax), kind, model: P.init, syntax}) }; diff --git a/src/haz3lcore/zipper/projectors/TextAreaProj.re b/src/haz3lcore/zipper/projectors/TextAreaProj.re index fe6bb3d4b7..ce93f38324 100644 --- a/src/haz3lcore/zipper/projectors/TextAreaProj.re +++ b/src/haz3lcore/zipper/projectors/TextAreaProj.re @@ -78,7 +78,6 @@ let textarea = ); let view = (_, ~info, ~local as _, ~parent) => { - print_endline("TextAreaProj.view"); let text = info.syntax |> get |> Form.strip_quotes; Node.div( ~attrs=[Attr.classes(["wrapper"])], diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index 3f255ee3f2..f8fa4e0b06 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -56,7 +56,6 @@ let perform_action = CoreSettings.on | _ => settings }; - print_endline("ACT: " ++ Action.show(a)); switch (Perform.go(~settings, a, get_editor(editors))) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => Ok(put_editor(ed, editors)) diff --git a/src/haz3lweb/view/ProjectorView.re b/src/haz3lweb/view/ProjectorView.re index 8fcfab1285..27f2e5d4ae 100644 --- a/src/haz3lweb/view/ProjectorView.re +++ b/src/haz3lweb/view/ProjectorView.re @@ -245,7 +245,10 @@ module Panel = { @ (active ? ["active"] : []) @ (might_project ? [] : ["inactive"]), ), - Attr.on_click(_ => inject(toggle_projector(active, id, ci))), + Attr.on_mousedown(_ => + might_project + ? inject(toggle_projector(active, id, ci)) : Effect.Ignore + ), ], [ div( From 81e70502c97a96343470a4d4dce053b8cb072493 Mon Sep 17 00:00:00 2001 From: disconcision Date: Fri, 2 Aug 2024 22:22:33 -0400 Subject: [PATCH 165/168] fix issue with copy blanking out projectors --- src/haz3lcore/zipper/Printer.re | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/haz3lcore/zipper/Printer.re b/src/haz3lcore/zipper/Printer.re index 268821c049..ed19ee3846 100644 --- a/src/haz3lcore/zipper/Printer.re +++ b/src/haz3lcore/zipper/Printer.re @@ -20,7 +20,7 @@ and of_piece = (~holes, p: Piece.t): string => | Grout({shape: Convex, _}) => " " | Secondary(w) => Secondary.is_linebreak(w) ? "\n" : Secondary.get_string(w.content) - | Projector(_) => "" + | Projector(p) => of_piece(~holes, p.syntax) } and of_tile = (~holes, t: Tile.t): string => Aba.mk(t.shards, t.children) From 7ec564163e67287ff3fa61e7ba069ee254587cce Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 4 Aug 2024 22:43:29 -0400 Subject: [PATCH 166/168] fix completion bug --- src/haz3lcore/assistant/AssistantCtx.re | 9 ++------ src/haz3lcore/assistant/AssistantExpander.re | 24 +++++++------------- src/haz3lcore/assistant/AssistantForms.re | 8 +++---- src/haz3lcore/dune | 2 +- src/haz3lcore/zipper/action/Perform.re | 22 ++++++++---------- src/haz3lweb/Editors.re | 1 + src/haz3lweb/dune | 2 +- src/haz3lweb/www/style.css | 5 +++- src/util/dune | 2 +- 9 files changed, 32 insertions(+), 43 deletions(-) diff --git a/src/haz3lcore/assistant/AssistantCtx.re b/src/haz3lcore/assistant/AssistantCtx.re index 1c12a86557..0caee1f921 100644 --- a/src/haz3lcore/assistant/AssistantCtx.re +++ b/src/haz3lcore/assistant/AssistantCtx.re @@ -1,7 +1,5 @@ open Suggestion; -let expander = AssistantExpander.c; - /* For suggestions in patterns, suggest variables which * occur free in that pattern's scope. */ let free_variables = @@ -55,7 +53,7 @@ let bound_aps = (ty_expect: Typ.t, ctx: Ctx.t): list(Suggestion.t) => Typ.is_consistent(ctx, ty_expect, ty_out) && !Typ.is_consistent(ctx, ty_expect, ty_arr) => { Some({ - content: name ++ "(" ++ expander, + content: name ++ "(", strategy: Exp(Common(FromCtxAp(ty_out))), }); } @@ -74,10 +72,7 @@ let bound_constructor_aps = (wrap, ty: Typ.t, ctx: Ctx.t): list(Suggestion.t) => when Typ.is_consistent(ctx, ty, ty_out) && !Typ.is_consistent(ctx, ty, ty_arr) => - Some({ - content: name ++ "(" ++ expander, - strategy: wrap(FromCtxAp(ty_out)), - }) + Some({content: name ++ "(", strategy: wrap(FromCtxAp(ty_out))}) | _ => None, ctx, ); diff --git a/src/haz3lcore/assistant/AssistantExpander.re b/src/haz3lcore/assistant/AssistantExpander.re index 51501cd7a5..f24be63756 100644 --- a/src/haz3lcore/assistant/AssistantExpander.re +++ b/src/haz3lcore/assistant/AssistantExpander.re @@ -1,24 +1,16 @@ -/* Bit of a hack. We want to decorate suggestions which will trigger - an expansion to telegraph that expansion. Easiest way metrics wise - is to keep that deco in the syntax. Want to decorate with ellipses - character, but OCaml string functions don't support unicode, so - we use $, then swap it out for the unicode character in Code. - Eventually replace this by extending the suggestion data structure */ -let c = "$"; +/* We decorate buffers whose content will result in an + * expansion with a trailing "...". Note that this ... + * (at least in the current implementation) is not literally + * inserted into the syntax so will not be reflected + * in the decoration metrics */ -let is_expander_tok = (t: Token.t) => - String.sub(t, String.length(t) - 1, 1) == c; - -let trim_last = (t: Token.t) => String.sub(t, 0, String.length(t) - 1); +let last = t => String.sub(t, String.length(t) - 1, 1); let is_expander = (label: Label.t) => switch (label) { - | [t] => is_expander_tok(t) + | [t] => last(t) == " " || last(t) == "(" | _ => false }; let mark = (label: Label.t): Label.t => - is_expander(label) ? List.map(t => trim_last(t) ++ "…", label) : label; - -let trim = (completion: Token.t): Token.t => - is_expander_tok(completion) ? trim_last(completion) : completion; + is_expander(label) ? List.map(t => t ++ "…", label) : label; diff --git a/src/haz3lcore/assistant/AssistantForms.re b/src/haz3lcore/assistant/AssistantForms.re index 3d26ecafb3..928a159f4a 100644 --- a/src/haz3lcore/assistant/AssistantForms.re +++ b/src/haz3lcore/assistant/AssistantForms.re @@ -4,7 +4,7 @@ open OptUtil.Syntax; /* This module generates TyDi suggestions which depend * neither on the typing context or the backpack */ -let leading_expander = " " ++ AssistantExpander.c; +let leading_expander = " "; /* Specifies type information for syntactic forms. Could in principle be * derived by generating segments from Forms, parsing them to terms, and @@ -36,9 +36,9 @@ module Typ = { ]; let of_infix_delim: list((Token.t, Typ.term)) = [ - ("|>", Unknown(Internal)), /* */ + //("|>", Unknown(Internal)), /* annoying during case rules */ (",", Prod([unk, unk])), /* NOTE: Current approach doesn't work for this, but irrelevant as 1-char */ - ("::", List(unk)), + ("::", List(unk)), /* annoying in patterns */ ("@", List(unk)), (";", Unknown(Internal)), ("&&", Bool), @@ -47,7 +47,7 @@ module Typ = { ("$==", Bool), ("==.", Bool), ("==", Bool), - ("!", Bool), // maybe doesnt belong here? but blocks autocomplete of ! to != + //("!", Bool), /* annoying as != is more common */ ("!=", Bool), ("!=.", Bool), ("<", Bool), diff --git a/src/haz3lcore/dune b/src/haz3lcore/dune index 0cd61c2c77..6a2a51984d 100644 --- a/src/haz3lcore/dune +++ b/src/haz3lcore/dune @@ -17,7 +17,7 @@ (rule (write-file js-of-ocaml-flags-dev - "(:standard --debug-info --no-inline --pretty --source-map)")) + "(:standard --debuginfo --noinline --dynlink --linkall --sourcemap)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) diff --git a/src/haz3lcore/zipper/action/Perform.re b/src/haz3lcore/zipper/action/Perform.re index 43e6d4f43f..32fc22158b 100644 --- a/src/haz3lcore/zipper/action/Perform.re +++ b/src/haz3lcore/zipper/action/Perform.re @@ -79,24 +79,22 @@ let go_z = | Buffer(Unparsed) => switch (TyDi.get_buffer(z)) { | None => None - | Some(completion) when String.contains(completion, ' ') => - /* Slightly hacky. We assume that if a completion string has - * spaces in it, that means it will have a hole in it. This - * is a non-essential invariant currently maintained in TyDi. - * In such a case, we insert the completion as normal by - * pasting, then return to the beginning and advance to the - * first hole. This should be revisited if completions are - * refactored to use a more structured buffer format. */ - let start = Zipper.caret_point(M.measured, z); + | Some(completion) + when StringUtil.match(StringUtil.regexp(".*\\)::$"), completion) => + /* Slightly hacky. There's currently only one genre of completion + * that creates more than one hole on intial expansion: when on eg + * 1 :: a|, we suggest "abs( )::" via lookahead. In such a case we + * want the caret to end up to the left of the first hole, whereas + * pasting would leave it to the left of the second. Thus we move + * left to the previous hole. */ let z = { open OptUtil.Syntax; let* z = paste(z, completion); - let* z = Move.go(Goal(Point(start)), z); - let* z = Move.go(Goal(Piece(Grout, Right)), z); + let* z = Move.go(Goal(Piece(Grout, Left)), z); Move.go(Local(Left(ByToken)), z); }; z; - | Some(completion) => paste(z, AssistantExpander.trim(completion)) + | Some(completion) => paste(z, completion) } }; diff --git a/src/haz3lweb/Editors.re b/src/haz3lweb/Editors.re index f8fa4e0b06..7b5512fc10 100644 --- a/src/haz3lweb/Editors.re +++ b/src/haz3lweb/Editors.re @@ -56,6 +56,7 @@ let perform_action = CoreSettings.on | _ => settings }; + print_endline("action: " ++ Action.show(a)); switch (Perform.go(~settings, a, get_editor(editors))) { | Error(err) => Error(FailedToPerform(err)) | Ok(ed) => Ok(put_editor(ed, editors)) diff --git a/src/haz3lweb/dune b/src/haz3lweb/dune index c88e1c2c27..4874cbf066 100644 --- a/src/haz3lweb/dune +++ b/src/haz3lweb/dune @@ -94,7 +94,7 @@ (rule (write-file js-of-ocaml-flags-dev - "(:standard --debug-info --no-inline --pretty --source-map)")) + "(:standard --debuginfo --noinline --dynlink --linkall --sourcemap)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index 7e2350b98e..e37ac99c54 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -704,7 +704,8 @@ select { } .projector.block.selected > svg > path { vector-effect: non-scaling-stroke; - filter: url(#raised-drop-shadow-Nul) !important; + stroke: #ffa000; + /* filter: url(#raised-drop-shadow-Nul) !important; */ } .projector.selected > svg, .projector.selected.indicated > svg, @@ -1054,6 +1055,8 @@ svg.shard.selected > path { } svg.shard.selected.buffer > path { fill: #fbf3de; + stroke: none; + filter: none; } svg.shard.error > path { fill: #ff00000a; diff --git a/src/util/dune b/src/util/dune index e220e1f2fb..868e2e0fb9 100644 --- a/src/util/dune +++ b/src/util/dune @@ -15,7 +15,7 @@ (rule (write-file js-of-ocaml-flags-dev - "(:standard --debug-info --no-inline --pretty --source-map)")) + "(:standard --debuginfo --noinline --dynlink --linkall --sourcemap)")) (rule (write-file js-of-ocaml-flags-release "(:standard)")) From fffb4a09936dab0c286ffef23085a9f1752ad5f4 Mon Sep 17 00:00:00 2001 From: disconcision Date: Sun, 4 Aug 2024 23:32:13 -0400 Subject: [PATCH 167/168] child lines for error decos --- src/haz3lweb/view/Deco.re | 95 +++++++++++++++++--------------------- src/haz3lweb/www/style.css | 10 ++-- 2 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/haz3lweb/view/Deco.re b/src/haz3lweb/view/Deco.re index 8d216a3b59..8c296ca6c4 100644 --- a/src/haz3lweb/view/Deco.re +++ b/src/haz3lweb/view/Deco.re @@ -139,6 +139,29 @@ module Deco = ["selected"] @ (Selection.is_buffer(z.selection) ? ["buffer"] : []), ); + let term_range = (p): option((Point.t, Point.t)) => { + let id = Any.rep_id(Id.Map.find(Piece.id(p), M.meta.syntax.terms)); + switch (TermRanges.find_opt(id, M.meta.syntax.term_ranges)) { + | None => None + | Some((p_l, p_r)) => + let l = + Measured.find_p(~msg="Dec.range", p_l, M.meta.syntax.measured).origin; + let r = + Measured.find_p(~msg="Dec.range", p_r, M.meta.syntax.measured).last; + Some((l, r)); + }; + }; + + let all_tiles = (p: Piece.t): list((Uuidm.t, Mold.t, Measured.Shards.t)) => + Id.Map.find(Piece.id(p), M.meta.syntax.terms) + |> Any.ids + |> List.map(id => { + let t = tile(id); + let shards = + Measured.find_shards(~msg="all_tiles", t, M.meta.syntax.measured); + (id, t.mold, shards); + }); + let indicated_piece_deco = (z: Zipper.t): list(Node.t) => { switch (Indicated.piece(z)) { | _ when z.selection.content != [] => [] @@ -152,29 +175,7 @@ module Deco = | None => Nib.Shape.Convex | Some(nib) => Nib.Shape.relative(nib, side) }; - let range: option((Point.t, Point.t)) = { - // if (Piece.has_ends(p)) { - let id = Id.Map.find(Piece.id(p), M.meta.syntax.terms) |> Any.rep_id; - switch (TermRanges.find_opt(id, M.meta.syntax.term_ranges)) { - | None => None - | Some((p_l, p_r)) => - let l = - Measured.find_p( - ~msg="Deco.indicated", - p_l, - M.meta.syntax.measured, - ). - origin; - let r = - Measured.find_p( - ~msg="Deco.indicated", - p_r, - M.meta.syntax.measured, - ). - last; - Some((l, r)); - }; - }; + let range = term_range(p); let index = switch (Indicated.shard_index(z)) { | None => (-1) @@ -183,21 +184,7 @@ module Deco = switch (range) { | None => [] | Some(range) => - let tiles = - Id.Map.find(Piece.id(p), M.meta.syntax.terms) - |> Any.ids - |> List.map(id => { - let t = tile(id); - ( - id, - t.mold, - Measured.find_shards( - ~msg="Deco.indicated", - t, - M.meta.syntax.measured, - ), - ); - }); + let tiles = all_tiles(p); PieceDec.indicated( ~font_metrics, ~rows=M.meta.syntax.measured.rows, @@ -358,20 +345,24 @@ module Deco = [PieceDec.simple_shard_error({font_metrics, shapes, measurement})], ); | None => - let tiles = - Id.Map.find(id, M.meta.syntax.terms) - |> Term.Any.ids - |> List.map(id => { - let t = tile(id); - let shards = - Measured.find_shards( - ~msg="Deco.errors_of_tile", - t, - M.meta.syntax.measured, - ); - PieceDec.simple_shards_errors(~font_metrics, t.mold, shards); - }); - div_c("errors-piece", List.flatten(tiles)); + let p = Piece.Tile(tile(id)); + let tiles = all_tiles(p); + let shard_decos = + tiles + |> List.map(((_, mold, shards)) => + PieceDec.simple_shards_errors(~font_metrics, mold, shards) + ) + |> List.flatten; + switch (term_range(p)) { + | Some(range) => + let rows = M.meta.syntax.measured.rows; + let decos = + shard_decos + @ PieceDec.uni_lines(~font_metrics, ~rows, range, tiles) + @ PieceDec.bi_lines(~font_metrics, ~rows, tiles); + div_c("errors-piece", decos); + | None => div_c("errors-piece", shard_decos) + }; } ) { | Not_found => diff --git a/src/haz3lweb/www/style.css b/src/haz3lweb/www/style.css index e37ac99c54..2a1746bd4e 100644 --- a/src/haz3lweb/www/style.css +++ b/src/haz3lweb/www/style.css @@ -1043,7 +1043,8 @@ svg.shard.indicated { svg.shard.selected { z-index: var(--tile-z); } -svg.shard.error { +svg.shard.error, +.errors .errors-piece svg { z-index: var(--err-hole-z); } @@ -1058,13 +1059,16 @@ svg.shard.selected.buffer > path { stroke: none; filter: none; } -svg.shard.error > path { - fill: #ff00000a; +svg.shard.error > path, +.errors .errors-piece svg .child-line { stroke: #ff000087; stroke-width: 0.75px; stroke-dasharray: 1, 1; stroke-linecap: butt; } +svg.shard.error > path { + fill: #ff00000a; +} /* END SHARD DECORATIONS */ From 9048d6dc07f752eb578b5abc583b8afbddac45c7 Mon Sep 17 00:00:00 2001 From: disconcision Date: Mon, 5 Aug 2024 00:36:08 -0400 Subject: [PATCH 168/168] fix bug with clicking at the end of the line triggering a jump to the next line --- src/haz3lcore/zipper/action/Move.re | 67 ++++++++++++++++++----------- src/haz3lweb/view/Cell.re | 5 +-- 2 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/haz3lcore/zipper/action/Move.re b/src/haz3lcore/zipper/action/Move.re index 607fe7deba..8f38ebc8ba 100644 --- a/src/haz3lcore/zipper/action/Move.re +++ b/src/haz3lcore/zipper/action/Move.re @@ -116,9 +116,10 @@ module Make = (M: Editor.Meta.S) => { let do_towards = ( - ~anchor: option(Point.t)=?, + ~anchor: option(Measured.Point.t)=?, + ~force_progress: bool=false, f: (Direction.t, t) => option(t), - goal: Point.t, + goal: Measured.Point.t, z: t, ) : option(t) => { @@ -140,34 +141,48 @@ module Make = (M: Editor.Meta.S) => { | (Exact, Exact) => curr /* If we've overshot, meaning the exact goal is inaccessible, * we choose between current and previous (undershot) positions */ - | (Over, Over | Exact | Under) - | (Exact, Over) when anchor != None => - /* If we're dragging to make a selection, decide whether or - * not to force progress based on the relative position of the - * anchor (the position where the drag was started) */ - direction_to_from(goal, Option.get(anchor)) == d_to_goal - ? curr : prev | (Over, Over | Exact | Under) => - /* Up/down kb movement works by setting a goal one row - * below the current. When adjacent to a multiline token, - * the nearest next caret position may be multiple lines down. - * We must allow this overshoot in order to make progress. */ - caret_point(prev) == init ? curr : prev - | (Exact, Over) - when is_at_side_of_row(Direction.toggle(d_to_goal), curr) => - /* If you're trying to (eg) move down at the end of a row - * but the first position of the next row is further right - * than the currentrow's end, we want to make progress - * regardless of whether thenew position would be closer - * or further from the goal */ - curr + switch (force_progress) { + | false => + /* Ideally we would use the same logic as from the below + * anchor case here; however that results in strange + * behavior when accidentally starting a drag at the end + * of a line, which triggers the (invisible) selection of + * a linebreak, making it appear that the caret has jumped + * to the next line. The downside of leaving this as-is is + * that multiline tokens (projectors) do not become part of + * the selection when dragging until you're all the way + * over them, which is slightly visually jarring */ + prev + | true => + /* Up/down kb movement works by setting a goal one row + * below the current. When adjacent to a multiline token, + * the nearest next caret position may be multiple lines down. + * We must allow this overshoot in order to make progress. */ + caret_point(prev) == init ? curr : prev + } | (Exact, Over) => - /* Otherwise, we try to just get as close as we can */ - closer_to_prev(curr, prev, goal) ? prev : curr + switch (anchor) { + | None => + /* If you're trying to (eg) move down at the end of a row + * but the first position of the next row is further right + * than the currentrow's end, we want to make progress + * regardless of whether the new position would be closer + * or further from the goal. Otherwise, we try to just + * get as close as we can */ + is_at_side_of_row(Direction.toggle(d_to_goal), curr) + ? curr : closer_to_prev(curr, prev, goal) ? prev : curr + | Some(anchor) => + /* If we're dragging to make a selection, decide whether or + * not to force progress based on the relative position of the + * anchor (the position where the drag was started) */ + direction_to_from(goal, anchor) == d_to_goal ? curr : prev + } }; }; let res = go(z, z); - Point.equals(caret_point(res), init) ? None : Some(res); + Measured.Point.equals(caret_point(res), caret_point(z)) + ? None : Some(res); }; let do_vertical = (f: (Direction.t, t) => option(t), d: Direction.t, z: t): option(t) => { @@ -177,7 +192,7 @@ module Make = (M: Editor.Meta.S) => { let cur_p = caret_point(z); let goal = Point.{col: M.col_target, row: cur_p.row + (d == Right ? 1 : (-1))}; - do_towards(f, goal, z); + do_towards(~force_progress=true, f, goal, z); }; let do_extreme = diff --git a/src/haz3lweb/view/Cell.re b/src/haz3lweb/view/Cell.re index 77b1592f5e..e006b7e30d 100644 --- a/src/haz3lweb/view/Cell.re +++ b/src/haz3lweb/view/Cell.re @@ -9,10 +9,7 @@ let get_goal = (~font_metrics: FontMetrics.t, ~target_id, e) => { let goal_y = float_of_int(e##.clientY); Point.{ row: Float.to_int((goal_y -. rect##.top) /. font_metrics.row_height), - col: - Float.( - to_int(round((goal_x -. rect##.left) /. font_metrics.col_width)) - ), + col: Float.(to_int((goal_x -. rect##.left) /. font_metrics.col_width)), }; };