diff --git a/patches/eowyn.sh b/patches/eowyn.sh index 67a6b36..8cac450 100755 --- a/patches/eowyn.sh +++ b/patches/eowyn.sh @@ -22,7 +22,9 @@ then fi # Which version we have? -echo "I am in version 23.4.25.1, let's try our magic power." +echo "Zig version" $(zig version) +echo "Eowyn version 23.10.5.1, let's try our magic power." +echo "" # Create directory of healing if it doesn't already exist. mkdir -p patches/healed @@ -39,7 +41,9 @@ do # Apply the bandages to the wounds, grow new limbs, let # new life spring into the broken bodies of the fallen. echo Healing "$true_name"... - ./test/patch --output="patches/healed/$true_name.zig" "$broken" "$patch_name" + cp "$broken" "patches/healed/$true_name.zig" + patch -i "$patch_name" "patches/healed/$true_name.zig" + else echo Cannot heal "$true_name". No patch found. fi diff --git a/patches/frodo.sh b/patches/frodo.sh new file mode 100755 index 0000000..a92642a --- /dev/null +++ b/patches/frodo.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# +# "How do you pick up the threads of an old life? +# How do you go on, when in your heart you begin +# to understand... there is no going back? +# There are some things that time cannot mend. +# Some hurts that go too deep, that have taken hold." +# Frodo, The Return of the King +# +# +# This script shall repair the patches for the little +# broken programs using the old patches in this directory +# first, to heal them and then create new and better +# patches, with Gollum's help. +# +set -e + +# We check ourselves before we wreck ourselves. +if [ ! -f patches/frodo.sh ] +then + echo "But I must be run from the project root directory." + exit 1 +fi + +# Create directory of answers if it doesn't already exist. +mkdir -p answers + +# Cycle through all the little broken Zig applications. +i=0 +for broken in exercises/*.zig +do + ((i=i+1)) + + # Remove the dir and extension, rendering the True Name. + true_name=$(basename "$broken" .zig) + patch_name="patches/patches/$true_name.patch" + healed_name="answers/$true_name.zig" + cp "$broken" "$healed_name" + # echo "$patch_name" + + if [ -f "$patch_name" ] + then + # Apply the bandages to the wounds, grow new limbs, let + # new life spring into the broken bodies of the fallen. + echo Healing "$true_name"... + patch -i "$patch_name" "$healed_name" + + # Create new prescriptions... + echo Repairing "$patch_name"... + if [ "$true_name.patch" = "999_the_end.patch" ] + then + i=999 + fi + # with gollum's help! + ./patches/gollum.sh $i + else + echo Cannot repair "$true_name". No patch found. + fi +done + diff --git a/patches/gollum.sh b/patches/gollum.sh index 74f7626..b15af0b 100755 --- a/patches/gollum.sh +++ b/patches/gollum.sh @@ -26,6 +26,6 @@ echo "Hissss! before: '$b'" echo " after: '$a'" echo " patch: '$p'" -diff $b $a > $p +diff -u $b $a > $p cat $p diff --git a/patches/patches/001_hello.patch b/patches/patches/001_hello.patch index fb360a7..c5aacd8 100644 --- a/patches/patches/001_hello.patch +++ b/patches/patches/001_hello.patch @@ -1,4 +1,10 @@ -19c19 -< fn main() void { ---- -> pub fn main() void { +--- exercises/001_hello.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/001_hello.zig 2023-10-05 20:04:06.846096282 +0200 +@@ -16,6 +16,6 @@ + // + const std = @import("std"); + +-fn main() void { ++pub fn main() void { + std.debug.print("Hello world!\n", .{}); + } diff --git a/patches/patches/002_std.patch b/patches/patches/002_std.patch index 6c97adb..6a1912d 100644 --- a/patches/patches/002_std.patch +++ b/patches/patches/002_std.patch @@ -1,4 +1,11 @@ -14c14 -< ??? = @import("std"); ---- -> const std = @import("std"); +--- exercises/002_std.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/002_std.zig 2023-10-05 20:04:06.849429678 +0200 +@@ -11,7 +11,7 @@ + // Please complete the import below: + // + +-??? = @import("std"); ++const std = @import("std"); + + pub fn main() void { + std.debug.print("Standard Library.\n", .{}); diff --git a/patches/patches/003_assignment.patch b/patches/patches/003_assignment.patch index bef4b24..0d780d9 100644 --- a/patches/patches/003_assignment.patch +++ b/patches/patches/003_assignment.patch @@ -1,12 +1,18 @@ -37c37 -< const n: u8 = 50; ---- -> var n: u8 = 50; -40c40 -< const pi: u8 = 314159; ---- -> const pi: u32 = 314159; -42c42 -< const negative_eleven: u8 = -11; ---- -> const negative_eleven: i8 = -11; +--- exercises/003_assignment.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/003_assignment.zig 2023-10-05 20:04:06.856096469 +0200 +@@ -34,12 +34,12 @@ + const std = @import("std"); + + pub fn main() void { +- const n: u8 = 50; ++ var n: u8 = 50; + n = n + 5; + +- const pi: u8 = 314159; ++ const pi: u32 = 314159; + +- const negative_eleven: u8 = -11; ++ const negative_eleven: i8 = -11; + + // There are no errors in the next line, just explanation: + // Perhaps you noticed before that the print function takes two diff --git a/patches/patches/004_arrays.patch b/patches/patches/004_arrays.patch index c6f9de3..ce7474e 100644 --- a/patches/patches/004_arrays.patch +++ b/patches/patches/004_arrays.patch @@ -1,12 +1,25 @@ -30c30 -< const some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 }; ---- -> var some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 }; -43c43 -< const fourth = some_primes[???]; ---- -> const fourth = some_primes[3]; -47c47 -< const length = some_primes.???; ---- -> const length = some_primes.len; +--- exercises/004_arrays.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/004_arrays.zig 2023-10-05 20:04:06.859429866 +0200 +@@ -27,7 +27,7 @@ + // (Problem 1) + // This "const" is going to cause a problem later - can you see what it is? + // How do we fix it? +- const some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 }; ++ var some_primes = [_]u8{ 1, 3, 5, 7, 11, 13, 17, 19 }; + + // Individual values can be set with '[]' notation. + // Example: This line changes the first prime to 2 (which is correct): +@@ -40,11 +40,11 @@ + // (Problem 2) + // Looks like we need to complete this expression. Use the example + // above to set "fourth" to the fourth element of the some_primes array: +- const fourth = some_primes[???]; ++ const fourth = some_primes[3]; + + // (Problem 3) + // Use the len property to get the length of the array: +- const length = some_primes.???; ++ const length = some_primes.len; + + std.debug.print("First: {}, Fourth: {}, Length: {}\n", .{ + first, fourth, length, diff --git a/patches/patches/005_arrays2.patch b/patches/patches/005_arrays2.patch index 83e71e0..c576150 100644 --- a/patches/patches/005_arrays2.patch +++ b/patches/patches/005_arrays2.patch @@ -1,8 +1,17 @@ -28c28 -< const leet = ???; ---- -> const leet = le ++ et; -33c33 -< const bit_pattern = [_]u8{ ??? } ** 3; ---- -> const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3; +--- exercises/005_arrays2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/005_arrays2.zig 2023-10-05 20:04:06.862763262 +0200 +@@ -25,12 +25,12 @@ + // (Problem 1) + // Please set this array concatenating the two arrays above. + // It should result in: 1 3 3 7 +- const leet = ???; ++ const leet = le ++ et; + + // (Problem 2) + // Please set this array using repetition. + // It should result in: 1 0 0 1 1 0 0 1 1 0 0 1 +- const bit_pattern = [_]u8{ ??? } ** 3; ++ const bit_pattern = [_]u8{ 1, 0, 0, 1 } ** 3; + + // Okay, that's all of the problems. Let's see the results. + // diff --git a/patches/patches/006_strings.patch b/patches/patches/006_strings.patch index 3ed9ea6..bd29ecc 100644 --- a/patches/patches/006_strings.patch +++ b/patches/patches/006_strings.patch @@ -1,12 +1,24 @@ -27c27 -< const d: u8 = ziggy[???]; ---- -> const d: u8 = ziggy[4]; -31c31 -< const laugh = "ha " ???; ---- -> const laugh = "ha " ** 3; -38c38 -< const major_tom = major ??? tom; ---- -> const major_tom = major ++ " " ++ tom; +--- exercises/006_strings.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/006_strings.zig 2023-10-05 20:04:06.869430053 +0200 +@@ -24,18 +24,18 @@ + // (Problem 1) + // Use array square bracket syntax to get the letter 'd' from + // the string "stardust" above. +- const d: u8 = ziggy[???]; ++ const d: u8 = ziggy[4]; + + // (Problem 2) + // Use the array repeat '**' operator to make "ha ha ha ". +- const laugh = "ha " ???; ++ const laugh = "ha " ** 3; + + // (Problem 3) + // Use the array concatenation '++' operator to make "Major Tom". + // (You'll need to add a space as well!) + const major = "Major"; + const tom = "Tom"; +- const major_tom = major ??? tom; ++ const major_tom = major ++ " " ++ tom; + + // That's all the problems. Let's see our results: + std.debug.print("d={u} {s}{s}\n", .{ d, laugh, major_tom }); diff --git a/patches/patches/007_strings2.patch b/patches/patches/007_strings2.patch index 34cd053..e8cecd2 100644 --- a/patches/patches/007_strings2.patch +++ b/patches/patches/007_strings2.patch @@ -1,8 +1,15 @@ -18,20c18,20 -< Ziggy played guitar -< Jamming good with Andrew Kelley -< And the Spiders from Mars ---- -> \\Ziggy played guitar -> \\Jamming good with Andrew Kelley -> \\And the Spiders from Mars +--- exercises/007_strings2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/007_strings2.zig 2023-10-05 20:04:06.872763449 +0200 +@@ -15,9 +15,9 @@ + + pub fn main() void { + const lyrics = +- Ziggy played guitar +- Jamming good with Andrew Kelley +- And the Spiders from Mars ++ \\Ziggy played guitar ++ \\Jamming good with Andrew Kelley ++ \\And the Spiders from Mars + ; + + std.debug.print("{s}\n", .{lyrics}); diff --git a/patches/patches/008_quiz.patch b/patches/patches/008_quiz.patch index a62be07..10111bb 100644 --- a/patches/patches/008_quiz.patch +++ b/patches/patches/008_quiz.patch @@ -1,18 +1,30 @@ -22c22 -< const x: usize = 1; ---- -> var x: usize = 1; -26c26 -< // 'undefined'. There is no problem on this line. ---- -> // 'undefined'. There is no error here. -36c36 -< lang[???] = letters[x]; ---- -> lang[1] = letters[x]; -38,39c38,39 -< x = ???; -< lang[2] = letters[???]; ---- -> x = 5; -> lang[2] = letters[x]; +--- exercises/008_quiz.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/008_quiz.zig 2023-10-05 20:04:06.879430240 +0200 +@@ -19,11 +19,11 @@ + // the idiomatic type to use for array indexing. + // + // There IS a problem on this line, but 'usize' isn't it. +- const x: usize = 1; ++ var x: usize = 1; + + // Note: When you want to declare memory (an array in this + // case) without putting anything in it, you can set it to +- // 'undefined'. There is no problem on this line. ++ // 'undefined'. There is no error here. + var lang: [3]u8 = undefined; + + // The following lines attempt to put 'Z', 'i', and 'g' into the +@@ -33,10 +33,10 @@ + lang[0] = letters[x]; + + x = 3; +- lang[???] = letters[x]; ++ lang[1] = letters[x]; + +- x = ???; +- lang[2] = letters[???]; ++ x = 5; ++ lang[2] = letters[x]; + + // We want to "Program in Zig!" of course: + std.debug.print("Program in {s}!\n", .{lang}); diff --git a/patches/patches/009_if.patch b/patches/patches/009_if.patch index 0b00183..ebebb35 100644 --- a/patches/patches/009_if.patch +++ b/patches/patches/009_if.patch @@ -1,4 +1,11 @@ -27c27 -< if (foo) { ---- -> if (foo == 1) { +--- exercises/009_if.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/009_if.zig 2023-10-05 20:04:06.882763636 +0200 +@@ -24,7 +24,7 @@ + const foo = 1; + + // Please fix this condition: +- if (foo) { ++ if (foo == 1) { + // We want our program to print this message! + std.debug.print("Foo is 1!\n", .{}); + } else { diff --git a/patches/patches/010_if2.patch b/patches/patches/010_if2.patch index 3ce48c2..b7207ea 100644 --- a/patches/patches/010_if2.patch +++ b/patches/patches/010_if2.patch @@ -1,4 +1,11 @@ -13c13 -< const price: u8 = if ???; ---- -> const price: u8 = if (discount) 17 else 20; +--- exercises/010_if2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/010_if2.zig 2023-10-05 20:04:06.886097032 +0200 +@@ -10,7 +10,7 @@ + + // Please use an if...else expression to set "price". + // If discount is true, the price should be $17, otherwise $20: +- const price: u8 = if ???; ++ const price: u8 = if (discount) 17 else 20; + + std.debug.print("With the discount, the price is ${}.\n", .{price}); + } diff --git a/patches/patches/011_while.patch b/patches/patches/011_while.patch index a892191..b293fc0 100644 --- a/patches/patches/011_while.patch +++ b/patches/patches/011_while.patch @@ -1,4 +1,11 @@ -24c24 -< while (???) { ---- -> while (n < 1024) { +--- exercises/011_while.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/011_while.zig 2023-10-05 20:04:06.892763823 +0200 +@@ -21,7 +21,7 @@ + var n: u32 = 2; + + // Please use a condition that is true UNTIL "n" reaches 1024: +- while (???) { ++ while (n < 1024) { + // Print the current number + std.debug.print("{} ", .{n}); + diff --git a/patches/patches/012_while2.patch b/patches/patches/012_while2.patch index 29ae763..0ae0dcb 100644 --- a/patches/patches/012_while2.patch +++ b/patches/patches/012_while2.patch @@ -1,4 +1,11 @@ -28c28 -< while (n < 1000) : ??? { ---- -> while (n < 1000) : (n *= 2) { +--- exercises/012_while2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/012_while2.zig 2023-10-05 20:04:06.896097219 +0200 +@@ -25,7 +25,7 @@ + + // Please set the continue expression so that we get the desired + // results in the print statement below. +- while (n < 1000) : ??? { ++ while (n < 1000) : (n *= 2) { + // Print the current number + std.debug.print("{} ", .{n}); + } diff --git a/patches/patches/013_while3.patch b/patches/patches/013_while3.patch index b0172da..48c6b9f 100644 --- a/patches/patches/013_while3.patch +++ b/patches/patches/013_while3.patch @@ -1,6 +1,13 @@ -27,28c27,28 -< if (n % 3 == 0) ???; -< if (n % 5 == 0) ???; ---- -> if (n % 3 == 0) continue; -> if (n % 5 == 0) continue; +--- exercises/013_while3.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/013_while3.zig 2023-10-05 20:04:06.899430616 +0200 +@@ -24,8 +24,8 @@ + while (n <= 20) : (n += 1) { + // The '%' symbol is the "modulo" operator and it + // returns the remainder after division. +- if (n % 3 == 0) ???; +- if (n % 5 == 0) ???; ++ if (n % 3 == 0) continue; ++ if (n % 5 == 0) continue; + std.debug.print("{} ", .{n}); + } + diff --git a/patches/patches/014_while4.patch b/patches/patches/014_while4.patch index fb67587..eca4ccf 100644 --- a/patches/patches/014_while4.patch +++ b/patches/patches/014_while4.patch @@ -1,4 +1,11 @@ -21c21 -< if (???) ???; ---- -> if (n == 4) break; +--- exercises/014_while4.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/014_while4.zig 2023-10-05 20:04:06.906097406 +0200 +@@ -18,7 +18,7 @@ + // Oh dear! This while loop will go forever?! + // Please fix this so the print statement below gives the desired output. + while (true) : (n += 1) { +- if (???) ???; ++ if (n == 4) break; + } + + // Result: we want n=4 diff --git a/patches/patches/015_for.patch b/patches/patches/015_for.patch index e937221..bea2457 100644 --- a/patches/patches/015_for.patch +++ b/patches/patches/015_for.patch @@ -1,4 +1,11 @@ -18c18 -< for (???) |???| { ---- -> for (story) |scene| { +--- exercises/015_for.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/015_for.zig 2023-10-05 20:04:06.909430803 +0200 +@@ -15,7 +15,7 @@ + + std.debug.print("A Dramatic Story: ", .{}); + +- for (???) |???| { ++ for (story) |scene| { + if (scene == 'h') std.debug.print(":-) ", .{}); + if (scene == 's') std.debug.print(":-( ", .{}); + if (scene == 'n') std.debug.print(":-| ", .{}); diff --git a/patches/patches/016_for2.patch b/patches/patches/016_for2.patch index bdbfc7d..458c6ce 100644 --- a/patches/patches/016_for2.patch +++ b/patches/patches/016_for2.patch @@ -1,4 +1,11 @@ -28c28 -< for (bits, ???) |bit, ???| { ---- -> for (bits, 0..) |bit, i| { +--- exercises/016_for2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/016_for2.zig 2023-10-05 20:04:06.912764197 +0200 +@@ -25,7 +25,7 @@ + // the value of the place as a power of two for each bit. + // + // See if you can figure out the missing pieces: +- for (bits, ???) |bit, ???| { ++ for (bits, 0..) |bit, i| { + // Note that we convert the usize i to a u32 with + // @intCast(), a builtin function just like @import(). + // We'll learn about these properly in a later exercise. diff --git a/patches/patches/017_quiz2.patch b/patches/patches/017_quiz2.patch index b46dab6..2547ff1 100644 --- a/patches/patches/017_quiz2.patch +++ b/patches/patches/017_quiz2.patch @@ -1,16 +1,25 @@ -12c12 -< const std = import standard library; ---- -> const std = @import("std"); -14c14 -< function main() void { ---- -> pub fn main() void { -19c19 -< ??? (i <= stop_at) : (i += 1) { ---- -> while (i <= stop_at) : (i += 1) { -23c23 -< std.debug.print("{}", .{???}); ---- -> std.debug.print("{}", .{i}); +--- exercises/017_quiz2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/017_quiz2.zig 2023-10-05 20:04:06.919430989 +0200 +@@ -9,18 +9,18 @@ + // Let's go from 1 to 16. This has been started for you, but there + // are some problems. :-( + // +-const std = import standard library; ++const std = @import("std"); + +-function main() void { ++pub fn main() void { + var i: u8 = 1; + const stop_at: u8 = 16; + + // What kind of loop is this? A 'for' or a 'while'? +- ??? (i <= stop_at) : (i += 1) { ++ while (i <= stop_at) : (i += 1) { + if (i % 3 == 0) std.debug.print("Fizz", .{}); + if (i % 5 == 0) std.debug.print("Buzz", .{}); + if (!(i % 3 == 0) and !(i % 5 == 0)) { +- std.debug.print("{}", .{???}); ++ std.debug.print("{}", .{i}); + } + std.debug.print(", ", .{}); + } diff --git a/patches/patches/018_functions.patch b/patches/patches/018_functions.patch index 1083a1a..55b7268 100644 --- a/patches/patches/018_functions.patch +++ b/patches/patches/018_functions.patch @@ -1,4 +1,10 @@ -28c28 -< ??? deepThought() ??? { ---- -> fn deepThought() u8 { +--- exercises/018_functions.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/018_functions.zig 2023-10-05 20:04:06.922764386 +0200 +@@ -25,6 +25,6 @@ + // We're just missing a couple things. One thing we're NOT missing is the + // keyword "pub", which is not needed here. Can you guess why? + // +-??? deepThought() ??? { ++fn deepThought() u8 { + return 42; // Number courtesy Douglas Adams + } diff --git a/patches/patches/019_functions2.patch b/patches/patches/019_functions2.patch index 254889a..9be1095 100644 --- a/patches/patches/019_functions2.patch +++ b/patches/patches/019_functions2.patch @@ -1,4 +1,11 @@ -25c25 -< fn twoToThe(???) u32 { ---- -> fn twoToThe(my_number: u32) u32 { +--- exercises/019_functions2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/019_functions2.zig 2023-10-05 20:04:06.926097780 +0200 +@@ -22,7 +22,7 @@ + // You'll need to figure out the parameter name and type that we're + // expecting. The output type has already been specified for you. + // +-fn twoToThe(???) u32 { ++fn twoToThe(my_number: u32) u32 { + return std.math.pow(u32, 2, my_number); + // std.math.pow(type, a, b) takes a numeric type and two + // numbers of that type (or that can coerce to that type) and diff --git a/patches/patches/020_quiz3.patch b/patches/patches/020_quiz3.patch index 6a00d31..e69f320 100644 --- a/patches/patches/020_quiz3.patch +++ b/patches/patches/020_quiz3.patch @@ -1,18 +1,30 @@ -24,25c24,25 -< fn printPowersOfTwo(numbers: [4]u16) ??? { -< loop (numbers) |n| { ---- -> fn printPowersOfTwo(numbers: [4]u16) void { -> for (numbers) |n| { -34c34 -< fn twoToThe(number: u16) ??? { ---- -> fn twoToThe(number: u16) u16 { -38c38 -< loop (n < number) : (n += 1) { ---- -> while (n < number) : (n += 1) { -42c42 -< return ???; ---- -> return total; +--- exercises/020_quiz3.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/020_quiz3.zig 2023-10-05 20:04:06.932764573 +0200 +@@ -21,8 +21,8 @@ + // + // This function prints, but does not return anything. + // +-fn printPowersOfTwo(numbers: [4]u16) ??? { +- loop (numbers) |n| { ++fn printPowersOfTwo(numbers: [4]u16) void { ++ for (numbers) |n| { + std.debug.print("{} ", .{twoToThe(n)}); + } + } +@@ -31,13 +31,13 @@ + // exercise. But don't be fooled! This one does the math without the aid + // of the standard library! + // +-fn twoToThe(number: u16) ??? { ++fn twoToThe(number: u16) u16 { + var n: u16 = 0; + var total: u16 = 1; + +- loop (n < number) : (n += 1) { ++ while (n < number) : (n += 1) { + total *= 2; + } + +- return ???; ++ return total; + } diff --git a/patches/patches/021_errors.patch b/patches/patches/021_errors.patch index b37b3c8..518cdde 100644 --- a/patches/patches/021_errors.patch +++ b/patches/patches/021_errors.patch @@ -1,8 +1,20 @@ -12c12 -< ???, ---- -> TooSmall, -29c29 -< if (???) { ---- -> if (number_error == MyNumberError.TooSmall) { +--- exercises/021_errors.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/021_errors.zig 2023-10-05 20:04:06.936097967 +0200 +@@ -9,7 +9,7 @@ + // "TooSmall". Please add it where needed! + const MyNumberError = error{ + TooBig, +- ???, ++ TooSmall, + TooFour, + }; + +@@ -26,7 +26,7 @@ + if (number_error == MyNumberError.TooBig) { + std.debug.print(">4. ", .{}); + } +- if (???) { ++ if (number_error == MyNumberError.TooSmall) { + std.debug.print("<4. ", .{}); + } + if (number_error == MyNumberError.TooFour) { diff --git a/patches/patches/022_errors2.patch b/patches/patches/022_errors2.patch index 0501159..cc05b39 100644 --- a/patches/patches/022_errors2.patch +++ b/patches/patches/022_errors2.patch @@ -1,4 +1,11 @@ -22c22 -< var my_number: ??? = 5; ---- -> var my_number: MyNumberError!u8 = 5; +--- exercises/022_errors2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/022_errors2.zig 2023-10-05 20:04:06.939431363 +0200 +@@ -19,7 +19,7 @@ + const MyNumberError = error{TooSmall}; + + pub fn main() void { +- var my_number: ??? = 5; ++ var my_number: MyNumberError!u8 = 5; + + // Looks like my_number will need to either store a number OR + // an error. Can you set the type correctly above? diff --git a/patches/patches/023_errors3.patch b/patches/patches/023_errors3.patch index 9068e4a..6778d1b 100644 --- a/patches/patches/023_errors3.patch +++ b/patches/patches/023_errors3.patch @@ -1,8 +1,19 @@ -15c15 -< const b: u32 = addTwenty(4) ??? 22; ---- -> const b: u32 = addTwenty(4) catch 22; -22c22 -< fn addTwenty(n: u32) ??? { ---- -> fn addTwenty(n: u32) MyNumberError!u32 { +--- exercises/023_errors3.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/023_errors3.zig 2023-10-05 20:04:06.946098156 +0200 +@@ -12,14 +12,14 @@ + + pub fn main() void { + const a: u32 = addTwenty(44) catch 22; +- const b: u32 = addTwenty(4) ??? 22; ++ const b: u32 = addTwenty(4) catch 22; + + std.debug.print("a={}, b={}\n", .{ a, b }); + } + + // Please provide the return type from this function. + // Hint: it'll be an error union. +-fn addTwenty(n: u32) ??? { ++fn addTwenty(n: u32) MyNumberError!u32 { + if (n < 5) { + return MyNumberError.TooSmall; + } else { diff --git a/patches/patches/024_errors4.patch b/patches/patches/024_errors4.patch index 48e0821..6753d92 100644 --- a/patches/patches/024_errors4.patch +++ b/patches/patches/024_errors4.patch @@ -1,10 +1,17 @@ -62c62,68 -< return detectProblems(n) ???; ---- -> return detectProblems(n) catch |err| { -> if (err == MyNumberError.TooSmall) { -> return 10; -> } -> -> return err; -> }; +--- exercises/024_errors4.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/024_errors4.zig 2023-10-05 20:04:06.949431550 +0200 +@@ -59,7 +59,13 @@ + // If we get a TooSmall error, we should return 10. + // If we get any other error, we should return that error. + // Otherwise, we return the u32 number. +- return detectProblems(n) ???; ++ return detectProblems(n) catch |err| { ++ if (err == MyNumberError.TooSmall) { ++ return 10; ++ } ++ ++ return err; ++ }; + } + + fn detectProblems(n: u32) MyNumberError!u32 { diff --git a/patches/patches/025_errors5.patch b/patches/patches/025_errors5.patch index 8aa59d4..4495ed6 100644 --- a/patches/patches/025_errors5.patch +++ b/patches/patches/025_errors5.patch @@ -1,4 +1,11 @@ -29c29 -< var x = detect(n); ---- -> var x = try detect(n); +--- exercises/025_errors5.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/025_errors5.zig 2023-10-05 20:04:06.952764946 +0200 +@@ -26,7 +26,7 @@ + // This function needs to return any error which might come back from detect(). + // Please use a "try" statement rather than a "catch". + // +- var x = detect(n); ++ var x = try detect(n); + + return x + 5; + } diff --git a/patches/patches/026_hello2.patch b/patches/patches/026_hello2.patch index e97a7b5..f0224a1 100644 --- a/patches/patches/026_hello2.patch +++ b/patches/patches/026_hello2.patch @@ -1,4 +1,9 @@ -26c26 -< stdout.print("Hello world!\n", .{}); ---- -> try stdout.print("Hello world!\n", .{}); +--- exercises/026_hello2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/026_hello2.zig 2023-10-05 20:04:06.959431737 +0200 +@@ -23,5 +23,5 @@ + // to be able to pass it up as a return value of main(). + // + // We just learned of a single statement which can accomplish this. +- stdout.print("Hello world!\n", .{}); ++ try stdout.print("Hello world!\n", .{}); + } diff --git a/patches/patches/027_defer.patch b/patches/patches/027_defer.patch index 6ff7f98..6abec5b 100644 --- a/patches/patches/027_defer.patch +++ b/patches/patches/027_defer.patch @@ -1,4 +1,10 @@ -23c23 -< std.debug.print("Two\n", .{}); ---- -> defer std.debug.print("Two\n", .{}); +--- exercises/027_defer.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/027_defer.zig 2023-10-05 20:04:06.962765133 +0200 +@@ -20,6 +20,6 @@ + pub fn main() void { + // Without changing anything else, please add a 'defer' statement + // to this code so that our program prints "One Two\n": +- std.debug.print("Two\n", .{}); ++ defer std.debug.print("Two\n", .{}); + std.debug.print("One ", .{}); + } diff --git a/patches/patches/028_defer2.patch b/patches/patches/028_defer2.patch index 14caf8b..f09b1e5 100644 --- a/patches/patches/028_defer2.patch +++ b/patches/patches/028_defer2.patch @@ -1,4 +1,11 @@ -21c21 -< std.debug.print(") ", .{}); // <---- how?! ---- -> defer std.debug.print(") ", .{}); // <---- how?! +--- exercises/028_defer2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/028_defer2.zig 2023-10-05 20:04:06.966098530 +0200 +@@ -18,7 +18,7 @@ + fn printAnimal(animal: u8) void { + std.debug.print("(", .{}); + +- std.debug.print(") ", .{}); // <---- how?! ++ defer std.debug.print(") ", .{}); // <---- how?! + + if (animal == 'g') { + std.debug.print("Goat", .{}); diff --git a/patches/patches/029_errdefer.patch b/patches/patches/029_errdefer.patch index aa42279..e147027 100644 --- a/patches/patches/029_errdefer.patch +++ b/patches/patches/029_errdefer.patch @@ -1,4 +1,11 @@ -35c35 -< std.debug.print("failed!\n", .{}); ---- -> errdefer std.debug.print("failed!\n", .{}); +--- exercises/029_errdefer.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/029_errdefer.zig 2023-10-05 20:04:06.972765320 +0200 +@@ -32,7 +32,7 @@ + + // Please make the "failed" message print ONLY if the makeNumber() + // function exits with an error: +- std.debug.print("failed!\n", .{}); ++ errdefer std.debug.print("failed!\n", .{}); + + var num = try getNumber(); // <-- This could fail! + diff --git a/patches/patches/030_switch.patch b/patches/patches/030_switch.patch index 05cbe1a..69c683e 100644 --- a/patches/patches/030_switch.patch +++ b/patches/patches/030_switch.patch @@ -1,2 +1,10 @@ -48a49 -> else => std.debug.print("?", .{}), +--- exercises/030_switch.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/030_switch.zig 2023-10-05 20:04:06.976098717 +0200 +@@ -46,6 +46,7 @@ + // match for every possible value). Please add an "else" + // to this switch to print a question mark "?" when c is + // not one of the existing matches. ++ else => std.debug.print("?", .{}), + } + } + diff --git a/patches/patches/031_switch2.patch b/patches/patches/031_switch2.patch index f786762..4bac7cc 100644 --- a/patches/patches/031_switch2.patch +++ b/patches/patches/031_switch2.patch @@ -1,2 +1,10 @@ -33a34 -> else => '!', +--- exercises/031_switch2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/031_switch2.zig 2023-10-05 20:04:06.979432113 +0200 +@@ -31,6 +31,7 @@ + 26 => 'Z', + // As in the last exercise, please add the 'else' clause + // and this time, have it return an exclamation mark '!'. ++ else => '!', + }; + + std.debug.print("{c}", .{real_char}); diff --git a/patches/patches/032_unreachable.patch b/patches/patches/032_unreachable.patch index 0883932..bab0e50 100644 --- a/patches/patches/032_unreachable.patch +++ b/patches/patches/032_unreachable.patch @@ -1,2 +1,10 @@ -37a38 -> else => unreachable, +--- exercises/032_unreachable.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/032_unreachable.zig 2023-10-05 20:04:06.986098904 +0200 +@@ -35,6 +35,7 @@ + 3 => { + current_value *= current_value; + }, ++ else => unreachable, + } + + std.debug.print("{} ", .{current_value}); diff --git a/patches/patches/033_iferror.patch b/patches/patches/033_iferror.patch index 8433e8a..eb7ec98 100644 --- a/patches/patches/033_iferror.patch +++ b/patches/patches/033_iferror.patch @@ -1,2 +1,10 @@ -41a42 -> MyNumberError.TooSmall => std.debug.print("<4. ", .{}), +--- exercises/033_iferror.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/033_iferror.zig 2023-10-05 20:04:06.989432300 +0200 +@@ -39,6 +39,7 @@ + std.debug.print("={}. ", .{value}); + } else |err| switch (err) { + MyNumberError.TooBig => std.debug.print(">4. ", .{}), ++ MyNumberError.TooSmall => std.debug.print("<4. ", .{}), + // Please add a match for TooSmall here and have it print: "<4. " + } + } diff --git a/patches/patches/034_quiz4.patch b/patches/patches/034_quiz4.patch index b259352..8c0bc0e 100644 --- a/patches/patches/034_quiz4.patch +++ b/patches/patches/034_quiz4.patch @@ -1,8 +1,15 @@ -12c12 -< pub fn main() void { ---- -> pub fn main() !void { -15c15 -< const my_num: u32 = getNumber(); ---- -> const my_num: u32 = try getNumber(); +--- exercises/034_quiz4.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/034_quiz4.zig 2023-10-05 20:04:06.996099091 +0200 +@@ -9,10 +9,10 @@ + + const NumError = error{IllegalNumber}; + +-pub fn main() void { ++pub fn main() !void { + const stdout = std.io.getStdOut().writer(); + +- const my_num: u32 = getNumber(); ++ const my_num: u32 = try getNumber(); + + try stdout.print("my_num={}\n", .{my_num}); + } diff --git a/patches/patches/035_enums.patch b/patches/patches/035_enums.patch index ed2344b..4514a14 100644 --- a/patches/patches/035_enums.patch +++ b/patches/patches/035_enums.patch @@ -1,4 +1,11 @@ -23c23 -< const Ops = enum { ??? }; ---- -> const Ops = enum { dec, inc, pow }; +--- exercises/035_enums.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/035_enums.zig 2023-10-05 20:04:06.999432487 +0200 +@@ -20,7 +20,7 @@ + const std = @import("std"); + + // Please complete the enum! +-const Ops = enum { ??? }; ++const Ops = enum { dec, inc, pow }; + + pub fn main() void { + const operations = [_]Ops{ diff --git a/patches/patches/036_enums2.patch b/patches/patches/036_enums2.patch index 367b780..b8855c3 100644 --- a/patches/patches/036_enums2.patch +++ b/patches/patches/036_enums2.patch @@ -1,12 +1,26 @@ -34c34 -< blue = ???, ---- -> blue = 0x0000ff, -56c56 -< \\ Blue ---- -> \\ Blue -62c62 -< @intFromEnum(???), // Oops! We're missing something! ---- -> @intFromEnum(Color.blue), // Oops! We're missing something! +--- exercises/036_enums2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/036_enums2.zig 2023-10-05 20:04:07.002765884 +0200 +@@ -31,7 +31,7 @@ + const Color = enum(u32) { + red = 0xff0000, + green = 0x00ff00, +- blue = ???, ++ blue = 0x0000ff, + }; + + pub fn main() void { +@@ -53,12 +53,12 @@ + \\
+ \\ Red + \\ Green +- \\ Blue ++ \\ Blue + \\
+ \\ + , .{ + @intFromEnum(Color.red), + @intFromEnum(Color.green), +- @intFromEnum(???), // Oops! We're missing something! ++ @intFromEnum(Color.blue), // Oops! We're missing something! + }); + } diff --git a/patches/patches/037_structs.patch b/patches/patches/037_structs.patch index c26510d..7edad0f 100644 --- a/patches/patches/037_structs.patch +++ b/patches/patches/037_structs.patch @@ -1,4 +1,18 @@ -38a39 -> health: u8, -46a48 -> .health = 100, +--- exercises/037_structs.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/037_structs.zig 2023-10-05 20:04:07.009432674 +0200 +@@ -36,6 +36,7 @@ + role: Role, + gold: u32, + experience: u32, ++ health: u8, + }; + + pub fn main() void { +@@ -44,6 +45,7 @@ + .role = Role.wizard, + .gold = 20, + .experience = 10, ++ .health = 100, + }; + + // Glorp gains some gold. diff --git a/patches/patches/038_structs2.patch b/patches/patches/038_structs2.patch index 7d85de0..456fbff 100644 --- a/patches/patches/038_structs2.patch +++ b/patches/patches/038_structs2.patch @@ -1,7 +1,15 @@ -44a45,50 -> chars[1] = Character{ -> .role = Role.bard, -> .gold = 10, -> .health = 100, -> .experience = 20, -> }; +--- exercises/038_structs2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/038_structs2.zig 2023-10-05 20:04:07.012766070 +0200 +@@ -42,6 +42,12 @@ + // + // Feel free to run this program without adding Zump. What does + // it do and why? ++ chars[1] = Character{ ++ .role = Role.bard, ++ .gold = 10, ++ .health = 100, ++ .experience = 20, ++ }; + + // Printing all RPG characters in a loop: + for (chars, 0..) |c, num| { diff --git a/patches/patches/039_pointers.patch b/patches/patches/039_pointers.patch index 57d67e5..7d75237 100644 --- a/patches/patches/039_pointers.patch +++ b/patches/patches/039_pointers.patch @@ -1,4 +1,11 @@ -33c33 -< num2 = ???; ---- -> num2 = num1_pointer.*; +--- exercises/039_pointers.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/039_pointers.zig 2023-10-05 20:04:07.016099467 +0200 +@@ -30,7 +30,7 @@ + + // Please make num2 equal 5 using num1_pointer! + // (See the "cheatsheet" above for ideas.) +- num2 = ???; ++ num2 = num1_pointer.*; + + std.debug.print("num1: {}, num2: {}\n", .{ num1, num2 }); + } diff --git a/patches/patches/040_pointers2.patch b/patches/patches/040_pointers2.patch index 87291c3..acdd619 100644 --- a/patches/patches/040_pointers2.patch +++ b/patches/patches/040_pointers2.patch @@ -1,4 +1,11 @@ -26c26 -< const b: *u8 = &a; // fix this! ---- -> const b: *const u8 = &a; // fix this! +--- exercises/040_pointers2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/040_pointers2.zig 2023-10-05 20:04:07.022766257 +0200 +@@ -23,7 +23,7 @@ + + pub fn main() void { + const a: u8 = 12; +- const b: *u8 = &a; // fix this! ++ const b: *const u8 = &a; // fix this! + + std.debug.print("a: {}, b: {}\n", .{ a, b.* }); + } diff --git a/patches/patches/041_pointers3.patch b/patches/patches/041_pointers3.patch index 02f7744..63a5661 100644 --- a/patches/patches/041_pointers3.patch +++ b/patches/patches/041_pointers3.patch @@ -1,4 +1,11 @@ -34c34 -< ??? p: ??? = undefined; ---- -> var p: *u8 = undefined; +--- exercises/041_pointers3.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/041_pointers3.zig 2023-10-05 20:04:07.026099654 +0200 +@@ -31,7 +31,7 @@ + + // Please define pointer "p" so that it can point to EITHER foo or + // bar AND change the value it points to! +- ??? p: ??? = undefined; ++ var p: *u8 = undefined; + + p = &foo; + p.* += 1; diff --git a/patches/patches/042_pointers4.patch b/patches/patches/042_pointers4.patch index 8e21b81..544cc97 100644 --- a/patches/patches/042_pointers4.patch +++ b/patches/patches/042_pointers4.patch @@ -1,4 +1,9 @@ -40c40 -< ??? = 5; // fix me! ---- -> x.* = 5; // fix me! +--- exercises/042_pointers4.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/042_pointers4.zig 2023-10-05 20:04:07.032766444 +0200 +@@ -37,5 +37,5 @@ + // This function should take a reference to a u8 value and set it + // to 5. + fn makeFive(x: *u8) void { +- ??? = 5; // fix me! ++ x.* = 5; // fix me! + } diff --git a/patches/patches/043_pointers5.patch b/patches/patches/043_pointers5.patch index ac6a8ca..beb3d38 100644 --- a/patches/patches/043_pointers5.patch +++ b/patches/patches/043_pointers5.patch @@ -1,4 +1,11 @@ -71c71 -< printCharacter(???); ---- -> printCharacter(&glorp); +--- exercises/043_pointers5.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/043_pointers5.zig 2023-10-05 20:04:07.036099841 +0200 +@@ -68,7 +68,7 @@ + + // FIX ME! + // Please pass Glorp to printCharacter(): +- printCharacter(???); ++ printCharacter(&glorp); + } + + // Note how this function's "c" parameter is a pointer to a Character struct. diff --git a/patches/patches/044_quiz5.patch b/patches/patches/044_quiz5.patch index 44d4451..0fd42cf 100644 --- a/patches/patches/044_quiz5.patch +++ b/patches/patches/044_quiz5.patch @@ -1,4 +1,17 @@ -21a22 -> var elephantB = Elephant{ .letter = 'B' }; -27a29 -> elephantB.tail = &elephantC; +--- exercises/044_quiz5.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/044_quiz5.zig 2023-10-05 20:04:07.039433235 +0200 +@@ -19,12 +19,14 @@ + pub fn main() void { + var elephantA = Elephant{ .letter = 'A' }; + // (Please add Elephant B here!) ++ var elephantB = Elephant{ .letter = 'B' }; + var elephantC = Elephant{ .letter = 'C' }; + + // Link the elephants so that each tail "points" to the next elephant. + // They make a circle: A->B->C->A... + elephantA.tail = &elephantB; + // (Please link Elephant B's tail to Elephant C here!) ++ elephantB.tail = &elephantC; + elephantC.tail = &elephantA; + + visitElephants(&elephantA); diff --git a/patches/patches/045_optionals.patch b/patches/patches/045_optionals.patch index f1b9ddd..e7c70c2 100644 --- a/patches/patches/045_optionals.patch +++ b/patches/patches/045_optionals.patch @@ -1,4 +1,11 @@ -32c32 -< const answer: u8 = result; ---- -> const answer: u8 = result orelse 42; +--- exercises/045_optionals.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/045_optionals.zig 2023-10-05 20:04:07.046100027 +0200 +@@ -29,7 +29,7 @@ + + // Please threaten the result so that answer is either the + // integer value from deepThought() OR the number 42: +- const answer: u8 = result; ++ const answer: u8 = result orelse 42; + + std.debug.print("The Ultimate Answer: {}.\n", .{answer}); + } diff --git a/patches/patches/046_optionals2.patch b/patches/patches/046_optionals2.patch index 89fa604..66912eb 100644 --- a/patches/patches/046_optionals2.patch +++ b/patches/patches/046_optionals2.patch @@ -1,8 +1,20 @@ -24c24 -< tail: *Elephant = null, // Hmm... tail needs something... ---- -> tail: ?*Elephant = null, // <---- make this optional! -54c54 -< if (e.tail == null) ???; ---- -> if (e.tail == null) break; +--- exercises/046_optionals2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/046_optionals2.zig 2023-10-05 20:04:07.049433424 +0200 +@@ -21,7 +21,7 @@ + + const Elephant = struct { + letter: u8, +- tail: *Elephant = null, // Hmm... tail needs something... ++ tail: ?*Elephant = null, // <---- make this optional! + visited: bool = false, + }; + +@@ -51,7 +51,7 @@ + // We should stop once we encounter a tail that + // does NOT point to another element. What can + // we put here to make that happen? +- if (e.tail == null) ???; ++ if (e.tail == null) break; + + e = e.tail.?; + } diff --git a/patches/patches/047_methods.patch b/patches/patches/047_methods.patch index c64f657..a7e8a26 100644 --- a/patches/patches/047_methods.patch +++ b/patches/patches/047_methods.patch @@ -1,4 +1,11 @@ -91c91 -< ???.zap(???); ---- -> heat_ray.zap(alien); +--- exercises/047_methods.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/047_methods.zig 2023-10-05 20:04:07.056100214 +0200 +@@ -88,7 +88,7 @@ + for (&aliens) |*alien| { + + // *** Zap the alien with the heat ray here! *** +- ???.zap(???); ++ heat_ray.zap(alien); + + // If the alien's health is still above 0, it's still alive. + if (alien.health > 0) aliens_alive += 1; diff --git a/patches/patches/048_methods2.patch b/patches/patches/048_methods2.patch index cd1b5d0..b784657 100644 --- a/patches/patches/048_methods2.patch +++ b/patches/patches/048_methods2.patch @@ -1,4 +1,11 @@ -57c57 -< e = if (e.hasTail()) e.??? else break; ---- -> e = if (e.hasTail()) e.getTail() else break; +--- exercises/048_methods2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/048_methods2.zig 2023-10-05 20:04:07.059433611 +0200 +@@ -54,7 +54,7 @@ + + // This gets the next elephant or stops: + // which method do we want here? +- e = if (e.hasTail()) e.??? else break; ++ e = if (e.hasTail()) e.getTail() else break; + } + } + diff --git a/patches/patches/049_quiz6.patch b/patches/patches/049_quiz6.patch index 83f9faf..0c7bbc3 100644 --- a/patches/patches/049_quiz6.patch +++ b/patches/patches/049_quiz6.patch @@ -1,11 +1,18 @@ -28a29,31 -> pub fn getTrunk(self: *Elephant) *Elephant { -> return self.trunk.?; -> } -30,31c33,35 -< ??? -< ---- -> pub fn hasTrunk(self: *Elephant) bool { -> return (self.trunk != null); -> } +--- exercises/049_quiz6.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/049_quiz6.zig 2023-10-05 20:04:07.062767005 +0200 +@@ -26,9 +26,13 @@ + + // Your Elephant trunk methods go here! + // --------------------------------------------------- ++ pub fn getTrunk(self: *Elephant) *Elephant { ++ return self.trunk.?; ++ } + +- ??? +- ++ pub fn hasTrunk(self: *Elephant) bool { ++ return (self.trunk != null); ++ } + // --------------------------------------------------- + + pub fn visit(self: *Elephant) void { diff --git a/patches/patches/050_no_value.patch b/patches/patches/050_no_value.patch index 7ea4e9e..276f93f 100644 --- a/patches/patches/050_no_value.patch +++ b/patches/patches/050_no_value.patch @@ -1,14 +1,26 @@ -68c68 -< var first_line1: *const [16]u8 = ???; ---- -> var first_line1: *const [16]u8 = undefined; -71c71 -< var first_line2: Err!*const [21]u8 = ???; ---- -> var first_line2: Err!*const [21]u8 = Err.Cthulhu; -80,81c80,81 -< fn printSecondLine() ??? { -< var second_line2: ?*const [18]u8 = ???; ---- -> fn printSecondLine() void { -> var second_line2: ?*const [18]u8 = null; +--- exercises/050_no_value.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/050_no_value.zig 2023-10-05 20:04:07.069433797 +0200 +@@ -65,10 +65,10 @@ + const Err = error{Cthulhu}; + + pub fn main() void { +- var first_line1: *const [16]u8 = ???; ++ var first_line1: *const [16]u8 = undefined; + first_line1 = "That is not dead"; + +- var first_line2: Err!*const [21]u8 = ???; ++ var first_line2: Err!*const [21]u8 = Err.Cthulhu; + first_line2 = "which can eternal lie"; + + // Note we need the "{!s}" format for the error union string. +@@ -77,8 +77,8 @@ + printSecondLine(); + } + +-fn printSecondLine() ??? { +- var second_line2: ?*const [18]u8 = ???; ++fn printSecondLine() void { ++ var second_line2: ?*const [18]u8 = null; + second_line2 = "even death may die"; + + std.debug.print("And with strange aeons {s}.\n", .{second_line2.?}); diff --git a/patches/patches/051_values.patch b/patches/patches/051_values.patch index 03dfc88..bb65525 100644 --- a/patches/patches/051_values.patch +++ b/patches/patches/051_values.patch @@ -1,12 +1,27 @@ -90c90 -< const print = ???; ---- -> const print = std.debug.print; -155c155 -< levelUp(glorp, reward_xp); ---- -> levelUp(&glorp, reward_xp); -161c161 -< fn levelUp(character_access: Character, xp: u32) void { ---- -> fn levelUp(character_access: *Character, xp: u32) void { +--- exercises/051_values.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/051_values.zig 2023-10-05 20:04:07.072767194 +0200 +@@ -87,7 +87,7 @@ + // Let's assign the std.debug.print function to a const named + // "print" so that we can use this new name later! + +- const print = ???; ++ const print = std.debug.print; + + // Now let's look at assigning and pointing to values in Zig. + // +@@ -152,13 +152,13 @@ + print("XP before:{}, ", .{glorp.experience}); + + // Fix 1 of 2 goes here: +- levelUp(glorp, reward_xp); ++ levelUp(&glorp, reward_xp); + + print("after:{}.\n", .{glorp.experience}); + } + + // Fix 2 of 2 goes here: +-fn levelUp(character_access: Character, xp: u32) void { ++fn levelUp(character_access: *Character, xp: u32) void { + character_access.experience += xp; + } + diff --git a/patches/patches/052_slices.patch b/patches/patches/052_slices.patch index 24803d7..e38d955 100644 --- a/patches/patches/052_slices.patch +++ b/patches/patches/052_slices.patch @@ -1,10 +1,22 @@ -35,36c35,36 -< const hand1: []u8 = cards[???]; -< const hand2: []u8 = cards[???]; ---- -> const hand1: []u8 = cards[0..4]; -> const hand2: []u8 = cards[4..]; -46c46 -< fn printHand(hand: ???) void { ---- -> fn printHand(hand: []u8) void { +--- exercises/052_slices.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/052_slices.zig 2023-10-05 20:04:07.079433985 +0200 +@@ -32,8 +32,8 @@ + var cards = [8]u8{ 'A', '4', 'K', '8', '5', '2', 'Q', 'J' }; + + // Please put the first 4 cards in hand1 and the rest in hand2. +- const hand1: []u8 = cards[???]; +- const hand2: []u8 = cards[???]; ++ const hand1: []u8 = cards[0..4]; ++ const hand2: []u8 = cards[4..]; + + std.debug.print("Hand1: ", .{}); + printHand(hand1); +@@ -43,7 +43,7 @@ + } + + // Please lend this function a hand. A u8 slice hand, that is. +-fn printHand(hand: ???) void { ++fn printHand(hand: []u8) void { + for (hand) |h| { + std.debug.print("{u} ", .{h}); + } diff --git a/patches/patches/053_slices2.patch b/patches/patches/053_slices2.patch index f5403a2..afad930 100644 --- a/patches/patches/053_slices2.patch +++ b/patches/patches/053_slices2.patch @@ -1,20 +1,29 @@ -20,22c20,22 -< const base1: []u8 = scrambled[15..23]; -< const base2: []u8 = scrambled[6..10]; -< const base3: []u8 = scrambled[32..]; ---- -> const base1: []const u8 = scrambled[15..23]; -> const base2: []const u8 = scrambled[6..10]; -> const base3: []const u8 = scrambled[32..]; -25,27c25,27 -< const justice1: []u8 = scrambled[11..14]; -< const justice2: []u8 = scrambled[0..5]; -< const justice3: []u8 = scrambled[24..31]; ---- -> const justice1: []const u8 = scrambled[11..14]; -> const justice2: []const u8 = scrambled[0..5]; -> const justice3: []const u8 = scrambled[24..31]; -33c33 -< fn printPhrase(part1: []u8, part2: []u8, part3: []u8) void { ---- -> fn printPhrase(part1: []const u8, part2: []const u8, part3: []const u8) void { +--- exercises/053_slices2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/053_slices2.zig 2023-10-05 20:04:07.082767381 +0200 +@@ -17,19 +17,19 @@ + pub fn main() void { + const scrambled = "great base for all your justice are belong to us"; + +- const base1: []u8 = scrambled[15..23]; +- const base2: []u8 = scrambled[6..10]; +- const base3: []u8 = scrambled[32..]; ++ const base1: []const u8 = scrambled[15..23]; ++ const base2: []const u8 = scrambled[6..10]; ++ const base3: []const u8 = scrambled[32..]; + printPhrase(base1, base2, base3); + +- const justice1: []u8 = scrambled[11..14]; +- const justice2: []u8 = scrambled[0..5]; +- const justice3: []u8 = scrambled[24..31]; ++ const justice1: []const u8 = scrambled[11..14]; ++ const justice2: []const u8 = scrambled[0..5]; ++ const justice3: []const u8 = scrambled[24..31]; + printPhrase(justice1, justice2, justice3); + + std.debug.print("\n", .{}); + } + +-fn printPhrase(part1: []u8, part2: []u8, part3: []u8) void { ++fn printPhrase(part1: []const u8, part2: []const u8, part3: []const u8) void { + std.debug.print("'{s} {s} {s}.' ", .{ part1, part2, part3 }); + } diff --git a/patches/patches/054_manypointers.patch b/patches/patches/054_manypointers.patch index d8d2e6c..9570295 100644 --- a/patches/patches/054_manypointers.patch +++ b/patches/patches/054_manypointers.patch @@ -1,4 +1,11 @@ -35c35 -< const zen12_string: []const u8 = zen_manyptr; ---- -> const zen12_string: []const u8 = zen_manyptr[0..21]; +--- exercises/054_manypointers.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/054_manypointers.zig 2023-10-05 20:04:07.086100775 +0200 +@@ -32,7 +32,7 @@ + // we can CONVERT IT TO A SLICE. (Hint: we do know the length!) + // + // Please fix this line so the print statement below can print it: +- const zen12_string: []const u8 = zen_manyptr; ++ const zen12_string: []const u8 = zen_manyptr[0..21]; + + // Here's the moment of truth! + std.debug.print("{s}\n", .{zen12_string}); diff --git a/patches/patches/055_unions.patch b/patches/patches/055_unions.patch index c362f20..7c4cfa2 100644 --- a/patches/patches/055_unions.patch +++ b/patches/patches/055_unions.patch @@ -1,6 +1,13 @@ -62,63c62,63 -< printInsect(ant, AntOrBee.c); -< printInsect(bee, AntOrBee.c); ---- -> printInsect(ant, AntOrBee.a); -> printInsect(bee, AntOrBee.b); +--- exercises/055_unions.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/055_unions.zig 2023-10-05 20:04:07.092767568 +0200 +@@ -59,8 +59,8 @@ + std.debug.print("Insect report! ", .{}); + + // Oops! We've made a mistake here. +- printInsect(ant, AntOrBee.c); +- printInsect(bee, AntOrBee.c); ++ printInsect(ant, AntOrBee.a); ++ printInsect(bee, AntOrBee.b); + + std.debug.print("\n", .{}); + } diff --git a/patches/patches/056_unions2.patch b/patches/patches/056_unions2.patch index 7341f7a..3423ccf 100644 --- a/patches/patches/056_unions2.patch +++ b/patches/patches/056_unions2.patch @@ -1,10 +1,20 @@ -47,48c47,48 -< printInsect(???); -< printInsect(???); ---- -> printInsect(ant); -> printInsect(bee); -54c54 -< switch (???) { ---- -> switch (insect) { +--- exercises/056_unions2.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/056_unions2.zig 2023-10-05 20:04:07.096100965 +0200 +@@ -44,14 +44,14 @@ + std.debug.print("Insect report! ", .{}); + + // Could it really be as simple as just passing the union? +- printInsect(???); +- printInsect(???); ++ printInsect(ant); ++ printInsect(bee); + + std.debug.print("\n", .{}); + } + + fn printInsect(insect: Insect) void { +- switch (???) { ++ switch (insect) { + .still_alive => |a| std.debug.print("Ant alive is: {}. ", .{a}), + .flowers_visited => |f| std.debug.print("Bee visited {} flowers. ", .{f}), + } diff --git a/patches/patches/057_unions3.patch b/patches/patches/057_unions3.patch index 17e27a2..b0ba833 100644 --- a/patches/patches/057_unions3.patch +++ b/patches/patches/057_unions3.patch @@ -1,4 +1,11 @@ -18c18 -< const Insect = union(InsectStat) { ---- -> const Insect = union(enum) { +--- exercises/057_unions3.zig 2023-10-03 22:15:22.122241138 +0200 ++++ answers/057_unions3.zig 2023-10-05 20:04:07.099434359 +0200 +@@ -15,7 +15,7 @@ + // + const std = @import("std"); + +-const Insect = union(InsectStat) { ++const Insect = union(enum) { + flowers_visited: u16, + still_alive: bool, + }; diff --git a/patches/patches/058_quiz7.patch b/patches/patches/058_quiz7.patch index ac21352..265b9e3 100644 --- a/patches/patches/058_quiz7.patch +++ b/patches/patches/058_quiz7.patch @@ -1,14 +1,31 @@ -195,196c195,196 -< .place => print("{s}", .{p.name}), -< .path => print("--{}->", .{p.dist}), ---- -> .place => |p| print("{s}", .{p.name}), -> .path => |p| print("--{}->", .{p.dist}), -258c258 -< if (place == entry.*.?.place) return entry; ---- -> if (place == entry.*.?.place) return &entry.*.?; -312c312 -< fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) void { ---- -> fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) TripError!void { +--- exercises/058_quiz7.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/058_quiz7.zig 2023-10-05 20:04:07.106101152 +0200 +@@ -192,8 +192,8 @@ + // Oops! The hermit forgot how to capture the union values + // in a switch statement. Please capture both values as + // 'p' so the print statements work! +- .place => print("{s}", .{p.name}), +- .path => print("--{}->", .{p.dist}), ++ .place => |p| print("{s}", .{p.name}), ++ .path => |p| print("--{}->", .{p.dist}), + } + } + }; +@@ -255,7 +255,7 @@ + // dereference and optional value "unwrapping" look + // together. Remember that you return the address with the + // "&" operator. +- if (place == entry.*.?.place) return entry; ++ if (place == entry.*.?.place) return &entry.*.?; + // Try to make your answer this long:__________; + } + return null; +@@ -309,7 +309,7 @@ + // + // Looks like the hermit forgot something in the return value of + // this function. What could that be? +- fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) void { ++ fn getTripTo(self: *HermitsNotebook, trip: []?TripItem, dest: *Place) TripError!void { + // We start at the destination entry. + const destination_entry = self.getEntry(dest); + diff --git a/patches/patches/059_integers.patch b/patches/patches/059_integers.patch index c75cf8a..a00c28d 100644 --- a/patches/patches/059_integers.patch +++ b/patches/patches/059_integers.patch @@ -1,8 +1,15 @@ -23,25c23,25 -< 0o131, // octal -< 0b1101000, // binary -< 0x66, // hex ---- -> 0o132, // octal -> 0b1101001, // binary -> 0x67, // hex +--- exercises/059_integers.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/059_integers.zig 2023-10-05 20:04:07.109434546 +0200 +@@ -20,9 +20,9 @@ + + pub fn main() void { + const zig = [_]u8{ +- 0o131, // octal +- 0b1101000, // binary +- 0x66, // hex ++ 0o132, // octal ++ 0b1101001, // binary ++ 0x67, // hex + }; + + print("{s} is cool.\n", .{zig}); diff --git a/patches/patches/060_floats.patch b/patches/patches/060_floats.patch index 0cfa18e..3a130dd 100644 --- a/patches/patches/060_floats.patch +++ b/patches/patches/060_floats.patch @@ -1,4 +1,11 @@ -46c46 -< const shuttle_weight: f16 = 907.18 * 2200; ---- -> const shuttle_weight: f32 = 907.18 * 2200.0; +--- exercises/060_floats.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/060_floats.zig 2023-10-05 20:04:07.112767942 +0200 +@@ -43,7 +43,7 @@ + // + // We'll convert this weight from tons to kilograms at a + // conversion of 907.18kg to the ton. +- const shuttle_weight: f16 = 907.18 * 2200; ++ const shuttle_weight: f32 = 907.18 * 2200.0; + + // By default, float values are formatted in scientific + // notation. Try experimenting with '{d}' and '{d:.3}' to see diff --git a/patches/patches/061_coercions.patch b/patches/patches/061_coercions.patch index 4661154..0f13cca 100644 --- a/patches/patches/061_coercions.patch +++ b/patches/patches/061_coercions.patch @@ -1,4 +1,11 @@ -70c70 -< const my_letter: ??? = &letter; ---- -> const my_letter: ?*[1]u8 = &letter; +--- exercises/061_coercions.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/061_coercions.zig 2023-10-05 20:04:07.119434735 +0200 +@@ -67,7 +67,7 @@ + pub fn main() void { + var letter: u8 = 'A'; + +- const my_letter: ??? = &letter; ++ const my_letter: ?*[1]u8 = &letter; + // ^^^^^^^ + // Your type here. + // Must coerce from &letter (which is a *u8). diff --git a/patches/patches/062_loop_expressions.patch b/patches/patches/062_loop_expressions.patch index 8b33607..90d6ca9 100644 --- a/patches/patches/062_loop_expressions.patch +++ b/patches/patches/062_loop_expressions.patch @@ -1,4 +1,11 @@ -50c50 -< }; ---- -> } else null; +--- exercises/062_loop_expressions.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/062_loop_expressions.zig 2023-10-05 20:04:07.122768129 +0200 +@@ -47,7 +47,7 @@ + // return it from the for loop. + const current_lang: ?[]const u8 = for (langs) |lang| { + if (lang.len == 3) break lang; +- }; ++ } else null; + + if (current_lang) |cl| { + print("Current language: {s}\n", .{cl}); diff --git a/patches/patches/063_labels.patch b/patches/patches/063_labels.patch index 42ef9ea..0831e22 100644 --- a/patches/patches/063_labels.patch +++ b/patches/patches/063_labels.patch @@ -1,6 +1,13 @@ -131,132c131,132 -< break; -< }; ---- -> break food; -> } else menu[0]; +--- exercises/063_labels.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/063_labels.zig 2023-10-05 20:04:07.126101525 +0200 +@@ -128,8 +128,8 @@ + // wanted for this Food. + // + // Please return this Food from the loop. +- break; +- }; ++ break food; ++ } else menu[0]; + // ^ Oops! We forgot to return Mac & Cheese as the default + // Food when the requested ingredients aren't found. + diff --git a/patches/patches/064_builtins.patch b/patches/patches/064_builtins.patch index c768927..dcab3ca 100644 --- a/patches/patches/064_builtins.patch +++ b/patches/patches/064_builtins.patch @@ -1,8 +1,19 @@ -66c66 -< const expected_result: u8 = ???; ---- -> const expected_result: u8 = 0b00010010; -81c81 -< const tupni: u8 = @bitReverse(input, tupni); ---- -> const tupni: u8 = @bitReverse(input); +--- exercises/064_builtins.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/064_builtins.zig 2023-10-05 20:04:07.132768316 +0200 +@@ -63,7 +63,7 @@ + // + // If there was no overflow at all while adding 5 to a, what value would + // 'my_result' hold? Write the answer in into 'expected_result'. +- const expected_result: u8 = ???; ++ const expected_result: u8 = 0b00010010; + print(". Without overflow: {b:0>8}. ", .{expected_result}); + + print("Furthermore, ", .{}); +@@ -78,6 +78,6 @@ + // Now it's your turn. See if you can fix this attempt to use + // this builtin to reverse the bits of a u8 integer. + const input: u8 = 0b11110000; +- const tupni: u8 = @bitReverse(input, tupni); ++ const tupni: u8 = @bitReverse(input); + print("{b:0>8} backwards is {b:0>8}.\n", .{ input, tupni }); + } diff --git a/patches/patches/065_builtins2.patch b/patches/patches/065_builtins2.patch index 1b085ef..4b0ccd2 100644 --- a/patches/patches/065_builtins2.patch +++ b/patches/patches/065_builtins2.patch @@ -1,20 +1,39 @@ -61c61 -< narcissus.??? = ???; ---- -> narcissus.myself = &narcissus; -73c73 -< const Type2 = narcissus.fetchTheMostBeautifulType(); ---- -> const Type2 = Narcissus.fetchTheMostBeautifulType(); -112c112 -< if (fields[0].??? != void) { ---- -> if (fields[0].type != void) { -116c116 -< if (fields[1].??? != void) { ---- -> if (fields[1].type != void) { -120c120 -< if (fields[2].??? != void) { ---- -> if (fields[2].type != void) { +--- exercises/065_builtins2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/065_builtins2.zig 2023-10-05 20:04:07.136101712 +0200 +@@ -58,7 +58,7 @@ + // Oops! We cannot leave the 'me' and 'myself' fields + // undefined. Please set them here: + narcissus.me = &narcissus; +- narcissus.??? = ???; ++ narcissus.myself = &narcissus; + + // This determines a "peer type" from three separate + // references (they just happen to all be the same object). +@@ -70,7 +70,7 @@ + // + // The fix for this is very subtle, but it makes a big + // difference! +- const Type2 = narcissus.fetchTheMostBeautifulType(); ++ const Type2 = Narcissus.fetchTheMostBeautifulType(); + + // Now we print a pithy statement about Narcissus. + print("A {s} loves all {s}es. ", .{ +@@ -109,15 +109,15 @@ + // Please complete these 'if' statements so that the field + // name will not be printed if the field is of type 'void' + // (which is a zero-bit type that takes up no space at all!): +- if (fields[0].??? != void) { ++ if (fields[0].type != void) { + print(" {s}", .{@typeInfo(Narcissus).Struct.fields[0].name}); + } + +- if (fields[1].??? != void) { ++ if (fields[1].type != void) { + print(" {s}", .{@typeInfo(Narcissus).Struct.fields[1].name}); + } + +- if (fields[2].??? != void) { ++ if (fields[2].type != void) { + print(" {s}", .{@typeInfo(Narcissus).Struct.fields[2].name}); + } + diff --git a/patches/patches/066_comptime.patch b/patches/patches/066_comptime.patch index e7130c2..2d38ebe 100644 --- a/patches/patches/066_comptime.patch +++ b/patches/patches/066_comptime.patch @@ -1,6 +1,13 @@ -65,66c65,66 -< var var_int = 12345; -< var var_float = 987.654; ---- -> var var_int: u32 = 12345; -> var var_float: f32 = 987.654; +--- exercises/066_comptime.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/066_comptime.zig 2023-10-05 20:04:07.139435109 +0200 +@@ -62,8 +62,8 @@ + // types with specific sizes. The comptime numbers will be + // coerced (if they'll fit!) into your chosen runtime types. + // For this it is necessary to specify a size, e.g. 32 bit. +- var var_int = 12345; +- var var_float = 987.654; ++ var var_int: u32 = 12345; ++ var var_float: f32 = 987.654; + + // We can change what is stored at the areas set aside for + // "var_int" and "var_float" in the running compiled program. diff --git a/patches/patches/067_comptime2.patch b/patches/patches/067_comptime2.patch index 97b893b..470c69f 100644 --- a/patches/patches/067_comptime2.patch +++ b/patches/patches/067_comptime2.patch @@ -1,4 +1,11 @@ -38c38 -< var count = 0; ---- -> comptime var count = 0; +--- exercises/067_comptime2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/067_comptime2.zig 2023-10-05 20:04:07.146101899 +0200 +@@ -35,7 +35,7 @@ + // In this contrived example, we've decided to allocate some + // arrays using a variable count! But something's missing... + // +- var count = 0; ++ comptime var count = 0; + + count += 1; + var a1: [count]u8 = .{'A'} ** count; diff --git a/patches/patches/068_comptime3.patch b/patches/patches/068_comptime3.patch index 985f0e6..313cae0 100644 --- a/patches/patches/068_comptime3.patch +++ b/patches/patches/068_comptime3.patch @@ -1,8 +1,20 @@ -46c46 -< if (my_scale == 0) @compileError("Scale 1:0 is not valid!"); ---- -> if (my_scale == 0) my_scale = 1; //@compileError("Scale 1:0 is not valid!"); -72c72 -< var scale: u32 = undefined; ---- -> comptime var scale: u32 = undefined; +--- exercises/068_comptime3.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/068_comptime3.zig 2023-10-05 20:04:07.149435295 +0200 +@@ -43,7 +43,7 @@ + // + // Please change this so that it sets a 0 scale to 1 + // instead. +- if (my_scale == 0) @compileError("Scale 1:0 is not valid!"); ++ if (my_scale == 0) my_scale = 1; //@compileError("Scale 1:0 is not valid!"); + + self.scale = my_scale; + self.hull_length /= my_scale; +@@ -69,7 +69,7 @@ + // Hey, we can't just pass this runtime variable as an + // argument to the scaleMe() method. What would let us do + // that? +- var scale: u32 = undefined; ++ comptime var scale: u32 = undefined; + + scale = 32; // 1:32 scale + diff --git a/patches/patches/069_comptime4.patch b/patches/patches/069_comptime4.patch index 3d662a7..2b61673 100644 --- a/patches/patches/069_comptime4.patch +++ b/patches/patches/069_comptime4.patch @@ -1,6 +1,13 @@ -45,46c45,46 -< fn makeSequence(comptime T: type, ??? size: usize) [???]T { -< var sequence: [???]T = undefined; ---- -> fn makeSequence(comptime T: type, comptime size: usize) [size]T { -> var sequence: [size]T = undefined; +--- exercises/069_comptime4.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/069_comptime4.zig 2023-10-05 20:04:07.152768692 +0200 +@@ -42,8 +42,8 @@ + // 2) Sets the size of the array of type T (which is the + // sequence we're creating and returning). + // +-fn makeSequence(comptime T: type, ??? size: usize) [???]T { +- var sequence: [???]T = undefined; ++fn makeSequence(comptime T: type, comptime size: usize) [size]T { ++ var sequence: [size]T = undefined; + var i: usize = 0; + + while (i < size) : (i += 1) { diff --git a/patches/patches/070_comptime5.patch b/patches/patches/070_comptime5.patch index c92dcc7..e5f0357 100644 --- a/patches/patches/070_comptime5.patch +++ b/patches/patches/070_comptime5.patch @@ -1,6 +1,13 @@ -126,127c126,127 -< const walks_like_duck = ???; -< const quacks_like_duck = ???; ---- -> const walks_like_duck = @hasDecl(MyType, "waddle"); -> const quacks_like_duck = @hasDecl(MyType, "quack"); +--- exercises/070_comptime5.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/070_comptime5.zig 2023-10-05 20:04:07.159435482 +0200 +@@ -123,8 +123,8 @@ + // Please make sure MyType has both waddle() and quack() + // methods: + const MyType = @TypeOf(possible_duck); +- const walks_like_duck = ???; +- const quacks_like_duck = ???; ++ const walks_like_duck = @hasDecl(MyType, "waddle"); ++ const quacks_like_duck = @hasDecl(MyType, "quack"); + + const is_duck = walks_like_duck and quacks_like_duck; + diff --git a/patches/patches/071_comptime6.patch b/patches/patches/071_comptime6.patch index 0c6b3ad..8731344 100644 --- a/patches/patches/071_comptime6.patch +++ b/patches/patches/071_comptime6.patch @@ -1,4 +1,11 @@ -43c43 -< ??? { ---- -> inline for (fields) |field| { +--- exercises/071_comptime6.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/071_comptime6.zig 2023-10-05 20:04:07.162768879 +0200 +@@ -40,7 +40,7 @@ + + const fields = @typeInfo(Narcissus).Struct.fields; + +- ??? { ++ inline for (fields) |field| { + if (field.type != void) { + print(" {s}", .{field.name}); + } diff --git a/patches/patches/072_comptime7.patch b/patches/patches/072_comptime7.patch index 205e238..d4c2e1d 100644 --- a/patches/patches/072_comptime7.patch +++ b/patches/patches/072_comptime7.patch @@ -1,4 +1,11 @@ -38c38 -< ??? (i < instructions.len) : (???) { ---- -> inline while (i < instructions.len) : (i += 3) { +--- exercises/072_comptime7.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/072_comptime7.zig 2023-10-05 20:04:07.169435669 +0200 +@@ -35,7 +35,7 @@ + // at compile time. + // + // Please fix this to loop once per "instruction": +- ??? (i < instructions.len) : (???) { ++ inline while (i < instructions.len) : (i += 3) { + + // This gets the digit from the "instruction". Can you + // figure out why we subtract '0' from it? diff --git a/patches/patches/073_comptime8.patch b/patches/patches/073_comptime8.patch index 5b50edb..9aebf42 100644 --- a/patches/patches/073_comptime8.patch +++ b/patches/patches/073_comptime8.patch @@ -1,8 +1,17 @@ -35c35 -< const my_llama = getLlama(5); ---- -> const my_llama = getLlama(4); -40c40 -< fn getLlama(i: usize) u32 { ---- -> fn getLlama(comptime i: usize) u32 { +--- exercises/073_comptime8.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/073_comptime8.zig 2023-10-05 20:04:07.172769065 +0200 +@@ -32,12 +32,12 @@ + pub fn main() void { + // We meant to fetch the last llama. Please fix this simple + // mistake so the assertion no longer fails. +- const my_llama = getLlama(5); ++ const my_llama = getLlama(4); + + print("My llama value is {}.\n", .{my_llama}); + } + +-fn getLlama(i: usize) u32 { ++fn getLlama(comptime i: usize) u32 { + // We've put a guard assert() at the top of this function to + // prevent mistakes. The 'comptime' keyword here means that + // the mistake will be caught when we compile! diff --git a/patches/patches/074_comptime9.patch b/patches/patches/074_comptime9.patch index 4f979fe..250d003 100644 --- a/patches/patches/074_comptime9.patch +++ b/patches/patches/074_comptime9.patch @@ -1,4 +1,11 @@ -42c42 -< fn makeLlamas(count: usize) [count]u8 { ---- -> fn makeLlamas(comptime count: usize) [count]u8 { +--- exercises/074_comptime9.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/074_comptime9.zig 2023-10-05 20:04:07.176102462 +0200 +@@ -39,7 +39,7 @@ + + // And here's the function. Note that the return value type + // depends on one of the input arguments! +-fn makeLlamas(count: usize) [count]u8 { ++fn makeLlamas(comptime count: usize) [count]u8 { + var temp: [count]u8 = undefined; + var i = 0; + diff --git a/patches/patches/075_quiz8.patch b/patches/patches/075_quiz8.patch index ce6a2d8..1bb9e5d 100644 --- a/patches/patches/075_quiz8.patch +++ b/patches/patches/075_quiz8.patch @@ -1,8 +1,15 @@ -52c52,56 -< ---- -> return Path{ -> .from = from, -> .to = to, -> .dist = dist, -> }; +--- exercises/075_quiz8.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/075_quiz8.zig 2023-10-05 20:04:07.182769252 +0200 +@@ -49,7 +49,11 @@ + // + // Please fill in the body of this function! + fn makePath(from: *Place, to: *Place, dist: u8) Path { +- ++ return Path{ ++ .from = from, ++ .to = to, ++ .dist = dist, ++ }; + } + + // Using our new function, these path definitions take up considerably less diff --git a/patches/patches/076_sentinels.patch b/patches/patches/076_sentinels.patch index 55c4c96..cbfae31 100644 --- a/patches/patches/076_sentinels.patch +++ b/patches/patches/076_sentinels.patch @@ -1,8 +1,20 @@ -85c85 -< for (???) |s| { ---- -> for (my_seq) |s| { -97c97 -< while (??? != my_sentinel) { ---- -> while (my_seq[i] != my_sentinel) { +--- exercises/076_sentinels.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/076_sentinels.zig 2023-10-05 20:04:07.186102649 +0200 +@@ -82,7 +82,7 @@ + print("Array:", .{}); + + // Loop through the items in my_seq. +- for (???) |s| { ++ for (my_seq) |s| { + print("{}", .{s}); + } + }, +@@ -94,7 +94,7 @@ + // Loop through the items in my_seq until we hit the + // sentinel value. + var i: usize = 0; +- while (??? != my_sentinel) { ++ while (my_seq[i] != my_sentinel) { + print("{}", .{my_seq[i]}); + i += 1; + } diff --git a/patches/patches/077_sentinels2.patch b/patches/patches/077_sentinels2.patch index 4fef677..a91a874 100644 --- a/patches/patches/077_sentinels2.patch +++ b/patches/patches/077_sentinels2.patch @@ -1,4 +1,11 @@ -63c63 -< const printable = ???; ---- -> const printable = foo.data[0..foo.length]; +--- exercises/077_sentinels2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/077_sentinels2.zig 2023-10-05 20:04:07.189436043 +0200 +@@ -60,7 +60,7 @@ + // length... You've actually solved this problem before! + // + // Here's a big hint: do you remember how to take a slice? +- const printable = ???; ++ const printable = foo.data[0..foo.length]; + + print("{s}\n", .{printable}); + } diff --git a/patches/patches/078_sentinels3.patch b/patches/patches/078_sentinels3.patch index 31185d6..eb5dcff 100644 --- a/patches/patches/078_sentinels3.patch +++ b/patches/patches/078_sentinels3.patch @@ -1,4 +1,11 @@ -24c24 -< const printable: [*:0]const u8 = ???; ---- -> const printable: [*:0]const u8 = @ptrCast(data); +--- exercises/078_sentinels3.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/078_sentinels3.zig 2023-10-05 20:04:07.196102836 +0200 +@@ -21,7 +21,7 @@ + const data: [*]const u8 = "Weird Data!"; + + // Please cast 'data' to 'printable': +- const printable: [*:0]const u8 = ???; ++ const printable: [*:0]const u8 = @ptrCast(data); + + print("{s}\n", .{printable}); + } diff --git a/patches/patches/079_quoted_identifiers.patch b/patches/patches/079_quoted_identifiers.patch index c7bcea8..b624668 100644 --- a/patches/patches/079_quoted_identifiers.patch +++ b/patches/patches/079_quoted_identifiers.patch @@ -1,12 +1,18 @@ -23,24c23,24 -< const 55_cows: i32 = 55; -< const isn't true: bool = false; ---- -> const @"55_cows": i32 = 55; -> const @"isn't true": bool = false; -27,28c27,28 -< 55_cows, -< isn't true, ---- -> @"55_cows", -> @"isn't true", +--- exercises/079_quoted_identifiers.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/079_quoted_identifiers.zig 2023-10-05 20:04:07.199436232 +0200 +@@ -20,11 +20,11 @@ + const print = @import("std").debug.print; + + pub fn main() void { +- const 55_cows: i32 = 55; +- const isn't true: bool = false; ++ const @"55_cows": i32 = 55; ++ const @"isn't true": bool = false; + + print("Sweet freedom: {}, {}.\n", .{ +- 55_cows, +- isn't true, ++ @"55_cows", ++ @"isn't true", + }); + } diff --git a/patches/patches/080_anonymous_structs.patch b/patches/patches/080_anonymous_structs.patch index a94e7b8..a46ea41 100644 --- a/patches/patches/080_anonymous_structs.patch +++ b/patches/patches/080_anonymous_structs.patch @@ -1,8 +1,18 @@ -51c51 -< var circle1 = ??? { ---- -> var circle1 = Circle(i32){ -57c57 -< var circle2 = ??? { ---- -> var circle2 = Circle(f32){ +--- exercises/080_anonymous_structs.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/080_anonymous_structs.zig 2023-10-05 20:04:07.202769626 +0200 +@@ -48,13 +48,13 @@ + // * circle1 should hold i32 integers + // * circle2 should hold f32 floats + // +- var circle1 = ??? { ++ var circle1 = Circle(i32){ + .center_x = 25, + .center_y = 70, + .radius = 15, + }; + +- var circle2 = ??? { ++ var circle2 = Circle(f32){ + .center_x = 25.234, + .center_y = 70.999, + .radius = 15.714, diff --git a/patches/patches/081_anonymous_structs2.patch b/patches/patches/081_anonymous_structs2.patch index a9ca689..d09ac72 100644 --- a/patches/patches/081_anonymous_structs2.patch +++ b/patches/patches/081_anonymous_structs2.patch @@ -1,4 +1,11 @@ -41c41 -< fn printCircle(???) void { ---- -> fn printCircle(circle: anytype) void { +--- exercises/081_anonymous_structs2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/081_anonymous_structs2.zig 2023-10-05 20:04:07.209436419 +0200 +@@ -38,7 +38,7 @@ + + // Please complete this function which prints an anonymous struct + // representing a circle. +-fn printCircle(???) void { ++fn printCircle(circle: anytype) void { + print("x:{} y:{} radius:{}\n", .{ + circle.center_x, + circle.center_y, diff --git a/patches/patches/082_anonymous_structs3.patch b/patches/patches/082_anonymous_structs3.patch index 6965858..7beb511 100644 --- a/patches/patches/082_anonymous_structs3.patch +++ b/patches/patches/082_anonymous_structs3.patch @@ -1,16 +1,32 @@ -85c85 -< const fields = ???; ---- -> const fields = @typeInfo(@TypeOf(tuple)).Struct.fields; -92c92 -< for (fields) |field| { ---- -> inline for (fields) |field| { -120,122c120,122 -< field.???, -< field.???, -< ???, ---- -> field.name, -> field.type, -> @field(tuple, field.name), +--- exercises/082_anonymous_structs3.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/082_anonymous_structs3.zig 2023-10-05 20:04:07.212769813 +0200 +@@ -82,14 +82,14 @@ + // @typeInfo(Circle).Struct.fields + // + // This will be an array of StructFields. +- const fields = ???; ++ const fields = @typeInfo(@TypeOf(tuple)).Struct.fields; + + // 2. Loop through each field. This must be done at compile + // time. + // + // Hint: remember 'inline' loops? + // +- for (fields) |field| { ++ inline for (fields) |field| { + // 3. Print the field's name, type, and value. + // + // Each 'field' in this loop is one of these: +@@ -117,9 +117,9 @@ + // + // The first field should print as: "0"(bool):true + print("\"{s}\"({any}):{any} ", .{ +- field.???, +- field.???, +- ???, ++ field.name, ++ field.type, ++ @field(tuple, field.name), + }); + } + } diff --git a/patches/patches/083_anonymous_lists.patch b/patches/patches/083_anonymous_lists.patch index 94b594b..b0242f1 100644 --- a/patches/patches/083_anonymous_lists.patch +++ b/patches/patches/083_anonymous_lists.patch @@ -1,4 +1,10 @@ -23c23 -< const hello = .{ 'h', 'e', 'l', 'l', 'o' }; ---- -> const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' }; +--- exercises/083_anonymous_lists.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/083_anonymous_lists.zig 2023-10-05 20:04:07.216103210 +0200 +@@ -20,6 +20,6 @@ + // + // = .{ 'h', 'e', 'l', 'l', 'o' }; + // +- const hello = .{ 'h', 'e', 'l', 'l', 'o' }; ++ const hello: [5]u8 = .{ 'h', 'e', 'l', 'l', 'o' }; + print("I say {s}!\n", .{hello}); + } diff --git a/patches/patches/084_async.patch b/patches/patches/084_async.patch index 9eba9ac..11a9da0 100644 --- a/patches/patches/084_async.patch +++ b/patches/patches/084_async.patch @@ -1,4 +1,11 @@ -51c51 -< foo(); ---- -> _ = async foo(); +--- exercises/084_async.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/084_async.zig 2023-10-05 20:04:07.219436606 +0200 +@@ -48,7 +48,7 @@ + pub fn main() void { + // Additional Hint: you can assign things to '_' when you + // don't intend to do anything with them. +- foo(); ++ _ = async foo(); + } + + fn foo() void { diff --git a/patches/patches/085_async2.patch b/patches/patches/085_async2.patch index cc71293..ba10b05 100644 --- a/patches/patches/085_async2.patch +++ b/patches/patches/085_async2.patch @@ -1,2 +1,10 @@ -21a22 -> resume foo_frame; +--- exercises/085_async2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/085_async2.zig 2023-10-05 20:04:07.226103397 +0200 +@@ -19,6 +19,7 @@ + + pub fn main() void { + var foo_frame = async foo(); ++ resume foo_frame; + } + + fn foo() void { diff --git a/patches/patches/086_async3.patch b/patches/patches/086_async3.patch index 2e52b2b..d80d4a1 100644 --- a/patches/patches/086_async3.patch +++ b/patches/patches/086_async3.patch @@ -1,9 +1,16 @@ -16c16,21 -< ??? ---- -> // Silly solution. You can also use a loop. -> resume foo_frame; -> resume foo_frame; -> resume foo_frame; -> resume foo_frame; -> resume foo_frame; +--- exercises/086_async3.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/086_async3.zig 2023-10-05 20:04:07.229436793 +0200 +@@ -13,7 +13,12 @@ + const n = 5; + var foo_frame = async foo(n); + +- ??? ++ // Silly solution. You can also use a loop. ++ resume foo_frame; ++ resume foo_frame; ++ resume foo_frame; ++ resume foo_frame; ++ resume foo_frame; + + print("\n", .{}); + } diff --git a/patches/patches/087_async4.patch b/patches/patches/087_async4.patch index 3aec891..b1c1736 100644 --- a/patches/patches/087_async4.patch +++ b/patches/patches/087_async4.patch @@ -1,10 +1,21 @@ -19c19 -< ??? ---- -> resume foo_frame; -27,28c27,28 -< ??? -< ??? ---- -> global_counter += 1; -> suspend {} +--- exercises/087_async4.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/087_async4.zig 2023-10-05 20:04:07.236103584 +0200 +@@ -16,7 +16,7 @@ + + while (global_counter <= 5) { + print("{} ", .{global_counter}); +- ??? ++ resume foo_frame; + } + + print("\n", .{}); +@@ -24,7 +24,7 @@ + + fn foo() void { + while (true) { +- ??? +- ??? ++ global_counter += 1; ++ suspend {} + } + } diff --git a/patches/patches/088_async5.patch b/patches/patches/088_async5.patch index 7ce4fc6..b9d5a21 100644 --- a/patches/patches/088_async5.patch +++ b/patches/patches/088_async5.patch @@ -1,4 +1,11 @@ -39c39 -< var value = ??? ---- -> var value = await myframe; +--- exercises/088_async5.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/088_async5.zig 2023-10-05 20:04:07.239436980 +0200 +@@ -36,7 +36,7 @@ + pub fn main() void { + var myframe = async getPageTitle("http://example.com"); + +- var value = ??? ++ var value = await myframe; + + print("{s}\n", .{value}); + } diff --git a/patches/patches/089_async6.patch b/patches/patches/089_async6.patch index ecbef19..4a0687e 100644 --- a/patches/patches/089_async6.patch +++ b/patches/patches/089_async6.patch @@ -1,6 +1,13 @@ -44,45c44,45 -< var com_title = com_frame; -< var org_title = org_frame; ---- -> var com_title = await com_frame; -> var org_title = await org_frame; +--- exercises/089_async6.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/089_async6.zig 2023-10-05 20:04:07.242770376 +0200 +@@ -41,8 +41,8 @@ + var com_frame = async getPageTitle("http://example.com"); + var org_frame = async getPageTitle("http://example.org"); + +- var com_title = com_frame; +- var org_title = org_frame; ++ var com_title = await com_frame; ++ var org_title = await org_frame; + + print(".com: {s}, .org: {s}.\n", .{ com_title, org_title }); + } diff --git a/patches/patches/090_async7.patch b/patches/patches/090_async7.patch index 9ef7b92..62ec057 100644 --- a/patches/patches/090_async7.patch +++ b/patches/patches/090_async7.patch @@ -1,4 +1,11 @@ -32c32 -< var my_beef = getBeef(0); ---- -> var my_beef = nosuspend getBeef(0); +--- exercises/090_async7.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/090_async7.zig 2023-10-05 20:04:07.249437167 +0200 +@@ -29,7 +29,7 @@ + // The main() function can not be async. But we know + // getBeef() will not suspend with this particular + // invocation. Please make this okay: +- var my_beef = getBeef(0); ++ var my_beef = nosuspend getBeef(0); + + print("beef? {X}!\n", .{my_beef}); + } diff --git a/patches/patches/091_async8.patch b/patches/patches/091_async8.patch index 8a93b31..ddd3fce 100644 --- a/patches/patches/091_async8.patch +++ b/patches/patches/091_async8.patch @@ -1,16 +1,26 @@ -20c20 -< print("X", .{}); ---- -> print("D", .{}); -28c28 -< print("X", .{}); ---- -> print("B", .{}); -31c31 -< print("X", .{}); ---- -> print("C", .{}); -34c34 -< print("X", .{}); ---- -> print("E", .{}); +--- exercises/091_async8.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/091_async8.zig 2023-10-05 20:04:07.252770563 +0200 +@@ -17,7 +17,7 @@ + + var frame = async suspendable(); + +- print("X", .{}); ++ print("D", .{}); + + resume frame; + +@@ -25,11 +25,11 @@ + } + + fn suspendable() void { +- print("X", .{}); ++ print("B", .{}); + + suspend { +- print("X", .{}); ++ print("C", .{}); + } + +- print("X", .{}); ++ print("E", .{}); + } diff --git a/patches/patches/092_interfaces.patch b/patches/patches/092_interfaces.patch index 1287e79..36d8784 100644 --- a/patches/patches/092_interfaces.patch +++ b/patches/patches/092_interfaces.patch @@ -1,4 +1,11 @@ -109c109 -< ??? ---- -> insect.print(); +--- exercises/092_interfaces.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/092_interfaces.zig 2023-10-05 20:04:07.259437354 +0200 +@@ -106,7 +106,7 @@ + for (my_insects) |insect| { + // Almost done! We want to print() each insect with a + // single method call here. +- ??? ++ insect.print(); + } + } + diff --git a/patches/patches/093_hello_c.patch b/patches/patches/093_hello_c.patch index 60eeaf0..fe1f853 100644 --- a/patches/patches/093_hello_c.patch +++ b/patches/patches/093_hello_c.patch @@ -1,4 +1,11 @@ -57c57 -< const c_res = write(2, "Hello C from Zig!", 17); ---- -> const c_res = c.write(2, "Hello C from Zig!", 17); +--- exercises/093_hello_c.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/093_hello_c.zig 2023-10-05 20:04:07.262770750 +0200 +@@ -54,7 +54,7 @@ + // + // In this exercise we use 'write' to output 17 chars, + // but something is still missing... +- const c_res = write(2, "Hello C from Zig!", 17); ++ const c_res = c.write(2, "Hello C from Zig!", 17); + + // let's see what the result from C is: + std.debug.print(" - C result is {d} chars written.\n", .{c_res}); diff --git a/patches/patches/094_c_math.patch b/patches/patches/094_c_math.patch index 4b7d474..7256162 100644 --- a/patches/patches/094_c_math.patch +++ b/patches/patches/094_c_math.patch @@ -1,4 +1,11 @@ -22c22 -< ??? ---- -> @cInclude("math.h"); +--- exercises/094_c_math.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/094_c_math.zig 2023-10-05 20:04:07.266104147 +0200 +@@ -19,7 +19,7 @@ + + const c = @cImport({ + // What do wee need here? +- ??? ++ @cInclude("math.h"); + }); + + pub fn main() !void { diff --git a/patches/patches/095_for3.patch b/patches/patches/095_for3.patch index c258b7b..ca9e3ad 100644 --- a/patches/patches/095_for3.patch +++ b/patches/patches/095_for3.patch @@ -1,4 +1,11 @@ -57c57 -< for (???) |n| { ---- -> for (1..21) |n| { +--- exercises/095_for3.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/095_for3.zig 2023-10-05 20:04:07.272770937 +0200 +@@ -54,7 +54,7 @@ + + // I want to print every number between 1 and 20 that is NOT + // divisible by 3 or 5. +- for (???) |n| { ++ for (1..21) |n| { + + // The '%' symbol is the "modulo" operator and it + // returns the remainder after division. diff --git a/patches/patches/096_memory_allocation.patch b/patches/patches/096_memory_allocation.patch index a3db349..aab718f 100644 --- a/patches/patches/096_memory_allocation.patch +++ b/patches/patches/096_memory_allocation.patch @@ -1,4 +1,11 @@ -67c67 -< var avg: []f64 = ???; ---- -> var avg: []f64 = try allocator.alloc(f64, arr.len); +--- exercises/096_memory_allocation.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/096_memory_allocation.zig 2023-10-05 20:04:07.276104333 +0200 +@@ -64,7 +64,7 @@ + const allocator = arena.allocator(); + + // allocate memory for this array +- var avg: []f64 = ???; ++ var avg: []f64 = try allocator.alloc(f64, arr.len); + + runningAverage(arr, avg); + std.debug.print("Running Average: ", .{}); diff --git a/patches/patches/097_bit_manipulation.patch b/patches/patches/097_bit_manipulation.patch index 2afe3da..5303ee1 100644 --- a/patches/patches/097_bit_manipulation.patch +++ b/patches/patches/097_bit_manipulation.patch @@ -1,4 +1,11 @@ -83c83 -< ???; ---- -> x ^= y; +--- exercises/097_bit_manipulation.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/097_bit_manipulation.zig 2023-10-05 20:04:07.282771124 +0200 +@@ -80,7 +80,7 @@ + y ^= x; + + // What must be written here? +- ???; ++ x ^= y; + + print("x = {d}; y = {d}\n", .{ x, y }); + } diff --git a/patches/patches/098_bit_manipulation2.patch b/patches/patches/098_bit_manipulation2.patch index 8becd34..5354a7b 100644 --- a/patches/patches/098_bit_manipulation2.patch +++ b/patches/patches/098_bit_manipulation2.patch @@ -1,4 +1,9 @@ -63c63 -< return bits == 0x..???; ---- -> return bits == 0x3ffffff; +--- exercises/098_bit_manipulation2.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/098_bit_manipulation2.zig 2023-10-05 20:04:07.286104520 +0200 +@@ -60,5 +60,5 @@ + // and if so, we know the given string is a pangram + // + // but what do we have to compare? +- return bits == 0x..???; ++ return bits == 0x3ffffff; + } diff --git a/patches/patches/099_formatting.patch b/patches/patches/099_formatting.patch index 5b7efbe..384bf86 100644 --- a/patches/patches/099_formatting.patch +++ b/patches/patches/099_formatting.patch @@ -1,4 +1,11 @@ -134c134 -< print("{???} ", .{(a + 1) * (b + 1)}); ---- -> print("{d:>3} ", .{(a + 1) * (b + 1)}); +--- exercises/099_formatting.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/099_formatting.zig 2023-10-05 20:04:07.292771311 +0200 +@@ -131,7 +131,7 @@ + for (0..size) |b| { + // What formatting is needed here to make our columns + // nice and straight? +- print("{???} ", .{(a + 1) * (b + 1)}); ++ print("{d:>3} ", .{(a + 1) * (b + 1)}); + } + + // After each row we use double line feed: diff --git a/patches/patches/100_for4.patch b/patches/patches/100_for4.patch index 6465325..3539be2 100644 --- a/patches/patches/100_for4.patch +++ b/patches/patches/100_for4.patch @@ -1,4 +1,11 @@ -42c42 -< for (hex_nums, ???) |hn, ???| { ---- -> for (hex_nums, dec_nums) |hn, dn| { +--- exercises/100_for4.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/100_for4.zig 2023-10-05 20:04:07.296104707 +0200 +@@ -39,7 +39,7 @@ + const hex_nums = [_]u8{ 0xb, 0x2a, 0x77 }; + const dec_nums = [_]u8{ 11, 42, 119 }; + +- for (hex_nums, ???) |hn, ???| { ++ for (hex_nums, dec_nums) |hn, dn| { + if (hn != dn) { + std.debug.print("Uh oh! Found a mismatch: {d} vs {d}\n", .{ hn, dn }); + return; diff --git a/patches/patches/101_for5.patch b/patches/patches/101_for5.patch index edb927f..00f19df 100644 --- a/patches/patches/101_for5.patch +++ b/patches/patches/101_for5.patch @@ -1,4 +1,11 @@ -54c54 -< for (roles, gold, experience, ???) |c, g, e, i| { ---- -> for (roles, gold, experience, 1..) |c, g, e, i| { +--- exercises/101_for5.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/101_for5.zig 2023-10-05 20:04:07.299438103 +0200 +@@ -51,7 +51,7 @@ + + // We would like to number our list starting with 1, not 0. + // How do we do that? +- for (roles, gold, experience, ???) |c, g, e, i| { ++ for (roles, gold, experience, 1..) |c, g, e, i| { + const role_name = switch (c) { + .wizard => "Wizard", + .thief => "Thief", diff --git a/patches/patches/102_testing.patch b/patches/patches/102_testing.patch index 49daf0c..9695b24 100644 --- a/patches/patches/102_testing.patch +++ b/patches/patches/102_testing.patch @@ -1,8 +1,18 @@ -86c86 -< try testing.expect(sub(10, 5) == 6); ---- -> try testing.expect(sub(10, 5) == 5); -111c111 -< try testing.expectError(error.???, divide(15, 0)); ---- -> try testing.expectError(error.DivisionByZero, divide(15, 0)); +--- exercises/102_testing.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/102_testing.zig 2023-10-05 20:04:07.302771500 +0200 +@@ -83,7 +83,7 @@ + // an error that you need + // to correct. + test "sub" { +- try testing.expect(sub(10, 5) == 6); ++ try testing.expect(sub(10, 5) == 5); + + try testing.expect(sub(3, 1.5) == 1.5); + } +@@ -108,5 +108,5 @@ + // Now we test if the function returns an error + // if we pass a zero as denominator. + // But which error needs to be tested? +- try testing.expectError(error.???, divide(15, 0)); ++ try testing.expectError(error.DivisionByZero, divide(15, 0)); + } diff --git a/patches/patches/103_tokenization.patch b/patches/patches/103_tokenization.patch index 973ffe6..98f645b 100644 --- a/patches/patches/103_tokenization.patch +++ b/patches/patches/103_tokenization.patch @@ -1,4 +1,11 @@ -139c139 -< var it = std.mem.tokenize(u8, poem, ???); ---- -> var it = std.mem.tokenize(u8, poem, " ,;!\n"); +--- exercises/103_tokenization.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/103_tokenization.zig 2023-10-05 20:04:07.309438291 +0200 +@@ -136,7 +136,7 @@ + ; + + // now the tokenizer, but what do we need here? +- var it = std.mem.tokenize(u8, poem, ???); ++ var it = std.mem.tokenize(u8, poem, " ,;!\n"); + + // print all words and count them + var cnt: usize = 0; diff --git a/patches/patches/999_the_end.patch b/patches/patches/999_the_end.patch index ae674da..c8b9815 100644 --- a/patches/patches/999_the_end.patch +++ b/patches/patches/999_the_end.patch @@ -1,2 +1,7 @@ -8a9 -> // gollum's line ;-) +--- exercises/999_the_end.zig 2023-10-03 22:15:22.125574535 +0200 ++++ answers/999_the_end.zig 2023-10-05 20:04:07.312771687 +0200 +@@ -6,3 +6,4 @@ + pub fn main() void { + print("\nThis is the end for now!\nWe hope you had fun and were able to learn a lot, so visit us again when the next exercises are available.\n", .{}); + } ++// gollum's line ;-) diff --git a/test/patch b/test/patch deleted file mode 100755 index e3bf6f0eaf568cb02319749271eb6e734cc746fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204512 zcmb<-^>JfjWMpQ50wxAK21W)3h6Pd%U=aw(!0;ea2+Ri&4h$9yTnr8jvJ5g{wJab( zIELwf&<3m!2^h^F0O5n|082sn3<41KFj}yg2dofABkKd(w*Vr~u)qhb4n}AALc9W_ zk@c}LFfcfL;RmaC_~MU3a}^ zKGX*l6QCf7N7mH%2jrV8`T`7$-K-z=K_S7+-+G6Ef#F!|Pf*_E-!>K0F5=(Dx?dku zE%9%I6jmMJ=8{MERB#Q{ZQ2MjzngWI9>|)D9=)PqfzIPEw(JBa3rmpM;2E7Xk8aj# zkh0bTrBVFbSkvJ$J|4YO75@GI4=H0kIzht(hJK(iyAn{hTn=OfcbM+`wgo4 zz)|4QdH~ep2D=<$Nayhv{1M0n^-DWWuzO7P1sFP7qyK`2LRg>Z!P2aKH|uK<=LcJ< z2~v<7v%`Yi6WQvu;LuyDhe!+j+gPWA^n-nx>(R|RQ5RgUmL_`if~#Oq1g 0~-kP>anljMjj+UA&OfMl!AP&0tzm$&kyDx`TWQ)P!S3;2bB8wx3S8=tmbb? zXJ=r5=RX!*0R~7h8UF;7NI&R;BASuE#gQEpcC1fyK=~87=uNr-E_$aP=xB`rhY^^9 z ##yJ8wXS)R~Y2 zNANcT1I!t`P-pPBECaVaz)ppDhSQ^4_Nlf2!)rrGQ^RgEs4_d`(am~Z8 +Cd`h9=)t>**pwT`$0-g ztDzELhDYa3P?xQjH9s3EVncs{3MMZdP%JU=x6Wn-Cs{LXxc>v8X0UpJwSls=6PN`Z zE))61!0 f*I_y)&qb4|9`;( zVV?lCFuSLMggm-i!92@D9{j$CJUUx1faO@1vVoHim )5YQH2-~wlCa0K(Wd<93j=x;4hON%vHTY$mh5P$1^&>Vp58V2Yz zv!q8at5_CN6kPhj!0-~(tMcfEJ2giN)2U(n+gKN9!6Sx03zBA81;K`aB1Qwuf<_F} zA8-Ou;NQlY1$GdmG)3xB1#1Z~ymoofv>N6#&?N2mOeCjOe+5n0K!Zx^7}&3j9?fe( zA;#!&92}IOUKRf~R&Fh5u$QR80=HDgqZ#ZYMwrj6!6|^hFa005Fubk__Kl54H>?aQ zG4SYSJ)r?9$W&nBptAiPs38qj2C@*TISh@JQuY`58yG+{VclS7d31}e&;*UiUGV5^ zy#X#*SkuAw@wYAj#}n%uFt lf Cx+Y0qS(MPoUI#h<_U^s|GkmL8a0os2 4 zX@ RAdUQ_(v5-9I3f2zN=7p?H0;H{* z)dFI7iLXaDs}6|W{DZL+6l^-sAdpo8>FO5c2T3A=?fnOkqoBPgMvxL%c pC@1P1||=g+(a?LuYFZc;p2{GVu2o`~v5%ay58j-NeAa(7YEc zU75$fjWt9S98t+0-K>$S;GhF9(U_Eml>2KzzV2n6i7ciHav40k^0#<$f~s|BIzIk_ z_ccm3eW?YKhBUR{trBoO$Epua?IqG4y{tLNRvh{aYAEhf6<}a|@$whg)9X~>9;pIV zHQlUBK#PGuD GkPP|5j&sg#d@8|x7js1r+tFq# ZC(5A39N+;rXeI|Ox(jmb{OH+v z0<;DRR0@J;$RUl1QVUQ?eMI186xeXEf52r2f6Hu$mr_-5`eWiMNO4sHb!W=~u$Mk6 zL%mcI&A*K`59R@o9JomiHowFkT3155``xU6LE3&WmZ-rT-g*2*>>tp|6Ho@4oPw0X zu73oD1Zz7;2dMnvZ<);u7TKW;c5LVI7qx3Zsk;GEfG>myBaO#2KL8C7b{>Bb3Rc$w z&IKTnp+vO16{O9&6~rw;YeB|?V;@8^c7qd$HMqR5(duRm1-a%2bBTPzUXVOPso0DC zD?vqJDesGiU $Ye S3!SYUVBd@GPyz)C>n0^o?+BDw1wl1XH^k)TAOHDVK=XV2 z+gPi>3PBZ-EyQjCh}{xkyICWYpz#Xn)poPSD}s8yrRDtFSnc6jYgT|0MM
BV jVXmcS>BK@mB(sVe#l@ zbp^S-w-*!_-BUrq+PxK|$+Pn$sP7EQQ=o WnL_vmIlt02J8y%(h1qq`S8H~}pbo8NGR zId=YZ1dpD1^qOvkYF}ys$ !HQMNuOTU4f3Ff zISBRvQqd3vHR`n^|F&L`d!U65)CJHUQu7;*K*!FH5Ql)v9k3CghJYl@0LBU3tmX=! z+L)QY#hDpYqkx(l4E!x-;B1R%vGBL3fLF(`mO%YuV$1>>r|50n08Wa>I e+e0qw`?rFOOc GH$ZwR{UGI_%BdgR7-9YH z1d5o}2O!yAR%fs&tdBr~kidrzY}wj_vI*1}2-SJ~MZrmM0rCQ*y}K1m^#=U+=!Pf& z&ym~Il}dPElRL(s?9mOexsx^D30#0k$U!q3e~THU1OdCd^Z1Kx-$3?*is>csNa14u zij8j89deL{LJI#j@YEHg{Ic-qHk}8O>1LfTC&1tc9)WV)v8|DT0i2A$$q|%{p5Fis z^?>HQ7++oj2aISML|;0Hf{YqS-DY5TxdkK(A8&*>4jk$$7(t_0J>WtfL^71{HSYy6 zm`Ye*aJ&K~NDz;qR3AEI2(nk|IH(|FES2`?X8kJ*%EVKVj9ht(f#J2AM>p#uuv9Nt zs&^_VnL2{q5AljeujxsUg3jYF?p$DCcn#_*&5uJ0Bc9iwh7ju%kfPQDrRuQg={){o z#(frs*Pt=KJY)^GUokMeW}E=twD+R%1DNyT5qLNZ)bMA3Ooo6K8*Knh@3kH%73JT? z8Y=^hJJbpdQVn|aLWV)X!&$$qzy(L^wP*kTH|zyXtT6Dmo_q#c&;V(!wH^Siw1BWX zkH1LL1I?m?vLjr`{vk9wu6@D40BL8W8!|Aw=rv|wcu}tdD&W8kftCX$To8ZoK4F5a zjsq>>KwegOrH!4zqc` $!&S-(p|ncb{Aq#)@H z)cfIu`x~@ud>%-q^Y{z9d*Er#ZiMy~Fzv@#mqMAxS?i%Jk8ai)NLYdwpBI4GoyTAN zxC=HV7OD!=&6XBm=wLOL7GOBWY6ucWEH+p0=&XIwS^A{8_6Y+h{8+m{rgU?7bc;%W zmMV3-zVPTZRYmTJOE57ryiNtpJAjpf=I&p3^zs^l)quvR!G-^ekBrQqnbB42K=Z1u zKVGYY7g=@VQho@eyxH{!2SgcY7Pa(jx9gM6<1gADF(Fn;ce65ptnEDhLIC2=x6sh) z7By!FE%Z1jCBR^Lh`*(PgMs0tE@&{%^+)pyr{*6X{Ow%q3=EwIJbFby(@7xL{mJ5C z=w@L8tr8IZ0P+Cih5rwZu|`ONhIK{Dq(BBfU=v`_Jk GF2L|ok`**3Y9#^LR{W9+>{?bOs7fm*P&Llq z`5Cmhx0{t4DxCd+5!&LriQKcTegd}U=|oVCc>Kj;P#dz7)l5Qw;pHY4kTsXZAv=O! zE@lCB1BF4hzMKwb&leY9V0_sPv1c*JgkI5^={yYZhRQ~e%Vv0Vvetd#XLy+eQCJ00 zSOZcBTM*E}3R=3C0`i;
+LJ$WX1xYD_ZM6j3Dhg(2g4iD2tZE?Dtp`eS zJi1w>K I`Qq_6<1tY|OJs>FouszZs zdycVIgQ%B(K^-AhHV_-+_IFGmmwXomx#SU;%> w$l~dcR@Qouf?m<@sYq)(_A-N9-U#wvAw*SY zKXM|!4K@ZkCc63oIQ6B2%;`M-LX`;|I1(VuCQJ+r6Fj qm(#)Q1hBqth`z;r0?6&FUeixo_`&^_5)DR%PS-!pwSO2Y zjk{g{cqCu&=w>bH1BET9Wyc8d(u- k(>e;cC@IAUpM69)_r8Mz(*( z4^Z=j^>{Bho1}t=3cz;R!u3yo2RYjBWiv$oY=~M1gjzv}TAt&q+3)y4Jz|E}Q6Al_ zMG%ED2!${9f<3@ VT>L`5C~g&fs;x@fZ33K_x5eEJ0A~ ^KQ{(u&Hl_Ag0a*2NLfyA&?6_V5Zt*F;x;`>KTwqQ8}<7E5L@-#&~qIE(Hs- zgY-cwaBxKjYF; kmjZ%?@5@23u3+`UKSY0n3zd! H4MH^-c2+ z&N40V!c vVHQTz{Dy8VEm(v*Lj>lH|+3~uO?7iezoKsIzX*w6=%NB}Ke1g((v=-g}ZA7jzt z3&H82vQyMs05+)tTFLT)10)Jr!1BTX!UnBkd0_})gBP!KLl?F{ma>4R?Z8udkQFUc zL3Vj`w}NzmT7=rIVDZjY$RZk;G}s`<3m!0O*9MPnQGGs8!w0f@M%%T)L-UYFuM?w3 zrz>bp%qD&T22dNz1GFFpw4X)0735+M&`zRm2vZxhR0gszr+X@ReGX`25X^y~T`hY- zD{~k?bAw -4Gfi99^I@3yx=ikkQJcCs;mqk7h8fuq87Si%8;1>vOmHD=6cBLnr_z1AiqNt z*MNrT96;-XtX*f+hj?^{Hh6Sz1q(o()_D=$3qLIZ>K1}_z=$@0jOd0K2wqyA4;Fwf zQG$uTT+74&>C?Sj%mnfX#BY_{9>>9P1R690`-#7EBDl0+oxvl(;GqqP7SJkNs3SB% zGjUK?fhlMJhJY5ff?N;U2y@J%8@hZ79LV4vIH;5nfjC>kqnq_4DA=?i&g*2|4dOv< zfC#?)!w7TmCs17p+Amhg3yURf*N)dR9?g3}(anG?JOMg0;L+*20=$n2vYhMX43HVn zP_lNN!Qa0f>`UJUxJyxk`uK|saZnKRxAcLR6+Pnt?c!u?Jx~(t(JjgYaW2^ZjE9h> zm>yjNO$HtI=oWnm3cg;@$}DizcM>cCoh7=9Jc2Ou7C1-l1gVEQ5FCvwzyj#e_zdi9 zNU%Xdp1&VF&;r#84Sghkfnxv^_|wH89s+d&yIDn%J;Z7avJ4XN;E6r>q@W*iES#N=OC=vWx&Z8OZ574|aSe3Qw0{*`6 zfB*l3d(s|gTN)$EK&$& 8&oHC+>f6jsb1nHVO3R^o$ppF+;WDq(%Gwgfq &BFY+gX9rB`~_6!4L1@3;(Qo$D?{S2VtnG$UX*A>JCE!txZ;{-KydDldP z0tOKm&)+jK@NWw};nB@%0#Pv)uHwaG@Fb4w3G_)YP%EDeqB avEC2rbG|U0%E0hiAGAJ^9TXPF_UnS`<}*?(3?AL0XF+11Eklq| z=$jzNgZ3YJfW?l#=mVLmTXGO=zygrs&SU$vK?Za~4Cn!gfm^HKLVE_p0E9DrK?Z1- zfHuir@UV7$P@e^JuyG#)188|QsNg*QLbZ>9!Qya mtfgH0L8cI@%3ZkH`>vUo$ay90xZULG7@YS)djgv@zXz{KfTd zP}Oyy`2|<=4`cpz3DCwQ RdJ3JtIN}WBrA@Pf-M_A8+lFBiUZq^i-VW5qNpFDa^S;0m^ z`%v#*F)_Ss1DhAxfmFd9Jqyx*7}MZ2U hzB9nfBS5vyHt^^J)ZnQggLT0M zyH4=1c5MLr>^d{pXA3-fd8dL^gCYXrvlNhqKj0=4L_?_qxLu9#lOfn@ke?>NjDh(n z5NsIKYAKLOpyf9n-JuhZ{Pgh*)K8%e9tcx!gGE6evI3jxy8!MXR%BC;ykuf{9S`d_ zbsm55rV|v^ph|!dq_LOxaVRWlL3}jnC8!H7`j`piXK;#vHa bzpv>pxFB&wsnTzO4^My d z73SX-3Tgy=0Z(}O{`mj@wGfJs?(hHqCqTy-Ks7n&92iIo3c8E>g+~V{7F;iY3wqGL z_)gao$6fb;G81UuE+eR_aJ>Oj2CD8?fH&ZQc3tN#U<6l2CqR|a36Pu9I~ZV<5ttti z;&YYUet8Z&$_(09ar}i7NKlu*RUeWZSMYCh;AlBe3OZn@4IIS>cTEKiWcRWvgChhq z(x3=t9e?3l3W~(g1>l|Zj2ApWEj-Y%1(0g1jRUr*3f6rDO;v#Qr}BgMI5gMpVJI~R zHDp0{@^3rf(JSh0%fsLSuAoCfP23ld>K>A0;-51y9CzIV8a01y*j&4ZsT8zx7wlk& zW;u{%Mo<&)1!#3g=k*sgXP7}+phru9k3QfOf+n4GP}=SWZ%;h{O?w6Hpn4;8MTZk; z8f(Qd2Tst0=XcOJ6F4$h-+-B}2N+*=gS+0~t>q8+`+H%$&f_mWwlOf+X!Eze1ZP)V zfs@IO7C0iHK!yYkXe_b0b`K-?NE#&n+1c ==Iwi9fJ{u=>k;CP(|hr|o;zIRA;2DgEQPy(mf^#tR~25>3w3Ql5QTA|Gc z@aZJaTH(!y6W}xgF^T0fsQCcVaJZF$!A6n4bqQwjV-Eop83%VA0fkI2>yjW47nJ-K zfmz32oGZeY{MgyhLU 3f`0rn&d@EZA`650m?e@FFymM>CV~) zX1X2#Wn^$T&T9b$Qppa8IS!~ z9iRw>#QE_T8W3AAf~*5&1?UMNka*(;Nh*NPA&Uox)xljaA%XZO02HR6KoklDv5vn` zD`aBuXa@NQY& SVW=P&N0E^+un`c35i9ibgOP~c;1xPu_ z*^nk0$m!?>SCa+qjJE6%JfndNE=Kf%D;1;}B?=E8hi7b9-VES{dVk$ C4zWt!hCNJI#v4D>YV|`Hr)`1e~txX_9P>VWn?0~kXgL(v@iGFaHDK>$^ ztYj)A@wtOMU*d=wZ)?rb 9^aCMw?5VXh071Ap&1)aJA&aJ_hKm*dC#9HMCPOOlsCK=*V*s)WcwLie^ z0O%PC-L5}CNe?7+%z={;x*7viqicZ9VgPrgdPQG=@+G9e<6Q!p+9?4YF?0hyJ*@fv z|Nob3z?B5+lsljan&U6#@UVcUXPzptGjzIw7IpjwPmO=|MRMEmqoASpCmy|`OkgL2 zc2Kn(0Q(Md_6k_bA!IF6j)DT7RS#;58ORpU7FtoLfGSAfUgz-_bClS@Nd`0@zXI8W zAg~Fb6NQkPPT<%81-|1B&`Dy@C^)pQ2;`|=R{5V0Pwl$}iV@Hh;QvxNk8W0WusA5p z&zd3m>-`bXMCHdH{0xksdBR>%R#2(}N8Zx?An&nm`@s*YkJp2!)&r%W!*F(k*qz5; zbYFnQqdc;+XCFa6$PhHCbHbyu6m-ZrWQ@n7)Aa}F&^=aRusN=v7S#z@iwblyi?! ^QI`V^aD`>+X$QbY$OCKO(8lA^q1cS=K)&r%iFE$(o#ii>FXk+UG=ujolu~Ga} zKn _SOpv2RoTlD5P(EJ)`xBxsfu<`&nTYGeiDu5^6-~-1Kz!K1L*5lqt zL78v_ 8~!S>FwgR|-DGEgxDimuiJC7=~e zvLGv450pm2#5<3_IJqCRYOEAAehO(TAAe!S310mP9#91>{X8ZDS~CJ#YX%x?2TxmH z-UZTC!urDT5Xf<^E1>76fEVqfkLb36&uf8Y3{W`$YT1KNc=Q16a_;m+AK3-F58R}5 zJ@F#AhJgWcnwjejk8aTZXV(poX5I>LS?GG XdDV>$8T`XN(@* ztiGT4K_jQI0|cjl%7t!LbC9T|>y0{Yk8V~i5C?RkT`#!0MHKgbJHSx{Dh$9*ga%MB z*#2h9-1od8^*JN|HrHoXuFv_Wf({Wy$=c6iVObk=G_6NxDd@1E7apCyprbcGFqDA8 z-~+Tg`2j0WP{Y7uhKHu>2gu=+AmtCB%3t774l?}#18Cy~_!K%Dg%WW41T;U+$=?b( zSoAfQN3-h-Mvvy)2cR>)9x#BbNYIgWHVP%6$#gK2v*e~nbL|I)5_eFI3(~GoA_`-2 z!rEx N8c74D<<-luKh($^u(>*|w zg`J^4__u*d)E7`L$VC H)DV_W|QeKG4|aOVDKzkR_##;IaZdWeA?`gj5T? ztT);r)nf8JP?g2XDI~xEZ$UJ^xdHM9WXjv4bF0Ds|NlELbhPSV&VYL~?*+*+lm>hB zP6bULdUUsfC$Aw*4xX#v!vH|r6(FLZ0qn#2pkfzP^G1Wlwqg6bO80{HcR}WgJ6l1f z?g#Bje8G1I!=Io^rh>G3baQ!hM{#&`dT@AjMhJLx zdkJ`SM@e{edPsP5Mksi6dntHyM`?I;dT4lbMi_W>dl`6iM_G7udRTaLMmTtMdpUS? zM|pU3dU$wrMg(|tdj)uOM@4vadPI11MkIK2dnI^uM`d_)dSrNXMih8-dlh(eM^$)q zdQ^CH&VZaF+y$X#b$|o2147N10OECn-O9ghDkw-hCV(zI0ku0p%Lt%Ty^!!T2gOb| zI56M`EZEEhFUmq4Q0k0AnImd^0}48{BFm#&R0(85FJu-PVgs88XvGsm1iB^xdentS zcPn^-0d(N96I8i^+616g2B96GGozr#YE1wgsrB*@*k7QE7JTyO4v*#o9H5ea!wk?$ zb0+@Qg%AZhx*ZfcUDtH8zIw+G-VX}ueeD2MpPk2FcpV4FD#n4Xtc|+Rq3$+aSmJR6 z4|+pK<`(S%SCBjSw>5wQ6I3;IgWSQ;9lFL5ypaXV{xJ1L5KU0a?|@pDy}lbfdR-5I z^9p3x=f!+?(8;#^t#beW{|Cu|e09W~5wtSS6;#4O8gV78FIXaBB^;>s^#HfRJ4-Kk zbcUYr==43{(&@U#rSn9G>yG`P!#rP@-UN9T)S88yle_vBh!1K%y#S|YkPK+PYfz_T z&{4J}pu_CILj*6tUOM!e6%u~nAtGq%c74$ux~FpjC|!ao8~$yfJ31yT0jCMp$>0S5 zp)a6A0gksBL35NB7)sbdLy*V7=^fUv@qo;K{y?rkTsmFvfJ62Mq%>7%sJ+2ZQU*OE z^v5o6Ee~lJOr6ER@Hz(M0*`J71JFrq;6X-9Cs49FxGNBJB113hJ_isNR7AaY1hJ04 zc#*)w;KIMn^+tE?9gl9`2cXuMM|UZxBK_godC(DZnDo{8$Sr+Py8*?WKAo;NTsnQP zbh`?4fX>mY{lQQw$-gc1f=4&_OlsJ?V(G8{|6k|6a4Z2WF(|R)-^RM !s?d(Ltb =?n#oqMoBYmde^;Ff4-Z3kuv=fMq{JqE9YfTkuDXOLMC5m@00 z8gvF_El6$C4VkfmmvCsM;R8rH2Pq9fCx(KyqJ!5Gbh@rM<~koVK(+!>+_`Q5wW;~H zHGmSf3urvJ+jT|v4rroZ;nCdzDxE-TKxGc-l=a@y`H18r1DgK@^)$L0!0JF3NbqlS zo!@exgde5}be;})IoYF<)Kng+V1e^26w AItY>GcWF $?C{1VXYm zBu6zkL5jy$pjq`^P{ 0t3>C^yp@d ze*x+liWYz Oh0H>`zD5DYF@L-VbQ<9eTnI=(00ok8ai& zs9A5eg4_gdl0jD~{s*lGfC!+hcw^NBYXKJ |Nqa5Gfvjsl zYX-U@=e 9BU2_D^|Dq!8LqF|~Q)ar*D;s}mjupu7J zdqHbU8A>}my1@Yksxbt=gGMw!gB)<7cPl|cC9E%8z*e#z15fN9e=%(xNF3BPX5Gvx z068icUO}Av36d;feW4E41X{Do`WK`TvTzUXp0E1g#sg~66XOprdb(NpK_Sw5pcJ%) zE_**e1MFP(>E}Tq%K8CpDC Jmu0oAok?YCQlt#hq0iq^k4y3x9}; z9ju5tubY(#Bndj%nDxg#P)x9PLUe-eNdm9U01ecE4oYc+h=bcGZ(Tu6k%PNHg|A01 z>wnNR1$e#PZ!qil3zrB`LBqNfWF-7tcvd}-5s=ImyaIISH>(Utq?=U~M716$$pWqK zN7cgwl7i@whv@kLUP{3F5=6BgC^7TsX0-+B=>$#7-v)_7lz&(bw&Em6q?`2+h(a7Q zAptt~@F73s=$I1L7gp<`! EmXP81J*kB82n6;tyJp*L!xS{q61L#mG*~u0>46nt&_JYnh z0dqmuPs|35{DW6O9e 0}kn80KE`pEVx!D8}d z3=3$90xyz69%O|-*MS`Bx(9sI1GsRD0Bxsa{qg{`@#EbCeumZqrCHsqXC6R$hngPU ztW!V^XoZ~gb;2Cl5qu6Fmxopki`RilE7oj?!cql~Zr1mpWeTkaz}3NLWVO3jLlfQ0 zjo=OXtf>#cW0h7O-Mm&H1G-tA8KLD3v R%tMkvBb5TRRGLnDKYG3Wd$>tN@TlPf87W9lnuN~zZB# 0XiP59mD{go;w}H040>UAYXNhmVrHb38bHQCRC1h5=gG|5Xk+#tkb|8 zXi!zG1w{bsg!^DmvmayCWdvP8#~KZG1|xq9xPj2k$`3a70O%4JR%Q?zlwClp&i o91ob^4A+1vY|VT8 z42<9rwwEcO+1Xy!5@f5cgRPQ%1DfFKW_=2xI*-5D+VTIt2jdO!N&Vfd=Ru;NL3nG| z6a3BVKy3)n +$ z_66e$$6%1RKy7c(kSVAlz|r;woeTftxa${C>-V)2s4)&2;?=JMACL}Wn%66LyMBRJ ztKhv?{QC|tUI1^F`r-i^^nJ| mM?{@dC8I8+2uW2dMhcc74$4`ls9VPxArBPH=zh$1zZJ!v>4GL;paAG#J36 z0g#T_+E(xamlq!00^P2EJQyz^^@}=dUwHJgGMj>06yT{ru>W6!0t)O L5e) z-9$D8d|ulDNZk)!(heRka{U30JVYSrgQhgV;ca7C_Y~?Pn*@YtTHSe&sE4)d3-CJ8 zAJAPZP?Moa;+X4i#^bJ_<% chq4IbN$}Ku;ywn34%grO+gyJ`rnW>NL3aGb-F@KE9Tt$g z5YnL81+Yf@O`r${m3_U&pjd(y-#eFs=H34^|6nYafw~iZGr uos-qKxe0b^PWd1 z>w1v!klP|WI$2kOyx!{Z_y2#;(z%!Sgh0Lm+v(8>4i`{=45XuzweCAVL&IKhzAWKC z4%P$O>+y1x5Ukz1Tb6;r17bI0nKEd9{}oVzf}8-<{E7)QIJJ$zh8K16wF7+9M#ECj zeH)-@Xfco`$T@7U%{;oH2eL8PaDq==0-Z7k9usYT@WZ1M9Ez_wJet7_MvrE&YS3C~ z(D7fO>Q$j+53(60>yUU6B?}Nd$oAysADsN{kcoA$QIIu@;G+V;)_{(!0vQjY`N4OO zHNP+bZCrlr(G6AwvQwwzDiSZHL;;DHTmss|3e|3t$lnUOwa%j%te24_E3hfHQ7CzZ zWEp449V8xaDJY;oRwMbqh6{YOHmLCB-v-W0km{t=19~ESWi~X7K*KEcF$@eHt&X7c z{Pu!K@KMkpy$mHTp!M;fqzyU5o_`xySqHeF_vmK*0b1+=xwFIra#o;6CoA(;Py-Ge z{~fIVzJNKP>;Z8?9Mod)Mk z93HEGk$%5oW;#6Z#Q(Obph)62T; zGk9QD9&91#RDh?S`58Koy_mZWbR-t2ieh-Vj}x5ELAqe3Z`1+RhG5fqAf|hEvo5=Y zZh8d7^n)O(6J&Zj#B_Uv>HOQEKGONZ&+sxB$tpHbE4-K28)4PL8n8#4yIHMKtYU+X z0)h%sk6uwDh$Xky!o2{u df%y0x1y#{ *M^B5RFyOhCxM#>p22l!h}LHApOmfNy!xByzX1y)lk;BlOF&IL$?^0F8- zvj@-n9j#8FJOJT?mszrwfpm5rf1$D$)bL_W2XP_t{M)92RCfrx)PooTPLJG>_{#vh z5u6@tsz8Z^zjZw$Xg3w41lERUH`co!!BH>`M0K)W|H#jPR66tU;;55hE!5*5K)P9& zK-oKb5|+lsGLQmjt&LeHx10xQ2Osa~(d)(S(K{7%@*ZgY{`nWT*MkC_H5Ft)H)|Y- zYCTX=|ANI07Na1wIAgRVw3}BIY&_&lJ*d&(AZdUYEd(;No0S_xwH^Q+_6$+ldHlsG z(CKTP5H93UKFC}{6jH+s(L#ZR#?JR3??6JscOsV1m;q9NBQ%b&7JlFd-NgbaWFjG_ z<%0YTIzSY3#tf`PgBAo6G(hPP?4cPIkT|YI$)jwbSTO}{DCh)V3grR4C5pf0H+Yi^ zSP)d@=<&C{M2LWDEvV>a6j5+2Km7z+s|7v{-lKUh=mdBM{+87cbs!!job+DAy1=3d zDvG_E%iod@(F;nw9=#rH&?}rkBMIQ^iI=_uwX%-CDEkQNH-eq)(d)tF(G76|Y&5A2 zs>~m(j5Qz1UHb9=|4vpx5U-mx2}E@se=z|p$N=KOOgaAI#uJ3UAfgbTD8g+z{=(n` z$TanLpwSA&cc5mT_&a`vW38Y}#rSd=WZ-ViJMb8mJ1n+1AvyA;8a%dMm4RZbR28bi zqxk?QD5fsG2bq5KEyBc5h>20yO L;(_^pITHiuMus(S!TyJv%?B}C0Acp4Qn3G# z%;p1`ed!&@|0myo%#KDg+Z$qb0K{xlsH=AIK+Ha@3J=>ph}pu&Sb5)oa}y+PxFPxl z(DZ}$0(kWDPC)4QgX=%{8cF|Y@Bkd^g*RZo!R?3Yk4EU{gX`}`)(<)gihmpH1T_5| z5cjJg^q(sMhmG(tRv%>jpv%7bx3LC5^!vj651Nnl=;eK{g77~?KT-kz=QXHMV%-X& zI$6KHh86IjQskvJqUu1e&_P)Y)Z7CV1-hlMb| hM*2Y2kZ4${Gg*e8}@<=S^icP zHqf9g?@92;BX>6|^GR?gu`~$QfUWR=hP6kp=saamFoTzJhZlpR2^7qr+mt*yS*Jp5 z2VJP=(aGBX3Kq=Zo)Ku9RyXUi6JTrjyIJR)09nJz- G5(T^YsQhj;AL+c4huv7FY zi0Wo#18V@cOhETgfqAS@eW2L)=wy8jQON_AgQ gKGSDe8&LA^d;iGqu%g#GlV_xtxfE#k4m;|+~Ks3lW1<-sXILJUeuF^X= zRDt?3Fg@C(o~TZ+F#zpS0-NH|e1Hkmi~yf71?r7~He&31&JSMS107O?IqEb>7~TVE z1i2j6X=j}b=CS&Ks7}`27qAon>gRfNv(5o&Z9Py5nm`SJvO!ZqJrFj3>wNGYJXRMd zzoj3-FM;w~>zP3fI7q^6DFRE1s)H;;Oij3h&$<9LQvWG{(kir(Dm8_H;iUsu2iV8E zpydvqB1jQ9sf87QliHL69pHh6Zq}bi!HHF>oAv!sP-0~);qPXB0%o%Cx4JNa+yd%t zG4QvTgOev@Fv1$#m*#I(hKPZ}AC|B? @Ln;nVfJ}nj<-&Ri%wz2aQIJs?s65CQp!;P(=}oJYeFx}t0@%T3;GqnU zZq` jBUPIo9nUHfZh(lvag69Lx+P4-)R43ULF(VUS6e zGJdeV+#q>qg4_>UHPLziJV*H(!iHR) z(?EtI667|};wSKOfVFa<*oP)a(D_p@L9 A|(;0s^Yx`kPI%DE*{qhEM4l-!i zi-Eu8`5SP%4-^I9qf9({d8dPo0w>$~xuApuT1O8_*q~8Zk6zvigo;|Q3jWsl5OY9r z;L*wY9OQ>?)&(F664iG>OnA;-{sfkLK_ ?npfVTL204<{N0UvG+ zA{k0dx>*GfGN5~|njyDcfd*(nO02 X^S)>1Mt27@KLOTu@aFpm=Hp zjgEIu1sT#Q0O@{!>J*P|R;PpDe8As&kR8-b3xJNp@o!^&co4jJpan8fs`MDF4qWoc zLD--WW0iukL5ocIK 10*{^Z zx7ag*j`apRgTEylbbk$aI2=j&46t$$rtVgdD#Z20to2|C7Dnjm$RF9DXytDe0viHS z+dTz*)-`0{w-cGu-2#>Y9pb(Tq 7aqExtGK&+LFRdM zo`ReL45C;(dZRvg^onSEG`<2Ufv?jCEz{>fTBa}H(HS9uv`k;YqccJSX_>x(M`wfu z(lUJqkIo1Wq-FX69-R>pNXzsSJUSyXke2BecyvZocyxE6uF(hcI%jl%j%_^;%7eYV z;2ZI<`c#Aw5=KaYtMm{YNwC1>T>`oV4irkAE#RB_AR6G|Seoa7#{$sp&BtF9WP;cG zmI_1k9*4vMIIkG+Z(~i|4{j%`LS&H=!1M=Tr+|BsU!VN{-*TW-38JVIoFq_&2$=ZW zx W98cqP15`=mq0znUT~~~&NAp_bp)B(dHls}4p6=X`3y1x!_41m0ZO&3 zD*Hi&41bFj=y2QC5NJk0O5BVfW$3B()qSXATMzKJ+yGTo-K^L4g7Z>|8N}5{UfTm! z4Z3EUbt6a-q^#A;1f^uuBj7t)ok3%uOF<-K^IouXN-#$gvY`fcgB^?%pFv;=cxE}B z0kVR>MGM?V*$Ofh!*TKuEleK0y`WJO=<)O514|GG4$6V|tU+#-YTgUFIf{XQ>H+?3 z7a+!UP61Doc)+AuKtpwSl8R3+3!_K(UeL8U{M)7?I}0{9$l7ra9Kwtq-CIG{`F0-k z?EHar1R_f-cs3F>l`(*(@dP1mI^F_y6G+Gda+wdPCwZ|Rv?v_h?*MTR)w4h+h~R0w z1fJ?Zp^u*GK0#7l^IlL%!OY)s7kniXC|xm^m~>;!cF+O_wCbW8azn2rxTJ?%VFpc( zC7O6OF90VoXtNWvssK7;+zh%o=K|CW@bvTvD5sPIQj)%Ag9HcY0C*GFXp}Z+2}?H% z8)V+y@Fpm?m59Q0@<4QUf)hPdkiWGYoQ7B*?*=uJz{}a-=gFS|Ez)3N0_BB3&{@gg z8=(LH|6h-kjW&SJQ3RWalra{A7GglA4f$I@ThSnHMN-iSRRM1FfMV<<=&0z!80sQn z>Og@5QU^NZQ}b}=Er`m_DXpM8dmx $Ib88b{-=kXVb_hH+J&0ow1I|H=Vk5yX~y1GhJ6x50Xbud)HENFXf zXFF(>%*LJk3{dYf^S7>sxPI;qi0fN=ApBkszgKh}h=LT6wR1shfLeEeM%C(ffC}nT z@ov_oJD^P?SU#Exs@z%QAPPX8sM#PRz|CGzazM!|-K=I{b>QL)bU2^*4t@qmKG3}O z|Nl!*Py%M<+X0!&eQ5 0~{JECiZG z?quB$62ezVK$;jF9^DZf9-X{Pwu8n!WS4@dZVv&E?g$BwPTqMSZl~;g5Y_FW;L#nS z;nB%E1H|o=oe844Jq$d$BP={Rc_)FmowAcbRJVtNM|XsWM<;I&h}$XK3!=I`0zA4S zB0M^I+d$k-*>(`s?UCTo9g*SD$=d+pcFHz_sBVt}kM4*Hk51ky5Vupd8bozZ05v~6 zx*H&k5!O7AV5ew4$gkiI3ux;R@}Bu#C6pCVu-!3xK^r4GKXkOZU@rAP4qkl?Ez3db zJUSt3wjoQs!Q-*~Ewezye;xFYSWu5lzqA0#gZ0t$OX3>#f-GPt@q b2nf|un( zwmCvunz50fCPN5#D+SoHV+{JudqI4LQseGcr1kj@3=E};&0r^jriwwU$U&nLAR6K_ z@JU lM+ZA*|UpE7&S$qmq zDr3_LFK;737c7U)=yaL7rQ3Bzw@d35OV>I4JzWruAbzLo9EkCd+67^G=kXW%w-^{e z$BcHmTs;6%)a`QgfQO~)f}#L8uhVq_hz(nGgQDF!;s1ZA_6HzE-7ZHTcv!lwC=!A5 zI$c-1W}onyWx{L53C*rE7@KQnF!8s&`}hApG<06qgVbUg-+G`V5h4RwMS=*HQcs9D z7XQTD0#}t9h@dEy0V#(0tCSDQ13R-s0O6u?$c!IY8Z`yf$-`3sVyn;(k4{$KYoKDr z^@B$ztJgJt*mh^=e!?3bpq-lCtR7cEWdvwR9Bb=zF!P5;H>(gxtEKCWTF`-HrDC9x z`QR>JaO0S@oD0MS71S&FL9F91_GmCMbhC180e7-XK<9=sZH5%ht 4II5hT#<`T=>+A{ul=b}wrh#8mK!2rqUuGB7}vCwg=q+g}4ZY_sn)XsIU1TgP8~ zI?2q?>H4O*_6=x_$>(}duQv2Yx9c0oK9c0q%nZ%7Z@5a&gSVT5jtOf5ZTfJ%QNPBc zm(>#4rT~yl63~r_DDFBu1!Sx%^q@-CV^{cLn*c$J%QcYm8hA~)?3<0CfES$$S}=kb zuwbnP%{oGl;&{jh4myY@CF>C9`-0A}z;* MUOs(+fblvf~#G^a( zfCsok3R=Vhni2=?PjKA
2{B9-xD6YK*!RjfsUr{JmK;E6 jX0UQ8xKx-fn0RTDF0vZ4e$N?Zx%fQf3yPW|vJ1)BpqB$N_^KtN56QK2< zJ3O>qSAdTnS^?f0a1k`2*UNgH7b!%KgZdkwlSaVd16riH1HBe;mqD&Y977#LKnn*m z7#SEk_xAkz{~uJ7bo@g-0{@2L0gvOY2mby452{LDtUB}m|LahXZc*tTkbhZKK$PVn z@Xjy=5WAC=v4@}GHE1k$26!2T=*Mo*j+;l!(DJqO_>1~tP>+K321o)jUUU}3>}EX% zqFN7B&iCkM-34NUrYJ!9@vRWZrw4a|F30icWqr;D;)3!cBP0l3=%|7Y1ZADr4QYgU zbhBoGY;QdPIt-094#e&}{(=o;@o`q~OOWvx(Ec!xEuE}qFY+@qgTsKagcrhK;cvYz z4$1|r65s_D$6u_d2d@GH)lnYDTQ5L^#N&AD4Jh+i>s%1)SnE6pHUHoL|BT047eIIm zL6pbw)(;>W)O VJuj2ZY5@rUW`qWF0>P zY$)3qT;74l1iK?a{oxXGk8aTe7eG-CuGgXUebul3|DlHbFXaMXQStJ(4r~qDM;&nR zU0e$)V_SFp`~M$2w*X>*>Ut0jYH?_R*Ga*63ZUJsV8tGttjjJy2cbc-$a)}y&>&Gz zQ>2@<7UZ pNNxz+9FHanDcCItK9a7FN3p{0uK&@i8#GNC(Mv zqJ$4jn-)k45>gDMDIU#x!7*PV+OQWCzYHZj$67&A%lL99AIQI=jUe;8S$}o#Gk_NI zH~(U;2aO4yTEow9oIyc>3v_TTC;~v^j^Oi01HhpTZTvG-f(&8Z1JVs~ C^cL z(sTO43Cc-OyIVk^*DdM*vZ9;S5ky%YssZJ{TyV8 q3Noadx2+9S)IMbP=#}9D_2~7&K+7 f+GUy(t0N$n4S03_8 $SQ=g@H~-))2Q9<|<=9=IgzwSID+u-(I6l-u!SNviTCVc%|9|*7D2*U@b%Txa z=oRHS11d +I9~47)&GVNf3K zW}O340NNePItj$;X6*)1tp_SiUOf8-np0uTf(VrGdK?F{L3&?{c^qerJq@jGj LW}XzB9CrS zbC4y70@S| ItNnH%_|Qw?I5C MDMu?uo*x6}^*T@^ytsj% z!2?bHIz+yn^@SGLPSIl^fo@iJkXo?g_8tS5D~1Qr$`v_faMa8LsfUy+(jYySkaDFS zBy8CVYP6PUd33Xa`K<>)+r;*Qdl03(9^I^wAXUvj7)#iXf%5^VJp`5o&B(>Fg3>N1 zdw^CJd33W*UJNQg4lsH^V%?*8EvW5;6g4(nrE2`!Si6^iC&{FtaglbML4oU-1E^B~ zZq$J$)1XqINLDBT6>6Z`2*l$A?Sz9yIn?~u@*dC<0!u^h0;F^V rWPqkAe?9+I4) zEyso&NdAO2c1tWl>m-hV-J%223%UQU^*|}8l^_NZg=AmuI#~Aor2smR0$hNAIw>!^ zz)NLVPl2xn1c$OmH|w5-;5MBNXQ==@w?Ts*9ws`l7Pd0~HgL}hTw<1TLi=Z>Jg|m0 zcrgyd(dc3N G5gew6K%$T^-ChF=(`EADd?yCd2+4P|LCQdtr#5&o z=2TG66BcsNv5X6lu?%p~LHeYip;k}|WrV3L;qqt(pUMK+?*huXpj!9cA+YDnL3V(O zUWJ!OAyqUh$k&iM7L<9g=0+v{ZLEJ6fODfbG|QzOXMlHmsG1Yq7(vAasJl&^*RUs& z^9P}cWE*G=NVlkcH7t=lRluJ}_Chr9fiz%AB-0?$@2j8@jVt4^XQCz&(7l~e5WSmW zdf^!lR1eMti9!;|q$*e -q( z^Zx_*`U+MLka+8X3Ts&EC^dZ14r)ktqIDwmz|IAAf$sj{2AyIH8Pjvk0KBAiLnB6`&;O(an0J5>&LmVD#u@JzL4o@Y)D;PYPI}=w6T%I6y)7 zUW2+a-ihEbqa`2-h{tDwnBA q5 z4`_1>l9s_ECEcw1L0Tb=M2~LPonRiTQ6)da%NRy*vkf$o11^M096Y+g^_+(_IQx_s zcyx0BJyJqp@ay;uRE7cYY%UluRbrG*Geyo5tS)+OiB<3IG}~;%|KistF;Z#;n00 zL%XMfU5I>rx2P3Zq8BUyYGW~;0-X*9F7NfhQV2buq{AzPB#7vf{{bEFg3b8HU gPGMG#6%32c^qeT+y`yb zKx@hpcx_rD>Cp}8Zdii{#A-RAd{7Mu7V+q0l>-^rycg6D`483rVtH7D>mINM5Fe}o zoa8!Lzk=41bhADKQJ}F!PIbC*XquPRso;&DWxXNQQQ8vAKC$WK^|g#`;d;X?utbOlZ4 zR8Vkxv>xE^KL#4!4Djd{-2^rV<_1vnQUUDuOCWI+zduig`Tf~pUKbA{J;UUkOVTP%-RUj0BR(F59$N=bZV19LxM*=x~GCF2ajIR z1&?5f6tKh*(0X=IR3Unv-e9+ZZk_^Jj5>y>pUlAE+xfz$^C9>!ZczH + zI*-3NlFrQF(FvZHKGwPjG*bV 09%)R>J!L1@TgXR z6KGTmJapa)G9Egc4QUtJKgJw7KOhPlI^QM=cGa|L;2>o2=oRG#nE=sx1hTmb+yH~L z-$AKN2XsvVq v}ubWB3%c+Kr`ob}WWc>nP*NEKTDa6U-P@=!hN3oejG zgdGatZOb5wkvm}8C9E$Vg1iG!2-=q5(JPt+G6Z71Fvt{W{|%xBtAia7I>5$3bbuYK zh;XnJNEMoczk$|IfE^r(a0kc^Ob0_w*PaUU14w~G3F`}0gdTL+(ky5T7NizsYJz(Q zky8_oKyK?i{-Prul#Ey}gSg$SXFwEUYT}qMIKIuGqCy_stWqF0C?-2u`9aKXRs|5% zdH}S0h?NDzhRFWh1}eB%nLr}Dpr ee;j;ZHKZjaS`ShIIl>xLuXI9=2k#cm zhlqoZ1qTl+Jj(|;Rn#6V&guc8pqF_eN}h{xpl||>zDa=OQA*6MU^&p(Va;UFFb?Rx zJFzdI3 h`elDOZTZzpWtM$6tJj1=$4~kP`Jc&gzg4 znLvaLcu #~Du?W3cr&&bns{BrH6-S&wc37et_@I@eZyhL=993=A)f zL8hS0nK6{QdUUfkfD~&(jBWnGR4?n%&3a}cKLfTg8Sn&{Ke*V3M&W;u+o9zwXnQxf zNCOWfG=f@L-K>ohp+g6tF&x%nD37aD6H;J<2EF1Yg3=jegac9pEsX}nG}x@yHlX 0N;Mwj~p!FZ!kPw8m zRX}~C7ZXER7(ANSg5na?w+;fSvjm4u{Rt0fu7Nbgj_1I-a@+Vpw;F;S*ZjklzvVY* z&Fl|b{{D%e8>4>cmMAp;(BMbHiM
;Q;NhuGrk9(TKwW%LRSb$* z5s)@Zu(rAcBtPi{vp^OdD1#JWiw3S>lxR2&TCjpW8XU6u8D0q71=Y{so&+e?=0KE# z+*m5`;+z2fP+133jWtwSz%n>PB^N9W_8#6)!8&|*Fan;&ai&rhumxCB>FYq0;8_D& zk%B#V6tiHdRDc&$jIau1fzuf%fuqF9j6i6d^n(n;7AIw>mYRdqVYhTmCO^ZAn%m$M zx*!v7U#Y+gCw}~Kp#(A%n%YrQ=#TZ_QUc^|$nF)?6#5V>4bG_0xPYicPob}c;dfTB zvVxp>^%iKy6*$F$cLr5}3~K)IA88nvH3cMwGLvfs5`m;_{=NmEg%#bb+cMxjgo}b~RAY?i(bseaZIsW2n47fQ9UjBKU_47JNCE(G` z`Ub3k_3k=;h8Nk~;B*7daL|IcL>``kKu7fP^?-|9_>@N(XgSD6kP#@$KeKOu@(g5k z32gPm8!lLz_7S9|eF(JTrdQM&q#IH;f4K>&)xc#lG)IG4TRNp~P#&~FDT&Z=2w4Z~ zhqWkEEFVGZO~B2K=WF>HUW3LFK*bKo%tXk@s7EL38IYoG)}tT_tueU}BnECY@qny> zH&{Db7ykoAEQm}5H^Rz6Dj|)q91s(t6r5OkTUUTORFLXJ7-SBlH4F6;$T2#l@=zXB z#|DIshd2KJe+` mg=4g=5<4OmWS#UJi4bsWFWR_9`XR!@8E^6mWN7NUwGYs zxi|&nVu&)Ziy_Qz2-V5D1-z65-LzgOP>sI=EXTSKM4^RMEl3O;Ru8U&(jsdONC2%B zng9|5E7}cKB PR-5J(=SZ59uf1GUZ6Izib6)HZwY z5~*#*Uj}ZQae!pIWlw?(=sf=7q6sM3f)-c22d$LpmR$jrm=_GnPt4HO6d-TBN neo zk_abwlyeto^#_U#@^BlTy+8^zvk=f0N08?{k}rVf{XiN)O9fx_b7B_R%?Fr}XS7mQ z@iTN!g=oHnD4oG&6nKoY8nn=+HvlxfWdKs!3sHO01JYdP@IYz6EenK12{fomtUbC} zf3C!^0zB9Zn%hDRZ~bIgc*}vt6uL#vfwY371iaYv7=vyzn8ygw2k~#_N>Jf_h`&!0 zUTh@ux2^)M=luz~z!ZNR?@of*xeBBh>TqxzTYwBkiGjIb?}6gj eBdu9YyeAok87@-&>29^V5q`R%KjAVvv l}gAf#n{1)1I5a`r%16P2MVQb z)?F=-Sg`}=yfvUDIVd@A7Lo`g=Q&{5u+$&qeUJ@zkZsr#fSU926Tm64RN#du8^N6S zY8ghh0JVz{Igb(KFi6hZ22zU_gJ?NV#}DL0W_WV~l=JFA+E6n$j-0nO9u|d5z(*j6 zhJdspN1-+}3L#Ms$$9nhVE;mL-fPAQ4SPYWni)zIUi7iTu4)DyRsH-4QnWaOlRK+3 zNH4ep$m#%MLKi^hJOe2`xT_3Q;P$en-2!nz0e=!=#*5WIK)0%}ZUHS&=@$JP2kI{$ zVg#Sa8`sTxvl%o>3*PQ`4K&n_xQ659d=S4|v>L1td^-nZNS%M*4Ug`r4xnijluWkK z7ZjkNOm-lRpP}=nN3Url#0`*HxJ6l@%1Trl-8>tu(g=@k(aTFf$rQd=G#P9fs9szJ zmOxIw?qE5PO<`%U?EK|1$m7tix_K58!^`X7Ub*OQkaoz;3=sF**p`CUiD!ev5yi)6 zACT)o_BnwiknOt;mIK-M3{ Z!~O9?jtR05vpp zVnGpl05q5liW2@lPf%m6o7D!a=lF{=-psIDghOv2@7%ilhK<3a@d#* ;^1{M%S(F9zlR6QFa9z^n`1ru!FxIwY(Wpd~Mz$6tVE$|1@ H45pySes`LJ3=Q?VX5Hb`Q`kv#-UPYwvKDf-XROfH>yU^}*}u zpp8QaOIbhEgHng}s( Vs=9= zrc^HF=ilbK2Qul~>H=yP)E;0cF$Y~~##m+mzBw0iZz$}#OJ2~WC9WX1{0F-QA$yF0 z3$(ujtOvA41GGiv!E00KzAjkEwoHUZ`zdeG)r+iG9w6o409aChoFeT3Iz_viRTH$v zqZ70}3KSg2Uu^UP^&vr*f f5en3Pk`+(ik}J!2hf%zE>H@3^S|^dXzMm) zK<3tbP@?wzfjk+Xk^oJEaEl#|xt<4IxvT=Q9MoP^1T$HMKvXyAW 45B)Zzt{|s0qr>3021nE-3X#OkH44+kpXQ> zn>U}I0bDx2lmRsxx> xCLnpL`aGqYc`k1scS6z44kGbdjFNchIE+H$1vUyFl`wgXO_p;TkYcv=&Uc z-T)8Nv*v?%$6Y};fik=VU1tV10kQ87ln6b#MK8<)$KVZc(;BhN0Pbp!Zr;6MC80Mw z;FGMPtH45Ft3cfe?NULHZqca-!D9@%Xx4#l#r5bG%>=9QMYFEi^#UkNZh#8o`Qf1Y z-Sq;0pZEX&{~K!0Gw`=SCqKW;g_hHxo8CaF2E#W@SdB--fk!v*dypaB$i8vC0N=|D zDkMM)Dnt*0Rbjdl?8G&5L8Uu`jV*YZ)9xN9*B#sy0qVf^vT9rcaY3zzg1aEr@fW!t zz^#X}x!^7#XkQZ8a0bv7oUg?}c^njmx}~7Y5+8u3B0vQ+RJi3p={->T0jbaeTX!C8 z>cL$J5bJhc1X%*IP6#Y<{KdcbAnROzfX4YjhslF(|8sqSut*DLkuJC jh9< zgD1HxoI^0V^nsNi2e4>0SO}h6biv6b4Iy}pK^uE=u>z~Xj0Qw z4gTu^|0z71j>e{uF5D8L|VEWjy?bu!3|PSzF> z1xja~tc_qM>n1QI`a1-a5MeDq*o6SCHsEsP1E@x>gs{Q2bFK{wr1=0T5IcW#xc=ea z=K2S81rq$sh#9l^8M;}RAWeeKTF^cB%q0?_8v -gqWx-Ndbb_il(8U;? zr4Ky1S^v!hg;wYbgax3>A?!i>1u$j0MbCo;eP6%}LLralSD-dNDC=>d9i{I2zajNM zsI;01)`esVXt!_;SP*8^3DDB5Zr=xxHY=#U@n8n+L@#B1q2&TvE9Uwik}y2FS-WN; zg l4$x(ft8TwI ;VRkq8iVwJW*-KctrBiB)T?O>^4bVYNxXd`_`VF)} z_Xl_swG(uWHbaN&cm92@- DJ zD>iIiJ2ljPV<@o(XN1=oASb~Vb8y`NWq !vH)v6p>j}r5phml6=Lw{ %FW`u5mMXblctnE!pV~Jpek7v=g+hEfQ=MXkFV;kc!S@ z;J|yaDFM`9W&I7R(>ss9XtrYpwFBpXboYub2CD=wRhk89hCTqbl^H;5U05qXYC!iy z`hd<80r{p3tQ^`qkYNn8Tea3O nZ##`QXON^ ?@(sAxD*9~-$jPAQELh{_ zeV}=p+6N5$Ei8~U^#F90HfVJr#6!KTMpr@B9DiW~aSiCi1J?(jTI{k7w1d%T4+?IG z;JGfapqxi9Ycg0PD004B0UH5{bxAw0Up6rCw@d;LAh;gz=oMXY0;B}&CTV+cbp7yX z2Hl`+=FtthbrxjIc4T8zz?Oz?=ytsWIsPD}3)DFQos94iWJ5QkqqeUD)Iovth#_t5 z&f_mKTR@I16#!*;kWW0#LHrW77xV4lH#~RNzVSHj`T>;wJ-S(^gI13~TJ4Anj6@HD zL_roo+V8d{&pf(C*Pse=m0WDDeZ$J%x|)%J;kC9$w`ey+0jSLjsy!6J?VU1&AgFl^ zxmSr*0VHba`l0RwSZ5%Ji?9!((*_|3YAHcVTh=lkaLeaM-HDgZ;D{9!fvAI7tIOYd z1RVUV-cY6d{h&joJi0|+fmfKoYF8U=@J_j_5J8akV+@KOPzTn7L@ixE)Qf`FKY}=r zMl#4_x+S2wnYj=_P*n}l2fF%+^}092dG!t+-J(?pB_Ms;B`02M!Yq&j$$>1$_vjW4 z1aXipxcNF_0_aQv)^?bAb{^fLS`cL*E5YWKf=mNjn*dX$=+Q08jHayQ=4&p9wa_qJ z1X>Yd>H2}cZ!hQ$ZRBPKs81aF!=n?Dgt|e@01ntSyr4P}+{$o$0IJ 89ct1KJe(g z0JRyr4G%y^_`r1sIDp*`G05@|sOSe-7GMEYVFBH}Bq#|g{!m+C%?}viHVMFkqWORT zD8qwR^Fxic0P$ZKfE(xF2KgNW__gPt77p@(C*W(8S l|Cg z2D;l)0n}mgI0!m~7Brf W}Q5Np8;~Qh)1s|XtRO`_zII2 z(Dr9g qypu@0ADL z6a+HGLBXT>g#a`ve|SIxJq3Ix2Wt<=25|ZZr=jwd;L78LNAm#%kk3;=r@?+;Y&lT6 z8P;|B^ang@6AaM^8|<@#YV3A!=sf _MjSZAr;Q<16S!d}Jk8V~$kO{2^ zO2b~rf!1vMdvvota|g8%K&dM9het2#c@Wp~P)P_Vb#yy8Sh_v|ZOsD7J8(ce1Xi~k zs!kuI4&>~w;OdoieILlU<1a2u1ce(Y2`mMPSRN{#3^{cP>?de|RQ-WXc)Ni1^Me#3 z?x6d;oB@<4Uw|8NC%{$x!CfmsC3Y{XESL+b66L|H<1f@7Fv5=M@qio=*16XQl;=CQ zf(EV8(?T~Z8_2fS10~_ztsr%st_$ERy+NfGc=X!?GSYUt7bQvToDA|B ACD7p8 zl)#6hbRK{48gl3(C}2`Nv>^v`m9V}zdKD?PNWd-x1Vx_fm)C~iVCi-+00%Ls-Y-!H z3-yZHx`9FzoK)t6m%)JQb=VN^iPwx1u->iM8G2{G2Pj{z3k9_hLGcIDcl?DV#Ecgn zy#b)S3Qe3~;~gMUAR%x{2`eqDn+|}AM9da05y!x!7eF1+{4Du>H4L)_6tKLv~!~09r^`)M >X`>JB#( mWg`pw}L-`xOm6nqA>a zTMmF?A2P_TU-}f&oMzWQFk@Q|l%DK%{ex7Ic9w!FwI7h0?*pPf1u+p-88{1r(*t<8 z>IcXp5G^lYT0kejXd?>l#y6mOk zvAP9<6{a{d9 zf!s9@T`&dC{NQZ{kYe|sNB30FE$bfLNS1dVe{p3N8)!cQI9oyU8Gqk dZ6xe z-~gSO3zCDR#J*NGhR#+SkN`w6|F)?htsMf*dqJWMphJP6=MAzR1T9IiJOsLfU}^?f z3+pzhkQw+;08m*6T0sh;!9E8cFa%x$2c1xbgbYaJB`C%`n%9EVg7kpIz>O Ip1 ?uIFCdk!4j!Gg;1lmUL(h10`W`?_`QX7+ za7KCnzJ9jT6_WcOfU@ZW@EMFHpcw@a(?-7(G>8EjfCIT!4?HIb;(=G@S-L*pZ#fK3 z5TMBn2Cx$T*14cs3N$j>%>Ysc6@_#z!0J3eOMXC;cx7M*K+63W9?hUxJAoJ3J7AuF z*#I&71}H1}d -Y x)f9>J* zNBo!n|6fXg^gta4YRPII@&K)M>kZ)80lozWG{4ArVJC Y~!5hs>xWGXUigUpijN3sWtpPd+RARzw4#-#*JQ;v00dVpIxgXSb z0rgkFT^Hn(_x3C-<$=xztN@+K*;(3xoa9~@9_VI$)xyuv={m&&bYdkq?alD$Wfimo z#f|F@&{3U`wkfDRdi+KD&;S2BT_?a!0rco)We2M~{-WyB|NlD}SQr?rT_+TazHrzE z^8jR-pgwqx&2 g&hY5G|AL1Xa#1%Z!aH3-mpE?#rBwY= zwbue3&AA&uxdAG|;{iH}($aN9=`(03L8NDRSh{W~;rHlv-2l(erH|l>p_a~K1`U{9 zOa!e1Q2_1MTLY;iW_W;3>+JU3;GqdR)en42*UTfJlnoum+T_i|@UkAH_&BWX4hkPo zbhs`64OfHWasg<9{xyq7FX&)W-xb}VEgs#qJ3Km%y?FN C^hM3^+Py8 z0%U40s{_Qk7dNcILvMvHp!hic;-?lf!^^Lbi~^ce+~EN_U9j~4Y{ w6 zT(g7=oW~Hdt`ER#Zy=Xtcf0NYFI 5_={EF{{Lrmod8dzsxM}3hNaS%3n4)U z3cnJNWh+1>n;6K1=Gp@c{4En9@}St|hwLrx2IuPLA9KJ1Z=f9BdHjV&CmX|SR&bgI z9g5lM1nMXs=yq@b?QGTrrvcXkkP7x2Xv`Bdgw`wi$qE#`U`L0%|Ns9rC|QHA8^8MD z|9@C!do4J@1L77?@%Iwk dy6v*Y7>`72ZG8Wb}ZhiwFJlF?XIRY|-|M!2`qzuw^ z?wz4`__wkCs|U}vNr76c-M)~Pf9J9Npwj1sQY{<9Yg3P2(0I!67jyrE3OUeJ9z!K} zbM2owC9K`9e_o4vbeFz>>g;y?1L{!Kz)DyTm}|hzW^mnsvbZAiKa#^B?nY4w%F&RD z$sSoHxOv@K`lK`T0sl5u8;B1;Ipall=!0(GCtxj*D3GsbV|Z-|^TMrvSiK+#@xp`d z&?jIYK(vZ9AbA69rAKEe$imZg;2@Jg>m{|gGcmjb&+S74EC*~Gq`$-6T>AwaU|(Km zfciYWt`8u|y%=0|`~dZ=K%x2rtmp^mDtpi{ed&vC(1E#MI*-2yb!TGebOi^0sS+p= zbi00m)SKJEsVDRSc)09Z=kXWIKK%dR?fM7WS%MB+b(TKi-^R)hal0@$x Mn{2- z#_+5$*l5=uyBI*FJlOE(eW1P~#J7SF-~NF3_T+mkp5x!fYKmraX&)QIYcrV55B^~F zlo-V3KcJ!mbVqmR@fW#$=-z@x`;{87*F@2x-M1H-Nx*Xq71-?oYwGs>0}6I<>U`nW zi*5}hg7P4?phi$;6|!GMu-hR9PQ~CP47#9$0d%T=6&6b%xrPm5j~K{BNV(?4y>2#! z*H*A#TlpJnut|Zf@`Yv?#~sj~=cR6R>!3k5vl<+9G9b%9!3XZDf{u&^7cHzX(DOL-_cGM`!2_{%x$P5IZHIcHRIFGeE-r7s!tmFbj|V zLimvvT&}T$7Ankm4GvJqk<*~e1uEJ;VE7OcYdfmI9z>0` *UX=2 z0}Z;dW>kS@?^qK-6nH%Nnlb~@QRm=N6*APB20E9h^+2iMehJVp*m5V(I0S0|NVJ>P z6HJA^@aPr-kDstwzy*RhK+_K%-Qf5><{-l0(Jd+kmSuenI&KG2!i9my09~O|bgVD@ zA&0|#1i8!7^+ze_q=5%j(4~0YpuwjnodKZk1EN|5rLP;v-2~9!I%v@vxOV_*@7(|g zCu9sVA7pngs1pKizL l2thePn&$&hZOytbv*d>7d>|XqXSY_9661M}Wu# zRHI;~yo9L)Ra+&XRR4p2n}Y~=Y9BoG24AWJ)!$kB1H5Dlyv{%$mbgSgOA|m%aF8%) zZ5X)Xg{CynOiyR&2V|k bHJGgG&l9YqZ5>#Kx4 +5htJv(tfDhb%QFy2L=XPh6M}^;CAEv?a+4P zlkK2(C1?x)!h&|8{wXjpfL#w>fUnC4>WTf j_YE6J28i zSYt{03pbdil4w{Uz19W=(m{+s65X{85=f%^w{bIotN;hyBd93r{cW(I0||M+hnMA{ zLC4X002C9UpkCk#XaueN3-UmT-iv+9AdXinQF^fn%8oA)d$A14W-Q@?lwcn+LG6q! z%@0^w50qr0II<)P)Pv}D-2us_=0Ct@!y{i9>@O^l|7a`3U#!o!!hB#4_6s!f8RfA| zmf7w_DkeY$<_`~08@V&|MdyhQ*C+hje8HK!J3zvt8!|ZU*m=^i^8&awfm92f$6xS* z_dmP7=q> gHGHBw`ZZ(mULd|XsrR2 zAI-H53?=Cv-L4JY4ieA=-oU^Bo`gaY0*yI4qN;*rgBx3*A&~|OiEiHx&@BPr4is1b z7NzrKz)LS07)rcA=78My{@4Hipo4cUyIJ)ELESeNP&R)89w%|_0I8Uw$;bdX&ej`b zILs_Qc?O1;dssjzbpmAUhILl}c)>Dg!i;qrlnq+(wh6-KZ*c^*N4r@kLHMAY#o87C zK7g;6l?7}#Xr__13Q0Z>CjVp$D2_qnG^|NT@?kLfBM^B|BJJ=1-QLjc3hrF1{{HtL zbR`6Mkf!ta3sDFkG=c!`IkH0dpi&9k7ykMStR6Hk4;m!^jU{-1X2*`Zz5sa>G|rK` z0942>0Nou?3>y4dfHL?K3fHC$I&29vAL{zTLlaywf{K6#po4xvBZZ8hDWn$=9(Y+c zXlS|f_>13Gpa6FT4G*30==KH8z0QCRU+nn#?>}VJ$n}IrFAo!_0SD>y9`oot|6(RY z8p)O!P*ouBZUDt%=lK`K7^*Hn9061O0#v|36}y2IyWRjVv4fOh4?Gw_6Z{t-)C&kT z144lYo +!ZBWTB8>{kPYF{rxe-2_Tk&=SK^2ArNj7J;j`&f_nhe)|9awbP4h z3qj?arRxNQ8P#wz5|Pd5mI6;`&j96}mnvZMKnVwA-mYzo3=I3gxuEm-i@Fb>hBA0) zq+))z>y*ypFAkJ}reGkKeu6ZB%n*TF!;fr@iWKO`MNs*{P@>#iJAnamp`Ax}XoE+0 z=?w5dYv=J7!oUCjhg^BY>hB8;2L6^ikYT17pgserf$<_x6%-zaA-ax1N^D!O81$Iw z jW@06|{lSqqDc+-~azEovk%s>O@Ct1=?*Xpv!Q2 zr-Ba~>}~}qhSrqN^+6Y7tpRQL*$dLcP@>no7sLfOV8AChK%1E!-C#?gbqqK|AN~3N zKTNfVM=x0QKJX#>oyT7Yg2u9%!LDWCZwX`p?fe8e4_bpPU|`^H6$BrlvJ7-s&3*;} z28I{&%s^oYK5^kV_yhn*+H3{+8EiAW`Fj8D|Nouf0|%P-f{q$ss5J8E2CD<5$~t9` zIiL)5U_DaG=o1IIVhd FQndrG?j8f9K-n9=mi5*ClhEnFWmA)3ZNhWg{d*JM>mOp*5mI5IjXxCl+iqT zA+zn>TfsI!GKXX5Psh#^;C3J=(4T;sJiXwlc*ug<&f_m4KK}m?Id>D5G@)UCS{`IE zM%Zrw3q!-+3>@Lmu$LEMU;uB)>}~}WQ*ax;eSnu6^>UDaX5eq#0xtEzXL))w|6t^A zUknmx-U}+|82DSJf_UAnAl@+shL@mT2ue^^bhGlf!_p1tR4K5pJCDC80=o|sUJ}TT zdjmR@5$40=FXn)wti j!X+4<3E(lmo>N$fNnIklZ*Ed{!J}RR4$(NC{*R2^9a&K}~M( zNb>O)O&lx?$6Y^wN?g#Q9sZ7z|DZn67igy*F|Z687eFnHgOHpS0g?up{Yw^P7sxp_ z$j;#cIj6by2WTnuInY6Epv89Gye=;M4Bf6zAcM`qS)fJ}r~&%J!}3rG>x;c$g`(=9 z8NhB{39#BP5Vh5rpoJ*Vv60fH-L9bFbFn;VF`Od^Uos7v00!OYb^^Agq0@H@XhgvU z6e(-ES GugHM>0cw1l05wQJ;q&4ESPV<2@9lDESLf4mP!vFK+Ss@f z#DS)nVj)n^6=|q|zx4|P1H*nsPz5+wA7mM*H4d5(a6PdLR6{|V*Nm^hvxAV82$i4_ zjuW7cR4;1<*e*~=$0A#_Kmb(qLB~D7llq|9IPelsNM*wM5>(=V$4U-BOwxm!G pkb2}jGf0IeRFW%s24m^ zey1C>qRsUL#EXugSwOJMtw1h^FUP-{2u>iNK!keT5$^7t;6Q-JRy02-w(fKue{m=q ztcCT30Y9h-4{w@*mf^xy(}4mP S3(C8L}QYWZ3ebFNgG9J1n8q{uo1MW0} z#zS8)lz^trAbXM^>pNaRlh?1;px&D+bPN>K;LLzDI6-Zp&JP})kW-#Idl&rs|KFz* z+}7%71+|2b$KyZ^O+;(qB>1#mNSTfheFzZ+A5jbu1ubpR1&{mq!ZOgLrJ!^KIj$Ib zCOW8H400s6Cki=Y7jkPIcsK)kel+Nu0gxi-+2NpWEcj+S(9U9rM(CY%;1h>Cp$!O7 z9q-Wzs@uS>f(cIrwci+T!0(%x3cBIWqZ`RUap`HP_rN6nkl%<{PYlHCTQFb)jVXUzFY!|Tc}fuASOeMwZ&!ZY_PHXt;a!WvUxA4 zVa-rt=mBlBgSIAsTQMG%hd?{0AWeGk@GoR3Fz7;x9*9;@@@3#}fov;p Vx_7Z3@uM6@?H{>Aj?q1OHOvuOt#5eg` zpeO_D24#DTm;e5IFhaQ9;FEq~hxJ3ELmjm46($c>23ng4??ZuFZ62`8rH;QS0*`!w zTnuS>g3jOuvp`c6;KTntU=D-udU^X7gTft=q|R%C-3PkC5#+uZFTm~tbK&j-^C0eP z2QArQgc#Nhp+E=HbWR1SImTe;0Tt{P{kI5YkpTa8(Lam08PY(@8hcs$z_x=E{L90j z;;|c73IR_uy#<>A+Ljjy)(B0^(jYg(nzoR<0&!jCeL@KjZ0t0+u|L5qsIf;haO4ps zu(ABDpw_EL^IlNuVBl|oEFy%bo@eU#QV(biCvxf$TLeu#;vg5mmVO@d=)4X|HWnba zKo??m9)H3392_kmQ#{~72IfIL{sFWwj}g2q6uRUSCE0v}G@J#X3Edj*RB&SHL`^o3 zWu}l7o!z4K3&GLo(F_(~N7xQl2C=;eVmnv_p5DN`US4;wenfhUR|lszuq ^uuX8F$4J5sRSRUP?eG9-2<=-yavjCpnbilSl(pxb2G8%Ag z1@0&Fx0pjp18_mY-=YcP!2=g`lsjZ-5^|(IxCDFzwgXWDPEx~>Vm{mfB}D$#tDxaM z@O9zPF%JjOm 0pZB+(F{JTRm=k(u3%k|aNQ4D(ZvW>06pgyDZzjaF9z4`9?&~5 zds*Lt4TS_G7bB>fi5!qWK C70tXxZZLW8q*#%OHKzfl1VB;a9?45@|&BtC=8D!(HfQNBf%|SDn zOr_3n$L^aAb?ni(psm;t(=PF2I#vbQG$+tGgP ;7KJ`WX+zSjzo7TXwm_;H7npID1RdQ&4FMuK&|noAZNkCD3O@~a`Xja6c(k$ z-CX;Cp%l8a1vDE7UJ-QmGiVbGtT!smzm2up6uMKsMCQdYh+`gr)**o=@j*e?dHhAg z1LT%Bd>I|IU(WRK-+yqq2j+wO1qF!paqu-G@O~a>lhOpx3ViU&amWn+3y)q8MvqS4 z7yR3VIs_oAN$*U6ZDE0%0b1OBKn!F6$aUac0NQ-r30WNP`vBv@@`JyaJUUN!9Q yHir@X{QDH=lR9LO0a6gEd3k zqx-rXt8PNh=)BN;zyNFxnU3fL*$-W+0NK3b(YY7Y>hb8@3f= ; 09DMa>>zpAL35kDK?NG?XEDfn*5x1w49L=YZ`${$h?aSZOU(DeoUxsQY 7Zc5VX0v+xG{wIN2!&Ho^%c(|P>GsozXUn=e5d&uE=?NlTW!&;WyUC?Hj`@PF{l zZ{WOuJhmz~2fjR_@eODlqDLqAE?}A^8q&Pd&3aZCISD{Im!L%TLPZuFDQiLUoyT98 z{$gV2W) J!l0^ zC+lTy(Ehix+~9VBI^>MV?SkN}`#}$MY8Mx1AF&?j(5C~8ppo+gP*e9fIJ7}I@O6ks zH|sgDJm|(dusG-*OpplU0gq1BO(0gc=xQ* U=PMqkU72y(A{##X*X#mQre|Qfp@GGwEmBQe;eyhU2xix z 6wqLXE7w@?$Cxbi!1r3 z9OwWW!M_bmf!o3*9v;1{Rmj?MAle#X+Dg>ASvzz KjGkha!6pb1gX$)TY5 z>jraC&U{-knHzNG8+0ldY+C2>7jkbHLFY`=!>(cn&EtW>aQ8n@>SzT~U^kS+VKFig zVq_<%CB7B9zQ*?*BLfztY7nI!y}clRgGbyUvq5uTGlK4CZU#G;v3W1Z8?5|&*8l(i ze=P}7*UNgt7v$4p`$1E0FS_3{GJp;Y{ehfUw@rnIe=qAwuyW8qlswo~&>`a>kVbf$ zZ~+4YL+9R{|NsA^MNxMvNDvl4e?iAt^@5v+peV9?3)-R$Qs4m*gp{n|Z$U8vRt0f$ zCv*z--WyPGfYf&$e^K~~kpbcd^-qip;Fc7$ZP3lis0EtL0KwEX8X$ZPA^8sj$nJdaROh`Y|^}|ch311)% zs7%%`EdVh=oe3lzupPJhC2zp8kdwt*4wOWKTG$@it{*%=H#31YD188#qE`x9!uA8U zgiQ~;o$&{#X9DgGftRm=_PsKK7tEs^KFQx&2#R$^P~^UV#uH>i6lgUac+>7yQBc 3pUubJVkFX$91Y=YDrVmsu#fX?GDBrk)fX+FIC3n~V|)1t1R1C2o8pwHh5 zx=IObD!4L*pMRv!-*N)1-t~hAs*GM~ghzAj2S)yu 4;z~Kxz5lWxGr5C%5Ua2fd zD^m$54ngMrMb=gl1@2zL_X>mMI*-4&cN)~OF4gO1?NSGoeoUpH887g$HE;ieW^_S0 zyR#oD5vGF{2_bw64#wOMj3B!i_#t=ng5&x4izhD;;n>S620AIJ^Z1KwALI=Npow
#v1%;Xt_;?b r-=;B*36Y6#wR!qDORntz|`>*gOZ{4JoQ-~1z{J_WQuH5+tN^baNQu4l+p zTW2Ud(Sp)AxEl)E2n|XimajqWDCn3$321}%4@hdRy}$t8s0uoX_Xc<{(DlPh8&J{% z1qyiR9dxQ-=<5!Fm!BEHlakP-kf`o^q15~%gufkhoGxf92mIVll|D!rKEtC|RHBcY z!GrO_{|CohU$cWN%ww*vIbL=#Ffbf*ea-U{bjR5-*VkOHtB<+9=6zjy%=I -=M` zueo1mf&<}&!NCV?ovxs4jTS}?wXgN-5*un?o7YFfl`?bURB8!UY7AA%>H4PI^-YKC zYshAAcyRJ>1N%D@v}@uuJK}U{@DZllo-;FeG^2+fs49aMY|xURv-C>0>lK)@L0KOZ zw4JUWUOR#E8YmIzml}Z!un(YRwI7fQu;$t;3>93>xo;SoYu_+bfcC3`r9nj= $0*kD`k!_WQuk9-;`WGMz{Y8G@@ zl1JxW(D*{ (&J_5-R63Jjnc{#-ZfJY{|cRZy~T zJy4?3Jr(STZm=<+DX?Bvsa{Y%gLYZ!Kqvn}WI g119hAZ+1pnZOKM(EzpM_=_38VTH;uaGr+RB?MZ)l!~m>wd3VRP)le1OsMZ% zJ8*ifqz >UP^<;bD=TpIsxM1ZSdov1R*EI9Dm{P zgqh(b=uAS7=DnbH8AC~-M|UjP7a&_L&w!?TKs)w9i^e-VEL~TWh=6ymH@^Vi?88;c z>d~CL0+i3N$nqk~f;PEpf))sMKs|pGvgQH2t`-#TT>LHHK%oo`d(g?0pi{(-znJ|P z)HjB#v+jS)%<$44JmxL>S^?DPXML)`&%k-1 0uj>YnUeV>Cbw`k)oc@Ch z3@&V_-YdJ&wDA>R(W%I#96SA84mK_#kQz==tRy$6YTh$OWZ4-wqFmaS;gP91eo- zJ@EstI06q-*KY9WF5Lk-bglEyi_09K_H-R+H9Djc=thy=0+y~60A*-!rxco@J-Wfu zPT;xg<1bb|0{Iv!5;_4?k-*|d!J`{;(FJJE`1p%@h)Pi0f!FbO3c%B@j7N7bIE8>t zlK`y&f=oFfjtxU@K9_ePPic5S%39D8IPkVBR&Z14h0-)opn$gBftpr0%9$%3&>ISr zN;N#dN56t54Zw+-{RenC)CX{5p|l!YlD&kUU;x_Vg*XWle7JARffDr>>!!l&1Z_gY zZfD6!Pyy|s4YCN7!eG+|<&xmW0LZ=@kb3zBxEa(b&>i{&R9Qgs#XQiWXzOl&0fbuf5d^_<9 zzG(+)25jpmc+2N;*AJkM4agJS0W4sOf#(4D)I;b>!o>$bYmy)<2^C+=Dg=#(Sh{`y zFOmn(s$BT;|37po;Op)16U;zUQyCtewJSi2fkJ0MHsnp|a9x5{&2+mi=yZJm+A`q! z1ibA5ve<%u8>_x7bnpRwxGH!}{$kK!so>MgA=&aEgb!+_UjP*x3@1R%G0+M;aO>>j zaY#ARd;okYQx*p}UJmf@D_sKJzYE$=a=@|kgGaCFoi?P9yUzjc @o6Anm>O z`^*e4!3#`#S$9D+y!iYCZ0re-=GqesrNSP)tjnP?H!)-;LS^=&$Z&h~vetlQz?; zfV^S~ay!)F8`;4&9N^#QyTk*W_d#dPn)-pYK;v2$ hL#mUo65lH1vD-s4IL0UexRJg5p+uO@dFDv96>uKe?T|y zyzl@IEQ4~~|BI~$N;qF+<%7}-bXNd0DTB6eg7=Yvj+!b2XT{f5pri*XiuFp(k+*)@ z=#{D?^P#7)fHI_wekl(`Gs>yk&_mpyDj ^jE6qz_?%n(`2}otKWW2p}!i0+|V|;g~Gh7+T@S zY3IWZSc6UOKx*tx@Q}F&WJx!q9md@P&H*nDSs?4zhv|o$7FH_m0j={b!6v{q?ZUVA zdUS$L3qhH C8; 3!3#~DDi;RyWj 2-jvQ9kYp&WA78L6pt#uy(ysr|8j~I|Jn28Q@^<4FGj@K*u0^ z90x6{{10w#gB2|Buy%b=tLoA03Tb|W+rzNCBtRWB#tTS#U>hDgT@SoehFEw2-3HJC zL03=|GkWy$z#{O62P61`1It6Tpwl*?((w2NI}Ow@ay{`{4%|Qkr4A%#cY_a*gKpmh zo$z$Pqto>Q_?YGspgUnMfING`0~9$b;A8EeF(VGWS?2^aXLD(QqXo1^;Q(fUo&W`C zw=3A3QqT_D3$WNSfz}!qKx - zu@0blYe?G@WQ&6YG{M6bd1`| s3H!Rvs#T^l^KT|1f|FoKR0n|h$5bsNOF4TyLGhZQ*O zLsp%FZUJ@eK#~U)4iI@rNHBRE2QO;|t<^r(x)n6g4jV6rB#=5SkLI UlJS{RI~X6)*4{gvFG#Al-1)ovolHa4%PZa}$`2 z#R=f7@xlYT78$z*U^Spq1YdYqyMCwv9SH|IOPTRCsA2j6TzZ1?b0=iAG>EAUv91$5 z`UgJl3oHjJ??4N;K~4mpN^K2}|5{xS=)!7iaO$X)_2`}oQU_b44Jr6msDN|WCYY!; zXteEzNF6&Q{6U6-Jd6}+;B?3c>S2Rz>tt%!3yOLM*pMkCsaS&@TVD$c1Z(j6uligV z9}(h^L;yaU(h}^U8c=Nk-lNn#6=DTw)CDR4_5o !NnY9*V23!v`k!{DC$Y4f*6VL@% zcw)B(tOiv7UjWrJ;6!!<)P@5mGEfN!I UfaJmm5HmIuEFD8Yf83M#fcFF*!B z!E4(rT~F}$odpdnfoo*2Bl-LGfCV7MfAaxh4@=h_{C&_#7f@{qD);$&r$JPK>p_UB z1N?oUadmLp0$P5R90zX|2GtF(t(y0O_TGq;YI%TcgKs1Ol>?yNOvn)k>i-3Byf$ry zXoqa8@c^CDaKJ $Sm+35co%wWY_wv&|sSgQ5&H ?4fLf}Ms_d>TIL@YH#u+3J_Cw+f z)c-_@GX|(DKso#6Ehf;AFSwPZ;b94GjqvyE00}}?xPZ!Sw0sA-js;If>z)b@JIg~J z{C ^ZeqxUaA)WV&{^Z)j)(7t4%a=%qd`9m4}d#uH$a^>@F~GJ zJU|^N&?<9Kx9dQyGPI|416svLNP#oqX^^&D(1nh<2S7b1h&D}dX>IL#pcd2@I{=-P zhmI >ZK2SAmja@Lg)rU@tl9)b