From 2a0021b0741a002e8613657f3c3b23af456864b2 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 11 Dec 2020 08:25:57 -0600 Subject: [PATCH] added day 11 and updated all days with string change --- day1.onyx | 4 +- day10.onyx | 4 +- day11.onyx | 107 ++++++++++++++++++++++++++++++++++++++++++++++++ day2.onyx | 18 ++++---- day3.onyx | 6 +-- day4.onyx | 14 +++---- day5.onyx | 6 +-- day6.onyx | 14 +++---- day7.onyx | 33 +++++++-------- day8.onyx | 10 ++--- day9.onyx | 4 +- input/day11.txt | 90 ++++++++++++++++++++++++++++++++++++++++ out.wasm | Bin 8722 -> 10891 bytes 13 files changed, 254 insertions(+), 56 deletions(-) create mode 100644 day11.onyx create mode 100644 input/day11.txt diff --git a/day1.onyx b/day1.onyx index 8c7f56f..f54127f 100644 --- a/day1.onyx +++ b/day1.onyx @@ -4,7 +4,7 @@ package main use package core -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day1.txt"); contents_orig := contents; defer cfree(contents_orig.data); @@ -15,7 +15,7 @@ main :: proc (args: [] cstring) { while num := 1; num > 0 { // This sets num to be 0 if there is no number - str.read_u32(^contents, ^num); + string.read_u32(^contents, ^num); if num != 0 do array.push(^nums, num); } diff --git a/day10.onyx b/day10.onyx index a2181d0..5349813 100644 --- a/day10.onyx +++ b/day10.onyx @@ -1,7 +1,7 @@ #include_file "core/std/wasi" use package core -use package core.str.reader as reader +use package core.string.reader as reader count_ending_paths :: proc (nums: [..] u32) -> u64 { tally: [..] u64; @@ -24,7 +24,7 @@ count_ending_paths :: proc (nums: [..] u32) -> u64 { return tally[0]; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day10.txt"); defer cfree(contents.data); diff --git a/day11.onyx b/day11.onyx new file mode 100644 index 0000000..b637a5c --- /dev/null +++ b/day11.onyx @@ -0,0 +1,107 @@ +#include_file "core/std/wasi" + +use package core +use package core.string.reader as reader + +GameOfSeats :: struct { + width : u32; + height : u32; + seats : [..] SeatState; + temp : [..] SeatState; +} + +SeatState :: enum (u8) { OOB; Floor; Empty; Occupied; } + +gos_get_seat :: proc (use gos: ^GameOfSeats, x: i32, y: i32) -> SeatState { + if x < 0 || y < 0 || x >= width || y >= height do return SeatState.OOB; + return seats[x + y * width]; +} + +gos_set_temp :: proc (use gos: ^GameOfSeats, x: i32, y: i32, state: SeatState) { + if x < 0 || y < 0 || x >= width || y >= height do return; + temp[x + y * width] = state; +} + +gos_neighbors :: proc (use gos: ^GameOfSeats, x: i32, y: i32, state := SeatState.Occupied) -> u32 { + count := 0; + + for dy: -1 .. 2 { + for dx: -1 .. 2 { + if dy == 0 && dx == 0 do continue; + + t := 1; + seat := gos_get_seat(gos, x + dx, y + dy); + while seat == SeatState.Floor { + t += 1; + seat = gos_get_seat(gos, x + dx * t, y + dy * t); + } + + if seat == state do count += 1; + } + } + + return count; +} + +gos_iter :: proc (use gos: ^GameOfSeats) -> bool { + for i: 0 .. seats.count do temp[i] = seats[i]; + + changed := false; + for y: 0 .. height { + for x: 0 .. width { + occ_neighbors := gos_neighbors(gos, x, y); + + switch gos_get_seat(gos, x, y) { + case SeatState.Empty do if occ_neighbors == 0 { + gos_set_temp(gos, x, y, SeatState.Occupied); + changed = true; + } + + case SeatState.Occupied do if occ_neighbors >= 5 { + gos_set_temp(gos, x, y, SeatState.Empty); + changed = true; + } + } + } + } + + for i: 0 .. seats.count do seats[i] = temp[i]; + + return changed; +} + +main :: proc (args: [] cstr) { + contents := file.get_contents("input/day11.txt"); + defer cfree(contents.data); + + file := reader.make(contents); + + gos : GameOfSeats; + array.init(^gos.seats, 32); + defer array.free(^gos.seats); + + gos.height = 0; + + while !reader.empty(^file) { + line := reader.read_line(^file); + for ch: line do switch ch { + case #char "." do array.push(^gos.seats, SeatState.Floor); + case #char "L" do array.push(^gos.seats, SeatState.Empty); + case #char "#" do array.push(^gos.seats, SeatState.Occupied); + } + + gos.width = line.count; + gos.height += 1; + } + + array.init(^gos.temp, gos.seats.count); + defer array.free(^gos.temp); + + while gos_iter(^gos) --- + + occupied := 0; + for s: gos.seats do if s == SeatState.Occupied do occupied += 1; + + printf("Occupied: %i\n", occupied); +} + diff --git a/day2.onyx b/day2.onyx index daa3e80..8eea3de 100644 --- a/day2.onyx +++ b/day2.onyx @@ -4,7 +4,7 @@ package main use package core -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day2.txt"); contents_orig := contents; defer cfree(contents_orig.data); @@ -13,17 +13,17 @@ main :: proc (args: [] cstring) { lo : u32; hi : u32; ch : u8; - pw : string = ""; + pw : str = ""; while true { - str.read_u32(^contents, ^lo); + string.read_u32(^contents, ^lo); if lo == 0 do break; - str.discard_chars(^contents); - str.read_u32(^contents, ^hi); - str.discard_chars(^contents); - str.read_char(^contents, ^ch); - str.discard_chars(^contents, 2); - str.read_line(^contents, ^pw); + string.discard_chars(^contents); + string.read_u32(^contents, ^hi); + string.discard_chars(^contents); + string.read_char(^contents, ^ch); + string.discard_chars(^contents, 2); + string.read_line(^contents, ^pw); // Part 1 // count := 0; diff --git a/day3.onyx b/day3.onyx index e81d9f2..c885126 100644 --- a/day3.onyx +++ b/day3.onyx @@ -18,7 +18,7 @@ line_interp_at :: proc (use li: LineInterp, t: i32) -> Point { return Point.{ ox + dx * t, oy + dy * t }; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day3.txt"); contents_orig := contents; defer cfree(contents_orig.data); @@ -30,8 +30,8 @@ main :: proc (args: [] cstring) { width := 0; height := 0; while true { - line: string = ""; - str.read_line(^contents, ^line); + line := ""; + string.read_line(^contents, ^line); if line.count == 0 do break; width = line.count; diff --git a/day4.onyx b/day4.onyx index ba958eb..20bcc33 100644 --- a/day4.onyx +++ b/day4.onyx @@ -3,22 +3,22 @@ use package core // Returns the number of fields -process_passport :: proc (contents: ^string) -> u32 { +process_passport :: proc (contents: ^str) -> u32 { field_count := 0; while true { - line: string; - str.read_line(contents, ^line); + line: str; + string.read_line(contents, ^line); if line.count == 0 do break; - fields := str.split(line, #char " "); + fields := string.split(line, #char " "); defer cfree(fields.data); for field: fields { - data := str.split(field, #char ":"); + data := string.split(field, #char ":"); defer cfree(data.data); - if !str.equal(data[0], "cid") { + if !string.equal(data[0], "cid") { field_count += 1; } } @@ -29,7 +29,7 @@ process_passport :: proc (contents: ^string) -> u32 { // This does not include part 2 because it is gross and // not worth the effort to implement it. -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day4.txt"); contents_data := contents.data; defer cfree(contents_data); diff --git a/day5.onyx b/day5.onyx index 21a913b..b22a009 100644 --- a/day5.onyx +++ b/day5.onyx @@ -2,7 +2,7 @@ use package core -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day5.txt"); contents_data := contents.data; defer cfree(contents_data); @@ -14,8 +14,8 @@ main :: proc (args: [] cstring) { max_val := 0; while true { - line: string; - str.read_line(^contents, ^line); + line: str; + string.read_line(^contents, ^line); if line.count == 0 do break; val := 0; diff --git a/day6.onyx b/day6.onyx index db02e44..9e3de37 100644 --- a/day6.onyx +++ b/day6.onyx @@ -2,13 +2,13 @@ use package core -part_1 :: proc (contents: ^string) -> u32 { +part_1 :: proc (contents: ^str) -> u32 { chars : [26] bool; for ^ch: chars do *ch = false; while true { - line: string; - str.read_line(contents, ^line); + line: str; + string.read_line(contents, ^line); if line.count == 0 do break; for ch: line do chars[~~ch - cast(u32) #char "a"] = true; @@ -20,14 +20,14 @@ part_1 :: proc (contents: ^string) -> u32 { return sum; } -part_2 :: proc (contents: ^string) -> u32 { +part_2 :: proc (contents: ^str) -> u32 { chars : [26] u32; for ^ch: chars do *ch = 0; person_count := 0; while true { - line: string; - str.read_line(contents, ^line); + line: str; + string.read_line(contents, ^line); if line.count == 0 do break; person_count += 1; @@ -40,7 +40,7 @@ part_2 :: proc (contents: ^string) -> u32 { return sum; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day6.txt"); contents_data := contents.data; defer cfree(contents_data); diff --git a/day7.onyx b/day7.onyx index c3a8cd4..82622d2 100644 --- a/day7.onyx +++ b/day7.onyx @@ -1,6 +1,7 @@ #include_file "core/std/wasi" use package core +use package core.string.reader as reader BagGraph :: struct { nodes : [..] ^BagNode; @@ -8,7 +9,7 @@ BagGraph :: struct { } BagNode :: struct { - color : string; + color : str; // Part 1 // contained_in : [..] BagContainment; @@ -31,7 +32,7 @@ bg_free :: proc (use graph: ^BagGraph) { strmap.free(^node_map); } -bg_get_node :: proc (use graph: ^BagGraph, name: string) -> ^BagNode { +bg_get_node :: proc (use graph: ^BagGraph, name: str) -> ^BagNode { node := strmap.get(^node_map, name); if node == null { @@ -43,37 +44,37 @@ bg_get_node :: proc (use graph: ^BagGraph, name: string) -> ^BagNode { node.color = name; array.push(^nodes, node); - strmap.put(^node_map, name, node); + strmap.put(^node_map, node.color, node); } return node; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day7.txt"); - contents_data := contents.data; - defer cfree(contents_data); + defer cfree(contents.data); + + file := reader.make(contents); graph : BagGraph; bg_init(^graph); defer bg_free(^graph); while true { - name := str.read_until(^contents, #char " ", 1); + name := reader.read_until(^file, 1, #char " "); if name.count == 0 do break; container := bg_get_node(^graph, name); - str.read_until(^contents, #char " ", 2); + reader.read_until(^file, 2, #char " "); while true { - if str.starts_with(contents, " no") do break; + if reader.starts_with(^file, " no") do break; - count : u32; - str.read_u32(^contents, ^count); - str.discard_chars(^contents, 1); + count := reader.read_u32(^file); + reader.skip_bytes(^file, 1); - contained_name := str.read_until(^contents, #char " ", 1); + contained_name := reader.read_until(^file, 1, #char " "); contained := bg_get_node(^graph, contained_name); // Part 1 @@ -88,13 +89,13 @@ main :: proc (args: [] cstring) { count = count }); - bag_word := str.read_until_either(^contents, 1, #char " ", #char "\n"); + bag_word := reader.read_until(^file, 1, #char " ", #char "\n"); if bag_word[bag_word.count - 1] == #char "." do break; } - str.advance_line(^contents); + reader.advance_line(^file); } - + // Part 1 // to_process_bags : [..] ^BagNode; // processed_bags: [..] ^BagNode; diff --git a/day8.onyx b/day8.onyx index 52234c9..111c105 100644 --- a/day8.onyx +++ b/day8.onyx @@ -1,7 +1,7 @@ #include_file "core/std/wasi" use package core -use package core.str.reader as reader +use package core.string.reader as reader OpCode :: enum (u16) { Nop; Acc; Jmp; @@ -44,7 +44,7 @@ get_acc_value :: proc (instrs: [..] Instruction, ret_acc: ^i32) -> bool { return succ; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day8.txt"); defer cfree(contents.data); @@ -66,9 +66,9 @@ main :: proc (args: [] cstring) { if sign == #char "-" do val *= -1; opcode : OpCode; - if str.equal(word, "nop") do opcode = OpCode.Nop; - elseif str.equal(word, "acc") do opcode = OpCode.Acc; - elseif str.equal(word, "jmp") do opcode = OpCode.Jmp; + if string.equal(word, "nop") do opcode = OpCode.Nop; + elseif string.equal(word, "acc") do opcode = OpCode.Acc; + elseif string.equal(word, "jmp") do opcode = OpCode.Jmp; array.push(^instrs, Instruction.{ opcode = opcode, diff --git a/day9.onyx b/day9.onyx index 6040c1d..9dd31af 100644 --- a/day9.onyx +++ b/day9.onyx @@ -1,7 +1,7 @@ #include_file "core/std/wasi" use package core -use package core.str.reader as reader +use package core.string.reader as reader StartEnd :: struct { start: i32; end: i32; } @@ -27,7 +27,7 @@ find_contiguous_subarray_with_sum :: proc (nums: [..] u64, sum: u64) -> StartEnd return StartEnd.{ start, end }; } -main :: proc (args: [] cstring) { +main :: proc (args: [] cstr) { contents := file.get_contents("input/day9.txt"); defer cfree(contents.data); diff --git a/input/day11.txt b/input/day11.txt new file mode 100644 index 0000000..977ae5f --- /dev/null +++ b/input/day11.txt @@ -0,0 +1,90 @@ +LLLLL.LLLLLL.LLLLLLLLL.LLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLL.LLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLL.LLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL +LLLLL.L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +L.LL.L.L.LL.....L.L..L.LL.L.L.L.....L..LLL.L.....L.L...LL..L.....L...L..L.LLLL..L.LL......L.L.L. +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLL. +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +......LL..LLLL.L...LL.....L.L.......L..L.LL....L.LLL........L.L.L.LL.....L.........L....L......L +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL..LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL..LLLLL.LLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +.L...L...L.....L...L....L.LL.LLL.LL...LL.L..L...L......L..LL..L..LL..L.L......L.L.LLL......L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +...........LLL.....LLL.....LL.L..........L..L.L.L...L.L.....L........L......L..L..L...LL....L.L. +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLL.LLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLL.L.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.L.LLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.LLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL +L.......LL...LL...L..L.....L..LL..L.L.LLL.L.L..L.LL.L.........L....LLLL..LL..L.L..L..LLLL..LL.L. +LLLLL.LLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLL..LLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +....LLL.LL....L.L.........L.L............L..L...L.LLLL......L...L.L..L....L.......L..L.......... +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLL.LL.L.LLLLL.LLLLLL.LLLLLL.LLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LL.L.LLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.L..LLL..LLLLLLLLL.LLLLLL.LLLL.L.LLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLL.LLLLLLLLL.LLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +.L..LLLL..L.L.LLL.......LL.LL.LL......L.L....L.LLL.......L...L.L.LL...LL.....L.L....L.L...L.L... +LLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL.LLLL +LLLLL.LL.LLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL..LLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LL +LLL.LLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLL +LLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +.L..L..LLL....LL......LL.L.L..LL..LL....L...L..L.L.L...L..L..L.LLLL.L....L.....L..L...L...LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL.LLLL.LLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLL..LLLLLLLLLLLLLL.LLLLLL.LL.LLLLLLLLLLL.L.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +..LL.LL.L.LL.L...L..L..L..L...LL........L......LL.LLLL.......L..LLL.L.L....L.....L..LL..L.LL.LL. +LLLLL.LLLL.L.LLLLL.LLL.LLLLLL.LLLLLLL.LL.LLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL..LLLLL.LLLLLLL.LLLL.LLLLLLLLLLL.LLLL..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLL.LLLL +LLLLL.LLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLL..LLLLLLLLLLLLLLL.L.LLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LL.LL.LLL.LL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +.LL..LL.L.LL......L.L.LL...L..LL..LL...L..L.L..LL...L.L..L.....L.LLL..L..LL.L..L.......L..LLL... +LLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL..LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLL.L.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL +LLLLL.LLL.LL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLL.LLLL.LLLLL.LLLLLL.LL.L.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +.L.L....LLL.L.L........L..L....L..L...LL..L..LLL..L.L....L..L.LL....LL.L.L.....L........L..L.L.. +LLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLL +LLLLL.LLLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLL.LL..LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.L.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLLLLLLLLL.LLLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLL +LLLL..L.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLLLL +LLLLL..LLLLL.LLLLLLLLL.LLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLL.LLLLLLLL +LLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.L.LL..LLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL diff --git a/out.wasm b/out.wasm index ac69ff6db5ad55c9b829c92ce1af9e28b7bd37ff..06c3250c91d0e8f83e5fe3263419add086c0c045 100644 GIT binary patch literal 10891 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 K$N#;!t$qU;c4G?w literal 8722 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