From e81218576d04a91736ef672fcba132c574ccbd1f Mon Sep 17 00:00:00 2001 From: JiWoong Sul Date: Sat, 22 Nov 2025 01:08:44 +0900 Subject: [PATCH] =?UTF-8?q?=EC=8B=A0=EA=B7=9C=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program copy.cs.bak | 989 ++++++++++++++++ Program.cs | 1051 +++++++++++++++++ bin/Debug/net7.0/nekoban_map_gen | Bin 0 -> 148208 bytes bin/Debug/net7.0/nekoban_map_gen.deps.json | 23 + bin/Debug/net7.0/nekoban_map_gen.dll | Bin 0 -> 45568 bytes bin/Debug/net7.0/nekoban_map_gen.pdb | Bin 0 -> 26988 bytes .../net7.0/nekoban_map_gen.runtimeconfig.json | 9 + levelbalance.json | 34 + mask_library.cs | 414 +++++++ nekoban_map_gen.csproj | 10 + nekoban_map_gen.sln | 24 + ...CoreApp,Version=v7.0.AssemblyAttributes.cs | 4 + obj/Debug/net7.0/apphost | Bin 0 -> 148208 bytes .../net7.0/nekoban_map_gen.AssemblyInfo.cs | 22 + .../nekoban_map_gen.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 11 + .../net7.0/nekoban_map_gen.GlobalUsings.g.cs | 8 + obj/Debug/net7.0/nekoban_map_gen.assets.cache | Bin 0 -> 161 bytes ...ban_map_gen.csproj.AssemblyReference.cache | Bin 0 -> 73629 bytes ...ban_map_gen.csproj.CoreCompileInputs.cache | 1 + ...ekoban_map_gen.csproj.FileListAbsolute.txt | 15 + obj/Debug/net7.0/nekoban_map_gen.dll | Bin 0 -> 45568 bytes .../nekoban_map_gen.genruntimeconfig.cache | 1 + obj/Debug/net7.0/nekoban_map_gen.pdb | Bin 0 -> 26988 bytes obj/Debug/net7.0/ref/nekoban_map_gen.dll | Bin 0 -> 17920 bytes obj/Debug/net7.0/refint/nekoban_map_gen.dll | Bin 0 -> 17920 bytes obj/nekoban_map_gen.csproj.nuget.dgspec.json | 61 + obj/nekoban_map_gen.csproj.nuget.g.props | 15 + obj/nekoban_map_gen.csproj.nuget.g.targets | 2 + obj/project.assets.json | 66 ++ obj/project.nuget.cache | 8 + stage.json | 277 +++++ 32 files changed, 3046 insertions(+) create mode 100644 Program copy.cs.bak create mode 100644 Program.cs create mode 100755 bin/Debug/net7.0/nekoban_map_gen create mode 100644 bin/Debug/net7.0/nekoban_map_gen.deps.json create mode 100644 bin/Debug/net7.0/nekoban_map_gen.dll create mode 100644 bin/Debug/net7.0/nekoban_map_gen.pdb create mode 100644 bin/Debug/net7.0/nekoban_map_gen.runtimeconfig.json create mode 100644 levelbalance.json create mode 100644 mask_library.cs create mode 100644 nekoban_map_gen.csproj create mode 100644 nekoban_map_gen.sln create mode 100644 obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs create mode 100755 obj/Debug/net7.0/apphost create mode 100644 obj/Debug/net7.0/nekoban_map_gen.AssemblyInfo.cs create mode 100644 obj/Debug/net7.0/nekoban_map_gen.AssemblyInfoInputs.cache create mode 100644 obj/Debug/net7.0/nekoban_map_gen.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 obj/Debug/net7.0/nekoban_map_gen.GlobalUsings.g.cs create mode 100644 obj/Debug/net7.0/nekoban_map_gen.assets.cache create mode 100644 obj/Debug/net7.0/nekoban_map_gen.csproj.AssemblyReference.cache create mode 100644 obj/Debug/net7.0/nekoban_map_gen.csproj.CoreCompileInputs.cache create mode 100644 obj/Debug/net7.0/nekoban_map_gen.csproj.FileListAbsolute.txt create mode 100644 obj/Debug/net7.0/nekoban_map_gen.dll create mode 100644 obj/Debug/net7.0/nekoban_map_gen.genruntimeconfig.cache create mode 100644 obj/Debug/net7.0/nekoban_map_gen.pdb create mode 100644 obj/Debug/net7.0/ref/nekoban_map_gen.dll create mode 100644 obj/Debug/net7.0/refint/nekoban_map_gen.dll create mode 100644 obj/nekoban_map_gen.csproj.nuget.dgspec.json create mode 100644 obj/nekoban_map_gen.csproj.nuget.g.props create mode 100644 obj/nekoban_map_gen.csproj.nuget.g.targets create mode 100644 obj/project.assets.json create mode 100644 obj/project.nuget.cache create mode 100644 stage.json diff --git a/Program copy.cs.bak b/Program copy.cs.bak new file mode 100644 index 0000000..7a34614 --- /dev/null +++ b/Program copy.cs.bak @@ -0,0 +1,989 @@ +// Sokoban map generator (mask-based, reverse search from solved state) +// - Uses small hand-made masks (Microban/Novoban 스타일) to shape the outer walls. +// - Places goals/boxes in solved state, then pulls boxes away from goals (reverse of push) to guarantee solvability. +// - Run: `dotnet run > output.json` (defaults use band config). Optional: `dotnet run [startId] [endId]`. +// Legend: '#' wall, '.' floor, '0' void, 'G' goal, '$' box, '@' player. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text.Json; + +internal static class Program +{ + private static readonly LevelBandConfig[] LevelBands = + { + new LevelBandConfig + { + StartId = 3, + EndId = 20, + BoxCountLow = 1, + BoxCountHigh = 2, + MinAllowedPushes = 4, + MinAllowedTurns = 2, + ShapeMasks = MaskLibrary.Microban.Take(8).ToList() + }, + new LevelBandConfig + { + StartId = 21, + EndId = 40, + BoxCountLow = 1, + BoxCountHigh = 2, + MinAllowedPushes = 7, + MinAllowedTurns = 3, + ShapeMasks = MaskLibrary.Microban.ToList() + }, + new LevelBandConfig + { + StartId = 41, + EndId = 60, + BoxCountLow = 2, + BoxCountHigh = 3, + MinAllowedPushes = 9, + MinAllowedTurns = 4, + ShapeMasks = MaskLibrary.Microban.ToList() + } + }; + + private static readonly GenerationTuning Tuning = new GenerationTuning + { + MaxAttemptsPerLevel = 2000, + MaxMillisecondsPerLevel = 40_000, + PushLimitPadding = 2, + PushLimitScale = 0.35, + DynamicGrowthWindow = 12, + DynamicPushIncrement = 2, + ReverseSearchMaxDepth = 120, + ReverseSearchBreadth = 800, + ApplyMaskTransforms = true, + MaskWallJitter = 2 + }; + + private const int DefaultSeed = 12345; + + public static void Main(string[] args) + { + var seed = DefaultSeed; + if (args.Length > 0 && int.TryParse(args[0], out var parsedSeed)) + { + seed = parsedSeed; + } + + var rng = new Random(seed); + var generator = new LevelGenerator(rng, Tuning, LevelBands); + + var startId = LevelBands.Min(b => b.StartId); + var endId = LevelBands.Max(b => b.EndId); + + if (args.Length >= 2 && int.TryParse(args[1], out var requestedStart)) + { + startId = requestedStart; + } + + if (args.Length >= 3 && int.TryParse(args[2], out var requestedEnd)) + { + endId = requestedEnd; + } + + if (startId > endId) + { + (startId, endId) = (endId, startId); + } + + var levels = generator.BuildRange(startId, endId); + var options = new JsonSerializerOptions + { + WriteIndented = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + Console.WriteLine(JsonSerializer.Serialize(levels, options)); + } +} + +internal sealed class LevelGenerator +{ + private readonly Random _rng; + private readonly GenerationTuning _tuning; + private readonly IReadOnlyList _bands; + private readonly bool _trace; + private readonly HashSet _seenLayouts = new(); + + public LevelGenerator(Random rng, GenerationTuning tuning, IReadOnlyList bands) + { + _rng = rng; + _tuning = tuning; + _bands = bands; + _trace = Environment.GetEnvironmentVariable("NEKOBAN_DEBUG") == "1"; + } + + public List BuildRange(int startId, int endId) + { + foreach (var band in _bands) + { + if (band.ShapeMasksExpanded == null || band.ShapeMasksExpanded.Count == 0) + { + var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban; + band.ShapeMasksExpanded = MaskLibrary.ExpandWithTransforms(baseMasks); + } + } + + var output = new List(); + for (var id = startId; id <= endId; id++) + { + var band = ResolveBand(id); + var level = BuildSingle(id, band); + output.Add(level); + } + + return output; + } + + private GeneratedLevel BuildSingle(int id, LevelBandConfig band) + { + var stopwatch = Stopwatch.StartNew(); + var attempts = 0; + var failReasons = _trace ? new Dictionary() : null; + + while (attempts < _tuning.MaxAttemptsPerLevel && + stopwatch.ElapsedMilliseconds < _tuning.MaxMillisecondsPerLevel) + { + attempts++; + + var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban; + var prepped = band.ShapeMasksExpanded ?? MaskLibrary.ExpandWithTransforms(baseMasks); + band.ShapeMasksExpanded ??= prepped; + var mask = MaskLibrary.CreateVariant( + MaskLibrary.PickRandom(_rng, prepped), + _rng, + _tuning.ApplyMaskTransforms, + _tuning.MaskWallJitter); + + var canvas = LayoutFactory.FromMask(mask, _rng, _tuning); + + var boxCount = _rng.Next(band.BoxCountLow, band.BoxCountHigh + 1); + if (boxCount <= 0) + { + boxCount = 1; + } + + if (!PiecePlacer.TryPlace(canvas, _rng, boxCount, out var goals, out var boxes, out var player)) + { + NoteFail(failReasons, "place"); + continue; + } + + var board = Board.FromCanvas(canvas); + var reverse = new ReverseSearch(board, _tuning.ReverseSearchMaxDepth, _tuning.ReverseSearchBreadth); + var startState = reverse.FindStartState(goals, band.MinAllowedPushes, _rng); + if (startState == null) + { + NoteFail(failReasons, "reverse_not_found"); + continue; + } + + var solver = new SokobanSolver(board); + var solve = solver.SolveDetailed(startState.Player, startState.Boxes, goals); + if (solve.IsFail) + { + NoteFail(failReasons, "verify_unsolvable"); + continue; + } + + if (solve.Pushes < band.MinAllowedPushes || solve.Turns < band.MinAllowedTurns || solve.Branching < band.MinAllowedBranching) + { + NoteFail(failReasons, "too_easy"); + continue; + } + + var pushLimit = solve.Pushes + Math.Max(_tuning.PushLimitPadding, + (int)Math.Ceiling(solve.Pushes * _tuning.PushLimitScale)); + + canvas.ClearDynamic(); + canvas.Overlay(goals, 'G'); + canvas.Overlay(startState.Boxes, '$'); + canvas.Set(startState.Player, '@'); + + // Final wall normalization; reject if tokens end up on the edge. + if (!LayoutFactory.NormalizeOuterWallsStrict(canvas, failOnTokens: true)) + { + NoteFail(failReasons, "boundary"); + continue; + } + + var lines = canvas.ToLines(); + var layoutKey = string.Join("|", lines); + if (_seenLayouts.Contains(layoutKey)) + { + NoteFail(failReasons, "duplicate"); + continue; + } + _seenLayouts.Add(layoutKey); + + return new GeneratedLevel + { + Id = id, + Grid = lines, + LowestPush = solve.Pushes, + PushLimit = pushLimit + }; + } + + if (_trace && failReasons != null) + { + Console.Error.WriteLine($"[trace] level {id} failed. Reasons:"); + foreach (var kv in failReasons.OrderByDescending(kv => kv.Value)) + { + Console.Error.WriteLine($" - {kv.Key}: {kv.Value}"); + } + } + + throw new InvalidOperationException($"레벨 {id} 생성 실패 (attempts {attempts})."); + } + + private LevelBandConfig ResolveBand(int id) + { + foreach (var band in _bands) + { + if (id >= band.StartId && id <= band.EndId) + { + return band; + } + } + + var last = _bands.Last(); + var delta = id - last.EndId; + var growthStep = Math.Max(1, delta / Math.Max(1, _tuning.DynamicGrowthWindow) + 1); + return new LevelBandConfig + { + StartId = id, + EndId = id, + BoxCountLow = last.BoxCountLow + growthStep / 2, + BoxCountHigh = last.BoxCountHigh + growthStep / 2, + MinAllowedPushes = last.MinAllowedPushes + growthStep * _tuning.DynamicPushIncrement, + ShapeMasks = last.ShapeMasks + }; + } + + private static void NoteFail(IDictionary? sink, string reason) + { + if (sink == null) return; + sink[reason] = sink.TryGetValue(reason, out var count) ? count + 1 : 1; + } +} + +internal sealed class GeneratedLevel +{ + public int Id { get; init; } + public List Grid { get; init; } = new(); + public int LowestPush { get; init; } + public int PushLimit { get; init; } +} + +internal sealed class LevelBandConfig +{ + public int StartId { get; init; } + public int EndId { get; init; } + public int BoxCountLow { get; init; } + public int BoxCountHigh { get; init; } + public int MinAllowedPushes { get; init; } + public int MinAllowedTurns { get; init; } = 0; + public int MinAllowedBranching { get; init; } = 0; + public List ShapeMasks { get; init; } = new(); + public List? ShapeMasksExpanded { get; set; } +} + +internal sealed class GenerationTuning +{ + public int MaxAttemptsPerLevel { get; init; } + public int MaxMillisecondsPerLevel { get; init; } + public int PushLimitPadding { get; init; } + public double PushLimitScale { get; init; } + public int DynamicGrowthWindow { get; init; } + public int DynamicPushIncrement { get; init; } + public int ReverseSearchMaxDepth { get; init; } + public int ReverseSearchBreadth { get; init; } + public bool ApplyMaskTransforms { get; init; } + public int MaskWallJitter { get; init; } + public int PocketCarveMin { get; init; } = 0; + public int PocketCarveMax { get; init; } = 0; + public int PocketMaxRadius { get; init; } = 1; +} + +internal sealed class GridCanvas +{ + private readonly char[] _cells; + + public GridCanvas(int width, int height) + { + Width = width; + Height = height; + _cells = Enumerable.Repeat('0', width * height).ToArray(); + } + + public int Width { get; } + public int Height { get; } + + public void Fill(char c) => Array.Fill(_cells, c); + + public void Set(int x, int y, char c) + { + if (!InBounds(x, y)) return; + _cells[y * Width + x] = c; + } + + public void Set(int index, char c) + { + if (index < 0 || index >= _cells.Length) return; + _cells[index] = c; + } + + public char Get(int x, int y) => _cells[y * Width + x]; + public char Get(int index) => _cells[index]; + + public bool InBounds(int x, int y) => x >= 0 && y >= 0 && x < Width && y < Height; + + public void Overlay(IEnumerable indices, char c) + { + foreach (var idx in indices) + { + Set(idx, c); + } + } + + public void ClearDynamic() + { + for (var i = 0; i < _cells.Length; i++) + { + if (_cells[i] == '@' || _cells[i] == '$') + { + _cells[i] = '.'; + } + } + } + + public List ToLines() + { + var lines = new List(Height); + for (var y = 0; y < Height; y++) + { + lines.Add(new string(_cells, y * Width, Width)); + } + return lines; + } +} + +internal static class LayoutFactory +{ + public static GridCanvas FromMask(string[] mask, Random rng, GenerationTuning tuning) + { + var height = mask.Length; + var width = mask.Max(row => row.Length); + var canvas = new GridCanvas(width, height); + canvas.Fill('0'); + + for (var y = 0; y < height; y++) + { + var row = mask[y]; + for (var x = 0; x < row.Length; x++) + { + canvas.Set(x, y, row[x]); + } + } + + NormalizeOuterWalls(canvas); + + if (tuning.PocketCarveMax > 0) + { + AddPockets(canvas, rng, tuning); + NormalizeOuterWalls(canvas); + } + + return canvas; + } + + // Enforce: inside the bounding box of non-void tiles, edges are walls, interior voids become walls. + private static void NormalizeOuterWalls(GridCanvas canvas) + { + var w = canvas.Width; + var h = canvas.Height; + + var minX = w; + var minY = h; + var maxX = -1; + var maxY = -1; + + for (var y = 0; y < h; y++) + { + for (var x = 0; x < w; x++) + { + var c = canvas.Get(x, y); + if (c == '0') continue; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + + if (maxX < minX || maxY < minY) + { + return; // nothing to normalize + } + + for (var y = minY; y <= maxY; y++) + { + for (var x = minX; x <= maxX; x++) + { + var isEdge = x == minX || x == maxX || y == minY || y == maxY; + if (isEdge) + { + canvas.Set(x, y, '#'); + } + else if (canvas.Get(x, y) == '0') + { + canvas.Set(x, y, '#'); + } + } + } + + // Outside bounding box remains void. + } + + public static bool NormalizeOuterWallsStrict(GridCanvas canvas, bool failOnTokens) + { + var w = canvas.Width; + var h = canvas.Height; + + var minX = w; + var minY = h; + var maxX = -1; + var maxY = -1; + + for (var y = 0; y < h; y++) + { + for (var x = 0; x < w; x++) + { + var c = canvas.Get(x, y); + if (c == '0') continue; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + + if (maxX < minX || maxY < minY) + { + return false; + } + + for (var y = minY; y <= maxY; y++) + { + for (var x = minX; x <= maxX; x++) + { + var isEdge = x == minX || x == maxX || y == minY || y == maxY; + var c = canvas.Get(x, y); + if (isEdge) + { + if (failOnTokens && (c == 'G' || c == '$' || c == '@')) + { + return false; + } + canvas.Set(x, y, '#'); + } + else if (c == '0') + { + canvas.Set(x, y, '#'); + } + } + } + + return true; + } + + private static void AddPockets(GridCanvas canvas, Random rng, GenerationTuning tuning) + { + var pockets = rng.Next(tuning.PocketCarveMin, tuning.PocketCarveMax + 1); + for (var i = 0; i < pockets; i++) + { + var radius = rng.Next(1, tuning.PocketMaxRadius + 1); + var x = rng.Next(1, canvas.Width - 1); + var y = rng.Next(1, canvas.Height - 1); + for (var yy = y - radius; yy <= y + radius; yy++) + { + for (var xx = x - radius; xx <= x + radius; xx++) + { + if (!canvas.InBounds(xx, yy)) continue; + if (xx == 0 || yy == 0 || xx == canvas.Width - 1 || yy == canvas.Height - 1) continue; + var dx = xx - x; + var dy = yy - y; + if (dx * dx + dy * dy <= radius * radius) + { + if (canvas.Get(xx, yy) == '#') + { + canvas.Set(xx, yy, '.'); + } + } + } + } + } + } +} + +internal static class PiecePlacer +{ + public static bool TryPlace(GridCanvas canvas, Random rng, int boxCount, out HashSet goals, out int[] boxes, out int player) + { + goals = new HashSet(); + boxes = Array.Empty(); + player = -1; + + var candidates = Walkable(canvas).ToList(); + var minRequired = boxCount + 2; + if (candidates.Count < minRequired) + { + return false; + } + + Shuffle(candidates, rng); + + var softGoals = new List(); + foreach (var idx in candidates) + { + if (IsDeadCorner(canvas, idx)) + { + softGoals.Add(idx); + continue; + } + goals.Add(idx); + if (goals.Count == boxCount) break; + } + + if (goals.Count != boxCount) + { + foreach (var idx in softGoals) + { + goals.Add(idx); + if (goals.Count == boxCount) break; + } + } + + if (goals.Count != boxCount) return false; + + var goalSet = new HashSet(goals); + var nonGoals = candidates.Where(i => !goalSet.Contains(i)).ToList(); + Shuffle(nonGoals, rng); + + boxes = goals.ToArray(); + Array.Sort(boxes); + + if (nonGoals.Count == 0) return false; + + var reachable = FloodFrom(goalSet.First(), canvas, Array.Empty()); + if (goalSet.Any(g => !reachable.Contains(g))) return false; + + var playerOptions = nonGoals.Where(reachable.Contains).ToList(); + if (playerOptions.Count == 0) return false; + + player = playerOptions[rng.Next(playerOptions.Count)]; + return true; + } + + private static HashSet FloodFrom(int start, GridCanvas canvas, int[] boxes) + { + var visited = new HashSet(); + if (IsSolid(canvas.Get(start)) || Array.BinarySearch(boxes, start) >= 0) return visited; + + var queue = new Queue(); + visited.Add(start); + queue.Enqueue(start); + + while (queue.Count > 0) + { + var current = queue.Dequeue(); + foreach (var next in NeighborIndices(current, canvas.Width, canvas.Height)) + { + if (next < 0 || next >= canvas.Width * canvas.Height) continue; + if (visited.Contains(next)) continue; + + var tile = canvas.Get(next); + if (IsSolid(tile) || Array.BinarySearch(boxes, next) >= 0) continue; + + visited.Add(next); + queue.Enqueue(next); + } + } + + return visited; + } + + private static IEnumerable Walkable(GridCanvas canvas) + { + for (var i = 0; i < canvas.Width * canvas.Height; i++) + { + var tile = canvas.Get(i); + if (!IsSolid(tile)) + { + yield return i; + } + } + } + + private static IEnumerable NeighborIndices(int index, int width, int height) + { + var x = index % width; + var y = index / width; + + if (y > 0) yield return index - width; + if (y < height - 1) yield return index + width; + if (x > 0) yield return index - 1; + if (x < width - 1) yield return index + 1; + } + + private static bool IsDeadCorner(GridCanvas canvas, int idx) + { + var w = canvas.Width; + var h = canvas.Height; + var x = idx % w; + var y = idx / w; + + var solidNorth = y == 0 || IsSolid(canvas.Get(x, y - 1)); + var solidSouth = y == h - 1 || IsSolid(canvas.Get(x, y + 1)); + var solidWest = x == 0 || IsSolid(canvas.Get(x - 1, y)); + var solidEast = x == w - 1 || IsSolid(canvas.Get(x + 1, y)); + + var verticalBlocked = (solidNorth && solidSouth); + var horizontalBlocked = (solidWest && solidEast); + if (verticalBlocked || horizontalBlocked) return true; + + var cornerNW = solidNorth && solidWest; + var cornerNE = solidNorth && solidEast; + var cornerSW = solidSouth && solidWest; + var cornerSE = solidSouth && solidEast; + return cornerNW || cornerNE || cornerSW || cornerSE; + } + + private static bool IsSolid(char tile) => tile == '#' || tile == '0'; + + private static void Shuffle(IList list, Random rng) + { + for (var i = list.Count - 1; i > 0; i--) + { + var j = rng.Next(i + 1); + (list[i], list[j]) = (list[j], list[i]); + } + } +} + +internal sealed class Board +{ + private readonly bool[] _walls; + + private Board(int width, int height, bool[] walls) + { + Width = width; + Height = height; + _walls = walls; + } + + public int Width { get; } + public int Height { get; } + public int Size => Width * Height; + + public static Board FromCanvas(GridCanvas canvas) + { + var walls = new bool[canvas.Width * canvas.Height]; + for (var i = 0; i < walls.Length; i++) + { + var tile = canvas.Get(i); + walls[i] = tile == '#' || tile == '0'; + } + + return new Board(canvas.Width, canvas.Height, walls); + } + + public bool IsSolid(int index) => _walls[index]; +} + +internal sealed class ReverseSearch +{ + private readonly Board _board; + private readonly int _maxDepth; + private readonly int _breadth; + private readonly int[] _dirs; + + public ReverseSearch(Board board, int maxDepth, int breadth) + { + _board = board; + _maxDepth = maxDepth; + _breadth = breadth; + _dirs = new[] { -board.Width, board.Width, -1, 1 }; + } + + public ScrambledState? FindStartState(HashSet goals, int minPush, Random rng) + { + var boxes = goals.ToArray(); + Array.Sort(boxes); + + var playerStart = FirstFloorNotGoal(goals); + if (playerStart < 0) return null; + + var start = new SolverState(playerStart, boxes); + var queue = new Queue<(SolverState State, int Pushes)>(); + var visited = new HashSet(new StateComparer()) { start }; + queue.Enqueue((start, 0)); + + ScrambledState? best = null; + var bestPush = -1; + + while (queue.Count > 0 && visited.Count < _breadth) + { + var (state, pushes) = queue.Dequeue(); + if (pushes >= minPush && pushes > bestPush) + { + bestPush = pushes; + best = new ScrambledState(state.Player, state.Boxes); + } + + if (pushes >= _maxDepth) continue; + + foreach (var next in Expand(state)) + { + var nextPushes = pushes + (next.Item2 ? 1 : 0); + if (nextPushes > _maxDepth) continue; + + var nextState = next.Item1; + if (visited.Add(nextState)) + { + queue.Enqueue((nextState, nextPushes)); + } + } + } + + return best; + } + + private int FirstFloorNotGoal(HashSet goals) + { + for (var i = 0; i < _board.Size; i++) + { + if (_board.IsSolid(i)) continue; + if (goals.Contains(i)) continue; + return i; + } + return -1; + } + + // Returns (state, isPull) where isPull indicates a box move (counts as push) + private IEnumerable<(SolverState, bool)> Expand(SolverState state) + { + foreach (var dir in _dirs) + { + var step = state.Player + dir; + if (!IndexInBounds(step) || _board.IsSolid(step) || Array.BinarySearch(state.Boxes, step) >= 0) + { + // pull candidate? + var boxPos = state.Player + dir; + var behind = state.Player - dir; + if (!IndexInBounds(boxPos) || !IndexInBounds(behind)) continue; + var boxIndex = Array.BinarySearch(state.Boxes, boxPos); + if (boxIndex < 0) continue; + if (_board.IsSolid(behind) || Array.BinarySearch(state.Boxes, behind) >= 0) continue; + + var nextBoxes = state.Boxes.ToArray(); + nextBoxes[boxIndex] = state.Player; + Array.Sort(nextBoxes); + yield return (new SolverState(behind, nextBoxes), true); + continue; + } + + // player walk + yield return (new SolverState(step, state.Boxes), false); + } + } + + private bool IndexInBounds(int idx) => idx >= 0 && idx < _board.Size; +} + +internal sealed class SokobanSolver +{ + private readonly Board _board; + private readonly StateComparer _comparer = new(); + private readonly int[] _dirs; + + public SokobanSolver(Board board) + { + _board = board; + _dirs = new[] { -board.Width, board.Width, -1, 1 }; + } + + public SolveResult SolveDetailed(int player, int[] boxes, HashSet goals) + { + Array.Sort(boxes); + var start = new SolverState(player, boxes); + var visited = new HashSet(_comparer) { start }; + var parents = new Dictionary(_comparer); + var queue = new Queue(); + queue.Enqueue(start); + + while (queue.Count > 0) + { + var state = queue.Dequeue(); + if (IsSolved(state.Boxes, goals)) + { + return BuildResult(state, parents); + } + + foreach (var (next, dir) in Expand(state)) + { + if (visited.Add(next)) + { + parents[next] = (state, dir); + queue.Enqueue(next); + } + } + } + + return SolveResult.Fail; + } + + private IEnumerable<(SolverState State, int Dir)> Expand(SolverState state) + { + var reachable = ReachableWithoutPushing(state.Player, state.Boxes); + foreach (var pos in reachable) + { + foreach (var dir in _dirs) + { + var boxPos = pos + dir; + var landing = boxPos + dir; + if (!IndexInBounds(boxPos) || !IndexInBounds(landing)) continue; + + var boxIndex = Array.BinarySearch(state.Boxes, boxPos); + if (boxIndex < 0) continue; + if (_board.IsSolid(landing) || Array.BinarySearch(state.Boxes, landing) >= 0) continue; + + var nextBoxes = state.Boxes.ToArray(); + nextBoxes[boxIndex] = landing; + Array.Sort(nextBoxes); + yield return (new SolverState(boxPos, nextBoxes), dir); + } + } + } + + private SolveResult BuildResult(SolverState solved, Dictionary parents) + { + var pushes = 0; + var turns = 0; + var branching = 0; + + var path = new List<(SolverState State, int Dir)>(); + var current = solved; + while (parents.TryGetValue(current, out var entry)) + { + path.Add((current, entry.Dir)); + current = entry.Parent; + } + path.Reverse(); + + var prevDir = 0; + foreach (var (_, dir) in path) + { + pushes++; + if (prevDir != 0 && dir != prevDir) turns++; + prevDir = dir; + } + + // branching: count states along path that had more than one push option + current = solved; + while (parents.TryGetValue(current, out var entry2)) + { + var pushOptions = Expand(entry2.Parent).Count(); + if (pushOptions > 1) branching++; + current = entry2.Parent; + } + + return new SolveResult(pushes, turns, branching); + } + + private List ReachableWithoutPushing(int start, int[] boxes) + { + var visited = new bool[_board.Size]; + var queue = new Queue(); + var output = new List(); + + if (_board.IsSolid(start) || Array.BinarySearch(boxes, start) >= 0) return output; + + visited[start] = true; + queue.Enqueue(start); + output.Add(start); + + while (queue.Count > 0) + { + var current = queue.Dequeue(); + foreach (var dir in _dirs) + { + var next = current + dir; + if (!IndexInBounds(next)) continue; + if (visited[next]) continue; + if (_board.IsSolid(next) || Array.BinarySearch(boxes, next) >= 0) continue; + visited[next] = true; + queue.Enqueue(next); + output.Add(next); + } + } + + return output; + } + + private bool IsSolved(int[] boxes, HashSet goals) + { + foreach (var b in boxes) + { + if (!goals.Contains(b)) return false; + } + return true; + } + + private bool IndexInBounds(int idx) => idx >= 0 && idx < _board.Size; +} + +internal readonly record struct SolverState(int Player, int[] Boxes); + +internal readonly record struct SolveResult(int Pushes, int Turns, int Branching) +{ + public static SolveResult Fail => new(-1, -1, -1); + public bool IsFail => Pushes < 0; +} + +internal sealed class StateComparer : IEqualityComparer +{ + public bool Equals(SolverState x, SolverState y) + { + if (x.Player != y.Player) return false; + var a = x.Boxes; + var b = y.Boxes; + if (a.Length != b.Length) return false; + for (var i = 0; i < a.Length; i++) + { + if (a[i] != b[i]) return false; + } + return true; + } + + public int GetHashCode(SolverState obj) + { + var hash = obj.Player * 397 ^ obj.Boxes.Length; + unchecked + { + for (var i = 0; i < obj.Boxes.Length; i++) + { + hash = hash * 31 + obj.Boxes[i]; + } + } + return hash; + } +} + +internal sealed record ScrambledState(int Player, int[] Boxes); diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..f58da2a --- /dev/null +++ b/Program.cs @@ -0,0 +1,1051 @@ +// Sokoban map generator (mask-based, reverse search from solved state) +// - Uses small hand-made masks (Microban/Novoban 스타일) to shape the outer walls. +// - Places goals/boxes in solved state, then pulls boxes away from goals (reverse of push) to guarantee solvability. +// - Run: `dotnet run > output.json` (defaults use band config). Optional: `dotnet run [startId] [endId]`. +// Legend: '#' wall, '.' floor, '0' void, 'G' goal, '$' box, '@' player. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.Json; + +internal static class Program +{ + private static readonly string LevelBalancePath = "levelbalance.json"; + private static readonly LevelBandConfig[] DefaultLevelBands = + { + new LevelBandConfig + { + StartId = 3, + EndId = 20, + BoxCountLow = 1, + BoxCountHigh = 2, + MinAllowedPushes = 4, + MinAllowedTurns = 2, + ShapeMasks = MaskLibrary.Microban.Take(8).ToList() + }, + new LevelBandConfig + { + StartId = 21, + EndId = 40, + BoxCountLow = 1, + BoxCountHigh = 2, + MinAllowedPushes = 7, + MinAllowedTurns = 3, + ShapeMasks = MaskLibrary.Microban.ToList() + }, + new LevelBandConfig + { + StartId = 41, + EndId = 60, + BoxCountLow = 2, + BoxCountHigh = 3, + MinAllowedPushes = 9, + MinAllowedTurns = 4, + ShapeMasks = MaskLibrary.Microban.ToList() + } + }; + + private static readonly GenerationTuning Tuning = new GenerationTuning + { + MaxAttemptsPerLevel = 2000, + MaxMillisecondsPerLevel = 40_000, + PushLimitPadding = 2, + PushLimitScale = 0.35, + DynamicGrowthWindow = 12, + DynamicPushIncrement = 2, + ReverseSearchMaxDepth = 120, + ReverseSearchBreadth = 800, + ApplyMaskTransforms = true, + MaskWallJitter = 2 + }; + + private const int DefaultSeed = 12345; + + public static void Main(string[] args) + { + var seed = DefaultSeed; + if (args.Length > 0 && int.TryParse(args[0], out var parsedSeed)) + { + seed = parsedSeed; + } + + var rng = new Random(seed); + var levelBands = LoadLevelBands(); + var generator = new LevelGenerator(rng, Tuning, levelBands); + + var startId = levelBands.Min(b => b.StartId); + var endId = levelBands.Max(b => b.EndId); + + if (args.Length >= 2 && int.TryParse(args[1], out var requestedStart)) + { + startId = requestedStart; + } + + if (args.Length >= 3 && int.TryParse(args[2], out var requestedEnd)) + { + endId = requestedEnd; + } + + if (startId > endId) + { + (startId, endId) = (endId, startId); + } + + var levels = generator.BuildRange(startId, endId); + var options = new JsonSerializerOptions + { + WriteIndented = true, + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + Console.WriteLine(JsonSerializer.Serialize(levels, options)); + } + + private static LevelBandConfig[] LoadLevelBands() + { + try + { + if (File.Exists(LevelBalancePath)) + { + var json = File.ReadAllText(LevelBalancePath); + var config = JsonSerializer.Deserialize(json); + if (config?.Bands != null && config.Bands.Count > 0) + { + return config.Bands.Select(ConvertBand).ToArray(); + } + } + } + catch (Exception ex) + { + Console.Error.WriteLine($"[warn] Failed to read {LevelBalancePath}: {ex.Message}. Falling back to default bands."); + } + + return DefaultLevelBands; + } + + private static LevelBandConfig ConvertBand(LevelBandJson input) + { + var masks = MaskLibrary.Microban; + if (input.MaskTake > 0) + { + masks = masks.Take(input.MaskTake).ToList(); + } + return new LevelBandConfig + { + StartId = input.StartId, + EndId = input.EndId, + BoxCountLow = input.BoxCountLow, + BoxCountHigh = input.BoxCountHigh, + MinAllowedPushes = input.MinAllowedPushes, + MinAllowedTurns = input.MinAllowedTurns, + MinAllowedBranching = input.MinAllowedBranching, + ShapeMasks = masks.ToList() + }; + } +} + +internal sealed class LevelGenerator +{ + private readonly Random _rng; + private readonly GenerationTuning _tuning; + private readonly IReadOnlyList _bands; + private readonly bool _trace; + private readonly HashSet _seenLayouts = new(); + + public LevelGenerator(Random rng, GenerationTuning tuning, IReadOnlyList bands) + { + _rng = rng; + _tuning = tuning; + _bands = bands; + _trace = Environment.GetEnvironmentVariable("NEKOBAN_DEBUG") == "1"; + } + + public List BuildRange(int startId, int endId) + { + foreach (var band in _bands) + { + if (band.ShapeMasksExpanded == null || band.ShapeMasksExpanded.Count == 0) + { + var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban; + band.ShapeMasksExpanded = MaskLibrary.ExpandWithTransforms(baseMasks); + } + } + + var output = new List(); + for (var id = startId; id <= endId; id++) + { + var band = ResolveBand(id); + var level = BuildSingle(id, band); + output.Add(level); + } + + return output; + } + + private GeneratedLevel BuildSingle(int id, LevelBandConfig band) + { + var stopwatch = Stopwatch.StartNew(); + var attempts = 0; + var failReasons = _trace ? new Dictionary() : null; + + while (attempts < _tuning.MaxAttemptsPerLevel && + stopwatch.ElapsedMilliseconds < _tuning.MaxMillisecondsPerLevel) + { + attempts++; + + var baseMasks = band.ShapeMasks.Count > 0 ? band.ShapeMasks : MaskLibrary.Microban; + var prepped = band.ShapeMasksExpanded ?? MaskLibrary.ExpandWithTransforms(baseMasks); + band.ShapeMasksExpanded ??= prepped; + var mask = MaskLibrary.CreateVariant( + MaskLibrary.PickRandom(_rng, prepped), + _rng, + _tuning.ApplyMaskTransforms, + _tuning.MaskWallJitter); + + var canvas = LayoutFactory.FromMask(mask, _rng, _tuning); + + var boxCount = _rng.Next(band.BoxCountLow, band.BoxCountHigh + 1); + if (boxCount <= 0) + { + boxCount = 1; + } + + if (!PiecePlacer.TryPlace(canvas, _rng, boxCount, out var goals, out var boxes, out var player)) + { + NoteFail(failReasons, "place"); + continue; + } + + var board = Board.FromCanvas(canvas); + var reverse = new ReverseSearch(board, _tuning.ReverseSearchMaxDepth, _tuning.ReverseSearchBreadth); + var startState = reverse.FindStartState(goals, band.MinAllowedPushes, _rng); + if (startState == null) + { + NoteFail(failReasons, "reverse_not_found"); + continue; + } + + var solver = new SokobanSolver(board); + var solve = solver.SolveDetailed(startState.Player, startState.Boxes, goals); + if (solve.IsFail) + { + NoteFail(failReasons, "verify_unsolvable"); + continue; + } + + if (solve.Pushes < band.MinAllowedPushes || solve.Turns < band.MinAllowedTurns || solve.Branching < band.MinAllowedBranching) + { + NoteFail(failReasons, "too_easy"); + continue; + } + + var pushLimit = solve.Pushes + Math.Max(_tuning.PushLimitPadding, + (int)Math.Ceiling(solve.Pushes * _tuning.PushLimitScale)); + + canvas.ClearDynamic(); + canvas.Overlay(goals, 'G'); + canvas.Overlay(startState.Boxes, '$'); + canvas.Set(startState.Player, '@'); + + // Final wall normalization; reject if tokens end up on the edge. + if (!LayoutFactory.NormalizeOuterWallsStrict(canvas, failOnTokens: true)) + { + NoteFail(failReasons, "boundary"); + continue; + } + + var lines = canvas.ToLines(); + var layoutKey = string.Join("|", lines); + if (_seenLayouts.Contains(layoutKey)) + { + NoteFail(failReasons, "duplicate"); + continue; + } + _seenLayouts.Add(layoutKey); + + return new GeneratedLevel + { + Id = id, + Grid = lines, + LowestPush = solve.Pushes, + PushLimit = pushLimit + }; + } + + if (_trace && failReasons != null) + { + Console.Error.WriteLine($"[trace] level {id} failed. Reasons:"); + foreach (var kv in failReasons.OrderByDescending(kv => kv.Value)) + { + Console.Error.WriteLine($" - {kv.Key}: {kv.Value}"); + } + } + + throw new InvalidOperationException($"레벨 {id} 생성 실패 (attempts {attempts})."); + } + + private LevelBandConfig ResolveBand(int id) + { + foreach (var band in _bands) + { + if (id >= band.StartId && id <= band.EndId) + { + return band; + } + } + + var last = _bands.Last(); + var delta = id - last.EndId; + var growthStep = Math.Max(1, delta / Math.Max(1, _tuning.DynamicGrowthWindow) + 1); + return new LevelBandConfig + { + StartId = id, + EndId = id, + BoxCountLow = last.BoxCountLow + growthStep / 2, + BoxCountHigh = last.BoxCountHigh + growthStep / 2, + MinAllowedPushes = last.MinAllowedPushes + growthStep * _tuning.DynamicPushIncrement, + ShapeMasks = last.ShapeMasks + }; + } + + private static void NoteFail(IDictionary? sink, string reason) + { + if (sink == null) return; + sink[reason] = sink.TryGetValue(reason, out var count) ? count + 1 : 1; + } +} + +internal sealed class GeneratedLevel +{ + public int Id { get; init; } + public List Grid { get; init; } = new(); + public int LowestPush { get; init; } + public int PushLimit { get; init; } +} + +internal sealed class LevelBandConfig +{ + public int StartId { get; init; } + public int EndId { get; init; } + public int BoxCountLow { get; init; } + public int BoxCountHigh { get; init; } + public int MinAllowedPushes { get; init; } + public int MinAllowedTurns { get; init; } = 0; + public int MinAllowedBranching { get; init; } = 0; + public List ShapeMasks { get; init; } = new(); + public List? ShapeMasksExpanded { get; set; } +} + +internal sealed class LevelBalanceFile +{ + public List Bands { get; set; } = new(); +} + +internal sealed class LevelBandJson +{ + public int StartId { get; set; } + public int EndId { get; set; } + public int BoxCountLow { get; set; } + public int BoxCountHigh { get; set; } + public int MinAllowedPushes { get; set; } + public int MinAllowedTurns { get; set; } + public int MinAllowedBranching { get; set; } + public int MaskTake { get; set; } = 0; +} + +internal sealed class GenerationTuning +{ + public int MaxAttemptsPerLevel { get; init; } + public int MaxMillisecondsPerLevel { get; init; } + public int PushLimitPadding { get; init; } + public double PushLimitScale { get; init; } + public int DynamicGrowthWindow { get; init; } + public int DynamicPushIncrement { get; init; } + public int ReverseSearchMaxDepth { get; init; } + public int ReverseSearchBreadth { get; init; } + public bool ApplyMaskTransforms { get; init; } + public int MaskWallJitter { get; init; } + public int PocketCarveMin { get; init; } = 0; + public int PocketCarveMax { get; init; } = 0; + public int PocketMaxRadius { get; init; } = 1; +} + +internal sealed class GridCanvas +{ + private readonly char[] _cells; + + public GridCanvas(int width, int height) + { + Width = width; + Height = height; + _cells = Enumerable.Repeat('0', width * height).ToArray(); + } + + public int Width { get; } + public int Height { get; } + + public void Fill(char c) => Array.Fill(_cells, c); + + public void Set(int x, int y, char c) + { + if (!InBounds(x, y)) return; + _cells[y * Width + x] = c; + } + + public void Set(int index, char c) + { + if (index < 0 || index >= _cells.Length) return; + _cells[index] = c; + } + + public char Get(int x, int y) => _cells[y * Width + x]; + public char Get(int index) => _cells[index]; + + public bool InBounds(int x, int y) => x >= 0 && y >= 0 && x < Width && y < Height; + + public void Overlay(IEnumerable indices, char c) + { + foreach (var idx in indices) + { + Set(idx, c); + } + } + + public void ClearDynamic() + { + for (var i = 0; i < _cells.Length; i++) + { + if (_cells[i] == '@' || _cells[i] == '$') + { + _cells[i] = '.'; + } + } + } + + public List ToLines() + { + var lines = new List(Height); + for (var y = 0; y < Height; y++) + { + lines.Add(new string(_cells, y * Width, Width)); + } + return lines; + } +} + +internal static class LayoutFactory +{ + public static GridCanvas FromMask(string[] mask, Random rng, GenerationTuning tuning) + { + var height = mask.Length; + var width = mask.Max(row => row.Length); + var canvas = new GridCanvas(width, height); + canvas.Fill('0'); + + for (var y = 0; y < height; y++) + { + var row = mask[y]; + for (var x = 0; x < row.Length; x++) + { + canvas.Set(x, y, row[x]); + } + } + + NormalizeOuterWalls(canvas); + + if (tuning.PocketCarveMax > 0) + { + AddPockets(canvas, rng, tuning); + NormalizeOuterWalls(canvas); + } + + return canvas; + } + + // Enforce: inside the bounding box of non-void tiles, edges are walls, interior voids become walls. + private static void NormalizeOuterWalls(GridCanvas canvas) + { + var w = canvas.Width; + var h = canvas.Height; + + var minX = w; + var minY = h; + var maxX = -1; + var maxY = -1; + + for (var y = 0; y < h; y++) + { + for (var x = 0; x < w; x++) + { + var c = canvas.Get(x, y); + if (c == '0') continue; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + + if (maxX < minX || maxY < minY) + { + return; // nothing to normalize + } + + for (var y = minY; y <= maxY; y++) + { + for (var x = minX; x <= maxX; x++) + { + var isEdge = x == minX || x == maxX || y == minY || y == maxY; + if (isEdge) + { + canvas.Set(x, y, '#'); + } + else if (canvas.Get(x, y) == '0') + { + canvas.Set(x, y, '#'); + } + } + } + + // Outside bounding box remains void. + } + + public static bool NormalizeOuterWallsStrict(GridCanvas canvas, bool failOnTokens) + { + var w = canvas.Width; + var h = canvas.Height; + + var minX = w; + var minY = h; + var maxX = -1; + var maxY = -1; + + for (var y = 0; y < h; y++) + { + for (var x = 0; x < w; x++) + { + var c = canvas.Get(x, y); + if (c == '0') continue; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + } + } + + if (maxX < minX || maxY < minY) + { + return false; + } + + for (var y = minY; y <= maxY; y++) + { + for (var x = minX; x <= maxX; x++) + { + var isEdge = x == minX || x == maxX || y == minY || y == maxY; + var c = canvas.Get(x, y); + if (isEdge) + { + if (failOnTokens && (c == 'G' || c == '$' || c == '@')) + { + return false; + } + canvas.Set(x, y, '#'); + } + else if (c == '0') + { + canvas.Set(x, y, '#'); + } + } + } + + return true; + } + + private static void AddPockets(GridCanvas canvas, Random rng, GenerationTuning tuning) + { + var pockets = rng.Next(tuning.PocketCarveMin, tuning.PocketCarveMax + 1); + for (var i = 0; i < pockets; i++) + { + var radius = rng.Next(1, tuning.PocketMaxRadius + 1); + var x = rng.Next(1, canvas.Width - 1); + var y = rng.Next(1, canvas.Height - 1); + for (var yy = y - radius; yy <= y + radius; yy++) + { + for (var xx = x - radius; xx <= x + radius; xx++) + { + if (!canvas.InBounds(xx, yy)) continue; + if (xx == 0 || yy == 0 || xx == canvas.Width - 1 || yy == canvas.Height - 1) continue; + var dx = xx - x; + var dy = yy - y; + if (dx * dx + dy * dy <= radius * radius) + { + if (canvas.Get(xx, yy) == '#') + { + canvas.Set(xx, yy, '.'); + } + } + } + } + } + } +} + +internal static class PiecePlacer +{ + public static bool TryPlace(GridCanvas canvas, Random rng, int boxCount, out HashSet goals, out int[] boxes, out int player) + { + goals = new HashSet(); + boxes = Array.Empty(); + player = -1; + + var candidates = Walkable(canvas).ToList(); + var minRequired = boxCount + 2; + if (candidates.Count < minRequired) + { + return false; + } + + Shuffle(candidates, rng); + + var softGoals = new List(); + foreach (var idx in candidates) + { + if (IsDeadCorner(canvas, idx)) + { + softGoals.Add(idx); + continue; + } + goals.Add(idx); + if (goals.Count == boxCount) break; + } + + if (goals.Count != boxCount) + { + foreach (var idx in softGoals) + { + goals.Add(idx); + if (goals.Count == boxCount) break; + } + } + + if (goals.Count != boxCount) return false; + + var goalSet = new HashSet(goals); + var nonGoals = candidates.Where(i => !goalSet.Contains(i)).ToList(); + Shuffle(nonGoals, rng); + + boxes = goals.ToArray(); + Array.Sort(boxes); + + if (nonGoals.Count == 0) return false; + + var reachable = FloodFrom(goalSet.First(), canvas, Array.Empty()); + if (goalSet.Any(g => !reachable.Contains(g))) return false; + + var playerOptions = nonGoals.Where(reachable.Contains).ToList(); + if (playerOptions.Count == 0) return false; + + player = playerOptions[rng.Next(playerOptions.Count)]; + return true; + } + + private static HashSet FloodFrom(int start, GridCanvas canvas, int[] boxes) + { + var visited = new HashSet(); + if (IsSolid(canvas.Get(start)) || Array.BinarySearch(boxes, start) >= 0) return visited; + + var queue = new Queue(); + visited.Add(start); + queue.Enqueue(start); + + while (queue.Count > 0) + { + var current = queue.Dequeue(); + foreach (var next in NeighborIndices(current, canvas.Width, canvas.Height)) + { + if (next < 0 || next >= canvas.Width * canvas.Height) continue; + if (visited.Contains(next)) continue; + + var tile = canvas.Get(next); + if (IsSolid(tile) || Array.BinarySearch(boxes, next) >= 0) continue; + + visited.Add(next); + queue.Enqueue(next); + } + } + + return visited; + } + + private static IEnumerable Walkable(GridCanvas canvas) + { + for (var i = 0; i < canvas.Width * canvas.Height; i++) + { + var tile = canvas.Get(i); + if (!IsSolid(tile)) + { + yield return i; + } + } + } + + private static IEnumerable NeighborIndices(int index, int width, int height) + { + var x = index % width; + var y = index / width; + + if (y > 0) yield return index - width; + if (y < height - 1) yield return index + width; + if (x > 0) yield return index - 1; + if (x < width - 1) yield return index + 1; + } + + private static bool IsDeadCorner(GridCanvas canvas, int idx) + { + var w = canvas.Width; + var h = canvas.Height; + var x = idx % w; + var y = idx / w; + + var solidNorth = y == 0 || IsSolid(canvas.Get(x, y - 1)); + var solidSouth = y == h - 1 || IsSolid(canvas.Get(x, y + 1)); + var solidWest = x == 0 || IsSolid(canvas.Get(x - 1, y)); + var solidEast = x == w - 1 || IsSolid(canvas.Get(x + 1, y)); + + var verticalBlocked = (solidNorth && solidSouth); + var horizontalBlocked = (solidWest && solidEast); + if (verticalBlocked || horizontalBlocked) return true; + + var cornerNW = solidNorth && solidWest; + var cornerNE = solidNorth && solidEast; + var cornerSW = solidSouth && solidWest; + var cornerSE = solidSouth && solidEast; + return cornerNW || cornerNE || cornerSW || cornerSE; + } + + private static bool IsSolid(char tile) => tile == '#' || tile == '0'; + + private static void Shuffle(IList list, Random rng) + { + for (var i = list.Count - 1; i > 0; i--) + { + var j = rng.Next(i + 1); + (list[i], list[j]) = (list[j], list[i]); + } + } +} + +internal sealed class Board +{ + private readonly bool[] _walls; + + private Board(int width, int height, bool[] walls) + { + Width = width; + Height = height; + _walls = walls; + } + + public int Width { get; } + public int Height { get; } + public int Size => Width * Height; + + public static Board FromCanvas(GridCanvas canvas) + { + var walls = new bool[canvas.Width * canvas.Height]; + for (var i = 0; i < walls.Length; i++) + { + var tile = canvas.Get(i); + walls[i] = tile == '#' || tile == '0'; + } + + return new Board(canvas.Width, canvas.Height, walls); + } + + public bool IsSolid(int index) => _walls[index]; +} + +internal sealed class ReverseSearch +{ + private readonly Board _board; + private readonly int _maxDepth; + private readonly int _breadth; + private readonly int[] _dirs; + + public ReverseSearch(Board board, int maxDepth, int breadth) + { + _board = board; + _maxDepth = maxDepth; + _breadth = breadth; + _dirs = new[] { -board.Width, board.Width, -1, 1 }; + } + + public ScrambledState? FindStartState(HashSet goals, int minPush, Random rng) + { + var boxes = goals.ToArray(); + Array.Sort(boxes); + + var playerStart = FirstFloorNotGoal(goals); + if (playerStart < 0) return null; + + var start = new SolverState(playerStart, boxes); + var queue = new Queue<(SolverState State, int Pushes)>(); + var visited = new HashSet(new StateComparer()) { start }; + queue.Enqueue((start, 0)); + + ScrambledState? best = null; + var bestPush = -1; + + while (queue.Count > 0 && visited.Count < _breadth) + { + var (state, pushes) = queue.Dequeue(); + if (pushes >= minPush && pushes > bestPush) + { + bestPush = pushes; + best = new ScrambledState(state.Player, state.Boxes); + } + + if (pushes >= _maxDepth) continue; + + foreach (var next in Expand(state)) + { + var nextPushes = pushes + (next.Item2 ? 1 : 0); + if (nextPushes > _maxDepth) continue; + + var nextState = next.Item1; + if (visited.Add(nextState)) + { + queue.Enqueue((nextState, nextPushes)); + } + } + } + + return best; + } + + private int FirstFloorNotGoal(HashSet goals) + { + for (var i = 0; i < _board.Size; i++) + { + if (_board.IsSolid(i)) continue; + if (goals.Contains(i)) continue; + return i; + } + return -1; + } + + // Returns (state, isPull) where isPull indicates a box move (counts as push) + private IEnumerable<(SolverState, bool)> Expand(SolverState state) + { + foreach (var dir in _dirs) + { + var step = state.Player + dir; + if (!IndexInBounds(step) || _board.IsSolid(step) || Array.BinarySearch(state.Boxes, step) >= 0) + { + // pull candidate? + var boxPos = state.Player + dir; + var behind = state.Player - dir; + if (!IndexInBounds(boxPos) || !IndexInBounds(behind)) continue; + var boxIndex = Array.BinarySearch(state.Boxes, boxPos); + if (boxIndex < 0) continue; + if (_board.IsSolid(behind) || Array.BinarySearch(state.Boxes, behind) >= 0) continue; + + var nextBoxes = state.Boxes.ToArray(); + nextBoxes[boxIndex] = state.Player; + Array.Sort(nextBoxes); + yield return (new SolverState(behind, nextBoxes), true); + continue; + } + + // player walk + yield return (new SolverState(step, state.Boxes), false); + } + } + + private bool IndexInBounds(int idx) => idx >= 0 && idx < _board.Size; +} + +internal sealed class SokobanSolver +{ + private readonly Board _board; + private readonly StateComparer _comparer = new(); + private readonly int[] _dirs; + + public SokobanSolver(Board board) + { + _board = board; + _dirs = new[] { -board.Width, board.Width, -1, 1 }; + } + + public SolveResult SolveDetailed(int player, int[] boxes, HashSet goals) + { + Array.Sort(boxes); + var start = new SolverState(player, boxes); + var visited = new HashSet(_comparer) { start }; + var parents = new Dictionary(_comparer); + var queue = new Queue(); + queue.Enqueue(start); + + while (queue.Count > 0) + { + var state = queue.Dequeue(); + if (IsSolved(state.Boxes, goals)) + { + return BuildResult(state, parents); + } + + foreach (var (next, dir) in Expand(state)) + { + if (visited.Add(next)) + { + parents[next] = (state, dir); + queue.Enqueue(next); + } + } + } + + return SolveResult.Fail; + } + + private IEnumerable<(SolverState State, int Dir)> Expand(SolverState state) + { + var reachable = ReachableWithoutPushing(state.Player, state.Boxes); + foreach (var pos in reachable) + { + foreach (var dir in _dirs) + { + var boxPos = pos + dir; + var landing = boxPos + dir; + if (!IndexInBounds(boxPos) || !IndexInBounds(landing)) continue; + + var boxIndex = Array.BinarySearch(state.Boxes, boxPos); + if (boxIndex < 0) continue; + if (_board.IsSolid(landing) || Array.BinarySearch(state.Boxes, landing) >= 0) continue; + + var nextBoxes = state.Boxes.ToArray(); + nextBoxes[boxIndex] = landing; + Array.Sort(nextBoxes); + yield return (new SolverState(boxPos, nextBoxes), dir); + } + } + } + + private SolveResult BuildResult(SolverState solved, Dictionary parents) + { + var pushes = 0; + var turns = 0; + var branching = 0; + + var path = new List<(SolverState State, int Dir)>(); + var current = solved; + while (parents.TryGetValue(current, out var entry)) + { + path.Add((current, entry.Dir)); + current = entry.Parent; + } + path.Reverse(); + + var prevDir = 0; + foreach (var (_, dir) in path) + { + pushes++; + if (prevDir != 0 && dir != prevDir) turns++; + prevDir = dir; + } + + // branching: count states along path that had more than one push option + current = solved; + while (parents.TryGetValue(current, out var entry2)) + { + var pushOptions = Expand(entry2.Parent).Count(); + if (pushOptions > 1) branching++; + current = entry2.Parent; + } + + return new SolveResult(pushes, turns, branching); + } + + private List ReachableWithoutPushing(int start, int[] boxes) + { + var visited = new bool[_board.Size]; + var queue = new Queue(); + var output = new List(); + + if (_board.IsSolid(start) || Array.BinarySearch(boxes, start) >= 0) return output; + + visited[start] = true; + queue.Enqueue(start); + output.Add(start); + + while (queue.Count > 0) + { + var current = queue.Dequeue(); + foreach (var dir in _dirs) + { + var next = current + dir; + if (!IndexInBounds(next)) continue; + if (visited[next]) continue; + if (_board.IsSolid(next) || Array.BinarySearch(boxes, next) >= 0) continue; + visited[next] = true; + queue.Enqueue(next); + output.Add(next); + } + } + + return output; + } + + private bool IsSolved(int[] boxes, HashSet goals) + { + foreach (var b in boxes) + { + if (!goals.Contains(b)) return false; + } + return true; + } + + private bool IndexInBounds(int idx) => idx >= 0 && idx < _board.Size; +} + +internal readonly record struct SolverState(int Player, int[] Boxes); + +internal readonly record struct SolveResult(int Pushes, int Turns, int Branching) +{ + public static SolveResult Fail => new(-1, -1, -1); + public bool IsFail => Pushes < 0; +} + +internal sealed class StateComparer : IEqualityComparer +{ + public bool Equals(SolverState x, SolverState y) + { + if (x.Player != y.Player) return false; + var a = x.Boxes; + var b = y.Boxes; + if (a.Length != b.Length) return false; + for (var i = 0; i < a.Length; i++) + { + if (a[i] != b[i]) return false; + } + return true; + } + + public int GetHashCode(SolverState obj) + { + var hash = obj.Player * 397 ^ obj.Boxes.Length; + unchecked + { + for (var i = 0; i < obj.Boxes.Length; i++) + { + hash = hash * 31 + obj.Boxes[i]; + } + } + return hash; + } +} + +internal sealed record ScrambledState(int Player, int[] Boxes); diff --git a/bin/Debug/net7.0/nekoban_map_gen b/bin/Debug/net7.0/nekoban_map_gen new file mode 100755 index 0000000000000000000000000000000000000000..f9bdd664c52d64249d4288589dcbe6fa0a1d99ef GIT binary patch literal 148208 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

xIe2r2Dqg7fIJBk;K6^gbI;frI!d~iP5)l|; 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 literal 0 HcmV?d00001 diff --git a/bin/Debug/net7.0/nekoban_map_gen.deps.json b/bin/Debug/net7.0/nekoban_map_gen.deps.json new file mode 100644 index 0000000..d5614b4 --- /dev/null +++ b/bin/Debug/net7.0/nekoban_map_gen.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v7.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v7.0": { + "nekoban_map_gen/1.0.0": { + "runtime": { + "nekoban_map_gen.dll": {} + } + } + } + }, + "libraries": { + "nekoban_map_gen/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/bin/Debug/net7.0/nekoban_map_gen.dll b/bin/Debug/net7.0/nekoban_map_gen.dll new file mode 100644 index 0000000000000000000000000000000000000000..5216af64b169a6b4c3174c3f5f96a27f91bb6be3 GIT binary patch literal 45568 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 Microban = new() + { + new[]{ + "0000000", + "0####00", + "0#..#00", + "0#..###", + "0#....#", + "0######", + "0000000" + }, + new[]{ + "0000000", + "0#####0", + "0#...#0", + "0#.#.#0", + "0#...#0", + "0#####0", + "0000000" + }, + new[]{ + "0000000", + "0###000", + "0#.#000", + "0#.#000", + "0#..###", + "0#####0", + "0000000" + }, + new[]{ + "00000000", + "0######0", + "0#....#0", + "0###..#0", + "000#..#0", + "000####0", + "00000000" + }, + new[]{ + "000000000", + "00#####00", + "00#...#00", + "0##...##0", + "0#.....#0", + "0##...##0", + "00#...#00", + "00#####00", + "000000000" + }, + new[]{ + "00000000", + "0######0", + "0#....#0", + "0#.####0", + "0#....#0", + "0###..#0", + "000####0", + "00000000" + }, + new[]{ + "00000000", + "0####000", + "0#..###0", + "0#....#0", + "0###..#0", + "000####0", + "00000000" + }, + new[]{ + "0000000", + "0#####0", + "0#...#0", + "0#...#0", + "0#...#0", + "0###.#0", + "000###0", + "0000000" + }, + new[]{ + "0000000", + "0####00", + "0#..#00", + "0#..###", + "0#..#.#", + "0####.#", + "000000#" + }, + new[]{ + "00000000", + "0######0", + "0#....#0", + "0#.#..#0", + "0#.#.##0", + "0#...#00", + "0#####00", + "00000000" + }, + new[]{ + "0000000", + "0#####0", + "0#...#0", + "###.###", + "0#...#0", + "0#...#0", + "0#####0" + }, + new[]{ + "0000000000", + "00#######0", + "00#.....#0", + "###.###.#0", + "0#.....#0", + "0#######0", + "000000000" + }, + // 13: 얇은 리본형 + new[]{ + "000000000", + "00####000", + "00#..###0", + "0##..#.#0", + "0#....#00", + "0##..###0", + "00####000", + "000000000" + }, + // 14: 작은 도넛 + new[]{ + "0000000", + "0#####0", + "0#...#0", + "0#.#.#0", + "0#...#0", + "0#####0", + "0000000" + }, + // 15: ㄴ자 계단형 + new[]{ + "00000000", + "0####000", + "0#..###0", + "0#....#0", + "0###..#0", + "000#..#0", + "000####0", + "00000000" + }, + // 16: 짧은 S자 복도 + new[]{ + "00000000", + "0####000", + "0#..###0", + "0#..#.#0", + "0###..#0", + "000####0", + "00000000" + }, + // 17: 코너 방 + 넓은 홀 + new[]{ + "000000000", + "00#####00", + "00#...#00", + "0##.#.##0", + "0#.....#0", + "0#.#.###0", + "0#...#000", + "0#####000", + "000000000" + }, + // 18: 긴 복도 + 옆 포켓 + new[]{ + "0000000000", + "00#######0", + "00#.....#0", + "0##.###.#0", + "0#.....#00", + "0#.#.###00", + "0#.....#00", + "0#######00", + "0000000000" + }, + // 19: 두꺼운 U자 (안쪽 공간 넓음) + new[]{ + "000000000", + "0#######0", + "0#.....#0", + "0#.....#0", + "0#.....#0", + "0#..#..#0", + "0######0", + "000000000" + }, + // 20: 작은 십자 변형 (팔 길이 짧음) + new[]{ + "000000000", + "00###0000", + "00#.#0000", + "0###.###0", + "0#.....#0", + "0###.###0", + "000#.#000", + "000###000", + "000000000" + } + }; + + public static string[] PickRandom(Random rng, List masks) + { + if (masks.Count == 0) throw new System.InvalidOperationException("No masks provided."); + return masks[rng.Next(masks.Count)]; + } + + public static List ExpandWithTransforms(IEnumerable baseMasks, bool includeScaled = true) + { + var seen = new HashSet(); + var output = new List(); + foreach (var mask in baseMasks) + { + var seeds = includeScaled ? ScaleVariants(mask) : new List { mask }; + foreach (var seed in seeds) + { + foreach (var variant in Variants(seed)) + { + var key = CanonicalKey(variant); + if (seen.Add(key)) + { + output.Add(variant); + } + } + } + } + return output; + } + + public static string[] CreateVariant(string[] mask, Random rng, bool applyTransforms, int wallJitter) + { + var candidates = applyTransforms ? Variants(mask).ToList() : new List { mask }; + var picked = candidates[rng.Next(candidates.Count)]; + + if (wallJitter <= 0) + { + return picked; + } + + var jittered = ApplyWallJitter(picked, rng, wallJitter); + return jittered; + } + + private static IEnumerable Variants(string[] mask) + { + var current = mask; + for (var i = 0; i < 4; i++) + { + yield return current; + yield return FlipHorizontal(current); + current = Rotate90(current); + } + } + + private static string[] Rotate90(string[] mask) + { + var h = mask.Length; + var w = mask.Max(r => r.Length); + var arr = new char[h, w]; + for (var y = 0; y < h; y++) + { + var row = mask[y]; + for (var x = 0; x < w; x++) + { + arr[y, x] = x < row.Length ? row[x] : '0'; + } + } + + var rotated = new string[w]; + for (var y = 0; y < w; y++) + { + var chars = new char[h]; + for (var x = 0; x < h; x++) + { + chars[x] = arr[h - 1 - x, y]; + } + rotated[y] = new string(chars); + } + return rotated; + } + + private static string[] FlipHorizontal(string[] mask) + { + return mask.Select(row => new string(row.Reverse().ToArray())).ToArray(); + } + + private static string CanonicalKey(string[] mask) => string.Join("\n", mask); + + private static string[] ApplyWallJitter(string[] mask, Random rng, int maxJitter) + { + var h = mask.Length; + var w = mask.Max(r => r.Length); + var grid = mask.Select(line => line.PadRight(w, '0').ToCharArray()).ToArray(); + + int changes = rng.Next(1, maxJitter + 1); + var candidates = new List<(int x, int y)>(); + for (var y = 0; y < h; y++) + { + for (var x = 0; x < w; x++) + { + var c = grid[y][x]; + if (c == '0') continue; + // avoid outermost void border flipping into wall + if (y == 0 || x == 0 || y == h - 1 || x == w - 1) continue; + candidates.Add((x, y)); + } + } + + Shuffle(candidates, rng); + var applied = 0; + foreach (var (x, y) in candidates) + { + if (applied >= changes) break; + var c = grid[y][x]; + if (c == '#') grid[y][x] = '.'; + else if (c == '.') grid[y][x] = '#'; + else continue; + applied++; + } + + var result = new string[h]; + for (var y = 0; y < h; y++) + { + result[y] = new string(grid[y]); + } + return result; + } + + private static void Shuffle(IList list, Random rng) + { + for (var i = list.Count - 1; i > 0; i--) + { + var j = rng.Next(i + 1); + (list[i], list[j]) = (list[j], list[i]); + } + } + + private static List ScaleVariants(string[] mask) + { + var scaled = new List(); + scaled.Add(mask); + var padded = Pad(mask, 1); + if (padded != null) scaled.Add(padded); + var trimmed = Pad(mask, -1); + if (trimmed != null) scaled.Add(trimmed); + return scaled; + } + + private static string[]? Pad(string[] mask, int delta) + { + if (delta == 0) return mask; + var h = mask.Length; + var w = mask.Max(r => r.Length); + if (delta < 0) + { + if (h + delta * 2 < 3 || w + delta * 2 < 3) return null; + var newH = h + delta * 2; + var newW = w + delta * 2; + var output = new string[newH]; + for (var y = 0; y < newH; y++) + { + var srcY = y - delta; + if (srcY < 0 || srcY >= h) + { + output[y] = new string('0', newW); + continue; + } + var row = mask[srcY]; + var src = row.Skip(delta).Take(newW).ToArray(); + if (src.Length < newW) + { + output[y] = new string(src).PadRight(newW, '0'); + } + else + { + output[y] = new string(src); + } + } + return output; + } + else + { + var newH = h + delta * 2; + var newW = w + delta * 2; + var output = new string[newH]; + for (var y = 0; y < newH; y++) + { + if (y < delta || y >= h + delta) + { + output[y] = new string('0', newW); + continue; + } + var row = mask[y - delta]; + var paddedRow = new string('0', delta) + row.PadRight(w, '0') + new string('0', delta); + if (paddedRow.Length < newW) + { + paddedRow = paddedRow.PadRight(newW, '0'); + } + output[y] = paddedRow; + } + return output; + } + } +} diff --git a/nekoban_map_gen.csproj b/nekoban_map_gen.csproj new file mode 100644 index 0000000..d439800 --- /dev/null +++ b/nekoban_map_gen.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/nekoban_map_gen.sln b/nekoban_map_gen.sln new file mode 100644 index 0000000..576e5ad --- /dev/null +++ b/nekoban_map_gen.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nekoban_map_gen", "nekoban_map_gen.csproj", "{736CD653-478C-D946-DC2C-7AC55BE19A51}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {736CD653-478C-D946-DC2C-7AC55BE19A51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {736CD653-478C-D946-DC2C-7AC55BE19A51}.Debug|Any CPU.Build.0 = Debug|Any CPU + {736CD653-478C-D946-DC2C-7AC55BE19A51}.Release|Any CPU.ActiveCfg = Release|Any CPU + {736CD653-478C-D946-DC2C-7AC55BE19A51}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1EE2C320-7A55-4F38-BAF1-71E807C9EAC5} + EndGlobalSection +EndGlobal diff --git a/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs b/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs new file mode 100644 index 0000000..d69481d --- /dev/null +++ b/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")] diff --git a/obj/Debug/net7.0/apphost b/obj/Debug/net7.0/apphost new file mode 100755 index 0000000000000000000000000000000000000000..f9bdd664c52d64249d4288589dcbe6fa0a1d99ef GIT binary patch literal 148208 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

xIe2r2Dqg7fIJBk;K6^gbI;frI!d~iP5)l|; zBLPM0WT9%R)sNR%_pVR1Fl6$sthZun;_B#dws_mEe3}yRDlVTh5>a>=R=fdE5E{Ej zG>_}m)Lxmc_Gnyfv&^=pwt%%%(O4fE1)_`VUMKsCVJXPeV>GoFD*>A$9+x4N02!4I z$a{JIIM7EoIkES-}fmME{ zdxtXXRA}KqRn!ib8j5;@0a5ydU5nc44JcSvaJ8{+(FBXvm>1GZ9(nP~6IL^7pjIrQ zQZ#B3wsv$VA>7jz3^;w>Xs6O%%)$-pPJ_z&#s!#lcc`vd)Y;-w8=TQL77?DV2&}@& zhO$JB#QZ90ZCe?Mu2kI4FsxX3VLVP~yE?p447x<4ET`hEd%CcXL@{SkTx}~c!}t26 zqQtw_m^18V;icph&2c!Sxp4<$Q3BB*h7xL+MPz+b(1&2sEa&o3U%S#03`Q{|c7{;- z$3mCW0VO@jP*N9*+<6HE!v_&_gil3HU|!@^_j~4@MPYI>#TRD`c!Cg&$Ys@fTWbxg;yho!p5>UkK%9YW18YSJl=lHA|Zs>$x|mYsUyqJVsp3fP9LE zU06J!;E`t(CH^F%#HTiVy-E0shCN#J@gA!=^fr*HB%t~2jJTq{md=1vCRy{_?g?R0 zFDhct9tp&OyVK{!f?upfX+dE}feMG#VQG-B<7McN7KaOwEajS^R(xFAs3?9cpNaaV zDs3PQVN5V<>z9XbDj0{~ZDvcaslc++yeF^Qv@LIZw<%Q6ZCYA9wYb;RZ{BEHXUflC zZ?agnn6{V-HkkLAI(jV)(LPiDxPtBG?IVtvd-HlseR&5=dn^Y`%X&?{rbDJ3=5EU_ z^Dc9rX{UKZ-XYVZ+f3_CJun+h4b_{>6B~R7%?oF2HT!&9O4r z{*Js&BQ~1WST@4hKE&~8UiE%cLqmRkaY0XhS3y^P<-!?oXlXxzEH7 zoyyo`6Jv)jk@s7kewxI`2rnXBP$lix5S~Q%X~HuIe@M8J@VwKdzJ+t7{|5-y5q?hK zZgz<9@5%ls;r}9hjPS_uQeWjfsqZYp<7yd}8F8wbc93t!zn6W6~Ul1;=m+r?*l;QUi zb`#!9cst?4i=_KAzariDHAvh>xN@NF8 zC+)vWxLT38V6wE|;FQ=$xT{6tmk94AeCAiB`wo}1Zy-F;Epanpiz@L>!c`uLzg8&y zSG7reGvOYu#2*sgy+Y#4zb4(UUn%ic!h3uY_Y?L7B;H4OX;9+QbGiR+7A3rvFbhfh zcL=X1JZ*|}Kk0gD-%fZd;g<>5g{A$eQ>FWjgs&#NpYXH5ygpf?(*2Zaq@Qqvu#fNy zg!d9Y?L6tfs$KdoC)`805tyfM8{ww~X6(Q!>Hf5@b9=@bIwW36cn9HM5%zUT`w7#f z`$?-MzL0SK4H92M_z2;}gb#K}dl%t-H%i<|_$c9f2shs>?H?!HMfe56>j}S2cq`$L z3HK8oalVZ2LBi({u3AI!B|PaCiI)-HzgFUBfO-Cmzg^%^-S;H^A>loDNqj(H#&)fj_;bQrzc2BXGi3OcKaltdU>@E= z!fd9rci$uJTL^~;ZzH^agS4MiB;9YhPvQ>3{e3<*Lr4LAKEtdZGJ}B{hgvb9x;?D`Y3Ab9M``tg4_U{nx-7N7HHfg_^@O^~c zk4pPdc4?pgxWr+?n+P8zy!mI+-szC;tG7!0A>rMG%_Y))##7RMF=6&|i8~1&-6rvS zz&yVye5I#tF{0`|pf3~!rL|AKomJ-(5pI*W@k^6qa{|?O4zvEX@-;#@@ zzAZ0G{3_vHFG*ZcDeWtFN&F+ieJ@M=8R4E+Bp&w->Hf%XB|a0FhqwI=iErT8g8I2n z;@b&tBm85+eT1JRe1Px^gbUu2{x$aw!kYVqgx@6h&4m9#I7;}RgnJ2(y;#O?2jN1( z2MF5S^82;W3_J>k0uZzB8?!rKXNC)`i?Rl@rTzfbrm;r}E& z^$#+BmP=%M>IhFD93p%H;dO++L3k742EscCYkc<;*7)8>SmXN;VJ*MdeiCODhbEPzJc&s!fwJ^e)bUlA=z&tyoK;i!p{@lNB9lGjz7xyY5X=3*7)5( zSc~sg!diU$2!BZWrvFLmJ4(2muomAs!dm>65!T`pB79PnoS zeUz}~zK3u%!kav@oArJw{og_OL&9(J_>5$1=0Bx<)f|cI2|vd1NtiD&6aHgt5AfuZ zFyA3Od9K7&CTZVBcpc%_27est%7Ik?P*9!;k3j-*woAvYi}Ws}66} z;dga-!l+dLbvk^r4*ybz59#o^`KkJr>hN7U{I(8{AD!xdi4L#R;n#KeM1=+Ft(c!Cg`1?Bih7O;Cwk26#oetls!!POZ2((2emWc0I9Ud=mqP>|WaXfvO z=DZ-=o8S(c!=A@Mk)lkER!ii-&i*4o}hH z3w7A4!{s`Bi4NE5aDxsn)nTU&uh8MJ4tMJC%{qLm4zJVUAL?+g4nM5JPw4PA9ezfK z`*gTphxh34dpi6V9sXE{KhfbYba>RMsrh}14o}eG$vQk$hcD1!yAD_CaH9?{(_yy` zhjh3@hr4z7J372xhd1i*BRc$)4)4_A7j<~I4!^6z$54$wgZUih3tpvpI*3&ZEHr@)MZIThwKnA2g#!%Tpg2y-?JpVyxU^L3c>VJ?7~ z0W%Y(2xb;cF^m<)1~V51!#Gw0GaqIF42ET_7Uoiz%V6qY>S30^G{Rf~b0y4GFiT;s zhPejjT9{=p%VDmAQDB;3oG>jgeB9-RQDHnVtuSpcUYHdyD`9*vewYAE5GDk3JxmxT z0uzOa!L-Ayg6V+igjo%9156jpjWFMYxe121@;Af$3(U7**1&ul<`$T>Fe726!(0f1 zUw0Wv{>)7Ua5c>3FpFRsU>3vlz!>@Z|8Bk_@5C?Dm(tAp6BH$NZ$j?QaAd71aeO0d zRl36)N&1F$bR*gSunuk{DH!b7Mv}Am9=XJ!4Q`wH$OhS@AJ~ukv`wyKg2XJo4?%CyrISr-aTk#;O2 z+lYz1wb?3(AIV5kG^8z#`U4p!>R;?jJYi3K*I&A)!8b6b#&o#e^=uPKg9kl8B9G%~ zIEfTzERvWR;x0;lyyC=t=^{A9u=qCjq_Bp#A6Yv`apFER9-$b98tv4?iF-{xF)<9^ zNrxnc5kD9F90~@8UefiF*^f@Dtur4?-lpPdNmkf1f!2ptsT0;T)ZONQ9Dn z=ppeoKI$6Uk%tT(;|Crx*u{@KBH*;`lhhO#$x0dKS98^`={);r~UsKP7!D}au+_K! z0YQ0=06^}_#zThV1bCa+)Gs#rr@WEd{KYG|#a}*(4gPr4w)cxixw9WHQ}*?1Tly8T zi=X!J(+++q_;z#!|6upNws#*=?#Raj#op}`yV>!A@7Y&q$G$@Q^=Y@hqV3hEo%)L0 zr!PbVp7qS?$M@TF8Q*O$0gq}Vd8fT1_Sq}(UG_?1kA2z>dlc__Ye`EifGkn`&hSc{ zz>8Y#a&Np6^muS=fQD|?@;202PX|Au7YX{>xl6m1p5YfKW=IdRA{>o{#Q85d?91fW z=Ft4|qktm8%Brvz=kEpyFyToAIJA(gC0au_Oe3}k-iRVqxKnhLp$N6$%#YqfnK%&Q6X$!A)yLnN-IN+Wl95X`QRZ~t@2V5g&*u` z7_j&ZNi8jx*{rT$Satcrxs9|e46&%!7qMDJ<%}q+ywSEClzK$m-y-zeLr!0rXb1fv zp6!iR#T&Qa!Nyz26x$LJtqOFzUs9Y(5i(9bQJ{$!74!GlA|g2`DT0_3#&f0A z#$)dd(Wxok4&X7Gt#(e1)gd)|yt&h9bMV^BHS#lOqUd2%ld~AxlC|fA13TA<)#?aV`0he2pGrK5*o-m5(s$h7fxGW>$UJ0i-pN>=Ok!&kU3reJ- zL$o)~{%z7_QIqK%$cE6eEx*qUiDVoe+52>r$Uux|$@8%iJ; zPy#sM9`?GjO_lhLSB_hwc-4z#tF2)LkEvZS;SNRvys^R|cTvOJaVMb%7x(ejW1xnl zJQ`HQOj;X$iGC_sQ=HZ8hIdpCWk2XvLlK!>7(ene)fl8^%LFRC$TZP_YONkFZ}E6r zMe)d$e%T>Vt4jLaYI{z@5Sfr64Ov$y8oM`^ORg$-3zL@Fd?w8Y^w~1TvqR2W+`(12 z{m1E6VqqU27Z;1*dD#>9HBi~JmPXY`R0#%rowPcVtD2m;xS4~tS-)tR1C?6!%0?A^ zILlpfHHEs{Vsa2iExCzRb99sgUR*YCFPXI--N(k^#-}Wzsw=T9RnvjE#y_rzw-{XE z;wMywY~w1lg@O@&zpTT9hgvK4==fXs3L}QqHMt3;0&8w+m@Z|@L98o6{5nd$*ozDI za-gpqa|ju|WOa1|+(t`n3#d=M{f{&~S6!j^UkHMo1ejH`)}8gymqRzTDG+ zn{=@>iG@6`*E>k#I>fa+YQ&QiTfZ#DIf}8!{R9s=impzph^y|M2ub%&`|zI}A2F`2 zzbyVry`Ils{mgr(U zi0&a#BGgj!aDAJC%@ATu!RZ3!SPQv6rUqOCOpGy?M!T=ggM&1w)aJohl;zjzrtA_d zMF1Fd@mmb}C$v~J^Nd^ES8lB!jp&0F{;fk?U9M>_mD@@ABoXx^_K! zR?VoafMU@@jN|#z1$sBET_)KSW8Q><%NNsfkl7;gJj4qA{fvJmbLT*7gUE=wa;}m` zG~0rM%PfVpWQ>YZa>*d=h{~C;Bcy zi_Q%V?E{D7$W*T!X>Cm+90xw?@Y#!)2dlZr%Y^P?K3~EI;g+BeH+^d32f0Qk<~NCi zW!(nh(m-CVgmMSJJQX!Lu0CPs=)iS#@u3WNE!U0Qs>g}t8>NL8XjeGqZ;?xVIm}XC zNU+?(10Oj5Y?<=UHgNuxYu~A}kEm>HIVEzbN~46|w(fP&0<>J;&OR`nS+;VNJH8oxCEH5BWX*Ud;*qXRo*Vz2kc~z@-N()W4X|ki%wuk%M$wVD)UDKM=a@M%=2a7 zT6v^2KC__;3b;b=FSSc?@2PHowUXR+4IKValCxnhw|EBX3>{_iB#TFQ4P zUD4|N1<{Ck-3q>>MX`MBPa1mJ z#Gnj|dC6a0d1sp&?(3}OxZ&E123xHEb>P!rRDKo{v9yXp$V2xB-7$Qd&0WZn1(4JLr4zBjB&*{C?l?V z&4Er#G0G6nT(!T5#EptI-P_?=zDq8(MfdNZ#?%Cd;Co_!P_GXx+p( z#jEBb&xXM7mmY^9kzlRhRymsSN=X|14$puHR;AJGb+rMy0dW`l3(!N&4pK0Nq@TWRR`B?X&1>EU zG5O@XMr9sm*aDlA4WmV_pwC@oWeeubL#M&-qgTWY@Q$=MrD<=9)83@(v8TDQrMdVt#RiwSLrzg;!9tnGTB<$&tu&2{!Pmh;9JzkFVNI24I zcBJ!Fk{*eY^bpe>rMpRI#+vTPnjUp)x<^}jYOLu|x298SOHZ>col=LL*B0D6pZzW! zu>&QcX}GJNLXBKF__7+OnzA-8Un9WT1Lc}8J1Ac;9#p;6mePS$MEIY!5W7*dy=)Q5 z;*~kekEWbynwJYr#Td9M*0jSt_%0|v3O4016y5$fSB?V_fA}Wt>qAl~@xMlt#pVEA zamcDtB~Aclqeh%d!M6W)47^1B8N#8I8mm?8LTy9WiNE8ZL|iWX1u5>k4%<8B9(_d| z78M%5oNX^PC91zg6`_8~bv_YL9R{f>Clq9wbuXvl#MV^)$Fg91xf*U&-3!DX#|Zo9 z`vp7Y%}ES5B#Pfu{EK_cEPvy7EJ1z>Hyppr%(xU$-f{LaY&r#uUl-kQ$Y*x2wD=v52-ENn&q@u;@sKEH&UhF7ym9h<;h3o1c zQ%{a{+&1FU-mOdOS9CxB(peA9Jo-l2PbbX#^p@iV-~a5w>F0fK+4^g~eX!sa`?IeX zUt4Nh(O>ejp07T7mo3`-)+>?V*X>u|YkJZ3!v4yt z(Ul)fVXuz*V?*tM%Jc57dT`5|uQpA;@$6G(f3o+ZR|50b?*6cM#QP5~n)0j8=dRj( z#p=bu8#ny+>YrSH-@dmO+&TKxSH3pwNZZwC6qSEa9lYV-Bd@=6@xteNJMDK}a+SmE z?6lum|I=@8d;gvzeN`_M-F0uHYu_VZopouzGx|^O|N8eUf4BUTOTY5K_(#vXzyHdf zf0}mpPhP(1$%Wq;yL#Q&AOC#Ht&uk){+%D~tMlFRW?#)8VpShM{fieaI`8tjR|>ED z+iSmZJ-+>K~M z_KC;;<%KhST^ldDsJX@2H~-;=GY(($&{^00`m?Xzz2vE&tcn zE0e1K+)#&fSa;u;-LWT@PP+Txd)t41-`lgNv^=@um)HDe z!kcRz{owge9(!}tGgE$4v1;FUzHe@ue&hYF!$%e$`RS~ar>Q>-Ti%|cZhG*?mG|u1 z`20g(Jip<=C!d*f_&3-6z&`gMy|rtnJ$K*a3upXj`pqlnsmFeMuM&CkTi5oT^WeE_ zm*kD?s;d9lg2?#47JTcfU;p~hJ;B#rnE&7BeKsMu``+b~UwG)Rom-AB+BEAA%@elH zi?9pde0zWX8y~$HEFbqym-W+-DXsG`AKEE1{;aXGU zXE0zeU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}X zU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}X pU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}XU@%}X@c$tL{|87KR*(Py literal 0 HcmV?d00001 diff --git a/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfo.cs b/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfo.cs new file mode 100644 index 0000000..01c8d1e --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfo.cs @@ -0,0 +1,22 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("nekoban_map_gen")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyProductAttribute("nekoban_map_gen")] +[assembly: System.Reflection.AssemblyTitleAttribute("nekoban_map_gen")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// MSBuild WriteCodeFragment 클래스에서 생성되었습니다. + diff --git a/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfoInputs.cache b/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfoInputs.cache new file mode 100644 index 0000000..9ac2862 --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +976eaa04cd48be9fbd61396f78b359e9670a79aa diff --git a/obj/Debug/net7.0/nekoban_map_gen.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net7.0/nekoban_map_gen.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..d7dbdf9 --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,11 @@ +is_global = true +build_property.TargetFramework = net7.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = nekoban_map_gen +build_property.ProjectDir = /Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/ diff --git a/obj/Debug/net7.0/nekoban_map_gen.GlobalUsings.g.cs b/obj/Debug/net7.0/nekoban_map_gen.GlobalUsings.g.cs new file mode 100644 index 0000000..8578f3d --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.GlobalUsings.g.cs @@ -0,0 +1,8 @@ +// +global using global::System; +global using global::System.Collections.Generic; +global using global::System.IO; +global using global::System.Linq; +global using global::System.Net.Http; +global using global::System.Threading; +global using global::System.Threading.Tasks; diff --git a/obj/Debug/net7.0/nekoban_map_gen.assets.cache b/obj/Debug/net7.0/nekoban_map_gen.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..2540846796aafb9eadab3d1c5bb9754f58f76783 GIT binary patch literal 161 zcmWIWc6a1qU|=|IwXEx~u+T%+D-U0$TvOSsP-VFErBJr(UiqbQd)q&<%>}9<7BB)8 wYUqa+rxq3K=O$KU=4R$(Cg$m7=@pme=k~2*0IX&psQ>@~ literal 0 HcmV?d00001 diff --git a/obj/Debug/net7.0/nekoban_map_gen.csproj.AssemblyReference.cache b/obj/Debug/net7.0/nekoban_map_gen.csproj.AssemblyReference.cache new file mode 100644 index 0000000000000000000000000000000000000000..2af78efa25a927ffa4165cf7184a97888408b173 GIT binary patch literal 73629 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 VW35~C2DJ1!txTqpD<-pI@&En22mSy6 literal 0 HcmV?d00001 diff --git a/obj/Debug/net7.0/nekoban_map_gen.csproj.CoreCompileInputs.cache b/obj/Debug/net7.0/nekoban_map_gen.csproj.CoreCompileInputs.cache new file mode 100644 index 0000000..99f441e --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +7886d3225e6b0aa6234a1c3da555a0a6b7dccd0b diff --git a/obj/Debug/net7.0/nekoban_map_gen.csproj.FileListAbsolute.txt b/obj/Debug/net7.0/nekoban_map_gen.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..9ea25e7 --- /dev/null +++ b/obj/Debug/net7.0/nekoban_map_gen.csproj.FileListAbsolute.txt @@ -0,0 +1,15 @@ +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.csproj.AssemblyReference.cache +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.GeneratedMSBuildEditorConfig.editorconfig +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfoInputs.cache +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.AssemblyInfo.cs +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.csproj.CoreCompileInputs.cache +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/bin/Debug/net7.0/nekoban_map_gen +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/bin/Debug/net7.0/nekoban_map_gen.deps.json +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/bin/Debug/net7.0/nekoban_map_gen.runtimeconfig.json +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/bin/Debug/net7.0/nekoban_map_gen.dll +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/bin/Debug/net7.0/nekoban_map_gen.pdb +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.dll +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/refint/nekoban_map_gen.dll +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.pdb +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/nekoban_map_gen.genruntimeconfig.cache +/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/Debug/net7.0/ref/nekoban_map_gen.dll diff --git a/obj/Debug/net7.0/nekoban_map_gen.dll b/obj/Debug/net7.0/nekoban_map_gen.dll new file mode 100644 index 0000000000000000000000000000000000000000..5216af64b169a6b4c3174c3f5f96a27f91bb6be3 GIT binary patch literal 45568 zcmeFadwg5fu`fP*OWN9!Y}s3~Ehn~PIWI)yI8F%Qgb$Y})CQ`^~CHf3Fw&HGk4%aw72k>F*;<%W~ZeU_RUny<~pHUBO zyn?7w{x4oN$pZMRh2Aq5IY4xckCDUw3@QUF@hnlt;YELsju%W9DI4^%68V;a^o{}0 z{htOvne-L?DgBERZEVTqb6sGHZ3lo@_h~9x7XrPE{jf?-`zlmm|ktj&hHfh9+T{{cvrqp77OtZS@eMfo*cglZ``v%^@RbHHUIw_2-+wxWr?slI%oK*+~GQB>AV+ zq3&C#3)K$g5p}^}ehL?onT_IF*2d1Xvxt&lIeDg6Na>V7b}AT@v;v6=cp>T~$D2I{ ztf()Uiue)5gACMQw8I1jfRO1}rC#J(k6TPOv#de#ch2QQ4n` z^5FDuy;1J?n{AL`kn|d%0dzY!{gyW>BECa45UO*FY^gH$^uPV>Z*PR`X1}cq{84n* z2~9I#nMo;{dmELbW5AbE-y;MSj91eW-=h%Y>{E_sxY!}D+ig>KJ7h|?5^!%aXn8F0 zd5LFzHHSoP%e*HTbZrpKo4S_0&d^>s++o6+qlBV3Zeh$TaoKi>jYSq;=KBh&HT8uisgt>iSa z9j{~IKVNnR1ZH^~Tay9D=U7=pN-!}K0D}`-7ln-fkT>dg{L^26Vc>WjuLX|n*wa7n zzxH^q3|wp0w@H7n=5z9r#~2ohT)4a`mW*^=>>h?b?VrDKh6D~4GmL9xFmrQNhaW? zWH3qAv{^YsUB8()5dw$_s%!Pq!x$Ehz5H{y2HBe-%iM(-T}nsIoUa2mgnaJM!hwN=seX#?c~{TxBphhzKQ$S*m?*~LNJ@j zHpJ~X$8N56{QlVbmat=6L)=De{UIZ1#Mo7kieRWvKYtRmX6FIGb{oFJ2qaAH2tDMP0)qhhF?FO}r@0*AZ^%xJ`kpyB1V zQ+caXaZ}WBoW@CDN1bSMNHH5*?nsUUy9Mkjr>el7bVt%m`W+t(@e!I?0L{~Hz(fom zs;MbXL=`wut0r2VtU;tX)wWZ8s~ZW`s9o(;b2n<7n(04vtY{3O5SvB@5{*fJqJdsR z=42G(c^1YMokVP87oxS;`e1TCc@VrZ<3eVcRc>OInf~k|?xxSQ6k^$k`0Qfv;2K1} zV1$qjT9}^_@?YVYiME=w99Ns$ko*?3^h`Hn2^eIB{8fiMn9a83R~f*p7JiuxK2I2w z=(J@a1H#Wrua90uEFuFUFT?F+NJwUR+c&{eQyi_9#^kfbnB)>Q#Zl4AP0V>6CX(f; z-LP)lte{`6hrAp`h?8c2Re9Tm9QVwR`lJ|h+b8ok>c<3byOQfW0nd64&YD>On5M9b zRbW0gI|wh1UdPHK;{@+Yo@qM4TRBEO3AiSya(Oa=@J#aTzAoeNJP$kJ=5bQhDUl!P)I_6gyT$mZ zXI7aLwLI$zh9i8~@Q4$I;f^+Zjp;-^>u-%#HMV+$gJpJ|`dN|mW~+SGb& zV#62{3m$isJt>uIbKjBcxSUclUMo3zKMNKmwX@W)6o>6L;TMPPpeV1;y(ia(zaIl9 zY0saoJ%6rNW|%wz=$>5bb4`5xM}0I?Dvi%A(n`+KO18-LeSGwO-P@^^sczQk=&V=K zd3b1FEyA(fr{r3j`&YS+%e|nLxS?=R==!4%y&F%z*Gd8&6_pKg9iN*i*Sg#ixz^{D zT*DY;g`t1HZhh{sQTvF{V<%f-=wFq>Snh-3N6nXiG8otE?y1Rl^kDqpNw-~VaXtMZ z?WCLJ+K{_Xu45-%QS1AS-&eKP@5!|;_wRD8&ndbg_gAe|>K`7a?s%#}uhscroW2(G z18zGI^YuC#jUCUTiLSO|M7lP2l3d5-&X8+So1*J;UBYk3T`bqJ9UsBQlW)1?{vd|+ zHpFXtd=77_&Fh-W%$i#xM&dM3NdwztZ123}4`MTUI#^{1+)-KO_AYE@yn#G+OSo|g z?80q^+61fxa>#la?EDIdPZ{Bo1X@T&eSuxr1(k}uQWWD7zL`o!Eo>`lXO)?;TO!<{!91@ra45rutIth=u!}Ordu@$(}UPt zC2(VxEVHM3s*;w?dwHw5($4ZVdk!S9TZ22X|7yjZD06q6Db9#atvX~?fzGdk)RYnC z^8IL%H)qMH_l+FU8)PEM?hwipV`yQiAQ{`Cup9 zvZqSQ5*MH(+sU=)4cdi!1Z>l=_47{SJuKgiUou4LCcb0B{mrf5z&8%<;s^?wycywL zXvp7OMc8dJnShs)>YkGFxYfeVVHS59R(1*ifxx|i#dq04V1IA%jk6H#Oe8gdO|q4p zt_f^=Onr1N(;jDQ3?Z6TGz-zMzdR!-MmcJjIl112o zZY;|pxJBS>#n_QWSb`Cc}nz<<$q(ll5xdn`E0yd1<2912Kvme?pu@F_}5X(1SaoV{kU%ON@goaulbNL@ncf3x_(JAp|Ssj?(dY<>W+8A6`Jd!GyvN z8k#ZFqJUd9ZGEBc4|WA5OHf25$i_%5jzry1QQpb0^h{* zy-$Sf+!7x9@nBNhuP}Y#+}$8}_0jeqhq|UA5nB1nxfsiWV|%mBQpTOi?qN2TgQ~=1 zjPd;tt6x)8e;un2<*(vmtP)On_Deuk+?$N9@U~Ncb;MYuI8{oQV zCDyTiaCvdF8&Az`gmtN?h@_X=L*IohoJRB6i1!h zli)f|0=0tCh&jYl*okC&n5=W^q~iW!#f1flV<9m$KM6{vc(V1}<`l=tP7p-*isvV@ zEBVyJqG)~FrEr2@_w{t}X4F{OUMSM6m0)dS57tB*oQAo-|I6S0rY1U^Je*z=>xu5rWYs)oxvF9?3BnZA1extJrL$DUk_3nAq zgP!fz`$P z0o9jh-UtPn{Q=z*mCh4Y@M#c-&#Yj5DCUppfyegCl7K%qwoa~PYJv3V_0gl3M@tfr zU3>02y-r$^i-eJc4r~%6J=j_=Hfz>~b$SW4R6>>g0}h-qqh#O1Il6t7dxq{KY+cw9 zIJ>JlWMFMDljBT0iil7aSu8l+6HCfL-o+qj+5~e5>y>xfL@alLfPtY@3_-wvXB9&b zFrZ#B1X*R~cR<-Ni|f^s^&)_kkRV_nAQeLpFyKwa5Cn{BmmvrkH7-LCFk&u45HPT) zDIJ1OVI=6}-=-*E69}^`)$QeqnAZVz; zWe5TWl8KTK1dK+PAqW_8mmvrkO)f(aFpzna4ne>`#!?JH=A$2sl-PwZR|0~d1_DAc z1OWrls~CcSag56l1Pm;bN%p;FC(T9nMwFvi7czB>>(J(ea)&|cy-yLv* z>?h$+RmW2^tJ0(7uFJSbr&2qhTk_s9?X<%c-85~gF1=~mB~Vf8t(jHjQSHnKp~07mQHAH9u3fhW8B=~ z!IL>6Oh$)lg2|cK!?I7Tn;P3&!UcS?9A6`^l)2@2Zh=N(>u`iG6}ZE=vmAwu{4C)# z=!Ey-M=?KtDce~SN>1e+5;x%2j#QWYFv_#L0Ms@TrK;CZ`I4oMf1%e$k3ug-3wq_* z-Fj$}XLsv>9I}24lk~GYE>Q>jek;Ej{4yKI&Df+^R8yXuM`qwwezN4l6E+)uHu5yboa)9?@hG&qaWcfK8{1_}c<;kE9GC?d!c9`QI4*UN zve< zN_fiX+c6}DwlD+;&wlyl+2!L|u$m&V_3D8z(>zx+&5!Hs^-*8jSJ*`XpjO*WjG7$p zS)IQ5IT+^4#g5fH0lU8OxX+V$Cl88!u0j>D>T&W4Os4gi;XcQ^9!W3Qp@#ugpw=(3(y0ehXQi%B?lgZNF~ilY;{2={t(XLAwX zO8a?k@=SdDkc79K^G(2wHnucQ{wHWPNWT1ske$|qy$K|gOS|Kn^$PIUp?#RJ;X#r0D6b#@EkxvkI8qm zR$>TXdIk0z*sCV-KpcHV=I7_>R(acR(APY&e-N*EsKN1@ST~Z}{n?M9Azs80$8%>u!rgbM zGqEgP`xo^t6TegRHu{8jim=!6PP+*7>x$mU1L+yw#24>yHg z=CRJjL7-#W0i-ofCekrpaJ>P3n?*|2jVw(hVJ><1iQC)|pY zz)pD6b^;sa0fa9Wtw<*My^T&d4x5Ee^dAR@otU0JrpoyRq>WD5MyGruM9HbZzPWKy ziywPzi4Mu{XYu%}{w;(X|IfZVa!JW1|9JQmoBR{_;v1gL9>#W_xqM|d%u8S=X_*Ox zwzYxZ8}MQ#5Mh40{#RLl!?m#0;BDyy?3^XA$}GRlos*pw#^83Hig|lm9+>_kwREWJ z7Vlc|Xo)ie@8Q`P&yDImg(YZ@|4J-B5yh~)jW538IeZy^Ehv5`k+;59`pzjah21%& zw))N~<6?IX&xII5NcR1C%vmH4tf7*af|g24rYC`{jCW`F1s2SUX1gkCx8Z3VMNGey z!1S^5w_r@l^A9rmaiCM|>?d%UiU_l7@}C5ny%m6}qP}XZp$FOWK=wA49J(Da8W_5R zFIXPEvup$e4pMk0!5N?5P>WiTKmr+vFGvtp{viO~W#WvC`zzC0^1ZJOYYQ*XfduBJ zl|||eM$41yake>*QM||!bizY-0-x@w!2qn|B~WWICGVOD*YMD%Sh^AcTPaQrc==ol9!#JLOE(@c7iOzN={;M*mZ z%Z@+{CVL(?|}NX&dxiWl1f#o@0XVhY-N>XUgCX&qIxp zkUNRV4-T@ExgCx%FCBumIQPk`f-8azn}m=##JW}VSSosO>@B>zxRd$20dZ@Ty$4rn zL)35x-3tP5j77W>7QV!_=%1Xu@hySZPJD!Es}1Wi$AmZWVbEF3Q=HHz7vY&jJy0Ej zwhF<3yt&HJD|x;FcW?X(WSp^hk?j-c0Bpf< zTkwS%@5^ZQ%PQyd;QSr}7@Xbk0|sYAoW^S@_|&B0pe9sPmj4Vim*aIcj4f`=?`Kna zT26#vNVC!nW$kC#T5#YjUN)284rD*aEPlx_ki`uE@5g3gJN0>>ZudEeuyTduoqy@fC#aXovSE!w$~Ycv&E~ z2FLH&F9M%x##Ce)9y{o!Uo3_a_ScP2D95y}oG9uMEVScMbgGbzxeGE04YfE%^#7o)7!RIPV zbq_j_Q`y8d(>B0=a2q>%0bhK>3)#mjoWNLMFwalYw(@c3z zht(T-=V;?{TftR_jSI5f2aU^}7-Iw)#^vFH7W4|M`TLB^H%i4m^}b@Smx}FsU$H-z zieY82LJ{Lo4IEG!3~J1gHH%}8G-ypbq(_WBS~}(`64>FQJ#t0~_fSbQ9vMd!7_FMm4S8fZ-GC{!i*MR&#C#!{8;js8%#Fo-(d?G*#@P2?g$&OVmXK*72pB9Y3_*?- z|9Cck^t^=0|3UH3do<2Vi6_whVae%B?C1|pPRL7Rk`uCq1nSwQr=`Md4&VzvP|ksc z?J9!yNwj1pkVmcT*MN?RPVV%WpjG*cyRP%s38rUI9L75NUc#fk7lwYIz2%XV;$b&Zi|Re%Xg9U7r4!6N?6am_rbo(DRfky%aJESXQqmy%ildsH zv1VFJem|}wOCVAl{|O#BDu;NY37ZIce_dWwpXQdh*FwmgiKiuqNPKBVUK-CrYjE1O zf<42hvnh$MgFC#E+p=UH;WmbFsN|SKTpqOWx+$E4j~5>cpQMHVPE4L%GtI0P9b}qA zIBD_@uLi(_q&2uCH!_zQ!z-8@6UmrcMVIkwftC`eJ-R@U1y~I>AgniJVjm_gD0;j+ z7rCj1gP$9kHa`C}I&_Iks+@l!%s#fzr^Z9a)tW=xW$FBJA=oUw2qyhC@_i=0k2nM6 z!`v+kx)a}q9T=GJ;WDz8+bMV%ZlBDBxFY?q(7&bPz}>cNtSaby9EqYq9f9Y^?{zcz^tDgN8q zhK&HVjWYN(fDA5I%w7b(iE;KN@NUN01rlR# za`==C>=qR0fz1Hb^AmSg)GY0DIi7#w9@>hvc$56!S{XMkAOv*}uF3U0g4=+ZLrlv# z%y6&J4COcs>mSAq$23Z2cqyWCdk>{w1mvt(41&q()KO!dW8@boPit zSzC!inbZztfAZX%Ug(eVCwI5#Pj1~5f4;5#xgDHg?vwcK-NXFW$MPz#^#j#@+l<&( z^MT6`%WDB1)Usq*+Z&iQZRHRZN3tX)jXA_e219cJhB1pd#|`4r_GbvAP*_9Exq0{^ zK=3ZT5LelTm_y83H+(Um(qj%Wp7c5EFUY#wIBKVKA~#{as^DgXIb zyqZ=e0U}|~t(Js6lh?H1ut4XLMer6#G47dBb9y~d|0-j@> z!%XJDZ_(S*+;J(_RdZk$P_$Wxxz>a>r%0Pz9<&<&+M=?DnJl9>@LIqhq2@KbtN}T7 z?odr;jE|nx`PE`fj2VUcNExW@=iKAR)Y*?&6pmF#l`L+hdVuf3b!C!rE_X}utGW9 z82+%RW9UwgFS4{~lS3PGh*cJ*M~Me}}Iv#Jj4U1M&yoiWrXDY%J_afqN!XYl?*x6)WDr1C} zf^$!2zQmGdAF56ufNFwo*kxtEs=ah#CIan%<@ZNGUCS2+8|AHo0VC zF?kJE5KJsyPk3In7GhM*E1m+yc_nj0=GE_E3(qSaVmWyPKEgPUhRmzKKw=s#TzlF= zLw+rRu0uHwmXP#C4m>zgKC|>=?tjA%@Qa z4^oABp9ce9$((D9`#eGV9iT-&13Z=5tGKNTgIxMq(X-WL{E*0`1b;igoYy0F*I4x9 z0KMDzNpe|aht*H*u6Vggv zJa9l@k67}c!8#8*uh&`hvdAQ*cYSCpLO%&SjCOm&Ec0Dy{TY#&25ZCg>H4djFg+8w z%Bi8HqV4$LW$5ps2*bB(xz^86H$t}>tY>dMbN>1nCvg^Pcp#F~&Vw2mL%wgC2$w zi%8Jrp=YX(FHoD|H>NmxD(M^O$ML{1$3UGclm`(o0_x|Odkav4uWo?)GBhthNkk-1 z$4D%|x4k*!Dk&&sVSbtoYNVXYB7Ck1>ewJtb-aTE^+|`RdcrOV)R~Cf1&}*ks4b#% zCT*7XelM-hrkqg!CiP|$wn?ZrBf#}$6DBpNoucJLx?HGF!oUS|5?w_$%3ee3kI{U( zUZ_vhGSyDEi)2zH7t!a1dQ|LOL=TatsgiDi2N%#18YK_3V8H`*8a*e}OK{x+*!(Oj_6hW>%E#=P^lo@R;8Ru40G=2AroCpQ-}|WDL<8ZM z0K33xqVH9G4{%A~CxE@N*8$%WnH9dbfY)0rf1b^-!pHEBQhJAQ4hiQ%Kl4rD{8%`j z^*?4Cl<+ZJ=zkZG>l#wmAg*f=*ENXiA_j%Sbq(4i8lIJQZ&y$_m->E-RvwpDE*3Z_ zrELPA^RxXyvE&!R`KicE5;(Kw4=BAr_=|-zt>(WE;~XD21kOh)xGyaV#>_wyDgK;@ z1-wN#)1;M~{9L+T@OK4%P3$a|oA)w8{=de~ zfSv~fXF!A73hP&`>_O`meMoFrivC)(0MMXiwTv$UG-#c{a1mNRnug1&&W8SBK#a0T zwwfDC+BzS&YRezm3`tYq2>iOhHwAjd4+()dmnzZO_dYr=27i_@ zBswnxyi4@FW^&!X3hs!uI)RG?ZWf3iO9`xwV-nJpwHuJ*4O(BIzJS`f0`)Mc%L){i zeY8Mvj=e{yTj)oXkD=^qESQGc`71siFe?0asc4_96gj8m^rSK43q zjN+-}pr*d**%q8gyEOH(Hy4~lS8D22?rHvDebUQL}vNQd0}PR|Z??EKRNV-X5Gm z7br?R(Mlt_?Dncp2V3bXO?|rRK~OiANY12tbs76?CVgI0Q@sYLM>WMhn?+yKR1jse z=o^}1pB+cv(UenffclZ9*k`lpfTkYAo2Rqs=bB=l9Z&CRs=wL*_1~IepPfMFNy^v1 zt1&=@G{rtUk)oO+=sc0?HI)sFQX5Uy)TNlGZ8Tj`;+HvevMyUwIZAVAiKa4@+k$gw zm8Qm_Y%ZOxspC;LmpV0d16n_cwrJ|!@@>JBs9#f82ObN~qaB*MJ@6!`-I{8uAElG& zYE8{SWSvYO)zp^|*YoLCO}&7)o=YR#EI)y%`sS7K%1y7+zH1!vFx1FBQR5i-l z=~+#!tZBmTAi%DzYuOkp5j$VP_O~O~2Muld~wX{Q1w_^8w7QLvcE2?wBvuHAJ*^obSveupO%E(p)OQ2P&=z_^Q-`XK4{fE_ zG&Ld89@EH&Splw|9$O(eTI6N2x|r9#A(^ zT&U-0MPL+>v0PIXHB@#BZ4&BdMn#RU?Bnz?p{}G~#X@DDp!*aBtEEoJx7fkIhZ*=MPHE$jT5u_Dl3_5eLDl-h%Ro}MmHuZ2EOKM`uT{ZMRa z*@N^mRVHKmApM7?cx)e}|I!qX?L+i8P4U=1M0N+ar+WKE>JUox_KS3%P~6+o%f3Vp zYsv%a5&EXC$7A~_1nnBrWzY8lsi;6h-9XuXdRLeEYFY9>by=!z zCaAyYvL8ivmVKR0Ifq*~XiTVDLQm7FLaF{eO>2cxmOV}933WO0&Shm!Q@5t37?+hj zLp>$+o~0cn^`52OTJmYSs_a?%aEat|bW4fkbMz@KIURm^j_xZd`vyIv%gT*&L*JnN zn%W5Jd3w1ZY0x+6S3)T-eT#mhDfZI0Xxe(|ZQ!->qo8If%3v>ji{|Ju_R_a#nJ)WS z^ro^G=x$B1mtLUH38hBm1$s`G@u<8=&ufa?dy)7FFT5-5y-1fUO4@soKCH{Qy%*^d zx{TX)^ohvOE+}^h-cfM+G_W0Y%zD<`XO4|Dl?bc=7 z-goE*UH0?Hy=C8}pK6NR`yTzfP^!J}k@o`C0=M@vE!Gsb_cA@Sk;`^dy~$-S2z4-U z#rTKIUZz(RC9S_gKhb5}`YZH~E}Iv9vh4eGVv6vmV({O988nD9Arn7D$oQYCD=SU9 zl#jS@kIj58_0TX%y|gFd@>S`P(3QVlB%iKxH7H4L+0|gubson5wVL6#A?aGuEiJxW z#hh8N#H1>*=b+&A0p>Gq(Bop^eGcPi<0S2W4qXfX&uIIf+hfpD>Ekk-#vv<-$F8bp zpENb_xG2sZ;T&FS5c3Tx${Q4hw@qEEbbQ(8xN{euGc@U1i3f$N7%0lPqkMNApN0l% z_!p4(Rhu~dd{V~!0U39$>jA&0S=q@w^56``<(o7lcFx7AqCurGQ|!A3k7`|cw_hh9 z5=^>Aw9No?#}0=(+((Hbw%mY)#ZrHWIjTk0V2I78*y%ZnZt9G2tc2*1x~(4!HvpkbHj$FoBCDlEMy)v54* zT=OoB4*rW_o@;HTQK4-3pV`m7c)8;6UZf?W*2wrOT){0e*8c@q`e)G165$H|UUGt} z`!Vs-#o~uzEk1E`>zCp#kFQ7PSK(x%8mA34cw!vGefW615jdW9;$z`6h|h%-$GLnQ zyf}WlA`V_0ye9CPz-t1p3A`roCPI25coU%wr#1Loh-X9-@!5&b1bhbZxe!kPcxT}N zTKI1120TeQ7O)a01Ptd0Tp)0{z%>Hb3rqo8(6^zg8oP=ORdsZb?!X%HbK_L2DVHu5P6ix{ zGE%pPK3O+Pp9H58cWOVX!ybg5s{AGm=u(#Kq50l`(Sy1b#-*ZX0GvkPY~eoRiMr#B zJ&^A)_8Aw~=ZtHB-(cKttf&~J`wcsG3pjjtdJXY?=>2HxGsewY{>9kisP)nMAA&!} zdCRz6_-sk5c@J=l9spbhoNc&AYh<^;@6W*lfo5rQV zR*zwPx&8#t_l$J;$(|n@=Lc7N4jP+dn*o1bw;lX!dB5lT()w$n=f}n?ky|_t^xR-L z#;+>yJIuysy_FO&)&*_{|0(Bo&(EQ!5^Fy9@jc_Qz;@65hNs~H&s#D^zmz`yPD+0# zeQz@USa-VjFT(kg(HdUw{S&->ftUT(?H!<7YZ{Fv<409}UT!Pr^`dnik;ltF>@71m zW~vO1fqLV+^$gp~zwO;;e7Wvz?_}e&@#b>J9e##1X=@RJ)2XjjK^RZkHLNM35*-t z>6!9L!k;9ZDFPP>XOZAb1a=9hOYpS7D+Jyv@P1=FeJH%&;C}5l9;S=JPmBE1Qu?gG zgHn1>O5c>yH--PUK*Qv^hRJn3rr2qUodTPrv`I=QN$DivPZ794N*74!A}L)Y{3QZY zQks&|E-CF2ez!Ru--1mGzFTB=i_GOBbGh&@H-8JOt`K~m$m|oDyM=$R@b?RUzwnmoEzs~tPd(C8!F~9Fr>g@^f;S0&lHgN3uhMOSDN?$?!yaBB`~@Pj zNbn_6x>4|yhOD_u@U&=1i_C~{c5BEomkWM{l8RlQHRRH#1wSD0 zpoYwUQ*iQ1A2npYM{uu~eI6IQNkcB3BzU{P1sXDck>Du}nbRfsh``+%GJmh&`!r4{FF9@`;@qGAAy0lZMP`7kq(+%-JY-N<-$12)-yo9D==;QIwXAoxMSDIl!}SSBubli(W#9}&1$;Hbd;f${W_@BzUO3Qj@M5M+K_ z@OFU<@I>_Lz(&DSf{zHkTkySt?-P7f@cn`x5d5Ive14D2782V8ZxXy+@CAZz6g(yP zh~Rq#jtV>=kjhw3TwuGvjRHpm9uP?7EVH1T+e!&MsPHgzb_=A6?ez0Rqwa5r;7r0U2h~n39X}iFU0!IYy6*wyJfIx~(geNH`+60da z-Y#&Xa5f4)BKU~ldj*aPJRop#EqkfGmixH4c08R_u~G05fqMlW5J=-b$B`g#@i?xv zQScFgdxW!B@KJ%!2M;CB zs6eV0O9ZwH+$eBF;9h~F0;xeH1-1*^C~!pJUV)zVVglnzug{>K`IUg7*l^$&rc?`8Nx)d9eNyzWSV z_4HOUoFnl5a>n-tehzrDwEG>gXRw0#;{;}Eeg!-oVa^nXVUI|DG{*QzA~R2FmEs#k z^P^Jhw(9pFxl8(DO0BT;<&%|v0RQ8atpAbNp8-qdUmC~X-Y*~T1H54zw{;}`n_9fq zqWLF}i)!4YI-KknxWD(1i8ok%z$XBj_{9f5@Him9tMGk~uEG-)O5GH4Ybf6M4N;Hv>mS_8Wb zIup>OwXn{h4nPx6vF89k8_=Y4U?bk{0_5K%IvMx|KofT*rvN_>(4_NWqd^w{n$!s! z4cZ9E|Bl!a;F|zV+_{_zyc^J@EwIs~t+3IgU9iri55X>zMqrUiH^3GH=PPT0e-ySD zbQ7S7r<~^izZ1~JlgstM_X6U?61LziEJl`ViT;bh081GF9Re^D>sJCp_d1A2AOhCFujj)XL-a53 z_igax=kVUE$EY>Z##P3{MuT~Rxxid+?lP}5CwM;Oxzh6k&+DGIJZrqe-Y<9`_de(S zgV*o-vF~TTU;6&yyTE$NdeM5r`k9sV&-GvIzuf;zzsEk#_KxsLWa;0bO8Et%0_zrg zm7HbbrS`(#E%x1Va$U;%lzkP>lMk=^@KJcDh`w5!XpWOpO$&3;j|}0*JhYJ=Dli8t zF%FgRa3y>ffmfo^b^~35b6CRIU*kE4mf(JN5AL5|HhSec#q7loht<<+^IAG!UXM>N zKDW_S&$;;AOQ(81PnUSM)AgQS(AT5>>$KB*knZ-r3;Oqv{V#kBW2g5V@c)QU40tcD z<8ZCRrvaZy_;eb#;ymPl2~*}R>dE${=TD}2efSq37iM>)^Yf4I?3~$3XJ!Xd18MwI z8}sJR>FjLn1hO=j?OmD5Z=b(OGv;@7b}r83`+HJ57xkp_d68oAnKM~_b*h_16~XM; z%w3tv^f6lq<{r;nw>d5m2A7;5t@dR4mt}LAOR{|fsU9vDHkY5s6^Z4ThdH z7YdIH+qiH+e}B);b5cD$r)35P(m56o{^6Djvm>{2bx*2G)SxaancX?F)M601bgFA> zY7-h`KheC5zIF}fa_PPSP3_RvQk4)siaFrU&$FiGOZoYeX5!4yE?sP8QJ(juT z!ok#lmRK{G9u&z%*`A(s*FYxQ$MsmGCo`~fQMR`~l}qP@r!)^_nOc_0Z(W-nVE&3s zUan`RQ{89u_3U)%fpjmM)!W&*G}8y??SyRKz;Ux^-atlm9H?|0*PYx|T;b*I;+JkA zxl^-f>0n>i##wZBs%J3WG1!l;&7#xOJB41I%H%*UUz`!+Q@Nc?p=~JZ&g59_aWt<# zD-j87RXVd}>!xgOd0%&?3vr5ez|9Y&`&o20%{x1l%cS}Sqy!{efXk-rj@3%X@icGA zj{a0%H&+G00=R5SZ_R)Q9VZkT23D+hq7Y~{EyD`3s0Kt2G$Q<1LEB;T2=x3pV{3z4 zne85g8&P%!t=)+Z^tLQN18Ze>x@RDT^=;n#E?U%+PURNw>`V1#x?G{+K<8UdP4}g9 zDB6-9=v>}Sd39lGkqX3>slL>fba%&A1Z+1X=FRWv?9B9K1~RFh0+Z#J^l>pOP*_@M zE?GN}$_?nU0evtsTi_zjUOwr;jXIJ(%CR zBGa205EuNNa`;*T?1)}0%%%Fe5WHKCth_SQx1gsddvUt^?+78^FUk(~4J^aNI#R_7 z)XopEl}DDHnZ78U%cs{ONV~Q!>FLSj(_PuV z?)>U>ZUtKHIno#iE3qkR$jD zG5hmJve|9OQAdau$L0Mb)FOOD#o}x_QmHH}5@-mB{ANs&qqN*HnCm+VyJ*n+2q?$F z$7iOxGlNIbu#EHaz>!uJ;`_)Vo!D4nd0$s9-ODTI5nXn}6M=YSp;mEfE_?C7)^m`+ zk0w+)=&2n?C^<7N*@K6W=C#i6>|B)XLtGCCV-s^#LetrY7G_hqZtC157k6o=&Vd{@ z4RmUHfS1-q_$S3BE3QoE^T@y?`;#+MeLy*>y7@p7RDs}`jv7=K+Hl*_gt?j};=#JiWBV7-qX>oef;Fc}v+(Lwc^ir{9eaI;s z+ZYzk4JdNn{F$Add8s^a{&6n4q<2%gyF1;DT$0Od8iZ!vL!qBJS!~f%Nl`)QEFRyda-XqjNhuG6SVLurJD`uz`~fti%=+E-hB-NaYYgOW~IE z#o65UVu9PxvJ86GSLC~`@K~OWOpeXtk%i0qIF+P$XPN4GUn$I)&6zEOux^Z!Gt-;b zrZ%SscAkm7PQIvIc7aQJWXi9Cy(LA;-J<8rbWduBU?t_Q(W`UVKy?iib-E6QDf|!F z7Yml>-K}kr=W3A+a^KEkfsR|@4`eoFco$tPUAR+1?Lyvl(~>@QQ|=*{%8yF{|M zT@kqwa%E~@tLtjXV5^zIJ{e<%-o{AnqZV{-QX3tqDtjC3s*ye}=53C$A>Fs-XsX>! z&XKwcC7r!`BZNbf?51r9vHV~zy%woB)0IJvU$P_JHONy88K7%BnG?U8@EbYl=bE~ogr)I%XTj&+oRp+>T%x$$hZs~5x^wJracC`JM^x^%= zB+!oBj=6O(oyKg_q@AVM^An6r3&I+f=LPLcZ_i>ChG+Uax1{@8x_h`=07w8^kn5y2 z-!O`LK~!MU>P**mEV?}X1a2$56d`KD_jrLFX~En44FPrd>D(*FX*%^ zfDZe@Y)E6(lv`Qu&Dz2K{%j6w#*!Uf*xzE{a1V{lkm)|7pHn#)#S%TAI*`0tPRm17 zueW{OLLuy!xpsS|-)#)*>V@RasRc+Ne7{JGwgRlqq`T5`kdeb=;@@_Vl{}rJO?*^> zYjyxDFtU-{jN#5co$Jr`@cO32)jlAHd#uIS*e}ZFaH|PT5Rlx6Lj~&W(#H$LHp@z% z(?L_Zjn?BnhIQB(2whw_ogqvCbxwoZK^c0rhO2>*{kIwrh4QfzOkocdQmis!NiLU# z`TFbxtETIgS&S4`?ZI)?x0Dh}GF24sYpVAGLJJh3||Pr4apjNm&||+}Wkr+LFbY z)Rw+%ejwA8mqF)^cwWX_VJosJm7o-m)-C;g~RUH-#hftv1{SEIK@`Sx!9vOdjXXn7yOkSn6e0K9d3*UMyK8e^mSynr~C5QdgHV=14Ktg$;>@$#-Aa{RdrZyVWmNZ zjU9wyX>kmSa-2K!SXwfD11qru$EMi5TUwUxLCQwwaVnXo!j@2Ny20q~R!ano<-;uZ z7?Sw>6~~eA7S35wJ)chZtw`;}eo9%ZYGEl=ch+L};XL@ED>Z=qQhyp3?oaW6w~uc; z2k4AV+pz3lo5`!s(FTv_H%b=sIZA#YhpjW;^~sp8#q~%J7jh!za0_mdA=H!JJV4ld zp2_$6Vu!lzS6h#*as)uwd+0)rcRAZqohnevaYTriLXa-UQKab6lUUy;r}H=;RHuPx znDIqe{RUj8sv7E8l-nqr9!NV!J66C(s&Jotw603Z%5;@>`2&^#eZcz9D0{yJ;D1x4 z9xroOgIQD!_ufI@^=!+Nsp#vPjAUJI55T zxp=%p*kNS*GDyZuEa=-wywle$FKGskwUrJBXEfni3n_PL-I_f(`TeSo@u718M8P=!%D{{Eh?TM@B zXdI;tdZLH7l|< zZMy%7&#K32WX;OsZcTMnykaD%)=EdFRE}}g(^7q2X$E zU9)8DmG_D*xR!|r;RR)#;_6m}>)NMysIR%D?YLZ3yQo>kqub}A?XJh%(J6Y&wX)Ps zuE+l=9@laGAhx5Ail=0RH~n0^HIzc`>BGA3$=#yCsmK&6n8;`kB8 zxeOPyXvrQ(W>9kr=uMF6LN0S_aTePQ-XLTKba@}NOnnzLe3VE!#&QTlzW_q966f`8rVzVcrHao=|+8SKZEvD zXbE*2&c!vSEn;65`v{*+iiibh`~} zArPrrR4dEJvH@2bc8Kw6Cv7^bP2ekCoHaLu zOG;VNEw%mCk&!12XSKd|@b%dO9XZeEH_e7HY*+#%Fvo_?whf(8vXAqZRY%qsVO6Ni zZg44QJt{E8ooNV%O(g|eQG;!Q0(1#tQL^~bz+5v*6@JKYYy2PDuBbE&W=uf;R|0y2 zC>!suuxT8`!!?abs>PW9S0sk6t&8v@j)dTM=#kL)Cv|gz)`Ho54)ojHSD0) z5-ck8SO^;{YTzG4w$XM5#@hA-ypU(|(7p~5U1F}qosUwLUk|RhTaQwsf1J%Wp)CP0 z2v$o6Fp{Rpj`P@+aIWhPb_)BJZ4TQWi#%cc*?t+ihHyQPS7doZBoT?jE^$g^a%5yT zdjl>r!<8J0y=Ej~qwA3bPYu(Df3Pif(_wF8yIU0y8$j) z99b4QFS5ev5Sef|lF$~gV@wl`nCKF#u69N~$*R;vjJ}bFl=Y*x<>jy#p2geOVa&Rf z2G7=@)rzkYPr$C+urXJA5qP4+u9bM+&1LQg^6Z#k1cL<`ohGD$P9K8%wGt#E4l_T7 z4908sL=qv)23IToVRKvJ?hY7f$4yM{%BUgpn`e!V9z+h06we`;>c@=rqXdb~_Tlwb z41?dxPQfIXiyu=J^U4nUgK%J*Onx)cHr`*$k;Q*9$Jl)cV*YFJ*QtV%A}&*M5r3sy zs>DrmhQBIuDL1AfRmMgEHFrfX&pF+IWHsBuk29kW(mf<)E)F1e*}R>K7<+GHV7A|`4;6(R@?=vruvs|BTlSTdr7xZpaN z$7&Js`+ZPmo3runv7KXEk&?9mO`$7OEkHOGP=*KMw`7WvqB)vlBT@2U;bbQ<)xaqnlOalFeyDEXxWmWtd(nvP zCu{|r-HwN_uM+vl`F^CM$oY};)oQ4gAcmNP4IT)}RIyF0S&^;E@yOC_;Rq{*av}Bz zyb1!`oZ?+$KXgjxhn#;4&b410ivI1T>94Qx;(ceNR*%)-GcEjYyK97Lg}oLMt;dSY z#%H6uuvX(Dq@}j0RsBVKIy>=bm9hf`2bT5Dp!z6+!ay+8J4H+Ch@p z&Ln=vmM=c6L+BR1C@&&5XFbU90vuT`;%cjd@ns1c@~DUG4lhFmmYLQt@?B(kWVUv7 zFfPqUCd)nm7pzqXxr7}e);z+gHtdfZjU)Ks3v8xkI6{gRTy~P&YFUv96VXxCEnOaI zby<;CEG6YyrF%8mJ-pguLkoy>8UW5N!8U+Akv8^7WH$FF(#9)11_^Ee!EEG1Fc3hM zlF%v}>`J?gu=;X#LtXw_nCObML78BfbV?1ccBY3{0ZdD59t z;Gc5tFl)}qrTSNuydHqpwee<~0Xe@+-;)jekn*Y}9e6UIUeMp)tlvX8`JxkBTA?6Z zRd^9he>sESv$DBH91{2`k&46Le4wB~K6zIR|Ly{snTdZk0{`LP$N*mm{2RvxjW0Py zO&<2TJ$czS7AkrFAbHrg0%)p1O=HRrdj_js>K8R*UcpI@dF5Wp$Gjp?T7EpTnItth zO#SJ6hcCxSk2v3P>Vq+Rw)4+Nb(rNi9M4|763?45_>uw`f#rR8M*{E4bhFqB`R%R` z6l297qz$GOtuTuyFzhNN7h8DU5f2VkGS;?BEp!M!v!(y?zx?=hWUO4xjSk{->9hFU z=axzb<$FiRfb|~A-YY3%smh|LU}vsfy!PN9A6|XqyRR<%+!x;pe)%KMU<xI14YW z4A3<)We3?S|f7ij74 z-b8DcEtqxu38dS->s{S0`WC+Arx$F$Xy0b@#c`jq+Mg>LyMgg|kuJqnl*kd`b>19a zo01oHdh=bFEopg&h->@}Uzlqzt@{7)|KEAQlo*W@jo|0q@Eucpp>xci%n5w|^+-O8 zjf|0HLdkDEqKKoMjzbC!F zKBQ)x(xq^sQ>2uCgL- zc)G7E%kLkbJn^iKrPJFc#_^oGuRFzGD?NGQ&UAj_Df7#N<-vI={a$+l7g%wny1R&IqPq+B7E9FFHI^i5 zq9*nlqtO_R8jXn>OWH4{C#IXI@Au5T3s)q0-sk=A<>Q$<-D|dn0Dst}op8%{{Zg^4;zqtQ8}uga<1cnZi%!sJd=?46u6$la|WK*@%#qQ-kh_6Tw-(aT!m*{f1HhI z$C)mKv#TML&slJL&OAdoYX|BC+R}luyPzInoE_{au@j*4;S%f9Nn)iS2WSWAsR)Vn zjFi|W&>7H0(8r)Vpu3=-K!1W*7m4XXzMw{+AW#S>0@M=}1xf;CfQEs_fX0DJL6bl> z&@9mNpcSC?pxvN@pcA08pbtRTL7#!X0o?=L2T5He<_@X{Y61!dg@PhMy+JXcfuO;l zXFxfi@gOs3GROg%16mAP3EBvH6|@_45Oe}`7W4t=I_NXdH=ui<`yiK zx`Kv+MuLo>BG5w6YoNWLqo8*{n(h)C1X>J=?IE!vJta20x5TpgK+iO_#Gk}Y^+SFA zQ6Fdt=uOaJ&`HoaP@@6RIVb^Si6SP6eHA6KA3?s+GL~W__ABUWti)Q!Nh}Q1OQC2y zqiMPP=byxqQEs?Gxp)#4C}hEN%KwWxDpBq)QBGos@zkKivg2hk;As$P|0zhVOwLU4 zoJ{~#fb4>wv)R@4aJHyAUW-*giT#Xr|Ew+}u}7-7E13hx=#wC^h9WNG7S(Z4Nv%L) z%l{Ag5C0GOKPA?xvKs0jjnjUT9dcFSFBI&85={_)RlyoyvPCZ`SPKlZ$P5bB0p}v# zQNgajg^0HX=~2HPnEr-<+<-k4Og7M6g~?VE_CbCZ#D^)^7q}c6K7lil@F;Wto>a8r~YgS<*5zZvjY#0wPM z9GK!63T^@XH{$sUZVBv%x}H*SFmM%cTVQY0-wK%ihN>{7WGc8d@<}%8uMf(%QOYL+ z`vQk3_y(8=hXT_CxT)lK1fGWY8U=>~&qUm&;LgCU!MjJnU4i=ouTXF|;5gtZz<#K| z2QdA8sb#Dlb{;2gh-81@7$yHZlyPET#K$Q(4*67<5mX=LBJ-t$>_vXp5~+zQ+_)Yru+~Uru_CQO!=WI zO!>6tob^$Dm%&rxB@&sAZ{&r@N_ zH>$>qY|&U1rnQ={Do_05YGISAJdQwYyb6lDfxR9TnJ3-l*&_n5pWdZ zwDt)X15;aMdn~{u3jZK9O1KQTG4f_B`4fT3ju$Jq9GL7d%_S;73HT7=ixpe}{FaEz z`ICX)0j9ZTMfoYf^fwO=!ggS1dxRap&h`jb0z2CyTm^g-{8T65>AVY2mADr|w!g!iL7jmM`-{z2d? zh*Nu%e+c*{;$(ZL10PZ9PgG&*e-vm2@{cO{G)HFE!n0I32Klp9_@RPNfIklL)e3$a znC2qwWphyel&b!@D*PMr3BQMYU&JF7d=8lGxD%fT-U1w@CXob z!XE$|fR};@Uk09pIIU;GSAc08^Fi~0KUDb1UO6$@T3VwEkbhOlC;co`VVaN6gPi#^ zKNhJl)j>8woxendDSx%9KB|9>Dxd0GtHM-%oeER_dKISp4Ju6e8&#O{UsAP4^KFv~ zy94h~VbU4lkJ0~V#L0fX27FD?2iaS~bYDetxjkqn@C}u|b|cM+NuD=UnB;j=g(-iJ z3RC_GoL|)ZZ>z8$@=vNT@t>-NPpdGk!Lus-I`9W7d5QmWEqqmlNuFyeOyzH=FwNml zYT?@|9FF<hxa&+ed<8#5yp z78h|Y&Vjg761*D(Z#Hrz_ATNr?0ckZ*mFqHvMhu;mW$9$q`0$T%z(H%n}v|GeMrI0oG3q9)ER?xoB$BV9SG7j z3|D%n?GaLSBE^+$M>@PLgq-b1F77=Mx`>h*b`g16F{V29Bg(k4pOC9(!x6eMx@>i4 z?<3uV)ko;b+9LE~G>^R5X@ov39icC~fRcW!CBk}a9OP-q1_}v75ptY|soldUsS#2! z_7_TGj~8WVM8F|Z6f2mC}zJ(1$inuvD)ztmGt)Z;JesW0kjAnIrAWg$8BNMdgx?jp)KXZy2|S;uk^ zy0Q@n^~{Kn`awi%M-qFg3wsK24NF3(Ws?!Q30-+B8l!!Svt+Po*j?o6SiGpS^FtV2nxAg$1( zUexR+TET5P6%;2T+27HMUc)a$&9VmQ`E5JSo((^XR&K+Ve1)CyWua~M4x!dnP+?0)nZ#LvXo5WXI}9%19SJAULh*!(G6 z-$2X0j6067e>@AIlobJb)*-4Te5*W)K4WoPt$5#9;Z zvN;KN0^M0f!kwmC_B%p%_GQAIW?J@H;+kIih|w|~#k zqYF!N4TY8nW-PXvDUFEVLSMAV)H4&P&c?7OTN*#k16qmuIAh*<#GgG$LxDz))IRXrgpeZUG(> zjb^I}g5lFgfyb4YO_NKCtu-kYm1hNb^PAD@`++1Qc zSn-@_vY6KCt2kf zdIXG0%21%BaH0{)DIROeXE|m=aqc*L%F4_ji?yV*++fWe$Ho~f<5&*b%qT;o)L`$Y3d8g^;3<)KtvITS|%{eo47?T&C4nDz|H9rG%2xSqXfw81Gu>=zcl8m*=v3!Ar&=yv1C`2aJnO7pUaSSU`#E`@rELK)X zfq+>UIx&6><5OB@6f%eM#one)_ucU&*~J)g;rr@tg^(0=!D&&7F_1D9P-$f-J% z^07WKZECUGh}74vzvp{!yw&UF!K2GgEjk+i=Ki1;CVV;g$hh;9=H3eTh*{zB>9DH( zufCMZVz)#|CCOVWBd(?=SKOL#d)@aHvl0^*Tz)v}R^P9DKiwX+#^tnk+OcSJtj>Mm zp5|L#DLVb9HR)*1xWi9J+@8R+LoJy8zF5&vZ6Wj-K0X}Ub&D&>Ei0no&<-s&Su1>s zjRhrGL8FTdrK2(Ld}!8=E;L~sm@C3_E&5K3yEY0A=^51GeO>VAdOxo^G_h!3$XC|B zAL@r^UwSG1L$A+JYN0Pagy*AjA4MYD zR@*k)F5CW~9XIL^m=}9sbl|?;o(G?;h_o*mF>wF6ZAX6JnbzOOw$?j5d{F$5*b=ib zy0kRxX($C#x!**z6&`J|7>jZWE26D1MLA_yDNodI_Xv7n+4bjrb1pn{(|)zEm8tNR z4#zgHc0Ba`^{1lv_TgbWAGN40va{Oc;;|)9R#*@;WNKlr%6X?Ae6IWbe47tb?q*cB z^;r33i>z->UOHr)_xeajC$e0S5-0!MlA=;rGjm60QrGbA;Sn9XghzJi64@)fONVZG zIS~;Nk-fU+<@C(W?cSxUu}5CdvAGcuU3+%z+NDd+++IDp_Q=c0#cVFlFEhY8#WKDKAKE?qm1?bbQ6 zGX(CO*CV&5F|TJtwV2fvbf#~~6qgki8ggLO3&o~w~jtv<*>Hb6txN4PAD(L+08J+9qi2OH>$kG4G z5m|RtUH+}AE{|2kUMfm6<(f;#jEBc&!uFPi=M@&hDg3R~wb^voJD0QPt7cs%rW|z~ z4Go(!n^A78 z(V>rCrp89+&Aqdw<@l7X{jbD)w)T$~YIw3t#a$x9GqCNOtfq-rZ8GEd8}I#(7@wQ0 z-B8~BXzWUtyjABK_0ra69Bj-tS>Wj?Z1++t&eFY4hnUQ7U2mihoH=96Ld%(t!-_0$ zgkZsxVg}8jgVdF`PL`akzv|t%^pquCjy zd`#Kcu~^4S;iYGeuA#y~J1%Qdnrr6}v3Pp;+1a6kcO) z_B!h6?5!_nPVE0Es%qAy2cO)M%ysa}8r^?)6fXTZb1$9pg?7}+^esn*AIf?D>)CZM zBo`HxS!qovZ5?>O=n#wI?DB}A(NRZ|Zo6a4VJ=f)M{4&1>D|7lp9j$IuY#~bF zDQiByKoZ`c{n66McJIbl@tpF?#o-&O3s+m7kQ39sr;_KsPpfyW)#kXF-O|_Rx||E?eqooIS03d}@BQ;4i52qeEB7{+`KIl>JW$$TxYW{F z(qzalF0tU;W1;11H5+oR&PH}DZ8nP&3QtH;*{2DP z8^qT8>Gjtxe7+`e?ZgQEtd^J9j6a$>`Dz^dae4H-N9$mpZ=89!0}1+k*v4A zobt`g>vhzS08c=1jfB@CcY4^Wn72rT-#q#(nvfKn^u~(#MWw4Z^{b--IDffDi?hqx zJ3TJbTAaC2v;Oj@@1#~;ur?YU*3MK1BOLeKf+5hCQ|bn@!{(8uN3H18;MSJ!({{A% z6JvV)NJ1UFLtu-u%s3XBMFpwY9mpOj-G8y(HXBJlu+6B%(B0oe%~&_H$G%p^?sZjE zQc~!Y{ik1|W)Pc{I_-nNp;Mz4kNx)a>C3mDu8WPteoW<#7Jsnp=PBZw$`;L}#-{!~*1uA}Y~VJ2 z?!Nc3iSH>)32+b%SP;>c;?4@kwGkV)QHQ_F8geoG>qW^`?Uwlr_uXl)#WBR-9M1B7 zPaUBqzQ29?mmdeLjIKJ~;QYR@_}dDDd`?gt)bLnbFwoZS9MsGaqxTW>VS~%&S?4m+ z_Z_{G>R9$-dY#O&vORvZ&moo-C*LzYY;r$o-K%XQ>hmVfW&3!0Pgs_ZrY#b?g1he) zTi18{r5*Stx6_{032sV*$?0UoaOSs=ISP-#Ek~hA(afMvb8b?@lOOF^W!Zfp`9S|I zXEXlZZLFJB7WU_?Js*)akN@8AlP(p7QA?7)%TIf`WOdy$; z=t9S7$FX5`Rv@?OH>KWYYIC>k@1wKs4N9Bo216Z1a{ z`W}9-!Ik)`t}e5FK4tx^PUa_;QU6`%z9sIAnEUDN-#ni@qxtp!wdoq|ToIT6s_tgd z9aFX8vdlYnR4k3}UG{2*WF~Jq@Yym;_PJ>_4JYGtMz>;_xFf=mPEpWb9rf3UFYCFB zZ!~JKHEO}l_`t)BjS z^%gu;(_)6H6s7ALmYCchUZswDbw2ri-xpc(>(BL=u;Wg^{@T3qh}hn~eVJsu^!ybc z-@(2yZ|+_$<_eXM?RUDB5N`9_rZ;R;cE}w-^HCyP1%`L ztASd(@ZG^T1Xn`O=dWMgF+U~$i?}1jW16jRH>*s|XS9}=m8EO))SH(~qjo+{pqnr(Gk(4N1jrSu#BTng#q9b5Uy z-OmiqJiT3Ay7mFL^SRHKQwu$Q-NmNAxgc(7`MRVZ9OunB!fetpZdbH8)TroqfK z;z)`6K1I)c&kn*jFgVlReWj%HfnF(9x4QfoG}=|I=S-t{qAAyyQDQ1~PO(*0%kze&g@2f1D-BXvi~~YYxpydtV%0_#Fv& zw$I9oedBLOt(~*DB4o1v^v9Xut4?w%!uEZT*p>dd-MFeGzE#qj=l*$P$bg`%$2l^U zUOgshZdTb^WK8TXyq=f)WG2S!jZWK_kkr*J z?XTue9$d}hIPDzQ?D2uZg_sxYBdRqquyEmW6ur?Ni%H<=0FPGCut(CT*Sns%x8jegB=p zFxWU&xta)%Ggcx0 z5y6z4DlR6}tNaV^M#rd=Uw#qcc+ep&epcd4(}f*l!~dm*RQhP5Tzo*Gh%l$DVlT(V9foNbkCOPkmBkG8M+jxK(ZHO*)> z;3FG@(&oItwz#{J*zv&?tvxoRCvALw{SW@9XAOUn@d^K zaaE^N-v9gZ_`6RuDj)ikMmO(a=c!TstO@1gkN-Gmd#le+d^h*pJtvoPP$7RCE{|EU zYnJe##TLU@r|(o6HUDd>3GTMn2W1M)sp*( zp*a)t+yZK3#w#wvG`APTZ60zq?CfNHP%XYB+-=r)cwwF9e@{#g!dw$?tQ;`#;Nsus z4)!_tMJ=Xe+;5soN~?7wFWF?nl@Hi@&Wg?lzaL+|EM?K#6ACihz3;RrPUX~Q9%z_o z$jmjHN}a3Nd&3KL-q~s)$)W{-ue|tD1kSM@fHj=Wf~H?m_C*UrnZl z9XXzxaOm~Bo11t`)uu#IH{`lzc(c`{^%d>f0yOD{{Ek}sGPo>i#NrF6}xeEU}jw$Cw=lGK+k2;+u=fFR%hG9icuQ31P@DpVHzlyQOe?9Gf z>PvT5{<vzFNED*b!0$SaOscahiN2jwsKmIqn z#p&Tsd+n^aQx0wxk}~jqR?>>!cOJ=jq2)LK$u6&V|I>44(YEv3wU|*it(HN%=Uv+U z#xGyA`cKyQ;@pzF8b7(sIj`TS^P5wSY@AWndeHoTBK-5yZVvv>I?_vx#hDi8uwPD0 zJW5rJiQAqyc=_VQL!aN!hq$K=`_C$#n0vo}93{?-TQ6=H@$l;XxYgIJA!FZOn)IKw z4C@xrE0(^;GL}C7tUf3A*yz8CB)ZqxWA7WIwtZ{5 zz0s=V=e0|tm!Ej2=!Z$0oLg{pX^32$YbrH3`+Z^2sXwWe#9uG@J$%17_T@uA?(t1{ zVQOuOYxwZNT3$)HbM}6=>G-d-=DRLjGxgxv#R=&V$9L752v=NZd#lPWakl{yTX+^{h_!5=v{iK`!{~NxPy*ndkeF6 zfBQJs<5$FiR?QabkV|D~RQ_uS0I1^0}Y3Va3-Yzb^YIyUzBW z*mJF6O&p}sKd&}l`bk`~#I-K5AJ58I=)4qutU*h7jb?^Vf8I`fZ*|(7-}%{l=`RIz z4LafX^ImnUDr?)J&8*+({-Mu;cWzD08WJ_*y{>mZ=zYm)cSJMz6tt|+V1DxQqFHvM z@5pF{gk>BXHvG@%)epROygc-y7S6WD;UYyW&{%wNsMuJ2;a!#FcpfcCS{r| za9g#FhG5M2sa*$u*D!JM|H6)4ULEf|XxB6}gubK{P9NHgEi5TlxWD#E{f*kqbG@=I zF=9{Dmb}llY6e-I&O>c(S=e#!Z@fTF_B-0LOtUy6VOgtR%GdkM8Ty2lL=plv*6P# z)u(2TZ!#WHx8}zW-?F_$-_%!*U0?U;)?w$BGCqr`;Yg*gC@SJD>>2hcEe0QZ@siy1 zN2$A}7N6O??}uomrKb&rWyT?8rPVjf2M_cU?X0K7-|V$at@`YECw2R%4?7Im={-*=T;r;E`Yl>deN2rw8MSh9 zllWQp4!Y;O)8%hfLDel~`k7BJQ?)7Wzt-?^mg3sPjVn^OuzQY!iUL3dBe@#;Gp}+$w zwqee1hbbfW)9oX>Y0bIL|LOcjFMaBkLj9W_^8?%}&_+s{eCsO%4w=TL!*&sfZTKr|lut zb$fY@&)~q&q>ax$`eJdjw--NAymp`V9r$V`F>ZV3rNCGHyCkjEO|rk(<=|0e52erM zl_o}?Z}~2j{B?WUFZpkjM;+wNK5O~j>m!=e_pWUpYB_5l>G5MB7yRZT%!9R-hBjba zs?fZ{=D1s_m5AzWCk27K!jzSY6EuHjp^ z@~v<1t#9+KS2U7G0JptHUro2&fT%4cy^aM-_$oSnyu$G<@laRBwD=~w39r47N;n%N z>6^%T_?9%j!c6bKFuBQju96;KtY;DUWgoo;BUecdlJst@9$p1Q-*)FzZGB3C4!9gh zmQeiQ6~8G2_D$zZDrybv!*~FGKOz}h2s&D?%LvcDtQO9Hr7hu=$ad|e$KZG(;` zOZtvft%NLB&f4G${dl#6y?t+cunsXDiiN54(E*bJzrtv*!I+0h__fGmdT^8K)u_pz z2HuOb2UWPSrV{I{F$T#X4=<6Cn&IsyqCbj;Fe#ujU(#8Ts)vmm8N}F$-&o-bOe|bX zMR#Tl06(T_L$TyEkTn9MFFjS$svm1A%6ds9LJB8#lZ=?6QaO4@0!R}=#2gH)pIvJ# zFrB>>A=Lxxtv3i(%_RJ;BCZ98?uT;Q4sN^69ea4?U2bp8?J3-DlkDpyhr48tk?g)Y z$64<9m^*Ip%1EiwMXDSmRZinoeo~b_fa~2j=lyx9)D8OQ_90MtfK*QiFXkMki8~9C z@WW17Wfe&pnr0XxsLXwU2d~cuVYo0yJqDnw+&&UD1k*(IqY=RGQS?v^SgiT)}HlR*1K# zg=_}aZ3ju;fU5Ll!(6d;+EajOf*(Y?DRYGy!775G)RA2EL>Gt^;(DVDmRSQ$1%3%6 z;iuUFYEu$Hb&LMfQbfnm3%#eDBCBO&R~v<44r> zxCBi!6?&G1pApf#g-uclV4-`-?Ljc=F=}@)svB)i%TY5Sfp_Ikk-e2Ba@!ZMDcl|* z*;aA;7;ay|9XZ@FOR^u79494v7O&Fts&HO4gjZGZ>0|lyMN-v%Y5H$c)fBBK-bch; z-I?v2MyItc#Wdw{7zs>y`~Z+_ol`OxCG>#g3DiI`Vb=Rfu+Saxt3=jbLXe=rZw;O0 zp%dy8%EzgbF)B*3Y($lQwaQGGs`n{6ve98C zu+9yMzc!4&RuGE$Hb$(TOEAjZ9wThlP439&l}&kNmefJAZij#S~o8k3zu z%vWl|$HRz9w%-Fdw;yI5F$1{Gf#$@X*-%VMrQR?}kGD2Kk?zn+DfY1n9ruyC1#tRJ zSAwtBJqYQxd!Cv&@oUWPw$)k>HipJXwC+K36Km9!esAW=;_y2)s?9bN8!HweniM;& zj)kJf)G6oYJdieLXXi2{eKUqPbBO_|-f3H7Cl#A%NWGCdY=5dfERgI8CW$9)*2?~@ zDNoYDtmlip+uJ)+Sc4|qUas@t9#Vg9+s5rXxcx47_)7Louncw|lJN*+Y@=8ji4>2H zgBA0Ip>rCRslls)hSFSZEkVWjA!r2a<%y{nqrohC%vbP|^rTfxN+<}uQ)XWaTIDbd zTGod4@jMCdgh<5>f@Pp`G+=p@Qf;YJ8X6@rK4TM~Rmtc4!{@d|GnLz=DxEa_ zsx;%iG;^*rr>8VG3)afEMw<5{)6FmA^UHKtS@XB^Z2Wke+gsH!6UiiC|Ak(gR`=ag zxO=qBq_XPy*VuQYCmB*VmIM*nT+FuWt`Ad#tALuXIv*aJw@6=TKiKS zWIR}u)7l4jlyPQf<=LI=1-EAabFv9qNh9YBQ)(V2IJEX*-R1O=O3z0sl8+LSYwV*G z$wv#xHTKbp~l-tb{n&$RA?CmrXCZ&fa zrQCQrMxe*z6%7|C8Y)oQDHQE%?S%?|k-}f3@E42rwf5pLx&9Ktr?rUVvmnr76MA4S?&j zG_=NI;OlVvMsUMb7r#yxzF2#)f|U);m$n9Bghk*|2EW0N4Huo@-q|`{UrLrddc&2# zc7U2-`^kQ~*Hi~TEl94xWlB#COtcAdxG*n0JVw;1htZ0Wdf_a(0R86ngQ!HfBe0}x zVNGCuh23`3sOp4&gP$g=w=l3&pOd0=u)zk|Pm>Q_a=XI26^E|obYgKDXmLt~JtCDs zQQqWBBi00hb>=zTwwK%B!+T107s<8*-UrS`oPLsR@7jI!!V`o}p3 z+kk{#iU6Y59E2V_6+vpx$4^CGk`Y5Fj!4i^E#N#n!RwNYHGoSa;drXgfxKQeQVOci zO|Gm(6GP3G1SbN&Zq`XPQhBP+YW*dBAa-j=;Z#vTwWo`YHI>}43DDrdaj(gd=SM+b zoQ7F}tldVL5{kmkkD%mzk z4u9^L&K*a&$uZt`4le}aj$RlY+$S_ptbx+QZj#=YTq$3AkAxpiq3&3fN}j(| z4<||m;Nn9}ST}})OR5y#MqU-RmEe_*<&y`C<%Xk7%_*ii)$LRh&d7>}#KaVVCVv?C z7~Bt9>`mi2(-`Cw7z>)6NO2k3n~Vb*pp@|Jj?m0lZhH~8WZdq}?TOsJoI4hA$6m?) zKgkg+IX;pqJ4yBhlD)q)(%ze1@Pq3B$1rpsezhw(j~H@VO&#bU+=60oBWvuBm=le4 zIAR9TwS~BT!|@(NDlEC;{-JZi6&L3OahoCz$3B`0cXFoCC1S=-#H9hS_9ek+z=t&r z82#9?r;EMXHRB*(XB8E472G`wM{B$hg<9}pz4ffECee$|CXLDEc4LjmsEdOGVnPlt z7O7{6n)Id&@6g6%Aifb=7Nuzu#F{Cxda=HE?}H}3A?ZfU!CtsJDdM&bq~prHe0p2S zb}E4D?1kK3DA_kkj#$YtS?Acn9Xq5-cd0U6sv0R(-IS&mxZ}EnSAHZ_-NP+jAWgnS z(7rgGCDHK!hS-PM7Q3=$nqwt8y86(=WFw%4F<7{ez_JvI@5Vwgf|TdH+r*5;3(m+Q z7vi8RH4vlVMlYsms!4VyjSGL*jZMUUt?_W9!=!SC!gVGNZcqsvb-K}PXry7s;VuaE zVMeyZ+_J5r;~}?)>d0+>iaQb{`yt8UAvsDU+n*X-<%~dIB-`tBHyKXb%Mguip3Zhi zZ~Gw+Epx|7gaR4bif88n{zf zkm>;EWpRL{6M09T%8h&)x4p&fuH2r)?F+d540ptEhnYJza>oaf{b2wnH>HW=dM9yh z<+usC{%@|Wg1{Z=_~uFXN}PqEE~;MR_*r(Z9QTBKCa^yeg(FMm|uJ z>_#ay2B#g_NudrA$d~Rlv$V@ldh4Mp^NfJNDB*>lVBuvL$}1##$;x_NI7Ok{{tCCB zkZd;E5!!P{gyhJQDjVo3<2n7C%c~@*^0ZVHiamWG79y`409`%iZVC?qYH(xWxZ{&D zu__hdCgHZgr2_WYhm96marcy+Mt8WKiINpZRFC?u9&Yeuc@$hUZtutKa28&~?Uz*9 zR#W*pO_^qu#;_nfJ69IqvZW;~EP90{DaN#VB-f${uPlRf&^iW@7BQAgeKv#)7EbiK z$4v&tTMrYX8Z8|3eVHp=F?z9{Vpx3GaOGASovg9m*xKr;tb{xWmPibcJP5vtFck*b zR5WTW8xs$Fbc`=SGkOI`OCHKcaobDW4)=44WM2;}>1e?n9l4{6EFQaM2Hr4ilHA>Ld?1El z_46I-LN{|Yt>Cy&pOk}YUEwQo7raR;anZ7 zz%?i>E9j%HT>|emg7_q)^PmMgBW{(&sl$!BR8LA12M#wfKhe@~v`w3ctqSW|I`*7a zo&n-)BUA!euxsNMr9SrChWYaFdpDQ&#e0bVkOGxh+6I>NTaGWey1ns%<`>&)a&2`LEpDT7@cX>TY zy=7b2tn!yI3=VUz{2f~a-nm69N(OiZSLN@$=$PzY`6n{r3E=$00^|~uf>&Bq{@IJ3 zUX_2w(bK2$zBr(}SN200$BiD584b1F#d!?1a_CQMSepTfU_~} zhXrEwH)L%E=2E8b0Mz`Ws9k<~Hs#VleB@}`CD}en3qub6p8*HmC16-;6o5I>kTze8 zyK*%Ft0hz-R*wi=EP1}TswF0NG5gRShtNLgk#Euc9K}ryPT1jCB%8mYU@ zVe+KW!L1l?odt`P(GId=tgHWu5!;Nu*8ZcnzNR957oNTTNyKh(B?k>8z zs<~C2qyeEIfC7S`%cv->VhB3w_#B6YjAA3GBMWqNP!}`mG{(n_u30`=K1OA}z3(#* z9)q*|;aK5*wZFah+2@>n&OP_sd%Nhp>K=*^Q546EFA_b1Z~i0&Umi*@*Draro<3Fe zOw%K3$1_a>W0^u?($0_C=0qZ8=5qOBV%SR9Q@KPYm+0EnpP0y}t=77_>ZNYzzHXu& zDoXL@a~||+o26!|QEfyUps9AW?>mU^B#s0Q7Wi8`?S>@n=Wm+9!JWY;LPNI_HOPO# zw@V!t+JU&cSS}I0rNUK)zsf|l;BD|*6xP3zoFpKN1Ad?11>-@fW?e^S~ zL>;X~>rfGjqZa_6ketNu9r`4QhFa}{oq|sKP=dfdn{k9bNknM1t!y5S+$SpIKn|%3 zN9dD8y&?Kn@h><7FK)j7`D^E0)BW~`K6>e6bASHLzu>O^wQHxyK#A8?e0XirR6zqt zqHnJ!QmlLppXzznQb+$K9m&$_5t!=Gq+t#k$$N?)T3;g&JqLv%5rY5kqHA3z$ z+L_#FfjwqcJ4<-W<^A*|WL_g%wqM@E%ha>r2G;48j%SuYv$0Q8eVAMDViIj?~KLhixtlqG5Tec@#BKe2wI{a6ZuyWj`Pck>)=yW$2cd- z*a5kko}p0{quUJDyiw$1#PWp^#;K}DYh(0xqHm3`{4TU4Mo)_7*Mi@zyP~F=9u@h= zQucMy!cPj0NSr%Ge_w>l_DY0z!5^Kb9zhvD)j;2i#A-JpBT#}}6uqK`8E3qKZa}<^ zkfXxl!Xg;o5^R$g({5N|!V0()cEeI7p2u)aXNE6$eznqJ$TnCbu3K!IFKk=HVatX6 z#Er5-*e6`ic45D9WA2suu9w;?C?)K-ZaIuGYIp>V=Nd+YebbFHF6Y!KR!P^1XN`DP)1AWZly+9r-4tnRpgl-dH+uITiXh4$a@vh~_FiF&#MVIf z(_z?l3u~l@LgnJevHA4=knJ@3fJB)qG0&jC6&8~yXVM3SJu9}e=o7*=h;0ddTG$F< zP4qaOP5)W*2(UKx8Q|B9&(V6i%lJGsQIGx{a9TeFG)2BguobwTy46>3dR;_c2X@iF z0{4i#92leX8$Sp9Lgn|M|A79X`2P&@8u}Hm2;>NVfZR(;v0SefAX8knP#4F%Um9WD zFL5R-IoikT80%}!fc{&N#lYX!G==14sxOHy(`~2!qB@4T8L*uy%=(XG$J=;*JLQhh z&Bm3!=MlQ1c0@&d+i&X*s0yDwZQP`)LiN2#ReOw{)9+Aq9y4xMWi`iVx2vNewn%>% zGr?`Ou}uGch}Bn?RikfPTzNFaK3`W>ao_gObw>jxnV9R_K7`r>_AqJ>*gde#^F8l_ zEnq)tD69Ft?bi)QL+typGDgm8^$W41A$EUFS)JzFK3Q`##GbD$tJ8hk3$;f>Y!ori z@NG9DX22HLKBgA>w)1Mg6k<=Q$JCj=?RoVtYLUkz6N^1&tgQKt3fKiTKMa_7p5=RT z&I0x@W<jdA{u(XiLD( zgKed6>xM006SZejt8crt_PiJQg^$aN9aktU2pfw zNgsNB#(fA_1oOpXM<`PBdhM~>Xr3O{JH2wq%c$PvG5TyIuXlS4w(IpCk5NqDtoM2h zwzul5JZ4;hvEAph6vj4SU#&T!_xrZzYTo0sFVdG|59&9#wj;)o#t($p9biMQ?Thpb z&aq*iT~_-s?Xe%K%W6NRQ(g^}s(VzYJ%)BZp+`Jsya{K2#%FKCiW#tHaQ0vA+rEVr zGhmk@pX0vmN}PWlJ7R1zp3+(0w#zsZ`)+5|aQf#l?%!8^&m+biU^(BD`#0$`?w`lF zf8WyAcr~DZ-_f?q*!Ckm<+Eq>PxV316Mc`-p%8nk_L+>>wVuu35epcP*mb^*N6ceR zkFIxZ+@lwC!0rIM!L>OfR`MD5$Yb2lb9mU_Pm;m z#OPMn^Lh2%hBE_JHPT>20^4(K94!|y~X$B`g~UP#yMw2d?xkX<#|edK2tYUEsxyo*%a6JR+l;TdCaNr z9^aGe^I6qb=B$tSOzOMW^OX90rk<@zM&9Pxq`tRfudC?mxNp(a%{NVSQEfwmrr%(1 zujnb)16s1dR`5DWx8jU-eoQw4i=sB7q_EZu3IHMwfSk>gNHwg0?kXwFXbQT=h4}C7V$dVv9{7_xQ|_kyVZqwTC@-& zxRCbaxRMeS$6?{9$FU#BmDt(GaacI&aqP!&C3f@+aacGO;MkAjO6=sDaacIc!m%I6 zm3T_RD`g`vMrQ!4>0FUl0~=_g;8wvN!OH}%6f^}hz!=>GoR8-Khj9h^H1P^lOJ8m{ z8}fZv!9NXo1M1h55T(n>4nYrwU5>eY%T2}^;Uv#@i&$Gkzf5qeV5jIiMeY_f1yiC=iEIg$B-%|P-zr!Z%>yDoB=|wx34c2}Bl^ch z^Mu5CLgX(9&WiPz=#Po!2ZE%fFM1*EiAJ>aMN3}<6Jl)=xkaokA}ZrX!qlOG;T{ zEs6fH;4NakRrF=iJSg~(Xl6uyT;wN2o)tVMNKt8XRN5?ZLa;?JDY#XvogxnjrUXlZ zWx*Lis^Dk|!6CttU|DcRa8{6F;whLE91<)EmIY@7X9cNJ`~{POCBd@bjNq&w8R99J z6dV#P36=$C1ZM@QO8fz(tku}MW#mfk2bP3A#zf%OEk9#9u<7DaUuOGIxAL+OQ|@|=V)BYie{aD`uwYsCg? zp$oBn_>$U*{m8j`H?XOa{9~J%k1pm8%HNTB9K3pSmE#qO)wAEe(`3H*eqM8)& z)t7xibDT8>;~%B=3nk|KNEVuwM%FK_XMDFXiuIqBvOC3djkNq~@%i9M za-~Ebl~UiSDWdF*^d%ymcZv0KV;cH?gX4!i7tFZ*YK&J6c@s=E!2mD^Oa| zc|c7oQCeXq*#vnNN-NBt7RaknT45e7gS?i`fxHf=>3qacm{;dQz5tOF=GO|y8xcui zo~?x3j!23&0X6>MV>RS0Kut+RQnVGQ@l@}8$eloqz1szlyMdavA(Eo)K#e!R7eVd; zYPtmRaNhycv;*-J-q&n_yc6*h{$6G)Pc06&U7pr%jZ{hr2dH4pp@>euub zYSws%ItBb99mH&C$D4tLv>DI&7gAC+0XtL+uuCliZo?jTAzh3o+6fwfX9Dm1mH@9% zD}h(RGeP^{nV>hQRlp&5Hc=X$O*8_}CK`ih6I~6@Cd$IIiE{94qDgo*QxTrcbO4^s zbV#iRUJK7=x*nd*bc0$8EWxvdZh>bD-3HGVdb2tocn3UN=q>PUp}W;a;63nMg89*f zaqXjh$o{o-8@&VXARnS=iSGczpCfo%>fe0A@DbXJbM8dlqqyHBoI!kt!goS3%==25 zIhC062F{u}sIdV(Z$O_K(AqfK!EY_8y)&E7S(}$q`{s>|(Pp)^8PAzuPj?yK>p-9hn02_Pu6yoa1ax4-T%OZBx0_&>Grf zW~Z!ysY%qehAy?Hh4+~m8?=3=l^Goy&f7h?bS7mLxZql9-(%VtGglP4j@r8qO`5qh z+s+S@3pjPu-kVQPp-PZloI>i%TBhAKoiisgDe9jt6s?KY&U`j&rHYw+uF$&O%2_r{ zqgHXSCrt(Ci&=Lr?J69}63&+XqG=ahn=iXMv5%RPRX@5moIm3m;x&Yi-$ZS&w@XFhkpvWp!U1nS6}cAAC-2kdE7p0a4W zRpeRGiN9&2j;TyGz1z%35TAo?BF0V~^KW|16g8*=E4_wK1&F*9Mgb8mXmH-rkeI&ol1;jc7NOBy3vw5ZD( zo*Ess><&ABP-=11GE}xBZ_DJ^*)BS?ee>$U!GaWS-@MinyC;UNblOU9E#fbFhNlpj zPboCgmKlhuLMGqo@`5>P`OIw$_chS%oXTd8*PPVkz;g`ulZ`#Ok-R-&@_A-vU(yTHX(Tf`Ws6@BWVbca zZ;n{S>D@S;3xQsij_#~AVdaWD(cX~BNvOoxZDq|vB8BW;qx)>E5vgJj(@P9{rhXE!vhfN6DSa zxwMlWvHIsjpP5eMj6eP)@sxZr`RjwY1dMIHncUWFHh<7c2YOyvPNjF(OSk#0?ig~_ z?xe-g4ou}(QFOir^3GqZkqzB$oR4c4g?!1VYw}d_e9MIAk{`aB zw%Pd!Udo)H6D;|sv<##42W5LR*=(j@rSiFSq0h1%o233FY%*NtA!{(0`%(UH$%kC8ifGxicicPsT8LrUMhxIMYz+BIDn`?UsknH+~*WZpn}rM(5rxk6ZWzhxf~yK{ZR`h{&H-1!9J zB?ls(m#!$Mp}%T|?7@=hDhKjAGC4PnY^+j*;qF?Sj106 zoD;8*A1Pvonzpv$sySVNn(GhtjuJ9Nhs}bs*Cbwg;GH+K1>#LSf5~2XZ>BglfGuNz zug6Zjt&@}4X+DcWdhYV6^d|d;{6?_E?8*(~$E}>7;n0aA?UntbG}V!g&tYH_dafd_}7_6YX&2(nU9h(z$yN0jEmY#Or`EgClRERa2{KYJY3gZluq z2IJY2%b-Ty<|FP@wn&}0G!-rP4o7Nm?^QTfPcCK4Mn~eE(r}8_%Q==wg?sS|>sIHK zja|+uQ}If{UTVeqUxswM;jUG$t#GhPy-ay;ed3{g8MjyJwzozHYd??wpAhh+^7tCU z9-qtC9w5l)E5r!rH0+8MPd0nhn?GRf%d%-QZv^X<6bDvs^NLhkyV zO3(h`4T*WkIrBmr5~$>If2F0z#~%_ z<`N9?{S_=5z{`|T!}9#bH|oYd4f(Q=?CA{-zqmeRH7e)FOLwWpz8JTmbgxSX`1{>Z zJ3PM6`1qE=8ymk-eW6m3*y0Ku!+%C4+SG%1&=`?ee2Dqwx?c47W_^8?=;Ceh6SVb_6GVx|*Vk>)EXFn-@+-T_U35z43MP;}a^rygDK7 z@ug@{f(&G3$&@lGIq5yBzFMe=G7jAN8efObq7hDQt~uW3sp4&jSLeiYzjQ@HE5qQH zM`CCNsuT@lMD!61nAV0-1xFd5`{Mi9E548C zFoQp>7uQRwF{i7La%V2rIWyj6zTP-aZ$y@pQMue1Cd2tgR7XJWms1@M9mQ(|BWj?z zEY(A`s0uz#MZRR<_epqUi_cm7Gll`ZV6SaX?#$=952bK-$2YEH{76T^uTmywlyMW@ zf3)uG9_Y;5*4D|%^W6KGO$RP$Z9|m$dHzEZ_t7jrgD|*60v_}5w&lc|Cc+=BRLDLP zKb=BdtMRKZ{KHRpp%;Q5f62Mv{-R1Onp=(rosGYl9Ou7M8qjre+un;^Lk3Szp{VM~ z;f5)LCr9kIW8SNB1O9b;3t}yBpFK-QUu&>TZ^k zES>!Eeskwo@R-r=K7^euZYC!RDGY}t_pWSxaTz6(j@zFF`Ry4|f~a&lzWeZvuh2)* zf_G3S>)ELk@^nPUf9xa^rxd?c#u9l?iRky7W%u)Yy$;eIyb~G(cH_-bKi(nj!kec- zeDA~?EBUoHeKz{jKRQF>#ByY!Ep8l~JN)lk z3B3E_I;PPh6U>tMIed@9IxMz9=uP+yq7F-1aIuv4THXb10q?oE9h1kk^OfSXVZBg( zyZ0ato;8H}xf*XM+x&xn8#)jEoT;Mt=FqNesO2wTUn`~Iokb6^q#@1@#2A$boQX-~ zfO{~Cw^Bv;ByjXeeY;#eXPN8s`pwMA*sHDA$$KB-<7xKNa27eEGn(l^dE9g(98_nEYC8Q}eV{Xx_59uDY(e-E<#; zClDf6*wl;{9Tyf-V;1h7SK=L!o#z|ym8ty1g=S%*^}y=p#Dtm4jNoCUcP)_m5G;}K zgZ1F)coCb#%|L6Nm SI=^!+^Z#Gsub=;S8TcRK%j1Rs literal 0 HcmV?d00001 diff --git a/obj/Debug/net7.0/refint/nekoban_map_gen.dll b/obj/Debug/net7.0/refint/nekoban_map_gen.dll new file mode 100644 index 0000000000000000000000000000000000000000..7b73ffcb83adf88582287dd820f407be5676c11f GIT binary patch literal 17920 zcmeHPYm{77mEPx6b@lCMx+@PLB&51KfnZ3d^B^S9NhNyKh(B?k>8z zs<~C2qyeEIfC7S`%cv->VhB3w_#B6YjAA3GBMWqNP!}`mG{(n_u30`=K1OA}z3(#* z9)q*|;aK5*wZFah+2@>n&OP_sd%Nhp>K=*^Q546EFA_b1Z~i0&Umi*@*Draro<3Fe zOw%K3$1_a>W0^u?($0_C=0qZ8=5qOBV%SR9Q@KPYm+0EnpP0y}t=77_>ZNYzzHXu& zDoXL@a~||+o26!|QEfyUps9AW?>mU^B#s0Q7Wi8`?S>@n=Wm+9!JWY;LPNI_HOPO# zw@V!t+JU&cSS}I0rNUK)zsf|l;BD|*6xP3zoFpKN1Ad?11>-@fW?e^S~ zL>;X~>rfGjqZa_6ketNu9r`4QhFa}{oq|sKP=dfdn{k9bNknM1t!y5S+$SpIKn|%3 zN9dD8y&?Kn@h><7FK)j7`D^E0)BW~`K6>e6bASHLzu>O^wQHxyK#A8?e0XirR6zqt zqHnJ!QmlLppXzznQb+$K9m&$_5t!=Gq+t#k$$N?)T3;g&JqLv%5rY5kqHA3z$ z+L_#FfjwqcJ4<-W<^A*|WL_g%wqM@E%ha>r2G;48j%SuYv$0Q8eVAMDViIj?~KLhixtlqG5Tec@#BKe2wI{a6ZuyWj`Pck>)=yW$2cd- z*a5kko}p0{quUJDyiw$1#PWp^#;K}DYh(0xqHm3`{4TU4Mo)_7*Mi@zyP~F=9u@h= zQucMy!cPj0NSr%Ge_w>l_DY0z!5^Kb9zhvD)j;2i#A-JpBT#}}6uqK`8E3qKZa}<^ zkfXxl!Xg;o5^R$g({5N|!V0()cEeI7p2u)aXNE6$eznqJ$TnCbu3K!IFKk=HVatX6 z#Er5-*e6`ic45D9WA2suu9w;?C?)K-ZaIuGYIp>V=Nd+YebbFHF6Y!KR!P^1XN`DP)1AWZly+9r-4tnRpgl-dH+uITiXh4$a@vh~_FiF&#MVIf z(_z?l3u~l@LgnJevHA4=knJ@3fJB)qG0&jC6&8~yXVM3SJu9}e=o7*=h;0ddTG$F< zP4qaOP5)W*2(UKx8Q|B9&(V6i%lJGsQIGx{a9TeFG)2BguobwTy46>3dR;_c2X@iF z0{4i#92leX8$Sp9Lgn|M|A79X`2P&@8u}Hm2;>NVfZR(;v0SefAX8knP#4F%Um9WD zFL5R-IoikT80%}!fc{&N#lYX!G==14sxOHy(`~2!qB@4T8L*uy%=(XG$J=;*JLQhh z&Bm3!=MlQ1c0@&d+i&X*s0yDwZQP`)LiN2#ReOw{)9+Aq9y4xMWi`iVx2vNewn%>% zGr?`Ou}uGch}Bn?RikfPTzNFaK3`W>ao_gObw>jxnV9R_K7`r>_AqJ>*gde#^F8l_ zEnq)tD69Ft?bi)QL+typGDgm8^$W41A$EUFS)JzFK3Q`##GbD$tJ8hk3$;f>Y!ori z@NG9DX22HLKBgA>w)1Mg6k<=Q$JCj=?RoVtYLUkz6N^1&tgQKt3fKiTKMa_7p5=RT z&I0x@W<jdA{u(XiLD( zgKed6>xM006SZejt8crt_PiJQg^$aN9aktU2pfw zNgsNB#(fA_1oOpXM<`PBdhM~>Xr3O{JH2wq%c$PvG5TyIuXlS4w(IpCk5NqDtoM2h zwzul5JZ4;hvEAph6vj4SU#&T!_xrZzYTo0sFVdG|59&9#wj;)o#t($p9biMQ?Thpb z&aq*iT~_-s?Xe%K%W6NRQ(g^}s(VzYJ%)BZp+`Jsya{K2#%FKCiW#tHaQ0vA+rEVr zGhmk@pX0vmN}PWlJ7R1zp3+(0w#zsZ`)+5|aQf#l?%!8^&m+biU^(BD`#0$`?w`lF zf8WyAcr~DZ-_f?q*!Ckm<+Eq>PxV316Mc`-p%8nk_L+>>wVuu35epcP*mb^*N6ceR zkFIxZ+@lwC!0rIM!L>OfR`MD5$Yb2lb9mU_Pm;m z#OPMn^Lh2%hBE_JHPT>20^4(K94!|y~X$B`g~UP#yMw2d?xkX<#|edK2tYUEsxyo*%a6JR+l;TdCaNr z9^aGe^I6qb=B$tSOzOMW^OX90rk<@zM&9Pxq`tRfudC?mxNp(a%{NVSQEfwmrr%(1 zujnb)16s1dR`5DWx8jU-eoQw4i=sB7q_EZu3IHMwfSk>gNHwg0?kXwFXbQT=h4}C7V$dVv9{7_xQ|_kyVZqwTC@-& zxRCbaxRMeS$6?{9$FU#BmDt(GaacI&aqP!&C3f@+aacGO;MkAjO6=sDaacIc!m%I6 zm3T_RD`g`vMrQ!4>0FUl0~=_g;8wvN!OH}%6f^}hz!=>GoR8-Khj9h^H1P^lOJ8m{ z8}fZv!9NXo1M1h55T(n>4nYrwU5>eY%T2}^;Uv#@i&$Gkzf5qeV5jIiMeY_f1yiC=iEIg$B-%|P-zr!Z%>yDoB=|wx34c2}Bl^ch z^Mu5CLgX(9&WiPz=#Po!2ZE%fFM1*EiAJ>aMN3}<6Jl)=xkaokA}ZrX!qlOG;T{ zEs6fH;4NakRrF=iJSg~(Xl6uyT;wN2o)tVMNKt8XRN5?ZLa;?JDY#XvogxnjrUXlZ zWx*Lis^Dk|!6CttU|DcRa8{6F;whLE91<)EmIY@7X9cNJ`~{POCBd@bjNq&w8R99J z6dV#P36=$C1ZM@QO8fz(tku}MW#mfk2bP3A#zf%OEk9#9u<7DaUuOGIxAL+OQ|@|=V)BYie{aD`uwYsCg? zp$oBn_>$U*{m8j`H?XOa{9~J%k1pm8%HNTB9K3pSmE#qO)wAEe(`3H*eqM8)& z)t7xibDT8>;~%B=3nk|KNEVuwM%FK_XMDFXiuIqBvOC3djkNq~@%i9M za-~Ebl~UiSDWdF*^d%ymcZv0KV;cH?gX4!i7tFZ*YK&J6c@s=E!2mD^Oa| zc|c7oQCeXq*#vnNN-NBt7RaknT45e7gS?i`fxHf=>3qacm{;dQz5tOF=GO|y8xcui zo~?x3j!23&0X6>MV>RS0Kut+RQnVGQ@l@}8$eloqz1szlyMdavA(Eo)K#e!R7eVd; zYPtmRaNhycv;*-J-q&n_yc6*h{$6G)Pc06&U7pr%jZ{hr2dH4pp@>euub zYSws%ItBb99mH&C$D4tLv>DI&7gAC+0XtL+uuCliZo?jTAzh3o+6fwfX9Dm1mH@9% zD}h(RGeP^{nV>hQRlp&5Hc=X$O*8_}CK`ih6I~6@Cd$IIiE{94qDgo*QxTrcbO4^s zbV#iRUJK7=x*nd*bc0$8EWxvdZh>bD-3HGVdb2tocn3UN=q>PUp}W;a;63nMg89*f zaqXjh$o{o-8@&VXARnS=iSGczpCfo%>fe0A@DbXJbM8dlqqyHBoI!kt!goS3%==25 zIhC062F{u}sIdV(Z$O_K(AqfK!EY_8y)&E7S(}$q`{s>|(Pp)^8PAzuPj?yK>p-9hn02_Pu6yoa1ax4-T%OZBx0_&>Grf zW~Z!ysY%qehAy?Hh4+~m8?=3=l^Goy&f7h?bS7mLxZql9-(%VtGglP4j@r8qO`5qh z+s+S@3pjPu-kVQPp-PZloI>i%TBhAKoiisgDe9jt6s?KY&U`j&rHYw+uF$&O%2_r{ zqgHXSCrt(Ci&=Lr?J69}63&+XqG=ahn=iXMv5%RPRX@5moIm3m;x&Yi-$ZS&w@XFhkpvWp!U1nS6}cAAC-2kdE7p0a4W zRpeRGiN9&2j;TyGz1z%35TAo?BF0V~^KW|16g8*=E4_wK1&F*9Mgb8mXmH-rkeI&ol1;jc7NOBy3vw5ZD( zo*Ess><&ABP-=11GE}xBZ_DJ^*)BS?ee>$U!GaWS-@MinyC;UNblOU9E#fbFhNlpj zPboCgmKlhuLMGqo@`5>P`OIw$_chS%oXTd8*PPVkz;g`ulZ`#Ok-R-&@_A-vU(yTHX(Tf`Ws6@BWVbca zZ;n{S>D@S;3xQsij_#~AVdaWD(cX~BNvOoxZDq|vB8BW;qx)>E5vgJj(@P9{rhXE!vhfN6DSa zxwMlWvHIsjpP5eMj6eP)@sxZr`RjwY1dMIHncUWFHh<7c2YOyvPNjF(OSk#0?ig~_ z?xe-g4ou}(QFOir^3GqZkqzB$oR4c4g?!1VYw}d_e9MIAk{`aB zw%Pd!Udo)H6D;|sv<##42W5LR*=(j@rSiFSq0h1%o233FY%*NtA!{(0`%(UH$%kC8ifGxicicPsT8LrUMhxIMYz+BIDn`?UsknH+~*WZpn}rM(5rxk6ZWzhxf~yK{ZR`h{&H-1!9J zB?ls(m#!$Mp}%T|?7@=hDhKjAGC4PnY^+j*;qF?Sj106 zoD;8*A1Pvonzpv$sySVNn(GhtjuJ9Nhs}bs*Cbwg;GH+K1>#LSf5~2XZ>BglfGuNz zug6Zjt&@}4X+DcWdhYV6^d|d;{6?_E?8*(~$E}>7;n0aA?UntbG}V!g&tYH_dafd_}7_6YX&2(nU9h(z$yN0jEmY#Or`EgClRERa2{KYJY3gZluq z2IJY2%b-Ty<|FP@wn&}0G!-rP4o7Nm?^QTfPcCK4Mn~eE(r}8_%Q==wg?sS|>sIHK zja|+uQ}If{UTVeqUxswM;jUG$t#GhPy-ay;ed3{g8MjyJwzozHYd??wpAhh+^7tCU z9-qtC9w5l)E5r!rH0+8MPd0nhn?GRf%d%-QZv^X<6bDvs^NLhkyV zO3(h`4T*WkIrBmr5~$>If2F0z#~%_ z<`N9?{S_=5z{`|T!}9#bH|oYd4f(Q=?CA{-zqmeRH7e)FOLwWpz8JTmbgxSX`1{>Z zJ3PM6`1qE=8ymk-eW6m3*y0Ku!+%C4+SG%1&=`?ee2Dqwx?c47W_^8?=;Ceh6SVb_6GVx|*Vk>)EXFn-@+-T_U35z43MP;}a^rygDK7 z@ug@{f(&G3$&@lGIq5yBzFMe=G7jAN8efObq7hDQt~uW3sp4&jSLeiYzjQ@HE5qQH zM`CCNsuT@lMD!61nAV0-1xFd5`{Mi9E548C zFoQp>7uQRwF{i7La%V2rIWyj6zTP-aZ$y@pQMue1Cd2tgR7XJWms1@M9mQ(|BWj?z zEY(A`s0uz#MZRR<_epqUi_cm7Gll`ZV6SaX?#$=952bK-$2YEH{76T^uTmywlyMW@ zf3)uG9_Y;5*4D|%^W6KGO$RP$Z9|m$dHzEZ_t7jrgD|*60v_}5w&lc|Cc+=BRLDLP zKb=BdtMRKZ{KHRpp%;Q5f62Mv{-R1Onp=(rosGYl9Ou7M8qjre+un;^Lk3Szp{VM~ z;f5)LCr9kIW8SNB1O9b;3t}yBpFK-QUu&>TZ^k zES>!Eeskwo@R-r=K7^euZYC!RDGY}t_pWSxaTz6(j@zFF`Ry4|f~a&lzWeZvuh2)* zf_G3S>)ELk@^nPUf9xa^rxd?c#u9l?iRky7W%u)Yy$;eIyb~G(cH_-bKi(nj!kec- zeDA~?EBUoHeKz{jKRQF>#ByY!Ep8l~JN)lk z3B3E_I;PPh6U>tMIed@9IxMz9=uP+yq7F-1aIuv4THXb10q?oE9h1kk^OfSXVZBg( zyZ0ato;8H}xf*XM+x&xn8#)jEoT;Mt=FqNesO2wTUn`~Iokb6^q#@1@#2A$boQX-~ zfO{~Cw^Bv;ByjXeeY;#eXPN8s`pwMA*sHDA$$KB-<7xKNa27eEGn(l^dE9g(98_nEYC8Q}eV{Xx_59uDY(e-E<#; zClDf6*wl;{9Tyf-V;1h7SK=L!o#z|ym8ty1g=S%*^}y=p#Dtm4jNoCUcP)_m5G;}K zgZ1F)coCb#%|L6Nm SI=^!+^Z#Gsub=;S8TcRK%j1Rs literal 0 HcmV?d00001 diff --git a/obj/nekoban_map_gen.csproj.nuget.dgspec.json b/obj/nekoban_map_gen.csproj.nuget.dgspec.json new file mode 100644 index 0000000..2bd9a8e --- /dev/null +++ b/obj/nekoban_map_gen.csproj.nuget.dgspec.json @@ -0,0 +1,61 @@ +{ + "format": 1, + "restore": { + "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj": {} + }, + "projects": { + "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj", + "projectName": "nekoban_map_gen", + "projectPath": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj", + "packagesPath": "/Users/maximilian.j.sul/.nuget/packages/", + "outputPath": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/maximilian.j.sul/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net7.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.315/RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/obj/nekoban_map_gen.csproj.nuget.g.props b/obj/nekoban_map_gen.csproj.nuget.g.props new file mode 100644 index 0000000..f34edbd --- /dev/null +++ b/obj/nekoban_map_gen.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/maximilian.j.sul/.nuget/packages/ + /Users/maximilian.j.sul/.nuget/packages/ + PackageReference + 6.6.2 + + + + + \ No newline at end of file diff --git a/obj/nekoban_map_gen.csproj.nuget.g.targets b/obj/nekoban_map_gen.csproj.nuget.g.targets new file mode 100644 index 0000000..3dc06ef --- /dev/null +++ b/obj/nekoban_map_gen.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/obj/project.assets.json b/obj/project.assets.json new file mode 100644 index 0000000..48e6a9f --- /dev/null +++ b/obj/project.assets.json @@ -0,0 +1,66 @@ +{ + "version": 3, + "targets": { + "net7.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net7.0": [] + }, + "packageFolders": { + "/Users/maximilian.j.sul/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj", + "projectName": "nekoban_map_gen", + "projectPath": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj", + "packagesPath": "/Users/maximilian.j.sul/.nuget/packages/", + "outputPath": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/maximilian.j.sul/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net7.0" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/7.0.315/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache new file mode 100644 index 0000000..7fbec45 --- /dev/null +++ b/obj/project.nuget.cache @@ -0,0 +1,8 @@ +{ + "version": 2, + "dgSpecHash": "RYMvVqk+r7bCo4lc466IMiUBQNJtUPiAIecPRFNwdnBkz4B3dMDFM04zCDCH3kDAJ+g6+bpsAooJZxgB7X61oA==", + "success": true, + "projectFilePath": "/Users/maximilian.j.sul/Documents/Unity/nekoban_map_gen/nekoban_map_gen.csproj", + "expectedPackageFiles": [], + "logs": [] +} \ No newline at end of file diff --git a/stage.json b/stage.json new file mode 100644 index 0000000..a7b5881 --- /dev/null +++ b/stage.json @@ -0,0 +1,277 @@ +[ + { + "id": 3, + "grid": [ + "00000000000", + "00000000000", + "00#######00", + "00##..###00", + "00#...$@#00", + "00#.....#00", + "00#...G.#00", + "00###.###00", + "00#######00", + "00000000000", + "00000000000" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 4, + "grid": [ + "######0", + "#...##0", + "#...##0", + "#G$..#0", + "#.G$.#0", + "#.#@##0", + "######0" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 5, + "grid": [ + "000000000", + "0#######0", + "0##...##0", + "0#@$..##0", + "0#.G...#0", + "0##$..##0", + "0##.G.##0", + "0#######0", + "000000000" + ], + "lowestPush": 5, + "pushLimit": 7 + }, + { + "id": 6, + "grid": [ + "######0", + "#...##0", + "#$.G##0", + "#G.$@#0", + "#..###0", + "#...##0", + "######0" + ], + "lowestPush": 6, + "pushLimit": 9 + }, + { + "id": 7, + "grid": [ + "000000000", + "0#######0", + "0###..##0", + "0#@$...#0", + "0#G....#0", + "0#.....#0", + "0###.###0", + "0#######0", + "000000000" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 8, + "grid": [ + "######0", + "#...##0", + "#..$@#0", + "#.G..#0", + "#..$##0", + "#....#0", + "######0" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 9, + "grid": [ + "######0", + "#..@##0", + "#.#$##0", + "#....#0", + "#....#0", + "#.G.##0", + "######0" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 10, + "grid": [ + "#######", + "#@$GG.#", + "#.$...#", + "#.....#", + "#######", + "#######", + "0000000" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 11, + "grid": [ + "######0", + "#..@##0", + "##$$##0", + "#.G..#0", + "#G...#0", + "#...##0", + "######0" + ], + "lowestPush": 5, + "pushLimit": 7 + }, + { + "id": 12, + "grid": [ + "0000000", + "0#####0", + "0#...#0", + "0#.$.#0", + "0#G.$#0", + "0#.#@#0", + "0#####0", + "0000000" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 13, + "grid": [ + "######0", + "#...##0", + "#..###0", + "#..$@#0", + "#$.G##0", + "#...##0", + "######0" + ], + "lowestPush": 7, + "pushLimit": 10 + }, + { + "id": 14, + "grid": [ + "0######", + "0##...#", + "0##.$@#", + "0#.G..#", + "0##G$##", + "0##...#", + "0######" + ], + "lowestPush": 5, + "pushLimit": 7 + }, + { + "id": 15, + "grid": [ + "00000000000", + "00000000000", + "00#######00", + "00##...##00", + "00##.$.##00", + "00#@$.G.#00", + "00##..G##00", + "00##...##00", + "00#######00", + "00000000000", + "00000000000" + ], + "lowestPush": 5, + "pushLimit": 7 + }, + { + "id": 16, + "grid": [ + "0######", + "0##.G.#", + "0##$.G#", + "0#....#", + "0#@$.##", + "0##...#", + "0######" + ], + "lowestPush": 8, + "pushLimit": 11 + }, + { + "id": 17, + "grid": [ + "0######", + "0##...#", + "0#...##", + "0#....#", + "0##$.G#", + "0##@..#", + "0######" + ], + "lowestPush": 4, + "pushLimit": 6 + }, + { + "id": 18, + "grid": [ + "00000000000", + "00000000000", + "00#######00", + "00##...##00", + "00##G.$##00", + "00#.G...#00", + "00#...$.#00", + "00##..@##00", + "00#######00", + "00000000000", + "00000000000" + ], + "lowestPush": 7, + "pushLimit": 10 + }, + { + "id": 19, + "grid": [ + "000000000", + "0#######0", + "0##...##0", + "0##G..##0", + "0#.G.$@#0", + "0##.$.##0", + "0##...##0", + "0#######0", + "000000000" + ], + "lowestPush": 5, + "pushLimit": 7 + }, + { + "id": 20, + "grid": [ + "00000000000", + "00000000000", + "00#######00", + "00###@###00", + "00#..$..#00", + "00#...$.#00", + "00#.G.G.#00", + "00###.###00", + "00#######00", + "00000000000", + "00000000000" + ], + "lowestPush": 4, + "pushLimit": 6 + } +]