From 761164e7d1416d2a8b780f54c5bfabd5616ece44 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 16:18:56 +0300 Subject: [PATCH 001/362] Updating branch --- .gitignore | 52 ++ README.md | 106 ++-- docs/en/README.md | 78 +++ docs/en/arrays.md | 121 ++++ docs/en/bool.md | 32 ++ docs/en/builtins.md | 69 +++ docs/en/comments.md | 14 + docs/en/dictionaries.md | 96 ++++ docs/en/for.md | 110 ++++ docs/en/function.md | 55 ++ docs/en/identifiers.md | 15 + docs/en/ifStatements.md | 27 + docs/en/keywords.md | 57 ++ docs/en/null.md | 17 + docs/en/numbers.md | 74 +++ docs/en/operators.md | 73 +++ docs/en/strings.md | 104 ++++ docs/en/switch.md | 52 ++ docs/en/while.md | 65 +++ docs/sw/README.md | 1 + docs/sw/arrays.md | 1 + docs/sw/bools.md | 1 + docs/sw/builtins.md | 1 + docs/sw/comments.md | 1 + docs/sw/dictionaries.md | 1 + docs/sw/for.md | 1 + docs/sw/functions.md | 1 + docs/sw/identifiers.md | 1 + docs/sw/if.md | 1 + docs/sw/keywords.md | 1 + docs/sw/null.md | 1 + docs/sw/numbers.md | 1 + docs/sw/operators.md | 1 + docs/sw/strings.md | 1 + docs/sw/switch.md | 1 + docs/sw/while.md | 1 + evaluator/builtins.go | 104 ---- evaluator/evaluator.go | 544 ------------------ lexer/lexer.go | 193 ------- main.go | 58 -- object/object.go | 191 ------ parser/parser.go | 535 ----------------- src/Makefile | 23 + {ast => src/ast}/ast.go | 165 +++++- {ast => src/ast}/ast_test.go | 4 +- src/evaluator/bang.go | 16 + src/evaluator/block.go | 23 + src/evaluator/builtins.go | 199 +++++++ src/evaluator/dict.go | 32 ++ src/evaluator/evaluator.go | 384 +++++++++++++ .../evaluator}/evaluator_test.go | 102 ++-- src/evaluator/forin.go | 29 + src/evaluator/identifier.go | 17 + src/evaluator/if.go | 22 + src/evaluator/in.go | 81 +++ src/evaluator/index.go | 44 ++ src/evaluator/infix.go | 246 ++++++++ src/evaluator/method.go | 28 + src/evaluator/postfix.go | 40 ++ src/evaluator/prefix.go | 43 ++ src/evaluator/switch.go | 30 + src/evaluator/while.go | 24 + {examples => src/examples}/example.nr | 22 +- src/examples/sorting_algorithm.nr | 63 ++ src/examples/sudoku_solver.nr | 101 ++++ go.mod => src/go.mod | 0 src/lexer/lexer.go | 329 +++++++++++ {lexer => src/lexer}/lexer_test.go | 22 +- src/main.go | 67 +++ src/object/array.go | 40 ++ src/object/bool.go | 26 + src/object/break.go | 6 + src/object/builtin.go | 10 + src/object/continue.go | 6 + src/object/dict.go | 60 ++ {object => src/object}/environment.go | 0 src/object/error.go | 13 + src/object/file.go | 45 ++ src/object/float.go | 19 + src/object/function.go | 33 ++ src/object/integer.go | 14 + src/object/null.go | 6 + src/object/object.go | 49 ++ {object => src/object}/object_test.go | 0 src/object/return.go | 8 + src/object/strings.go | 83 +++ src/parser/arrays.go | 37 ++ src/parser/assignment.go | 30 + src/parser/boolean.go | 10 + src/parser/break.go | 14 + src/parser/continue.go | 14 + src/parser/dict.go | 35 ++ src/parser/dot.go | 18 + src/parser/float.go | 20 + src/parser/for.go | 92 +++ src/parser/function.go | 57 ++ src/parser/identifier.go | 9 + src/parser/if.go | 50 ++ src/parser/index.go | 18 + src/parser/integer.go | 22 + src/parser/null.go | 9 + src/parser/parser.go | 314 ++++++++++ {parser => src/parser}/parser_test.go | 111 +++- src/parser/statements.go | 81 +++ src/parser/string.go | 9 + src/parser/switch.go | 89 +++ src/parser/while.go | 29 + {repl => src/repl}/repl.go | 10 +- src/token/token.go | 102 ++++ token/token.go | 70 --- 110 files changed, 4863 insertions(+), 1820 deletions(-) create mode 100644 .gitignore create mode 100644 docs/en/README.md create mode 100644 docs/en/arrays.md create mode 100644 docs/en/bool.md create mode 100644 docs/en/builtins.md create mode 100644 docs/en/comments.md create mode 100644 docs/en/dictionaries.md create mode 100644 docs/en/for.md create mode 100644 docs/en/function.md create mode 100644 docs/en/identifiers.md create mode 100644 docs/en/ifStatements.md create mode 100644 docs/en/keywords.md create mode 100644 docs/en/null.md create mode 100644 docs/en/numbers.md create mode 100644 docs/en/operators.md create mode 100644 docs/en/strings.md create mode 100644 docs/en/switch.md create mode 100644 docs/en/while.md create mode 100644 docs/sw/README.md create mode 100644 docs/sw/arrays.md create mode 100644 docs/sw/bools.md create mode 100644 docs/sw/builtins.md create mode 100644 docs/sw/comments.md create mode 100644 docs/sw/dictionaries.md create mode 100644 docs/sw/for.md create mode 100644 docs/sw/functions.md create mode 100644 docs/sw/identifiers.md create mode 100644 docs/sw/if.md create mode 100644 docs/sw/keywords.md create mode 100644 docs/sw/null.md create mode 100644 docs/sw/numbers.md create mode 100644 docs/sw/operators.md create mode 100644 docs/sw/strings.md create mode 100644 docs/sw/switch.md create mode 100644 docs/sw/while.md delete mode 100644 evaluator/builtins.go delete mode 100644 evaluator/evaluator.go delete mode 100644 lexer/lexer.go delete mode 100644 main.go delete mode 100644 object/object.go delete mode 100644 parser/parser.go create mode 100644 src/Makefile rename {ast => src/ast}/ast.go (67%) rename {ast => src/ast}/ast_test.go (81%) create mode 100644 src/evaluator/bang.go create mode 100644 src/evaluator/block.go create mode 100644 src/evaluator/builtins.go create mode 100644 src/evaluator/dict.go create mode 100644 src/evaluator/evaluator.go rename {evaluator => src/evaluator}/evaluator_test.go (77%) create mode 100644 src/evaluator/forin.go create mode 100644 src/evaluator/identifier.go create mode 100644 src/evaluator/if.go create mode 100644 src/evaluator/in.go create mode 100644 src/evaluator/index.go create mode 100644 src/evaluator/infix.go create mode 100644 src/evaluator/method.go create mode 100644 src/evaluator/postfix.go create mode 100644 src/evaluator/prefix.go create mode 100644 src/evaluator/switch.go create mode 100644 src/evaluator/while.go rename {examples => src/examples}/example.nr (78%) create mode 100644 src/examples/sorting_algorithm.nr create mode 100644 src/examples/sudoku_solver.nr rename go.mod => src/go.mod (100%) create mode 100644 src/lexer/lexer.go rename {lexer => src/lexer}/lexer_test.go (91%) create mode 100644 src/main.go create mode 100644 src/object/array.go create mode 100644 src/object/bool.go create mode 100644 src/object/break.go create mode 100644 src/object/builtin.go create mode 100644 src/object/continue.go create mode 100644 src/object/dict.go rename {object => src/object}/environment.go (100%) create mode 100644 src/object/error.go create mode 100644 src/object/file.go create mode 100644 src/object/float.go create mode 100644 src/object/function.go create mode 100644 src/object/integer.go create mode 100644 src/object/null.go create mode 100644 src/object/object.go rename {object => src/object}/object_test.go (100%) create mode 100644 src/object/return.go create mode 100644 src/object/strings.go create mode 100644 src/parser/arrays.go create mode 100644 src/parser/assignment.go create mode 100644 src/parser/boolean.go create mode 100644 src/parser/break.go create mode 100644 src/parser/continue.go create mode 100644 src/parser/dict.go create mode 100644 src/parser/dot.go create mode 100644 src/parser/float.go create mode 100644 src/parser/for.go create mode 100644 src/parser/function.go create mode 100644 src/parser/identifier.go create mode 100644 src/parser/if.go create mode 100644 src/parser/index.go create mode 100644 src/parser/integer.go create mode 100644 src/parser/null.go create mode 100644 src/parser/parser.go rename {parser => src/parser}/parser_test.go (88%) create mode 100644 src/parser/statements.go create mode 100644 src/parser/string.go create mode 100644 src/parser/switch.go create mode 100644 src/parser/while.go rename {repl => src/repl}/repl.go (93%) create mode 100644 src/token/token.go delete mode 100644 token/token.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..37bb5b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +.DS_Store +*.[56789ao] +*.a[56789o] +*.so +*.pyc +._* +.nfs.* +[56789a].out +*~ +*.orig +*.rej +*.exe +.*.swp +core +*.cgo*.go +*.cgo*.c +_cgo_* +_obj +_test +_testmain.go +/VERSION.cache +/bin/ +/build.out +/doc/articles/wiki/*.bin +/goinstall.log +/last-change +/misc/cgo/life/run.out +/misc/cgo/stdio/run.out +/misc/cgo/testso/main +/pkg/ +/src/*.*/ +/src/cmd/cgo/zdefaultcc.go +/src/cmd/dist/dist +/src/cmd/go/internal/cfg/zdefaultcc.go +/src/cmd/go/internal/cfg/zosarch.go +/src/cmd/internal/objabi/zbootstrap.go +/src/go/build/zcgo.go +/src/go/doc/headscan +/src/runtime/internal/sys/zversion.go +/src/unicode/maketables +/test.out +/test/garbage/*.out +/test/pass.out +/test/run.out +/test/times.out + +#Personal + +src/testbinaries +src/tests_random +src/nuru +Notes.md \ No newline at end of file diff --git a/README.md b/README.md index e3f6bba..5fae61a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Nuru Programming Language Nuru Programming Language Nuru Programming Language +
+ Nuru Programming Language Nuru Programming Language
Nuru Programming Language @@ -19,19 +21,15 @@ instructions for your device below: - Download the binary: ``` -curl -O -L https://github.com/AvicennaJr/Nuru/releases/download/v0.1.0/nuru_linux_amd64_v0.1.0.tar.gz +curl -O -L https://github.com/AvicennaJr/Nuru/releases/download/v0.2.0/nuru_linux_amd64_v0.2.0.tar.gz ``` - - Extract the file: + - Extract the file to make global available: ``` -tar -xzvf nuru_linux_amd64_v0.1.0.tar.gz +sudo tar -C /usr/local/bin -xzvf nuru_linux_amd64_v0.2.0.tar.gz ``` - - Add it to your $PATH: -``` -cp nuru $HOME/bin -``` - Confirm installation with: ``` @@ -44,12 +42,12 @@ nuru -v - Download the binary with this command: ``` -curl -O -L https://github.com/AvicennaJr/Nuru/releases/download/v0.1.0/nuru_android_arm64_v0.1.0.tar.gz +curl -O -L https://github.com/AvicennaJr/Nuru/releases/download/v0.2.0/nuru_android_arm64_v0.2.0.tar.gz ``` - Extract the file: ``` -tar -xzvf nuru_android_arm64_v0.1.0.tar.gz +tar -xzvf nuru_android_arm64_v0.2.0.tar.gz ``` - Add it to path: @@ -64,24 +62,9 @@ nuru -v ### Windows - - Make a bin directory if it doesn't exist: - -``` -mkdir C:\bin -``` - - Download the Nuru Program [Here](https://github.com/AvicennaJr/Nuru/releases/download/v0.1.0/nuru_windows_amd64_v0.1.0.exe) - - Rename the downloaded program from `nuru_windows_amd64_v0.1.0.exe` to `nuru.exe` - - Move the file `nuru.exe` to the folder `C:\bin` - - Add the bin folder to Path with this command: - -``` -setx PATH "C:\bin;%PATH%" -``` - - Confirm installation with: - -``` -nuru -v -``` + - Download the Nuru Installer [Here](https://github.com/AvicennaJr/Nuru/releases/download/v0.2.0/Nuru_Windows_Installer_v0.2.0.exe) + - Install the downloaded installer + - You can watch a full video guide [Here](https://youtu.be/T-lfaoqIFD4) ### Building From Source @@ -98,17 +81,20 @@ go build -o nuru main.go nuru -v ``` -## Syntax +## Syntax At A Glance + +**NOTE** +> There is a more detailed documentation of the language [here](./docs/README.md). Nuru, although still in its early stage, intends to be a fully functional programming language, and thus it has been baked with many features. ### Defining A Variable -To initiliaze a variable use the `acha` keyword: +To initiliaze a variable use the `fanya` keyword: ``` -acha x = 2; -acha y = 3; +fanya x = 2; +fanya y = 3; andika(x*y) // output is 6 ``` @@ -129,7 +115,6 @@ Nuru supports both single line and multiple line comments as shown below: // Single line comment /* - Multiple Line Comment @@ -138,9 +123,7 @@ Comment ### Arithmetic Operations -For now Nuru supports `+`, `-`, `/` and `*`. More will be added. The `/` operation will truncate (round to a whole number) as Floating points are not supported yet. - -Nuru also provides precedence of operations using the BODMAS rule: +For now Nuru supports `+`, `-`, `/`, `*` and `%`. Nuru also provides precedence of operations using the BODMAS rule: ``` 2 + 2 * 3 // output = 8 @@ -156,16 +139,18 @@ Type | Syntax | Comments --------- | ----------------------------------------- | ----------------------- BOOL | `kweli sikweli` | kweli == true, sikweli == false INT | `1, 100, 342, -4` | These are signed 64 bit integers -STRING | `"" "mambo" "habari yako"` | They MUST be in DOUBLE QUOTES `"` -ARRAY | `[] [1, 2, 3] [1, "moja", kweli]` | Arrays can hold any types +FLOAT | `2.3, 4.5. 100.8094` | Signed 64 bit floats +STRING | `"" "mambo" "habari yako"` | They can be in double `"` or single `'` quotes +ARRAY | `[] [1, 2, 3] [1, "moja", kweli]` | Arrays can hold any types DICT | `{} {"a": 3, 1: "moja", kweli: 2}` | Keys can be int, string or bool. Values can be anything +NULL | `tupu` | These are nil objects ### Functions This is how you define a function in Nuru: ``` -acha jumlisha = fn(x, y) { +fanya jumlisha = unda(x, y) { rudisha x + y } @@ -175,7 +160,7 @@ andika(jumlisha(3,4)) Nuru also supports recursion: ``` -acha fibo = fn(x) { +fanya fibo = unda(x) { kama (x == 0) { rudisha 0; } au kama (x == 1) { @@ -205,11 +190,11 @@ kama (2<1) { Nuru's while loop syntax is as follows: ``` -acha i = 10 +fanya i = 10 wakati (i > 0) { andika(i) - i = i - 1 + i-- } ``` @@ -217,7 +202,7 @@ wakati (i > 0) { This is how you initiliaze and perform other array operations in Nuru: ``` -acha arr = [] +fanya arr = [] // To add elements @@ -225,9 +210,9 @@ sukuma(arr, 2) andika(arr) // output = [2] // Add two Arrays -acha arr2 = [1,2,3,4] +fanya arr2 = [1,2,3,4] -acha arr3 = arr1 + arr2 +fanya arr3 = arr1 + arr2 andika(arr3) // output = [2,1,2,3,4] @@ -246,7 +231,7 @@ andika(arr[3]) // output = 3 Nuru also supports dictionaris and you can do a lot with them as follows: ``` -acha mtu = {"jina": "Mojo", "kabila": "Mnyakusa"} +fanya mtu = {"jina": "Mojo", "kabila": "Mnyakusa"} // get value from key andika(mtu["jina"]) // output = Mojo @@ -267,18 +252,35 @@ andika(mtu) // output = {"jina": "Avicenna", "kabila": "Mnyakusa", "anapoishi": // You can also add two Dictionaries -acha kazi = {"kazi": "jambazi"} +fanya kazi = {"kazi": "jambazi"} mtu = mtu + kazi andika(mtu) // output = {"jina": "Avicenna", "kabila": "Mnyakusa", "anapoishi": "Dar Es Salaam", "kazi": "jambazi"} ``` +### For Loops + +These can iterate over strings, arrays and dictionaries: +``` +kwa i ktk "habari" { + andika(i) +} +/* //output +h +a +b +a +r +i +*/ +``` + ### Getting Input From User In Nuru you can get input from users using the `jaza()` keyword as follows: ``` -acha jina = jaza("Unaitwa nani? ") // will prompt for input +fanya jina = jaza("Unaitwa nani? ") // will prompt for input andika("Habari yako " + jina) ``` @@ -301,7 +303,7 @@ Kindly Note that everything should be placed in a single line. Here's an example ``` ### Running From File -To run a Nuru script, write the `nuru` command followed by the name of the file with a `.nr` extension: +To run a Nuru script, write the `nuru` command followed by the name of the file with a `.nr` or `.sw` extension: ``` nuru myFile.nr @@ -313,7 +315,13 @@ Kindly open an [Issue](https://github.com/AvicennaJr/Nuru/issues) to make sugges ## Contributions -All contributions are welcomed. Clone the repo, hack it, make sure all tests are passing then submit a pull request. +### Documentation + +There are documentations for two languages, English and Kiswahili, which are both under the `docs` folder. All files are written in markdown. Feel free to contribute by making a pull request. + +### Code + +Clone the repo, hack it, make sure all tests are passing then submit a pull request. ## License diff --git a/docs/en/README.md b/docs/en/README.md new file mode 100644 index 0000000..8f5a3a3 --- /dev/null +++ b/docs/en/README.md @@ -0,0 +1,78 @@ +# NURU PROGRAMMING LANGUAGE DOCUMENTATION + +This documentation is intended for people with some experience in programming. It describes the syntax, types and how to perform various operations using the language. + +## Table Of Contents + +- [Comments](./comments.md) +- [Numbers](./numbers.md) + * [Precedence](./numbers.md#precedence) + * [Unary Increments](./numbers.md#unary-increments) + * [Shorthand Assignments](./numbers.md#shorthand-assignment) + * [Negative Numbers](./numbers.md#negative-numbers) +- [Strings](./strings.md) + * [Definition](./strings.md#definition) + * [Concatenation](./strings.md#concatenation) + * [Looping over a String](./strings.md#looping-over-a-string) + * [Comparing Strings](./strings.md#comparing-strings) + * [Length of a String](./strings.md#length-of-a-string) +- [Arrays](./arrays.md) + * [Definition](./arrays.md#definition) + * [Accessing Elements](./arrays.md#accessing-elements) + * [Reassigning Elements](./arrays.md#reassigning-elements) + * [Looping over an Array](./arrays.md#looping-over-an-array) + * [Check if an Element Exists](./arrays.md#check-if-an-element-exists) + * [Concatenating Arrays](./arrays.md#concatenating-arrays) + * [Length of an Array](./arrays.md#length-of-an-array) + * [Adding Elements to an Array](./arrays.md#adding-elements-to-an-array) + * [Getting the last item in an Array](./arrays.md#getting-the-last-element-in-an-array) +- [Dictionaries](./dictionaries.md) + * [Definition](./dictionaries.md#definition) + * [Accessing Elements](./dictionaries.md#accessing-elements) + * [Updating Elements](./dictionaries.md#updating-elements) + * [Adding New Elements](./dictionaries.md#adding-new-elements) + * [Concatenating Dictionaries](./dictionaries.md#concatenating-dictionaries) + * [Checking if a Key Exists](./dictionaries.md#checking-if-key-exists-in-a-dictionary) + * [Looping Over a Dictionary](./dictionaries.md#looping-over-a-dictionary) +- [Booleans](./bool.md) + * [Example 1](./bool.md#example-1) + * [Example 2](./bool.md#example-2) +- [Identifiers](./identifiers.md) + * [Example 1](./identifiers.md#example-1) +- [For Loops](./for.md) + * [Definition](./for.md#definition) + * [Key-Value Pairs](./for.md#key-value-pairs) + * [Break and Continue](./for.md#break-vunja-and-continue-endelea) +- [While Loops](./while.md) + * [Definition](./while.md#definition) + * [Break and Continue](./while.md#break-vunja-and-continue-endelea) +- [If/Else](./ifStatements.md) + * [Definition](./ifStatements.md#definition) + * [Else Block](./ifStatements.md#else-block) +- [Switch Statements](./switch.md) + * [Definition](./switch.md#definition) + * [Multiple Values in Case](./switch.md#multiple-values-in-a-case) + * [Default Keyword](./switch.md#default-kawaida) +- [Functions](./function.md) + * [Definition](./function.md#definition) + * [Parameters](./function.md#parameters) + * [Return](./function.md#return-rudisha) + * [Recursion](./function.md#recursion) +- [Builtins](./builtins.md) + * [andika()](./builtins.md#andika) + * [jaza()](./builtins.md#jaza) + * [aina()](./builtins.md#aina) + * [idadi()](./builtins.md#idadi) + * [sukuma()](./builtins.md#sukuma) + * [yamwisho()](./builtins.md#yamwisho) +- [Null](./null.md) +- [Operators](./operators.md) + * [Assignment](./operators.md#assignment) + * [Arithmetic](./operators.md#arithmetic-operators) + * [Comparison](./operators.md#comparison-operators) + * [Member](./operators.md#member-operator) + * [Logic](./operators.md#logic-operators) + * [Precedence](./operators.md#precedence-of-operators) +- [Keywords](./keywords.md) + * [Reserved](./keywords.md#reserved) + * [Builtins](./keywords.md#builtins) \ No newline at end of file diff --git a/docs/en/arrays.md b/docs/en/arrays.md new file mode 100644 index 0000000..f36ee0d --- /dev/null +++ b/docs/en/arrays.md @@ -0,0 +1,121 @@ +## ARRAYS (ORODHA) + +### Definition + +Arrays are enclosed in square brackets `[]` and they can hold any type, even function definitions: +```go +fanya arr = [1, "mambo", kweli, unda(x, y){rudisha x + y}, 2 * 3 + 20] + +andika(arr) + +/* +[1, mambo, kweli, unda(x, y) {rudisha (x + y);}, 26] +*/ +``` + +### Accessing Elements + +You can access individual elements through indexes starting from zero: +```go +fanya herufi = ["a", "b", "c"] + +andika(herufi[0]) // a +``` + +### Reassigning Elements + +You can also reassign values in elements: +```go +fanya herufi = ["a", "b", "c"] + +herufi[1] = "z" + +andika(herufi) // ["a", "z", "c"] +``` + +### Looping over an Array + +- You can also iterate through an array: +```go +fanya herufi = ["a", "b", "c"] + +kwa i ktk herufi { + andika(i) +} +/* a + b + c */ +``` + +- And for a key, value pair: +```go +kwa i, v ktk herufi { + andika(i, "=>", v) +} + +/* 0 => a + 1 => b + 2 => c */ +``` + +### Check if an Element exists + +You can also check if elements exist in an array: +```go +andika("d" ktk herufi) // sikweli +andika("a" ktk herufi) // kweli +``` + +### Concatenating Arrays + +- You can also add two arrays as follows: +``` +fanya h1 = ["a", "b", "c"] +fanya h2 = [1, 2, 3] +fanya h3 = h1 + h2 + +andika(h3) // ["a", "b", "c", 1, 2, 3] + +h2 += h3 + +andika(h2) // [1, 2, 3, "a", "b", "c", 1, 2, 3] +``` + +- You can also multiply an array as follows: +``` +fanya a = [1, 2, 3] + +andika(a * 2) // [1, 2, 3, 1, 2, 3] +``` + +### Length of an Array + +You can get the length of an array with `idadi`: +``` +fanya a = ["a", "b", "c"] + +andika(idadi(a)) // 3 +``` + +### Adding Elements to an Array + +You can add new elements to an array with `sukuma`: +```go +fanya a = [1, 2, 3] + +// you must reassign for the new value to be saved +a = sukuma(a, "mambo") + +andika(a) // [1, 2, 3, "mambo"] +``` + +### Getting the Last Element in an Array + +You can get the last element of an array with `yamwisho`: +``` +fanya a = [1, 2, 3] + +andika(yamwisho(a)) // 3 +``` +**Please Note** +> A lot more array methods will be added in the future \ No newline at end of file diff --git a/docs/en/bool.md b/docs/en/bool.md new file mode 100644 index 0000000..4c0aa09 --- /dev/null +++ b/docs/en/bool.md @@ -0,0 +1,32 @@ +## BOOLEANS + +Boolean objects are `truthy`, meaning any value is true. A value is false only when its null (ie. `tupu`) or false (ie `sikweli`): +### Example 1 +``` +fanya x = 0 + +kama (x) { + andika("I am true") +} sivyo { + andika("I am not true") +} + +// it will print "I am true" +``` + +### Example 2 +``` +kama (tupu) { +andika("I am true") +} sivyo { + andika("I am not true") +} + +// will print "I am not true" +``` + +Expressions can also be evaluated to true or false: +``` +andika(1 > 2) // sikweli + +andika(1 + 3 < 10) // kweli \ No newline at end of file diff --git a/docs/en/builtins.md b/docs/en/builtins.md new file mode 100644 index 0000000..43925d9 --- /dev/null +++ b/docs/en/builtins.md @@ -0,0 +1,69 @@ +## BUILTINS + +Nuru has a few builtin functions and more will be added in the future + +### andika() + +This function will print out whatever is placed inside the parenthesis `()`. It can take zero or multiple number of arguments. Arguments will be printed out with a space in between them: +``` +andika(1,2,3) // 1 2 3 +``` +`andika()` also supports some basic formatting such as: +- `/n` for a new line +- `/t` for a tab space +- `\\` for a backslash + +### jaza() + +This is a function to get input from a user. It can have zero or one argument. The only acceptable argument is a string: +``` +fanya salamu = unda(){ + fanya jina = jaza("Unaitwa nani? ") + andika("mambo vipi", jina) +} + +salamu() +``` + +### aina() + +`Aina()` is a function to help identify the type of an object. It only accepts one argument: +``` +aina(2) // NAMBA +``` + +### idadi() + +`idadi` is a function to know a length of an object. It accepts only one argument which can be a `string`, `list` or `dictionary`: +``` +idadi("mambo") // 5 +``` + +### jumla() + +`jumla` is a function that gives the sum of numbers (integers/floats) in a list. It accepts only one argument which is a `list` of numbers : +``` +jumla([1,2,3,4]) // 10 +``` + + +### sukuma() + +`sukuma()` is a function that adds a new element to an array. The function accepts two arguments, the first must be a list and the second is the element to be added/appended: +``` +fanya majina = ["juma", "asha"] + +majina = sukuma(majina, "mojo") +``` +**Notice that the list is reassigned for the change to take effect** + +### yamwisho() + +This is a function to get the last element in an array. It only accepts one argument which must be an array: +``` +fanya namba = [1,2,3,4,5] + +yamwisho(namba) // 5 +``` + +**MORE BUILTIN FUNCTIONS WILL BE ADDED WITH TIME** \ No newline at end of file diff --git a/docs/en/comments.md b/docs/en/comments.md new file mode 100644 index 0000000..b10f988 --- /dev/null +++ b/docs/en/comments.md @@ -0,0 +1,14 @@ +## COMMENTS + +- You can write single line comments with `//`: +``` +// This line will be ignored +``` +- Multiline comments start with `/*` and end with `*/`: +``` +/* +These lines +Will +be +ignored +*/ \ No newline at end of file diff --git a/docs/en/dictionaries.md b/docs/en/dictionaries.md new file mode 100644 index 0000000..5e195f4 --- /dev/null +++ b/docs/en/dictionaries.md @@ -0,0 +1,96 @@ +## DICTIONARIES (KAMUSI) + +### DEFINITION + +Dictionaries are enclosed by curly braces `{}` and have keys and values. You can define a dictionary as follows: +``` +fanya k = {"jina": "juma"} +``` +- The `keys` can be `string, int, float` and `boolean` +- The `values` can be of any type; `string, int, float, boolean, null` and even a `function`: +``` +fanya k = { + "jina": "juma", + "umri": 2, + kweli : "true", + "mi ni function": unda(x){andika("habari", x)} + "sina value": tupu +} + +andika(k["sina value"]) // tupu +``` + +### Accessing Elements + +You can access individual elements as follows: +``` +andika(k[kweli]) // true + +andika(k["mi ni function"]("juma")) // habari juma +``` + +### Updating Elements +You can update the value of an element as follows: +``` +k['umri'] = 50 + +andika(k['umri']) // 50 +``` + +### Adding New Elements +If a key-value pair doesn't exist, you can add one as follows: +``` +k["I am new"] = "new element" + +andika(k["I am new"]) // new element +``` + +### Concatenating Dictionaries + +You can add two dictionaries as follows: +``` +fanya a = {"a": "andazi"} +fanya b = {"b": "bunduki"} +fanya c = a + b + +andika(c) // {"a": "andazi", "b": "bunduki"} +``` + +### Checking If Key Exists In A Dictionary + +Use the `ktk` keyword to check if a key exists: +``` +"umri" ktk k // kweli +"ubini" ktk k // sikweli +``` + +### Looping Over A Dictionary + +- You can loop over a dictionary as follows: + +```go +fanya k = {"a": "afya", "b": "buibui", "c": "chapa"} +kwa i, v ktk k { + andika(i, "=>", v) +} +/* a => afya + b => buibui + c => chapa */ +``` + +- You can also loop over just values as follows: + +``` +kwa v ktk k { + andika(v) +} + +/* +afya +buibui +chapa +*/ +``` + +**Please Note** +> A lot more dict methods will be added in the future \ No newline at end of file diff --git a/docs/en/for.md b/docs/en/for.md new file mode 100644 index 0000000..cd56a6c --- /dev/null +++ b/docs/en/for.md @@ -0,0 +1,110 @@ +## FOR (KWA) + +### Definition + +For is used to iterate over an iterable object. An iterable object is a `string`, `array` or `dictionaries`. You use the `kwa` keyword followed by an identifier such as `k` or `v` followed by an iterable. The iterable block must be enclosed in a bracket `{}`. Here's an example: +``` +fanya jina = "lugano" + +kwa i ktk jina { + andika(i) +} + +/* +l +u +g +a +n +o +*/ +``` + +### Key Value Pairs + +Nuru allows you to get both the value or the key/value pair of an iterable. To get only the value, use one temporary identifier as such: +``` +fanya kamusi = {"a": "andaa", "b": "baba"} + +kwa v ktk kamusi { + andika(v) +} + +/* +andaa +baba +*/ +``` +To get both the key and the value, use two temporary identifiers: +``` +kwa k, v ktk kamusi { + andika(k + " ni + " v) +} + +/* +a ni andaa +b ni baba +*/ +``` +- Note that key-value pair iteration also works for `strings` and `lists`: +``` +kwa i, v ktk "mojo" { + andika(i, "->", v) +} +/* +0 -> m +1 -> o +2 -> j +3 -> o +*/ +fanya majina = ["juma", "asha", "haruna"] + +kwa i, v ktk majina { + andika(i, "-", v) +} + +/* +0 - juma +1 - asha +2 - haruna +*/ +``` + +### Break (Vunja) and Continue (Endelea) + +- A loop can be terminated using the `vunja` keyword: +``` +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimevunja") + vunja + } + andika(v) +} +/* +m +o +nimevunja +*/ +``` + +- A specific iteration can be skipped using the `endelea` keyword: +``` +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimeruka") + endelea + } + andika(v) +} + +/* +m +o +nimeruka +o +*/ +``` + +**CAUTION** +> In nested loops, the `vunja` and `endelea` keyword MIGHT misbehave \ No newline at end of file diff --git a/docs/en/function.md b/docs/en/function.md new file mode 100644 index 0000000..0a22134 --- /dev/null +++ b/docs/en/function.md @@ -0,0 +1,55 @@ +## FUNCTIONS (UNDA) + +### Definition + +A function block starts with the `unda` keyword, parameters are surrounded by `()` and the body by `{}`. They must also be assigned to a variable as follows: +``` +fanya jum = unda(x, y) { + rudisha x + y +} + +jum(2, 3) // 5 +``` + +### Parameters + +Functions can have zero or any number of arguments. Arguments can be of any type, even other functions: +``` +fanya salamu = unda() { + andika("Habari yako") +} + +salamu() + +salamu = unda(jina) { + andika("Habari yako", jina) +} + +salamu(asha) // Habari yako asha +``` + +### Return (rudisha) + +You can return items with the `rudisha` keyword. The `rudisha` keyword will terminate the block and return the value: +``` +fanya mfano = unda(x) { + rudisha "nimerudi" + andika(x) +} + +mfano(x) // nimerudi +``` + +### Recursion + +Nuru also supports recursion. Here's an example: +``` +fanya fib = unda(n) { + kama (n < 3) { + rudisha 1 + } sivyo { + rudisha fib(n-1) + fib(n-2) + } +} + +andika(fib(10)) // 55 \ No newline at end of file diff --git a/docs/en/identifiers.md b/docs/en/identifiers.md new file mode 100644 index 0000000..58cf756 --- /dev/null +++ b/docs/en/identifiers.md @@ -0,0 +1,15 @@ +## IDENTIFIERS + +Identifiers can contain letters, numbers and underscores. However, identifiers cannot start with a number. + +### Example 1 + +``` +fanya b2020 = 2020 + +andika(b2020) + +fanya c2p = "C to P" + +andika(c2p) // "C to P" +``` \ No newline at end of file diff --git a/docs/en/ifStatements.md b/docs/en/ifStatements.md new file mode 100644 index 0000000..3d7f12b --- /dev/null +++ b/docs/en/ifStatements.md @@ -0,0 +1,27 @@ +## IF/ELSE (KAMA/SIVYO) + +### Definition + +You initiliaze an if block with `kama`, the condition must be inside a paranthesis `()` and the consequence inside a `{}`: +``` +kama (2>1) { + andika(kweli) // kweli +} +``` + +### Else Block + +- For multiple conditions, you can use `kama` , `au kama` and `sivyo`: +``` +fanya a = 10 + +kama (a > 100) { + andika("a imezidi 100") +} au kama (a < 10) { + andika("a ndogo kuliko 10") +} sivyo { + andika("Thamani ya a ni", a) +} + +// it will print 'Thamani ya a ni 10' +``` \ No newline at end of file diff --git a/docs/en/keywords.md b/docs/en/keywords.md new file mode 100644 index 0000000..97e60e7 --- /dev/null +++ b/docs/en/keywords.md @@ -0,0 +1,57 @@ +## KEYWORDS + +### Reserved + +The keywords used in Nuru are below. Note that these words cannot be used as identifiers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
kwelisikweliundafanya
kamaausivyowakati
rudishavunjaendeleatupu
ktkkwabadiliikiwa
kawaida
+ +### BuiltIns + +The following are some of the in-built functions in Nuru. They are reserved and thus cannot be used as identifiers: + + + + + + + + + + + + + +
andikaainajaza
idadisukumayamwisho
\ No newline at end of file diff --git a/docs/en/null.md b/docs/en/null.md new file mode 100644 index 0000000..c21e74a --- /dev/null +++ b/docs/en/null.md @@ -0,0 +1,17 @@ +## NULL (TUPU) + +- A null data type is a data type with no value. It is defined as: +``` +fanya a = `tupu` +``` + +- Obviously a null data type will evaluate to false: +``` +kama (a) { + andika("niko tupu") +} sivyo { + andika("nimevaa nguo") +} + +// will print 'nimevaa nguo' +``` \ No newline at end of file diff --git a/docs/en/numbers.md b/docs/en/numbers.md new file mode 100644 index 0000000..a857de6 --- /dev/null +++ b/docs/en/numbers.md @@ -0,0 +1,74 @@ +## INTEGERS (NAMBA) AND FLOATS (DESIMALI) + +### PRECEDENCE + +Integers and floats work the way you'd expect them to. They precedence in mathematical operations follow the BODMAS rule: + +```go +2 + 3 * 5 // 17 + +fanya a = 2.5 +fanya b = 3/5 + +a + b // 2.8 +``` + +### UNARY INCREMENTS + +You can perform unary increments (++ and --) on both floats and integers. These will add or subtract 1 from the current value. Note that the float or int have to be assigned to a variable for this operation to work. Here's an example: + +```go +fanya i = 2.4 + +i++ // 3.4 +``` + +### SHORTHAND ASSIGNMENT + +You can also perform shorthand assignments with `+=`, `-=`, `/=`, `*=` and `%=` as follows: + +```go +fanya i = 2 + +i *= 3 // 6 +i /= 2 // 3 +i += 100 // 103 +i -= 10 // 93 +i %= 90 // 3 +``` + +### NEGATIVE NUMBERS + +Negative numbers also behave as expected: + +```go +fanya i = -10 + +wakati (i < 0) { + andika(i) + i++ +} + +/* +-10 +-9 +-8 +-7 +-6 +-5 +-4 +-3 +-2 +-1 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +*/ +``` diff --git a/docs/en/operators.md b/docs/en/operators.md new file mode 100644 index 0000000..142b20e --- /dev/null +++ b/docs/en/operators.md @@ -0,0 +1,73 @@ +## OPERATORS + +### ASSIGNMENT + +Assuming `i` and `v` are predefined variables, Nuru supports the following assignment operators: + +- `i = v`: which is the regular assign operator +- `i += v`: which is the equivalent of `i = i + v` +- `i -= v`: which is the equivalent of `i = i - v` +- `i *= v`: which is the equivalent of `i = i * v` +- `i /= v`: which is the equivalent of `i = i / v` +- `i += v`: which is the equivalent of `i = i + v` + +For `strings`, `arrays` and `dictionaries`, the `+=` sign operator is permissible. Example: +``` +list1 += list2 // this is equivalent to list1 = list1 + list2 +``` + +### ARITHMETIC OPERATORS + +The following arithmetic operators are supported: + +- `+`: Additon +- `-`: Subtraction +- `*`: Multiplication +- `/`: Division +- `%`: Modulo (ie the remainder of a division) +- `**`: Exponential power (eg: `2**3 = 8`) + +### COMPARISON OPERATORS + +The following comparison operators are supported: + +- `==`: Equal to +- `!=`: Not equal to +- `>`: Greater than +- `>=`: Greater than or equal to +- `<`: Less than +- `<=`: Less than or equal to + +### MEMBER OPERATOR + +The member operator in Nuru is `ktk`. It will check if an object exists in another object: +```go +fanya majina = ['juma', 'asha', 'haruna'] + +"haruna" ktk majina // kweli +"halima" ktk majina // sikweli +``` + +### LOGIC OPERATORS + +The following logic operators are supported: + +- `&&`: Logical `AND`. It will evaluate to true if both are true, otherwise it will evaluate to false. +- `||`: Logical `OR`. It will evaluate to false if both are false, otherwise it will evaluate to true. +- `!`: Logical `NOT`. It will evaluate to the opposite of a given expression. + +### PRECEDENCE OF OPERATORS + +The following is the precedence of operators, starting from the HIGHEST PRIORITY to LOWEST. + +- `()` : Items in paranthesis have the highest priority +- `!`: Negation +- `%`: Modulo +- `**`: Exponential power +- `/, *`: Division and Multiplication +- `+, +=, -, -=`: Addition and Subtraction +- `>, >=, <, <=`: Comparison operators +- `==, !=`: Equal or Not Equal to +- `=`: Assignment Operator +- `ktk`: Member Operator +- `&&, ||`: Logical AND and OR \ No newline at end of file diff --git a/docs/en/strings.md b/docs/en/strings.md new file mode 100644 index 0000000..ea1dbec --- /dev/null +++ b/docs/en/strings.md @@ -0,0 +1,104 @@ +## STRINGS (NENO) + +### Definition + +Strings can be enclosed in either a single quote `''` or double quotes `""`: + +``` +andika("mambo") // mambo + +fanya a = 'niaje' + +andika("mambo", a) // mambo niaje +``` + +### Concatenation + +- Strings can also be concatenated as follows: + +``` +fanya a = "habari" + " " + "yako" + +andika(a) // habari yako + +fanya b = "habari" + +b += " yako" + +// habari yako +``` + +- You can also multiply a string `n` number of times: + +``` +andika("mambo " * 4) + +// mambo mambo mambo mambo + +fanya a = "habari" + +a *= 4 + +// habarihabarihabarihabari +``` + +### Looping over a String + +- You can loop through a string as follows + +``` +fanya jina = "avicenna" + +kwa i ktk jina {andika(i)} + +/* + a + v + i + c + e + n + n + a +*/ +``` + +- And for key, value pairs: +```go +kwa i, v ktk jina { + andika(i, "=>", v) +} +/* +0 => a +1 => v +2 => i +3 => c +4 => e +5 => n +6 => n +7 => a +*/ +``` + +### Comparing Strings + +- You can also check if two strings are the same: +``` +fanya a = "nuru" + +andika(a == "nuru") // kweli + +andika(a == "mambo") // sikweli +``` + +### Length of a String + +You can also check the length of a string with the `idadi` function +``` +fanya a = "mambo" + +idadi(a) // 5 +``` + +**Please Note** +> A lot more string methods will be added in the future \ No newline at end of file diff --git a/docs/en/switch.md b/docs/en/switch.md new file mode 100644 index 0000000..5f5b034 --- /dev/null +++ b/docs/en/switch.md @@ -0,0 +1,52 @@ +## SWITCH (BADILI) + +### Definition + +You initialize a switch statement with `badili`, the expression inside parenthesis `()` and all cases will be enclosed inside a bracket `{}`. + +A case statement has the keyword `ikiwa` followed by a value to check. Multiple values can be in a single case separated by commas `,`. The consequence to execute if a condition is fulfiled must be inside a bracket `{}`. Here's an example: +``` +fanya a = 2 + +badili (a){ + ikiwa 3 { + andika("a ni tatu") + } + ikiwa 2 { + andika ("a ni mbili") + } +} +``` + +### Multiple Values in a Case + +Multiple possibilites can be assigned to a single case (`ikiwa`) statement: +``` +badili (a) { + ikiwa 1,2,3 { + andika("a ni kati ya 1, 2 au 3") + } + ikiwa 4 { + andika("a ni 4") + } +} +``` + +### Default (kawaida) + +The default statement will be executed when no condition is satisfied. The default statement is represented by `kawaida`: +``` +fanya z = 20 + +badili(z) { + ikiwa 10 { + andika("kumi") + } + ikiwa 30 { + andika("thelathini") + } + kawaida { + andika("ishirini") + } +} +``` \ No newline at end of file diff --git a/docs/en/while.md b/docs/en/while.md new file mode 100644 index 0000000..791e619 --- /dev/null +++ b/docs/en/while.md @@ -0,0 +1,65 @@ +## WHILE (WAKATI) + +### Definition + +A while loop is executed when a specified condition is true. You initiliaze a while loop with the `wakati` keyword followed by the condition in paranthesis `()`. The consequence of the loop should be enclosed in brackets `{}`: +``` +fanya i = 1 + +wakati (i <= 5) { + andika(i) + i++ +} +/* +1 +2 +3 +4 +5 +*/ +``` + +### Break (vunja) and Continue (endelea) + +- A loop can be terminated using the `vunja` keyword: +``` +fanya i = 1 + +wakati (i < 5) { + kama (i == 3) { + andika("nimevunja") + vunja + } + andika(i) + i++ +} +/* +1 +2 +nimevunja +*/ +``` + +- A specific iteration can be skipped using the `endelea` keyword: +``` +fanya i = 0 + +wakati (i < 5) { + i++ + kama (i == 3) { + andika("nimeruka") + endelea + } + andika(i) +} +/* +1 +2 +nimeruka +4 +5 +*/ +``` + +**CAUTION** +> In nested loops, the `vunja` and `endelea` keyword MIGHT misbehave diff --git a/docs/sw/README.md b/docs/sw/README.md new file mode 100644 index 0000000..698fdad --- /dev/null +++ b/docs/sw/README.md @@ -0,0 +1 @@ +# NURU PROGRAMMING LANGUAGE DOCUMENTATION \ No newline at end of file diff --git a/docs/sw/arrays.md b/docs/sw/arrays.md new file mode 100644 index 0000000..bbc6434 --- /dev/null +++ b/docs/sw/arrays.md @@ -0,0 +1 @@ +# Orodha (Arrays) \ No newline at end of file diff --git a/docs/sw/bools.md b/docs/sw/bools.md new file mode 100644 index 0000000..16f7a44 --- /dev/null +++ b/docs/sw/bools.md @@ -0,0 +1 @@ +# Kweli/Sikweli (Bools) diff --git a/docs/sw/builtins.md b/docs/sw/builtins.md new file mode 100644 index 0000000..f807886 --- /dev/null +++ b/docs/sw/builtins.md @@ -0,0 +1 @@ +# Builtins \ No newline at end of file diff --git a/docs/sw/comments.md b/docs/sw/comments.md new file mode 100644 index 0000000..2a30807 --- /dev/null +++ b/docs/sw/comments.md @@ -0,0 +1 @@ +# Maelezo (Comments) \ No newline at end of file diff --git a/docs/sw/dictionaries.md b/docs/sw/dictionaries.md new file mode 100644 index 0000000..469ad6d --- /dev/null +++ b/docs/sw/dictionaries.md @@ -0,0 +1 @@ +# Kamusi (Dictionaries) \ No newline at end of file diff --git a/docs/sw/for.md b/docs/sw/for.md new file mode 100644 index 0000000..52b9109 --- /dev/null +++ b/docs/sw/for.md @@ -0,0 +1 @@ +# Kwa (For) \ No newline at end of file diff --git a/docs/sw/functions.md b/docs/sw/functions.md new file mode 100644 index 0000000..ed2c3d8 --- /dev/null +++ b/docs/sw/functions.md @@ -0,0 +1 @@ +# Undo (Functions) \ No newline at end of file diff --git a/docs/sw/identifiers.md b/docs/sw/identifiers.md new file mode 100644 index 0000000..d89ef81 --- /dev/null +++ b/docs/sw/identifiers.md @@ -0,0 +1 @@ +# Tambulishi (Identifiers) \ No newline at end of file diff --git a/docs/sw/if.md b/docs/sw/if.md new file mode 100644 index 0000000..a364c61 --- /dev/null +++ b/docs/sw/if.md @@ -0,0 +1 @@ +# Kama/Sivyo (If/Else) \ No newline at end of file diff --git a/docs/sw/keywords.md b/docs/sw/keywords.md new file mode 100644 index 0000000..5160a95 --- /dev/null +++ b/docs/sw/keywords.md @@ -0,0 +1 @@ +# Maneno Muhimu (Keywords) \ No newline at end of file diff --git a/docs/sw/null.md b/docs/sw/null.md new file mode 100644 index 0000000..628c65e --- /dev/null +++ b/docs/sw/null.md @@ -0,0 +1 @@ +# Tupu (Null) \ No newline at end of file diff --git a/docs/sw/numbers.md b/docs/sw/numbers.md new file mode 100644 index 0000000..dd4ec8b --- /dev/null +++ b/docs/sw/numbers.md @@ -0,0 +1 @@ +# Namba na Desimali (Ints/Floats) \ No newline at end of file diff --git a/docs/sw/operators.md b/docs/sw/operators.md new file mode 100644 index 0000000..cf38456 --- /dev/null +++ b/docs/sw/operators.md @@ -0,0 +1 @@ +# Matendaji (Operators) \ No newline at end of file diff --git a/docs/sw/strings.md b/docs/sw/strings.md new file mode 100644 index 0000000..0185efb --- /dev/null +++ b/docs/sw/strings.md @@ -0,0 +1 @@ +# Neno (Strings) \ No newline at end of file diff --git a/docs/sw/switch.md b/docs/sw/switch.md new file mode 100644 index 0000000..ec1fc19 --- /dev/null +++ b/docs/sw/switch.md @@ -0,0 +1 @@ +# Badili (Switch) \ No newline at end of file diff --git a/docs/sw/while.md b/docs/sw/while.md new file mode 100644 index 0000000..e022883 --- /dev/null +++ b/docs/sw/while.md @@ -0,0 +1 @@ +# Wakati (While) \ No newline at end of file diff --git a/evaluator/builtins.go b/evaluator/builtins.go deleted file mode 100644 index f07138c..0000000 --- a/evaluator/builtins.go +++ /dev/null @@ -1,104 +0,0 @@ -package evaluator - -import ( - "bufio" - "fmt" - "io" - "os" - - "github.com/AvicennaJr/Nuru/object" -) - -var builtins = map[string]*object.Builtin{ - "idadi": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 1 { - return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) - } - - switch arg := args[0].(type) { - case *object.Array: - return &object.Integer{Value: int64(len(arg.Elements))} - case *object.String: - return &object.Integer{Value: int64(len(arg.Value))} - default: - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - }, - }, - "yamwisho": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 1 { - return newError("Samahani, tunahitaji Hoja moja tu, wewe umeweka %d", len(args)) - } - if args[0].Type() != object.ARRAY_OBJ { - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - - arr := args[0].(*object.Array) - length := len(arr.Elements) - if length > 0 { - return arr.Elements[length-1] - } - - return NULL - }, - }, - "sukuma": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 2 { - return newError("Samahani, tunahitaji Hoja 2, wewe umeweka %d", len(args)) - } - if args[0].Type() != object.ARRAY_OBJ { - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - - arr := args[0].(*object.Array) - length := len(arr.Elements) - - newElements := make([]object.Object, length+1) - copy(newElements, arr.Elements) - newElements[length] = args[1] - - return &object.Array{Elements: newElements} - }, - }, - "jaza": { - Fn: func(args ...object.Object) object.Object { - - if len(args) > 1 { - return newError("Samahani, hii function inapokea hoja 0 au 1, wewe umeweka %d", len(args)) - } - - if len(args) > 0 && args[0].Type() != object.STRING_OBJ { - return newError(fmt.Sprintf(`Tafadhali tumia alama ya nukuu: "%s"`, args[0].Inspect())) - } - if len(args) == 1 { - prompt := args[0].(*object.String).Value - fmt.Fprint(os.Stdout, prompt) - } - - buffer := bufio.NewReader(os.Stdin) - - line, _, err := buffer.ReadLine() - if err != nil && err != io.EOF { - return newError("Nimeshindwa kusoma uliyo yajaza") - } - - return &object.String{Value: string(line)} - }, - }, - "andika": { - Fn: func(args ...object.Object) object.Object { - if len(args) == 0 { - fmt.Println("") - } else { - for _, arg := range args { - - fmt.Println(arg.Inspect()) - } - } - return nil - }, - }, -} diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go deleted file mode 100644 index 9b2726b..0000000 --- a/evaluator/evaluator.go +++ /dev/null @@ -1,544 +0,0 @@ -package evaluator - -import ( - "fmt" - "strings" - - "github.com/AvicennaJr/Nuru/ast" - "github.com/AvicennaJr/Nuru/object" -) - -var ( - NULL = &object.Null{} - TRUE = &object.Boolean{Value: true} - FALSE = &object.Boolean{Value: false} -) - -func Eval(node ast.Node, env *object.Environment) object.Object { - switch node := node.(type) { - case *ast.Program: - return evalProgram(node, env) - - case *ast.ExpressionStatement: - return Eval(node.Expression, env) - - case *ast.IntegerLiteral: - return &object.Integer{Value: node.Value} - - case *ast.Boolean: - return nativeBoolToBooleanObject(node.Value) - - case *ast.PrefixExpression: - right := Eval(node.Right, env) - if isError(right) { - return right - } - return evalPrefixExpression(node.Operator, right) - - case *ast.InfixExpression: - left := Eval(node.Left, env) - if isError(left) { - return left - } - right := Eval(node.Right, env) - if isError(right) { - return right - } - return evalInfixExpression(node.Operator, left, right) - - case *ast.BlockStatement: - return evalBlockStatement(node, env) - - case *ast.IfExpression: - return evalIfExpression(node, env) - - case *ast.ReturnStatement: - val := Eval(node.ReturnValue, env) - if isError(val) { - return val - } - return &object.ReturnValue{Value: val} - - case *ast.LetStatement: - val := Eval(node.Value, env) - if isError(val) { - return val - } - - env.Set(node.Name.Value, val) - - case *ast.Identifier: - return evalIdentifier(node, env) - - case *ast.FunctionLiteral: - params := node.Parameters - body := node.Body - return &object.Function{Parameters: params, Env: env, Body: body} - - case *ast.CallExpression: - function := Eval(node.Function, env) - if isError(function) { - return function - } - args := evalExpressions(node.Arguments, env) - if len(args) == 1 && isError(args[0]) { - return args[0] - } - return applyFunction(function, args) - case *ast.StringLiteral: - return &object.String{Value: node.Value} - - case *ast.ArrayLiteral: - elements := evalExpressions(node.Elements, env) - if len(elements) == 1 && isError(elements[0]) { - return elements[0] - } - return &object.Array{Elements: elements} - case *ast.IndexExpression: - left := Eval(node.Left, env) - if isError(left) { - return left - } - index := Eval(node.Index, env) - if isError(index) { - return index - } - return evalIndexExpression(left, index) - case *ast.DictLiteral: - return evalDictLiteral(node, env) - case *ast.WhileExpression: - return evalWhileExpression(node, env) - case *ast.AssignmentExpression: - left := Eval(node.Left, env) - if isError(left) { - return left - } - - value := Eval(node.Value, env) - if isError(value) { - return value - } - - if ident, ok := node.Left.(*ast.Identifier); ok { - env.Set(ident.Value, value) - } else if ie, ok := node.Left.(*ast.IndexExpression); ok { - obj := Eval(ie.Left, env) - if isError(obj) { - return obj - } - - if array, ok := obj.(*object.Array); ok { - index := Eval(ie.Index, env) - if isError(index) { - return index - } - if idx, ok := index.(*object.Integer); ok { - if int(idx.Value) > len(array.Elements) { - return newError("Index imezidi idadi ya elements") - } - array.Elements[idx.Value] = value - } else { - return newError("Hauwezi kufanya opereshen hii na %#v", index) - } - } else if hash, ok := obj.(*object.Dict); ok { - key := Eval(ie.Index, env) - if isError(key) { - return key - } - if hashKey, ok := key.(object.Hashable); ok { - hashed := hashKey.HashKey() - hash.Pairs[hashed] = object.DictPair{Key: key, Value: value} - } else { - return newError("Hauwezi kufanya opereshen hii na %T", key) - } - } else { - return newError("%T haifanyi operation hii", obj) - } - } else { - return newError("Tumia neno kama variable, sio %T", left) - } - - } - - return nil -} - -func evalProgram(program *ast.Program, env *object.Environment) object.Object { - var result object.Object - - for _, statment := range program.Statements { - result = Eval(statment, env) - - switch result := result.(type) { - case *object.ReturnValue: - return result.Value - case *object.Error: - return result - } - } - - return result -} - -func nativeBoolToBooleanObject(input bool) *object.Boolean { - if input { - return TRUE - } - return FALSE -} - -func evalPrefixExpression(operator string, right object.Object) object.Object { - switch operator { - case "!": - return evalBangOperatorExpression(right) - case "-": - return evalMinusPrefixOperatorExpression(right) - default: - return newError("operesheni haieleweki: %s%s", operator, right.Type()) - } -} - -func evalBangOperatorExpression(right object.Object) object.Object { - switch right { - case TRUE: - return FALSE - case FALSE: - return TRUE - case NULL: - return TRUE - default: - return FALSE - } -} - -func evalMinusPrefixOperatorExpression(right object.Object) object.Object { - if right.Type() != object.INTEGER_OBJ { - return newError("Operesheni Haielweki: -%s", right.Type()) - } - - value := right.(*object.Integer).Value - return &object.Integer{Value: -value} -} - -func evalInfixExpression( - operator string, - left, right object.Object, -) object.Object { - switch { - - case operator == "+" && left.Type() == object.DICT_OBJ && right.Type() == object.DICT_OBJ: - leftVal := left.(*object.Dict).Pairs - rightVal := right.(*object.Dict).Pairs - pairs := make(map[object.HashKey]object.DictPair) - for k, v := range leftVal { - pairs[k] = v - } - for k, v := range rightVal { - pairs[k] = v - } - return &object.Dict{Pairs: pairs} - - case operator == "+" && left.Type() == object.ARRAY_OBJ && right.Type() == object.ARRAY_OBJ: - leftVal := left.(*object.Array).Elements - rightVal := right.(*object.Array).Elements - elements := make([]object.Object, len(leftVal)+len(rightVal)) - elements = append(leftVal, rightVal...) - return &object.Array{Elements: elements} - - case operator == "*" && left.Type() == object.ARRAY_OBJ && right.Type() == object.INTEGER_OBJ: - leftVal := left.(*object.Array).Elements - rightVal := int(right.(*object.Integer).Value) - elements := leftVal - for i := rightVal; i > 1; i-- { - elements = append(elements, leftVal...) - } - return &object.Array{Elements: elements} - - case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.ARRAY_OBJ: - leftVal := int(left.(*object.Integer).Value) - rightVal := right.(*object.Array).Elements - elements := rightVal - for i := leftVal; i > 1; i-- { - elements = append(elements, rightVal...) - } - return &object.Array{Elements: elements} - - case operator == "*" && left.Type() == object.STRING_OBJ && right.Type() == object.INTEGER_OBJ: - leftVal := left.(*object.String).Value - rightVal := right.(*object.Integer).Value - return &object.String{Value: strings.Repeat(leftVal, int(rightVal))} - - case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.STRING_OBJ: - leftVal := left.(*object.Integer).Value - rightVal := right.(*object.String).Value - return &object.String{Value: strings.Repeat(rightVal, int(leftVal))} - - case left.Type() == object.INTEGER_OBJ && right.Type() == object.INTEGER_OBJ: - return evalIntegerInfixExpression(operator, left, right) - - case operator == "==": - return nativeBoolToBooleanObject(left == right) - - case operator == "!=": - return nativeBoolToBooleanObject(left != right) - - case left.Type() != right.Type(): - return newError("Aina Hazilingani: %s %s %s", - left.Type(), operator, right.Type()) - - case left.Type() == object.STRING_OBJ && right.Type() == object.STRING_OBJ: - return evalStringInfixExpression(operator, left, right) - - default: - return newError("Operesheni Haielweki: %s %s %s", - left.Type(), operator, right.Type()) - } -} - -func evalIntegerInfixExpression( - operator string, - left, right object.Object, -) object.Object { - leftVal := left.(*object.Integer).Value - rightVal := right.(*object.Integer).Value - - switch operator { - case "+": - return &object.Integer{Value: leftVal + rightVal} - case "-": - return &object.Integer{Value: leftVal - rightVal} - case "*": - return &object.Integer{Value: leftVal * rightVal} - case "/": - return &object.Integer{Value: leftVal / rightVal} - case "<": - return nativeBoolToBooleanObject(leftVal < rightVal) - case ">": - return nativeBoolToBooleanObject(leftVal > rightVal) - case "==": - return nativeBoolToBooleanObject(leftVal == rightVal) - case "!=": - return nativeBoolToBooleanObject(leftVal != rightVal) - default: - return newError("Operesheni Haielweki: %s %s %s", - left.Type(), operator, right.Type()) - } -} - -func evalIfExpression(ie *ast.IfExpression, env *object.Environment) object.Object { - condition := Eval(ie.Condition, env) - - if isError(condition) { - return condition - } - - if isTruthy(condition) { - return Eval(ie.Consequence, env) - } else if ie.Alternative != nil { - return Eval(ie.Alternative, env) - } else { - return NULL - } -} - -func isTruthy(obj object.Object) bool { - switch obj { - case NULL: - return false - case TRUE: - return true - case FALSE: - return false - default: - return true - } -} - -func evalBlockStatement(block *ast.BlockStatement, env *object.Environment) object.Object { - var result object.Object - - for _, statment := range block.Statements { - result = Eval(statment, env) - - if result != nil { - rt := result.Type() - if rt == object.RETURN_VALUE_OBJ || rt == object.ERROR_OBJ { - return result - } - } - } - - return result -} - -func newError(format string, a ...interface{}) *object.Error { - format = fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, format) - return &object.Error{Message: fmt.Sprintf(format, a...)} -} - -func isError(obj object.Object) bool { - if obj != nil { - return obj.Type() == object.ERROR_OBJ - } - - return false -} - -func evalIdentifier(node *ast.Identifier, env *object.Environment) object.Object { - if val, ok := env.Get(node.Value); ok { - return val - } - if builtin, ok := builtins[node.Value]; ok { - return builtin - } - - return newError("Neno Halifahamiki: " + node.Value) -} - -func evalExpressions(exps []ast.Expression, env *object.Environment) []object.Object { - var result []object.Object - - for _, e := range exps { - evaluated := Eval(e, env) - if isError(evaluated) { - return []object.Object{evaluated} - } - - result = append(result, evaluated) - } - - return result -} - -func applyFunction(fn object.Object, args []object.Object) object.Object { - switch fn := fn.(type) { - case *object.Function: - extendedEnv := extendedFunctionEnv(fn, args) - evaluated := Eval(fn.Body, extendedEnv) - return unwrapReturnValue(evaluated) - case *object.Builtin: - return fn.Fn(args...) - default: - return newError("sio function: %s", fn.Type()) - } - -} - -func extendedFunctionEnv(fn *object.Function, args []object.Object) *object.Environment { - env := object.NewEnclosedEnvironment(fn.Env) - - for paramIdx, param := range fn.Parameters { - if paramIdx < len(args) { - env.Set(param.Value, args[paramIdx]) - } - } - return env -} - -func unwrapReturnValue(obj object.Object) object.Object { - if returnValue, ok := obj.(*object.ReturnValue); ok { - return returnValue.Value - } - - return obj -} - -func evalStringInfixExpression(operator string, left, right object.Object) object.Object { - if operator != "+" { - return newError("Operesheni Haielweki: %s %s %s", left.Type(), operator, right.Type()) - } - - leftVal := left.(*object.String).Value - rightVal := right.(*object.String).Value - - return &object.String{Value: leftVal + rightVal} -} - -func evalIndexExpression(left, index object.Object) object.Object { - switch { - case left.Type() == object.ARRAY_OBJ && index.Type() == object.INTEGER_OBJ: - return evalArrayIndexExpression(left, index) - case left.Type() == object.ARRAY_OBJ && index.Type() != object.INTEGER_OBJ: - return newError("Tafadhali tumia number, sio: %s", index.Type()) - case left.Type() == object.DICT_OBJ: - return evalDictIndexExpression(left, index) - default: - return newError("Operesheni hii haiwezekani kwa: %s", left.Type()) - } -} - -func evalArrayIndexExpression(array, index object.Object) object.Object { - arrayObject := array.(*object.Array) - idx := index.(*object.Integer).Value - max := int64(len(arrayObject.Elements) - 1) - - if idx < 0 || idx > max { - return NULL - } - - return arrayObject.Elements[idx] -} - -func evalDictLiteral(node *ast.DictLiteral, env *object.Environment) object.Object { - pairs := make(map[object.HashKey]object.DictPair) - - for keyNode, valueNode := range node.Pairs { - key := Eval(keyNode, env) - if isError(key) { - return key - } - - hashKey, ok := key.(object.Hashable) - if !ok { - return newError("Hashing imeshindikana: %s", key.Type()) - } - - value := Eval(valueNode, env) - if isError(value) { - return value - } - - hashed := hashKey.HashKey() - pairs[hashed] = object.DictPair{Key: key, Value: value} - } - - return &object.Dict{Pairs: pairs} -} - -func evalDictIndexExpression(dict, index object.Object) object.Object { - dictObject := dict.(*object.Dict) - - key, ok := index.(object.Hashable) - if !ok { - return newError("Samahani, %s haitumiki kama key", index.Type()) - } - - pair, ok := dictObject.Pairs[key.HashKey()] - if !ok { - return NULL - } - - return pair.Value -} - -func evalWhileExpression(we *ast.WhileExpression, env *object.Environment) object.Object { - var result object.Object - - for { - condition := Eval(we.Condition, env) - if isError(condition) { - return condition - } - - if isTruthy(condition) { - result = Eval(we.Consequence, env) - } else { - break - } - } - - if result != nil { - return result - } - return nil -} diff --git a/lexer/lexer.go b/lexer/lexer.go deleted file mode 100644 index 3df1a45..0000000 --- a/lexer/lexer.go +++ /dev/null @@ -1,193 +0,0 @@ -package lexer - -import ( - "github.com/AvicennaJr/Nuru/token" -) - -type Lexer struct { - input string // string or runes. Runes should be better. - position int - readPosition int - ch byte // make this a rune too -} - -func New(input string) *Lexer { - l := &Lexer{input: input} - l.readChar() - return l -} - -func (l *Lexer) readChar() { - if l.readPosition >= len(l.input) { - l.ch = 0 - } else { - l.ch = l.input[l.readPosition] - } - - l.position = l.readPosition - l.readPosition += 1 -} - -func (l *Lexer) NextToken() token.Token { - var tok token.Token - l.skipWhitespace() - if l.ch == '/' && l.peekChar() == '/' { - l.skipSingleLineComment() - return l.NextToken() - } - if l.ch == '/' && l.peekChar() == '*' { - l.skipMultiLineComment() - return l.NextToken() - } - - switch l.ch { - case '=': - if l.peekChar() == '=' { - ch := l.ch - l.readChar() - tok = token.Token{Type: token.EQ, Literal: string(ch) + string(l.ch)} - } else { - tok = newToken(token.ASSIGN, l.ch) - } - case ';': - tok = newToken(token.SEMICOLON, l.ch) - case '(': - tok = newToken(token.LPAREN, l.ch) - case ')': - tok = newToken(token.RPAREN, l.ch) - case '{': - tok = newToken(token.LBRACE, l.ch) - case '}': - tok = newToken(token.RBRACE, l.ch) - case ',': - tok = newToken(token.COMMA, l.ch) - case '+': - tok = newToken(token.PLUS, l.ch) - case '-': - tok = newToken(token.MINUS, l.ch) - case '!': - if l.peekChar() == '=' { - ch := l.ch - l.readChar() - tok = token.Token{Type: token.NOT_EQ, Literal: string(ch) + string(l.ch)} - } else { - tok = newToken(token.BANG, l.ch) - } - case '/': - tok = newToken(token.SLASH, l.ch) - case '*': - tok = newToken(token.ASTERISK, l.ch) - case '<': - tok = newToken(token.LT, l.ch) - case '>': - tok = newToken(token.GT, l.ch) - case '"': - tok.Type = token.STRING - tok.Literal = l.readString() - case '[': - tok = newToken(token.LBRACKET, l.ch) - case ']': - tok = newToken(token.RBRACKET, l.ch) - case ':': - tok = newToken(token.COLON, l.ch) - case 0: - tok.Literal = "" - tok.Type = token.EOF - default: - if isLetter(l.ch) { - tok.Literal = l.readIdentifier() - tok.Type = token.LookupIdent(tok.Literal) - return tok - } else if isDigit(l.ch) { - tok.Type = token.INT - tok.Literal = l.readNumber() - return tok - } else { - tok = newToken(token.ILLEGAL, l.ch) - } - } - - l.readChar() - return tok -} - -func newToken(tokenType token.TokenType, ch byte) token.Token { - return token.Token{Type: tokenType, Literal: string(ch)} -} - -func (l *Lexer) readIdentifier() string { - position := l.position - - for isLetter(l.ch) { - l.readChar() - } - return l.input[position:l.position] -} - -func isLetter(ch byte) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch == '?' || ch == '&' -} - -func (l *Lexer) skipWhitespace() { - for l.ch == ' ' || l.ch == '\t' || l.ch == '\n' || l.ch == '\r' { - l.readChar() - } -} - -func (l *Lexer) readNumber() string { - position := l.position - for isDigit(l.ch) { - l.readChar() - } - return l.input[position:l.position] -} - -func isDigit(ch byte) bool { - return '0' <= ch && ch <= '9' -} - -func (l *Lexer) peekChar() byte { - if l.readPosition >= len(l.input) { - return 0 - } else { - return l.input[l.readPosition] - } -} - -func (l *Lexer) skipSingleLineComment() { - for l.ch != '\n' && l.ch != 0 { - l.readChar() - } - l.skipWhitespace() -} - -func (l *Lexer) skipMultiLineComment() { - endFound := false - - for !endFound { - if l.ch == 0 { - endFound = true - } - - if l.ch == '*' && l.peekChar() == '/' { - endFound = true - l.readChar() - } - - l.readChar() - } - - l.skipWhitespace() -} - -func (l *Lexer) readString() string { - position := l.position + 1 - for { - l.readChar() - if l.ch == '"' || l.ch == 0 { - break - } - } - - return l.input[position:l.position] -} diff --git a/main.go b/main.go deleted file mode 100644 index 54ef51a..0000000 --- a/main.go +++ /dev/null @@ -1,58 +0,0 @@ -package main - -import ( - "flag" - "fmt" - "io/ioutil" - "os" - - "github.com/AvicennaJr/Nuru/repl" -) - -const ( - LOGO = ` - -█░░ █░█ █▀▀ █░█ ▄▀█   █▄█ ▄▀█   █▄░█ █░█ █▀█ █░█ -█▄▄ █▄█ █▄█ █▀█ █▀█   ░█░ █▀█   █░▀█ █▄█ █▀▄ █▄█ - - | Authored by Avicenna | -` - VERSION = "v0.1.0" -) - -func main() { - - version := flag.Bool("v", false, "Onyesha version namba ya program") - flag.Parse() - - if *version { - fmt.Println(fmt.Sprintf("\x1b[%dm%s%s\x1b[0m", 32, "Nuru Programming Language || Version: ", VERSION)) - os.Exit(0) - } - args := flag.Args() - - if len(args) < 1 { - - coloredLogo := fmt.Sprintf("\x1b[%dm%s\x1b[0m", 34, LOGO) - fmt.Println(coloredLogo) - fmt.Println("𝑯𝒂𝒃𝒂𝒓𝒊, 𝒌𝒂𝒓𝒊𝒃𝒖 𝒖𝒕𝒖𝒎𝒊𝒆 𝒍𝒖𝒈𝒉𝒂 𝒚𝒂 𝑵𝒖𝒓𝒖 ✨") - fmt.Println("\nTumia exit() au toka() kuondoka") - - repl.Start(os.Stdin, os.Stdout) - } else if len(args) == 1 { - - file := args[0] - contents, err := ioutil.ReadFile(file) - if err != nil { - fmt.Println(fmt.Sprintf("\x1b[%dm%s%s\x1b[0m", 31, "Error: Nimeshindwa kusoma file: ", args[0])) - os.Exit(0) - } - - repl.Read(string(contents)) - - } else { - fmt.Println(fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, "Error: Opereshen imeshindikana boss.")) - fmt.Println(fmt.Sprintf("\x1b[%dm%s\x1b[0m", 32, "\nTumia Command: 'nuru' kutmia program AU\nTumia Command: 'nuru' ikifuatwa na program file.\n\n\tMfano:\tnuru fileYangu.nr\n")) - os.Exit(0) - } -} diff --git a/object/object.go b/object/object.go deleted file mode 100644 index fba6726..0000000 --- a/object/object.go +++ /dev/null @@ -1,191 +0,0 @@ -package object - -import ( - "bytes" - "fmt" - "hash/fnv" - "strings" - - "github.com/AvicennaJr/Nuru/ast" -) - -type ObjectType string - -const ( - INTEGER_OBJ = "NAMBA" - BOOLEAN_OBJ = "BOOLEAN" - NULL_OBJ = "NULL" - RETURN_VALUE_OBJ = "RUDISHA" - ERROR_OBJ = "KOSA" - FUNCTION_OBJ = "FUNCTION" - STRING_OBJ = "NENO" - BUILTIN_OBJ = "YA_NDANI" - ARRAY_OBJ = "ARRAY" - DICT_OBJ = "KAMUSI" -) - -type Object interface { - Type() ObjectType - Inspect() string -} - -type Integer struct { - Value int64 -} - -func (i *Integer) Inspect() string { return fmt.Sprintf("%d", i.Value) } -func (i *Integer) Type() ObjectType { return INTEGER_OBJ } - -type Boolean struct { - Value bool -} - -func (b *Boolean) Inspect() string { - if b.Value { - return "kweli" - } else { - return "sikweli" - } -} -func (b *Boolean) Type() ObjectType { return BOOLEAN_OBJ } - -type Null struct{} - -func (n *Null) Inspect() string { return "null" } -func (n *Null) Type() ObjectType { return NULL_OBJ } - -type ReturnValue struct { - Value Object -} - -func (rv *ReturnValue) Inspect() string { return rv.Value.Inspect() } -func (rv *ReturnValue) Type() ObjectType { return RETURN_VALUE_OBJ } - -type Error struct { - Message string -} - -func (e *Error) Inspect() string { - msg := fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, "ERROR: ") - return msg + e.Message -} -func (e *Error) Type() ObjectType { return ERROR_OBJ } - -type Function struct { - Parameters []*ast.Identifier - Body *ast.BlockStatement - Env *Environment -} - -func (f *Function) Type() ObjectType { return FUNCTION_OBJ } -func (f *Function) Inspect() string { - var out bytes.Buffer - - params := []string{} - for _, p := range f.Parameters { - params = append(params, p.String()) - } - - out.WriteString("fn") - out.WriteString("(") - out.WriteString(strings.Join(params, ", ")) - out.WriteString(") {\n") - out.WriteString(f.Body.String()) - out.WriteString("\n}") - - return out.String() -} - -type String struct { - Value string -} - -func (s *String) Inspect() string { return s.Value } -func (s *String) Type() ObjectType { return STRING_OBJ } - -type BuiltinFunction func(args ...Object) Object - -type Builtin struct { - Fn BuiltinFunction -} - -func (b *Builtin) Inspect() string { return "builtin function" } -func (b *Builtin) Type() ObjectType { return BUILTIN_OBJ } - -type Array struct { - Elements []Object -} - -func (ao *Array) Type() ObjectType { return ARRAY_OBJ } -func (ao *Array) Inspect() string { - var out bytes.Buffer - - elements := []string{} - for _, e := range ao.Elements { - elements = append(elements, e.Inspect()) - } - - out.WriteString("[") - out.WriteString(strings.Join(elements, ", ")) - out.WriteString("]") - - return out.String() -} - -type HashKey struct { - Type ObjectType - Value uint64 -} - -func (b *Boolean) HashKey() HashKey { - var value uint64 - - if b.Value { - value = 1 - } else { - value = 0 - } - - return HashKey{Type: b.Type(), Value: value} -} - -func (i *Integer) HashKey() HashKey { - return HashKey{Type: i.Type(), Value: uint64(i.Value)} -} - -func (s *String) HashKey() HashKey { - h := fnv.New64a() - h.Write([]byte(s.Value)) - - return HashKey{Type: s.Type(), Value: h.Sum64()} -} - -type DictPair struct { - Key Object - Value Object -} - -type Dict struct { - Pairs map[HashKey]DictPair -} - -func (d *Dict) Type() ObjectType { return DICT_OBJ } -func (d *Dict) Inspect() string { - var out bytes.Buffer - - pairs := []string{} - - for _, pair := range d.Pairs { - pairs = append(pairs, fmt.Sprintf("%s: %s", pair.Key.Inspect(), pair.Value.Inspect())) - } - - out.WriteString("{") - out.WriteString(strings.Join(pairs, ", ")) - out.WriteString("}") - - return out.String() -} - -type Hashable interface { - HashKey() HashKey -} diff --git a/parser/parser.go b/parser/parser.go deleted file mode 100644 index 1018ace..0000000 --- a/parser/parser.go +++ /dev/null @@ -1,535 +0,0 @@ -package parser - -import ( - "fmt" - "strconv" - - "github.com/AvicennaJr/Nuru/ast" - "github.com/AvicennaJr/Nuru/lexer" - "github.com/AvicennaJr/Nuru/token" -) - -const ( - // Think of BODMAS - _ int = iota - LOWEST - ASSIGN // = - EQUALS // == - LESSGREATER // > OR < - SUM // + - PRODUCT // * - PREFIX // -X OR !X - CALL // myFunction(X) - INDEX // Arrays -) - -var precedences = map[token.TokenType]int{ - token.ASSIGN: ASSIGN, // Lowest priority - token.EQ: EQUALS, - token.NOT_EQ: EQUALS, - token.LT: LESSGREATER, - token.GT: LESSGREATER, - token.PLUS: SUM, - token.MINUS: SUM, - token.SLASH: PRODUCT, - token.ASTERISK: PRODUCT, - token.LPAREN: CALL, - token.LBRACKET: INDEX, // Highest priority -} - -type ( - prefixParseFn func() ast.Expression - infixParseFn func(ast.Expression) ast.Expression -) - -type Parser struct { - l *lexer.Lexer - - curToken token.Token - peekToken token.Token - - errors []string - - prefixParseFns map[token.TokenType]prefixParseFn - infixParseFns map[token.TokenType]infixParseFn -} - -func New(l *lexer.Lexer) *Parser { - p := &Parser{l: l, errors: []string{}} - - // Gotta set these niggas - p.nextToken() - p.nextToken() - - p.prefixParseFns = make(map[token.TokenType]prefixParseFn) - p.registerPrefix(token.STRING, p.parseStringLiteral) - p.registerPrefix(token.IDENT, p.parseIdentifier) - p.registerPrefix(token.INT, p.parseIntegerLiteral) - p.registerPrefix(token.BANG, p.parsePrefixExpression) - p.registerPrefix(token.MINUS, p.parsePrefixExpression) - p.registerPrefix(token.TRUE, p.parseBoolean) - p.registerPrefix(token.FALSE, p.parseBoolean) - p.registerPrefix(token.LPAREN, p.parseGroupedExpression) - p.registerPrefix(token.IF, p.parseIfExpression) - p.registerPrefix(token.FUNCTION, p.parseFunctionLiteral) - p.registerPrefix(token.LBRACKET, p.parseArrayLiteral) - p.registerPrefix(token.LBRACE, p.parseDictLiteral) - p.registerPrefix(token.WHILE, p.parseWhileExpression) - - p.infixParseFns = make(map[token.TokenType]infixParseFn) - p.registerInfix(token.PLUS, p.parseInfixExpression) - p.registerInfix(token.MINUS, p.parseInfixExpression) - p.registerInfix(token.SLASH, p.parseInfixExpression) - p.registerInfix(token.ASTERISK, p.parseInfixExpression) - p.registerInfix(token.EQ, p.parseInfixExpression) - p.registerInfix(token.NOT_EQ, p.parseInfixExpression) - p.registerInfix(token.LT, p.parseInfixExpression) - p.registerInfix(token.GT, p.parseInfixExpression) - p.registerInfix(token.LPAREN, p.parseCallExpression) - p.registerInfix(token.LBRACKET, p.parseIndexExpression) - p.registerInfix(token.ASSIGN, p.parseAssignmentExpression) - return p -} - -func (p *Parser) nextToken() { - // only missing shuffle to make it a music player XD - p.curToken = p.peekToken - p.peekToken = p.l.NextToken() -} - -func (p *Parser) ParseProgram() *ast.Program { - program := &ast.Program{} - program.Statements = []ast.Statement{} - - for !p.curTokenIs(token.EOF) { - stmt := p.parseStatement() - program.Statements = append(program.Statements, stmt) - - p.nextToken() - } - return program -} - -func (p *Parser) parseStatement() ast.Statement { - // Remember to add switch statements to the language - switch p.curToken.Type { - case token.LET: - return p.parseLetStatment() - case token.RETURN: - return p.parseReturnStatement() - default: - return p.parseExpressionStatement() - } -} - -func (p *Parser) parseLetStatment() *ast.LetStatement { - stmt := &ast.LetStatement{Token: p.curToken} - - if !p.expectPeek(token.IDENT) { - return nil - } - - stmt.Name = &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} - - if !p.expectPeek(token.ASSIGN) { - return nil - } - - p.nextToken() - - stmt.Value = p.parseExpression(LOWEST) - - if p.peekTokenIs(token.SEMICOLON) { - p.nextToken() - } - - return stmt -} - -func (p *Parser) parseAssignmentExpression(exp ast.Expression) ast.Expression { - switch node := exp.(type) { - case *ast.Identifier, *ast.IndexExpression: - default: - msg := fmt.Sprintf("Tulitegemea kupata kitambulishi au array, badala yake tumepata: %T %#v", node, exp) - p.errors = append(p.errors, msg) - return nil - } - - ae := &ast.AssignmentExpression{Token: p.curToken, Left: exp} - - p.nextToken() - - ae.Value = p.parseExpression(LOWEST) - - return ae -} - -func (p *Parser) curTokenIs(t token.TokenType) bool { - return p.curToken.Type == t -} - -func (p *Parser) peekTokenIs(t token.TokenType) bool { - return p.peekToken.Type == t -} - -func (p *Parser) expectPeek(t token.TokenType) bool { - if p.peekTokenIs(t) { - p.nextToken() - return true - } else { - p.peekError(t) - return false - } -} - -func (p *Parser) Errors() []string { - return p.errors -} - -func (p *Parser) peekError(t token.TokenType) { - msg := fmt.Sprintf("Tulitegemea kupata %s, badala yake tumepata %s", t, p.peekToken.Type) - p.errors = append(p.errors, msg) -} - -func (p *Parser) parseReturnStatement() *ast.ReturnStatement { - stmt := &ast.ReturnStatement{Token: p.curToken} - p.nextToken() - - stmt.ReturnValue = p.parseExpression(LOWEST) - - if p.peekTokenIs(token.SEMICOLON) { - p.nextToken() - } - - return stmt -} - -func (p *Parser) registerPrefix(tokenType token.TokenType, fn prefixParseFn) { - p.prefixParseFns[tokenType] = fn -} - -func (p *Parser) registerInfix(tokenType token.TokenType, fn infixParseFn) { - p.infixParseFns[tokenType] = fn -} - -func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { - stmt := &ast.ExpressionStatement{Token: p.curToken} - - stmt.Expression = p.parseExpression(LOWEST) - - if p.peekTokenIs(token.SEMICOLON) { - p.nextToken() - } - - return stmt -} - -func (p *Parser) noPrefixParseFnError(t token.TokenType) { - msg := fmt.Sprintf("Tumeshindwa kuparse %s", t) - p.errors = append(p.errors, msg) -} - -func (p *Parser) parseExpression(precedence int) ast.Expression { - prefix := p.prefixParseFns[p.curToken.Type] - if prefix == nil { - p.noPrefixParseFnError(p.curToken.Type) - return nil - } - leftExp := prefix() - - for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { - infix := p.infixParseFns[p.peekToken.Type] - if infix == nil { - return leftExp - } - - p.nextToken() - leftExp = infix(leftExp) - } - return leftExp - -} - -func (p *Parser) parseIdentifier() ast.Expression { - return &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} -} - -func (p *Parser) parseIntegerLiteral() ast.Expression { - lit := &ast.IntegerLiteral{Token: p.curToken} - - value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) - if err != nil { - msg := fmt.Sprintf("Hatuwezi kuparse %q kama namba", p.curToken.Literal) - p.errors = append(p.errors, msg) - return nil - } - lit.Value = value - - return lit -} - -func (p *Parser) parsePrefixExpression() ast.Expression { - expression := &ast.PrefixExpression{ - Token: p.curToken, - Operator: p.curToken.Literal, - } - - p.nextToken() - - expression.Right = p.parseExpression(PREFIX) - - return expression -} - -func (p *Parser) peekPrecedence() int { - if p, ok := precedences[p.peekToken.Type]; ok { - return p - } - return LOWEST -} - -func (p *Parser) curPrecedence() int { - if p, ok := precedences[p.curToken.Type]; ok { - return p - } - - return LOWEST -} - -func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { - expression := &ast.InfixExpression{ - Token: p.curToken, - Operator: p.curToken.Literal, - Left: left, - } - - precedence := p.curPrecedence() - p.nextToken() - expression.Right = p.parseExpression(precedence) - return expression -} - -func (p *Parser) parseBoolean() ast.Expression { - return &ast.Boolean{Token: p.curToken, Value: p.curTokenIs(token.TRUE)} -} - -func (p *Parser) parseGroupedExpression() ast.Expression { - p.nextToken() - - exp := p.parseExpression(LOWEST) - - if !p.expectPeek(token.RPAREN) { - return nil - } - - return exp -} - -func (p *Parser) parseIfExpression() ast.Expression { - expression := &ast.IfExpression{Token: p.curToken} - - if !p.expectPeek(token.LPAREN) { - return nil - } - - p.nextToken() - expression.Condition = p.parseExpression(LOWEST) - - if !p.expectPeek(token.RPAREN) { - return nil - } - - if !p.expectPeek(token.LBRACE) { - return nil - } - - expression.Consequence = p.parseBlockStatement() - - if p.peekTokenIs(token.ELSE) { - p.nextToken() - if p.peekTokenIs(token.IF) { - p.nextToken() - expression.Alternative = &ast.BlockStatement{ - Statements: []ast.Statement{ - &ast.ExpressionStatement{ - Expression: p.parseIfExpression(), - }, - }, - } - return expression - } - - if !p.expectPeek(token.LBRACE) { - return nil - } - - expression.Alternative = p.parseBlockStatement() - } - - return expression -} - -func (p *Parser) parseBlockStatement() *ast.BlockStatement { - block := &ast.BlockStatement{Token: p.curToken} - block.Statements = []ast.Statement{} - - p.nextToken() - - for !p.curTokenIs(token.RBRACE) && !p.curTokenIs(token.EOF) { - stmt := p.parseStatement() - block.Statements = append(block.Statements, stmt) - p.nextToken() - } - - return block -} - -func (p *Parser) parseFunctionLiteral() ast.Expression { - lit := &ast.FunctionLiteral{Token: p.curToken} - - if !p.expectPeek(token.LPAREN) { - return nil - } - - lit.Parameters = p.parseFunctionParameters() - - if !p.expectPeek(token.LBRACE) { - return nil - } - - lit.Body = p.parseBlockStatement() - - return lit -} - -func (p *Parser) parseFunctionParameters() []*ast.Identifier { - identifiers := []*ast.Identifier{} - - if p.peekTokenIs(token.RPAREN) { - p.nextToken() - return identifiers - } - - p.nextToken() - - ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} - identifiers = append(identifiers, ident) - - for p.peekTokenIs(token.COMMA) { - p.nextToken() - p.nextToken() - ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} - identifiers = append(identifiers, ident) - } - - if !p.expectPeek(token.RPAREN) { - return nil - } - - return identifiers -} - -func (p *Parser) parseCallExpression(function ast.Expression) ast.Expression { - exp := &ast.CallExpression{Token: p.curToken, Function: function} - exp.Arguments = p.parseExpressionList(token.RPAREN) - return exp -} - -func (p *Parser) parseStringLiteral() ast.Expression { - return &ast.StringLiteral{Token: p.curToken, Value: p.curToken.Literal} -} - -func (p *Parser) parseArrayLiteral() ast.Expression { - array := &ast.ArrayLiteral{Token: p.curToken} - - array.Elements = p.parseExpressionList(token.RBRACKET) - - return array -} - -func (p *Parser) parseExpressionList(end token.TokenType) []ast.Expression { - list := []ast.Expression{} - - if p.peekTokenIs(end) { - p.nextToken() - return list - } - - p.nextToken() - list = append(list, p.parseExpression(LOWEST)) - - for p.peekTokenIs(token.COMMA) { - p.nextToken() - p.nextToken() - list = append(list, p.parseExpression(LOWEST)) - } - - if !p.expectPeek(end) { - return nil - } - return list -} - -func (p *Parser) parseIndexExpression(left ast.Expression) ast.Expression { - exp := &ast.IndexExpression{Token: p.curToken, Left: left} - - p.nextToken() - exp.Index = p.parseExpression(LOWEST) - if !p.expectPeek(token.RBRACKET) { - return nil - } - - return exp -} - -func (p *Parser) parseDictLiteral() ast.Expression { - dict := &ast.DictLiteral{Token: p.curToken} - dict.Pairs = make(map[ast.Expression]ast.Expression) - - for !p.peekTokenIs(token.RBRACE) { - p.nextToken() - key := p.parseExpression(LOWEST) - - if !p.expectPeek(token.COLON) { - return nil - } - - p.nextToken() - value := p.parseExpression(LOWEST) - - dict.Pairs[key] = value - - if !p.peekTokenIs(token.RBRACE) && !p.expectPeek(token.COMMA) { - return nil - } - } - - if !p.expectPeek(token.RBRACE) { - return nil - } - - return dict -} - -func (p *Parser) parseWhileExpression() ast.Expression { - expression := &ast.WhileExpression{Token: p.curToken} - - if !p.expectPeek(token.LPAREN) { - return nil - } - - p.nextToken() - expression.Condition = p.parseExpression(LOWEST) - - if !p.expectPeek(token.RPAREN) { - return nil - } - - if !p.expectPeek(token.LBRACE) { - return nil - } - - expression.Consequence = p.parseBlockStatement() - - return expression -} diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..08ffece --- /dev/null +++ b/src/Makefile @@ -0,0 +1,23 @@ +VERSION=0.2.0 + +build_linux: + env GOOS=linux GOARCH=amd64 go build -o nuru + tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru + rm nuru + +build_windows: + env GOOS=windows GOARCH=amd64 go build -o nuru_windows_amd64_v${VERSION}.exe + +build_android: + env GOOS=android GOARCH=arm64 go build -o nuru + tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru + rm nuru + +test: + go test ./parser/ + go test ./ast/ + go test ./evaluator/ + go test ./object/ + +clean: + go clean \ No newline at end of file diff --git a/ast/ast.go b/src/ast/ast.go similarity index 67% rename from ast/ast.go rename to src/ast/ast.go index 241a169..3f6e407 100644 --- a/ast/ast.go +++ b/src/ast/ast.go @@ -179,13 +179,13 @@ func (ie *IfExpression) expressionNode() {} func (ie *IfExpression) TokenLiteral() string { return ie.Token.Literal } func (ie *IfExpression) String() string { var out bytes.Buffer - out.WriteString("if") + out.WriteString("kama") out.WriteString(ie.Condition.String()) out.WriteString(" ") out.WriteString(ie.Consequence.String()) if ie.Alternative != nil { - out.WriteString("else") + out.WriteString("sivyo") out.WriteString(ie.Alternative.String()) } @@ -360,10 +360,169 @@ func (we *WhileExpression) TokenLiteral() string { return we.Token.Literal } func (we *WhileExpression) String() string { var out bytes.Buffer - out.WriteString("while") + out.WriteString("wakati") out.WriteString(we.Condition.String()) out.WriteString(" ") out.WriteString(we.Consequence.String()) return out.String() } + +type Null struct { + Token token.Token +} + +func (n *Null) expressionNode() {} +func (n *Null) TokenLiteral() string { return n.Token.Literal } +func (n *Null) String() string { return n.Token.Literal } + +type Break struct { + Statement + Token token.Token // the 'break' token +} + +func (b *Break) expressionNode() {} +func (b *Break) TokenLiteral() string { return b.Token.Literal } +func (b *Break) String() string { return b.Token.Literal } + +type Continue struct { + Statement + Token token.Token // the 'continue' token +} + +func (c *Continue) expressionNode() {} +func (c *Continue) TokenLiteral() string { return c.Token.Literal } +func (c *Continue) String() string { return c.Token.Literal } + +type PostfixExpression struct { + Token token.Token + Operator string +} + +func (pe *PostfixExpression) expressionNode() {} +func (pe *PostfixExpression) TokenLiteral() string { return pe.Token.Literal } +func (pe *PostfixExpression) String() string { + var out bytes.Buffer + out.WriteString("(") + out.WriteString(pe.Token.Literal) + out.WriteString(pe.Operator) + out.WriteString(")") + return out.String() +} + +type FloatLiteral struct { + Token token.Token + Value float64 +} + +func (fl *FloatLiteral) expressionNode() {} +func (fl *FloatLiteral) TokenLiteral() string { return fl.Token.Literal } +func (fl *FloatLiteral) String() string { return fl.Token.Literal } + +type For struct { + Expression + Token token.Token + Identifier string // "i" + StarterName *Identifier // i = 0 + StarterValue Expression + Closer Expression // i++ + Condition Expression // i < 1 + Block *BlockStatement +} + +type ForIn struct { + Expression + Token token.Token + Key string + Value string + Iterable Expression + Block *BlockStatement +} + +func (fi *ForIn) expressionNode() {} +func (fi *ForIn) TokenLiteral() string { return fi.Token.Literal } +func (fi *ForIn) String() string { + var out bytes.Buffer + + out.WriteString("kwa ") + if fi.Key != "" { + out.WriteString(fi.Key + ", ") + } + out.WriteString(fi.Value + " ") + out.WriteString("ktk ") + out.WriteString(fi.Iterable.String() + " {\n") + out.WriteString("\t" + fi.Block.String()) + out.WriteString("\n}") + + return out.String() +} + +type CaseExpression struct { + Token token.Token + Default bool + Expr []Expression + Block *BlockStatement +} + +func (ce *CaseExpression) expressionNode() {} +func (ce *CaseExpression) TokenLiteral() string { return ce.Token.Literal } +func (ce *CaseExpression) String() string { + var out bytes.Buffer + + if ce.Default { + out.WriteString("kawaida ") + } else { + out.WriteString("ikiwa ") + + tmp := []string{} + for _, exp := range ce.Expr { + tmp = append(tmp, exp.String()) + } + out.WriteString(strings.Join(tmp, ",")) + } + out.WriteString(ce.Block.String()) + return out.String() +} + +type SwitchExpression struct { + Token token.Token + Value Expression + Choices []*CaseExpression +} + +func (se *SwitchExpression) expressionNode() {} +func (se *SwitchExpression) TokenLiteral() string { return se.Token.Literal } +func (se *SwitchExpression) String() string { + var out bytes.Buffer + out.WriteString("\nbadili (") + out.WriteString(se.Value.String()) + out.WriteString(")\n{\n") + + for _, tmp := range se.Choices { + if tmp != nil { + out.WriteString(tmp.String()) + } + } + out.WriteString("}\n") + + return out.String() +} + +type MethodExpression struct { + Expression + Token token.Token + Object Expression + Method Expression + Arguments []Expression +} + +func (me *MethodExpression) expressionNode() {} +func (me *MethodExpression) TokenLiteral() string { return me.Token.Literal } +func (me *MethodExpression) String() string { + var out bytes.Buffer + out.WriteString(me.Object.String()) + out.WriteString(".") + out.WriteString(me.Method.String()) + + return out.String() +} diff --git a/ast/ast_test.go b/src/ast/ast_test.go similarity index 81% rename from ast/ast_test.go rename to src/ast/ast_test.go index be9d6e3..c5ae5fa 100644 --- a/ast/ast_test.go +++ b/src/ast/ast_test.go @@ -10,7 +10,7 @@ func TestString(t *testing.T) { program := &Program{ Statements: []Statement{ &LetStatement{ - Token: token.Token{Type: token.LET, Literal: "acha"}, + Token: token.Token{Type: token.LET, Literal: "fanya"}, Name: &Identifier{ Token: token.Token{Type: token.IDENT, Literal: "myVar"}, Value: "myVar", @@ -23,7 +23,7 @@ func TestString(t *testing.T) { }, } - if program.String() != "acha myVar = anotherVar;" { + if program.String() != "fanya myVar = anotherVar;" { t.Errorf("program.String() wrong. got=%q", program.String()) } } diff --git a/src/evaluator/bang.go b/src/evaluator/bang.go new file mode 100644 index 0000000..de9b340 --- /dev/null +++ b/src/evaluator/bang.go @@ -0,0 +1,16 @@ +package evaluator + +import "github.com/AvicennaJr/Nuru/object" + +func evalBangOperatorExpression(right object.Object) object.Object { + switch right { + case TRUE: + return FALSE + case FALSE: + return TRUE + case NULL: + return TRUE + default: + return FALSE + } +} \ No newline at end of file diff --git a/src/evaluator/block.go b/src/evaluator/block.go new file mode 100644 index 0000000..a7c9447 --- /dev/null +++ b/src/evaluator/block.go @@ -0,0 +1,23 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalBlockStatement(block *ast.BlockStatement, env *object.Environment) object.Object { + var result object.Object + + for _, statment := range block.Statements { + result = Eval(statment, env) + + if result != nil { + rt := result.Type() + if rt == object.RETURN_VALUE_OBJ || rt == object.ERROR_OBJ || rt == object.CONTINUE_OBJ || rt == object.BREAK_OBJ { + return result + } + } + } + + return result +} diff --git a/src/evaluator/builtins.go b/src/evaluator/builtins.go new file mode 100644 index 0000000..fbf9781 --- /dev/null +++ b/src/evaluator/builtins.go @@ -0,0 +1,199 @@ +package evaluator + +import ( + "bufio" + "fmt" + "io" + "math" + "os" + "strconv" + "strings" + + "github.com/AvicennaJr/Nuru/object" +) + +var builtins = map[string]*object.Builtin{ + "idadi": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) + } + + switch arg := args[0].(type) { + case *object.Array: + return &object.Integer{Value: int64(len(arg.Elements))} + case *object.String: + return &object.Integer{Value: int64(len(arg.Value))} + default: + return newError("Samahani, hii function haitumiki na %s", args[0].Type()) + } + }, + }, + "jumla": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) + } + + switch arg := args[0].(type) { + case *object.Array: + + var sums float64 + for _, num := range arg.Elements { + + if num.Type() != object.INTEGER_OBJ && num.Type() != object.FLOAT_OBJ { + return newError("Samahani namba tu zinahitajika") + } else { + if num.Type() == object.INTEGER_OBJ { + no, _ := strconv.Atoi(num.Inspect()) + floatnum := float64(no) + sums += floatnum + } else if num.Type() == object.FLOAT_OBJ { + no, _ := strconv.ParseFloat(num.Inspect(), 64) + sums += no + } + + } + } + + if math.Mod(sums, 1) == 0 { + return &object.Integer{Value: int64(sums)} + } + + return &object.Float{Value: float64(sums)} + + default: + return newError("Samahani, hii function haitumiki na %s", args[0].Type()) + } + }, + }, + "yamwisho": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("Samahani, tunahitaji Hoja moja tu, wewe umeweka %d", len(args)) + } + if args[0].Type() != object.ARRAY_OBJ { + return newError("Samahani, hii function haitumiki na %s", args[0].Type()) + } + + arr := args[0].(*object.Array) + length := len(arr.Elements) + if length > 0 { + return arr.Elements[length-1] + } + + return NULL + }, + }, + "sukuma": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 2 { + return newError("Samahani, tunahitaji Hoja 2, wewe umeweka %d", len(args)) + } + if args[0].Type() != object.ARRAY_OBJ { + return newError("Samahani, hii function haitumiki na %s", args[0].Type()) + } + + arr := args[0].(*object.Array) + length := len(arr.Elements) + + newElements := make([]object.Object, length+1) + copy(newElements, arr.Elements) + newElements[length] = args[1] + + return &object.Array{Elements: newElements} + }, + }, + "jaza": { + Fn: func(args ...object.Object) object.Object { + + if len(args) > 1 { + return newError("Samahani, hii function inapokea hoja 0 au 1, wewe umeweka %d", len(args)) + } + + if len(args) > 0 && args[0].Type() != object.STRING_OBJ { + return newError(fmt.Sprintf(`Tafadhali tumia alama ya nukuu: "%s"`, args[0].Inspect())) + } + if len(args) == 1 { + prompt := args[0].(*object.String).Value + fmt.Fprint(os.Stdout, prompt) + } + + buffer := bufio.NewReader(os.Stdin) + + line, _, err := buffer.ReadLine() + if err != nil && err != io.EOF { + return newError("Nimeshindwa kusoma uliyo yajaza") + } + + return &object.String{Value: string(line)} + }, + }, + "andika": { + Fn: func(args ...object.Object) object.Object { + if len(args) == 0 { + fmt.Println("") + } else { + var arr []string + for _, arg := range args { + if arg == nil { + return newError("Hauwezi kufanya operesheni hii") + } + arr = append(arr, arg.Inspect()) + } + str := strings.Join(arr, " ") + print(str + "\n") + } + return nil + }, + }, + "aina": { + Fn: func(args ...object.Object) object.Object { + if len(args) != 1 { + return newError("Samahani, tunahitaji Hoja 1, wewe umeweka %d", len(args)) + } + + return &object.String{Value: string(args[0].Type())} + }, + }, + "fungua": { + Fn: func(args ...object.Object) object.Object { + + if len(args) > 2 { + return newError("Samahani, Hatuhitaji hoja zaidi ya 2, wewe umeweka %d", len(args)) + } + filename := args[0].(*object.String).Value + mode := os.O_RDONLY + if len(args) == 2 { + fileMode := args[1].(*object.String).Value + switch fileMode { + case "r": + mode = os.O_RDONLY + // still buggy, will work on this soon + // case "w": + // mode = os.O_WRONLY + // err := os.Remove(filename) + // if err != nil { + // return &object.Null{} + // } + // case "a": + // mode = os.O_APPEND + default: + return newError("Tumeshindwa kufungua file na mode %s", fileMode) + } + } + file, err := os.OpenFile(filename, os.O_CREATE|mode, 0644) + if err != nil { + return &object.Null{} + } + var reader *bufio.Reader + var writer *bufio.Writer + if mode == os.O_RDONLY { + reader = bufio.NewReader(file) + } else { + writer = bufio.NewWriter(file) + } + return &object.File{Filename: filename, Reader: reader, Writer: writer, Handle: file} + }, + }, +} diff --git a/src/evaluator/dict.go b/src/evaluator/dict.go new file mode 100644 index 0000000..05bbdcb --- /dev/null +++ b/src/evaluator/dict.go @@ -0,0 +1,32 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalDictLiteral(node *ast.DictLiteral, env *object.Environment) object.Object { + pairs := make(map[object.HashKey]object.DictPair) + + for keyNode, valueNode := range node.Pairs { + key := Eval(keyNode, env) + if isError(key) { + return key + } + + hashKey, ok := key.(object.Hashable) + if !ok { + return newError("Mstari %d: Hashing imeshindikana: %s", node.Token.Line, key.Type()) + } + + value := Eval(valueNode, env) + if isError(value) { + return value + } + + hashed := hashKey.HashKey() + pairs[hashed] = object.DictPair{Key: key, Value: value} + } + + return &object.Dict{Pairs: pairs} +} \ No newline at end of file diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go new file mode 100644 index 0000000..b7bb4a5 --- /dev/null +++ b/src/evaluator/evaluator.go @@ -0,0 +1,384 @@ +package evaluator + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +var ( + NULL = &object.Null{} + TRUE = &object.Boolean{Value: true} + FALSE = &object.Boolean{Value: false} + BREAK = &object.Break{} + CONTINUE = &object.Continue{} +) + +func Eval(node ast.Node, env *object.Environment) object.Object { + switch node := node.(type) { + case *ast.Program: + return evalProgram(node, env) + + case *ast.ExpressionStatement: + return Eval(node.Expression, env) + + case *ast.IntegerLiteral: + return &object.Integer{Value: node.Value} + + case *ast.FloatLiteral: + return &object.Float{Value: node.Value} + + case *ast.Boolean: + return nativeBoolToBooleanObject(node.Value) + + case *ast.PrefixExpression: + right := Eval(node.Right, env) + if isError(right) { + return right + } + return evalPrefixExpression(node.Operator, right, node.Token.Line) + + case *ast.InfixExpression: + left := Eval(node.Left, env) + if isError(left) { + return left + } + right := Eval(node.Right, env) + if isError(right) { + return right + } + return evalInfixExpression(node.Operator, left, right, node.Token.Line) + case *ast.PostfixExpression: + return evalPostfixExpression(env, node.Operator, node) + + case *ast.BlockStatement: + return evalBlockStatement(node, env) + + case *ast.IfExpression: + return evalIfExpression(node, env) + + case *ast.ReturnStatement: + val := Eval(node.ReturnValue, env) + if isError(val) { + return val + } + return &object.ReturnValue{Value: val} + + case *ast.LetStatement: + val := Eval(node.Value, env) + if isError(val) { + return val + } + + env.Set(node.Name.Value, val) + + case *ast.Identifier: + return evalIdentifier(node, env) + + case *ast.FunctionLiteral: + params := node.Parameters + body := node.Body + return &object.Function{Parameters: params, Env: env, Body: body} + + case *ast.MethodExpression: + return evalMethodExpression(node, env) + + case *ast.CallExpression: + function := Eval(node.Function, env) + if isError(function) { + return function + } + args := evalExpressions(node.Arguments, env) + if len(args) == 1 && isError(args[0]) { + return args[0] + } + return applyFunction(function, args, node.Token.Line) + case *ast.StringLiteral: + return &object.String{Value: node.Value} + + case *ast.ArrayLiteral: + elements := evalExpressions(node.Elements, env) + if len(elements) == 1 && isError(elements[0]) { + return elements[0] + } + return &object.Array{Elements: elements} + case *ast.IndexExpression: + left := Eval(node.Left, env) + if isError(left) { + return left + } + index := Eval(node.Index, env) + if isError(index) { + return index + } + return evalIndexExpression(left, index, node.Token.Line) + case *ast.DictLiteral: + return evalDictLiteral(node, env) + case *ast.WhileExpression: + return evalWhileExpression(node, env) + case *ast.Break: + return evalBreak(node) + case *ast.Continue: + return evalContinue(node) + case *ast.SwitchExpression: + return evalSwitchStatement(node, env) + case *ast.Null: + return NULL + // case *ast.For: + // return evalForExpression(node, env) + case *ast.ForIn: + return evalForInExpression(node, env, node.Token.Line) + case *ast.AssignmentExpression: + left := Eval(node.Left, env) + if isError(left) { + return left + } + + value := Eval(node.Value, env) + if isError(value) { + return value + } + + // This is an easy way to assign operators like +=, -= etc + // I'm surprised it work at the first try lol + // basically separate the += to + and =, take the + only and + // then perform the operation as normal + op := node.Token.Literal + if len(op) >= 2 { + op = op[:len(op)-1] + value = evalInfixExpression(op, left, value, node.Token.Line) + if isError(value) { + return value + } + } + + if ident, ok := node.Left.(*ast.Identifier); ok { + env.Set(ident.Value, value) + } else if ie, ok := node.Left.(*ast.IndexExpression); ok { + obj := Eval(ie.Left, env) + if isError(obj) { + return obj + } + + if array, ok := obj.(*object.Array); ok { + index := Eval(ie.Index, env) + if isError(index) { + return index + } + if idx, ok := index.(*object.Integer); ok { + if int(idx.Value) > len(array.Elements) { + return newError("Index imezidi idadi ya elements") + } + array.Elements[idx.Value] = value + } else { + return newError("Hauwezi kufanya opereshen hii na %#v", index) + } + } else if hash, ok := obj.(*object.Dict); ok { + key := Eval(ie.Index, env) + if isError(key) { + return key + } + if hashKey, ok := key.(object.Hashable); ok { + hashed := hashKey.HashKey() + hash.Pairs[hashed] = object.DictPair{Key: key, Value: value} + } else { + return newError("Hauwezi kufanya opereshen hii na %T", key) + } + } else { + return newError("%T haifanyi operation hii", obj) + } + } else { + return newError("Tumia neno kama variable, sio %T", left) + } + + } + + return nil +} + +func evalProgram(program *ast.Program, env *object.Environment) object.Object { + var result object.Object + + for _, statment := range program.Statements { + result = Eval(statment, env) + + switch result := result.(type) { + case *object.ReturnValue: + return result.Value + case *object.Error: + return result + } + } + + return result +} + +func nativeBoolToBooleanObject(input bool) *object.Boolean { + if input { + return TRUE + } + return FALSE +} + +func isTruthy(obj object.Object) bool { + switch obj { + case NULL: + return false + case TRUE: + return true + case FALSE: + return false + default: + return true + } +} + +func newError(format string, a ...interface{}) *object.Error { + format = fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, format) + return &object.Error{Message: fmt.Sprintf(format, a...)} +} + +func isError(obj object.Object) bool { + if obj != nil { + return obj.Type() == object.ERROR_OBJ + } + + return false +} + +func evalExpressions(exps []ast.Expression, env *object.Environment) []object.Object { + var result []object.Object + + for _, e := range exps { + evaluated := Eval(e, env) + if isError(evaluated) { + return []object.Object{evaluated} + } + + result = append(result, evaluated) + } + + return result +} + +func applyFunction(fn object.Object, args []object.Object, line int) object.Object { + switch fn := fn.(type) { + case *object.Function: + extendedEnv := extendedFunctionEnv(fn, args) + evaluated := Eval(fn.Body, extendedEnv) + return unwrapReturnValue(evaluated) + case *object.Builtin: + if result := fn.Fn(args...); result != nil { + return result + } + return NULL + default: + return newError("Mstari %d: Hii sio function: %s", line, fn.Type()) + } + +} + +func extendedFunctionEnv(fn *object.Function, args []object.Object) *object.Environment { + env := object.NewEnclosedEnvironment(fn.Env) + + for paramIdx, param := range fn.Parameters { + if paramIdx < len(args) { + env.Set(param.Value, args[paramIdx]) + } + } + return env +} + +func unwrapReturnValue(obj object.Object) object.Object { + if returnValue, ok := obj.(*object.ReturnValue); ok { + return returnValue.Value + } + + return obj +} + +func evalBreak(node *ast.Break) object.Object { + return BREAK +} + +func evalContinue(node *ast.Continue) object.Object { + return CONTINUE +} + +// func evalForExpression(fe *ast.For, env *object.Environment) object.Object { +// obj, ok := env.Get(fe.Identifier) +// defer func() { // stay safe and not reassign an existing variable +// if ok { +// env.Set(fe.Identifier, obj) +// } +// }() +// val := Eval(fe.StarterValue, env) +// if isError(val) { +// return val +// } + +// env.Set(fe.StarterName.Value, val) + +// // err := Eval(fe.Starter, env) +// // if isError(err) { +// // return err +// // } +// for { +// evaluated := Eval(fe.Condition, env) +// if isError(evaluated) { +// return evaluated +// } +// if !isTruthy(evaluated) { +// break +// } +// res := Eval(fe.Block, env) +// if isError(res) { +// return res +// } +// if res.Type() == object.BREAK_OBJ { +// break +// } +// if res.Type() == object.CONTINUE_OBJ { +// err := Eval(fe.Closer, env) +// if isError(err) { +// return err +// } +// continue +// } +// if res.Type() == object.RETURN_VALUE_OBJ { +// return res +// } +// err := Eval(fe.Closer, env) +// if isError(err) { +// return err +// } +// } +// return NULL +// } + +func loopIterable(next func() (object.Object, object.Object), env *object.Environment, fi *ast.ForIn) object.Object { + k, v := next() + for k != nil && v != nil { + env.Set(fi.Key, k) + env.Set(fi.Value, v) + res := Eval(fi.Block, env) + if isError(res) { + return res + } + if res != nil { + if res.Type() == object.BREAK_OBJ { + break + } + if res.Type() == object.CONTINUE_OBJ { + k, v = next() + continue + } + if res.Type() == object.RETURN_VALUE_OBJ { + return res + } + } + k, v = next() + } + return NULL +} diff --git a/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go similarity index 77% rename from evaluator/evaluator_test.go rename to src/evaluator/evaluator_test.go index e2d9771..4bd2201 100644 --- a/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -102,6 +102,22 @@ func testIntegerObject(t *testing.T, obj object.Object, expected int64) bool { return true } +func testFloatObject(t *testing.T, obj object.Object, expected float64) bool { + result, ok := obj.(*object.Float) + + if !ok { + t.Errorf("Object is not Float, got=%T(%+v)", obj, obj) + return false + } + + if result.Value != expected { + t.Errorf("object has wrong value. got=%f, want=%f", result.Value, expected) + return false + } + + return true +} + func testBooleanObject(t *testing.T, obj object.Object, expected bool) bool { result, ok := obj.(*object.Boolean) if !ok { @@ -174,27 +190,27 @@ func TestErrorHandling(t *testing.T) { }{ { "5 + kweli", - "Aina Hazilingani: NAMBA + BOOLEAN", + "Mstari 0: Aina Hazilingani: NAMBA + BOOLEAN", }, { "5 + kweli; 5;", - "Aina Hazilingani: NAMBA + BOOLEAN", + "Mstari 0: Aina Hazilingani: NAMBA + BOOLEAN", }, { "-kweli", - "Operesheni Haielweki: -BOOLEAN", + "Mstari 0: Operesheni Haielweki: -BOOLEAN", }, { "kweli + sikweli", - "Operesheni Haielweki: BOOLEAN + BOOLEAN", + "Mstari 0: Operesheni Haielweki: BOOLEAN + BOOLEAN", }, { "5; kweli + sikweli; 5", - "Operesheni Haielweki: BOOLEAN + BOOLEAN", + "Mstari 0: Operesheni Haielweki: BOOLEAN + BOOLEAN", }, { "kama (10 > 1) { kweli + sikweli;}", - "Operesheni Haielweki: BOOLEAN + BOOLEAN", + "Mstari 0: Operesheni Haielweki: BOOLEAN + BOOLEAN", }, { ` @@ -206,19 +222,19 @@ kama (10 > 1) { rudisha 1; } `, - "Operesheni Haielweki: BOOLEAN + BOOLEAN", + "Mstari 3: Operesheni Haielweki: BOOLEAN + BOOLEAN", }, { "bangi", - "Neno Halifahamiki: bangi", + "Mstari 0: Neno Halifahamiki: bangi", }, { `"Habari" - "Habari"`, - "Operesheni Haielweki: NENO - NENO", + "Mstari 0: Operesheni Haielweki: NENO - NENO", }, { - `{"jina": "Avi"}[fn(x) {x}];`, - "Samahani, FUNCTION haitumiki kama key", + `{"jina": "Avi"}[unda(x) {x}];`, + "Mstari 0: Samahani, UNDO (FUNCTION) haitumiki kama key", }, } @@ -232,7 +248,7 @@ kama (10 > 1) { } if errObj.Message != fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, tt.expectedMessage) { - t.Errorf("wrong error message, expected=%q, got=%q", tt.expectedMessage, errObj.Message) + t.Errorf("wrong error message, expected=%q, got=%q", fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, tt.expectedMessage), errObj.Message) } } } @@ -242,10 +258,10 @@ func TestLetStatement(t *testing.T) { input string expected int64 }{ - {"acha a = 5; a;", 5}, - {"acha a = 5 * 5; a;", 25}, - {"acha a = 5; acha b = a; b;", 5}, - {"acha a = 5; acha b = a; acha c = a + b + 5; c;", 15}, + {"fanya a = 5; a;", 5}, + {"fanya a = 5 * 5; a;", 25}, + {"fanya a = 5; fanya b = a; b;", 5}, + {"fanya a = 5; fanya b = a; fanya c = a + b + 5; c;", 15}, } for _, tt := range tests { @@ -254,26 +270,26 @@ func TestLetStatement(t *testing.T) { } func TestFunctionObject(t *testing.T) { - input := "fn(x) { x + 2 ;};" + input := "unda(x) { x + 2 ;};" evaluated := testEval(input) - fn, ok := evaluated.(*object.Function) + unda, ok := evaluated.(*object.Function) if !ok { t.Fatalf("object is not a Function, got=%T(%+v)", evaluated, evaluated) } - if len(fn.Parameters) != 1 { - t.Fatalf("function haas wrong paramters,Parameters=%+v", fn.Parameters) + if len(unda.Parameters) != 1 { + t.Fatalf("function haas wrong paramters,Parameters=%+v", unda.Parameters) } - if fn.Parameters[0].String() != "x" { - t.Fatalf("parameter is not x, got=%q", fn.Parameters[0]) + if unda.Parameters[0].String() != "x" { + t.Fatalf("parameter is not x, got=%q", unda.Parameters[0]) } expectedBody := "(x + 2)" - if fn.Body.String() != expectedBody { - t.Fatalf("body is not %q, got=%q", expectedBody, fn.Body.String()) + if unda.Body.String() != expectedBody { + t.Fatalf("body is not %q, got=%q", expectedBody, unda.Body.String()) } } @@ -282,12 +298,12 @@ func TestFunctionApplication(t *testing.T) { input string expected int64 }{ - {"acha mfano = fn(x) {x;}; mfano(5);", 5}, - {"acha mfano = fn(x) {rudisha x;}; mfano(5);", 5}, - {"acha double = fn(x) { x * 2;}; double(5);", 10}, - {"acha add = fn(x, y) {x + y;}; add(5,5);", 10}, - {"acha add = fn(x, y) {x + y;}; add(5 + 5, add(5, 5));", 20}, - {"fn(x) {x;}(5)", 5}, + {"fanya mfano = unda(x) {x;}; mfano(5);", 5}, + {"fanya mfano = unda(x) {rudisha x;}; mfano(5);", 5}, + {"fanya double = unda(x) { x * 2;}; double(5);", 10}, + {"fanya add = unda(x, y) {x + y;}; add(5,5);", 10}, + {"fanya add = unda(x, y) {x + y;}; add(5 + 5, add(5, 5));", 20}, + {"unda(x) {x;}(5)", 5}, } for _, tt := range tests { @@ -297,11 +313,11 @@ func TestFunctionApplication(t *testing.T) { func TestClosures(t *testing.T) { input := ` -acha newAdder = fn(x) { - fn(y) { x + y}; +fanya newAdder = unda(x) { + unda(y) { x + y}; }; -acha addTwo = newAdder(2); +fanya addTwo = newAdder(2); addTwo(2); ` testIntegerObject(t, testEval(input), 4) @@ -346,14 +362,24 @@ func TestBuiltinFunctions(t *testing.T) { {`idadi("hello world")`, 11}, {`idadi(1)`, "Samahani, hii function haitumiki na NAMBA"}, {`idadi("one", "two")`, "Hoja hazilingani, tunahitaji=1, tumepewa=2"}, + {`jumla()`, "Hoja hazilingani, tunahitaji=1, tumepewa=0"}, + {`jumla("")`, "Samahani, hii function haitumiki na NENO"}, + {`jumla(1)`, "Samahani, hii function haitumiki na NAMBA"}, + {`jumla([1,2,3])`, 6}, + {`jumla([1,2,3.4])`, 6.4}, + {`jumla([1.1,2.5,3.4])`, 7}, + {`jumla([1.1,2.5,"q"])`, "Samahani namba tu zinahitajika"}, } for _, tt := range tests { evaluated := testEval(tt.input) - + switch expected := tt.expected.(type) { case int: testIntegerObject(t, evaluated, int64(expected)) + case float64: + testFloatObject(t, evaluated, float64(expected)) + case string: errObj, ok := evaluated.(*object.Error) if !ok { @@ -403,11 +429,11 @@ func TestArrayIndexExpressions(t *testing.T) { 3, }, { - "acha i = 0; [1][i];", + "fanya i = 0; [1][i];", 1, }, { - "acha myArr = [1, 2, 3]; myArr[2];", + "fanya myArr = [1, 2, 3]; myArr[2];", 3, }, { @@ -432,7 +458,7 @@ func TestArrayIndexExpressions(t *testing.T) { } func TestDictLiterals(t *testing.T) { - input := `acha two = "two"; + input := `fanya two = "two"; { "one": 10 - 9, two: 1 +1, @@ -485,7 +511,7 @@ func TestDictIndexExpression(t *testing.T) { nil, }, { - `acha key = "foo"; {"foo": 5}[key]`, + `fanya key = "foo"; {"foo": 5}[key]`, 5, }, { diff --git a/src/evaluator/forin.go b/src/evaluator/forin.go new file mode 100644 index 0000000..28db0f5 --- /dev/null +++ b/src/evaluator/forin.go @@ -0,0 +1,29 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalForInExpression(fie *ast.ForIn, env *object.Environment, line int) object.Object { + iterable := Eval(fie.Iterable, env) + existingKeyIdentifier, okk := env.Get(fie.Key) // again, stay safe + existingValueIdentifier, okv := env.Get(fie.Value) + defer func() { // restore them later on + if okk { + env.Set(fie.Key, existingKeyIdentifier) + } + if okv { + env.Set(fie.Value, existingValueIdentifier) + } + }() + switch i := iterable.(type) { + case object.Iterable: + defer func() { + i.Reset() + }() + return loopIterable(i.Next, env, fie) + default: + return newError("Mstari %d: Huwezi kufanya operesheni hii na %s", line, i.Type()) + } +} \ No newline at end of file diff --git a/src/evaluator/identifier.go b/src/evaluator/identifier.go new file mode 100644 index 0000000..7745a23 --- /dev/null +++ b/src/evaluator/identifier.go @@ -0,0 +1,17 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalIdentifier(node *ast.Identifier, env *object.Environment) object.Object { + if val, ok := env.Get(node.Value); ok { + return val + } + if builtin, ok := builtins[node.Value]; ok { + return builtin + } + + return newError("Mstari %d: Neno Halifahamiki: %s", node.Token.Line, node.Value) +} \ No newline at end of file diff --git a/src/evaluator/if.go b/src/evaluator/if.go new file mode 100644 index 0000000..890f24f --- /dev/null +++ b/src/evaluator/if.go @@ -0,0 +1,22 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalIfExpression(ie *ast.IfExpression, env *object.Environment) object.Object { + condition := Eval(ie.Condition, env) + + if isError(condition) { + return condition + } + + if isTruthy(condition) { + return Eval(ie.Consequence, env) + } else if ie.Alternative != nil { + return Eval(ie.Alternative, env) + } else { + return NULL + } +} \ No newline at end of file diff --git a/src/evaluator/in.go b/src/evaluator/in.go new file mode 100644 index 0000000..446b35c --- /dev/null +++ b/src/evaluator/in.go @@ -0,0 +1,81 @@ +package evaluator + +import ( + "strings" + + "github.com/AvicennaJr/Nuru/object" +) + +func evalInExpression(left, right object.Object, line int) object.Object { + switch right.(type) { + case *object.String: + return evalInStringExpression(left, right) + case *object.Array: + return evalInArrayExpression(left, right) + case *object.Dict: + return evalInDictExpression(left, right, line) + default: + return FALSE + } +} + +func evalInStringExpression(left, right object.Object) object.Object { + if left.Type() != object.STRING_OBJ { + return FALSE + } + leftVal := left.(*object.String) + rightVal := right.(*object.String) + found := strings.Contains(rightVal.Value, leftVal.Value) + return nativeBoolToBooleanObject(found) +} + +func evalInDictExpression(left, right object.Object, line int) object.Object { + leftVal, ok := left.(object.Hashable) + if !ok { + return newError("Mstari %d: Huwezi kutumia kama 'key': %s", line, left.Type()) + } + key := leftVal.HashKey() + rightVal := right.(*object.Dict).Pairs + _, ok = rightVal[key] + return nativeBoolToBooleanObject(ok) +} + +func evalInArrayExpression(left, right object.Object) object.Object { + rightVal := right.(*object.Array) + switch leftVal := left.(type) { + case *object.Null: + for _, v := range rightVal.Elements { + if v.Type() == object.NULL_OBJ { + return TRUE + } + } + case *object.String: + for _, v := range rightVal.Elements { + if v.Type() == object.STRING_OBJ { + elem := v.(*object.String) + if elem.Value == leftVal.Value { + return TRUE + } + } + } + case *object.Integer: + for _, v := range rightVal.Elements { + if v.Type() == object.INTEGER_OBJ { + elem := v.(*object.Integer) + if elem.Value == leftVal.Value { + return TRUE + } + } + } + case *object.Float: + for _, v := range rightVal.Elements { + if v.Type() == object.FLOAT_OBJ { + elem := v.(*object.Float) + if elem.Value == leftVal.Value { + return TRUE + } + } + } + } + return FALSE +} diff --git a/src/evaluator/index.go b/src/evaluator/index.go new file mode 100644 index 0000000..07945f0 --- /dev/null +++ b/src/evaluator/index.go @@ -0,0 +1,44 @@ +package evaluator + +import "github.com/AvicennaJr/Nuru/object" + +func evalIndexExpression(left, index object.Object, line int) object.Object { + switch { + case left.Type() == object.ARRAY_OBJ && index.Type() == object.INTEGER_OBJ: + return evalArrayIndexExpression(left, index) + case left.Type() == object.ARRAY_OBJ && index.Type() != object.INTEGER_OBJ: + return newError("Mstari %d: Tafadhali tumia number, sio: %s", line, index.Type()) + case left.Type() == object.DICT_OBJ: + return evalDictIndexExpression(left, index, line) + default: + return newError("Mstari %d: Operesheni hii haiwezekani kwa: %s", line, left.Type()) + } +} + +func evalArrayIndexExpression(array, index object.Object) object.Object { + arrayObject := array.(*object.Array) + idx := index.(*object.Integer).Value + max := int64(len(arrayObject.Elements) - 1) + + if idx < 0 || idx > max { + return NULL + } + + return arrayObject.Elements[idx] +} + +func evalDictIndexExpression(dict, index object.Object, line int) object.Object { + dictObject := dict.(*object.Dict) + + key, ok := index.(object.Hashable) + if !ok { + return newError("Mstari %d: Samahani, %s haitumiki kama key", line, index.Type()) + } + + pair, ok := dictObject.Pairs[key.HashKey()] + if !ok { + return NULL + } + + return pair.Value +} \ No newline at end of file diff --git a/src/evaluator/infix.go b/src/evaluator/infix.go new file mode 100644 index 0000000..c20706a --- /dev/null +++ b/src/evaluator/infix.go @@ -0,0 +1,246 @@ +package evaluator + +import ( + "math" + "strings" + + "github.com/AvicennaJr/Nuru/object" +) + +func evalInfixExpression(operator string, left, right object.Object, line int) object.Object { + if left == nil { + return newError("Mstari %d: Umekosea hapa", line) + } + switch { + + case operator == "ktk": + return evalInExpression(left, right, line) + + case left.Type() == object.STRING_OBJ && right.Type() == object.STRING_OBJ: + return evalStringInfixExpression(operator, left, right, line) + + case operator == "+" && left.Type() == object.DICT_OBJ && right.Type() == object.DICT_OBJ: + leftVal := left.(*object.Dict).Pairs + rightVal := right.(*object.Dict).Pairs + pairs := make(map[object.HashKey]object.DictPair) + for k, v := range leftVal { + pairs[k] = v + } + for k, v := range rightVal { + pairs[k] = v + } + return &object.Dict{Pairs: pairs} + + case operator == "+" && left.Type() == object.ARRAY_OBJ && right.Type() == object.ARRAY_OBJ: + leftVal := left.(*object.Array).Elements + rightVal := right.(*object.Array).Elements + elements := append(leftVal, rightVal...) + return &object.Array{Elements: elements} + + case operator == "*" && left.Type() == object.ARRAY_OBJ && right.Type() == object.INTEGER_OBJ: + leftVal := left.(*object.Array).Elements + rightVal := int(right.(*object.Integer).Value) + elements := leftVal + for i := rightVal; i > 1; i-- { + elements = append(elements, leftVal...) + } + return &object.Array{Elements: elements} + + case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.ARRAY_OBJ: + leftVal := int(left.(*object.Integer).Value) + rightVal := right.(*object.Array).Elements + elements := rightVal + for i := leftVal; i > 1; i-- { + elements = append(elements, rightVal...) + } + return &object.Array{Elements: elements} + + case operator == "*" && left.Type() == object.STRING_OBJ && right.Type() == object.INTEGER_OBJ: + leftVal := left.(*object.String).Value + rightVal := right.(*object.Integer).Value + return &object.String{Value: strings.Repeat(leftVal, int(rightVal))} + + case operator == "*" && left.Type() == object.INTEGER_OBJ && right.Type() == object.STRING_OBJ: + leftVal := left.(*object.Integer).Value + rightVal := right.(*object.String).Value + return &object.String{Value: strings.Repeat(rightVal, int(leftVal))} + + case left.Type() == object.INTEGER_OBJ && right.Type() == object.INTEGER_OBJ: + return evalIntegerInfixExpression(operator, left, right, line) + + case left.Type() == object.FLOAT_OBJ && right.Type() == object.FLOAT_OBJ: + return evalFloatInfixExpression(operator, left, right, line) + + case left.Type() == object.INTEGER_OBJ && right.Type() == object.FLOAT_OBJ: + return evalFloatIntegerInfixExpression(operator, left, right, line) + + case left.Type() == object.FLOAT_OBJ && right.Type() == object.INTEGER_OBJ: + return evalFloatIntegerInfixExpression(operator, left, right, line) + + case operator == "==": + return nativeBoolToBooleanObject(left == right) + + case operator == "!=": + return nativeBoolToBooleanObject(left != right) + case left.Type() == object.BOOLEAN_OBJ && right.Type() == object.BOOLEAN_OBJ: + return evalBooleanInfixExpression(operator, left, right, line) + + case left.Type() != right.Type(): + return newError("Mstari %d: Aina Hazilingani: %s %s %s", + line, left.Type(), operator, right.Type()) + + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", + line, left.Type(), operator, right.Type()) + } +} + +func evalFloatIntegerInfixExpression(operator string, left, right object.Object, line int) object.Object { + var leftVal, rightVal float64 + if left.Type() == object.FLOAT_OBJ { + leftVal = left.(*object.Float).Value + rightVal = float64(right.(*object.Integer).Value) + } else { + leftVal = float64(left.(*object.Integer).Value) + rightVal = right.(*object.Float).Value + } + + var val float64 + switch operator { + case "+": + val = leftVal + rightVal + case "-": + val = leftVal - rightVal + case "*": + val = leftVal * rightVal + case "**": + val = math.Pow(float64(leftVal), float64(rightVal)) + case "/": + val = leftVal / rightVal + case "<": + return nativeBoolToBooleanObject(leftVal < rightVal) + case "<=": + return nativeBoolToBooleanObject(leftVal <= rightVal) + case ">": + return nativeBoolToBooleanObject(leftVal > rightVal) + case ">=": + return nativeBoolToBooleanObject(leftVal >= rightVal) + case "==": + return nativeBoolToBooleanObject(leftVal == rightVal) + case "!=": + return nativeBoolToBooleanObject(leftVal != rightVal) + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", + line, left.Type(), operator, right.Type()) + } + + if math.Mod(val, 1) == 0 { + return &object.Integer{Value: int64(val)} + } else { + return &object.Float{Value: val} + } +} + +func evalStringInfixExpression(operator string, left, right object.Object, line int) object.Object { + + leftVal := left.(*object.String).Value + rightVal := right.(*object.String).Value + + switch operator { + case "+": + return &object.String{Value: leftVal + rightVal} + case "==": + return nativeBoolToBooleanObject(leftVal == rightVal) + case "!=": + return nativeBoolToBooleanObject(leftVal != rightVal) + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", line, left.Type(), operator, right.Type()) + } +} + +func evalBooleanInfixExpression(operator string, left, right object.Object, line int) object.Object { + leftVal := left.(*object.Boolean).Value + rightVal := right.(*object.Boolean).Value + + switch operator { + case "&&": + return nativeBoolToBooleanObject(leftVal && rightVal) + case "||": + return nativeBoolToBooleanObject(leftVal || rightVal) + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", line, left.Type(), operator, right.Type()) + } +} + +func evalFloatInfixExpression(operator string, left, right object.Object, line int) object.Object { + leftVal := left.(*object.Float).Value + rightVal := right.(*object.Float).Value + + switch operator { + case "+": + return &object.Float{Value: leftVal + rightVal} + case "-": + return &object.Float{Value: leftVal - rightVal} + case "*": + return &object.Float{Value: leftVal * rightVal} + case "**": + return &object.Float{Value: math.Pow(float64(leftVal), float64(rightVal))} + case "/": + return &object.Float{Value: leftVal / rightVal} + case "<": + return nativeBoolToBooleanObject(leftVal < rightVal) + case "<=": + return nativeBoolToBooleanObject(leftVal <= rightVal) + case ">": + return nativeBoolToBooleanObject(leftVal > rightVal) + case ">=": + return nativeBoolToBooleanObject(leftVal >= rightVal) + case "==": + return nativeBoolToBooleanObject(leftVal == rightVal) + case "!=": + return nativeBoolToBooleanObject(leftVal != rightVal) + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", + line, left.Type(), operator, right.Type()) + } +} + +func evalIntegerInfixExpression(operator string, left, right object.Object, line int) object.Object { + leftVal := left.(*object.Integer).Value + rightVal := right.(*object.Integer).Value + + switch operator { + case "+": + return &object.Integer{Value: leftVal + rightVal} + case "-": + return &object.Integer{Value: leftVal - rightVal} + case "*": + return &object.Integer{Value: leftVal * rightVal} + case "**": + return &object.Integer{Value: int64(math.Pow(float64(leftVal), float64(rightVal)))} + case "/": + x := float64(leftVal) / float64(rightVal) + if math.Mod(x, 1) == 0 { + return &object.Integer{Value: int64(x)} + } else { + return &object.Float{Value: x} + } + case "%": + return &object.Integer{Value: leftVal % rightVal} + case "<": + return nativeBoolToBooleanObject(leftVal < rightVal) + case "<=": + return nativeBoolToBooleanObject(leftVal <= rightVal) + case ">": + return nativeBoolToBooleanObject(leftVal > rightVal) + case ">=": + return nativeBoolToBooleanObject(leftVal >= rightVal) + case "==": + return nativeBoolToBooleanObject(leftVal == rightVal) + case "!=": + return nativeBoolToBooleanObject(leftVal != rightVal) + default: + return newError("Mstari %d: Operesheni Haielweki: %s %s %s", + line, left.Type(), operator, right.Type()) + } +} diff --git a/src/evaluator/method.go b/src/evaluator/method.go new file mode 100644 index 0000000..884ca85 --- /dev/null +++ b/src/evaluator/method.go @@ -0,0 +1,28 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalMethodExpression(node *ast.MethodExpression, env *object.Environment) object.Object { + obj := Eval(node.Object, env) + if isError(obj) { + return obj + } + args := evalExpressions(node.Arguments, env) + if len(args) == 1 && isError(args[0]) { + return args[0] + } + return applyMethod(obj, node.Method, args) +} + +func applyMethod(obj object.Object, method ast.Expression, args []object.Object) object.Object { + switch obj := obj.(type) { + case *object.String: + return obj.Method(method.(*ast.Identifier).Value, args) + case *object.File: + return obj.Method(method.(*ast.Identifier).Value, args) + } + return newError("Samahani, %s haina function '%s()'", obj.Inspect(), method.(*ast.Identifier).Value) +} diff --git a/src/evaluator/postfix.go b/src/evaluator/postfix.go new file mode 100644 index 0000000..ea90a88 --- /dev/null +++ b/src/evaluator/postfix.go @@ -0,0 +1,40 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalPostfixExpression(env *object.Environment, operator string, node *ast.PostfixExpression) object.Object { + val, ok := env.Get(node.Token.Literal) + if !ok { + return newError("Tumia KITAMBULISHI CHA NAMBA AU DESIMALI, sio %s", node.Token.Type) + } + switch operator { + case "++": + switch arg := val.(type) { + case *object.Integer: + v := arg.Value + 1 + return env.Set(node.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := arg.Value + 1 + return env.Set(node.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: %s sio kitambulishi cha namba. Tumia '++' na kitambulishi cha namba au desimali.\nMfano:\tfanya i = 2; i++", node.Token.Line, node.Token.Literal) + + } + case "--": + switch arg := val.(type) { + case *object.Integer: + v := arg.Value - 1 + return env.Set(node.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := arg.Value - 1 + return env.Set(node.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: %s sio kitambulishi cha namba. Tumia '--' na kitambulishi cha namba au desimali.\nMfano:\tfanya i = 2; i++", node.Token.Line, node.Token.Literal) + } + default: + return newError("Haifahamiki: %s", operator) + } +} \ No newline at end of file diff --git a/src/evaluator/prefix.go b/src/evaluator/prefix.go new file mode 100644 index 0000000..cec053b --- /dev/null +++ b/src/evaluator/prefix.go @@ -0,0 +1,43 @@ +package evaluator + +import "github.com/AvicennaJr/Nuru/object" + +func evalMinusPrefixOperatorExpression(right object.Object, line int) object.Object { + switch obj := right.(type) { + + case *object.Integer: + return &object.Integer{Value: -obj.Value} + + case *object.Float: + return &object.Float{Value: -obj.Value} + + default: + return newError("Mstari %d: Operesheni Haielweki: -%s", line, right.Type()) + } +} +func evalPlusPrefixOperatorExpression(right object.Object, line int) object.Object { + switch obj := right.(type) { + + case *object.Integer: + return &object.Integer{Value: obj.Value} + + case *object.Float: + return &object.Float{Value: obj.Value} + + default: + return newError("Mstari %d: Operesheni Haielweki: -%s", line, right.Type()) + } +} + +func evalPrefixExpression(operator string, right object.Object, line int) object.Object { + switch operator { + case "!": + return evalBangOperatorExpression(right) + case "-": + return evalMinusPrefixOperatorExpression(right, line) + case "+": + return evalPlusPrefixOperatorExpression(right, line) + default: + return newError("Mstari %d: Operesheni haieleweki: %s%s", line, operator, right.Type()) + } +} diff --git a/src/evaluator/switch.go b/src/evaluator/switch.go new file mode 100644 index 0000000..53fe6f4 --- /dev/null +++ b/src/evaluator/switch.go @@ -0,0 +1,30 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalSwitchStatement(se *ast.SwitchExpression, env *object.Environment) object.Object { + obj := Eval(se.Value, env) + for _, opt := range se.Choices { + + if opt.Default { + continue + } + for _, val := range opt.Expr { + out := Eval(val, env) + if obj.Type() == out.Type() && obj.Inspect() == out.Inspect() { + blockOut := evalBlockStatement(opt.Block, env) + return blockOut + } + } + } + for _, opt := range se.Choices { + if opt.Default { + out := evalBlockStatement(opt.Block, env) + return out + } + } + return nil +} \ No newline at end of file diff --git a/src/evaluator/while.go b/src/evaluator/while.go new file mode 100644 index 0000000..bf40681 --- /dev/null +++ b/src/evaluator/while.go @@ -0,0 +1,24 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalWhileExpression(we *ast.WhileExpression, env *object.Environment) object.Object { + condition := Eval(we.Condition, env) + if isError(condition) { + return condition + } + if isTruthy(condition) { + evaluated := Eval(we.Consequence, env) + if isError(evaluated) { + return evaluated + } + if evaluated != nil && evaluated.Type() == object.BREAK_OBJ { + return evaluated + } + evalWhileExpression(we, env) + } + return NULL +} \ No newline at end of file diff --git a/examples/example.nr b/src/examples/example.nr similarity index 78% rename from examples/example.nr rename to src/examples/example.nr index f8f2c79..7ebacef 100644 --- a/examples/example.nr +++ b/src/examples/example.nr @@ -1,8 +1,8 @@ andika("Testing basic types..."); andika(2 + 2); andika(4 * 4); -acha a = 10; -acha b = 20; +fanya a = 10; +fanya b = 20; andika(a + b); @@ -15,23 +15,23 @@ andika("Mambo vipi"); andika("Testing Functions... "); -acha jumlisha = fn(x, y) {x + y}; +fanya jumlisha = unda(x, y) {x + y}; andika(jumlisha(20,30)); andika(jumlisha(100,1000)); -acha zidisha = fn(x, y) {x * y}; +fanya zidisha = unda(x, y) {x * y}; andika(zidisha(100,1000)); andika(zidisha(200, 20)); // lists can hold any value andika("Testing lists..."); -acha list = [1, "a", kweli, sikweli]; +fanya list = [1, "a", kweli, sikweli]; // a few builtins -acha list = sukuma(list, jumlisha(4,5)); +fanya list = sukuma(list, jumlisha(4,5)); andika(list); andika(list[2]); @@ -57,7 +57,7 @@ kama (idadi("Habari") == 6) { // fibonacci example andika("Testing fibonacci..."); -acha fibo = fn(x) { +fanya fibo = unda(x) { kama (x == 0) { rudisha 0; } au kama (x == 1) { @@ -72,8 +72,8 @@ andika(fibo(10)); // testing input andika("Testing input from user..."); -acha salamu = fn() { - acha jina = jaza("Unaitwa nani rafiki? "); +fanya salamu = unda() { + fanya jina = jaza("Unaitwa nani rafiki? "); rudisha "Mambo vipi " + jina; } @@ -87,7 +87,7 @@ Multiline comment andika("Testing dictionaries...") -acha watu = [{"jina": "Mojo", "kabila": "Mnyakusa"}, {"jina": "Avi", "kabila": "Mwarabu wa dubai"}] +fanya watu = [{"jina": "Mojo", "kabila": "Mnyakusa"}, {"jina": "Avi", "kabila": "Mwarabu wa dubai"}] andika(watu, watu[0], watu[0]["jina"], watu[0]["kabila"]) @@ -99,7 +99,7 @@ andika({"a":1} + {"b": 2}) andika("Testing while loop..."); -acha i = 10; +fanya i = 10; wakati (i > 0) { andika(i); diff --git a/src/examples/sorting_algorithm.nr b/src/examples/sorting_algorithm.nr new file mode 100644 index 0000000..10d6131 --- /dev/null +++ b/src/examples/sorting_algorithm.nr @@ -0,0 +1,63 @@ +/* +############ Sorting Algorithm ############## + + By @VictorKariuki + + https://github.com/VictorKariuki + +############################################# +*/ + +fanya slice = unda(arr,start, end) { + fanya result = [] + wakati (start < end) { + result = result + [arr[start]] + start = start + 1 + } + rudisha result +} + +fanya merge = unda(left, right) { + fanya result = [] + fanya lLen = idadi(left) + fanya rLen = idadi(right) + fanya l = 0 + fanya r = 0 + wakati (l < lLen && r < rLen) { + kama (left[l] < right[r]) { + result = result + [left[l]] + l = l + 1 + } sivyo { + result = result + [right[r]] + r = r + 1 + } + } + andika(result) +} + + +fanya mergeSort = unda(arr){ + fanya len = idadi(arr) + andika("arr is ", arr," of length ", len) + kama (len < 2) { + rudisha arr + } + andika("len is greater than or == to 2", len > 1) + + fanya mid = (len / 2) + andika("arr has a mid point of ", mid) + + fanya left = slice(arr, 0, mid) + fanya right = slice(arr, mid, len) + andika("left slice is ", left) + andika("right slice is ", right) + fanya sortedLeft = mergeSort(left) + fanya sortedRight = mergeSort(right) + andika("sortedLeft is ", sortedLeft) + andika("sortedRight is ", sortedRight) + rudisha merge(sortedLeft, sortedRight) +} + +fanya arr = [6, 5, 3, 1, 8, 7, 2, 4] +fanya sortedArray = mergeSort(arr) +andika(sortedArray) \ No newline at end of file diff --git a/src/examples/sudoku_solver.nr b/src/examples/sudoku_solver.nr new file mode 100644 index 0000000..de5d3a6 --- /dev/null +++ b/src/examples/sudoku_solver.nr @@ -0,0 +1,101 @@ +/*########### Backtracking Algorithm ############## + + By @VictorKariuki + + https://github.com/VictorKariuki + +NURU program to solve Sudoku using Backtracking Algorithm + +The sudoku puzzle is represented as a 2D array. The empty +cells are represented by 0. The algorithm works by trying +out all possible numbers for an empty cell. If the number +is valid, it is placed in the cell. If the number is invalid, +the algorithm backtracks to the previous cell and tries +another number. The algorithm terminates when all cells +are filled. The algorithm is implemented in the solveSudoku +function. The isValid function checks kama a number is +valid in a given cell. The printSudoku function prints +the sudoku puzzle. The solveSudoku function solves the +sudoku puzzle. The main function initializes the sudoku +puzzle and calls the solveSudoku function. + +#################################################*/ + + +fanya printing = unda(sudoku) { + fanya row = 0 + wakati (row < 9){ + andika(sudoku[row]) + row++ + } +} + +fanya sudoku = [[3, 0, 6, 5, 0, 8, 4, 0, 0],[5, 2, 0, 0, 0, 0, 0, 0, 0],[0, 8, 7, 0, 0, 0, 0, 3, 1],[0, 0, 3, 0, 1, 0, 0, 8, 0],[9, 0, 0, 8, 6, 3, 0, 0, 5],[0, 5, 0, 0, 9, 0, 6, 0, 0],[1, 3, 0, 0, 0, 0, 2, 5, 0],[0, 0, 0, 0, 0, 0, 0, 7, 4],[0, 0, 5, 2, 0, 6, 3, 0, 0]] + + + +fanya isSafe = unda(grid, row, col, num) { + kwa x ktk [0,1,2,3,4,5,6,7,8] { + kama (grid[row][x] == num) { + rudisha sikweli + } + } + + kwa x ktk [0,1,2,3,4,5,6,7,8] { + kama (grid[x][col] == num) { + rudisha sikweli + } + } + + fanya startRow = row - row % 3 + fanya startCol = col - col % 3 + + kwa i ktk [0, 1, 2] { + kwa j ktk [0, 1, 2] { + kama (grid[i + startRow][j + startCol] == num) { + rudisha sikweli + } + } + } + + rudisha kweli +} + +fanya solveSudoku = unda(grid, row, col) { + kama (row == 8 && col == 9) { + rudisha kweli + } + + kama (col == 9) { + row += 1 + col = 0 + } + + kama (grid[row][col] > 0) { + rudisha solveSudoku(grid, row, col + 1) + } + + kwa num ktk [1,2,3,4,5,6,7,8,9] { + kama (isSafe(grid, row, col, num)) { + grid[row][col] = num + kama (solveSudoku(grid, row, col + 1)) { + rudisha kweli + } + } + + grid[row][col] = 0 + } + + rudisha sikweli +} +andika() +andika("----- PUZZLE TO SOLVE -----") +printing(sudoku) +kama (solveSudoku(sudoku, 0, 0)){ + andika() + andika("--------- SOLUTION --------") + printing(sudoku) + andika() +} sivyo { + andika("imeshindikana") +} \ No newline at end of file diff --git a/go.mod b/src/go.mod similarity index 100% rename from go.mod rename to src/go.mod diff --git a/src/lexer/lexer.go b/src/lexer/lexer.go new file mode 100644 index 0000000..02b07db --- /dev/null +++ b/src/lexer/lexer.go @@ -0,0 +1,329 @@ +package lexer + +import ( + "github.com/AvicennaJr/Nuru/token" +) + +type Lexer struct { + input string + position int + readPosition int + ch byte + line int +} + +func New(input string) *Lexer { + l := &Lexer{input: input} + l.readChar() + return l +} + +func (l *Lexer) readChar() { + if l.readPosition >= len(l.input) { + l.ch = 0 + } else { + l.ch = l.input[l.readPosition] + } + + l.position = l.readPosition + l.readPosition += 1 +} + +func (l *Lexer) NextToken() token.Token { + var tok token.Token + l.skipWhitespace() + if l.ch == '/' && l.peekChar() == '/' { + l.skipSingleLineComment() + return l.NextToken() + } + if l.ch == '/' && l.peekChar() == '*' { + l.skipMultiLineComment() + return l.NextToken() + } + + switch l.ch { + case '=': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.EQ, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.ASSIGN, l.line, l.ch) + } + case ';': + tok = newToken(token.SEMICOLON, l.line, l.ch) + case '(': + tok = newToken(token.LPAREN, l.line, l.ch) + case ')': + tok = newToken(token.RPAREN, l.line, l.ch) + case '{': + tok = newToken(token.LBRACE, l.line, l.ch) + case '}': + tok = newToken(token.RBRACE, l.line, l.ch) + case ',': + tok = newToken(token.COMMA, l.line, l.ch) + case '+': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.PLUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} + } else if l.peekChar() == '+' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.PLUS_PLUS, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.PLUS, l.line, l.ch) + } + case '-': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.MINUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} + } else if l.peekChar() == '-' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.MINUS_MINUS, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.MINUS, l.line, l.ch) + } + case '!': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.NOT_EQ, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.BANG, l.line, l.ch) + } + case '/': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.SLASH_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} + } else { + tok = newToken(token.SLASH, l.line, l.ch) + } + case '*': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.ASTERISK_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} + } else if l.peekChar() == '*' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.POW, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.ASTERISK, l.line, l.ch) + } + case '<': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.LTE, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.LT, l.line, l.ch) + } + case '>': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.GTE, Literal: string(ch) + string(l.ch), Line: l.line} + } else { + tok = newToken(token.GT, l.line, l.ch) + } + case '"': + tok.Type = token.STRING + tok.Literal = l.readString() + tok.Line = l.line + case '\'': + tok = token.Token{Type: token.STRING, Literal: l.readSingleQuoteString(), Line: l.line} + case '[': + tok = newToken(token.LBRACKET, l.line, l.ch) + case ']': + tok = newToken(token.RBRACKET, l.line, l.ch) + case ':': + tok = newToken(token.COLON, l.line, l.ch) + case '.': + tok = newToken(token.DOT, l.line, l.ch) + case '&': + if l.peekChar() == '&' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.AND, Literal: string(ch) + string(l.ch), Line: l.line} + } + case '|': + if l.peekChar() == '|' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.OR, Literal: string(ch) + string(l.ch), Line: l.line} + } + case '%': + if l.peekChar() == '=' { + ch := l.ch + l.readChar() + tok = token.Token{Type: token.MODULUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} + } else { + tok = newToken(token.MODULUS, l.line, l.ch) + } + case 0: + tok.Literal = "" + tok.Type = token.EOF + tok.Line = l.line + default: + if isLetter(l.ch) { + tok.Literal = l.readIdentifier() + tok.Type = token.LookupIdent(tok.Literal) + tok.Line = l.line + return tok + } else if isDigit(l.ch) { + tok = l.readDecimal() + return tok + } else { + tok = newToken(token.ILLEGAL, l.line, l.ch) + } + } + + l.readChar() + return tok +} + +func newToken(tokenType token.TokenType, line int, ch byte) token.Token { + return token.Token{Type: tokenType, Literal: string(ch), Line: line} +} + +func (l *Lexer) readIdentifier() string { + position := l.position + + for isLetter(l.ch) || isDigit(l.ch) { + l.readChar() + } + return l.input[position:l.position] +} + +func isLetter(ch byte) bool { + return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' +} + +func (l *Lexer) skipWhitespace() { + for l.ch == ' ' || l.ch == '\t' || l.ch == '\n' || l.ch == '\r' { + if l.ch == '\n' { + l.line++ + } + l.readChar() + } +} + +func isDigit(ch byte) bool { + return '0' <= ch && ch <= '9' +} + +func (l *Lexer) readNumber() string { + position := l.position + for isDigit(l.ch) { + l.readChar() + } + return l.input[position:l.position] +} + +func (l *Lexer) readDecimal() token.Token { + integer := l.readNumber() + if l.ch == '.' && isDigit(l.peekChar()) { + l.readChar() + fraction := l.readNumber() + return token.Token{Type: token.FLOAT, Literal: integer + "." + fraction, Line: l.line} + } + return token.Token{Type: token.INT, Literal: integer, Line: l.line} +} + +func (l *Lexer) peekChar() byte { + if l.readPosition >= len(l.input) { + return 0 + } else { + return l.input[l.readPosition] + } +} + +func (l *Lexer) skipSingleLineComment() { + for l.ch != '\n' && l.ch != 0 { + l.readChar() + } + l.skipWhitespace() +} + +func (l *Lexer) skipMultiLineComment() { + endFound := false + + for !endFound { + if l.ch == 0 { + endFound = true + } + + if l.ch == '*' && l.peekChar() == '/' { + endFound = true + l.readChar() + } + + l.readChar() + l.skipWhitespace() + } + +} + +func (l *Lexer) readString() string { + var str string + for { + l.readChar() + if l.ch == '"' || l.ch == 0 { + break + } else if l.ch == '\\' { + switch l.peekChar() { + case 'n': + l.readChar() + l.ch = '\n' + case 'r': + l.readChar() + l.ch = '\r' + case 't': + l.readChar() + l.ch = '\t' + case '"': + l.readChar() + l.ch = '"' + case '\\': + l.readChar() + l.ch = '\\' + } + } + str += string(l.ch) + } + return str +} + +func (l *Lexer) readSingleQuoteString() string { + var str string + for { + l.readChar() + if l.ch == '\'' || l.ch == 0 { + break + } else if l.ch == '\\' { + switch l.peekChar() { + case 'n': + l.readChar() + l.ch = '\n' + case 'r': + l.readChar() + l.ch = '\r' + case 't': + l.readChar() + l.ch = '\t' + case '"': + l.readChar() + l.ch = '"' + case '\\': + l.readChar() + l.ch = '\\' + } + } + str += string(l.ch) + } + return str +} diff --git a/lexer/lexer_test.go b/src/lexer/lexer_test.go similarity index 91% rename from lexer/lexer_test.go rename to src/lexer/lexer_test.go index ccf358e..bc11d38 100644 --- a/lexer/lexer_test.go +++ b/src/lexer/lexer_test.go @@ -9,14 +9,14 @@ import ( func TestNextToken(t *testing.T) { input := ` // Testing kama lex luther iko sawa - acha tano = 5; - acha kumi = 10; + fanya tano = 5; + fanya kumi = 10; - acha jumla = fn(x, y){ + fanya jumla = unda(x, y){ x + y; }; - acha jibu = jumla(tano, kumi); + fanya jibu = jumla(tano, kumi); !-/5; 5 < 10 > 5; @@ -40,26 +40,27 @@ func TestNextToken(t *testing.T) { "bangi" "ba ngi" [1, 2]; - {"mambo": "vipi"}` + {"mambo": "vipi"} + . // test dot` tests := []struct { expectedType token.TokenType expectedLiteral string }{ - {token.LET, "acha"}, + {token.LET, "fanya"}, {token.IDENT, "tano"}, {token.ASSIGN, "="}, {token.INT, "5"}, {token.SEMICOLON, ";"}, - {token.LET, "acha"}, + {token.LET, "fanya"}, {token.IDENT, "kumi"}, {token.ASSIGN, "="}, {token.INT, "10"}, {token.SEMICOLON, ";"}, - {token.LET, "acha"}, + {token.LET, "fanya"}, {token.IDENT, "jumla"}, {token.ASSIGN, "="}, - {token.FUNCTION, "fn"}, + {token.FUNCTION, "unda"}, {token.LPAREN, "("}, {token.IDENT, "x"}, {token.COMMA, ","}, @@ -72,7 +73,7 @@ func TestNextToken(t *testing.T) { {token.SEMICOLON, ";"}, {token.RBRACE, "}"}, {token.SEMICOLON, ";"}, - {token.LET, "acha"}, + {token.LET, "fanya"}, {token.IDENT, "jibu"}, {token.ASSIGN, "="}, {token.IDENT, "jumla"}, @@ -132,6 +133,7 @@ func TestNextToken(t *testing.T) { {token.COLON, ":"}, {token.STRING, "vipi"}, {token.RBRACE, "}"}, + {token.DOT, "."}, {token.EOF, ""}, } diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..4a6941a --- /dev/null +++ b/src/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/AvicennaJr/Nuru/repl" +) + +const ( + LOGO = ` + +█░░ █░█ █▀▀ █░█ ▄▀█   █▄█ ▄▀█   █▄░█ █░█ █▀█ █░█ +█▄▄ █▄█ █▄█ █▀█ █▀█   ░█░ █▀█   █░▀█ █▄█ █▀▄ █▄█ + + | Authored by Avicenna | v0.2.0 | +` +) + +func main() { + + args := os.Args + coloredLogo := fmt.Sprintf("\x1b[%dm%s\x1b[0m", 36, LOGO) + + if len(args) < 2 { + + fmt.Println(coloredLogo) + fmt.Println("𝑯𝒂𝒃𝒂𝒓𝒊, 𝒌𝒂𝒓𝒊𝒃𝒖 𝒖𝒕𝒖𝒎𝒊𝒆 𝒍𝒖𝒈𝒉𝒂 𝒚𝒂 𝑵𝒖𝒓𝒖 ✨") + fmt.Println("\nTumia exit() au toka() kuondoka") + + repl.Start(os.Stdin, os.Stdout) + } + + if len(args) == 2 { + + switch args[1] { + case "msaada", "-msaada", "--msaada", "help", "-help", "--help", "-h": + fmt.Printf("\x1b[%dm%s\x1b[0m\n", 32, "\nTumia 'nuru' kuanza program\n\nAU\n\nTumia 'nuru' ikifuatiwa na jina la file.\n\n\tMfano:\tnuru fileYangu.nr") + os.Exit(0) + case "version", "-version", "--version", "-v", "v": + fmt.Println(coloredLogo) + os.Exit(0) + } + + file := args[1] + + if strings.HasSuffix(file, "nr") || strings.HasSuffix(file, ".sw") { + contents, err := ioutil.ReadFile(file) + if err != nil { + fmt.Printf("\x1b[%dm%s%s\x1b[0m\n", 31, "Error: Nimeshindwa kusoma file: ", args[0]) + os.Exit(0) + } + + repl.Read(string(contents)) + } else { + fmt.Printf("\x1b[%dm%s%s\x1b[0m", 31, file, " sii file sahihi. Tumia file la '.nr' au '.sw'\n") + os.Exit(0) + } + + } else { + fmt.Printf("\x1b[%dm%s\x1b[0m\n", 31, "Error: Operesheni imeshindikana boss.") + fmt.Printf("\x1b[%dm%s\x1b[0m\n", 32, "\nTumia 'nuru' kuprogram\n\nAU\n\nTumia 'nuru' ikifuatiwa na jina la file.\n\n\tMfano:\tnuru fileYangu.nr") + os.Exit(0) + } +} diff --git a/src/object/array.go b/src/object/array.go new file mode 100644 index 0000000..027f63f --- /dev/null +++ b/src/object/array.go @@ -0,0 +1,40 @@ +package object + +import ( + "bytes" + "strings" +) + +type Array struct { + Elements []Object + offset int +} + +func (ao *Array) Type() ObjectType { return ARRAY_OBJ } +func (ao *Array) Inspect() string { + var out bytes.Buffer + + elements := []string{} + for _, e := range ao.Elements { + elements = append(elements, e.Inspect()) + } + + out.WriteString("[") + out.WriteString(strings.Join(elements, ", ")) + out.WriteString("]") + + return out.String() +} + +func (ao *Array) Next() (Object, Object) { + idx := ao.offset + if len(ao.Elements) > idx { + ao.offset = idx + 1 + return &Integer{Value: int64(idx)}, ao.Elements[idx] + } + return nil, nil +} + +func (ao *Array) Reset() { + ao.offset = 0 +} diff --git a/src/object/bool.go b/src/object/bool.go new file mode 100644 index 0000000..8702d52 --- /dev/null +++ b/src/object/bool.go @@ -0,0 +1,26 @@ +package object + +type Boolean struct { + Value bool +} + +func (b *Boolean) Inspect() string { + if b.Value { + return "kweli" + } else { + return "sikweli" + } +} +func (b *Boolean) Type() ObjectType { return BOOLEAN_OBJ } + +func (b *Boolean) HashKey() HashKey { + var value uint64 + + if b.Value { + value = 1 + } else { + value = 0 + } + + return HashKey{Type: b.Type(), Value: value} +} diff --git a/src/object/break.go b/src/object/break.go new file mode 100644 index 0000000..047b17c --- /dev/null +++ b/src/object/break.go @@ -0,0 +1,6 @@ +package object + +type Break struct{} + +func (b *Break) Type() ObjectType { return BREAK_OBJ } +func (b *Break) Inspect() string { return "break" } diff --git a/src/object/builtin.go b/src/object/builtin.go new file mode 100644 index 0000000..b47c051 --- /dev/null +++ b/src/object/builtin.go @@ -0,0 +1,10 @@ +package object + +type BuiltinFunction func(args ...Object) Object + +type Builtin struct { + Fn BuiltinFunction +} + +func (b *Builtin) Inspect() string { return "builtin function" } +func (b *Builtin) Type() ObjectType { return BUILTIN_OBJ } diff --git a/src/object/continue.go b/src/object/continue.go new file mode 100644 index 0000000..15c7355 --- /dev/null +++ b/src/object/continue.go @@ -0,0 +1,6 @@ +package object + +type Continue struct{} + +func (c *Continue) Type() ObjectType { return CONTINUE_OBJ } +func (c *Continue) Inspect() string { return "continue" } diff --git a/src/object/dict.go b/src/object/dict.go new file mode 100644 index 0000000..86ca482 --- /dev/null +++ b/src/object/dict.go @@ -0,0 +1,60 @@ +package object + +import ( + "bytes" + "fmt" + "sort" + "strings" +) + +type DictPair struct { + Key Object + Value Object +} + +type Dict struct { + Pairs map[HashKey]DictPair + offset int +} + +func (d *Dict) Type() ObjectType { return DICT_OBJ } +func (d *Dict) Inspect() string { + var out bytes.Buffer + + pairs := []string{} + + for _, pair := range d.Pairs { + pairs = append(pairs, fmt.Sprintf("%s: %s", pair.Key.Inspect(), pair.Value.Inspect())) + } + + out.WriteString("{") + out.WriteString(strings.Join(pairs, ", ")) + out.WriteString("}") + + return out.String() +} + +func (d *Dict) Next() (Object, Object) { + idx := 0 + dict := make(map[string]DictPair) + var keys []string + for _, v := range d.Pairs { + dict[v.Key.Inspect()] = v + keys = append(keys, v.Key.Inspect()) + } + + sort.Strings(keys) + + for _, k := range keys { + if d.offset == idx { + d.offset += 1 + return dict[k].Key, dict[k].Value + } + idx += 1 + } + return nil, nil +} + +func (d *Dict) Reset() { + d.offset = 0 +} diff --git a/object/environment.go b/src/object/environment.go similarity index 100% rename from object/environment.go rename to src/object/environment.go diff --git a/src/object/error.go b/src/object/error.go new file mode 100644 index 0000000..2bc65af --- /dev/null +++ b/src/object/error.go @@ -0,0 +1,13 @@ +package object + +import "fmt" + +type Error struct { + Message string +} + +func (e *Error) Inspect() string { + msg := fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, "Kosa: ") + return msg + e.Message +} +func (e *Error) Type() ObjectType { return ERROR_OBJ } diff --git a/src/object/file.go b/src/object/file.go new file mode 100644 index 0000000..7b3c744 --- /dev/null +++ b/src/object/file.go @@ -0,0 +1,45 @@ +package object + +import ( + "bufio" + "io" + "os" +) + +type File struct { + Filename string + Reader *bufio.Reader // To read the file + Writer *bufio.Writer // To write on the file + Handle *os.File // To handle the actual file (open, close etc) +} + +func (f *File) Type() ObjectType { return FILE_OBJ } +func (f *File) Inspect() string { return f.Filename } +func (f *File) Method(method string, args []Object) Object { + switch method { + case "soma": + return f.read(args) + case "funga": + return f.close(args) + } + return nil +} + +func (f *File) read(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + if f.Reader == nil { + return nil + } + txt, _ := io.ReadAll(f.Reader) + return &String{Value: string(txt)} +} + +func (f *File) close(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + _ = f.Handle.Close() + return &Null{} +} diff --git a/src/object/float.go b/src/object/float.go new file mode 100644 index 0000000..a4b2293 --- /dev/null +++ b/src/object/float.go @@ -0,0 +1,19 @@ +package object + +import ( + "hash/fnv" + "strconv" +) + +type Float struct { + Value float64 +} + +func (f *Float) Inspect() string { return strconv.FormatFloat(f.Value, 'f', -1, 64) } +func (f *Float) Type() ObjectType { return FLOAT_OBJ } + +func (f *Float) HashKey() HashKey { + h := fnv.New64a() + h.Write([]byte(f.Inspect())) + return HashKey{Type: f.Type(), Value: h.Sum64()} +} diff --git a/src/object/function.go b/src/object/function.go new file mode 100644 index 0000000..aecaf8a --- /dev/null +++ b/src/object/function.go @@ -0,0 +1,33 @@ +package object + +import ( + "bytes" + "strings" + + "github.com/AvicennaJr/Nuru/ast" +) + +type Function struct { + Parameters []*ast.Identifier + Body *ast.BlockStatement + Env *Environment +} + +func (f *Function) Type() ObjectType { return FUNCTION_OBJ } +func (f *Function) Inspect() string { + var out bytes.Buffer + + params := []string{} + for _, p := range f.Parameters { + params = append(params, p.String()) + } + + out.WriteString("unda") + out.WriteString("(") + out.WriteString(strings.Join(params, ", ")) + out.WriteString(") {\n") + out.WriteString(f.Body.String()) + out.WriteString("\n}") + + return out.String() +} diff --git a/src/object/integer.go b/src/object/integer.go new file mode 100644 index 0000000..87cb945 --- /dev/null +++ b/src/object/integer.go @@ -0,0 +1,14 @@ +package object + +import "fmt" + +type Integer struct { + Value int64 +} + +func (i *Integer) Inspect() string { return fmt.Sprintf("%d", i.Value) } +func (i *Integer) Type() ObjectType { return INTEGER_OBJ } + +func (i *Integer) HashKey() HashKey { + return HashKey{Type: i.Type(), Value: uint64(i.Value)} +} diff --git a/src/object/null.go b/src/object/null.go new file mode 100644 index 0000000..1610994 --- /dev/null +++ b/src/object/null.go @@ -0,0 +1,6 @@ +package object + +type Null struct{} + +func (n *Null) Inspect() string { return "null" } +func (n *Null) Type() ObjectType { return NULL_OBJ } diff --git a/src/object/object.go b/src/object/object.go new file mode 100644 index 0000000..e1b8389 --- /dev/null +++ b/src/object/object.go @@ -0,0 +1,49 @@ +package object + +import ( + "fmt" +) + +type ObjectType string + +const ( + INTEGER_OBJ = "NAMBA" + FLOAT_OBJ = "DESIMALI" + BOOLEAN_OBJ = "BOOLEAN" + NULL_OBJ = "TUPU" + RETURN_VALUE_OBJ = "RUDISHA" + ERROR_OBJ = "KOSA" + FUNCTION_OBJ = "UNDO (FUNCTION)" + STRING_OBJ = "NENO" + BUILTIN_OBJ = "YA_NDANI" + ARRAY_OBJ = "ORODHA" + DICT_OBJ = "KAMUSI" + CONTINUE_OBJ = "ENDELEA" + BREAK_OBJ = "VUNJA" + FILE_OBJ = "FAILI" +) + +type Object interface { + Type() ObjectType + Inspect() string +} + +type HashKey struct { + Type ObjectType + Value uint64 +} + +type Hashable interface { + HashKey() HashKey +} + +// Iterable interface for dicts, strings and arrays +type Iterable interface { + Next() (Object, Object) + Reset() +} + +func newError(format string, a ...interface{}) *Error { + format = fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, format) + return &Error{Message: fmt.Sprintf(format, a...)} +} diff --git a/object/object_test.go b/src/object/object_test.go similarity index 100% rename from object/object_test.go rename to src/object/object_test.go diff --git a/src/object/return.go b/src/object/return.go new file mode 100644 index 0000000..42c7225 --- /dev/null +++ b/src/object/return.go @@ -0,0 +1,8 @@ +package object + +type ReturnValue struct { + Value Object +} + +func (rv *ReturnValue) Inspect() string { return rv.Value.Inspect() } +func (rv *ReturnValue) Type() ObjectType { return RETURN_VALUE_OBJ } diff --git a/src/object/strings.go b/src/object/strings.go new file mode 100644 index 0000000..213fa8c --- /dev/null +++ b/src/object/strings.go @@ -0,0 +1,83 @@ +package object + +import ( + "hash/fnv" + "strings" +) + +type String struct { + Value string + offset int +} + +func (s *String) Inspect() string { return s.Value } +func (s *String) Type() ObjectType { return STRING_OBJ } +func (s *String) HashKey() HashKey { + h := fnv.New64a() + h.Write([]byte(s.Value)) + + return HashKey{Type: s.Type(), Value: h.Sum64()} +} +func (s *String) Next() (Object, Object) { + offset := s.offset + if len(s.Value) > offset { + s.offset = offset + 1 + return &Integer{Value: int64(offset)}, &String{Value: string(s.Value[offset])} + } + return nil, nil +} +func (s *String) Reset() { + s.offset = 0 +} +func (s *String) Method(method string, args []Object) Object { + switch method { + case "idadi": + return s.len(args) + case "herufikubwa": + return s.upper(args) + case "herufindogo": + return s.lower(args) + case "gawa": + return s.split(args) + default: + return newError("Samahani, function hii haitumiki na Strings (Neno)") + } +} + +func (s *String) len(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + return &Integer{Value: int64(len(s.Value))} +} + +func (s *String) upper(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + return &String{Value: strings.ToUpper(s.Value)} +} + +func (s *String) lower(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + return &String{Value: strings.ToLower(s.Value)} +} + +func (s *String) split(args []Object) Object { + if len(args) > 1 { + return newError("Samahani, tunahitaji Hoja 1 au 0, wewe umeweka %d", len(args)) + } + sep := " " + if len(args) == 1 { + sep = args[0].(*String).Value + } + parts := strings.Split(s.Value, sep) + length := len(parts) + elements := make([]Object, length) + for k, v := range parts { + elements[k] = &String{Value: v} + } + return &Array{Elements: elements} +} diff --git a/src/parser/arrays.go b/src/parser/arrays.go new file mode 100644 index 0000000..119a903 --- /dev/null +++ b/src/parser/arrays.go @@ -0,0 +1,37 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseArrayLiteral() ast.Expression { + array := &ast.ArrayLiteral{Token: p.curToken} + + array.Elements = p.parseExpressionList(token.RBRACKET) + + return array +} + +func (p *Parser) parseExpressionList(end token.TokenType) []ast.Expression { + list := []ast.Expression{} + + if p.peekTokenIs(end) { + p.nextToken() + return list + } + + p.nextToken() + list = append(list, p.parseExpression(LOWEST)) + + for p.peekTokenIs(token.COMMA) { + p.nextToken() + p.nextToken() + list = append(list, p.parseExpression(LOWEST)) + } + + if !p.expectPeek(end) { + return nil + } + return list +} diff --git a/src/parser/assignment.go b/src/parser/assignment.go new file mode 100644 index 0000000..72a8a20 --- /dev/null +++ b/src/parser/assignment.go @@ -0,0 +1,30 @@ +package parser + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseAssignmentExpression(exp ast.Expression) ast.Expression { + switch node := exp.(type) { + case *ast.Identifier, *ast.IndexExpression: + default: + if node != nil { + msg := fmt.Sprintf("Mstari %d:Tulitegemea kupata kitambulishi au array, badala yake tumepata: %s", p.curToken.Line, node.TokenLiteral()) + p.errors = append(p.errors, msg) + } else { + msg := fmt.Sprintf("Mstari %d: Umekosea mkuu", p.curToken.Line) + p.errors = append(p.errors, msg) + } + return nil + } + + ae := &ast.AssignmentExpression{Token: p.curToken, Left: exp} + + p.nextToken() + + ae.Value = p.parseExpression(LOWEST) + + return ae +} diff --git a/src/parser/boolean.go b/src/parser/boolean.go new file mode 100644 index 0000000..9ce95e6 --- /dev/null +++ b/src/parser/boolean.go @@ -0,0 +1,10 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseBoolean() ast.Expression { + return &ast.Boolean{Token: p.curToken, Value: p.curTokenIs(token.TRUE)} +} diff --git a/src/parser/break.go b/src/parser/break.go new file mode 100644 index 0000000..6c4c8ef --- /dev/null +++ b/src/parser/break.go @@ -0,0 +1,14 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseBreak() *ast.Break { + stmt := &ast.Break{Token: p.curToken} + for p.curTokenIs(token.SEMICOLON) { + p.nextToken() + } + return stmt +} diff --git a/src/parser/continue.go b/src/parser/continue.go new file mode 100644 index 0000000..a66b85f --- /dev/null +++ b/src/parser/continue.go @@ -0,0 +1,14 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseContinue() *ast.Continue { + stmt := &ast.Continue{Token: p.curToken} + for p.curTokenIs(token.SEMICOLON) { + p.nextToken() + } + return stmt +} diff --git a/src/parser/dict.go b/src/parser/dict.go new file mode 100644 index 0000000..4b3b205 --- /dev/null +++ b/src/parser/dict.go @@ -0,0 +1,35 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseDictLiteral() ast.Expression { + dict := &ast.DictLiteral{Token: p.curToken} + dict.Pairs = make(map[ast.Expression]ast.Expression) + + for !p.peekTokenIs(token.RBRACE) { + p.nextToken() + key := p.parseExpression(LOWEST) + + if !p.expectPeek(token.COLON) { + return nil + } + + p.nextToken() + value := p.parseExpression(LOWEST) + + dict.Pairs[key] = value + + if !p.peekTokenIs(token.RBRACE) && !p.expectPeek(token.COMMA) { + return nil + } + } + + if !p.expectPeek(token.RBRACE) { + return nil + } + + return dict +} diff --git a/src/parser/dot.go b/src/parser/dot.go new file mode 100644 index 0000000..18086b8 --- /dev/null +++ b/src/parser/dot.go @@ -0,0 +1,18 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseMethod(obj ast.Expression) ast.Expression { + precedence := p.curPrecedence() + exp := &ast.MethodExpression{Token: p.curToken, Object: obj} + p.nextToken() + exp.Method = p.parseExpression(precedence) + if !p.expectPeek(token.LPAREN) { + return nil + } + exp.Arguments = p.parseExpressionList(token.RPAREN) + return exp +} diff --git a/src/parser/float.go b/src/parser/float.go new file mode 100644 index 0000000..77f6075 --- /dev/null +++ b/src/parser/float.go @@ -0,0 +1,20 @@ +package parser + +import ( + "fmt" + "strconv" + + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseFloatLiteral() ast.Expression { + fl := &ast.FloatLiteral{Token: p.curToken} + value, err := strconv.ParseFloat(p.curToken.Literal, 64) + if err != nil { + msg := fmt.Sprintf("Mstari %d: Hatuwezi kuparse %q kama desimali", p.curToken.Line, p.curToken.Literal) + p.errors = append(p.errors, msg) + return nil + } + fl.Value = value + return fl +} diff --git a/src/parser/for.go b/src/parser/for.go new file mode 100644 index 0000000..7e36038 --- /dev/null +++ b/src/parser/for.go @@ -0,0 +1,92 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseForExpression() ast.Expression { + expression := &ast.For{Token: p.curToken} + p.nextToken() + if !p.curTokenIs(token.IDENT) { + return nil + } + if !p.peekTokenIs(token.ASSIGN) { + return p.parseForInExpression(expression) + } + + // In future will allow: kwa i = 0; i<10; i++ {andika(i)} + // expression.Identifier = p.curToken.Literal + // expression.StarterName = &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} + // if expression.StarterName == nil { + // return nil + // } + // if !p.expectPeek(token.ASSIGN) { + // return nil + // } + + // p.nextToken() + + // expression.StarterValue = p.parseExpression(LOWEST) + // // expression.Starter = p.parseExpression(LOWEST) + // if expression.StarterValue == nil { + // return nil + // } + // p.nextToken() + // for p.curTokenIs(token.SEMICOLON) { + // p.nextToken() + // } + // expression.Condition = p.parseExpression(LOWEST) + // if expression.Condition == nil { + // return nil + // } + // p.nextToken() + // for p.curTokenIs(token.SEMICOLON) { + // p.nextToken() + // } + // expression.Closer = p.parseExpression(LOWEST) + // if expression.Closer == nil { + // return nil + // } + // p.nextToken() + // for p.curTokenIs(token.SEMICOLON) { + // p.nextToken() + // } + // if !p.curTokenIs(token.LBRACE) { + // return nil + // } + // expression.Block = p.parseBlockStatement() + // return expression + return nil +} + +func (p *Parser) parseForInExpression(initialExpression *ast.For) ast.Expression { + expression := &ast.ForIn{Token: initialExpression.Token} + if !p.curTokenIs(token.IDENT) { + return nil + } + val := p.curToken.Literal + var key string + p.nextToken() + if p.curTokenIs(token.COMMA) { + p.nextToken() + if !p.curTokenIs(token.IDENT) { + return nil + } + key = val + val = p.curToken.Literal + p.nextToken() + } + expression.Key = key + expression.Value = val + if !p.curTokenIs(token.IN) { + return nil + } + p.nextToken() + expression.Iterable = p.parseExpression(LOWEST) + if !p.expectPeek(token.LBRACE) { + return nil + } + expression.Block = p.parseBlockStatement() + return expression +} diff --git a/src/parser/function.go b/src/parser/function.go new file mode 100644 index 0000000..a1d7dd7 --- /dev/null +++ b/src/parser/function.go @@ -0,0 +1,57 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseFunctionLiteral() ast.Expression { + lit := &ast.FunctionLiteral{Token: p.curToken} + + if !p.expectPeek(token.LPAREN) { + return nil + } + + lit.Parameters = p.parseFunctionParameters() + + if !p.expectPeek(token.LBRACE) { + return nil + } + + lit.Body = p.parseBlockStatement() + + return lit +} + +func (p *Parser) parseFunctionParameters() []*ast.Identifier { + identifiers := []*ast.Identifier{} + + if p.peekTokenIs(token.RPAREN) { + p.nextToken() + return identifiers + } + + p.nextToken() + + ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} + identifiers = append(identifiers, ident) + + for p.peekTokenIs(token.COMMA) { + p.nextToken() + p.nextToken() + ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} + identifiers = append(identifiers, ident) + } + + if !p.expectPeek(token.RPAREN) { + return nil + } + + return identifiers +} + +func (p *Parser) parseCallExpression(function ast.Expression) ast.Expression { + exp := &ast.CallExpression{Token: p.curToken, Function: function} + exp.Arguments = p.parseExpressionList(token.RPAREN) + return exp +} diff --git a/src/parser/identifier.go b/src/parser/identifier.go new file mode 100644 index 0000000..d9d5b7e --- /dev/null +++ b/src/parser/identifier.go @@ -0,0 +1,9 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseIdentifier() ast.Expression { + return &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} +} diff --git a/src/parser/if.go b/src/parser/if.go new file mode 100644 index 0000000..b3eccc6 --- /dev/null +++ b/src/parser/if.go @@ -0,0 +1,50 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseIfExpression() ast.Expression { + expression := &ast.IfExpression{Token: p.curToken} + + if !p.expectPeek(token.LPAREN) { + return nil + } + + p.nextToken() + expression.Condition = p.parseExpression(LOWEST) + + if !p.expectPeek(token.RPAREN) { + return nil + } + + if !p.expectPeek(token.LBRACE) { + return nil + } + + expression.Consequence = p.parseBlockStatement() + + if p.peekTokenIs(token.ELSE) { + p.nextToken() + if p.peekTokenIs(token.IF) { + p.nextToken() + expression.Alternative = &ast.BlockStatement{ + Statements: []ast.Statement{ + &ast.ExpressionStatement{ + Expression: p.parseIfExpression(), + }, + }, + } + return expression + } + + if !p.expectPeek(token.LBRACE) { + return nil + } + + expression.Alternative = p.parseBlockStatement() + } + + return expression +} diff --git a/src/parser/index.go b/src/parser/index.go new file mode 100644 index 0000000..9104bc6 --- /dev/null +++ b/src/parser/index.go @@ -0,0 +1,18 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseIndexExpression(left ast.Expression) ast.Expression { + exp := &ast.IndexExpression{Token: p.curToken, Left: left} + + p.nextToken() + exp.Index = p.parseExpression(LOWEST) + if !p.expectPeek(token.RBRACKET) { + return nil + } + + return exp +} diff --git a/src/parser/integer.go b/src/parser/integer.go new file mode 100644 index 0000000..c35bcd2 --- /dev/null +++ b/src/parser/integer.go @@ -0,0 +1,22 @@ +package parser + +import ( + "fmt" + "strconv" + + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseIntegerLiteral() ast.Expression { + lit := &ast.IntegerLiteral{Token: p.curToken} + + value, err := strconv.ParseInt(p.curToken.Literal, 0, 64) + if err != nil { + msg := fmt.Sprintf("Mstari %d: Hatuwezi kuparse %q kama namba", p.curToken.Line, p.curToken.Literal) + p.errors = append(p.errors, msg) + return nil + } + lit.Value = value + + return lit +} diff --git a/src/parser/null.go b/src/parser/null.go new file mode 100644 index 0000000..2f4c869 --- /dev/null +++ b/src/parser/null.go @@ -0,0 +1,9 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseNull() ast.Expression { + return &ast.Null{Token: p.curToken} +} diff --git a/src/parser/parser.go b/src/parser/parser.go new file mode 100644 index 0000000..515397d --- /dev/null +++ b/src/parser/parser.go @@ -0,0 +1,314 @@ +package parser + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/lexer" + "github.com/AvicennaJr/Nuru/token" +) + +const ( + // Think of BODMAS + _ int = iota + LOWEST + COND // OR or AND + ASSIGN // = + EQUALS // == + LESSGREATER // > OR < + SUM // + + PRODUCT // * + POWER // ** we got the power XD + MODULUS // % + PREFIX // -X OR !X + CALL // myFunction(X) + INDEX // Arrays + DOT // For methods +) + +var precedences = map[token.TokenType]int{ + token.AND: COND, + token.OR: COND, + token.IN: COND, + token.ASSIGN: ASSIGN, + token.EQ: EQUALS, + token.NOT_EQ: EQUALS, + token.LT: LESSGREATER, + token.LTE: LESSGREATER, + token.GT: LESSGREATER, + token.GTE: LESSGREATER, + token.PLUS: SUM, + token.PLUS_ASSIGN: SUM, + token.MINUS: SUM, + token.MINUS_ASSIGN: SUM, + token.SLASH: PRODUCT, + token.SLASH_ASSIGN: PRODUCT, + token.ASTERISK: PRODUCT, + token.ASTERISK_ASSIGN: PRODUCT, + token.POW: POWER, + token.MODULUS: MODULUS, + token.MODULUS_ASSIGN: MODULUS, + // token.BANG: PREFIX, + token.LPAREN: CALL, + token.LBRACKET: INDEX, + token.DOT: DOT, // Highest priority +} + +type ( + prefixParseFn func() ast.Expression + infixParseFn func(ast.Expression) ast.Expression + postfixParseFn func() ast.Expression +) + +type Parser struct { + l *lexer.Lexer + + curToken token.Token + peekToken token.Token + prevToken token.Token + + errors []string + + prefixParseFns map[token.TokenType]prefixParseFn + infixParseFns map[token.TokenType]infixParseFn + postfixParseFns map[token.TokenType]postfixParseFn +} + +func (p *Parser) registerPrefix(tokenType token.TokenType, fn prefixParseFn) { + p.prefixParseFns[tokenType] = fn +} + +func (p *Parser) registerInfix(tokenType token.TokenType, fn infixParseFn) { + p.infixParseFns[tokenType] = fn +} + +func (p *Parser) registerPostfix(tokenType token.TokenType, fn postfixParseFn) { + p.postfixParseFns[tokenType] = fn +} + +func New(l *lexer.Lexer) *Parser { + p := &Parser{l: l, errors: []string{}} + + // Gotta set these niggas + p.nextToken() + p.nextToken() + + p.prefixParseFns = make(map[token.TokenType]prefixParseFn) + p.registerPrefix(token.STRING, p.parseStringLiteral) + p.registerPrefix(token.IDENT, p.parseIdentifier) + p.registerPrefix(token.INT, p.parseIntegerLiteral) + p.registerPrefix(token.FLOAT, p.parseFloatLiteral) + p.registerPrefix(token.BANG, p.parsePrefixExpression) + p.registerPrefix(token.MINUS, p.parsePrefixExpression) + p.registerPrefix(token.PLUS, p.parsePrefixExpression) + p.registerPrefix(token.TRUE, p.parseBoolean) + p.registerPrefix(token.FALSE, p.parseBoolean) + p.registerPrefix(token.LPAREN, p.parseGroupedExpression) + p.registerPrefix(token.IF, p.parseIfExpression) + p.registerPrefix(token.FUNCTION, p.parseFunctionLiteral) + p.registerPrefix(token.LBRACKET, p.parseArrayLiteral) + p.registerPrefix(token.LBRACE, p.parseDictLiteral) + p.registerPrefix(token.WHILE, p.parseWhileExpression) + p.registerPrefix(token.NULL, p.parseNull) + p.registerPrefix(token.FOR, p.parseForExpression) + p.registerPrefix(token.SWITCH, p.parseSwitchStatement) + + p.infixParseFns = make(map[token.TokenType]infixParseFn) + p.registerInfix(token.AND, p.parseInfixExpression) + p.registerInfix(token.OR, p.parseInfixExpression) + p.registerInfix(token.PLUS, p.parseInfixExpression) + p.registerInfix(token.PLUS_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.MINUS, p.parseInfixExpression) + p.registerInfix(token.MINUS_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.SLASH, p.parseInfixExpression) + p.registerInfix(token.SLASH_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.ASTERISK, p.parseInfixExpression) + p.registerInfix(token.ASTERISK_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.POW, p.parseInfixExpression) + p.registerInfix(token.MODULUS, p.parseInfixExpression) + p.registerInfix(token.MODULUS_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.EQ, p.parseInfixExpression) + p.registerInfix(token.NOT_EQ, p.parseInfixExpression) + p.registerInfix(token.LT, p.parseInfixExpression) + p.registerInfix(token.LTE, p.parseInfixExpression) + p.registerInfix(token.GT, p.parseInfixExpression) + p.registerInfix(token.GTE, p.parseInfixExpression) + p.registerInfix(token.LPAREN, p.parseCallExpression) + p.registerInfix(token.LBRACKET, p.parseIndexExpression) + p.registerInfix(token.ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.IN, p.parseInfixExpression) + p.registerInfix(token.DOT, p.parseMethod) + + p.postfixParseFns = make(map[token.TokenType]postfixParseFn) + p.registerPostfix(token.PLUS_PLUS, p.parsePostfixExpression) + p.registerPostfix(token.MINUS_MINUS, p.parsePostfixExpression) + + return p +} + +func (p *Parser) ParseProgram() *ast.Program { + program := &ast.Program{} + program.Statements = []ast.Statement{} + + for !p.curTokenIs(token.EOF) { + stmt := p.parseStatement() + program.Statements = append(program.Statements, stmt) + + p.nextToken() + } + return program +} + +// manage token literals: + +func (p *Parser) nextToken() { + p.prevToken = p.curToken + p.curToken = p.peekToken + p.peekToken = p.l.NextToken() +} + +func (p *Parser) curTokenIs(t token.TokenType) bool { + return p.curToken.Type == t +} + +func (p *Parser) peekTokenIs(t token.TokenType) bool { + return p.peekToken.Type == t +} + +func (p *Parser) expectPeek(t token.TokenType) bool { + if p.peekTokenIs(t) { + p.nextToken() + return true + } else { + p.peekError(t) + return false + } +} + +func (p *Parser) peekPrecedence() int { + if p, ok := precedences[p.peekToken.Type]; ok { + return p + } + return LOWEST +} + +func (p *Parser) curPrecedence() int { + if p, ok := precedences[p.curToken.Type]; ok { + return p + } + + return LOWEST +} + +// error messages + +func (p *Parser) Errors() []string { + return p.errors +} + +func (p *Parser) peekError(t token.TokenType) { + msg := fmt.Sprintf("Mstari %d: Tulitegemea kupata %s, badala yake tumepata %s", p.curToken.Line, t, p.peekToken.Type) + p.errors = append(p.errors, msg) +} + +// parse expressions + +func (p *Parser) parseExpressionStatement() *ast.ExpressionStatement { + stmt := &ast.ExpressionStatement{Token: p.curToken} + + stmt.Expression = p.parseExpression(LOWEST) + + if p.peekTokenIs(token.SEMICOLON) { + p.nextToken() + } + + return stmt +} + +func (p *Parser) parseExpression(precedence int) ast.Expression { + postfix := p.postfixParseFns[p.curToken.Type] + if postfix != nil { + return (postfix()) + } + prefix := p.prefixParseFns[p.curToken.Type] + if prefix == nil { + p.noPrefixParseFnError(p.curToken.Type) + return nil + } + leftExp := prefix() + + for !p.peekTokenIs(token.SEMICOLON) && precedence < p.peekPrecedence() { + infix := p.infixParseFns[p.peekToken.Type] + if infix == nil { + p.noInfixParseFnError(p.peekToken.Type) + return nil + } + + p.nextToken() + leftExp = infix(leftExp) + } + return leftExp + +} + +// prefix expressions + +func (p *Parser) parsePrefixExpression() ast.Expression { + expression := &ast.PrefixExpression{ + Token: p.curToken, + Operator: p.curToken.Literal, + } + + p.nextToken() + + expression.Right = p.parseExpression(PREFIX) + + return expression +} + +func (p *Parser) noPrefixParseFnError(t token.TokenType) { + msg := fmt.Sprintf("Mstari %d: Tumeshindwa kuparse %s", p.curToken.Line, t) + p.errors = append(p.errors, msg) +} + +// infix expressions + +func (p *Parser) parseInfixExpression(left ast.Expression) ast.Expression { + expression := &ast.InfixExpression{ + Token: p.curToken, + Operator: p.curToken.Literal, + Left: left, + } + + precedence := p.curPrecedence() + p.nextToken() + expression.Right = p.parseExpression(precedence) + return expression +} + +func (p *Parser) noInfixParseFnError(t token.TokenType) { + msg := fmt.Sprintf("Mstari %d: Tumeshindwa kuparse %s", p.curToken.Line, t) + p.errors = append(p.errors, msg) +} + +func (p *Parser) parseGroupedExpression() ast.Expression { + p.nextToken() + + exp := p.parseExpression(LOWEST) + + if !p.expectPeek(token.RPAREN) { + return nil + } + + return exp +} + +// postfix expressions + +func (p *Parser) parsePostfixExpression() ast.Expression { + expression := &ast.PostfixExpression{ + Token: p.prevToken, + Operator: p.curToken.Literal, + } + return expression +} diff --git a/parser/parser_test.go b/src/parser/parser_test.go similarity index 88% rename from parser/parser_test.go rename to src/parser/parser_test.go index 19bd04e..631f765 100644 --- a/parser/parser_test.go +++ b/src/parser/parser_test.go @@ -14,9 +14,9 @@ func TestLetStatements(t *testing.T) { expectedIdentifier string expectedValue interface{} }{ - {"acha x = 5;", "x", 5}, - {"acha y = x;", "y", "x"}, - {"acha bangi = y;", "bangi", "y"}, + {"fanya x = 5;", "x", 5}, + {"fanya y = x;", "y", "x"}, + {"fanya bangi = y;", "bangi", "y"}, } for _, tt := range tests { @@ -43,8 +43,8 @@ func TestLetStatements(t *testing.T) { } func testLetStatement(t *testing.T, s ast.Statement, name string) bool { - if s.TokenLiteral() != "acha" { - t.Errorf("s.TokenLiteral not 'acha', got = %q", s.TokenLiteral()) + if s.TokenLiteral() != "fanya" { + t.Errorf("s.TokenLiteral not 'fanya', got = %q", s.TokenLiteral()) return false } @@ -633,7 +633,7 @@ func TestIfElseExpression(t *testing.T) { } func TestFunctionLiteralParsing(t *testing.T) { - input := `fn(x, y) {x + y}` + input := `unda(x, y) {x + y}` l := lexer.New(input) p := New(l) @@ -678,9 +678,9 @@ func TestFunctionParameterParsing(t *testing.T) { input string expectedParams []string }{ - {input: "fn() {};", expectedParams: []string{}}, - {input: "fn(x) {};", expectedParams: []string{"x"}}, - {input: "fn(x, y, z) {};", expectedParams: []string{"x", "y", "z"}}, + {input: "unda() {};", expectedParams: []string{}}, + {input: "unda(x) {};", expectedParams: []string{"x"}}, + {input: "unda(x, y, z) {};", expectedParams: []string{"x", "y", "z"}}, } for _, tt := range tests { @@ -968,3 +968,96 @@ func TestParsingEmptyDict(t *testing.T) { t.Errorf("Dict pairs has wrong length, got=%d", len(dict.Pairs)) } } + +func TestWhileLoop(t *testing.T) { + input := `wakati ( x > y ) { fanya x = 2 }` + + l := lexer.New(input) + p := New(l) + program := p.ParseProgram() + checkParserErrors(t, p) + + if len(program.Statements) != 1 { + t.Fatalf("program.Body does not contain %d statements. got=%d", 1, len(program.Statements)) + } + + fmt.Println(program.Statements) + + stmt, ok := program.Statements[0].(*ast.ExpressionStatement) + if !ok { + t.Fatalf("program.Statements[0] is not ast.Expression, got=%T", program.Statements[0]) + } + exp, ok := stmt.Expression.(*ast.WhileExpression) + + if !ok { + t.Fatalf("stmt.Expression is not ast.WhileExpression. got=%T", stmt.Expression) + } + + if !testInfixExpression(t, exp.Condition, "x", ">", "y") { + return + } + + if len(exp.Consequence.Statements) != 1 { + t.Errorf("Consequence is not 1 statements. got=%d\n", len(exp.Consequence.Statements)) + } + + consequence, ok := exp.Consequence.Statements[0].(*ast.LetStatement) + + if !ok { + t.Fatalf("exp.Consequence.Statements[0] is not ast.ExpressionStatement. got=%T", exp.Consequence.Statements[0]) + } + + if !testLetStatement(t, consequence, "x") { + t.Fatalf("exp.Consequence is not LetStatement") + } +} + +func TestShorthandAssignment(t *testing.T) { + input := []string{ + "fanya x = 10; x *= 20;", + "fanya x = 5; x += 4;", + "fanya x = 7; x /= 2;", + "fanya x = 8; x -= 1;", + "fanya x = 5; x++;", + "fanya x = 3; x--;", + "fanya x = 40; fanya y = 13; x += y;"} + + for _, txt := range input { + l := lexer.New(txt) + p := New(l) + _ = p.ParseProgram() + checkParserErrors(t, p) + } +} + +func TestForExpression(t *testing.T) { + input := `kwa i, v ktk j {andika(i)}` + + l := lexer.New(input) + p := New(l) + program := p.ParseProgram() + checkParserErrors(t, p) + + if len(program.Statements) != 1 { + t.Fatalf("program.Body does not contain %d statements. got=%d", 1, len(program.Statements)) + } + + stmt, ok := program.Statements[0].(*ast.ExpressionStatement) + if !ok { + t.Fatalf("program.Statements[0] is not ast.Expression, got=%T", program.Statements[0]) + } + + exp, ok := stmt.Expression.(*ast.ForIn) + + if !ok { + t.Fatalf("stmt.Expression is not ast.ForIn. got=%T", stmt.Expression) + } + + if exp.Key != "i" { + t.Fatalf("Wrong Key Index, expected 'i' got %s", exp.Key) + } + + if exp.Value != "v" { + t.Fatalf("Wrong Value Index, expected 'v' got %s", exp.Value) + } +} diff --git a/src/parser/statements.go b/src/parser/statements.go new file mode 100644 index 0000000..c129c4f --- /dev/null +++ b/src/parser/statements.go @@ -0,0 +1,81 @@ +package parser + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseStatement() ast.Statement { + // Remember to add switch statements to the language + switch p.curToken.Type { + case token.LET: + return p.parseLetStatment() + case token.RETURN: + return p.parseReturnStatement() + case token.BREAK: + return p.parseBreak() + case token.CONTINUE: + return p.parseContinue() + default: + return p.parseExpressionStatement() + } +} + +func (p *Parser) parseLetStatment() *ast.LetStatement { + stmt := &ast.LetStatement{Token: p.curToken} + + if !p.expectPeek(token.IDENT) { + return nil + } + + stmt.Name = &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} + + if !p.expectPeek(token.ASSIGN) { + return nil + } + + p.nextToken() + + stmt.Value = p.parseExpression(LOWEST) + + if p.peekTokenIs(token.SEMICOLON) { + p.nextToken() + } + + return stmt +} + +func (p *Parser) parseReturnStatement() *ast.ReturnStatement { + stmt := &ast.ReturnStatement{Token: p.curToken} + p.nextToken() + + stmt.ReturnValue = p.parseExpression(LOWEST) + + if p.peekTokenIs(token.SEMICOLON) { + p.nextToken() + } + + return stmt +} + +func (p *Parser) parseBlockStatement() *ast.BlockStatement { + block := &ast.BlockStatement{Token: p.curToken} + block.Statements = []ast.Statement{} + + p.nextToken() + + for !p.curTokenIs(token.RBRACE) { + if p.curTokenIs(token.EOF) { + msg := fmt.Sprintf("Mstari %d: Hukufunga Mabano '}'", p.curToken.Line) + p.errors = append(p.errors, msg) + return nil + } + stmt := p.parseStatement() + block.Statements = append(block.Statements, stmt) + p.nextToken() + } + + return block +} diff --git a/src/parser/string.go b/src/parser/string.go new file mode 100644 index 0000000..cfd90f2 --- /dev/null +++ b/src/parser/string.go @@ -0,0 +1,9 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseStringLiteral() ast.Expression { + return &ast.StringLiteral{Token: p.curToken, Value: p.curToken.Literal} +} diff --git a/src/parser/switch.go b/src/parser/switch.go new file mode 100644 index 0000000..88ce460 --- /dev/null +++ b/src/parser/switch.go @@ -0,0 +1,89 @@ +package parser + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseSwitchStatement() ast.Expression { + expression := &ast.SwitchExpression{Token: p.curToken} + + if !p.expectPeek(token.LPAREN) { + return nil + } + + p.nextToken() + expression.Value = p.parseExpression(LOWEST) + + if expression.Value == nil { + return nil + } + + if !p.expectPeek(token.RPAREN) { + return nil + } + + if !p.expectPeek(token.LBRACE) { + return nil + } + p.nextToken() + + for !p.curTokenIs(token.RBRACE) { + + if p.curTokenIs(token.EOF) { + msg := fmt.Sprintf("Mstari %d: Haukufunga ENDAPO (SWITCH)", p.curToken.Line) + p.errors = append(p.errors, msg) + return nil + } + tmp := &ast.CaseExpression{Token: p.curToken} + + if p.curTokenIs(token.DEFAULT) { + + tmp.Default = true + + } else if p.curTokenIs(token.CASE) { + + p.nextToken() + + if p.curTokenIs(token.DEFAULT) { + tmp.Default = true + } else { + tmp.Expr = append(tmp.Expr, p.parseExpression(LOWEST)) + for p.peekTokenIs(token.COMMA) { + p.nextToken() + p.nextToken() + tmp.Expr = append(tmp.Expr, p.parseExpression(LOWEST)) + } + } + } else { + msg := fmt.Sprintf("Mstari %d: Tulitegemea Kauli IKIWA (CASE) au KAWAIDA (DEFAULT) lakini tumepewa: %s", p.curToken.Line, p.curToken.Type) + p.errors = append(p.errors, msg) + return nil + } + + if !p.expectPeek(token.LBRACE) { + return nil + } + + tmp.Block = p.parseBlockStatement() + p.nextToken() + expression.Choices = append(expression.Choices, tmp) + } + + count := 0 + for _, c := range expression.Choices { + if c.Default { + count++ + } + } + if count > 1 { + msg := fmt.Sprintf("Kauli ENDAPO (SWITCH) hua na kauli 'KAWAIDA' (DEFAULT) moja tu! Wewe umeweka %d", count) + p.errors = append(p.errors, msg) + return nil + + } + return expression + +} diff --git a/src/parser/while.go b/src/parser/while.go new file mode 100644 index 0000000..3ae92fc --- /dev/null +++ b/src/parser/while.go @@ -0,0 +1,29 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseWhileExpression() ast.Expression { + expression := &ast.WhileExpression{Token: p.curToken} + + if !p.expectPeek(token.LPAREN) { + return nil + } + + p.nextToken() + expression.Condition = p.parseExpression(LOWEST) + + if !p.expectPeek(token.RPAREN) { + return nil + } + + if !p.expectPeek(token.LBRACE) { + return nil + } + + expression.Consequence = p.parseBlockStatement() + + return expression +} diff --git a/repl/repl.go b/src/repl/repl.go similarity index 93% rename from repl/repl.go rename to src/repl/repl.go index bd99864..9700152 100644 --- a/repl/repl.go +++ b/src/repl/repl.go @@ -59,7 +59,9 @@ func Read(contents string) { } evaluated := evaluator.Eval(program, env) if evaluated != nil { - fmt.Println(colorfy(evaluated.Inspect(), 32)) + if evaluated.Type() != object.NULL_OBJ { + fmt.Println(colorfy(evaluated.Inspect(), 32)) + } } } @@ -92,8 +94,10 @@ func Start(in io.Reader, out io.Writer) { } evaluated := evaluator.Eval(program, env) if evaluated != nil { - io.WriteString(out, colorfy(evaluated.Inspect(), 32)) - io.WriteString(out, "\n") + if evaluated.Type() != object.NULL_OBJ { + io.WriteString(out, colorfy(evaluated.Inspect(), 32)) + io.WriteString(out, "\n") + } } } } diff --git a/src/token/token.go b/src/token/token.go new file mode 100644 index 0000000..1620fde --- /dev/null +++ b/src/token/token.go @@ -0,0 +1,102 @@ +package token + +type TokenType string + +type Token struct { + Type TokenType + Literal string + Line int +} + +const ( + ILLEGAL = "HARAMU" + EOF = "MWISHO" + + // Identifiers + literals + IDENT = "KITAMBULISHI" + INT = "NAMBA" + STRING = "NENO" + FLOAT = "DESIMALI" + + // Operators + ASSIGN = "=" + PLUS = "+" + MINUS = "-" + BANG = "!" + ASTERISK = "*" + POW = "**" + SLASH = "/" + MODULUS = "%" + LT = "<" + LTE = "<=" + GT = ">" + GTE = ">=" + EQ = "==" + NOT_EQ = "!=" + AND = "&&" + OR = "||" + PLUS_ASSIGN = "+=" + PLUS_PLUS = "++" + MINUS_ASSIGN = "-=" + MINUS_MINUS = "--" + ASTERISK_ASSIGN = "*=" + SLASH_ASSIGN = "/=" + MODULUS_ASSIGN = "%=" + + //Delimiters + COMMA = "," + SEMICOLON = ";" + LPAREN = "(" + RPAREN = ")" + LBRACE = "{" + RBRACE = "}" + LBRACKET = "[" + RBRACKET = "]" + COLON = ":" + DOT = "." + + // Keywords + FUNCTION = "FUNCTION" + LET = "FANYA" + TRUE = "KWELI" + FALSE = "SIKWELI" + IF = "KAMA" + ELSE = "SIVYO" + RETURN = "RUDISHA" + WHILE = "WAKATI" + NULL = "TUPU" + BREAK = "VUNJA" + CONTINUE = "ENDELEA" + IN = "KTK" + FOR = "KWA" + SWITCH = "BADILI" + CASE = "IKIWA" + DEFAULT = "KAWAIDA" +) + +var keywords = map[string]TokenType{ + "unda": FUNCTION, + "fanya": LET, + "kweli": TRUE, + "sikweli": FALSE, + "kama": IF, + "au": ELSE, + "sivyo": ELSE, + "wakati": WHILE, + "rudisha": RETURN, + "vunja": BREAK, + "endelea": CONTINUE, + "tupu": NULL, + "ktk": IN, + "kwa": FOR, + "badili": SWITCH, + "ikiwa": CASE, + "kawaida": DEFAULT, +} + +func LookupIdent(ident string) TokenType { + if tok, ok := keywords[ident]; ok { + return tok + } + return IDENT +} diff --git a/token/token.go b/token/token.go deleted file mode 100644 index e9f006d..0000000 --- a/token/token.go +++ /dev/null @@ -1,70 +0,0 @@ -package token - -type TokenType string - -type Token struct { - Type TokenType - Literal string -} - -const ( - ILLEGAL = "HARAMU" - EOF = "MWISHO" - - // Identifiers + literals - IDENT = "KITAMBULISHI" - INT = "NAMBA" - STRING = "NENO" - - // Operators - ASSIGN = "=" - PLUS = "+" - MINUS = "-" - BANG = "!" - ASTERISK = "*" - SLASH = "/" - LT = "<" - GT = ">" - EQ = "==" - NOT_EQ = "!=" - - //Delimiters - COMMA = "," - SEMICOLON = ";" - LPAREN = "(" - RPAREN = ")" - LBRACE = "{" - RBRACE = "}" - LBRACKET = "[" - RBRACKET = "]" - COLON = ":" - - // Keywords - FUNCTION = "FUNCTION" - LET = "ACHA" - TRUE = "KWELI" - FALSE = "SIKWELI" - IF = "KAMA" - ELSE = "SIVYO" - RETURN = "RUDISHA" - WHILE = "WAKATI" -) - -var keywords = map[string]TokenType{ - "fn": FUNCTION, - "acha": LET, - "kweli": TRUE, - "sikweli": FALSE, - "kama": IF, - "au": ELSE, - "sivyo": ELSE, - "wakati": WHILE, - "rudisha": RETURN, -} - -func LookupIdent(ident string) TokenType { - if tok, ok := keywords[ident]; ok { - return tok - } - return IDENT -} From c680940e1d42ebbb9243931fe691f7d58678666c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 22:47:16 +0300 Subject: [PATCH 002/362] Add muda token --- src/token/token.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/token/token.go b/src/token/token.go index 1620fde..9184f45 100644 --- a/src/token/token.go +++ b/src/token/token.go @@ -72,6 +72,7 @@ const ( SWITCH = "BADILI" CASE = "IKIWA" DEFAULT = "KAWAIDA" + TIME = "MUDA" ) var keywords = map[string]TokenType{ @@ -92,6 +93,7 @@ var keywords = map[string]TokenType{ "badili": SWITCH, "ikiwa": CASE, "kawaida": DEFAULT, + "muda": TIME, } func LookupIdent(ident string) TokenType { From cad8dea240e0e672fecd72fe7dce2e92633d7c40 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 22:47:53 +0300 Subject: [PATCH 003/362] Add ability to parse time --- src/parser/statements.go | 2 ++ src/parser/time.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/parser/time.go diff --git a/src/parser/statements.go b/src/parser/statements.go index c129c4f..a32a002 100644 --- a/src/parser/statements.go +++ b/src/parser/statements.go @@ -18,6 +18,8 @@ func (p *Parser) parseStatement() ast.Statement { return p.parseBreak() case token.CONTINUE: return p.parseContinue() + case token.TIME: + return p.parseTime() default: return p.parseExpressionStatement() } diff --git a/src/parser/time.go b/src/parser/time.go new file mode 100644 index 0000000..7ba0b3c --- /dev/null +++ b/src/parser/time.go @@ -0,0 +1,21 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseTime() *ast.Time { + exp := &ast.Time{Token: p.curToken} + if !p.expectPeek(token.DOT) { + return nil + } + p.nextToken() + exp.Method = p.parseExpression(13) + if !p.expectPeek(token.LPAREN) { + return nil + } + exp.Arguments = p.parseExpressionList(token.RPAREN) + + return exp +} From 1ffe43932dfd57ef5095a27314de772f566dba5c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 22:48:16 +0300 Subject: [PATCH 004/362] Add time object --- src/object/object.go | 1 + src/object/time.go | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 src/object/time.go diff --git a/src/object/object.go b/src/object/object.go index e1b8389..f6105dc 100644 --- a/src/object/object.go +++ b/src/object/object.go @@ -21,6 +21,7 @@ const ( CONTINUE_OBJ = "ENDELEA" BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" + TIME_OBJ = "MUDA" ) type Object interface { diff --git a/src/object/time.go b/src/object/time.go new file mode 100644 index 0000000..f6d164a --- /dev/null +++ b/src/object/time.go @@ -0,0 +1,26 @@ +package object + +import ( + "time" +) + +type Time struct { + time string +} + +func (t *Time) Type() ObjectType { return TIME_OBJ } +func (t *Time) Inspect() string { return t.time } +func (t *Time) Method(method string, args []Object) Object { + switch method { + case "hasahivi": + return t.now(args) + + } + return nil +} + +func (t *Time) now(args []Object) Object { + tn := time.Now() + + return &String{Value: tn.Format("2006-01-02 15:04:05")} +} From 929cf4cd69be2481697df182e13fe45eca1557b4 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 22:48:41 +0300 Subject: [PATCH 005/362] Add time ast --- src/ast/ast.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/ast/ast.go b/src/ast/ast.go index 3f6e407..5111b39 100644 --- a/src/ast/ast.go +++ b/src/ast/ast.go @@ -526,3 +526,20 @@ func (me *MethodExpression) String() string { return out.String() } + +type Time struct { + Expression + Token token.Token + Method Expression + Arguments []Expression +} + +func (t *Time) statementNode() {} +func (t *Time) TokenLiteral() string { return t.Token.Literal } +func (t *Time) String() string { + var out bytes.Buffer + + out.WriteString("muda." + t.Method.String()) + + return out.String() +} From 5fb2ee066828819e26e51af373f70d5b93bb34f8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 8 Jan 2023 22:49:04 +0300 Subject: [PATCH 006/362] Add ability to evaluate time --- src/evaluator/evaluator.go | 3 +++ src/evaluator/method.go | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index b7bb4a5..0e80682 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -84,6 +84,9 @@ func Eval(node ast.Node, env *object.Environment) object.Object { case *ast.MethodExpression: return evalMethodExpression(node, env) + case *ast.Time: + return evalTime(node, env) + case *ast.CallExpression: function := Eval(node.Function, env) if isError(function) { diff --git a/src/evaluator/method.go b/src/evaluator/method.go index 884ca85..2eecb36 100644 --- a/src/evaluator/method.go +++ b/src/evaluator/method.go @@ -17,12 +17,25 @@ func evalMethodExpression(node *ast.MethodExpression, env *object.Environment) o return applyMethod(obj, node.Method, args) } +func evalTime(node *ast.Time, env *object.Environment) object.Object { + obj := &object.Time{} + + args := evalExpressions(node.Arguments, env) + if len(args) == 1 && isError(args[0]) { + return args[0] + } + + return applyMethod(obj, node.Method, args) +} + func applyMethod(obj object.Object, method ast.Expression, args []object.Object) object.Object { switch obj := obj.(type) { case *object.String: return obj.Method(method.(*ast.Identifier).Value, args) case *object.File: return obj.Method(method.(*ast.Identifier).Value, args) + case *object.Time: + return obj.Method(method.(*ast.Identifier).Value, args) } return newError("Samahani, %s haina function '%s()'", obj.Inspect(), method.(*ast.Identifier).Value) } From bb9c31e2639bd6bb297a908c357e6ca9a4a4391a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 10 Jan 2023 22:14:04 +0300 Subject: [PATCH 007/362] Remove time from statements --- src/parser/statements.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/parser/statements.go b/src/parser/statements.go index a32a002..c129c4f 100644 --- a/src/parser/statements.go +++ b/src/parser/statements.go @@ -18,8 +18,6 @@ func (p *Parser) parseStatement() ast.Statement { return p.parseBreak() case token.CONTINUE: return p.parseContinue() - case token.TIME: - return p.parseTime() default: return p.parseExpressionStatement() } From c688d4df7c96a50b0f8833b1f25c5c17a641f31f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 10 Jan 2023 22:15:11 +0300 Subject: [PATCH 008/362] Remove return pointer --- src/parser/time.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/time.go b/src/parser/time.go index 7ba0b3c..ee8ad7e 100644 --- a/src/parser/time.go +++ b/src/parser/time.go @@ -5,7 +5,7 @@ import ( "github.com/AvicennaJr/Nuru/token" ) -func (p *Parser) parseTime() *ast.Time { +func (p *Parser) parseTime() ast.Expression { exp := &ast.Time{Token: p.curToken} if !p.expectPeek(token.DOT) { return nil From e310361aa04b685bca302c28d0673fbabf4b7df4 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 10 Jan 2023 22:15:40 +0300 Subject: [PATCH 009/362] Add time to prefix parse --- src/parser/parser.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/parser/parser.go b/src/parser/parser.go index 515397d..cfe6175 100644 --- a/src/parser/parser.go +++ b/src/parser/parser.go @@ -112,6 +112,7 @@ func New(l *lexer.Lexer) *Parser { p.registerPrefix(token.NULL, p.parseNull) p.registerPrefix(token.FOR, p.parseForExpression) p.registerPrefix(token.SWITCH, p.parseSwitchStatement) + p.registerPrefix(token.TIME, p.parseTime) p.infixParseFns = make(map[token.TokenType]infixParseFn) p.registerInfix(token.AND, p.parseInfixExpression) From 299098fa75f426029ad2964107a41d57e15876b6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 00:39:21 +0300 Subject: [PATCH 010/362] Fixed typos --- src/parser/statements.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/statements.go b/src/parser/statements.go index c129c4f..8718130 100644 --- a/src/parser/statements.go +++ b/src/parser/statements.go @@ -11,7 +11,7 @@ func (p *Parser) parseStatement() ast.Statement { // Remember to add switch statements to the language switch p.curToken.Type { case token.LET: - return p.parseLetStatment() + return p.parseLetStatement() case token.RETURN: return p.parseReturnStatement() case token.BREAK: @@ -23,7 +23,7 @@ func (p *Parser) parseStatement() ast.Statement { } } -func (p *Parser) parseLetStatment() *ast.LetStatement { +func (p *Parser) parseLetStatement() *ast.LetStatement { stmt := &ast.LetStatement{Token: p.curToken} if !p.expectPeek(token.IDENT) { From 44efd8c90cb6de2c1bb5887bae6fbe8428379e44 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 00:39:51 +0300 Subject: [PATCH 011/362] Fixed typos --- src/evaluator/block.go | 4 ++-- src/evaluator/builtins.go | 15 ++++++--------- src/evaluator/evaluator.go | 4 ++-- src/evaluator/evaluator_test.go | 6 +++--- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/evaluator/block.go b/src/evaluator/block.go index a7c9447..ba1286a 100644 --- a/src/evaluator/block.go +++ b/src/evaluator/block.go @@ -8,8 +8,8 @@ import ( func evalBlockStatement(block *ast.BlockStatement, env *object.Environment) object.Object { var result object.Object - for _, statment := range block.Statements { - result = Eval(statment, env) + for _, statement := range block.Statements { + result = Eval(statement, env) if result != nil { rt := result.Type() diff --git a/src/evaluator/builtins.go b/src/evaluator/builtins.go index fbf9781..e28335e 100644 --- a/src/evaluator/builtins.go +++ b/src/evaluator/builtins.go @@ -167,17 +167,14 @@ var builtins = map[string]*object.Builtin{ if len(args) == 2 { fileMode := args[1].(*object.String).Value switch fileMode { - case "r": + case "soma": mode = os.O_RDONLY // still buggy, will work on this soon - // case "w": - // mode = os.O_WRONLY - // err := os.Remove(filename) - // if err != nil { - // return &object.Null{} - // } - // case "a": - // mode = os.O_APPEND + case "andika": + mode = os.O_WRONLY + os.Remove(filename) + case "ongeza": + mode = os.O_APPEND default: return newError("Tumeshindwa kufungua file na mode %s", fileMode) } diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index 0e80682..7287397 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -203,8 +203,8 @@ func Eval(node ast.Node, env *object.Environment) object.Object { func evalProgram(program *ast.Program, env *object.Environment) object.Object { var result object.Object - for _, statment := range program.Statements { - result = Eval(statment, env) + for _, statement := range program.Statements { + result = Eval(statement, env) switch result := result.(type) { case *object.ReturnValue: diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 4bd2201..28b46e2 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -279,7 +279,7 @@ func TestFunctionObject(t *testing.T) { } if len(unda.Parameters) != 1 { - t.Fatalf("function haas wrong paramters,Parameters=%+v", unda.Parameters) + t.Fatalf("function has wrong parameters,Parameters=%+v", unda.Parameters) } if unda.Parameters[0].String() != "x" { @@ -373,12 +373,12 @@ func TestBuiltinFunctions(t *testing.T) { for _, tt := range tests { evaluated := testEval(tt.input) - + switch expected := tt.expected.(type) { case int: testIntegerObject(t, evaluated, int64(expected)) case float64: - testFloatObject(t, evaluated, float64(expected)) + testFloatObject(t, evaluated, float64(expected)) case string: errObj, ok := evaluated.(*object.Error) From a936bc3b0164f329d8d67531eef6afc2fc43cf6f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 00:42:18 +0300 Subject: [PATCH 012/362] Add function to read, write and close files --- src/object/file.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/object/file.go b/src/object/file.go index 7b3c744..f2cfc21 100644 --- a/src/object/file.go +++ b/src/object/file.go @@ -19,6 +19,8 @@ func (f *File) Method(method string, args []Object) Object { switch method { case "soma": return f.read(args) + case "andika": + return f.write(args) case "funga": return f.close(args) } @@ -36,6 +38,22 @@ func (f *File) read(args []Object) Object { return &String{Value: string(txt)} } +func (f *File) write(args []Object) Object { + if len(args) != 1 { + return newError("Samahani, tunahitaji Hoja 1, wewe umeweka %d", len(args)) + } + if f.Writer == nil { + return nil + } + text := args[0].Inspect() + count, err := f.Writer.Write([]byte(text)) + if err != nil { + return nil + } + _ = f.Writer.Flush() + return &Integer{Value: int64(count)} +} + func (f *File) close(args []Object) Object { if len(args) != 0 { return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) From 1df4f9a4747024786637671c9e225a9b251afe92 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 00:42:50 +0300 Subject: [PATCH 013/362] Add test builds --- src/Makefile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Makefile b/src/Makefile index 08ffece..03fa2e3 100644 --- a/src/Makefile +++ b/src/Makefile @@ -13,6 +13,10 @@ build_android: tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru rm nuru +build_test: + go build -o test + mv test testbinaries/ + test: go test ./parser/ go test ./ast/ From 0a4c4c6204bcd334a5c79fd9d3bb048119ae6b70 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:45:47 +0300 Subject: [PATCH 014/362] Add import token --- src/token/token.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/token/token.go b/src/token/token.go index 9184f45..42e9f6f 100644 --- a/src/token/token.go +++ b/src/token/token.go @@ -73,6 +73,7 @@ const ( CASE = "IKIWA" DEFAULT = "KAWAIDA" TIME = "MUDA" + IMPORT = "TUMIA" ) var keywords = map[string]TokenType{ @@ -94,6 +95,7 @@ var keywords = map[string]TokenType{ "ikiwa": CASE, "kawaida": DEFAULT, "muda": TIME, + "tumia": IMPORT, } func LookupIdent(ident string) TokenType { From cb3df2a644679648eccd1d60fa54b4e15f09eb62 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:46:20 +0300 Subject: [PATCH 015/362] Add parse import function --- src/parser/import.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/parser/import.go diff --git a/src/parser/import.go b/src/parser/import.go new file mode 100644 index 0000000..2a8027b --- /dev/null +++ b/src/parser/import.go @@ -0,0 +1,24 @@ +package parser + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/token" +) + +func (p *Parser) parseImport() ast.Expression { + exp := &ast.Import{Token: p.curToken} + exp.Identifiers = make(map[string]*ast.Identifier) + for p.curToken.Line == p.peekToken.Line { + p.nextToken() + identifier := &ast.Identifier{Value: p.curToken.Literal} + exp.Identifiers[p.curToken.Literal] = identifier + if p.peekTokenIs(token.COMMA) { + p.nextToken() + } + if p.peekTokenIs(token.EOF) { + break + } + } + + return exp +} From 4885a94edfc9bef0924779950df2a1c87bf549a2 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:46:36 +0300 Subject: [PATCH 016/362] Add ability to parse import --- src/parser/parser.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/parser/parser.go b/src/parser/parser.go index cfe6175..9d74484 100644 --- a/src/parser/parser.go +++ b/src/parser/parser.go @@ -113,6 +113,7 @@ func New(l *lexer.Lexer) *Parser { p.registerPrefix(token.FOR, p.parseForExpression) p.registerPrefix(token.SWITCH, p.parseSwitchStatement) p.registerPrefix(token.TIME, p.parseTime) + p.registerPrefix(token.IMPORT, p.parseImport) p.infixParseFns = make(map[token.TokenType]infixParseFn) p.registerInfix(token.AND, p.parseInfixExpression) From ddaec805ac5abce62f6ffd069a14a6f68882afd9 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:47:16 +0300 Subject: [PATCH 017/362] Add import abstract syntax tree --- src/ast/ast.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ast/ast.go b/src/ast/ast.go index 5111b39..3b9aacd 100644 --- a/src/ast/ast.go +++ b/src/ast/ast.go @@ -543,3 +543,9 @@ func (t *Time) String() string { return out.String() } + +type Import struct { + Expression + Token token.Token + Identifiers map[string]*Identifier +} From 9a05087854da19edd86a4965165a0a5a8dcc10b8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:47:57 +0300 Subject: [PATCH 018/362] Add evaluate import function --- src/evaluator/import.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/evaluator/import.go diff --git a/src/evaluator/import.go b/src/evaluator/import.go new file mode 100644 index 0000000..6c2f0f0 --- /dev/null +++ b/src/evaluator/import.go @@ -0,0 +1,19 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/module" + "github.com/AvicennaJr/Nuru/object" +) + +func evalImport(node *ast.Import, env *object.Environment) object.Object { + for k, v := range node.Identifiers { + if mod, ok := module.Mapper[v.Value]; ok { + env.Set(k, mod) + } else { + return newError("Mstari %d: Module '%s' haipo", node.Token.Line, v.Value) + } + } + + return NULL +} From c627d201c542f86cc823563dac37290d66bcc977 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:48:37 +0300 Subject: [PATCH 019/362] Add ability to evaluate import --- src/evaluator/evaluator.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index 7287397..72d990e 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -86,6 +86,8 @@ func Eval(node ast.Node, env *object.Environment) object.Object { case *ast.Time: return evalTime(node, env) + case *ast.Import: + return evalImport(node, env) case *ast.CallExpression: function := Eval(node.Function, env) From 0f0d85e9dbec90eb587acec2627aa2976e52390a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:49:57 +0300 Subject: [PATCH 020/362] Add ability to evaluate module objects --- src/evaluator/method.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/evaluator/method.go b/src/evaluator/method.go index 2eecb36..8bd6dfb 100644 --- a/src/evaluator/method.go +++ b/src/evaluator/method.go @@ -36,6 +36,10 @@ func applyMethod(obj object.Object, method ast.Expression, args []object.Object) return obj.Method(method.(*ast.Identifier).Value, args) case *object.Time: return obj.Method(method.(*ast.Identifier).Value, args) + case *object.Module: + if fn, ok := obj.Functions[method.(*ast.Identifier).Value]; ok { + return fn(args) + } } return newError("Samahani, %s haina function '%s()'", obj.Inspect(), method.(*ast.Identifier).Value) } From 9f6ed151751194ddabe3010dd3a8965dcd8fdd38 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:50:25 +0300 Subject: [PATCH 021/362] Add module object --- src/object/module.go | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/object/module.go diff --git a/src/object/module.go b/src/object/module.go new file mode 100644 index 0000000..2a708be --- /dev/null +++ b/src/object/module.go @@ -0,0 +1,11 @@ +package object + +type ModuleFunction func(args []Object) Object + +type Module struct { + Name string + Functions map[string]ModuleFunction +} + +func (m *Module) Type() ObjectType { return MODULE_OBJ } +func (m *Module) Inspect() string { return "Module: " + m.Name } From 84f2ef8cd3ee4bfff3ba58a0a05feab4bb6ffe4f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:50:43 +0300 Subject: [PATCH 022/362] Add module object to definitions --- src/object/object.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/object/object.go b/src/object/object.go index f6105dc..1989ff3 100644 --- a/src/object/object.go +++ b/src/object/object.go @@ -22,6 +22,7 @@ const ( BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" TIME_OBJ = "MUDA" + MODULE_OBJ = "MODULE" ) type Object interface { From 2331ab269722c3db3dc076b582389f91ebdfaefd Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:51:05 +0300 Subject: [PATCH 023/362] Add module package --- src/module/module.go | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/module/module.go diff --git a/src/module/module.go b/src/module/module.go new file mode 100644 index 0000000..f084a08 --- /dev/null +++ b/src/module/module.go @@ -0,0 +1,9 @@ +package module + +import "github.com/AvicennaJr/Nuru/object" + +var Mapper = map[string]*object.Module{} + +func init() { + Mapper["os"] = &object.Module{Name: "os", Functions: OsFunctions} +} From cfc9011b8c99359edbd17b91fd4d6cd1af2fcf6b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 22:51:22 +0300 Subject: [PATCH 024/362] Add os module --- src/module/os.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/module/os.go diff --git a/src/module/os.go b/src/module/os.go new file mode 100644 index 0000000..a2b9cde --- /dev/null +++ b/src/module/os.go @@ -0,0 +1,23 @@ +package module + +import ( + "os" + + "github.com/AvicennaJr/Nuru/object" +) + +var OsFunctions = map[string]object.ModuleFunction{} + +func init() { + OsFunctions["toka"] = exit +} + +func exit(args []object.Object) object.Object { + if len(args) != 0 { + return &object.Null{} + } + + os.Exit(0) + + return nil +} From 7c0f1838025a3a0db933cd294ca60bc85ca36c5f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:02:48 +0300 Subject: [PATCH 025/362] remove time from tokens --- src/token/token.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/token/token.go b/src/token/token.go index 42e9f6f..732ee61 100644 --- a/src/token/token.go +++ b/src/token/token.go @@ -72,7 +72,6 @@ const ( SWITCH = "BADILI" CASE = "IKIWA" DEFAULT = "KAWAIDA" - TIME = "MUDA" IMPORT = "TUMIA" ) @@ -94,7 +93,6 @@ var keywords = map[string]TokenType{ "badili": SWITCH, "ikiwa": CASE, "kawaida": DEFAULT, - "muda": TIME, "tumia": IMPORT, } From 9f515b0094306eb6900ac82c1f9be434862c80bf Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:03:35 +0300 Subject: [PATCH 026/362] Remove time from parsing --- src/parser/parser.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/parser/parser.go b/src/parser/parser.go index 9d74484..50fab2b 100644 --- a/src/parser/parser.go +++ b/src/parser/parser.go @@ -112,7 +112,6 @@ func New(l *lexer.Lexer) *Parser { p.registerPrefix(token.NULL, p.parseNull) p.registerPrefix(token.FOR, p.parseForExpression) p.registerPrefix(token.SWITCH, p.parseSwitchStatement) - p.registerPrefix(token.TIME, p.parseTime) p.registerPrefix(token.IMPORT, p.parseImport) p.infixParseFns = make(map[token.TokenType]infixParseFn) From 8b7fe4ae0acee96796d92111de661eef34d5df35 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:04:29 +0300 Subject: [PATCH 027/362] Remove Time from abstract syntax tree --- src/ast/ast.go | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/ast/ast.go b/src/ast/ast.go index 3b9aacd..ee505c2 100644 --- a/src/ast/ast.go +++ b/src/ast/ast.go @@ -527,23 +527,6 @@ func (me *MethodExpression) String() string { return out.String() } -type Time struct { - Expression - Token token.Token - Method Expression - Arguments []Expression -} - -func (t *Time) statementNode() {} -func (t *Time) TokenLiteral() string { return t.Token.Literal } -func (t *Time) String() string { - var out bytes.Buffer - - out.WriteString("muda." + t.Method.String()) - - return out.String() -} - type Import struct { Expression Token token.Token From 85390bb9be4399e68428eabddeaed8e8da8be3e6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:05:02 +0300 Subject: [PATCH 028/362] Remove time from evaluation --- src/evaluator/evaluator.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index 72d990e..4b5ee62 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -84,8 +84,6 @@ func Eval(node ast.Node, env *object.Environment) object.Object { case *ast.MethodExpression: return evalMethodExpression(node, env) - case *ast.Time: - return evalTime(node, env) case *ast.Import: return evalImport(node, env) From e70d82c54ecdbcd7732e7e94be85dc1ba5ae0fe7 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:05:58 +0300 Subject: [PATCH 029/362] Remove time from methods --- src/evaluator/method.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/evaluator/method.go b/src/evaluator/method.go index 8bd6dfb..92477d7 100644 --- a/src/evaluator/method.go +++ b/src/evaluator/method.go @@ -17,25 +17,12 @@ func evalMethodExpression(node *ast.MethodExpression, env *object.Environment) o return applyMethod(obj, node.Method, args) } -func evalTime(node *ast.Time, env *object.Environment) object.Object { - obj := &object.Time{} - - args := evalExpressions(node.Arguments, env) - if len(args) == 1 && isError(args[0]) { - return args[0] - } - - return applyMethod(obj, node.Method, args) -} - func applyMethod(obj object.Object, method ast.Expression, args []object.Object) object.Object { switch obj := obj.(type) { case *object.String: return obj.Method(method.(*ast.Identifier).Value, args) case *object.File: return obj.Method(method.(*ast.Identifier).Value, args) - case *object.Time: - return obj.Method(method.(*ast.Identifier).Value, args) case *object.Module: if fn, ok := obj.Functions[method.(*ast.Identifier).Value]; ok { return fn(args) From 0fda81bbaf2fded54b8d7e8246f75b2ea35d156a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:06:38 +0300 Subject: [PATCH 030/362] Add time module --- src/module/time.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/module/time.go diff --git a/src/module/time.go b/src/module/time.go new file mode 100644 index 0000000..e2b3fa4 --- /dev/null +++ b/src/module/time.go @@ -0,0 +1,19 @@ +package module + +import ( + "time" + + "github.com/AvicennaJr/Nuru/object" +) + +var TimeFunctions = map[string]object.ModuleFunction{} + +func init() { + TimeFunctions["hasahivi"] = now +} + +func now(args []object.Object) object.Object { + tn := time.Now() + + return &object.String{Value: tn.Format("2006-01-02 15:04:05")} +} From 00c4d89a993428ce5dd5247e37b407f080626368 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:06:52 +0300 Subject: [PATCH 031/362] Add time to module list --- src/module/module.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/module/module.go b/src/module/module.go index f084a08..188234d 100644 --- a/src/module/module.go +++ b/src/module/module.go @@ -6,4 +6,5 @@ var Mapper = map[string]*object.Module{} func init() { Mapper["os"] = &object.Module{Name: "os", Functions: OsFunctions} + Mapper["muda"] = &object.Module{Name: "time", Functions: TimeFunctions} } From 3cdeea83be4e9caf485ef68088a65af852a0086c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:08:01 +0300 Subject: [PATCH 032/362] Remove time from object list --- src/object/object.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/object/object.go b/src/object/object.go index 1989ff3..5f77253 100644 --- a/src/object/object.go +++ b/src/object/object.go @@ -21,7 +21,6 @@ const ( CONTINUE_OBJ = "ENDELEA" BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" - TIME_OBJ = "MUDA" MODULE_OBJ = "MODULE" ) From 02dde8020a49c996cf482e6b9f9a7f13b51ced1a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 11 Jan 2023 23:09:55 +0300 Subject: [PATCH 033/362] Delete 'time.go' from parser and objects They are no longer needed since time is now a module and not an object --- src/object/time.go | 26 -------------------------- src/parser/time.go | 21 --------------------- 2 files changed, 47 deletions(-) delete mode 100644 src/object/time.go delete mode 100644 src/parser/time.go diff --git a/src/object/time.go b/src/object/time.go deleted file mode 100644 index f6d164a..0000000 --- a/src/object/time.go +++ /dev/null @@ -1,26 +0,0 @@ -package object - -import ( - "time" -) - -type Time struct { - time string -} - -func (t *Time) Type() ObjectType { return TIME_OBJ } -func (t *Time) Inspect() string { return t.time } -func (t *Time) Method(method string, args []Object) Object { - switch method { - case "hasahivi": - return t.now(args) - - } - return nil -} - -func (t *Time) now(args []Object) Object { - tn := time.Now() - - return &String{Value: tn.Format("2006-01-02 15:04:05")} -} diff --git a/src/parser/time.go b/src/parser/time.go deleted file mode 100644 index ee8ad7e..0000000 --- a/src/parser/time.go +++ /dev/null @@ -1,21 +0,0 @@ -package parser - -import ( - "github.com/AvicennaJr/Nuru/ast" - "github.com/AvicennaJr/Nuru/token" -) - -func (p *Parser) parseTime() ast.Expression { - exp := &ast.Time{Token: p.curToken} - if !p.expectPeek(token.DOT) { - return nil - } - p.nextToken() - exp.Method = p.parseExpression(13) - if !p.expectPeek(token.LPAREN) { - return nil - } - exp.Arguments = p.parseExpressionList(token.RPAREN) - - return exp -} From d24ffb05730e24b900c817e27ecc7d11039e8264 Mon Sep 17 00:00:00 2001 From: Hopertz Date: Thu, 12 Jan 2023 15:37:36 +0300 Subject: [PATCH 034/362] Add check arguments in hasahivi --- src/module/time.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/module/time.go b/src/module/time.go index e2b3fa4..15be2cd 100644 --- a/src/module/time.go +++ b/src/module/time.go @@ -13,6 +13,10 @@ func init() { } func now(args []object.Object) object.Object { + if len(args) != 0 { + return &object.Error{Message : "hatuhitaji hoja kwenye hasahivi"} + } + tn := time.Now() return &object.String{Value: tn.Format("2006-01-02 15:04:05")} From da08ebd357a04bca65f55f5345b4e99b31400a1a Mon Sep 17 00:00:00 2001 From: Hopertz Date: Thu, 12 Jan 2023 15:43:33 +0300 Subject: [PATCH 035/362] ongeza lala method --- src/module/time.go | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/module/time.go b/src/module/time.go index 15be2cd..8674a8d 100644 --- a/src/module/time.go +++ b/src/module/time.go @@ -1,6 +1,7 @@ package module import ( + "strconv" "time" "github.com/AvicennaJr/Nuru/object" @@ -10,14 +11,32 @@ var TimeFunctions = map[string]object.ModuleFunction{} func init() { TimeFunctions["hasahivi"] = now + TimeFunctions["lala"] = sleep } func now(args []object.Object) object.Object { if len(args) != 0 { - return &object.Error{Message : "hatuhitaji hoja kwenye hasahivi"} + return &object.Error{Message: "hatuhitaji hoja kwenye hasahivi"} } - + tn := time.Now() return &object.String{Value: tn.Format("2006-01-02 15:04:05")} } + +func sleep(args []object.Object) object.Object { + if len(args) != 1 { + return &object.Error{Message: "tunahitaji hoja moja tu kwenye "} + } + + objvalue := args[0].Inspect() + inttime, err := strconv.Atoi(objvalue) + + if err != nil { + return &object.Error{Message: "namba tu zinaruhusiwa kwenye hoja"} + } + + time.Sleep(time.Duration(inttime) * time.Second) + + return nil +} From 47b602258db0e494177bd1905bd3214c489df58a Mon Sep 17 00:00:00 2001 From: Hopertz Date: Thu, 12 Jan 2023 16:45:23 +0300 Subject: [PATCH 036/362] ongeza tangu method --- src/module/time.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/module/time.go b/src/module/time.go index 8674a8d..370fbca 100644 --- a/src/module/time.go +++ b/src/module/time.go @@ -12,6 +12,7 @@ var TimeFunctions = map[string]object.ModuleFunction{} func init() { TimeFunctions["hasahivi"] = now TimeFunctions["lala"] = sleep + TimeFunctions["tangu"] = since } func now(args []object.Object) object.Object { @@ -40,3 +41,29 @@ func sleep(args []object.Object) object.Object { return nil } + +func since(args []object.Object) object.Object { + + if len(args) != 1 { + return &object.Error{Message : "tunahitaji hoja moja tu kwenye "} + } + + t, err := time.Parse("2006-01-02 15:04:05", args[0].Inspect()) + + if err != nil { + + return &object.Error{Message : "tumeshindwa kuparse hoja zako"} + } + + + current_time := time.Now().Format("2006-01-02 15:04:05") + ct, _ := time.Parse("2006-01-02 15:04:05", current_time ) + + + + diff := ct.Sub(t) + durationInSeconds := diff.Seconds() + + + return &object.Float{Value: durationInSeconds} + } \ No newline at end of file From f4ea0cae5e9fc6f7b5937113113555d8decaa529 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:12:31 +0300 Subject: [PATCH 037/362] Add readme for extensions --- extensions/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 extensions/README.md diff --git a/extensions/README.md b/extensions/README.md new file mode 100644 index 0000000..e69de29 From 659da3d936ddd0f0eee80618525f86c1b2d92fe1 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:13:02 +0300 Subject: [PATCH 038/362] Package json file for the extension --- extensions/vscode/package.json | 35 ++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 extensions/vscode/package.json diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json new file mode 100644 index 0000000..736cee1 --- /dev/null +++ b/extensions/vscode/package.json @@ -0,0 +1,35 @@ +{ + "name": "nuru", + "displayName": "Nuru", + "description": "Nuru Programming Language", + "version": "0.0.1", + "engines": { + "vscode": "^1.74.0" + }, + "categories": [ + "Programming Languages" + ], + "contributes": { + "languages": [ + { + "id": "nuru", + "aliases": [ + "Nuru Programming Language", + "nuru" + ], + "extensions": [ + ".nr", + ".sw" + ], + "configuration": "./language-configuration.json" + } + ], + "grammars": [ + { + "language": "nuru", + "scopeName": "source.nr", + "path": "./syntaxes/nuru.tmLanguage.json" + } + ] + } +} \ No newline at end of file From 85645374c757b2298ff4347d33e3a79d8f9aa0ff Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:13:29 +0300 Subject: [PATCH 039/362] Add language configuration' --- extensions/vscode/language-configuration.json | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 extensions/vscode/language-configuration.json diff --git a/extensions/vscode/language-configuration.json b/extensions/vscode/language-configuration.json new file mode 100644 index 0000000..07cc94f --- /dev/null +++ b/extensions/vscode/language-configuration.json @@ -0,0 +1,72 @@ +{ + "comments": { + // symbol used for single line comment. Remove this entry if your language does not support line comments + "lineComment": "//", + // symbols used for start and end a block comment. Remove this entry if your language does not support block comments + "blockComment": [ + "/*", + "*/" + ] + }, + // symbols used as brackets + "brackets": [ + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ] + ], + // symbols that are auto closed when typing + "autoClosingPairs": [ + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "\"", + "\"" + ], + [ + "'", + "'" + ] + ], + // symbols that can be used to surround a selection + "surroundingPairs": [ + [ + "{", + "}" + ], + [ + "[", + "]" + ], + [ + "(", + ")" + ], + [ + "\"", + "\"" + ], + [ + "'", + "'" + ] + ] +} \ No newline at end of file From e75315ebd7c3c823194c2c983f346bb164a0b20c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:14:15 +0300 Subject: [PATCH 040/362] Add nuru specific configurations --- .../vscode/syntaxes/nuru.tmLanguage.json | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 extensions/vscode/syntaxes/nuru.tmLanguage.json diff --git a/extensions/vscode/syntaxes/nuru.tmLanguage.json b/extensions/vscode/syntaxes/nuru.tmLanguage.json new file mode 100644 index 0000000..17ef83c --- /dev/null +++ b/extensions/vscode/syntaxes/nuru.tmLanguage.json @@ -0,0 +1,156 @@ +{ + "$schema": "https://raw.githubusercontent.com/martinring/tmlanguage/master/tmlanguage.json", + "name": "Nuru Programming Language", + "scopeName": "source.nr", + "fileTypes": [ + "nr" + ], + "patterns": [ + { + "include": "#linecomments" + }, + { + "include": "#blockcomments" + }, + { + "include": "#operators" + }, + { + "include": "#punctuation" + }, + { + "include": "#numbers" + }, + { + "include": "#constant" + }, + { + "include": "#keywords" + }, + { + "include": "#strings" + }, + { + "include": "#identifiers" + } + ], + "repository": { + "linecomments": { + "name": "comment.line.double-slash.nuru", + "match": "(//).*$\n?", + "captures": { + "1": { + "name": "punctuation.definition.comment.nuru" + } + } + }, + "blockcomments": { + "name": "comment.block.nuru", + "begin": "/\\*", + "end": "\\*/", + "captures": { + "0": { + "name": "punctuation.definition.comment.nuru" + } + } + }, + "numbers": { + "name": "constant.numeric.nuru", + "match": "\\b[0-9]+(\\.[0-9]+)?\\b" + }, + "constant": { + "name": "constant.language.nuru", + "match": "\\b(kweli|sikweli)\\b" + }, + "operators": { + "patterns": [ + { + "name": "keyword.operator.arithmetic.nuru", + "match": "\\b(\\+|\\-|%|\\*|\\/|\\^)\\b" + }, + { + "name": "keyword.operator.logical.nuru", + "match": "\\b(==|<=|>=|<|>|&&|\\|\\|)\\b" + }, + { + "name": "keyword.operator.assignment.nuru", + "match": "\\b(=|:)\\b" + }, + { + "name": "punctuation.accessor.nuru", + "match": "\\." + } + ] + }, + "punctuation": { + "patterns": [ + { + "name": "punctuation.separator", + "match": "," + }, + { + "include": "#groups" + } + ] + }, + "keywords": { + "patterns": [ + { + "name": "storage.type.function.nuru", + "match": "\\b(unda|andika|idadi|jumla|yamwisho|sukuma|jaza|aina|fungua)\\b" + }, + { + "name": "storage.type.nuru", + "match": "\\bfanya\\b" + }, + { + "name": "keyword.control.nuru", + "match": "\\b(kama|au|sivyo|wakati|rudisha|vunja|endelea|tupu|ktk|kwa|badili|ikiwa|kawaida|tumia)\\b" + }, + { + "name": "support.function.nuru", + "match": "\\b(os|muda)\\b" + } + ] + }, + "identifiers": { + "patterns": [ + { + "name": "meta.functioncall.nuru", + "match": "\\b([_A-Za-z][_A-Za-z0-9]*)\\b(?=\\()", + "captures": { + "1": { + "name": "entity.name.function.nuru" + } + } + } + ] + }, + "strings": { + "patterns": [ + { + "name": "string.quoted.double.nuru", + "begin": "\"", + "end": "\"", + "patterns": [ + { + "name": "constant.character.escape.nuru", + "match": "\\\\." + } + ] + }, + { + "name": "string.quoted.single.nuru", + "begin": "\\'", + "end": "\\'", + "patterns": [ + { + "name": "constant.character.escape.nuru", + "match": "\\\\." + } + ] + } + ] + } + } +} \ No newline at end of file From 48b332d1fcdcefb9634453e6ca23ff7de5a6097b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:14:49 +0300 Subject: [PATCH 041/362] Add Readme for vscode extension --- extensions/vscode/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 extensions/vscode/README.md diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md new file mode 100644 index 0000000..35e0956 --- /dev/null +++ b/extensions/vscode/README.md @@ -0,0 +1,8 @@ +# Nuru VSCode Extension + +This is a syntax highliting extension for Nuru on vscode. + +## Screenshots +

+Nuru Programming Language +

\ No newline at end of file From 616bbd5b056efd668ea6b6decc71d41139464262 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:15:23 +0300 Subject: [PATCH 042/362] Add sample screenshot of extension --- extensions/vscode/assets/screenshot.png | Bin 0 -> 46522 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 extensions/vscode/assets/screenshot.png diff --git a/extensions/vscode/assets/screenshot.png b/extensions/vscode/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c115919a2fecf1fdbe48909ccc8bb91394a775ab GIT binary patch literal 46522 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 literal 0 HcmV?d00001 From ca76724ea4abb942f8a51b1754b878a5c2b98263 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:16:01 +0300 Subject: [PATCH 043/362] Add Changelog --- extensions/vscode/CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 extensions/vscode/CHANGELOG.md diff --git a/extensions/vscode/CHANGELOG.md b/extensions/vscode/CHANGELOG.md new file mode 100644 index 0000000..f0f7836 --- /dev/null +++ b/extensions/vscode/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "nuru" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file From 8fa8b9920794998e8fa001b08ee37083011b9de3 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:28:35 +0300 Subject: [PATCH 044/362] Update Extension Readme --- extensions/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/README.md b/extensions/README.md index e69de29..a0c0a80 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -0,0 +1,5 @@ +# Nuru Extensions For Various Editors + +## [VSCODE](./vscode/README.md) + +Nuru syntax highlighting on VSCode \ No newline at end of file From ccbd6370e7e10075a6da24441f9e57a7b6026c01 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:30:19 +0300 Subject: [PATCH 045/362] Update Extension Readme --- extensions/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/README.md b/extensions/README.md index a0c0a80..b466671 100644 --- a/extensions/README.md +++ b/extensions/README.md @@ -1,5 +1,5 @@ # Nuru Extensions For Various Editors -## [VSCODE](./vscode/README.md) +## [VSCODE](./vscode/) Nuru syntax highlighting on VSCode \ No newline at end of file From f06ed30ebae5da1a724673ec66d74d570648fb11 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 22:49:47 +0300 Subject: [PATCH 046/362] Update installation guide --- extensions/vscode/README.md | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md index 35e0956..ba422b8 100644 --- a/extensions/vscode/README.md +++ b/extensions/vscode/README.md @@ -1,8 +1,20 @@ # Nuru VSCode Extension -This is a syntax highliting extension for Nuru on vscode. +This is a syntax highliting extension for Nuru on vscode. It detects `.nr` and `.sw` files. ## Screenshots

Nuru Programming Language -

\ No newline at end of file +

+ +## How To Install + +### Windows + +- Copy the whole [vscode folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode) and paste it in the VSCode extensions directory found in `%USERPROFILE%\.vscode\extensions` +- Restart VSCode + +### Linux and MacOS + +- Copy the whole [vscode folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode) and paste it in the VSCode extensions directory found in `~/.vscode/extensions` +- Restart VSCode From e41616b56060057b548551a724bdcbadc56fab18 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 12 Jan 2023 23:21:23 +0300 Subject: [PATCH 047/362] Restructured installation instructions Made installation instructions more clearer --- extensions/vscode/README.md | 4 ++-- extensions/vscode/{ => nuru}/language-configuration.json | 0 extensions/vscode/{ => nuru}/package.json | 0 extensions/vscode/{ => nuru}/syntaxes/nuru.tmLanguage.json | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename extensions/vscode/{ => nuru}/language-configuration.json (100%) rename extensions/vscode/{ => nuru}/package.json (100%) rename extensions/vscode/{ => nuru}/syntaxes/nuru.tmLanguage.json (100%) diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md index ba422b8..2734170 100644 --- a/extensions/vscode/README.md +++ b/extensions/vscode/README.md @@ -11,10 +11,10 @@ This is a syntax highliting extension for Nuru on vscode. It detects `.nr` and ` ### Windows -- Copy the whole [vscode folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode) and paste it in the VSCode extensions directory found in `%USERPROFILE%\.vscode\extensions` +- Copy the whole [nuru folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode/nuru) and paste it in the VSCode extensions directory found in `%USERPROFILE%\.vscode\extensions` - Restart VSCode ### Linux and MacOS -- Copy the whole [vscode folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode) and paste it in the VSCode extensions directory found in `~/.vscode/extensions` +- Copy the whole [nuru folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode/nuru) and paste it in the VSCode extensions directory found in `~/.vscode/extensions` - Restart VSCode diff --git a/extensions/vscode/language-configuration.json b/extensions/vscode/nuru/language-configuration.json similarity index 100% rename from extensions/vscode/language-configuration.json rename to extensions/vscode/nuru/language-configuration.json diff --git a/extensions/vscode/package.json b/extensions/vscode/nuru/package.json similarity index 100% rename from extensions/vscode/package.json rename to extensions/vscode/nuru/package.json diff --git a/extensions/vscode/syntaxes/nuru.tmLanguage.json b/extensions/vscode/nuru/syntaxes/nuru.tmLanguage.json similarity index 100% rename from extensions/vscode/syntaxes/nuru.tmLanguage.json rename to extensions/vscode/nuru/syntaxes/nuru.tmLanguage.json From a7dec101879af428d0886c483dd65c5c49974de8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sat, 14 Jan 2023 16:44:52 +0300 Subject: [PATCH 048/362] Update vscode extension guide --- extensions/vscode/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md index 2734170..7896dd8 100644 --- a/extensions/vscode/README.md +++ b/extensions/vscode/README.md @@ -9,6 +9,10 @@ This is a syntax highliting extension for Nuru on vscode. It detects `.nr` and ` ## How To Install +### Download From Market Place + +- Simply download the Nuru Extension from VSCode Market Place + ### Windows - Copy the whole [nuru folder](https://github.com/AvicennaJr/Nuru/tree/main/extensions/vscode/nuru) and paste it in the VSCode extensions directory found in `%USERPROFILE%\.vscode\extensions` From 35258f18ac70527219b758f8d361e3c1d6dc1e0e Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 12:04:12 +0300 Subject: [PATCH 049/362] Add Mac build --- src/Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Makefile b/src/Makefile index 03fa2e3..5fc75ed 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,6 +8,11 @@ build_linux: build_windows: env GOOS=windows GOARCH=amd64 go build -o nuru_windows_amd64_v${VERSION}.exe +build_mac: + env GOOS=darwin GOARCH=amd64 go build -o nuru + tar -zcvf nuru_mac_amd64_v${VERSION}.tar.gz nuru + rm nuru + build_android: env GOOS=android GOARCH=arm64 go build -o nuru tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru From 541bcc3d5b7fed55278becaaf83d5091ed5db337 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 21:58:01 +0300 Subject: [PATCH 050/362] Fixed issue #35: Support for unicode characters --- src/lexer/lexer.go | 98 +++++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/src/lexer/lexer.go b/src/lexer/lexer.go index 02b07db..f789b06 100644 --- a/src/lexer/lexer.go +++ b/src/lexer/lexer.go @@ -5,15 +5,15 @@ import ( ) type Lexer struct { - input string + input []rune position int readPosition int - ch byte + ch rune line int } func New(input string) *Lexer { - l := &Lexer{input: input} + l := &Lexer{input: []rune(input)} l.readChar() return l } @@ -32,132 +32,132 @@ func (l *Lexer) readChar() { func (l *Lexer) NextToken() token.Token { var tok token.Token l.skipWhitespace() - if l.ch == '/' && l.peekChar() == '/' { + if l.ch == rune('/') && l.peekChar() == rune('/') { l.skipSingleLineComment() return l.NextToken() } - if l.ch == '/' && l.peekChar() == '*' { + if l.ch == rune('/') && l.peekChar() == rune('*') { l.skipMultiLineComment() return l.NextToken() } switch l.ch { - case '=': - if l.peekChar() == '=' { + case rune('='): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.EQ, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.ASSIGN, l.line, l.ch) } - case ';': + case rune(';'): tok = newToken(token.SEMICOLON, l.line, l.ch) - case '(': + case rune('('): tok = newToken(token.LPAREN, l.line, l.ch) - case ')': + case rune(')'): tok = newToken(token.RPAREN, l.line, l.ch) - case '{': + case rune('{'): tok = newToken(token.LBRACE, l.line, l.ch) - case '}': + case rune('}'): tok = newToken(token.RBRACE, l.line, l.ch) - case ',': + case rune(','): tok = newToken(token.COMMA, l.line, l.ch) - case '+': - if l.peekChar() == '=' { + case rune('+'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.PLUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} - } else if l.peekChar() == '+' { + } else if l.peekChar() == rune('+') { ch := l.ch l.readChar() tok = token.Token{Type: token.PLUS_PLUS, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.PLUS, l.line, l.ch) } - case '-': - if l.peekChar() == '=' { + case rune('-'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.MINUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} - } else if l.peekChar() == '-' { + } else if l.peekChar() == rune('-') { ch := l.ch l.readChar() tok = token.Token{Type: token.MINUS_MINUS, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.MINUS, l.line, l.ch) } - case '!': - if l.peekChar() == '=' { + case rune('!'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.NOT_EQ, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.BANG, l.line, l.ch) } - case '/': - if l.peekChar() == '=' { + case rune('/'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.SLASH_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} } else { tok = newToken(token.SLASH, l.line, l.ch) } - case '*': - if l.peekChar() == '=' { + case rune('*'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.ASTERISK_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} - } else if l.peekChar() == '*' { + } else if l.peekChar() == rune('*') { ch := l.ch l.readChar() tok = token.Token{Type: token.POW, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.ASTERISK, l.line, l.ch) } - case '<': - if l.peekChar() == '=' { + case rune('<'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.LTE, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.LT, l.line, l.ch) } - case '>': - if l.peekChar() == '=' { + case rune('>'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.GTE, Literal: string(ch) + string(l.ch), Line: l.line} } else { tok = newToken(token.GT, l.line, l.ch) } - case '"': + case rune('"'): tok.Type = token.STRING tok.Literal = l.readString() tok.Line = l.line - case '\'': + case rune('\''): tok = token.Token{Type: token.STRING, Literal: l.readSingleQuoteString(), Line: l.line} - case '[': + case rune('['): tok = newToken(token.LBRACKET, l.line, l.ch) - case ']': + case rune(']'): tok = newToken(token.RBRACKET, l.line, l.ch) - case ':': + case rune(':'): tok = newToken(token.COLON, l.line, l.ch) - case '.': + case rune('.'): tok = newToken(token.DOT, l.line, l.ch) - case '&': - if l.peekChar() == '&' { + case rune('&'): + if l.peekChar() == rune('&') { ch := l.ch l.readChar() tok = token.Token{Type: token.AND, Literal: string(ch) + string(l.ch), Line: l.line} } - case '|': - if l.peekChar() == '|' { + case rune('|'): + if l.peekChar() == rune('|') { ch := l.ch l.readChar() tok = token.Token{Type: token.OR, Literal: string(ch) + string(l.ch), Line: l.line} } - case '%': - if l.peekChar() == '=' { + case rune('%'): + if l.peekChar() == rune('=') { ch := l.ch l.readChar() tok = token.Token{Type: token.MODULUS_ASSIGN, Line: l.line, Literal: string(ch) + string(l.ch)} @@ -186,7 +186,7 @@ func (l *Lexer) NextToken() token.Token { return tok } -func newToken(tokenType token.TokenType, line int, ch byte) token.Token { +func newToken(tokenType token.TokenType, line int, ch rune) token.Token { return token.Token{Type: tokenType, Literal: string(ch), Line: line} } @@ -196,10 +196,10 @@ func (l *Lexer) readIdentifier() string { for isLetter(l.ch) || isDigit(l.ch) { l.readChar() } - return l.input[position:l.position] + return string(l.input[position:l.position]) } -func isLetter(ch byte) bool { +func isLetter(ch rune) bool { return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' } @@ -212,7 +212,7 @@ func (l *Lexer) skipWhitespace() { } } -func isDigit(ch byte) bool { +func isDigit(ch rune) bool { return '0' <= ch && ch <= '9' } @@ -221,7 +221,7 @@ func (l *Lexer) readNumber() string { for isDigit(l.ch) { l.readChar() } - return l.input[position:l.position] + return string(l.input[position:l.position]) } func (l *Lexer) readDecimal() token.Token { @@ -234,9 +234,9 @@ func (l *Lexer) readDecimal() token.Token { return token.Token{Type: token.INT, Literal: integer, Line: l.line} } -func (l *Lexer) peekChar() byte { +func (l *Lexer) peekChar() rune { if l.readPosition >= len(l.input) { - return 0 + return rune(0) } else { return l.input[l.readPosition] } From 2399336c8735c3c33f523c5a99ed2993454c34fb Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 22:54:44 +0300 Subject: [PATCH 051/362] Add byte object to list --- src/object/object.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/object/object.go b/src/object/object.go index 5f77253..89ce2e6 100644 --- a/src/object/object.go +++ b/src/object/object.go @@ -22,6 +22,7 @@ const ( BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" MODULE_OBJ = "MODULE" + BYTE_OBJ = "BYTE" ) type Object interface { From 7300fc4c3a0fcf4f207e989b9c92d32875288225 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 22:57:29 +0300 Subject: [PATCH 052/362] Add byte object --- src/object/byte.go | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/object/byte.go diff --git a/src/object/byte.go b/src/object/byte.go new file mode 100644 index 0000000..b467303 --- /dev/null +++ b/src/object/byte.go @@ -0,0 +1,9 @@ +package object + +type Byte struct { + Value []byte + String string +} + +func (b *Byte) Inspect() string { return "b'" + b.String + "'" } +func (b *Byte) Type() ObjectType { return BYTE_OBJ } From fa6f6a3d1372c8ee7c36c85d4edc2e85c629f21f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 22:57:54 +0300 Subject: [PATCH 053/362] Add json package --- src/module/json.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/module/json.go diff --git a/src/module/json.go b/src/module/json.go new file mode 100644 index 0000000..7ee8042 --- /dev/null +++ b/src/module/json.go @@ -0,0 +1,76 @@ +package module + +import ( + "encoding/json" + + "github.com/AvicennaJr/Nuru/object" +) + +var JsonFunctions = map[string]object.ModuleFunction{} + +func init() { + JsonFunctions["decode"] = decode + JsonFunctions["encode"] = encode +} + +func decode(args []object.Object) object.Object { + var i interface{} + + input := args[0].(*object.String).Value + err := json.Unmarshal([]byte(input), &i) + if err != nil { + return &object.Error{Message: "Hii data sio jsoni"} + } + + return convertWhateverToObject(i) +} + +func convertWhateverToObject(i interface{}) object.Object { + switch v := i.(type) { + case map[string]interface{}: + dict := &object.Dict{} + dict.Pairs = make(map[object.HashKey]object.DictPair) + + for k, v := range v { + pair := object.DictPair{ + Key: &object.String{Value: k}, + Value: convertWhateverToObject(v), + } + dict.Pairs[pair.Key.(object.Hashable).HashKey()] = pair + } + + return dict + case []interface{}: + list := &object.Array{} + for _, e := range v { + list.Elements = append(list.Elements, convertWhateverToObject(e)) + } + + return list + case string: + return &object.String{Value: v} + case int64: + return &object.Integer{Value: v} + case float64: + return &object.Float{Value: v} + case bool: + if v { + return &object.Boolean{Value: true} + } else { + return &object.Boolean{Value: false} + } + } + return &object.Null{} +} + +func encode(args []object.Object) object.Object { + input := args[0].Inspect() + + jsonBody, err := json.Marshal(input) + + if err != nil { + return &object.Error{Message: "Hii data haiwezi kua jsoni"} + } + + return &object.Byte{String: string(jsonBody), Value: jsonBody} +} From e82d7feacca0a604025a845e080777f79624b584 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 22:58:20 +0300 Subject: [PATCH 054/362] Add network package Only get and post request --- src/module/net.go | 98 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/module/net.go diff --git a/src/module/net.go b/src/module/net.go new file mode 100644 index 0000000..e7177f1 --- /dev/null +++ b/src/module/net.go @@ -0,0 +1,98 @@ +package module + +import ( + "bytes" + "encoding/json" + "io/ioutil" + "net/http" + + "github.com/AvicennaJr/Nuru/object" +) + +var NetFunctions = map[string]object.ModuleFunction{} + +func init() { + NetFunctions["peruzi"] = getRequest + NetFunctions["tuma"] = postRequest +} + +func getRequest(args []object.Object) object.Object { + if args[0].Type() != object.STRING_OBJ { + return &object.Error{Message: "Link iwe ndani ya \"\". Mfano: \"https://google.com\""} + } + + url := args[0].Inspect() + + resp, err := http.Get(url) + + if err != nil { + return &object.Error{Message: err.Error()} + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return &object.Error{Message: err.Error()} + } + + return &object.String{Value: string(body)} +} + +func postRequest(args []object.Object) object.Object { + + var url string + + switch link := args[0].(type) { + case *object.String: + url = link.Value + default: + return &object.Error{Message: "Hii sio link sahihi. Link iwe ndani ya \"\". Mfano: \"https://google.com\""} + } + switch v := args[1].(type) { + + case *object.Byte: + + responseBody := bytes.NewBuffer(v.Value) + + resp, err := http.Post(url, "application/json", responseBody) + + if err != nil { + return &object.Error{Message: "Tumeshindwa kupost data. Huenda huna bando?"} + } + + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return &object.Error{Message: "Tumeshindwa kusoma majibu yaliyo rudishwa."} + } + + return &object.String{Value: string(body)} + case *object.Dict: + input := args[0].Inspect() + + jsonBody, err := json.Marshal(input) + + if err != nil { + return &object.Error{Message: "Huku format query yako vizuri."} + } + + responseBody := bytes.NewBuffer(jsonBody) + + resp, err := http.Post(url, "application/json", responseBody) + + if err != nil { + return &object.Error{Message: "Tumeshindwa kupost data. Huenda huna bando?"} + } + + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return &object.Error{Message: "Tumeshindwa kusoma majibu yaliyo rudishwa."} + } + + return &object.String{Value: string(body)} + default: + return &object.Error{Message: "Data unayoruhusiwa kutuma ni Kamusi (Dict) au Bytes."} + } +} From 262ebd43deacc60c20664915082872630a1f2cc6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 22:58:40 +0300 Subject: [PATCH 055/362] Add json and net to modules list --- src/module/module.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/module/module.go b/src/module/module.go index 188234d..e514a87 100644 --- a/src/module/module.go +++ b/src/module/module.go @@ -7,4 +7,6 @@ var Mapper = map[string]*object.Module{} func init() { Mapper["os"] = &object.Module{Name: "os", Functions: OsFunctions} Mapper["muda"] = &object.Module{Name: "time", Functions: TimeFunctions} + Mapper["mtandao"] = &object.Module{Name: "net", Functions: NetFunctions} + Mapper["jsoni"] = &object.Module{Name: "json", Functions: JsonFunctions} } From fec51eec0fac929236c1ff56438df09da857cdd4 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 15 Jan 2023 23:30:07 +0300 Subject: [PATCH 056/362] Add License --- LICENSE | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. From b79466495e469c42da4762501bb4b8e7ed506aaf Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 16 Jan 2023 00:37:12 +0300 Subject: [PATCH 057/362] Change string message on bytes --- src/object/byte.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/object/byte.go b/src/object/byte.go index b467303..b5353e2 100644 --- a/src/object/byte.go +++ b/src/object/byte.go @@ -5,5 +5,5 @@ type Byte struct { String string } -func (b *Byte) Inspect() string { return "b'" + b.String + "'" } +func (b *Byte) Inspect() string { return "b" + b.String } func (b *Byte) Type() ObjectType { return BYTE_OBJ } From f31f01d3236215d94eb81ef6f50394b3daf88e3c Mon Sep 17 00:00:00 2001 From: Hopertz Date: Mon, 16 Jan 2023 23:54:09 +0300 Subject: [PATCH 058/362] Add ongeza method --- src/evaluator/method.go | 2 ++ src/module/time.go | 21 +++++++++------------ src/object/object.go | 1 + src/object/time.go | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 src/object/time.go diff --git a/src/evaluator/method.go b/src/evaluator/method.go index 92477d7..3123fc9 100644 --- a/src/evaluator/method.go +++ b/src/evaluator/method.go @@ -23,6 +23,8 @@ func applyMethod(obj object.Object, method ast.Expression, args []object.Object) return obj.Method(method.(*ast.Identifier).Value, args) case *object.File: return obj.Method(method.(*ast.Identifier).Value, args) + case *object.Time: + return obj.Method(method.(*ast.Identifier).Value, args) case *object.Module: if fn, ok := obj.Functions[method.(*ast.Identifier).Value]; ok { return fn(args) diff --git a/src/module/time.go b/src/module/time.go index 370fbca..68f65ea 100644 --- a/src/module/time.go +++ b/src/module/time.go @@ -21,8 +21,9 @@ func now(args []object.Object) object.Object { } tn := time.Now() + time_string := tn.Format("2006-01-02 15:04:05") - return &object.String{Value: tn.Format("2006-01-02 15:04:05")} + return &object.Time{TimeValue: time_string} } func sleep(args []object.Object) object.Object { @@ -45,25 +46,21 @@ func sleep(args []object.Object) object.Object { func since(args []object.Object) object.Object { if len(args) != 1 { - return &object.Error{Message : "tunahitaji hoja moja tu kwenye "} + return &object.Error{Message: "tunahitaji hoja moja tu kwenye "} } - t, err := time.Parse("2006-01-02 15:04:05", args[0].Inspect()) + t, err := time.Parse("2006-01-02 15:04:05", args[0].Inspect()) if err != nil { - - return &object.Error{Message : "tumeshindwa kuparse hoja zako"} - } - - - current_time := time.Now().Format("2006-01-02 15:04:05") - ct, _ := time.Parse("2006-01-02 15:04:05", current_time ) + return &object.Error{Message: "tumeshindwa kuparse hoja zako"} + } + current_time := time.Now().Format("2006-01-02 15:04:05") + ct, _ := time.Parse("2006-01-02 15:04:05", current_time) diff := ct.Sub(t) durationInSeconds := diff.Seconds() - return &object.Float{Value: durationInSeconds} - } \ No newline at end of file +} diff --git a/src/object/object.go b/src/object/object.go index 89ce2e6..2cf06b3 100644 --- a/src/object/object.go +++ b/src/object/object.go @@ -21,6 +21,7 @@ const ( CONTINUE_OBJ = "ENDELEA" BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" + TIME_OBJ = "MUDA" MODULE_OBJ = "MODULE" BYTE_OBJ = "BYTE" ) diff --git a/src/object/time.go b/src/object/time.go new file mode 100644 index 0000000..9adc479 --- /dev/null +++ b/src/object/time.go @@ -0,0 +1,39 @@ +package object + +import ( + "strconv" + "time" +) + +type Time struct { + TimeValue string +} + +func (t *Time) Type() ObjectType { return TIME_OBJ } +func (t *Time) Inspect() string { return t.TimeValue } +func (t *Time) Method(method string, args []Object) Object { + switch method { + case "ongeza": + return t.add(args) + + } + return nil +} + +func (t *Time) add(args []Object) Object { + if len(args) != 1 { + return newError("Samahani, tunahitaji Hoja 1, wewe umeweka %d", len(args)) + } + + cur_time, _ := time.Parse("2006-01-02 15:04:05", t.Inspect()) + + objvalue := args[0].Inspect() + inttime, err := strconv.Atoi(objvalue) + + if err != nil { + return newError("namba tu zinaruhusiwa kwenye hoja") + } + + next_time := cur_time.Add(time.Duration(inttime) * time.Hour) + return &String{Value: string(next_time.Format("2006-01-02 15:04:05"))} +} From 6383cdf7af68eaac6a5ce84b20556a8b64731326 Mon Sep 17 00:00:00 2001 From: Farajael Tumaiyo Date: Tue, 17 Jan 2023 16:22:03 +0300 Subject: [PATCH 059/362] fix typo on readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5fae61a..517d117 100644 --- a/README.md +++ b/README.md @@ -229,7 +229,7 @@ andika(arr[3]) // output = 3 ### Dictionaries -Nuru also supports dictionaris and you can do a lot with them as follows: +Nuru also supports dictionaries and you can do a lot with them as follows: ``` fanya mtu = {"jina": "Mojo", "kabila": "Mnyakusa"} From 20bcbe488a6b47f5b47a0bc9ae19ee03da4fd4fe Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 17 Jan 2023 23:03:31 +0300 Subject: [PATCH 060/362] Add optional headers to get request --- src/module/net.go | 98 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/src/module/net.go b/src/module/net.go index e7177f1..87f7040 100644 --- a/src/module/net.go +++ b/src/module/net.go @@ -17,21 +17,64 @@ func init() { } func getRequest(args []object.Object) object.Object { + + if len(args) > 3 { + return &object.Error{Message: "Hatuhitaji hoja zaidi ya 3."} + } + if args[0].Type() != object.STRING_OBJ { return &object.Error{Message: "Link iwe ndani ya \"\". Mfano: \"https://google.com\""} } url := args[0].Inspect() - resp, err := http.Get(url) + req, err := http.NewRequest("GET", url, nil) + + // var responseBody *bytes.Buffer + + if len(args) == 2 { + + switch v := args[1].(type) { + + case *object.Byte: + + // responseBody = bytes.NewBuffer(v.Value) + + case *object.Dict: + for _, val := range v.Pairs { + req.Header.Set(val.Key.Inspect(), val.Value.Inspect()) + } + // input := args[0].Inspect() + + // jsonBody, err := json.Marshal(input) + + // if err != nil { + // return &object.Error{Message: "Huku format query yako vizuri."} + // } + + // responseBody = bytes.NewBuffer(jsonBody) + + default: + return &object.Error{Message: "Data unayoruhusiwa kutuma ni Kamusi (Dict) au Bytes."} + } + + } + + if err != nil { + return &object.Error{Message: "Tumeshindwa kutuma request."} + } + + client := &http.Client{} + + resp, err := client.Do(req) if err != nil { - return &object.Error{Message: err.Error()} + return &object.Error{Message: "Tumeshindwa kutuma request."} } body, err := ioutil.ReadAll(resp.Body) if err != nil { - return &object.Error{Message: err.Error()} + return &object.Error{Message: "Tumeshindwa kusoma majibu."} } return &object.String{Value: string(body)} @@ -39,6 +82,9 @@ func getRequest(args []object.Object) object.Object { func postRequest(args []object.Object) object.Object { + if len(args) != 2 { + return &object.Error{Message: "Tunahitaji hoja mbili."} + } var url string switch link := args[0].(type) { @@ -47,26 +93,15 @@ func postRequest(args []object.Object) object.Object { default: return &object.Error{Message: "Hii sio link sahihi. Link iwe ndani ya \"\". Mfano: \"https://google.com\""} } - switch v := args[1].(type) { - case *object.Byte: + var responseBody *bytes.Buffer - responseBody := bytes.NewBuffer(v.Value) - - resp, err := http.Post(url, "application/json", responseBody) - - if err != nil { - return &object.Error{Message: "Tumeshindwa kupost data. Huenda huna bando?"} - } + switch v := args[1].(type) { - defer resp.Body.Close() + case *object.Byte: - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return &object.Error{Message: "Tumeshindwa kusoma majibu yaliyo rudishwa."} - } + responseBody = bytes.NewBuffer(v.Value) - return &object.String{Value: string(body)} case *object.Dict: input := args[0].Inspect() @@ -76,23 +111,24 @@ func postRequest(args []object.Object) object.Object { return &object.Error{Message: "Huku format query yako vizuri."} } - responseBody := bytes.NewBuffer(jsonBody) + responseBody = bytes.NewBuffer(jsonBody) - resp, err := http.Post(url, "application/json", responseBody) + default: + return &object.Error{Message: "Data unayoruhusiwa kutuma ni Kamusi (Dict) au Bytes."} + } - if err != nil { - return &object.Error{Message: "Tumeshindwa kupost data. Huenda huna bando?"} - } + resp, err := http.Post(url, "application/json", responseBody) - defer resp.Body.Close() + if err != nil { + return &object.Error{Message: "Tumeshindwa kupost data. Huenda huna bando?"} + } - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return &object.Error{Message: "Tumeshindwa kusoma majibu yaliyo rudishwa."} - } + defer resp.Body.Close() - return &object.String{Value: string(body)} - default: - return &object.Error{Message: "Data unayoruhusiwa kutuma ni Kamusi (Dict) au Bytes."} + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return &object.Error{Message: "Tumeshindwa kusoma majibu yaliyo rudishwa."} } + + return &object.String{Value: string(body)} } From 7be7ab337aa423ede50fcbdc19212bb91d316088 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 22:48:25 +0300 Subject: [PATCH 061/362] Add ident assign AST and default parameters to function --- src/ast/ast.go | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/ast/ast.go b/src/ast/ast.go index ee505c2..f0f5b7c 100644 --- a/src/ast/ast.go +++ b/src/ast/ast.go @@ -212,6 +212,7 @@ func (bs *BlockStatement) String() string { type FunctionLiteral struct { Token token.Token Parameters []*Identifier + Defaults map[string]Expression Body *BlockStatement } @@ -331,6 +332,24 @@ func (dl *DictLiteral) String() string { return out.String() } +type Assign struct { + Token token.Token + Name *Identifier + Value Expression +} + +func (ae *Assign) expressionNode() {} +func (ae *Assign) TokenLiteral() string { return ae.Token.Literal } +func (ae *Assign) String() string { + var out bytes.Buffer + + out.WriteString(ae.Name.String()) + out.WriteString(ae.TokenLiteral()) + out.WriteString(ae.Value.String()) + + return out.String() +} + type AssignmentExpression struct { Token token.Token Left Expression @@ -420,7 +439,6 @@ func (fl *FloatLiteral) TokenLiteral() string { return fl.Token.Literal } func (fl *FloatLiteral) String() string { return fl.Token.Literal } type For struct { - Expression Token token.Token Identifier string // "i" StarterName *Identifier // i = 0 @@ -431,7 +449,6 @@ type For struct { } type ForIn struct { - Expression Token token.Token Key string Value string @@ -509,7 +526,6 @@ func (se *SwitchExpression) String() string { } type MethodExpression struct { - Expression Token token.Token Object Expression Method Expression @@ -528,7 +544,17 @@ func (me *MethodExpression) String() string { } type Import struct { - Expression Token token.Token Identifiers map[string]*Identifier } + +func (i *Import) expressionNode() {} +func (i *Import) TokenLiteral() string { return i.Token.Literal } +func (i *Import) String() string { + var out bytes.Buffer + out.WriteString("tumia ") + for k := range i.Identifiers { + out.WriteString(k + " ") + } + return out.String() +} From 448ec8c9b1f6a118e9cdc0c1f6c0e5e437e7afed Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 22:49:43 +0300 Subject: [PATCH 062/362] Ability to initiliaze without fanya keyword Did this for debugging purposes --- src/parser/assignment.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/parser/assignment.go b/src/parser/assignment.go index 72a8a20..7122de4 100644 --- a/src/parser/assignment.go +++ b/src/parser/assignment.go @@ -8,7 +8,18 @@ import ( func (p *Parser) parseAssignmentExpression(exp ast.Expression) ast.Expression { switch node := exp.(type) { - case *ast.Identifier, *ast.IndexExpression: + // temporarily making let keyword optional + case *ast.Identifier: + e := &ast.Assign{ + Token: p.curToken, + Name: exp.(*ast.Identifier), + } + precedence := p.curPrecedence() + p.nextToken() + e.Value = p.parseExpression(precedence) + return e + + case *ast.IndexExpression: default: if node != nil { msg := fmt.Sprintf("Mstari %d:Tulitegemea kupata kitambulishi au array, badala yake tumepata: %s", p.curToken.Line, node.TokenLiteral()) From 9eedbef9a45a0a25655e33e83f8fd9d7a28720e2 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 22:50:33 +0300 Subject: [PATCH 063/362] evaluate assign without fanya keyword --- src/evaluator/assign.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/evaluator/assign.go diff --git a/src/evaluator/assign.go b/src/evaluator/assign.go new file mode 100644 index 0000000..d9e0e47 --- /dev/null +++ b/src/evaluator/assign.go @@ -0,0 +1,16 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalAssign(node *ast.Assign, env *object.Environment) object.Object { + val := Eval(node.Value, env) + if isError(val) { + return val + } + + env.Set(node.Name.Value, val) + return NULL +} From dc3e01ff7b82f2d5682de8be174bdca154aeab50 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 22:51:09 +0300 Subject: [PATCH 064/362] Add assign to evaluation list --- src/evaluator/evaluator.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index 4b5ee62..d9d8ed5 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -77,9 +77,7 @@ func Eval(node ast.Node, env *object.Environment) object.Object { return evalIdentifier(node, env) case *ast.FunctionLiteral: - params := node.Parameters - body := node.Body - return &object.Function{Parameters: params, Env: env, Body: body} + return evalFunction(node, env) case *ast.MethodExpression: return evalMethodExpression(node, env) @@ -132,6 +130,10 @@ func Eval(node ast.Node, env *object.Environment) object.Object { // return evalForExpression(node, env) case *ast.ForIn: return evalForInExpression(node, env, node.Token.Line) + + case *ast.Assign: // making let temporarily optional as I debug + return evalAssign(node, env) + case *ast.AssignmentExpression: left := Eval(node.Left, env) if isError(left) { From 3be81c288d208f3f553b032fcf4a4e03bf022817 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 22:51:56 +0300 Subject: [PATCH 065/362] Add default field to function --- src/object/function.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/object/function.go b/src/object/function.go index aecaf8a..58db201 100644 --- a/src/object/function.go +++ b/src/object/function.go @@ -9,6 +9,7 @@ import ( type Function struct { Parameters []*ast.Identifier + Defaults map[string]ast.Expression Body *ast.BlockStatement Env *Environment } From ca9ce08abe827e1ecf77955ed0506088bbba4deb Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 18 Jan 2023 23:46:18 +0300 Subject: [PATCH 066/362] Add separate eval function --- src/evaluator/function.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/evaluator/function.go diff --git a/src/evaluator/function.go b/src/evaluator/function.go new file mode 100644 index 0000000..266ec8a --- /dev/null +++ b/src/evaluator/function.go @@ -0,0 +1,17 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalFunction(node *ast.FunctionLiteral, env *object.Environment) object.Object { + function := &object.Function{ + Parameters: node.Parameters, + Defaults: node.Defaults, + Body: node.Body, + Env: env, + } + + return function +} From 291206213a537aa46597ddee73e37c58325f8b7e Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 22 Jan 2023 16:23:58 +0300 Subject: [PATCH 067/362] Add about page --- ABOUT.md | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 ABOUT.md diff --git a/ABOUT.md b/ABOUT.md new file mode 100644 index 0000000..eb1d523 --- /dev/null +++ b/ABOUT.md @@ -0,0 +1,47 @@ +# NURU PROGRAMMING LANGUAGE + +This page intends to show the origins of Nuru, its purpose, what it can be used for, what it should not be used for and the potential future of the programming language. + +## Background + +This language is the direct child of a programming language called "Monkey Language" made by Thorston Ball. He wrote a book titled "Writing An Interpreter In Go" and the core of the language is based on his book. + +With the knowledge I gained from his book, I saw an opportunity to write a Swahili Programming Language, which would not just be a translation of an already existing one, but an actual standalone interpreted language that can be built from the ground up, where everything can be customized from the syntax, its abilities, its standard library and more. + +Now one may wonder, why a new programming language when there are many other much better programming languages in existence. The answer is, it is a Swahili programming language. And this is significant for two reasons: +- Many are unable to learn programming due to the language barrier. Almost all programming languages in existence are in English and thus a non English speaker would have to first learn English before they can learn a programming language. This makes the effort twice as difficult and Nuru, a native Swahili programming language, intends to make the process of learning programming languages a bit easier. +- Secondly, even if no one does use this programming language, then at least we can say "We do have a fully functional Swahili programming language", and as a person who grew up in Tanzania, this does give me pride. + +## Purpose + +Nuru does not intend to replace any existing programming language. In fact, it does not intend to be used in production at all. Nuru intends to be an educational programming language, a programming language that will make it easy for anyone to get into the world of programming without knowing English. It intends to be simple enough to be taught to kids in primary and highschool and allow them to build interesting tools with it. + +Nuru also hopes to be used by hobbyists and experienced programmers, where by they will find it easy to write scripts in Nuru that will help solve their various tasks or build interesting projects with it. As a matter of fact, someone already made a sudoku solver in Nuru. + +While being simple it also intends to be fully functional. Other than having all the core features required by a programming language, Nuru also has an extensive standard library that will make performing common tasks much easier. Thus, it intends to bring the best of both worlds, simple to use with a lot of features. + +## Philosophy + +Nuru's philosophy is to keep things simple. Everything in Nuru should be consistent and intuitive, from its syntax to the keywords used. On the matter of keywords, Nuru intends to provide keywords that are simple and intuitive that can easily explain what the function or library is for. A more detailed guide on the Nuru's syntax and the proper way of writing Nuru will be provided in the near future. + +Nuru is also community driven. We listen to our community and do our best to implement on the feedback we get from them. + +## Where Not To Use Nuru + +Nuru's performance is worse than python. It has been authored by someone with very limited knowledge in programming. Thus, it is advised to never use Nuruin production code where by any kind of mistakes are critical. Nuru is still very immature and should only be used for educational and hobby projects. + +## Challenges + +The main challenge we have in Nuru is in naming keywords. Since this is something new, there are lack of words that fully describe common programming words. However, we do intend to try our best to select the best keywords, and we often consult with our community when choosing a word. + +## Future Of Nuru + +It is still too early to know how Nuru will evolve, or the way in which the community will use this language. However, what is certain is the core developers will do their best to provide a language that will be enjoyable to learn and code in. We listen to our community and hopefully we will soon have a large number of developers contributing to the language. + +We also hope to see games and GUI applications written in Nuru in the near future... God willing. + +## Final Words + +I am very grateful to the reception of this project, we now have over 150+ downloads and its barely been a month. We hope to fulfill all your expectations and provide something that you will all enjoy to use. We also ask you to bear with us when we make mistakes and correct and advise us on areas where we can do better. I am also grateful to Thorston for writing such an amazing book, and I would recommend anyone who'd want to learn how programming languages work to read his book. + +And finally, I thank Allah for granting us the ability to learn and giving me the ability to make such a project. From 65c99d3f282b58d32589a3878a2cad89a4b3dade Mon Sep 17 00:00:00 2001 From: "kilaladashina@gmail.com" Date: Mon, 20 Feb 2023 11:11:24 +0300 Subject: [PATCH 068/362] logo --- assets/Nuru-logov4.png | Bin 0 -> 31961 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/Nuru-logov4.png diff --git a/assets/Nuru-logov4.png b/assets/Nuru-logov4.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9fc174a1472ad62f2ca4a703ab2cc07141f35f GIT binary patch literal 31961 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 Date: Mon, 20 Feb 2023 11:16:54 +0300 Subject: [PATCH 069/362] Resize logo --- assets/Nuru-logov4.png | Bin 31961 -> 0 bytes assets/Nuru.png | Bin 0 -> 32308 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 assets/Nuru-logov4.png create mode 100644 assets/Nuru.png diff --git a/assets/Nuru-logov4.png b/assets/Nuru-logov4.png deleted file mode 100644 index 3f9fc174a1472ad62f2ca4a703ab2cc07141f35f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31961 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

E9~o!=u{UDyFEFM&01RXofQRPo)U3M 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 MEyH`*yN{m#KV3xfPyhe` literal 0 HcmV?d00001 From 14d577f72ede76e6ed10c8d3982373bbf84ebfe1 Mon Sep 17 00:00:00 2001 From: "kilaladashina@gmail.com" Date: Tue, 21 Feb 2023 13:02:26 +0300 Subject: [PATCH 070/362] Add transparent logo --- assets/nuru-logo (Transparent).png | Bin 0 -> 40851 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/nuru-logo (Transparent).png diff --git a/assets/nuru-logo (Transparent).png b/assets/nuru-logo (Transparent).png new file mode 100644 index 0000000000000000000000000000000000000000..935a003cfd07871c435a08e3b5fd717e15a2dbc8 GIT binary patch literal 40851 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 literal 0 HcmV?d00001 From 1da9a0078bf49cf172e899b00eb73fcc1443fb22 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Fri, 3 Mar 2023 21:45:55 +0300 Subject: [PATCH 071/362] I don't remember what I did tbh --- src/evaluator/call.go | 94 ++++++++++++++++++++++++++++++++++++++++++ src/parser/function.go | 30 ++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/evaluator/call.go diff --git a/src/evaluator/call.go b/src/evaluator/call.go new file mode 100644 index 0000000..2173262 --- /dev/null +++ b/src/evaluator/call.go @@ -0,0 +1,94 @@ +package evaluator + +import ( + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalCall(node *ast.CallExpression, env *object.Environment) object.Object { + function := Eval(node.Function, env) + + if isError(function) { + return function + } + + var args []object.Object + + switch function.(type) { + case *object.Function: + fn := function.(*object.Function) + + args = evalArgsExpressions(node, fn, env) + default: + args = evalExpressions(node.Arguments, env) + } + + if len(args) == 1 && isError(args[0]) { + return args[0] + } + + return applyFunction(function, args, node.Token.Line) +} + +func evalArgsExpressions(node *ast.CallExpression, fn *object.Function, env *object.Environment) []object.Object { + argsList := &object.Array{} + argsHash := &object.Dict{} + argsHash.Pairs = make(map[object.HashKey]object.DictPair) + for _, exprr := range node.Arguments { + switch exp := exprr.(type) { + case *ast.AssignmentExpression: + val := Eval(exp.Value, env) + if isError(val) { + return []object.Object{val} + } + + var keyHash object.HashKey + key := &object.String{Value: exp.Left.String()} + keyHash = key.HashKey() + pair := object.DictPair{Key: key, Value: val} + argsHash.Pairs[keyHash] = pair + default: + evaluated := Eval(exp, env) + if isError(evaluated) { + return []object.Object{evaluated} + } + argsList.Elements = append(argsList.Elements, evaluated) + } + } + + var result []object.Object + var params = map[string]bool{} + for _, exp := range fn.Parameters { + params[exp.Value] = true + if len(argsList.Elements) > 0 { + result = append(result, argsList.Elements[0]) + argsList.Elements = argsList.Elements[1:] + } else { + keyParam := &object.String{Value: exp.Value} + keyParamHash := keyParam.HashKey() + if valParam, ok := argsHash.Pairs[keyParamHash]; ok { + result = append(result, valParam.Value) + delete(argsHash.Pairs, keyParamHash) + } else { + if _e, _ok := fn.Defaults[exp.Value]; _ok { + evaluated := Eval(_e, env) + if isError(evaluated) { + return []object.Object{evaluated} + } + result = append(result, evaluated) + } else { + return []object.Object{&object.Error{Message: "Tumekosa Hoja"}} + } + } + } + } + + for _, pair := range argsHash.Pairs { + if _, ok := params[pair.Key.(*object.String).Value]; ok { + return []object.Object{&object.Error{Message: "Tumepewa hoja nyingi kwa parameter moja"}} + } + } + + return result + +} diff --git a/src/parser/function.go b/src/parser/function.go index a1d7dd7..88cda36 100644 --- a/src/parser/function.go +++ b/src/parser/function.go @@ -14,6 +14,10 @@ func (p *Parser) parseFunctionLiteral() ast.Expression { lit.Parameters = p.parseFunctionParameters() + // if !p.parseFunctionParameters(lit) { + // return nil + // } + if !p.expectPeek(token.LBRACE) { return nil } @@ -50,6 +54,32 @@ func (p *Parser) parseFunctionParameters() []*ast.Identifier { return identifiers } +// func (p *Parser) parseFunctionParameters(lit *ast.FunctionLiteral) bool { +// lit.Defaults = make(map[string]ast.Expression) +// for !p.peekTokenIs(token.RPAREN) { +// p.nextToken() + +// if p.curTokenIs(token.COMMA) { +// continue +// } + +// ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} +// lit.Parameters = append(lit.Parameters, ident) + +// if p.peekTokenIs(token.ASSIGN) { +// p.nextToken() +// p.nextToken() +// lit.Defaults[ident.Value] = p.parseExpression(LOWEST) +// } else { +// if len(lit.Defaults) > 0 { +// return false +// } +// } +// } + +// return !p.expectPeek(token.RPAREN) +// } + func (p *Parser) parseCallExpression(function ast.Expression) ast.Expression { exp := &ast.CallExpression{Token: p.curToken, Function: function} exp.Arguments = p.parseExpressionList(token.RPAREN) From 33d973eab24bde6cd19bd69af533b10fc97e2554 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 5 Mar 2023 02:56:19 +0300 Subject: [PATCH 072/362] Identified bug in addition assignment will find a workaround --- src/evaluator/evaluator.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index d9d8ed5..8383dba 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -149,6 +149,7 @@ func Eval(node ast.Node, env *object.Environment) object.Object { // I'm surprised it work at the first try lol // basically separate the += to + and =, take the + only and // then perform the operation as normal + // Update: This 'genius' move wasted two hours of mine op := node.Token.Literal if len(op) >= 2 { op = op[:len(op)-1] From 98096e9a95f46cffc0e04be7faa646faf9d8e339 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 9 Mar 2023 13:51:45 +0300 Subject: [PATCH 073/362] add svg logo --- assets/Nuru.svg | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 assets/Nuru.svg diff --git a/assets/Nuru.svg b/assets/Nuru.svg new file mode 100644 index 0000000..4b67102 --- /dev/null +++ b/assets/Nuru.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + From 0071832fe107e63dc9b7177d5a077195bd32a52c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 13 Mar 2023 18:36:44 +0300 Subject: [PATCH 074/362] fix index assignment on arrays --- src/evaluator/evaluator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index 8383dba..d2a7521 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -173,7 +173,7 @@ func Eval(node ast.Node, env *object.Environment) object.Object { return index } if idx, ok := index.(*object.Integer); ok { - if int(idx.Value) > len(array.Elements) { + if int(idx.Value) >= len(array.Elements) { return newError("Index imezidi idadi ya elements") } array.Elements[idx.Value] = value From 3920c22da6e0f44f8f5a9a6863bcf94a14b18a1c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 13 Mar 2023 23:47:36 +0300 Subject: [PATCH 075/362] add AssignEqual type to abstract syntax tree Manage +=, -= etc separately --- src/ast/ast.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/ast/ast.go b/src/ast/ast.go index f0f5b7c..e1392da 100644 --- a/src/ast/ast.go +++ b/src/ast/ast.go @@ -350,6 +350,24 @@ func (ae *Assign) String() string { return out.String() } +type AssignEqual struct { + Token token.Token + Left *Identifier + Value Expression +} + +func (ae *AssignEqual) expressionNode() {} +func (ae *AssignEqual) TokenLiteral() string { return ae.Token.Literal } +func (ae *AssignEqual) String() string { + var out bytes.Buffer + + out.WriteString(ae.Left.String()) + out.WriteString(ae.TokenLiteral()) + out.WriteString(ae.Value.String()) + + return out.String() +} + type AssignmentExpression struct { Token token.Token Left Expression From 34fe9903b154204fb3e35abecdaec4f552b222e5 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 13 Mar 2023 23:48:16 +0300 Subject: [PATCH 076/362] add parsing for assign equal operations separately --- src/parser/assignEqual.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/parser/assignEqual.go diff --git a/src/parser/assignEqual.go b/src/parser/assignEqual.go new file mode 100644 index 0000000..ed560be --- /dev/null +++ b/src/parser/assignEqual.go @@ -0,0 +1,38 @@ +package parser + +import ( + "fmt" + + "github.com/AvicennaJr/Nuru/ast" +) + +func (p *Parser) parseAssignEqualExpression(exp ast.Expression) ast.Expression { + switch node := exp.(type) { + case *ast.Identifier: + e := &ast.AssignEqual{ + Token: p.curToken, + Left: exp.(*ast.Identifier), + } + precendence := p.curPrecedence() + p.nextToken() + e.Value = p.parseExpression(precendence) + return e + case *ast.IndexExpression: + ae := &ast.AssignmentExpression{Token: p.curToken, Left: exp} + + p.nextToken() + + ae.Value = p.parseExpression(LOWEST) + + return ae + default: + if node != nil { + msg := fmt.Sprintf("Mstari %d:Tulitegemea kupata kitambulishi au array, badala yake tumepata: %s", p.curToken.Line, node.TokenLiteral()) + p.errors = append(p.errors, msg) + } else { + msg := fmt.Sprintf("Mstari %d: Umekosea mkuu", p.curToken.Line) + p.errors = append(p.errors, msg) + } + return nil + } +} From e5215c9c962f6719af859015c7acdc525810ebd8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 13 Mar 2023 23:49:10 +0300 Subject: [PATCH 077/362] add a function to evaluate assign-equal operations separately --- src/evaluator/assignEqual.go | 149 +++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/evaluator/assignEqual.go diff --git a/src/evaluator/assignEqual.go b/src/evaluator/assignEqual.go new file mode 100644 index 0000000..7ed2391 --- /dev/null +++ b/src/evaluator/assignEqual.go @@ -0,0 +1,149 @@ +package evaluator + +import ( + "strings" + + "github.com/AvicennaJr/Nuru/ast" + "github.com/AvicennaJr/Nuru/object" +) + +func evalAssignEqual(node *ast.AssignEqual, env *object.Environment) object.Object { + left := Eval(node.Left, env) + if isError(left) { + return left + } + + value := Eval(node.Value, env) + if isError(value) { + return value + } + + switch node.Token.Literal { + case "+=": + switch arg := left.(type) { + case *object.Integer: + switch val := value.(type) { + case *object.Integer: + v := arg.Value + val.Value + return env.Set(node.Left.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := float64(arg.Value) + val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '+=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.Float: + switch val := value.(type) { + case *object.Integer: + v := arg.Value + float64(val.Value) + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + case *object.Float: + v := arg.Value + val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '+=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.String: + switch val := value.(type) { + case *object.String: + v := arg.Value + val.Value + return env.Set(node.Left.Token.Literal, &object.String{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '+=' kwa %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + default: + return newError("Mstari %d: Huwezi kutumia '+=' na %v", node.Token.Line, arg.Type()) + } + case "-=": + switch arg := left.(type) { + case *object.Integer: + switch val := value.(type) { + case *object.Integer: + v := arg.Value - val.Value + return env.Set(node.Left.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := float64(arg.Value) - val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '-=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.Float: + switch val := value.(type) { + case *object.Integer: + v := arg.Value - float64(val.Value) + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + case *object.Float: + v := arg.Value - val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '-=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + default: + return newError("Mstari %d: Huwezi kutumia '-=' na %v", node.Token.Line, arg.Type()) + } + case "*=": + switch arg := left.(type) { + case *object.Integer: + switch val := value.(type) { + case *object.Integer: + v := arg.Value * val.Value + return env.Set(node.Left.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := float64(arg.Value) * val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '*=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.Float: + switch val := value.(type) { + case *object.Integer: + v := arg.Value * float64(val.Value) + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + case *object.Float: + v := arg.Value * val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '*=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.String: + switch val := value.(type) { + case *object.Integer: + v := strings.Repeat(arg.Value, int(val.Value)) + return env.Set(node.Left.Token.Literal, &object.String{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '+=' kwa %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + default: + return newError("Mstari %d: Huwezi kutumia '*=' na %v", node.Token.Line, arg.Type()) + } + case "/=": + switch arg := left.(type) { + case *object.Integer: + switch val := value.(type) { + case *object.Integer: + v := arg.Value / val.Value + return env.Set(node.Left.Token.Literal, &object.Integer{Value: v}) + case *object.Float: + v := float64(arg.Value) / val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '/=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + case *object.Float: + switch val := value.(type) { + case *object.Integer: + v := arg.Value / float64(val.Value) + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + case *object.Float: + v := arg.Value / val.Value + return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + default: + return newError("Mstari %d: Huwezi kutumia '/=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) + } + default: + return newError("Mstari %d: Huwezi kutumia '/=' na %v", node.Token.Line, arg.Type()) + } + default: + return newError("Mstari %d: Operesheni Haifahamiki %s", node.Token.Line, node.Token.Literal) + } +} From ae95abed7c479f4b95a12215cb823813c63a2a78 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 13 Mar 2023 23:49:51 +0300 Subject: [PATCH 078/362] use the asign equal parsing function on parsers --- src/parser/parser.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/parser/parser.go b/src/parser/parser.go index 50fab2b..34dfd44 100644 --- a/src/parser/parser.go +++ b/src/parser/parser.go @@ -118,13 +118,13 @@ func New(l *lexer.Lexer) *Parser { p.registerInfix(token.AND, p.parseInfixExpression) p.registerInfix(token.OR, p.parseInfixExpression) p.registerInfix(token.PLUS, p.parseInfixExpression) - p.registerInfix(token.PLUS_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.PLUS_ASSIGN, p.parseAssignEqualExpression) p.registerInfix(token.MINUS, p.parseInfixExpression) - p.registerInfix(token.MINUS_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.MINUS_ASSIGN, p.parseAssignEqualExpression) p.registerInfix(token.SLASH, p.parseInfixExpression) - p.registerInfix(token.SLASH_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.SLASH_ASSIGN, p.parseAssignEqualExpression) p.registerInfix(token.ASTERISK, p.parseInfixExpression) - p.registerInfix(token.ASTERISK_ASSIGN, p.parseAssignmentExpression) + p.registerInfix(token.ASTERISK_ASSIGN, p.parseAssignEqualExpression) p.registerInfix(token.POW, p.parseInfixExpression) p.registerInfix(token.MODULUS, p.parseInfixExpression) p.registerInfix(token.MODULUS_ASSIGN, p.parseAssignmentExpression) From 088aa0412c75380a68e466a31a3fe99d9c51082b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 00:22:17 +0300 Subject: [PATCH 079/362] add assignEqual to evaluation cases --- src/evaluator/evaluator.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/evaluator/evaluator.go b/src/evaluator/evaluator.go index d2a7521..1911a97 100644 --- a/src/evaluator/evaluator.go +++ b/src/evaluator/evaluator.go @@ -133,6 +133,8 @@ func Eval(node ast.Node, env *object.Environment) object.Object { case *ast.Assign: // making let temporarily optional as I debug return evalAssign(node, env) + case *ast.AssignEqual: + return evalAssignEqual(node, env) case *ast.AssignmentExpression: left := Eval(node.Left, env) @@ -146,10 +148,7 @@ func Eval(node ast.Node, env *object.Environment) object.Object { } // This is an easy way to assign operators like +=, -= etc - // I'm surprised it work at the first try lol - // basically separate the += to + and =, take the + only and - // then perform the operation as normal - // Update: This 'genius' move wasted two hours of mine + // for index expressions (arrays and dicts) where applicable op := node.Token.Literal if len(op) >= 2 { op = op[:len(op)-1] From 6735eec5f6d0af0036f0b7ceb360f805c986bf00 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 13:25:35 +0300 Subject: [PATCH 080/362] add bang tests --- src/evaluator/evaluator_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 28b46e2..994da9e 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -50,6 +50,10 @@ func TestEvalBooleanExpression(t *testing.T) { {"kweli != sikweli", true}, {"sikweli != kweli", true}, {"(1 < 2) == kweli", true}, + {"!kweli", false}, + {"!sikweli", true}, + {"!tupu", true}, + {"!'kitu'", false}, } for _, tt := range tests { From 75b511a450f11481c62516b2ca3282241896b8bf Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 13:41:57 +0300 Subject: [PATCH 081/362] add tests for prefix float and integers --- src/evaluator/evaluator_test.go | 50 +++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 994da9e..24d234b 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -546,3 +546,53 @@ func TestDictIndexExpression(t *testing.T) { } } } + +func TestPrefixInteger(t *testing.T) { + tests := []struct { + input string + expected interface{} + }{ + { + "-4", + -4, + }, + { + "+5", + 5, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + integer, ok := tt.expected.(int) + if !ok { + t.Errorf("Object is not an integer") + } + testIntegerObject(t, evaluated, int64(integer)) + } +} + +func TestPrefixFloat(t *testing.T) { + tests := []struct { + input string + expected interface{} + }{ + { + "-4.4", + -4.4, + }, + { + "+5.5", + 5.5, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + float, ok := tt.expected.(float64) + if !ok { + t.Errorf("Object is not a float") + } + testFloatObject(t, evaluated, float) + } +} From fa61a9ac67e2f66de6273fa0fb2a73497e0dc85e Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 13:42:31 +0300 Subject: [PATCH 082/362] fix typo on error message --- src/evaluator/prefix.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/evaluator/prefix.go b/src/evaluator/prefix.go index cec053b..4bb9f56 100644 --- a/src/evaluator/prefix.go +++ b/src/evaluator/prefix.go @@ -25,7 +25,7 @@ func evalPlusPrefixOperatorExpression(right object.Object, line int) object.Obje return &object.Float{Value: obj.Value} default: - return newError("Mstari %d: Operesheni Haielweki: -%s", line, right.Type()) + return newError("Mstari %d: Operesheni Haielweki: +%s", line, right.Type()) } } From 91f1d44776b6e37a2da615ba7533cd0605a82b09 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 13:43:29 +0300 Subject: [PATCH 083/362] allow ability to multiply string with *= --- src/evaluator/assignEqual.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/evaluator/assignEqual.go b/src/evaluator/assignEqual.go index 7ed2391..551ecd9 100644 --- a/src/evaluator/assignEqual.go +++ b/src/evaluator/assignEqual.go @@ -91,6 +91,9 @@ func evalAssignEqual(node *ast.AssignEqual, env *object.Environment) object.Obje case *object.Float: v := float64(arg.Value) * val.Value return env.Set(node.Left.Token.Literal, &object.Float{Value: v}) + case *object.String: + v := strings.Repeat(val.Value, int(arg.Value)) + return env.Set(node.Left.Token.Literal, &object.String{Value: v}) default: return newError("Mstari %d: Huwezi kutumia '*=' kujumlisha %v na %v", node.Token.Line, arg.Type(), val.Type()) } From 38330c8a1823f7ee0204cd64c50dcd2db1e54049 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 14:31:36 +0300 Subject: [PATCH 084/362] add tests for 'in' expression --- src/evaluator/evaluator_test.go | 41 +++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 24d234b..62197e8 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -596,3 +596,44 @@ func TestPrefixFloat(t *testing.T) { testFloatObject(t, evaluated, float) } } + +func TestInExpression(t *testing.T) { + tests := []struct { + input string + expected bool + }{ + { + "'a' ktk 'habari'", + true, + }, + { + "'c' ktk 'habari'", + false, + }, + { + "1 ktk [1, 2, 3]", + true, + }, + { + "4 ktk [1, 2, 3]", + false, + }, + { + "'a' ktk {'a': 'apple', 'b': 'banana'}", + true, + }, + { + "'apple' ktk {'a': 'apple', 'b': 'banana'}", + false, + }, + { + "'c' ktk {'a': 'apple', 'b': 'banana'}", + false, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + testBooleanObject(t, evaluated, tt.expected) + } +} From 00315c0cc57af02d63d04609e4e5fdc189fa1f61 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 14:46:51 +0300 Subject: [PATCH 085/362] add array concatenation tests --- src/evaluator/evaluator_test.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 62197e8..abf6c8a 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -637,3 +637,35 @@ func TestInExpression(t *testing.T) { testBooleanObject(t, evaluated, tt.expected) } } + +func TestArrayConcatenation(t *testing.T) { + tests := []struct { + input string + expected string + }{ + { + "['a', 'b', 'c'] + [1, 2, 3]", + `[a, b, c, 1, 2, 3]`, + }, + { + "[1, 2, 3] * 4", + "[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]", + }, + { + "4 * [1, 2, 3]", + "[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]", + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + arr, ok := evaluated.(*object.Array) + if !ok { + t.Fatalf("Object is not an array, got=%T(%+v)", evaluated, evaluated) + } + + if arr.Inspect() != tt.expected { + t.Errorf("Array has wrong values, got=%s, want=%s", arr.Inspect(), tt.expected) + } + } +} From 49b82707d1f4c77781ede3dfcf2f20617ad2eaa4 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:26:28 +0300 Subject: [PATCH 086/362] add dict concatenation tests --- src/evaluator/evaluator_test.go | 40 +++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index abf6c8a..65580e7 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -645,7 +645,7 @@ func TestArrayConcatenation(t *testing.T) { }{ { "['a', 'b', 'c'] + [1, 2, 3]", - `[a, b, c, 1, 2, 3]`, + "[a, b, c, 1, 2, 3]", }, { "[1, 2, 3] * 4", @@ -665,7 +665,43 @@ func TestArrayConcatenation(t *testing.T) { } if arr.Inspect() != tt.expected { - t.Errorf("Array has wrong values, got=%s, want=%s", arr.Inspect(), tt.expected) + t.Errorf("Array has wrong values, got=%s want=%s", arr.Inspect(), tt.expected) + } + } +} + +func TestDictConcatenation(t *testing.T) { + m := map[string]string{ + "a": "apple", + "b": "banana", + "c": "cat", + } + n := map[string]string{ + "a": "ccc", + } + tests := []struct { + input string + expected map[string]string + }{ + { + "{'a': 'apple', 'b': 'banana'} + {'c': 'cat'}", + m, + }, + { + "{'a':'bbb'} + {'a':'ccc'}", + n, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + dict, ok := evaluated.(*object.Dict) + if !ok { + t.Fatalf("Object is not an dict, got=%T(%+v)", evaluated, evaluated) + } + + if len(dict.Pairs) != len(tt.expected) { + t.Errorf("Dictionary has wrong number of pairs, got=%d want=%d", len(dict.Pairs), len(tt.expected)) } } } From 0cdb3cbbc00dfb31517b1186e367e876168c87de Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:29:25 +0300 Subject: [PATCH 087/362] Return null upon assigning --- src/evaluator/evaluator_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 65580e7..1eb0a43 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -356,6 +356,21 @@ func TestStringconcatenation(t *testing.T) { } } +func TestStringMultiplyInteger(t *testing.T) { + input := `"Mambo" * 4` + + evaluated := testEval(input) + + str, ok := evaluated.(*object.String) + if !ok { + t.Fatalf("object is not a string, got=%T(%+v)", evaluated, evaluated) + } + + if str.Value != "MamboMamboMamboMambo" { + t.Errorf("String has wrong value, got=%q", str.Value) + } +} + func TestBuiltinFunctions(t *testing.T) { tests := []struct { input string From 616c11ba590d69350f6fe4f0e2fbc0caafeddc3a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:36:01 +0300 Subject: [PATCH 088/362] add tests for && and || --- src/evaluator/evaluator_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 1eb0a43..e1b9830 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -54,6 +54,14 @@ func TestEvalBooleanExpression(t *testing.T) { {"!sikweli", true}, {"!tupu", true}, {"!'kitu'", false}, + {"2 > 1 && 1 < 4", true}, + {"2 > 1 && 1 > 4", false}, + {"2 < 1 && 1 < 4", false}, + {"2 < 1 && 1 > 4", false}, + {"5 < 2 || 3 > 2", true}, + {"5 == 5 || 4 == 4", true}, + {"5 > 2 || 3 < 2", true}, + {"5 < 2 || 3 < 2", false}, } for _, tt := range tests { From e252de6620f3075ecc818d54f08dc4f3eda01a88 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:38:58 +0300 Subject: [PATCH 089/362] add better test for dict concat --- src/evaluator/evaluator_test.go | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index e1b9830..ce13c15 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -694,25 +694,17 @@ func TestArrayConcatenation(t *testing.T) { } func TestDictConcatenation(t *testing.T) { - m := map[string]string{ - "a": "apple", - "b": "banana", - "c": "cat", - } - n := map[string]string{ - "a": "ccc", - } tests := []struct { input string expected map[string]string }{ { - "{'a': 'apple', 'b': 'banana'} + {'c': 'cat'}", - m, + input: "{'a': 'apple', 'b': 'banana'} + {'c': 'cat'}", + expected: map[string]string{"a": "apple", "b": "banana", "c": "cat"}, }, { - "{'a':'bbb'} + {'a':'ccc'}", - n, + input: "{'a':'bbb'} + {'a':'ccc'}", + expected: map[string]string{"a": "ccc"}, }, } From d99af74b6f14858924e59b89be2bb38d80b2dcb0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:42:10 +0300 Subject: [PATCH 090/362] add tests for >= and <= --- src/evaluator/evaluator_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index ce13c15..57152dd 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -62,6 +62,8 @@ func TestEvalBooleanExpression(t *testing.T) { {"5 == 5 || 4 == 4", true}, {"5 > 2 || 3 < 2", true}, {"5 < 2 || 3 < 2", false}, + {"5 >= 2", true}, + {"5 <= 2", false}, } for _, tt := range tests { From d99b7cb747fb87620851b6abd44e0bb41911730b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:44:31 +0300 Subject: [PATCH 091/362] add tests for power (**) operator --- src/evaluator/evaluator_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 57152dd..f92706c 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -21,6 +21,7 @@ func TestEvalIntegerExpression(t *testing.T) { {"5 + 5 + 5 + 5 - 10", 10}, {"2 * 2 * 2 * 2", 16}, {"2 / 2 + 1", 2}, + {"2**3", 8}, } for _, tt := range tests { From a1408bdcf2aaac54a379b73aa2ceb83d30fe82f6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 15:58:41 +0300 Subject: [PATCH 092/362] add tests for postfix --- src/evaluator/evaluator_test.go | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index f92706c..9d7a573 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -723,3 +723,50 @@ func TestDictConcatenation(t *testing.T) { } } } + +func TestPostfixExpression(t *testing.T) { + inttests := []struct { + input string + expected int64 + }{ + { + "a=5; a++", + 6, + }, + { + "a=5; a--", + 4, + }, + } + + for _, tt := range inttests { + evaluated := testEval(tt.input) + integer, ok := evaluated.(*object.Integer) + if !ok { + t.Fatalf("Object is not an integer, got=%T(%+v)", evaluated, evaluated) + } + testIntegerObject(t, integer, tt.expected) + } + floattests := []struct { + input string + expected float64 + }{ + { + "a=5.5; a++", + 6.5, + }, + { + "a=5.5; a--", + 4.5, + }, + } + + for _, tt := range floattests { + evaluated := testEval(tt.input) + float, ok := evaluated.(*object.Float) + if !ok { + t.Fatalf("Object is not an float, got=%T(%+v)", evaluated, evaluated) + } + testFloatObject(t, float, tt.expected) + } +} From 17d47864912063b961753fc222b11e3281de9ab8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 16:31:49 +0300 Subject: [PATCH 093/362] add tests for while loop --- src/evaluator/evaluator_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 9d7a573..136b72a 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -770,3 +770,24 @@ func TestPostfixExpression(t *testing.T) { testFloatObject(t, float, tt.expected) } } + +func TestWhileLoop(t *testing.T) { + input := ` + i = 10 + wakati (i > 0){ + andika(i) + i-- + } + i + ` + + evaluated := testEval(input) + i, ok := evaluated.(*object.Integer) + if !ok { + t.Fatalf("Object is not an integer, got=%T(+%v)", evaluated, evaluated) + } + + if i.Value != 0 { + t.Errorf("Incorrect value, want=0 got=%d", i.Value) + } +} From b8c85a97aa09f6fe53a915efd0d37d4dd60aefd0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 16:44:19 +0300 Subject: [PATCH 094/362] add test to break loop --- src/evaluator/evaluator_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 136b72a..cd19524 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -791,3 +791,25 @@ func TestWhileLoop(t *testing.T) { t.Errorf("Incorrect value, want=0 got=%d", i.Value) } } + +func TestBreakLoop(t *testing.T) { + input := ` + i = 0 + wakati (i < 10) { + kama (i == 5) { + vunja + } + i++ + } + i + ` + evaluated := testEval(input) + i, ok := evaluated.(*object.Integer) + if !ok { + t.Fatalf("Object is not an integer, got=%T(+%v)", evaluated, evaluated) + } + + if i.Value != 5 { + t.Errorf("Wrong value: want=5, got=%d", i.Value) + } +} From 07261f76b3a45b91feedabffc39d70c645819964 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 16:54:31 +0300 Subject: [PATCH 095/362] add test for loop --- src/evaluator/evaluator_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index cd19524..7bc2bc7 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -792,6 +792,25 @@ func TestWhileLoop(t *testing.T) { } } +func TestForLoop(t *testing.T) { + input := ` + output = "" + kwa i ktk "mojo" { + output += i + } + output + ` + evaluated := testEval(input) + i, ok := evaluated.(*object.String) + if !ok { + t.Fatalf("Object is not a string, got=%T(+%v)", evaluated, evaluated) + } + + if i.Value != "mojo" { + t.Errorf("Wrong value: want=%s got=%s", "mojo", i.Value) + } +} + func TestBreakLoop(t *testing.T) { input := ` i = 0 From 1b863a5d26c66bacec2375a50124238399712b2b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 16:59:54 +0300 Subject: [PATCH 096/362] add test breaking out of for loop --- src/evaluator/evaluator_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 7bc2bc7..38f86f6 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -831,4 +831,25 @@ func TestBreakLoop(t *testing.T) { if i.Value != 5 { t.Errorf("Wrong value: want=5, got=%d", i.Value) } + + input = ` + output = "" + kwa i ktk "mojo" { + output += i + kama (i == 'o') { + vunja + } + } + output + ` + + evaluatedFor := testEval(input) + j, ok := evaluatedFor.(*object.String) + if !ok { + t.Fatalf("Object is not a string, got=%T", evaluated) + } + + if j.Value != "mo" { + t.Errorf("Wrong value: want=%s, got=%s", "mo", j.Value) + } } From c5b4a4db4e7eac693f07a13a1f6cadbe35dfd914 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 17:08:49 +0300 Subject: [PATCH 097/362] add tests for continuing loop --- src/evaluator/evaluator_test.go | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 38f86f6..3e12d07 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -853,3 +853,47 @@ func TestBreakLoop(t *testing.T) { t.Errorf("Wrong value: want=%s, got=%s", "mo", j.Value) } } + +func TestContinueLoop(t *testing.T) { + input := ` + i = 0 + wakati (i < 10) { + i++ + kama (i == 5) { + endelea + } + i++ + } + i + ` + evaluated := testEval(input) + i, ok := evaluated.(*object.Integer) + if !ok { + t.Fatalf("Object is not an integer, got=%T(+%v)", evaluated, evaluated) + } + + if i.Value != 11 { + t.Errorf("Wrong value: want=11, got=%d", i.Value) + } + + input = ` + output = "" + kwa i ktk "mojo" { + kama (i == 'o') { + endelea + } + output += i + } + output + ` + + evaluatedFor := testEval(input) + j, ok := evaluatedFor.(*object.String) + if !ok { + t.Fatalf("Object is not a string, got=%T", evaluated) + } + + if j.Value != "mj" { + t.Errorf("Wrong value: want=%s, got=%s", "mj", j.Value) + } +} From f11a93f93dfbf1d07ce4924576e9755bad6dd6c2 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 17:45:11 +0300 Subject: [PATCH 098/362] add tests for switch statements --- src/evaluator/evaluator_test.go | 78 +++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 3e12d07..76e464f 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -897,3 +897,81 @@ func TestContinueLoop(t *testing.T) { t.Errorf("Wrong value: want=%s, got=%s", "mj", j.Value) } } + +func TestSwitchStatement(t *testing.T) { + tests := []struct { + input string + expected interface{} + }{ + { + ` + i = 5 + badili (i) { + ikiwa 2 { + output = 2 + } + ikiwa 5 { + output = 5 + } + kawaida { + output = "haijulikani" + } + } + output + `, + 5, + }, + { + ` + i = 5 + badili (i) { + ikiwa 2 { + output = 2 + } + kawaida { + output = "haijulikani" + } + } + output + `, + "haijulikani", + }, + { + ` + i = 5 + badili (i) { + ikiwa 5 { + output = 5 + } + ikiwa 2 { + output = 2 + } + kawaida { + output = "haijulikani" + } + } + output + `, + 5, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + + switch expected := tt.expected.(type) { + case int: + testIntegerObject(t, evaluated, int64(expected)) + case string: + s, ok := evaluated.(*object.String) + if !ok { + t.Fatalf("Object is not a string, got=%T", evaluated) + } + + if s.Value != "haijulikani" { + t.Errorf("Wrong Value, want='haijulikani', got=%s", s.Value) + } + + } + } +} From 1de21a056e77814b542b7c5cd5640da9d4f3e009 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 18:02:18 +0300 Subject: [PATCH 099/362] add tests for assign equal --- src/evaluator/evaluator_test.go | 76 ++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 76e464f..4d5958c 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -968,10 +968,84 @@ func TestSwitchStatement(t *testing.T) { t.Fatalf("Object is not a string, got=%T", evaluated) } - if s.Value != "haijulikani" { + if s.Value != tt.expected { t.Errorf("Wrong Value, want='haijulikani', got=%s", s.Value) } } } } + +func TestAssignEqual(t *testing.T) { + tests := []struct { + input string + expected interface{} + }{ + {"a = 5; a += 5", + 10, + }, + { + "a = 5; a -= 5", + 0, + }, + { + "a = 5; a *= 10", + 50, + }, + { + "a = 100; a /= 4", + 25, + }, + { + ` + a = [1, 2, 3] + a[0] += 500 + a[0] + `, + 501, + }, + { + ` + a = "mambo" + a += " vipi" + `, + "mambo vipi", + }, + { + "a = 5.5; a += 4.5", + 10.0, + }, + { + "a = 11.3; a -= 0.8", + 10.5, + }, + { + "a = 0.4; a /= 2", + 0.2, + }, + { + "a = 0.1; a *= 10", + 1.0, + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + + switch expected := tt.expected.(type) { + case int: + testIntegerObject(t, evaluated, int64(expected)) + case float64: + testFloatObject(t, evaluated, float64(expected)) + case string: + s, ok := evaluated.(*object.String) + if !ok { + t.Fatalf("Object not a string, got=%T", evaluated) + } + + if s.Value != tt.expected { + t.Errorf("Wrong value, want=%s, got=%s", tt.expected, s.Value) + } + } + } +} From 6b6d977a51c5082674b2429462955092784a6743 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 18:08:30 +0300 Subject: [PATCH 100/362] remove printing from while loop test --- src/evaluator/evaluator_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 4d5958c..d4411ff 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -775,7 +775,6 @@ func TestWhileLoop(t *testing.T) { input := ` i = 10 wakati (i > 0){ - andika(i) i-- } i From 99b7851380133718893d4baf25d27bf6f547815a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 21:15:57 +0300 Subject: [PATCH 101/362] add tests for time module --- src/evaluator/evaluator_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index d4411ff..183fa9b 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -3,6 +3,7 @@ package evaluator import ( "fmt" "testing" + "time" "github.com/AvicennaJr/Nuru/lexer" "github.com/AvicennaJr/Nuru/object" @@ -1048,3 +1049,21 @@ func TestAssignEqual(t *testing.T) { } } } + +func TestTimeModule(t *testing.T) { + input := ` + tumia muda + muda.hasahivi() + ` + + evaluated := testEval(input) + muda, ok := evaluated.(*object.Time) + if !ok { + t.Fatalf("Object is not a time object, got=%T", evaluated) + } + + _, err := time.Parse("2006-01-02 15:04:05", muda.TimeValue) + if err != nil { + t.Errorf("Wrong time value: got=%v", err) + } +} From 839d390d69150f165884613a666e1e524cd23a46 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 21:44:50 +0300 Subject: [PATCH 102/362] add tests for string methods --- src/evaluator/evaluator_test.go | 53 +++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/evaluator/evaluator_test.go b/src/evaluator/evaluator_test.go index 183fa9b..7207442 100644 --- a/src/evaluator/evaluator_test.go +++ b/src/evaluator/evaluator_test.go @@ -1050,6 +1050,59 @@ func TestAssignEqual(t *testing.T) { } } +func TestStringMethods(t *testing.T) { + tests := []struct { + input string + expected interface{} + }{ + { + "'mambo'.idadi()", + 5, + }, + { + "'mambo'.herufikubwa()", + "MAMBO", + }, + { + "'MaMbO'.herufindogo()", + "mambo", + }, + { + "'habari'.gawa('a')", + "[h, b, ri]", + }, + } + + for _, tt := range tests { + evaluated := testEval(tt.input) + + switch expected := tt.expected.(type) { + case int: + testIntegerObject(t, evaluated, int64(expected)) + case string: + switch eval := evaluated.(type) { + case *object.String: + s, ok := evaluated.(*object.String) + if !ok { + t.Fatalf("Object not of type string, got=%T", eval) + } + if s.Value != tt.expected { + t.Errorf("Wrong value: want=%s, got=%s", tt.expected, s.Value) + } + case *object.Array: + arr, ok := evaluated.(*object.Array) + if !ok { + t.Fatalf("Object not of type array, got=%T", eval) + } + + if arr.Inspect() != tt.expected { + t.Errorf("Wrong value: want=%s, got=%s", tt.expected, arr.Inspect()) + } + } + } + } +} + func TestTimeModule(t *testing.T) { input := ` tumia muda From 5482c08355c6e90f2246d62dda39e44be30aaaf4 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 21:48:49 +0300 Subject: [PATCH 103/362] update gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 37bb5b4..2f7d12d 100644 --- a/.gitignore +++ b/.gitignore @@ -49,4 +49,5 @@ _testmain.go src/testbinaries src/tests_random src/nuru -Notes.md \ No newline at end of file +Notes.md +gotest From 8e4ea050c86a9c30c4d8cb827ea232809fd35c6c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 21:48:59 +0300 Subject: [PATCH 104/362] verbose tests --- src/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Makefile b/src/Makefile index 5fc75ed..c5f6b92 100644 --- a/src/Makefile +++ b/src/Makefile @@ -23,10 +23,10 @@ build_test: mv test testbinaries/ test: - go test ./parser/ - go test ./ast/ - go test ./evaluator/ - go test ./object/ + go test -v ./parser/ + go test -v ./ast/ + go test -v ./evaluator/ + go test -v ./object/ clean: - go clean \ No newline at end of file + go clean From 62cd6cfdaa5e48aac44b6c22971db501f7fe96ff Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:04:56 +0300 Subject: [PATCH 105/362] add tests --- .github/workflows/tests.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000..6101ca5 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,21 @@ +name: Go + +on: + push: + branches: [ main ] + +jobs: + + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Go + uses: actions/setup-go@v2 + with: + go-version: 1.20 + + - name: Test + run: cd src && make test + From 7c80f15a47c8ea98e244899007b31eb884f87dab Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:15:09 +0300 Subject: [PATCH 106/362] use checkout v3 --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6101ca5..cc75460 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -9,10 +9,10 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: go-version: 1.20 From abf2357c7e2d9363cedf313d7fceaa8f3e45e0a3 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:23:07 +0300 Subject: [PATCH 107/362] restructered project --- .gitignore | 6 +++--- src/Makefile => Makefile | 0 {src/ast => ast}/ast.go | 0 {src/ast => ast}/ast_test.go | 0 {src/evaluator => evaluator}/assign.go | 0 {src/evaluator => evaluator}/assignEqual.go | 0 {src/evaluator => evaluator}/bang.go | 0 {src/evaluator => evaluator}/block.go | 0 {src/evaluator => evaluator}/builtins.go | 0 {src/evaluator => evaluator}/call.go | 0 {src/evaluator => evaluator}/dict.go | 0 {src/evaluator => evaluator}/evaluator.go | 0 {src/evaluator => evaluator}/evaluator_test.go | 0 {src/evaluator => evaluator}/forin.go | 0 {src/evaluator => evaluator}/function.go | 0 {src/evaluator => evaluator}/identifier.go | 0 {src/evaluator => evaluator}/if.go | 0 {src/evaluator => evaluator}/import.go | 0 {src/evaluator => evaluator}/in.go | 0 {src/evaluator => evaluator}/index.go | 0 {src/evaluator => evaluator}/infix.go | 0 {src/evaluator => evaluator}/method.go | 0 {src/evaluator => evaluator}/postfix.go | 0 {src/evaluator => evaluator}/prefix.go | 0 {src/evaluator => evaluator}/switch.go | 0 {src/evaluator => evaluator}/while.go | 0 {src/examples => examples}/example.nr | 0 {src/examples => examples}/sorting_algorithm.nr | 0 {src/examples => examples}/sudoku_solver.nr | 0 src/go.mod => go.mod | 0 {src/lexer => lexer}/lexer.go | 0 {src/lexer => lexer}/lexer_test.go | 0 src/main.go => main.go | 0 {src/module => module}/json.go | 0 {src/module => module}/module.go | 0 {src/module => module}/net.go | 0 {src/module => module}/os.go | 0 {src/module => module}/time.go | 0 {src/object => object}/array.go | 0 {src/object => object}/bool.go | 0 {src/object => object}/break.go | 0 {src/object => object}/builtin.go | 0 {src/object => object}/byte.go | 0 {src/object => object}/continue.go | 0 {src/object => object}/dict.go | 0 {src/object => object}/environment.go | 0 {src/object => object}/error.go | 0 {src/object => object}/file.go | 0 {src/object => object}/float.go | 0 {src/object => object}/function.go | 0 {src/object => object}/integer.go | 0 {src/object => object}/module.go | 0 {src/object => object}/null.go | 0 {src/object => object}/object.go | 0 {src/object => object}/object_test.go | 0 {src/object => object}/return.go | 0 {src/object => object}/strings.go | 0 {src/object => object}/time.go | 0 {src/parser => parser}/arrays.go | 0 {src/parser => parser}/assignEqual.go | 0 {src/parser => parser}/assignment.go | 0 {src/parser => parser}/boolean.go | 0 {src/parser => parser}/break.go | 0 {src/parser => parser}/continue.go | 0 {src/parser => parser}/dict.go | 0 {src/parser => parser}/dot.go | 0 {src/parser => parser}/float.go | 0 {src/parser => parser}/for.go | 0 {src/parser => parser}/function.go | 0 {src/parser => parser}/identifier.go | 0 {src/parser => parser}/if.go | 0 {src/parser => parser}/import.go | 0 {src/parser => parser}/index.go | 0 {src/parser => parser}/integer.go | 0 {src/parser => parser}/null.go | 0 {src/parser => parser}/parser.go | 0 {src/parser => parser}/parser_test.go | 0 {src/parser => parser}/statements.go | 0 {src/parser => parser}/string.go | 0 {src/parser => parser}/switch.go | 0 {src/parser => parser}/while.go | 0 {src/repl => repl}/repl.go | 0 {src/token => token}/token.go | 0 83 files changed, 3 insertions(+), 3 deletions(-) rename src/Makefile => Makefile (100%) rename {src/ast => ast}/ast.go (100%) rename {src/ast => ast}/ast_test.go (100%) rename {src/evaluator => evaluator}/assign.go (100%) rename {src/evaluator => evaluator}/assignEqual.go (100%) rename {src/evaluator => evaluator}/bang.go (100%) rename {src/evaluator => evaluator}/block.go (100%) rename {src/evaluator => evaluator}/builtins.go (100%) rename {src/evaluator => evaluator}/call.go (100%) rename {src/evaluator => evaluator}/dict.go (100%) rename {src/evaluator => evaluator}/evaluator.go (100%) rename {src/evaluator => evaluator}/evaluator_test.go (100%) rename {src/evaluator => evaluator}/forin.go (100%) rename {src/evaluator => evaluator}/function.go (100%) rename {src/evaluator => evaluator}/identifier.go (100%) rename {src/evaluator => evaluator}/if.go (100%) rename {src/evaluator => evaluator}/import.go (100%) rename {src/evaluator => evaluator}/in.go (100%) rename {src/evaluator => evaluator}/index.go (100%) rename {src/evaluator => evaluator}/infix.go (100%) rename {src/evaluator => evaluator}/method.go (100%) rename {src/evaluator => evaluator}/postfix.go (100%) rename {src/evaluator => evaluator}/prefix.go (100%) rename {src/evaluator => evaluator}/switch.go (100%) rename {src/evaluator => evaluator}/while.go (100%) rename {src/examples => examples}/example.nr (100%) rename {src/examples => examples}/sorting_algorithm.nr (100%) rename {src/examples => examples}/sudoku_solver.nr (100%) rename src/go.mod => go.mod (100%) rename {src/lexer => lexer}/lexer.go (100%) rename {src/lexer => lexer}/lexer_test.go (100%) rename src/main.go => main.go (100%) rename {src/module => module}/json.go (100%) rename {src/module => module}/module.go (100%) rename {src/module => module}/net.go (100%) rename {src/module => module}/os.go (100%) rename {src/module => module}/time.go (100%) rename {src/object => object}/array.go (100%) rename {src/object => object}/bool.go (100%) rename {src/object => object}/break.go (100%) rename {src/object => object}/builtin.go (100%) rename {src/object => object}/byte.go (100%) rename {src/object => object}/continue.go (100%) rename {src/object => object}/dict.go (100%) rename {src/object => object}/environment.go (100%) rename {src/object => object}/error.go (100%) rename {src/object => object}/file.go (100%) rename {src/object => object}/float.go (100%) rename {src/object => object}/function.go (100%) rename {src/object => object}/integer.go (100%) rename {src/object => object}/module.go (100%) rename {src/object => object}/null.go (100%) rename {src/object => object}/object.go (100%) rename {src/object => object}/object_test.go (100%) rename {src/object => object}/return.go (100%) rename {src/object => object}/strings.go (100%) rename {src/object => object}/time.go (100%) rename {src/parser => parser}/arrays.go (100%) rename {src/parser => parser}/assignEqual.go (100%) rename {src/parser => parser}/assignment.go (100%) rename {src/parser => parser}/boolean.go (100%) rename {src/parser => parser}/break.go (100%) rename {src/parser => parser}/continue.go (100%) rename {src/parser => parser}/dict.go (100%) rename {src/parser => parser}/dot.go (100%) rename {src/parser => parser}/float.go (100%) rename {src/parser => parser}/for.go (100%) rename {src/parser => parser}/function.go (100%) rename {src/parser => parser}/identifier.go (100%) rename {src/parser => parser}/if.go (100%) rename {src/parser => parser}/import.go (100%) rename {src/parser => parser}/index.go (100%) rename {src/parser => parser}/integer.go (100%) rename {src/parser => parser}/null.go (100%) rename {src/parser => parser}/parser.go (100%) rename {src/parser => parser}/parser_test.go (100%) rename {src/parser => parser}/statements.go (100%) rename {src/parser => parser}/string.go (100%) rename {src/parser => parser}/switch.go (100%) rename {src/parser => parser}/while.go (100%) rename {src/repl => repl}/repl.go (100%) rename {src/token => token}/token.go (100%) diff --git a/.gitignore b/.gitignore index 2f7d12d..dacbb88 100644 --- a/.gitignore +++ b/.gitignore @@ -46,8 +46,8 @@ _testmain.go #Personal -src/testbinaries -src/tests_random -src/nuru +testbinaries/ +tests_random/ +nuru Notes.md gotest diff --git a/src/Makefile b/Makefile similarity index 100% rename from src/Makefile rename to Makefile diff --git a/src/ast/ast.go b/ast/ast.go similarity index 100% rename from src/ast/ast.go rename to ast/ast.go diff --git a/src/ast/ast_test.go b/ast/ast_test.go similarity index 100% rename from src/ast/ast_test.go rename to ast/ast_test.go diff --git a/src/evaluator/assign.go b/evaluator/assign.go similarity index 100% rename from src/evaluator/assign.go rename to evaluator/assign.go diff --git a/src/evaluator/assignEqual.go b/evaluator/assignEqual.go similarity index 100% rename from src/evaluator/assignEqual.go rename to evaluator/assignEqual.go diff --git a/src/evaluator/bang.go b/evaluator/bang.go similarity index 100% rename from src/evaluator/bang.go rename to evaluator/bang.go diff --git a/src/evaluator/block.go b/evaluator/block.go similarity index 100% rename from src/evaluator/block.go rename to evaluator/block.go diff --git a/src/evaluator/builtins.go b/evaluator/builtins.go similarity index 100% rename from src/evaluator/builtins.go rename to evaluator/builtins.go diff --git a/src/evaluator/call.go b/evaluator/call.go similarity index 100% rename from src/evaluator/call.go rename to evaluator/call.go diff --git a/src/evaluator/dict.go b/evaluator/dict.go similarity index 100% rename from src/evaluator/dict.go rename to evaluator/dict.go diff --git a/src/evaluator/evaluator.go b/evaluator/evaluator.go similarity index 100% rename from src/evaluator/evaluator.go rename to evaluator/evaluator.go diff --git a/src/evaluator/evaluator_test.go b/evaluator/evaluator_test.go similarity index 100% rename from src/evaluator/evaluator_test.go rename to evaluator/evaluator_test.go diff --git a/src/evaluator/forin.go b/evaluator/forin.go similarity index 100% rename from src/evaluator/forin.go rename to evaluator/forin.go diff --git a/src/evaluator/function.go b/evaluator/function.go similarity index 100% rename from src/evaluator/function.go rename to evaluator/function.go diff --git a/src/evaluator/identifier.go b/evaluator/identifier.go similarity index 100% rename from src/evaluator/identifier.go rename to evaluator/identifier.go diff --git a/src/evaluator/if.go b/evaluator/if.go similarity index 100% rename from src/evaluator/if.go rename to evaluator/if.go diff --git a/src/evaluator/import.go b/evaluator/import.go similarity index 100% rename from src/evaluator/import.go rename to evaluator/import.go diff --git a/src/evaluator/in.go b/evaluator/in.go similarity index 100% rename from src/evaluator/in.go rename to evaluator/in.go diff --git a/src/evaluator/index.go b/evaluator/index.go similarity index 100% rename from src/evaluator/index.go rename to evaluator/index.go diff --git a/src/evaluator/infix.go b/evaluator/infix.go similarity index 100% rename from src/evaluator/infix.go rename to evaluator/infix.go diff --git a/src/evaluator/method.go b/evaluator/method.go similarity index 100% rename from src/evaluator/method.go rename to evaluator/method.go diff --git a/src/evaluator/postfix.go b/evaluator/postfix.go similarity index 100% rename from src/evaluator/postfix.go rename to evaluator/postfix.go diff --git a/src/evaluator/prefix.go b/evaluator/prefix.go similarity index 100% rename from src/evaluator/prefix.go rename to evaluator/prefix.go diff --git a/src/evaluator/switch.go b/evaluator/switch.go similarity index 100% rename from src/evaluator/switch.go rename to evaluator/switch.go diff --git a/src/evaluator/while.go b/evaluator/while.go similarity index 100% rename from src/evaluator/while.go rename to evaluator/while.go diff --git a/src/examples/example.nr b/examples/example.nr similarity index 100% rename from src/examples/example.nr rename to examples/example.nr diff --git a/src/examples/sorting_algorithm.nr b/examples/sorting_algorithm.nr similarity index 100% rename from src/examples/sorting_algorithm.nr rename to examples/sorting_algorithm.nr diff --git a/src/examples/sudoku_solver.nr b/examples/sudoku_solver.nr similarity index 100% rename from src/examples/sudoku_solver.nr rename to examples/sudoku_solver.nr diff --git a/src/go.mod b/go.mod similarity index 100% rename from src/go.mod rename to go.mod diff --git a/src/lexer/lexer.go b/lexer/lexer.go similarity index 100% rename from src/lexer/lexer.go rename to lexer/lexer.go diff --git a/src/lexer/lexer_test.go b/lexer/lexer_test.go similarity index 100% rename from src/lexer/lexer_test.go rename to lexer/lexer_test.go diff --git a/src/main.go b/main.go similarity index 100% rename from src/main.go rename to main.go diff --git a/src/module/json.go b/module/json.go similarity index 100% rename from src/module/json.go rename to module/json.go diff --git a/src/module/module.go b/module/module.go similarity index 100% rename from src/module/module.go rename to module/module.go diff --git a/src/module/net.go b/module/net.go similarity index 100% rename from src/module/net.go rename to module/net.go diff --git a/src/module/os.go b/module/os.go similarity index 100% rename from src/module/os.go rename to module/os.go diff --git a/src/module/time.go b/module/time.go similarity index 100% rename from src/module/time.go rename to module/time.go diff --git a/src/object/array.go b/object/array.go similarity index 100% rename from src/object/array.go rename to object/array.go diff --git a/src/object/bool.go b/object/bool.go similarity index 100% rename from src/object/bool.go rename to object/bool.go diff --git a/src/object/break.go b/object/break.go similarity index 100% rename from src/object/break.go rename to object/break.go diff --git a/src/object/builtin.go b/object/builtin.go similarity index 100% rename from src/object/builtin.go rename to object/builtin.go diff --git a/src/object/byte.go b/object/byte.go similarity index 100% rename from src/object/byte.go rename to object/byte.go diff --git a/src/object/continue.go b/object/continue.go similarity index 100% rename from src/object/continue.go rename to object/continue.go diff --git a/src/object/dict.go b/object/dict.go similarity index 100% rename from src/object/dict.go rename to object/dict.go diff --git a/src/object/environment.go b/object/environment.go similarity index 100% rename from src/object/environment.go rename to object/environment.go diff --git a/src/object/error.go b/object/error.go similarity index 100% rename from src/object/error.go rename to object/error.go diff --git a/src/object/file.go b/object/file.go similarity index 100% rename from src/object/file.go rename to object/file.go diff --git a/src/object/float.go b/object/float.go similarity index 100% rename from src/object/float.go rename to object/float.go diff --git a/src/object/function.go b/object/function.go similarity index 100% rename from src/object/function.go rename to object/function.go diff --git a/src/object/integer.go b/object/integer.go similarity index 100% rename from src/object/integer.go rename to object/integer.go diff --git a/src/object/module.go b/object/module.go similarity index 100% rename from src/object/module.go rename to object/module.go diff --git a/src/object/null.go b/object/null.go similarity index 100% rename from src/object/null.go rename to object/null.go diff --git a/src/object/object.go b/object/object.go similarity index 100% rename from src/object/object.go rename to object/object.go diff --git a/src/object/object_test.go b/object/object_test.go similarity index 100% rename from src/object/object_test.go rename to object/object_test.go diff --git a/src/object/return.go b/object/return.go similarity index 100% rename from src/object/return.go rename to object/return.go diff --git a/src/object/strings.go b/object/strings.go similarity index 100% rename from src/object/strings.go rename to object/strings.go diff --git a/src/object/time.go b/object/time.go similarity index 100% rename from src/object/time.go rename to object/time.go diff --git a/src/parser/arrays.go b/parser/arrays.go similarity index 100% rename from src/parser/arrays.go rename to parser/arrays.go diff --git a/src/parser/assignEqual.go b/parser/assignEqual.go similarity index 100% rename from src/parser/assignEqual.go rename to parser/assignEqual.go diff --git a/src/parser/assignment.go b/parser/assignment.go similarity index 100% rename from src/parser/assignment.go rename to parser/assignment.go diff --git a/src/parser/boolean.go b/parser/boolean.go similarity index 100% rename from src/parser/boolean.go rename to parser/boolean.go diff --git a/src/parser/break.go b/parser/break.go similarity index 100% rename from src/parser/break.go rename to parser/break.go diff --git a/src/parser/continue.go b/parser/continue.go similarity index 100% rename from src/parser/continue.go rename to parser/continue.go diff --git a/src/parser/dict.go b/parser/dict.go similarity index 100% rename from src/parser/dict.go rename to parser/dict.go diff --git a/src/parser/dot.go b/parser/dot.go similarity index 100% rename from src/parser/dot.go rename to parser/dot.go diff --git a/src/parser/float.go b/parser/float.go similarity index 100% rename from src/parser/float.go rename to parser/float.go diff --git a/src/parser/for.go b/parser/for.go similarity index 100% rename from src/parser/for.go rename to parser/for.go diff --git a/src/parser/function.go b/parser/function.go similarity index 100% rename from src/parser/function.go rename to parser/function.go diff --git a/src/parser/identifier.go b/parser/identifier.go similarity index 100% rename from src/parser/identifier.go rename to parser/identifier.go diff --git a/src/parser/if.go b/parser/if.go similarity index 100% rename from src/parser/if.go rename to parser/if.go diff --git a/src/parser/import.go b/parser/import.go similarity index 100% rename from src/parser/import.go rename to parser/import.go diff --git a/src/parser/index.go b/parser/index.go similarity index 100% rename from src/parser/index.go rename to parser/index.go diff --git a/src/parser/integer.go b/parser/integer.go similarity index 100% rename from src/parser/integer.go rename to parser/integer.go diff --git a/src/parser/null.go b/parser/null.go similarity index 100% rename from src/parser/null.go rename to parser/null.go diff --git a/src/parser/parser.go b/parser/parser.go similarity index 100% rename from src/parser/parser.go rename to parser/parser.go diff --git a/src/parser/parser_test.go b/parser/parser_test.go similarity index 100% rename from src/parser/parser_test.go rename to parser/parser_test.go diff --git a/src/parser/statements.go b/parser/statements.go similarity index 100% rename from src/parser/statements.go rename to parser/statements.go diff --git a/src/parser/string.go b/parser/string.go similarity index 100% rename from src/parser/string.go rename to parser/string.go diff --git a/src/parser/switch.go b/parser/switch.go similarity index 100% rename from src/parser/switch.go rename to parser/switch.go diff --git a/src/parser/while.go b/parser/while.go similarity index 100% rename from src/parser/while.go rename to parser/while.go diff --git a/src/repl/repl.go b/repl/repl.go similarity index 100% rename from src/repl/repl.go rename to repl/repl.go diff --git a/src/token/token.go b/token/token.go similarity index 100% rename from src/token/token.go rename to token/token.go From 0939ac92ab0e6b6c7c90d5f751be4d1d4130a887 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:23:42 +0300 Subject: [PATCH 108/362] update test workflow --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cc75460..ce34500 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,5 +17,5 @@ jobs: go-version: 1.20 - name: Test - run: cd src && make test + run: make test From 646b34342b4100df76be155aa41ba8a43db48fa0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:32:07 +0300 Subject: [PATCH 109/362] add go mod tidy command --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ce34500..dd8d95a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,8 +14,8 @@ jobs: - name: Set up Go uses: actions/setup-go@v3 with: - go-version: 1.20 + go-version: 1.18 - name: Test - run: make test + run: go mod tidy && make test From 1a95ecb0b40365625240cb28c530a9c217f24579 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:36:40 +0300 Subject: [PATCH 110/362] add tests passing to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 517d117..efccf25 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@
Nuru Programming Language Nuru Programming Language + Nuru Programming Language
Nuru Programming Language

From 4410ebf036771018e8aa38e937ee607d50cb3abd Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:42:18 +0300 Subject: [PATCH 111/362] add feature request template --- .github/ISSUE_TEMPLATE/feature-request.yml | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..9cb0708 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,65 @@ +name: 🚀 Feature Request +description: Suggest an idea for this project +title: (feature request summary) +labels: Feature Request +body: + - type: textarea + id: description + attributes: + label: Describe the feature + description: A clear and concise description of the feature you are proposing. + validations: + required: true + + - type: textarea + id: use-case + attributes: + label: Use Case + description: | + Why do you need this feature? For example: "I'm always frustrated when..." + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Proposed Solution + description: Suggest how to implement the addition or change. Please include prototype/workaround/sketch/reference implementation. + validations: + required: false + + - type: textarea + id: other + attributes: + label: Other Information + description: Any alternative solutions or features you considered, a more detailed explanation, stack traces, related issues, links for context, etc. + validations: + required: false + + - type: checkboxes + id: ack + attributes: + label: Acknowledgements + options: + - label: I may be able to implement this feature request + required: false + + - label: This feature might incur a breaking change + required: false + + - type: input + id: version + attributes: + label: Version used + description: Please provide the version of the repository or tool you are using. + validations: + required: true + + - type: textarea + id: environment + attributes: + label: Environment details (OS name and version, etc.) + description: You can use `v doctor` to fill up this section. + validations: + required: true + From 150c10e26623078273587a36ed794c9b3f9c039a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:51:15 +0300 Subject: [PATCH 112/362] add bug-report template --- .github/ISSUE_TEMPLATE/bug-report.yml | 82 +++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..4f928f0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,82 @@ +name: 🐛 Bug Report +description: Report a bug +title: (bug report summary) +labels: Bug +body: + - type: textarea + id: description + attributes: + label: Describe the bug + description: What is the problem? A clear and concise description of the bug. + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected Behavior + description: What did you expect to happen? + validations: + required: true + + - type: textarea + id: current + attributes: + label: Current Behavior + description: | + What actually happened? + + Please include full errors, uncaught exceptions, stack traces, and relevant logs. + If service/functions responses are relevant, please include wire logs. + validations: + required: true + + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: | + Provide a self-contained, concise snippet of code that can be used to reproduce the issue. + For more complex issues provide a repo with the smallest sample that reproduces the bug. + + Avoid including business logic or unrelated code, it makes diagnosis more difficult. + The code sample should be an SSCCE. See http://sscce.org/ for details. + In short, please provide a code sample that we can copy/paste, run and reproduce. + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Possible Solution + description: Suggest a fix/reason for the bug + validations: + required: false + + - type: textarea + id: context + attributes: + label: Additional Information/Context + description: | + Anything else that might be relevant for troubleshooting this bug. + Providing context helps us come up with a solution that is most useful in the real world. + validations: + required: false + + - type: input + id: version + attributes: + label: Nuru version + description: | + Please make sure to use the latest version of Nuru before reporting any issues as it may have already been fixed. + validations: + required: true + + - type: textarea + id: environment + attributes: + label: Environment details (OS name and version, etc.) + description: Your operating system (Windows, Linux, Android or MacOS) + validations: + required: true + From 581003fbe6b73adcf550e4ae4bbc7e4b3050fe93 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 22:56:21 +0300 Subject: [PATCH 113/362] update environments --- .github/ISSUE_TEMPLATE/feature-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index 9cb0708..7a32203 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -59,7 +59,7 @@ body: id: environment attributes: label: Environment details (OS name and version, etc.) - description: You can use `v doctor` to fill up this section. + description: Your operating system (Linux, Windows, Android or Mac) validations: required: true From 96f7f9bd730afdd705ebff7d9c8a40587531a044 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 23:08:34 +0300 Subject: [PATCH 114/362] add pull request template --- .github/PULL_REQUEST_TEMPLATE | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE diff --git a/.github/PULL_REQUEST_TEMPLATE b/.github/PULL_REQUEST_TEMPLATE new file mode 100644 index 0000000..92e4962 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE @@ -0,0 +1,31 @@ + + + + From 841c338a7318e72ce66c9339d061a65e9cf2707c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 23:46:31 +0300 Subject: [PATCH 115/362] add parse test for >=, <=, || and && --- parser/parser_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index 631f765..1f93f5f 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -257,6 +257,10 @@ func TestParsingInfixExpressions(t *testing.T) { {"5 < 5;", 5, "<", 5}, {"5 == 5;", 5, "==", 5}, {"5 != 5;", 5, "!=", 5}, + {"5 >= 5;", 5, ">=", 5}, + {"5 <= 5;", 5, "<=", 5}, + {"5 || 5;", 5, "||", 5}, + {"5 && 5;", 5, "&&", 5}, {"kweli == kweli", true, "==", true}, {"kweli != sikweli", true, "!=", false}, {"sikweli == sikweli", false, "==", false}, From 58f0972aaad622b04c374ff36a5d9f1cd45948be Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 23:49:58 +0300 Subject: [PATCH 116/362] add parse postfix tests --- parser/parser_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index 1f93f5f..b75b744 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1065,3 +1065,17 @@ func TestForExpression(t *testing.T) { t.Fatalf("Wrong Value Index, expected 'v' got %s", exp.Value) } } + +func TestParsePostfix(t *testing.T) { + input := []string{ + "a = 5; a++;", + "b = 5; b--;", + } + + for _, txt := range input { + l := lexer.New(txt) + p := New(l) + _ = p.ParseProgram() + checkParserErrors(t, p) + } +} From 4a7d88e8a8694f723817cdb3418d83e88e45f6bd Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Tue, 14 Mar 2023 23:57:29 +0300 Subject: [PATCH 117/362] add tests for parsing dot --- parser/parser_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index b75b744..4833913 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1079,3 +1079,17 @@ func TestParsePostfix(t *testing.T) { checkParserErrors(t, p) } } + +func TestParseDot(t *testing.T) { + input := []string{ + "a.b()", + "5.5", + } + + for _, txt := range input { + l := lexer.New(txt) + p := New(l) + _ = p.ParseProgram() + checkParserErrors(t, p) + } +} From 2973dc65589a061a081211a7c6d0dc47d11e2c94 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 15 Mar 2023 00:00:40 +0300 Subject: [PATCH 118/362] add test for parsing switch --- parser/parser_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index 4833913..a9bb0bf 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1093,3 +1093,24 @@ func TestParseDot(t *testing.T) { checkParserErrors(t, p) } } + +func TestParseSwitch(t *testing.T) { + input := ` + badili (a) { + ikiwa 2 { + andika(2) + } + ikiwa 3 { + andika(3) + } + kawaida { + andika(0) + } + } + ` + + l := lexer.New(input) + p := New(l) + _ = p.ParseProgram() + checkParserErrors(t, p) +} From 083046a2f277ae1d0b22749aa13d77a1d70f128c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 15 Mar 2023 00:02:24 +0300 Subject: [PATCH 119/362] add test import statements --- parser/parser_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/parser/parser_test.go b/parser/parser_test.go index a9bb0bf..9562bd7 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -1114,3 +1114,15 @@ func TestParseSwitch(t *testing.T) { _ = p.ParseProgram() checkParserErrors(t, p) } + +func TestParseImport(t *testing.T) { + input := ` + tumia muda + muda.hasahivi() + ` + + l := lexer.New(input) + p := New(l) + _ = p.ParseProgram() + checkParserErrors(t, p) +} From 20c9e869afe650319d664fb38a5ca476cc0522db Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 15 Mar 2023 00:18:07 +0300 Subject: [PATCH 120/362] add more tests to lexer -> import -> switch -> case -> default -> null -> for -> in --- lexer/lexer_test.go | 46 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lexer/lexer_test.go b/lexer/lexer_test.go index bc11d38..8743b2f 100644 --- a/lexer/lexer_test.go +++ b/lexer/lexer_test.go @@ -41,7 +41,21 @@ func TestNextToken(t *testing.T) { "ba ngi" [1, 2]; {"mambo": "vipi"} - . // test dot` + . // test dot + tumia muda + + badili (a) { + ikiwa 2 { + andika(2) + } + kawaida { + andika(0) + } + } + + tupu + + kwa i, v ktk j` tests := []struct { expectedType token.TokenType @@ -134,6 +148,36 @@ func TestNextToken(t *testing.T) { {token.STRING, "vipi"}, {token.RBRACE, "}"}, {token.DOT, "."}, + {token.IMPORT, "tumia"}, + {token.IDENT, "muda"}, + {token.SWITCH, "badili"}, + {token.LPAREN, "("}, + {token.IDENT, "a"}, + {token.RPAREN, ")"}, + {token.LBRACE, "{"}, + {token.CASE, "ikiwa"}, + {token.INT, "2"}, + {token.LBRACE, "{"}, + {token.IDENT, "andika"}, + {token.LPAREN, "("}, + {token.INT, "2"}, + {token.RPAREN, ")"}, + {token.RBRACE, "}"}, + {token.DEFAULT, "kawaida"}, + {token.LBRACE, "{"}, + {token.IDENT, "andika"}, + {token.LPAREN, "("}, + {token.INT, "0"}, + {token.RPAREN, ")"}, + {token.RBRACE, "}"}, + {token.RBRACE, "}"}, + {token.NULL, "tupu"}, + {token.FOR, "kwa"}, + {token.IDENT, "i"}, + {token.COMMA, ","}, + {token.IDENT, "v"}, + {token.IN, "ktk"}, + {token.IDENT, "j"}, {token.EOF, ""}, } From 6b23942da7259649c461c13a8818c86f9460ac0e Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Wed, 15 Mar 2023 01:05:12 +0300 Subject: [PATCH 121/362] add lexer to test --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index c5f6b92..7fed082 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,7 @@ test: go test -v ./ast/ go test -v ./evaluator/ go test -v ./object/ + go test -v ./lexer/ clean: go clean From 6d990c63165c05e265018664843ac22f84e6c70d Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 16 Mar 2023 16:17:56 +0300 Subject: [PATCH 122/362] return time object on add() method --- object/time.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object/time.go b/object/time.go index 9adc479..92f70a2 100644 --- a/object/time.go +++ b/object/time.go @@ -35,5 +35,5 @@ func (t *Time) add(args []Object) Object { } next_time := cur_time.Add(time.Duration(inttime) * time.Hour) - return &String{Value: string(next_time.Format("2006-01-02 15:04:05"))} + return &Time{TimeValue: string(next_time.Format("2006-01-02 15:04:05"))} } From 7104b90ca6a9e6382ed7411de910e9f37278cd35 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 16 Mar 2023 16:18:42 +0300 Subject: [PATCH 123/362] return custom types on modules --- object/module.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/object/module.go b/object/module.go index 2a708be..4e27e6c 100644 --- a/object/module.go +++ b/object/module.go @@ -7,5 +7,14 @@ type Module struct { Functions map[string]ModuleFunction } -func (m *Module) Type() ObjectType { return MODULE_OBJ } -func (m *Module) Inspect() string { return "Module: " + m.Name } +func (m *Module) Type() ObjectType { + switch m.Name { + case "time": + return TIME_OBJ + case "json": + return JSON_OBJ + default: + return MODULE_OBJ + } +} +func (m *Module) Inspect() string { return "Module: " + m.Name } From 8b48a8b5f8a374790cd1881ab038a36826a9480a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 16 Mar 2023 16:19:00 +0300 Subject: [PATCH 124/362] add json object definition --- object/object.go | 1 + 1 file changed, 1 insertion(+) diff --git a/object/object.go b/object/object.go index 2cf06b3..b435f9e 100644 --- a/object/object.go +++ b/object/object.go @@ -22,6 +22,7 @@ const ( BREAK_OBJ = "VUNJA" FILE_OBJ = "FAILI" TIME_OBJ = "MUDA" + JSON_OBJ = "JSONI" MODULE_OBJ = "MODULE" BYTE_OBJ = "BYTE" ) From 9a4a4f4170a5e978b26cb3a01272a9ba8567c142 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:46:38 +0300 Subject: [PATCH 125/362] Add Name field to Function AST --- ast/ast.go | 1 + 1 file changed, 1 insertion(+) diff --git a/ast/ast.go b/ast/ast.go index e1392da..c95d919 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -211,6 +211,7 @@ func (bs *BlockStatement) String() string { type FunctionLiteral struct { Token token.Token + Name string Parameters []*Identifier Defaults map[string]Expression Body *BlockStatement From d7c2aa508be21f1fc46099cba11e82cf82439492 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:50:43 +0300 Subject: [PATCH 126/362] Add some minor refactoring to call evaluation --- evaluator/call.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/evaluator/call.go b/evaluator/call.go index 2173262..c13c596 100644 --- a/evaluator/call.go +++ b/evaluator/call.go @@ -14,10 +14,8 @@ func evalCall(node *ast.CallExpression, env *object.Environment) object.Object { var args []object.Object - switch function.(type) { + switch fn := function.(type) { case *object.Function: - fn := function.(*object.Function) - args = evalArgsExpressions(node, fn, env) default: args = evalExpressions(node.Arguments, env) @@ -36,14 +34,13 @@ func evalArgsExpressions(node *ast.CallExpression, fn *object.Function, env *obj argsHash.Pairs = make(map[object.HashKey]object.DictPair) for _, exprr := range node.Arguments { switch exp := exprr.(type) { - case *ast.AssignmentExpression: + case *ast.Assign: val := Eval(exp.Value, env) if isError(val) { return []object.Object{val} } - var keyHash object.HashKey - key := &object.String{Value: exp.Left.String()} + key := &object.String{Value: exp.Name.Value} keyHash = key.HashKey() pair := object.DictPair{Key: key, Value: val} argsHash.Pairs[keyHash] = pair From 9bf6e75b256a6baf17edf0ff096cc72b13008db7 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:51:42 +0300 Subject: [PATCH 127/362] Use the new call function to evaluate calls --- evaluator/evaluator.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/evaluator/evaluator.go b/evaluator/evaluator.go index 1911a97..306519a 100644 --- a/evaluator/evaluator.go +++ b/evaluator/evaluator.go @@ -86,15 +86,8 @@ func Eval(node ast.Node, env *object.Environment) object.Object { return evalImport(node, env) case *ast.CallExpression: - function := Eval(node.Function, env) - if isError(function) { - return function - } - args := evalExpressions(node.Arguments, env) - if len(args) == 1 && isError(args[0]) { - return args[0] - } - return applyFunction(function, args, node.Token.Line) + return evalCall(node, env) + case *ast.StringLiteral: return &object.String{Value: node.Value} @@ -279,7 +272,11 @@ func applyFunction(fn object.Object, args []object.Object, line int) object.Obje } return NULL default: - return newError("Mstari %d: Hii sio function: %s", line, fn.Type()) + if fn != nil { + return newError("Mstari %d: Hii sio function: %s", line, fn.Type()) + } else { + return newError("Bro how did you even get here??? Contact language maker asap!") + } } } From f6e95a241212be169a354e535c1a495895941750 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:52:11 +0300 Subject: [PATCH 128/362] Add name field to Function object --- object/function.go | 1 + 1 file changed, 1 insertion(+) diff --git a/object/function.go b/object/function.go index 58db201..444101b 100644 --- a/object/function.go +++ b/object/function.go @@ -8,6 +8,7 @@ import ( ) type Function struct { + Name string Parameters []*ast.Identifier Defaults map[string]ast.Expression Body *ast.BlockStatement From 77e7d57f143a900acd8d63861e3400a94c057901 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:52:41 +0300 Subject: [PATCH 129/362] add peekTwoChars() ahead function for future use --- lexer/lexer.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lexer/lexer.go b/lexer/lexer.go index f789b06..988f2d4 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -242,6 +242,14 @@ func (l *Lexer) peekChar() rune { } } +// func (l *Lexer) peekTwoChar() rune { +// if l.readPosition+1 >= len(l.input) { +// return rune(0) +// } else { +// return l.input[l.readPosition+1] +// } +// } + func (l *Lexer) skipSingleLineComment() { for l.ch != '\n' && l.ch != 0 { l.readChar() From 6146160ac5b52fda72f95c8929e105d03bad35c0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:53:34 +0300 Subject: [PATCH 130/362] remove print statement from while loop test --- parser/parser_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/parser/parser_test.go b/parser/parser_test.go index 9562bd7..91e00ee 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -985,8 +985,6 @@ func TestWhileLoop(t *testing.T) { t.Fatalf("program.Body does not contain %d statements. got=%d", 1, len(program.Statements)) } - fmt.Println(program.Statements) - stmt, ok := program.Statements[0].(*ast.ExpressionStatement) if !ok { t.Fatalf("program.Statements[0] is not ast.Expression, got=%T", program.Statements[0]) From d144035042aae3ec082c326d88ca11446be9334e Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:54:09 +0300 Subject: [PATCH 131/362] add ability to parse default parameters in functions --- parser/function.go | 80 +++++++++++++++++----------------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/parser/function.go b/parser/function.go index 88cda36..50d604e 100644 --- a/parser/function.go +++ b/parser/function.go @@ -8,15 +8,18 @@ import ( func (p *Parser) parseFunctionLiteral() ast.Expression { lit := &ast.FunctionLiteral{Token: p.curToken} + if p.peekTokenIs(token.IDENT) { + p.nextToken() + lit.Name = p.curToken.Literal + } + if !p.expectPeek(token.LPAREN) { return nil } - lit.Parameters = p.parseFunctionParameters() - - // if !p.parseFunctionParameters(lit) { - // return nil - // } + if !p.parseFunctionParameters(lit) { + return nil + } if !p.expectPeek(token.LBRACE) { return nil @@ -27,59 +30,36 @@ func (p *Parser) parseFunctionLiteral() ast.Expression { return lit } -func (p *Parser) parseFunctionParameters() []*ast.Identifier { - identifiers := []*ast.Identifier{} - - if p.peekTokenIs(token.RPAREN) { +func (p *Parser) parseFunctionParameters(lit *ast.FunctionLiteral) bool { + lit.Defaults = make(map[string]ast.Expression) + for !p.peekTokenIs(token.RPAREN) { p.nextToken() - return identifiers - } - p.nextToken() + if p.curTokenIs(token.COMMA) { + continue + } - ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} - identifiers = append(identifiers, ident) - - for p.peekTokenIs(token.COMMA) { - p.nextToken() - p.nextToken() ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} - identifiers = append(identifiers, ident) + lit.Parameters = append(lit.Parameters, ident) + + if p.peekTokenIs(token.ASSIGN) { + p.nextToken() + p.nextToken() + lit.Defaults[ident.Value] = p.parseExpression(LOWEST) + } else { + if len(lit.Defaults) > 0 { + return false + } + } + + if !(p.peekTokenIs(token.COMMA) || p.peekTokenIs(token.RPAREN)) { + return false + } } - if !p.expectPeek(token.RPAREN) { - return nil - } - - return identifiers + return p.expectPeek(token.RPAREN) } -// func (p *Parser) parseFunctionParameters(lit *ast.FunctionLiteral) bool { -// lit.Defaults = make(map[string]ast.Expression) -// for !p.peekTokenIs(token.RPAREN) { -// p.nextToken() - -// if p.curTokenIs(token.COMMA) { -// continue -// } - -// ident := &ast.Identifier{Token: p.curToken, Value: p.curToken.Literal} -// lit.Parameters = append(lit.Parameters, ident) - -// if p.peekTokenIs(token.ASSIGN) { -// p.nextToken() -// p.nextToken() -// lit.Defaults[ident.Value] = p.parseExpression(LOWEST) -// } else { -// if len(lit.Defaults) > 0 { -// return false -// } -// } -// } - -// return !p.expectPeek(token.RPAREN) -// } - func (p *Parser) parseCallExpression(function ast.Expression) ast.Expression { exp := &ast.CallExpression{Token: p.curToken, Function: function} exp.Arguments = p.parseExpressionList(token.RPAREN) From 1a8d8af435968e88771b7da7c33c32332b4163e6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 02:54:41 +0300 Subject: [PATCH 132/362] Add ability to evaluate default parameters in functions --- evaluator/function.go | 1 + 1 file changed, 1 insertion(+) diff --git a/evaluator/function.go b/evaluator/function.go index 266ec8a..aa413d5 100644 --- a/evaluator/function.go +++ b/evaluator/function.go @@ -7,6 +7,7 @@ import ( func evalFunction(node *ast.FunctionLiteral, env *object.Environment) object.Object { function := &object.Function{ + Name: node.Name, Parameters: node.Parameters, Defaults: node.Defaults, Body: node.Body, From c9cfe2f8f8d426876cd33d0067369bfab8f971db Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 03:49:15 +0300 Subject: [PATCH 133/362] Remove array related functions Also remove 'jumla' method, it will be on math package --- evaluator/builtins.go | 132 +++++++++++++----------------------------- 1 file changed, 39 insertions(+), 93 deletions(-) diff --git a/evaluator/builtins.go b/evaluator/builtins.go index e28335e..f9d3cd7 100644 --- a/evaluator/builtins.go +++ b/evaluator/builtins.go @@ -4,106 +4,13 @@ import ( "bufio" "fmt" "io" - "math" "os" - "strconv" "strings" "github.com/AvicennaJr/Nuru/object" ) var builtins = map[string]*object.Builtin{ - "idadi": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 1 { - return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) - } - - switch arg := args[0].(type) { - case *object.Array: - return &object.Integer{Value: int64(len(arg.Elements))} - case *object.String: - return &object.Integer{Value: int64(len(arg.Value))} - default: - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - }, - }, - "jumla": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 1 { - return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) - } - - switch arg := args[0].(type) { - case *object.Array: - - var sums float64 - for _, num := range arg.Elements { - - if num.Type() != object.INTEGER_OBJ && num.Type() != object.FLOAT_OBJ { - return newError("Samahani namba tu zinahitajika") - } else { - if num.Type() == object.INTEGER_OBJ { - no, _ := strconv.Atoi(num.Inspect()) - floatnum := float64(no) - sums += floatnum - } else if num.Type() == object.FLOAT_OBJ { - no, _ := strconv.ParseFloat(num.Inspect(), 64) - sums += no - } - - } - } - - if math.Mod(sums, 1) == 0 { - return &object.Integer{Value: int64(sums)} - } - - return &object.Float{Value: float64(sums)} - - default: - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - }, - }, - "yamwisho": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 1 { - return newError("Samahani, tunahitaji Hoja moja tu, wewe umeweka %d", len(args)) - } - if args[0].Type() != object.ARRAY_OBJ { - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - - arr := args[0].(*object.Array) - length := len(arr.Elements) - if length > 0 { - return arr.Elements[length-1] - } - - return NULL - }, - }, - "sukuma": { - Fn: func(args ...object.Object) object.Object { - if len(args) != 2 { - return newError("Samahani, tunahitaji Hoja 2, wewe umeweka %d", len(args)) - } - if args[0].Type() != object.ARRAY_OBJ { - return newError("Samahani, hii function haitumiki na %s", args[0].Type()) - } - - arr := args[0].(*object.Array) - length := len(arr.Elements) - - newElements := make([]object.Object, length+1) - copy(newElements, arr.Elements) - newElements[length] = args[1] - - return &object.Array{Elements: newElements} - }, - }, "jaza": { Fn: func(args ...object.Object) object.Object { @@ -193,4 +100,43 @@ var builtins = map[string]*object.Builtin{ return &object.File{Filename: filename, Reader: reader, Writer: writer, Handle: file} }, }, + + // "jumla": { + // Fn: func(args ...object.Object) object.Object { + // if len(args) != 1 { + // return newError("Hoja hazilingani, tunahitaji=1, tumepewa=%d", len(args)) + // } + + // switch arg := args[0].(type) { + // case *object.Array: + + // var sums float64 + // for _, num := range arg.Elements { + + // if num.Type() != object.INTEGER_OBJ && num.Type() != object.FLOAT_OBJ { + // return newError("Samahani namba tu zinahitajika") + // } else { + // if num.Type() == object.INTEGER_OBJ { + // no, _ := strconv.Atoi(num.Inspect()) + // floatnum := float64(no) + // sums += floatnum + // } else if num.Type() == object.FLOAT_OBJ { + // no, _ := strconv.ParseFloat(num.Inspect(), 64) + // sums += no + // } + + // } + // } + + // if math.Mod(sums, 1) == 0 { + // return &object.Integer{Value: int64(sums)} + // } + + // return &object.Float{Value: float64(sums)} + + // default: + // return newError("Samahani, hii function haitumiki na %s", args[0].Type()) + // } + // }, + // }, } From c599844a8bd565a923b0301b81aa6781b53a0018 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 03:49:52 +0300 Subject: [PATCH 134/362] Add array methods idadi, sukuma and yamwisho --- object/array.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/object/array.go b/object/array.go index 027f63f..c929301 100644 --- a/object/array.go +++ b/object/array.go @@ -38,3 +38,36 @@ func (ao *Array) Next() (Object, Object) { func (ao *Array) Reset() { ao.offset = 0 } + +func (a *Array) Method(method string, args []Object) Object { + switch method { + case "idadi": + return a.len(args) + case "sukuma": + return a.push(args) + case "yamwisho": + return a.last() + default: + return newError("Samahani, function hii haitumiki na Strings (Neno)") + } +} + +func (a *Array) len(args []Object) Object { + if len(args) != 0 { + return newError("Samahani, tunahitaji Hoja 0, wewe umeweka %d", len(args)) + } + return &Integer{Value: int64(len(a.Elements))} +} + +func (a *Array) last() Object { + length := len(a.Elements) + if length > 0 { + return a.Elements[length-1] + } + return &Null{} +} + +func (a *Array) push(args []Object) Object { + a.Elements = append(a.Elements, args...) + return a +} From 8cd815daaa34b1b55bdb7153dc837031bf735f07 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 03:50:13 +0300 Subject: [PATCH 135/362] Add evaluation of array methods --- evaluator/method.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/evaluator/method.go b/evaluator/method.go index 3123fc9..6cb820b 100644 --- a/evaluator/method.go +++ b/evaluator/method.go @@ -25,6 +25,8 @@ func applyMethod(obj object.Object, method ast.Expression, args []object.Object) return obj.Method(method.(*ast.Identifier).Value, args) case *object.Time: return obj.Method(method.(*ast.Identifier).Value, args) + case *object.Array: + return obj.Method(method.(*ast.Identifier).Value, args) case *object.Module: if fn, ok := obj.Functions[method.(*ast.Identifier).Value]; ok { return fn(args) From 917469ac08d4e1eb2f972bd77693df82d7a8bdbd Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:24:28 +0300 Subject: [PATCH 136/362] add documentation for arrays --- docs/en/arrays.md | 146 +++++++++++++++++++++------------------------- 1 file changed, 66 insertions(+), 80 deletions(-) diff --git a/docs/en/arrays.md b/docs/en/arrays.md index f36ee0d..ee40671 100644 --- a/docs/en/arrays.md +++ b/docs/en/arrays.md @@ -1,121 +1,107 @@ -## ARRAYS (ORODHA) +# Arrays in Nuru -### Definition +Arrays in Nuru are versatile data structures that can hold multiple items, including different types such as numbers, strings, booleans, functions, and null values. This page covers various aspects of arrays, including how to create, manipulate, and iterate over them using Nuru's built-in keywords and methods. -Arrays are enclosed in square brackets `[]` and they can hold any type, even function definitions: -```go -fanya arr = [1, "mambo", kweli, unda(x, y){rudisha x + y}, 2 * 3 + 20] +## Creating Arrays -andika(arr) +To create an array, use square brackets [] and separate items with commas: -/* -[1, mambo, kweli, unda(x, y) {rudisha (x + y);}, 26] -*/ +```s +orodha = [1, "pili", kweli] ``` +## Accessing and Modifying Array Elements -### Accessing Elements +Arrays in Nuru are zero-indexed. To access an element, use the element's index in square brackets: -You can access individual elements through indexes starting from zero: -```go -fanya herufi = ["a", "b", "c"] - -andika(herufi[0]) // a +```s +namba = [10, 20, 30] +jina = namba[1] // jina is 20 ``` -### Reassigning Elements - -You can also reassign values in elements: -```go -fanya herufi = ["a", "b", "c"] - -herufi[1] = "z" +You can reassign an element in an array using its index: -andika(herufi) // ["a", "z", "c"] +```s +namba[1] = 25 ``` -### Looping over an Array +## Concatenating Arrays -- You can also iterate through an array: -```go -fanya herufi = ["a", "b", "c"] +To concatenate two or more arrays, use the + operator: -kwa i ktk herufi { - andika(i) -} -/* a - b - c */ +```s +a = [1, 2, 3] +b = [4, 5, 6] +c = a + b +// c is now [1, 2, 3, 4, 5, 6] ``` -- And for a key, value pair: -```go -kwa i, v ktk herufi { - andika(i, "=>", v) -} +## Checking for Array Membership -/* 0 => a - 1 => b - 2 => c */ +Use the `ktk` keyword to check if an item exists in an array: + +```s +namba = [10, 20, 30] +andika(20 ktk namba) // will print kweli ``` -### Check if an Element exists +## Looping Over Arrays -You can also check if elements exist in an array: -```go -andika("d" ktk herufi) // sikweli -andika("a" ktk herufi) // kweli -``` +You can use the kwa and ktk keywords to loop over array elements. To loop over just the values, use the following syntax: -### Concatenating Arrays +``` +namba = [1, 2, 3, 4, 5] -- You can also add two arrays as follows: +kwa thamani ktk namba { + andika(thamani) +} ``` -fanya h1 = ["a", "b", "c"] -fanya h2 = [1, 2, 3] -fanya h3 = h1 + h2 -andika(h3) // ["a", "b", "c", 1, 2, 3] +To loop over both index and value pairs, use this syntax: -h2 += h3 +```s +majina = ["Juma", "Asha", "Haruna"] -andika(h2) // [1, 2, 3, "a", "b", "c", 1, 2, 3] +kwa idx, jina ktk majina { + andika(idx, "-", jina) +} ``` -- You can also multiply an array as follows: -``` -fanya a = [1, 2, 3] +## Array Methods -andika(a * 2) // [1, 2, 3, 1, 2, 3] -``` +Arrays in Nuru have several built-in methods: -### Length of an Array +### idadi() -You can get the length of an array with `idadi`: -``` -fanya a = ["a", "b", "c"] +idadi() returns the length of an array: -andika(idadi(a)) // 3 +```s +a = [1, 2, 3] +urefu = a.idadi() +andika(urefu) // will print 3 ``` -### Adding Elements to an Array +### sukuma() -You can add new elements to an array with `sukuma`: -```go -fanya a = [1, 2, 3] +sukuma() adds one or more items to the end of an array: -// you must reassign for the new value to be saved -a = sukuma(a, "mambo") - -andika(a) // [1, 2, 3, "mambo"] +```s +a = [1, 2, 3] +a.sukuma("s", "g") +andika(a) // will print [1, 2, 3, "s", "g"] ``` -### Getting the Last Element in an Array +### yamwisho() -You can get the last element of an array with `yamwisho`: -``` -fanya a = [1, 2, 3] +yamwisho() returns the last item in an array, or tupu if the array is empty: -andika(yamwisho(a)) // 3 +```s +a = [1, 2, 3] +mwisho = a.yamwisho() +andika(mwisho) // will print 3 + +b = [] +mwisho = b.yamwisho() +andika(mwisho) // will print tupu ``` -**Please Note** -> A lot more array methods will be added in the future \ No newline at end of file + +With this information, you can now effectively work with arrays in Nuru, making it easy to manipulate collections of data in your programs. \ No newline at end of file From 535ea341c3d6e4802624e43b447ef6e4ac9baa81 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:24:49 +0300 Subject: [PATCH 137/362] add documentation for boolean --- docs/en/bool.md | 101 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/docs/en/bool.md b/docs/en/bool.md index 4c0aa09..5df0764 100644 --- a/docs/en/bool.md +++ b/docs/en/bool.md @@ -1,32 +1,97 @@ -## BOOLEANS +# Working with Booleans in Nuru -Boolean objects are `truthy`, meaning any value is true. A value is false only when its null (ie. `tupu`) or false (ie `sikweli`): -### Example 1 +Boolean objects in Nuru are truthy, meaning that any value is true, except tupu and sikweli. They are used to evaluate expressions that return true or false values. + +## Evaluating Boolean Expressions + +### Evaluating Simple Expressions + +In Nuru, you can evaluate simple expressions that return a boolean value: + +```s +andika(1 > 2) // Output: `sikweli` + +andika(1 + 3 < 10) // Output: `kweli` ``` -fanya x = 0 -kama (x) { - andika("I am true") +### Evaluating Complex Expressions + +In Nuru, you can use boolean operators to evaluate complex expressions: + +```s +a = 5 +b = 10 +c = 15 + +result = (a < b) && (b < c) + +kama (result) { + andika("Both conditions are true") } sivyo { - andika("I am not true") + andika("At least one condition is false") } +// Output: "Both conditions are true" +``` + +Here, we create three variables a, b, and c. We then evaluate the expression (a < b) && (b < c). Since both conditions are true, the output will be "Both conditions are true". + +## Boolean Operators + +Nuru has several boolean operators that you can use to evaluate expressions: + +### The && Operator + +The && operator evaluates to true only if both operands are true. Here's an example: -// it will print "I am true" +```s +andika(kweli && kweli) // Output: `kweli` + +andika(kweli && sikweli) // Output: `sikweli` ``` -### Example 2 +### The || Operator + +The || operator evaluates to true if at least one of the operands is true. Here's an example: + +```s +andika(kweli || sikweli) // Output: `kweli` + +andika(sikweli || sikweli) // Output: `sikweli` ``` -kama (tupu) { -andika("I am true") -} sivyo { - andika("I am not true") -} -// will print "I am not true" +### The ! Operator + +The ! operator negates the value of the operand. Here's an example: + +```s +andika(!kweli) // Output: `sikweli` + +andika(!sikweli) // Output: `kweli` ``` -Expressions can also be evaluated to true or false: +## Working with Boolean Values in Loops + +In Nuru, you can use boolean expressions in loops to control their behavior. Here's an example: + +```s +namba = [1, 2, 3, 4, 5] + +kwa thamani ktk namba { + kama (thamani % 2 == 0) { + andika(thamani, "is even") + } sivyo { + andika(thamani, "is odd") + } +} +// Output: +// 1 is odd +// 2 is even +// 3 is odd +// 4 is even +// 5 is odd ``` -andika(1 > 2) // sikweli -andika(1 + 3 < 10) // kweli \ No newline at end of file +Here, we create an array namba with the values 1 through 5. We then loop over each value in the array and use the % operator to determine if it is even or odd. The output will be "is even" for even numbers and "is odd" for odd numbers. + + +Boolean objects in Nuru can be used to evaluate expressions that return true or false values. You can use boolean operators to evaluate complex expressions and control the behavior of loops. Understanding how to work with boolean values is an essential skill for any Nuru programmer. \ No newline at end of file From a20809e029f310d7af1525d48bc9d5225b92c341 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:25:10 +0300 Subject: [PATCH 138/362] update documentation for builtins --- docs/en/builtins.md | 74 +++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 49 deletions(-) diff --git a/docs/en/builtins.md b/docs/en/builtins.md index 43925d9..5c075ca 100644 --- a/docs/en/builtins.md +++ b/docs/en/builtins.md @@ -1,69 +1,45 @@ -## BUILTINS +# Built-in Functions in Nuru -Nuru has a few builtin functions and more will be added in the future +Nuru has several built-in functions that perform specific tasks. -### andika() +## The andika() Function -This function will print out whatever is placed inside the parenthesis `()`. It can take zero or multiple number of arguments. Arguments will be printed out with a space in between them: -``` -andika(1,2,3) // 1 2 3 -``` -`andika()` also supports some basic formatting such as: -- `/n` for a new line -- `/t` for a tab space -- `\\` for a backslash - -### jaza() - -This is a function to get input from a user. It can have zero or one argument. The only acceptable argument is a string: -``` -fanya salamu = unda(){ - fanya jina = jaza("Unaitwa nani? ") - andika("mambo vipi", jina) -} - -salamu() -``` +The andika() function is used to print out messages to the console. It can take zero or more arguments, and the arguments will be printed out with a space in between them. Additionally, andika() supports basic formatting such as /n for a new line, /t for a tab space, and \\ for a backslash. Here's an example: -### aina() - -`Aina()` is a function to help identify the type of an object. It only accepts one argument: -``` -aina(2) // NAMBA +```s +andika(1, 2, 3) // Output: "1 2 3" ``` -### idadi() +## The jaza() Function -`idadi` is a function to know a length of an object. It accepts only one argument which can be a `string`, `list` or `dictionary`: -``` -idadi("mambo") // 5 -``` +The jaza() function is used to get input from the user. It can take zero or one argument, which is a string that will be used as a prompt for the user. Here's an example: -### jumla() +```s +fanya salamu = unda() { + fanya jina = jaza("Unaitwa nani? ") + andika("Mambo vipi", jina) +} -`jumla` is a function that gives the sum of numbers (integers/floats) in a list. It accepts only one argument which is a `list` of numbers : -``` -jumla([1,2,3,4]) // 10 +salamu() ``` +In this example, we define a function `salamu()` that prompts the user to enter their name using the `jaza()` function. We then use the `andika()` function to print out a message that includes the user's name. -### sukuma() +## The aina() Function -`sukuma()` is a function that adds a new element to an array. The function accepts two arguments, the first must be a list and the second is the element to be added/appended: -``` -fanya majina = ["juma", "asha"] +The `aina()` function is used to determine the type of an object. It accepts one argument, and the return value will be a string indicating the type of the object. Here's an example: -majina = sukuma(majina, "mojo") +```s +aina(2) // Output: "NAMBA" +aina("Nuru") // Output: "NENO" ``` -**Notice that the list is reassigned for the change to take effect** -### yamwisho() +## The fungua() Function -This is a function to get the last element in an array. It only accepts one argument which must be an array: -``` -fanya namba = [1,2,3,4,5] +The `fungua()` function is used to open a file. It accepts one argument, which is the path to the file that you want to open. Here's an example: -yamwisho(namba) // 5 +```s +faili = fungua("data.txt") ``` -**MORE BUILTIN FUNCTIONS WILL BE ADDED WITH TIME** \ No newline at end of file +In this example, we use the `fungua()` function to open a file named "data.txt". The variable faili will contain a reference to the opened file. \ No newline at end of file From e643f4836b8a7b8ae5b271d2ed5a0097f5778e4c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:25:25 +0300 Subject: [PATCH 139/362] update documentation for comments --- docs/en/comments.md | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/en/comments.md b/docs/en/comments.md index b10f988..8e69b6b 100644 --- a/docs/en/comments.md +++ b/docs/en/comments.md @@ -1,14 +1,30 @@ -## COMMENTS +# Comments in Nuru -- You can write single line comments with `//`: -``` -// This line will be ignored -``` -- Multiline comments start with `/*` and end with `*/`: +In Nuru, you can write comments to provide explanations and documentation for your code. Comments are lines of text that are ignored by the Nuru interpreter, so they will not affect the behavior of your program. There are two types of comments in Nuru: single-line comments and multi-line comments. + +## Single-Line Comments + +Single-line comments are used to provide brief explanations or documentation for a single line of code. To write a single-line comment in Nuru, use two forward slashes (//) followed by your comment text. Here's an example: + +```s +// This line will be ignored by the Nuru interpreter ``` + +In this example, the comment text "This line will be ignored by the Nuru interpreter" will be ignored by the interpreter, so it will not affect the behavior of the program. + +## Multi-Line Comments + +Multi-line comments are used to provide more detailed explanations or documentation for multiple lines of code. To write a multi-line comment in Nuru, use a forward slash followed by an asterisk ( /* ) to start the comment, and an asterisk followed by a forward slash ( */ ) to end the comment. Here's an example: + +```s /* These lines Will be ignored -*/ \ No newline at end of file +*/ +``` + +In this example, all the lines between the /* and */ symbols will be ignored by the Nuru interpreter, so they will not affect the behavior of the program. + +By utilizing single-line and multi-line comments in Nuru, you can make your code more readable and easier to maintain for yourself and others who may need to work with your code in the future. \ No newline at end of file From 5080be1812732de8194a478efb1b933fdcb00339 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:25:45 +0300 Subject: [PATCH 140/362] update documentation for dictionaries --- docs/en/dictionaries.md | 127 +++++++++++++++++++++------------------- 1 file changed, 68 insertions(+), 59 deletions(-) diff --git a/docs/en/dictionaries.md b/docs/en/dictionaries.md index 5e195f4..61f4c85 100644 --- a/docs/en/dictionaries.md +++ b/docs/en/dictionaries.md @@ -1,96 +1,105 @@ -## DICTIONARIES (KAMUSI) +# Dictionaries in Nuru -### DEFINITION +Dictionaries in Nuru, also known as "kamusi," are powerful and flexible data structures that store key-value pairs. This page provides a comprehensive overview of dictionaries in Nuru, including how to create, access, modify, and iterate over them. -Dictionaries are enclosed by curly braces `{}` and have keys and values. You can define a dictionary as follows: -``` -fanya k = {"jina": "juma"} -``` -- The `keys` can be `string, int, float` and `boolean` -- The `values` can be of any type; `string, int, float, boolean, null` and even a `function`: -``` -fanya k = { - "jina": "juma", - "umri": 2, - kweli : "true", - "mi ni function": unda(x){andika("habari", x)} - "sina value": tupu -} +## Creating Dictionaries -andika(k["sina value"]) // tupu -``` +Dictionaries are enclosed in curly braces {} and consist of keys and values separated by colons. Here's an example of defining a dictionary: -### Accessing Elements +```s -You can access individual elements as follows: +orodha = {"jina": "Juma", "umri": 25} ``` -andika(k[kweli]) // true -andika(k["mi ni function"]("juma")) // habari juma -``` +Keys can be strings, integers, floats, or booleans, while values can be any data type, including strings, integers, floats, booleans, null, or functions: -### Updating Elements -You can update the value of an element as follows: +```s +k = { + "jina": "Juma", + "umri": 25, + kweli: "kweli", + "salimu": unda(x) { andika("habari", x) }, + "sina value": tupu +} ``` -k['umri'] = 50 -andika(k['umri']) // 50 -``` +## Accessing Elements -### Adding New Elements -If a key-value pair doesn't exist, you can add one as follows: -``` -k["I am new"] = "new element" +Access individual elements in a dictionary using their keys: -andika(k["I am new"]) // new element +```s + +andika(k[kweli]) // kweli +andika(k["salimu"]("Juma")) // habari Juma ``` -### Concatenating Dictionaries +## Updating Elements + +Update the value of an element by assigning a new value to its key: -You can add two dictionaries as follows: +```s +k['umri'] = 30 +andika(k['umri']) // 30 ``` -fanya a = {"a": "andazi"} -fanya b = {"b": "bunduki"} -fanya c = a + b -andika(c) // {"a": "andazi", "b": "bunduki"} +## Adding New Elements + +Add a new key-value pair to a dictionary by assigning a value to a non-existent key: + +```s +k["lugha"] = "Kiswahili" +andika(k["lugha"]) // Kiswahili ``` -### Checking If Key Exists In A Dictionary +## Concatenating Dictionaries + +Combine two dictionaries using the + operator: -Use the `ktk` keyword to check if a key exists: +```s +matunda = {"a": "apple", "b": "banana"} +mboga = {"c": "carrot", "d": "daikon"} +vyakula = matunda + mboga +andika(vyakula) // {"a": "apple", "b": "banana", "c": "carrot", "d": "daikon"} ``` + +## Checking If a Key Exists in a Dictionary + +Use the ktk keyword to check if a key exists in a dictionary: + +```s + "umri" ktk k // kweli -"ubini" ktk k // sikweli +"urefu" ktk k // sikweli ``` -### Looping Over A Dictionary +## Looping Over a Dictionary + +Loop over a dictionary to access its keys and values: -- You can loop over a dictionary as follows: +```s -```go -fanya k = {"a": "afya", "b": "buibui", "c": "chapa"} -kwa i, v ktk k { - andika(i, "=>", v) +hobby = {"a": "asili", "b": "baiskeli", "c": "chakula"} +kwa i, v ktk hobby { + andika(i, "=>", v) } -/* a => afya - b => buibui - c => chapa */ +/* a => asili + b => baiskeli + c => chakula */ ``` -- You can also loop over just values as follows: +Loop over just the values: -``` -kwa v ktk k { +```s + +kwa v ktk hobby { andika(v) } /* -afya -buibui -chapa +asili +baiskeli +chakula */ ``` -**Please Note** -> A lot more dict methods will be added in the future \ No newline at end of file +With this knowledge, you can now effectively use dictionaries in Nuru to store and manage key-value pairs, offering a flexible way to organize and access data in your programs. \ No newline at end of file From 4eab26d62bc8e45e49344ac30933e53b370a4997 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:26:03 +0300 Subject: [PATCH 141/362] update documentation for for-loops --- docs/en/for.md | 167 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 116 insertions(+), 51 deletions(-) diff --git a/docs/en/for.md b/docs/en/for.md index cd56a6c..d12ea51 100644 --- a/docs/en/for.md +++ b/docs/en/for.md @@ -1,110 +1,175 @@ -## FOR (KWA) +# For Loops in Nuru -### Definition +For loops are a fundamental control structure in Nuru, used for iterating over iterable objects such as strings, arrays, and dictionaries. This page covers the syntax and usage of for loops in Nuru, including key-value pair iteration, and the use of break and continue statements. -For is used to iterate over an iterable object. An iterable object is a `string`, `array` or `dictionaries`. You use the `kwa` keyword followed by an identifier such as `k` or `v` followed by an iterable. The iterable block must be enclosed in a bracket `{}`. Here's an example: -``` -fanya jina = "lugano" +## Basic Syntax +To create a for loop, use the kwa keyword followed by a temporary identifier (such as i or v) and the iterable object. Enclose the loop body in curly braces {}. Here's an example with a string: + +```s +jina = "lugano" kwa i ktk jina { - andika(i) + andika(i) } +``` +Output: -/* +```s l u g a n o -*/ ``` -### Key Value Pairs +## Iterating Over Key-Value Pairs -Nuru allows you to get both the value or the key/value pair of an iterable. To get only the value, use one temporary identifier as such: -``` -fanya kamusi = {"a": "andaa", "b": "baba"} +### Dictionaries + +Nuru allows you to iterate over both the value or the key-value pair of an iterable. To iterate over just the values, use one temporary identifier: + +```s +kamusi = {"a": "andaa", "b": "baba"} kwa v ktk kamusi { - andika(v) + andika(v) } +``` -/* +Output: + +```s andaa baba -*/ -``` -To get both the key and the value, use two temporary identifiers: ``` +To iterate over both the keys and the values, use two temporary identifiers: + +```s + kwa k, v ktk kamusi { - andika(k + " ni + " v) + andika(k + " ni " + v) } +``` +Output: -/* +```s a ni andaa b ni baba -*/ ``` -- Note that key-value pair iteration also works for `strings` and `lists`: + +### Strings + +To iterate over just the values in a string, use one temporary identifier: + +```s +kwa v ktk "mojo" { + andika(v) +} +``` + +Output: +```s +m +o +j +o ``` +To iterate over both the keys and the values in a string, use two temporary identifiers: + +```s kwa i, v ktk "mojo" { - andika(i, "->", v) + andika(i, "->", v) } -/* +``` +Output: +```s 0 -> m 1 -> o 2 -> j 3 -> o -*/ -fanya majina = ["juma", "asha", "haruna"] +``` + +### Lists +To iterate over just the values in a list, use one temporary identifier: + +```s +majina = ["juma", "asha", "haruna"] + +kwa v ktk majina { + andika(v) +} +``` + +Output: + +```s +juma +asha +haruna +``` + +To iterate over both the keys and the values in a list, use two temporary identifiers: + +```s kwa i, v ktk majina { - andika(i, "-", v) + andika(i, "-", v) } +``` -/* +Output: + +```s 0 - juma 1 - asha 2 - haruna -*/ ``` -### Break (Vunja) and Continue (Endelea) +## Break (Vunja) and Continue (Endelea) + +### Break (Vunja) + +Use the vunja keyword to terminate a loop: + +```s -- A loop can be terminated using the `vunja` keyword: -``` kwa i, v ktk "mojo" { - kama (i == 2) { - andika("nimevunja") - vunja - } - andika(v) + kama (i == 2) { + andika("nimevunja") + vunja + } + andika(v) } -/* +``` + +Output: + +```s m o nimevunja -*/ ``` -- A specific iteration can be skipped using the `endelea` keyword: -``` +### Continue (Endelea) + +Use the endelea keyword to skip a specific iteration: + +```s kwa i, v ktk "mojo" { - kama (i == 2) { - andika("nimeruka") - endelea - } - andika(v) + kama (i == 2) { + andika("nimeruka") + endelea + } + andika(v) } +``` -/* +Output: + +```s m o nimeruka o -*/ -``` - -**CAUTION** -> In nested loops, the `vunja` and `endelea` keyword MIGHT misbehave \ No newline at end of file +``` \ No newline at end of file From 5b2f4809493a4b8ff839205273aa38db7962f30b Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:26:17 +0300 Subject: [PATCH 142/362] update documentation for functions --- docs/en/function.md | 92 +++++++++++++++++++++++++++++++++------------ 1 file changed, 67 insertions(+), 25 deletions(-) diff --git a/docs/en/function.md b/docs/en/function.md index 0a22134..cc70da4 100644 --- a/docs/en/function.md +++ b/docs/en/function.md @@ -1,55 +1,97 @@ -## FUNCTIONS (UNDA) +# Functions in Nuru -### Definition +Functions are a fundamental part of Nuru programming, allowing you to define reusable blocks of code. This page covers the syntax and usage of functions in Nuru, including parameters, default parameters, return statements, recursion, and closures. -A function block starts with the `unda` keyword, parameters are surrounded by `()` and the body by `{}`. They must also be assigned to a variable as follows: -``` -fanya jum = unda(x, y) { - rudisha x + y +## Basic Syntax + +A function block starts with the unda keyword, followed by parameters enclosed in parentheses () and the body enclosed in curly braces {}. Functions must be assigned to a variable: + +```s +jum = unda(x, y) { + rudisha x + y } jum(2, 3) // 5 ``` -### Parameters +## Parameters Functions can have zero or any number of arguments. Arguments can be of any type, even other functions: -``` -fanya salamu = unda() { - andika("Habari yako") + +```s +salamu = unda() { + andika("Habari yako") } salamu() salamu = unda(jina) { - andika("Habari yako", jina) + andika("Habari yako", jina) } -salamu(asha) // Habari yako asha +salamu("asha") // Habari yako asha ``` -### Return (rudisha) +## Default Parameters -You can return items with the `rudisha` keyword. The `rudisha` keyword will terminate the block and return the value: -``` -fanya mfano = unda(x) { - rudisha "nimerudi" - andika(x) +Functions can be provided with default parameters: + +```s +salimu = unda(salamu="Habari") { + andika(salamu) } -mfano(x) // nimerudi +salimu() // Habari +salimu("Mambo") // Mambo ``` -### Recursion +## Return (rudisha) -Nuru also supports recursion. Here's an example: +You can return values with the rudisha keyword. The rudisha keyword will terminate the block and return the value: + +```s +mfano = unda(x) { + rudisha "nimerudi" + andika(x) +} + +mfano("x") // nimerudi ``` -fanya fib = unda(n) { - kama (n < 3) { - rudisha 1 + +## Recursion + +Nuru also supports recursion. Here's an example of a recursive Fibonacci function: + +```s + +fib = unda(n) { + kama (n <= 1) { + rudisha n } sivyo { rudisha fib(n-1) + fib(n-2) } } -andika(fib(10)) // 55 \ No newline at end of file +andika(fib(10)) // 55 +``` + +The fib function calculates the nth Fibonacci number by recursively calling itself with n-1 and n-2 as arguments until n is less than or equal to 1. + +## Closures + +Closures are anonymous functions that can capture and store references to variables from their surrounding context. In Nuru, you can create closures using the unda keyword without assigning them to a variable. Here's an example: + +```s +fanya jum = unda(x) { + rudisha unda(y) { + rudisha x + y + } +} + +fanya jum_x = jum(5) +andika(jum_x(3)) // 8 +``` + +In the example above, the jum function returns another function that takes a single parameter y. The returned function has access to the x variable from its surrounding context. + +Now that you understand the basics of functions in Nuru, including recursion and closures, you can create reusable blocks of code to simplify your programs and improve code organization. \ No newline at end of file From edd91fcae2bb964871c63e949fd6ba296ec3eb9f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:26:34 +0300 Subject: [PATCH 143/362] update documentation for identifiers --- docs/en/identifiers.md | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/docs/en/identifiers.md b/docs/en/identifiers.md index 58cf756..0f94880 100644 --- a/docs/en/identifiers.md +++ b/docs/en/identifiers.md @@ -1,15 +1,31 @@ -## IDENTIFIERS +# Identifiers in Nuru -Identifiers can contain letters, numbers and underscores. However, identifiers cannot start with a number. +Identifiers are used to name variables, functions, and other elements in your Nuru code. This page covers the rules and best practices for creating identifiers in Nuru. -### Example 1 +## Syntax Rules +Identifiers can contain letters, numbers, and underscores. However, there are a few rules you must follow when creating identifiers: +- Identifiers cannot start with a number. +- Identifiers are case-sensitive. For example, myVar and myvar are considered distinct identifiers. + +Here are some examples of valid identifiers: + +```s +fanya birth_year = 2020 +andika(birth_year) // 2020 + +fanya convert_c_to_p = "C to P" +andika(convert_c_to_p) // "C to P" ``` -fanya b2020 = 2020 -andika(b2020) +In the examples above, birth_year and convert_c_to_p are both valid identifiers. + +## Best Practices + +When choosing identifiers, it's important to follow best practices to ensure your code is clear and easy to understand: -fanya c2p = "C to P" +- Use descriptive names that clearly indicate the purpose or meaning of the variable or function. +- Follow a consistent naming convention, such as camelCase (myVariableName) or snake_case (my_variable_name). +- Avoid using single-letter variable names, except for commonly accepted cases like loop counters (i, j, k). -andika(c2p) // "C to P" -``` \ No newline at end of file +By following these best practices when creating identifiers, you will make your Nuru code more readable and maintainable for yourself and others. From 3002b572ae5b8ae9b28108b2ba4f61301d75c95d Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:26:57 +0300 Subject: [PATCH 144/362] update documentation for if statements --- docs/en/ifStatements.md | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/docs/en/ifStatements.md b/docs/en/ifStatements.md index 3d7f12b..5e74560 100644 --- a/docs/en/ifStatements.md +++ b/docs/en/ifStatements.md @@ -1,27 +1,38 @@ -## IF/ELSE (KAMA/SIVYO) +# Conditional Statements in Nuru -### Definition +Conditional statements in Nuru are used to perform different actions based on different conditions. The if/else statement is a fundamental control structure that allows you to execute code based on specific conditions. This page covers the basics of if/else statements in Nuru. -You initiliaze an if block with `kama`, the condition must be inside a paranthesis `()` and the consequence inside a `{}`: -``` -kama (2>1) { - andika(kweli) // kweli +## If Statement (Kama) + +An if statement starts with the kama keyword, followed by a condition in parentheses (). If the condition is true, the code inside the curly braces {} will be executed. + +```s +kama (2 > 1) { + andika(kweli) // kweli } ``` -### Else Block +In this example, the condition 2 > 1 is true, so the andika(kweli) statement is executed, and the output is kweli. + +## Else If and Else Blocks (Au Kama and Sivyo) + +You can use au kama to test multiple conditions and sivyo to specify a default block of code to be executed when none of the conditions are true. + +```s -- For multiple conditions, you can use `kama` , `au kama` and `sivyo`: -``` fanya a = 10 kama (a > 100) { - andika("a imezidi 100") + andika("a imezidi 100") } au kama (a < 10) { - andika("a ndogo kuliko 10") + andika("a ndogo kuliko 10") } sivyo { - andika("Thamani ya a ni", a) + andika("Thamani ya a ni", a) } -// it will print 'Thamani ya a ni 10' -``` \ No newline at end of file +// The output will be 'Thamani ya a ni 10' +``` + +In this example, the first condition a > 100 is false, and the second condition a < 10 is also false. Therefore, the code inside the sivyo block is executed, and the output is 'Thamani ya a ni 10'. + +By using if/else statements with the kama, au kama, and sivyo keywords, you can control the flow of your Nuru code based on different conditions. \ No newline at end of file From 39f96987c4e373ef1c07c9a6915f176dc63da012 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:27:15 +0300 Subject: [PATCH 145/362] add fungua keyword --- docs/en/keywords.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/en/keywords.md b/docs/en/keywords.md index 97e60e7..3c3d288 100644 --- a/docs/en/keywords.md +++ b/docs/en/keywords.md @@ -47,11 +47,7 @@ The following are some of the in-built functions in Nuru. They are reserved and andika aina jaza - - - idadi - sukuma - yamwisho + fungua \ No newline at end of file From 81fd629959aaf53620f65165db88e5ce765953e6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:27:37 +0300 Subject: [PATCH 146/362] Update null docs --- docs/en/null.md | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/docs/en/null.md b/docs/en/null.md index c21e74a..75d8883 100644 --- a/docs/en/null.md +++ b/docs/en/null.md @@ -1,17 +1,26 @@ -## NULL (TUPU) +# Null (Tupu) in Nuru -- A null data type is a data type with no value. It is defined as: -``` -fanya a = `tupu` -``` +The null data type in Nuru represents the absence of a value or the concept of "nothing" or "empty." This page covers the syntax and usage of the null data type in Nuru, including its definition and evaluation. + +## Definition + +A null data type is a data type with no value, defined with the tupu keyword: -- Obviously a null data type will evaluate to false: +```s +fanya a = tupu ``` +## Evaluation + +When evaluating a null data type in a conditional expression, it will evaluate to false: + +```s kama (a) { - andika("niko tupu") + andika("niko tupu") } sivyo { - andika("nimevaa nguo") + andika("nimevaa nguo") } -// will print 'nimevaa nguo' -``` \ No newline at end of file +// Output: nimevaa nguo +``` + +The null data type is useful in Nuru when you need to represent an uninitialized, missing, or undefined value in your programs. By understanding the null data type, you can create more robust and flexible code. \ No newline at end of file From c95075916710297e0b2faa0ea9bf7086b04ef662 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:27:57 +0300 Subject: [PATCH 147/362] update documentation for numbers --- docs/en/numbers.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/numbers.md b/docs/en/numbers.md index a857de6..7170916 100644 --- a/docs/en/numbers.md +++ b/docs/en/numbers.md @@ -25,8 +25,8 @@ i++ // 3.4 ### SHORTHAND ASSIGNMENT -You can also perform shorthand assignments with `+=`, `-=`, `/=`, `*=` and `%=` as follows: - +Nuru supports shorthand assignments with +=, -=, /=, *=, and %=: +You ```go fanya i = 2 From 28d71f42408db71b10d2c062851db8de9535858c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:28:14 +0300 Subject: [PATCH 148/362] update documentation for operators --- docs/en/operators.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/en/operators.md b/docs/en/operators.md index 142b20e..5972659 100644 --- a/docs/en/operators.md +++ b/docs/en/operators.md @@ -1,10 +1,11 @@ ## OPERATORS +Operators are the foundation of any programming language, allowing you to perform various operations on variables and values. This page covers the syntax and usage of operators in Nuru, including assignment, arithmetic, comparison, member, and logic operators. ### ASSIGNMENT Assuming `i` and `v` are predefined variables, Nuru supports the following assignment operators: -- `i = v`: which is the regular assign operator +- `i = v`: which is the regular assignment operator - `i += v`: which is the equivalent of `i = i + v` - `i -= v`: which is the equivalent of `i = i - v` - `i *= v`: which is the equivalent of `i = i * v` @@ -18,7 +19,7 @@ list1 += list2 // this is equivalent to list1 = list1 + list2 ### ARITHMETIC OPERATORS -The following arithmetic operators are supported: +Nuru supports the following arithmetic operators: - `+`: Additon - `-`: Subtraction @@ -29,7 +30,7 @@ The following arithmetic operators are supported: ### COMPARISON OPERATORS -The following comparison operators are supported: +Nuru supports the following comparison operators: - `==`: Equal to - `!=`: Not equal to @@ -50,7 +51,7 @@ fanya majina = ['juma', 'asha', 'haruna'] ### LOGIC OPERATORS -The following logic operators are supported: +Nuru supports the following logic operators: - `&&`: Logical `AND`. It will evaluate to true if both are true, otherwise it will evaluate to false. - `||`: Logical `OR`. It will evaluate to false if both are false, otherwise it will evaluate to true. @@ -58,7 +59,7 @@ The following logic operators are supported: ### PRECEDENCE OF OPERATORS -The following is the precedence of operators, starting from the HIGHEST PRIORITY to LOWEST. +Operators have the following precedence, starting from the highest priority to the lowest: - `()` : Items in paranthesis have the highest priority - `!`: Negation @@ -70,4 +71,6 @@ The following is the precedence of operators, starting from the HIGHEST PRIORITY - `==, !=`: Equal or Not Equal to - `=`: Assignment Operator - `ktk`: Member Operator -- `&&, ||`: Logical AND and OR \ No newline at end of file +- `&&, ||`: Logical AND and OR + +Understanding operators in Nuru allows you to create complex expressions, perform calculations, and make decisions based on the values of variables. From 737782c48a163f3b3886f93150382578e505e58a Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:28:37 +0300 Subject: [PATCH 149/362] update documentation for strings --- docs/en/strings.md | 108 +++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 32 deletions(-) diff --git a/docs/en/strings.md b/docs/en/strings.md index ea1dbec..fce9487 100644 --- a/docs/en/strings.md +++ b/docs/en/strings.md @@ -1,10 +1,12 @@ -## STRINGS (NENO) +# Strings in Nuru -### Definition - -Strings can be enclosed in either a single quote `''` or double quotes `""`: +Strings are a sequence of characters that can represent text in the Nuru programming language. This page covers the basics of strings, their manipulation, and some built-in methods. -``` +## Basic Syntax + +Strings can be enclosed in either single quotes '' or double quotes "": + +```s andika("mambo") // mambo fanya a = 'niaje' @@ -12,25 +14,25 @@ fanya a = 'niaje' andika("mambo", a) // mambo niaje ``` -### Concatenation - -- Strings can also be concatenated as follows: +## Concatenating Strings -``` +Strings can be concatenated using the + operator: + +```s fanya a = "habari" + " " + "yako" andika(a) // habari yako fanya b = "habari" -b += " yako" +b += " yako" // habari yako ``` -- You can also multiply a string `n` number of times: +You can also repeat a string n number of times using the * operator: -``` +```s andika("mambo " * 4) // mambo mambo mambo mambo @@ -42,16 +44,17 @@ a *= 4 // habarihabarihabarihabari ``` -### Looping over a String - -- You can loop through a string as follows +## Looping over a String -``` +You can loop through a string using the kwa keyword: + +```s fanya jina = "avicenna" kwa i ktk jina {andika(i)} - -/* +``` +Output +```s a v i @@ -60,15 +63,17 @@ kwa i ktk jina {andika(i)} n n a -*/ ``` -- And for key, value pairs: -```go +And for key-value pairs: + +```s kwa i, v ktk jina { andika(i, "=>", v) } -/* +``` +Output +```s 0 => a 1 => v 2 => i @@ -77,13 +82,13 @@ kwa i, v ktk jina { 5 => n 6 => n 7 => a -*/ ``` -### Comparing Strings +## Comparing Strings -- You can also check if two strings are the same: -``` +You can compare two strings using the == operator: + +```s fanya a = "nuru" andika(a == "nuru") // kweli @@ -91,14 +96,53 @@ andika(a == "nuru") // kweli andika(a == "mambo") // sikweli ``` -### Length of a String +## String Methods -You can also check the length of a string with the `idadi` function -``` +### idadi() + +You can find the length of a string using the idadi method. It does not accept any parameters. + +```s fanya a = "mambo" +a.idadi() // 5 +``` + +### herufikubwa() + +This method converts a string to uppercase. It does not accept any parameters. + +```s +fanya a = "nuru" +a.herufikubwa() // NURU +``` + +### herufindogo + +This method converts a string to lowercase. It does not accept any parameters. + +```s +fanya a = "NURU" +a.herufindogo() // nuru +``` + +### gawa + +The gawa method splits a string into an array based on a specified delimiter. If no argument is provided, it will split the string according to whitespace. + +Example without a parameter: + +```s +fanya a = "nuru mambo habari" +fanya b = a.gawa() +andika(b) // ["nuru", "mambo", "habari"] +``` + +Example with a parameter: -idadi(a) // 5 +```s +fanya a = "nuru,mambo,habari" +fanya b = a.gawa(",") +andika(b) // ["nuru", "mambo", "habari"] ``` -**Please Note** -> A lot more string methods will be added in the future \ No newline at end of file +By understanding strings and their manipulation in Nuru, you can effectively work with text data in your programs. \ No newline at end of file From 4ac6a5283cbd55e07610745493fe52fa443048c0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:28:55 +0300 Subject: [PATCH 150/362] update documentation for switch --- docs/en/switch.md | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/en/switch.md b/docs/en/switch.md index 5f5b034..6286429 100644 --- a/docs/en/switch.md +++ b/docs/en/switch.md @@ -1,11 +1,14 @@ -## SWITCH (BADILI) +# Switch Statements in Nuru -### Definition +Switch statements in Nuru allow you to execute different code blocks based on the value of a given expression. This page covers the basics of switch statements and their usage. -You initialize a switch statement with `badili`, the expression inside parenthesis `()` and all cases will be enclosed inside a bracket `{}`. +## Basic Syntax -A case statement has the keyword `ikiwa` followed by a value to check. Multiple values can be in a single case separated by commas `,`. The consequence to execute if a condition is fulfiled must be inside a bracket `{}`. Here's an example: -``` +You initialize a switch statement with the badili keyword, the expression inside parentheses (), and all cases enclosed within curly braces {}. + +A case statement has the keyword ikiwa followed by a value to check. Multiple values can be in a single case separated by commas ,. The consequence to execute if a condition is fulfilled must be inside curly braces {}. Here's an example: + +```s fanya a = 2 badili (a){ @@ -18,10 +21,11 @@ badili (a){ } ``` -### Multiple Values in a Case +## Multiple Values in a Case -Multiple possibilites can be assigned to a single case (`ikiwa`) statement: -``` +Multiple possibilities can be assigned to a single case (ikiwa) statement: + +```s badili (a) { ikiwa 1,2,3 { andika("a ni kati ya 1, 2 au 3") @@ -32,10 +36,11 @@ badili (a) { } ``` -### Default (kawaida) +## Default Case (kawaida) -The default statement will be executed when no condition is satisfied. The default statement is represented by `kawaida`: -``` +The default statement will be executed when no condition is satisfied. The default statement is represented by kawaida: + +```s fanya z = 20 badili(z) { @@ -49,4 +54,6 @@ badili(z) { andika("ishirini") } } -``` \ No newline at end of file +``` + +By understanding switch statements in Nuru, you can create more efficient and organized code that can handle multiple conditions easily. \ No newline at end of file From cd56b0fa1804ffbfb8e4c0fe6a28ee678fadad22 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:29:09 +0300 Subject: [PATCH 151/362] update documentation for while loops --- docs/en/while.md | 41 +++++++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/docs/en/while.md b/docs/en/while.md index 791e619..45972c0 100644 --- a/docs/en/while.md +++ b/docs/en/while.md @@ -1,28 +1,33 @@ -## WHILE (WAKATI) +# WHILE (WAKATI) -### Definition +While loops in Nuru are used to execute a block of code repeatedly, as long as a given condition is true. This page covers the basics of while loops, including how to use the break and continue keywords within them. + +## Basic Syntax A while loop is executed when a specified condition is true. You initiliaze a while loop with the `wakati` keyword followed by the condition in paranthesis `()`. The consequence of the loop should be enclosed in brackets `{}`: -``` +```s fanya i = 1 wakati (i <= 5) { andika(i) i++ } -/* +``` +Output +```s 1 2 3 4 5 -*/ ``` -### Break (vunja) and Continue (endelea) +## Break (vunja) and Continue (endelea) +### Break (Vunja) -- A loop can be terminated using the `vunja` keyword: -``` +Use the vunja keyword to terminate a loop: + +```s fanya i = 1 wakati (i < 5) { @@ -33,15 +38,19 @@ wakati (i < 5) { andika(i) i++ } -/* +``` +Output +```s 1 2 nimevunja -*/ ``` -- A specific iteration can be skipped using the `endelea` keyword: -``` +### Continue (Endelea) + +Use the endelea keyword to skip a specific iteration: + +```s fanya i = 0 wakati (i < 5) { @@ -52,14 +61,14 @@ wakati (i < 5) { } andika(i) } -/* +``` +Output +```s 1 2 nimeruka 4 5 -*/ ``` -**CAUTION** -> In nested loops, the `vunja` and `endelea` keyword MIGHT misbehave +By understanding while loops in Nuru, you can create code that repeats a specific action or checks for certain conditions, offering more flexibility and control over your code execution. \ No newline at end of file From 848380835390c3413a0d2f68b440a5fae20d5b1d Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:34:47 +0300 Subject: [PATCH 152/362] remove idadi and jumla from tests --- evaluator/evaluator_test.go | 75 +++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/evaluator/evaluator_test.go b/evaluator/evaluator_test.go index 7207442..a185de9 100644 --- a/evaluator/evaluator_test.go +++ b/evaluator/evaluator_test.go @@ -383,46 +383,41 @@ func TestStringMultiplyInteger(t *testing.T) { } } -func TestBuiltinFunctions(t *testing.T) { - tests := []struct { - input string - expected interface{} - }{ - {`idadi("")`, 0}, - {`idadi("four")`, 4}, - {`idadi("hello world")`, 11}, - {`idadi(1)`, "Samahani, hii function haitumiki na NAMBA"}, - {`idadi("one", "two")`, "Hoja hazilingani, tunahitaji=1, tumepewa=2"}, - {`jumla()`, "Hoja hazilingani, tunahitaji=1, tumepewa=0"}, - {`jumla("")`, "Samahani, hii function haitumiki na NENO"}, - {`jumla(1)`, "Samahani, hii function haitumiki na NAMBA"}, - {`jumla([1,2,3])`, 6}, - {`jumla([1,2,3.4])`, 6.4}, - {`jumla([1.1,2.5,3.4])`, 7}, - {`jumla([1.1,2.5,"q"])`, "Samahani namba tu zinahitajika"}, - } - - for _, tt := range tests { - evaluated := testEval(tt.input) - - switch expected := tt.expected.(type) { - case int: - testIntegerObject(t, evaluated, int64(expected)) - case float64: - testFloatObject(t, evaluated, float64(expected)) - - case string: - errObj, ok := evaluated.(*object.Error) - if !ok { - t.Errorf("Object is not Error, got=%T(%+v)", evaluated, evaluated) - continue - } - if errObj.Message != fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, expected) { - t.Errorf("Wrong eror message, expected=%q, got=%q", expected, errObj.Message) - } - } - } -} +// func TestBuiltinFunctions(t *testing.T) { +// tests := []struct { +// input string +// expected interface{} +// }{ +// {`jumla()`, "Hoja hazilingani, tunahitaji=1, tumepewa=0"}, +// {`jumla("")`, "Samahani, hii function haitumiki na NENO"}, +// {`jumla(1)`, "Samahani, hii function haitumiki na NAMBA"}, +// {`jumla([1,2,3])`, 6}, +// {`jumla([1,2,3.4])`, 6.4}, +// {`jumla([1.1,2.5,3.4])`, 7}, +// {`jumla([1.1,2.5,"q"])`, "Samahani namba tu zinahitajika"}, +// } + +// for _, tt := range tests { +// evaluated := testEval(tt.input) + +// switch expected := tt.expected.(type) { +// case int: +// testIntegerObject(t, evaluated, int64(expected)) +// case float64: +// testFloatObject(t, evaluated, float64(expected)) + +// case string: +// errObj, ok := evaluated.(*object.Error) +// if !ok { +// t.Errorf("Object is not Error, got=%T(%+v)", evaluated, evaluated) +// continue +// } +// if errObj.Message != fmt.Sprintf("\x1b[%dm%s\x1b[0m", 31, expected) { +// t.Errorf("Wrong eror message, expected=%q, got=%q", expected, errObj.Message) +// } +// } +// } +// } func TestArrayLiterals(t *testing.T) { input := "[1, 2 * 2, 3 + 3]" From 3b5a62e94e5259180d05a8b925b0c6aae3368b8c Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:40:05 +0300 Subject: [PATCH 153/362] update keywords doc --- docs/en/keywords.md | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/en/keywords.md b/docs/en/keywords.md index 3c3d288..cf9355a 100644 --- a/docs/en/keywords.md +++ b/docs/en/keywords.md @@ -1,8 +1,11 @@ -## KEYWORDS +# KEYWORDS -### Reserved +Keywords in Nuru are reserved words that have special meanings and cannot be used as identifiers for variables, functions, or classes. This page covers the syntax and usage of keywords in Nuru, including reserved keywords and built-in functions. + +## Reserved Keywords + +The table below lists the reserved keywords in Nuru. These words have specific meanings in the language and cannot be used as identifiers: -The keywords used in Nuru are below. Note that these words cannot be used as identifiers @@ -40,7 +43,8 @@ The keywords used in Nuru are below. Note that these words cannot be used as ide ### BuiltIns -The following are some of the in-built functions in Nuru. They are reserved and thus cannot be used as identifiers: +Nuru also provides several built-in functions that are reserved and cannot be used as identifiers. These functions offer essential functionalities for common tasks in the language: +
@@ -50,4 +54,6 @@ The following are some of the in-built functions in Nuru. They are reserved and -
fungua
\ No newline at end of file + + +Understanding the keywords and built-in functions in Nuru is essential for writing clear, concise, and error-free code. By respecting the reserved words and their specific meanings, you can create more robust and maintainable programs in Nuru. \ No newline at end of file From ff1b2604c1bf21218ee466d97fdbdbbf9139c7ea Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:44:00 +0300 Subject: [PATCH 154/362] update numbers doc --- docs/en/numbers.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/en/numbers.md b/docs/en/numbers.md index 7170916..b2cd4b1 100644 --- a/docs/en/numbers.md +++ b/docs/en/numbers.md @@ -1,9 +1,10 @@ ## INTEGERS (NAMBA) AND FLOATS (DESIMALI) -### PRECEDENCE +Integers and floats are the basic numeric data types in Nuru, used for representing whole numbers and decimal numbers, respectively. This page covers the syntax and usage of integers and floats in Nuru, including precedence, unary increments, shorthand assignments, and negative numbers. -Integers and floats work the way you'd expect them to. They precedence in mathematical operations follow the BODMAS rule: +### PRECEDENCE +Integers and floats behave as expected in mathematical operations, following the BODMAS rule: ```go 2 + 3 * 5 // 17 From 65788feb025288367f90f6b566e90ab967b7a6e3 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:45:28 +0300 Subject: [PATCH 155/362] update numbers doc --- docs/en/numbers.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/en/numbers.md b/docs/en/numbers.md index b2cd4b1..34e534a 100644 --- a/docs/en/numbers.md +++ b/docs/en/numbers.md @@ -50,7 +50,9 @@ wakati (i < 0) { i++ } -/* +``` +Output: +```s -10 -9 -8 @@ -71,5 +73,4 @@ wakati (i < 0) { 7 8 9 -*/ ``` From b06ef2ca0cee4739f2b349b13436f59e074c63cf Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 08:46:42 +0300 Subject: [PATCH 156/362] fix formatting --- docs/en/strings.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/en/strings.md b/docs/en/strings.md index fce9487..4132953 100644 --- a/docs/en/strings.md +++ b/docs/en/strings.md @@ -55,14 +55,14 @@ kwa i ktk jina {andika(i)} ``` Output ```s - a - v - i - c - e - n - n - a +a +v +i +c +e +n +n +a ``` And for key-value pairs: From 0b53050682fa33b0204817dd9df0ebb9f69e2621 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 09:17:33 +0300 Subject: [PATCH 157/362] fix formating --- docs/en/dictionaries.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/docs/en/dictionaries.md b/docs/en/dictionaries.md index 61f4c85..e70b4ab 100644 --- a/docs/en/dictionaries.md +++ b/docs/en/dictionaries.md @@ -82,24 +82,26 @@ hobby = {"a": "asili", "b": "baiskeli", "c": "chakula"} kwa i, v ktk hobby { andika(i, "=>", v) } -/* a => asili - b => baiskeli - c => chakula */ +``` +Output +```s +a => asili +b => baiskeli +c => chakula ``` Loop over just the values: ```s - kwa v ktk hobby { andika(v) } - -/* +``` +Output +```s asili baiskeli chakula -*/ ``` With this knowledge, you can now effectively use dictionaries in Nuru to store and manage key-value pairs, offering a flexible way to organize and access data in your programs. \ No newline at end of file From e57bf76a5a24a555de7cba609c4e7319999b99a8 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 09:18:26 +0300 Subject: [PATCH 158/362] fix bug on priorities && and || have higher priority than = --- parser/parser.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/parser/parser.go b/parser/parser.go index 34dfd44..63fc300 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -12,8 +12,8 @@ const ( // Think of BODMAS _ int = iota LOWEST - COND // OR or AND ASSIGN // = + COND // OR or AND EQUALS // == LESSGREATER // > OR < SUM // + From 503160b0f46169f4d6757226ad1c73abf5067a85 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 09:18:38 +0300 Subject: [PATCH 159/362] Add all examples --- examples/example.nr | 433 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 362 insertions(+), 71 deletions(-) diff --git a/examples/example.nr b/examples/example.nr index 7ebacef..6c6c2bf 100644 --- a/examples/example.nr +++ b/examples/example.nr @@ -1,107 +1,398 @@ -andika("Testing basic types..."); -andika(2 + 2); -andika(4 * 4); -fanya a = 10; -fanya b = 20; +fanya birth_year = 2020 +andika(birth_year) // 2020 -andika(a + b); +fanya convert_c_to_p = "C to P" +andika(convert_c_to_p) // "C to P" -andika(kweli == sikweli); -andika("Testing empty lines...") -andika(); -andika(); -andika(); -andika("Mambo vipi"); +orodha = [1, "pili", kweli] -andika("Testing Functions... "); +namba = [10, 20, 30] +jina = namba[1] // jina is 20 -fanya jumlisha = unda(x, y) {x + y}; +namba[1] = 25 -andika(jumlisha(20,30)); -andika(jumlisha(100,1000)); +a = [1, 2, 3] +b = [4, 5, 6] +c = a + b +// c is now [1, 2, 3, 4, 5, 6] -fanya zidisha = unda(x, y) {x * y}; +namba = [10, 20, 30] +andika(20 ktk namba) // will print kweli -andika(zidisha(100,1000)); -andika(zidisha(200, 20)); +namba = [1, 2, 3, 4, 5] -// lists can hold any value -andika("Testing lists..."); -fanya list = [1, "a", kweli, sikweli]; +kwa thamani ktk namba { + andika(thamani) +} + +majina = ["Juma", "Asha", "Haruna"] + +kwa idx, jina ktk majina { + andika(idx, "-", jina) +} + +a = [1, 2, 3] +urefu = a.idadi() +andika(urefu) // will print 3 + +a = [1, 2, 3] +a.sukuma("s", "g") +andika(a) // will print [1, 2, 3, "s", "g"] + +a = [1, 2, 3] +mwisho = a.yamwisho() +andika(mwisho) // will print 3 + +b = [] +mwisho = b.yamwisho() +andika(mwisho) // will print tupu + +andika(1 > 2) // Output: `sikweli` -// a few builtins +andika(1 + 3 < 10) // Output: `kweli` -fanya list = sukuma(list, jumlisha(4,5)); +a = 5 +b = 10 +c = 15 -andika(list); -andika(list[2]); -andika(list[-100]); // prints null -andika(idadi(list)); -andika(yamwisho(list)); -andika([1,2,3] + [4,5,6]); -list[0] = 1000 -andika(list[0]) +result = (a < b) && (b < c) -// if statements -andika("Testing if statements..."); -kama (1 > 2) { - andika("Moja ni zaidi ya mbili"); +kama (result) { + andika("Both conditions are true") } sivyo { - andika("Moja si zaidi ya mbili"); + andika("At least one condition is false") +} + +// Output: "Both conditions are true" + +andika(kweli && kweli) // Output: `kweli` + +andika(kweli && sikweli) // Output: `sikweli` + +andika(kweli || sikweli) // Output: `kweli` + +andika(sikweli || sikweli) // Output: `sikweli` + +andika(!kweli) // Output: `sikweli` + +andika(!sikweli) // Output: `kweli` + +namba = [1, 2, 3, 4, 5] + +kwa thamani ktk namba { + kama (thamani % 2 == 0) { + andika(thamani, "is even") + } sivyo { + andika(thamani, "is odd") + } } +// Output: +// 1 is odd +// 2 is even +// 3 is odd +// 4 is even +// 5 is odd -kama (idadi("Habari") == 6) { - andika("Habari yako ndugu"); +fanya salamu = unda() { + fanya jina = jaza("Unaitwa nani? ") + andika("Mambo vipi", jina) } -// fibonacci example -andika("Testing fibonacci..."); +salamu() -fanya fibo = unda(x) { - kama (x == 0) { - rudisha 0; - } au kama (x == 1) { - rudisha 1; - } sivyo { - rudisha fibo(x - 1) + fibo(x - 2); - } +aina(2) // Output: "NAMBA" +aina("Nuru") // Output: "NENO" + + +orodha = {"jina": "Juma", "umri": 25} + +k = { + "jina": "Juma", + "umri": 25, + kweli: "kweli", + "salimu": unda(x) { andika("habari", x) }, + "sina value": tupu } -andika(fibo(10)); +andika(k[kweli]) // kweli +andika(k["salimu"]("Juma")) // habari Juma -// testing input -andika("Testing input from user..."); -fanya salamu = unda() { - fanya jina = jaza("Unaitwa nani rafiki? "); - rudisha "Mambo vipi " + jina; - } +k['umri'] = 30 +andika(k['umri']) // 30 + +k["lugha"] = "Kiswahili" +andika(k["lugha"]) // Kiswahili + +matunda = {"a": "apple", "b": "banana"} +mboga = {"c": "carrot", "d": "daikon"} +vyakula = matunda + mboga +andika(vyakula) // {"a": "apple", "b": "banana", "c": "carrot", "d": "daikon"} + + +"umri" ktk k // kweli +"urefu" ktk k // sikweli + + +hobby = {"a": "asili", "b": "baiskeli", "c": "chakula"} +kwa i, v ktk hobby { + andika(i, "=>", v) +} +/* a => asili + b => baiskeli + c => chakula */ -andika(salamu()); + +kwa v ktk hobby { + andika(v) +} /* -Multiline comment +asili +baiskeli +chakula */ -// test dictionaries +jina = "lugano" -andika("Testing dictionaries...") +kwa i ktk jina { + andika(i) +} -fanya watu = [{"jina": "Mojo", "kabila": "Mnyakusa"}, {"jina": "Avi", "kabila": "Mwarabu wa dubai"}] +kamusi = {"a": "andaa", "b": "baba"} -andika(watu, watu[0], watu[0]["jina"], watu[0]["kabila"]) +kwa v ktk kamusi { + andika(v) +} -watu[0]["jina"] = "MJ"; -andika(watu[0]["jina"]); -andika({"a":1} + {"b": 2}) -// testing while loop +kwa k, v ktk kamusi { + andika(k + " ni " + v) +} -andika("Testing while loop..."); +kwa v ktk "mojo" { + andika(v) +} + +kwa i, v ktk "mojo" { + andika(i, "->", v) +} -fanya i = 10; +majina = ["juma", "asha", "haruna"] -wakati (i > 0) { - andika(i); - i = i - 1; +kwa v ktk majina { + andika(v) +} + +kwa i, v ktk majina { + andika(i, "-", v) +} + + +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimevunja") + vunja + } + andika(v) +} + +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimeruka") + endelea + } + andika(v) } + +jum = unda(x, y) { + rudisha x + y +} + +jum(2, 3) // 5 + +salamu = unda() { + andika("Habari yako") +} + +salamu() + +salamu = unda(jina) { + andika("Habari yako", jina) +} + +salamu("asha") // Habari yako asha + +salimu = unda(salamu="Habari") { + andika(salamu) +} + +salimu() // Habari +salimu("Mambo") // Mambo + +mfano = unda(x) { + rudisha "nimerudi" + andika(x) +} + +mfano("x") // nimerudi + + +fib = unda(n) { + kama (n <= 1) { + rudisha n + } sivyo { + rudisha fib(n-1) + fib(n-2) + } +} + +andika(fib(10)) // 55 + +fanya jum = unda(x) { + rudisha unda(y) { + rudisha x + y + } +} + +fanya jum_x = jum(5) +andika(jum_x(3)) // 8 + +2 + 3 * 5 // 17 + +fanya a = 2.5 +fanya b = 3/5 + +a + b // 2.8 + +fanya i = 2.4 + +i++ // 3.4 + +fanya i = 2 + +i *= 3 // 6 +i /= 2 // 3 +i += 100 // 103 +i -= 10 // 93 +i %= 90 // 3 + +fanya i = -10 + +wakati (i < 0) { + andika(i) + i++ +} + + +andika("mambo") // mambo + +fanya a = 'niaje' + +andika("mambo", a) // mambo niaje + +fanya a = "habari" + " " + "yako" + +andika(a) // habari yako + +fanya b = "habari" + +b += " yako" + +// habari yako + +andika("mambo " * 4) + +// mambo mambo mambo mambo + +fanya a = "habari" + +a *= 4 + +// habarihabarihabarihabari + +fanya jina = "avicenna" + +kwa i ktk jina {andika(i)} + +fanya a = "nuru" + +andika(a == "nuru") // kweli + +andika(a == "mambo") // sikweli + +fanya a = "mambo" +a.idadi() // 5 + +fanya a = "NURU" +a.herufindogo() // nuru + +fanya a = "nuru mambo habari" +fanya b = a.gawa() +andika(b) // ["nuru", "mambo", "habari"] + +fanya a = "nuru,mambo,habari" +fanya b = a.gawa(",") +andika(b) // ["nuru", "mambo", "habari"] + +fanya a = 2 + +badili (a){ + ikiwa 3 { + andika("a ni tatu") + } + ikiwa 2 { + andika ("a ni mbili") + } +} + +badili (a) { + ikiwa 1,2,3 { + andika("a ni kati ya 1, 2 au 3") + } + ikiwa 4 { + andika("a ni 4") + } +} + +fanya z = 20 + +badili(z) { + ikiwa 10 { + andika("kumi") + } + ikiwa 30 { + andika("thelathini") + } + kawaida { + andika("ishirini") + } +} + +fanya i = 1 + +wakati (i <= 5) { + andika(i) + i++ +} + +fanya i = 1 + +wakati (i < 5) { + kama (i == 3) { + andika("nimevunja") + vunja + } + andika(i) + i++ +} + +fanya i = 0 + +wakati (i < 5) { + i++ + kama (i == 3) { + andika("nimeruka") + endelea + } + andika(i) +} \ No newline at end of file From 9fbc42b28829ddece1a94f192761be30d02fd3e9 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 10:07:27 +0300 Subject: [PATCH 160/362] fix heading --- docs/en/keywords.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/keywords.md b/docs/en/keywords.md index cf9355a..c94365a 100644 --- a/docs/en/keywords.md +++ b/docs/en/keywords.md @@ -41,7 +41,7 @@ The table below lists the reserved keywords in Nuru. These words have specific m -### BuiltIns +## BuiltIns Nuru also provides several built-in functions that are reserved and cannot be used as identifiers. These functions offer essential functionalities for common tasks in the language: From 1edd9c6242655e8472f13fdd33411d5646544efb Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 10:08:13 +0300 Subject: [PATCH 161/362] Update readme --- docs/en/README.md | 168 ++++++++++++++++++++++++++-------------------- 1 file changed, 96 insertions(+), 72 deletions(-) diff --git a/docs/en/README.md b/docs/en/README.md index 8f5a3a3..179dd0b 100644 --- a/docs/en/README.md +++ b/docs/en/README.md @@ -4,75 +4,99 @@ This documentation is intended for people with some experience in programming. I ## Table Of Contents -- [Comments](./comments.md) -- [Numbers](./numbers.md) - * [Precedence](./numbers.md#precedence) - * [Unary Increments](./numbers.md#unary-increments) - * [Shorthand Assignments](./numbers.md#shorthand-assignment) - * [Negative Numbers](./numbers.md#negative-numbers) -- [Strings](./strings.md) - * [Definition](./strings.md#definition) - * [Concatenation](./strings.md#concatenation) - * [Looping over a String](./strings.md#looping-over-a-string) - * [Comparing Strings](./strings.md#comparing-strings) - * [Length of a String](./strings.md#length-of-a-string) -- [Arrays](./arrays.md) - * [Definition](./arrays.md#definition) - * [Accessing Elements](./arrays.md#accessing-elements) - * [Reassigning Elements](./arrays.md#reassigning-elements) - * [Looping over an Array](./arrays.md#looping-over-an-array) - * [Check if an Element Exists](./arrays.md#check-if-an-element-exists) - * [Concatenating Arrays](./arrays.md#concatenating-arrays) - * [Length of an Array](./arrays.md#length-of-an-array) - * [Adding Elements to an Array](./arrays.md#adding-elements-to-an-array) - * [Getting the last item in an Array](./arrays.md#getting-the-last-element-in-an-array) -- [Dictionaries](./dictionaries.md) - * [Definition](./dictionaries.md#definition) - * [Accessing Elements](./dictionaries.md#accessing-elements) - * [Updating Elements](./dictionaries.md#updating-elements) - * [Adding New Elements](./dictionaries.md#adding-new-elements) - * [Concatenating Dictionaries](./dictionaries.md#concatenating-dictionaries) - * [Checking if a Key Exists](./dictionaries.md#checking-if-key-exists-in-a-dictionary) - * [Looping Over a Dictionary](./dictionaries.md#looping-over-a-dictionary) -- [Booleans](./bool.md) - * [Example 1](./bool.md#example-1) - * [Example 2](./bool.md#example-2) -- [Identifiers](./identifiers.md) - * [Example 1](./identifiers.md#example-1) -- [For Loops](./for.md) - * [Definition](./for.md#definition) - * [Key-Value Pairs](./for.md#key-value-pairs) - * [Break and Continue](./for.md#break-vunja-and-continue-endelea) -- [While Loops](./while.md) - * [Definition](./while.md#definition) - * [Break and Continue](./while.md#break-vunja-and-continue-endelea) -- [If/Else](./ifStatements.md) - * [Definition](./ifStatements.md#definition) - * [Else Block](./ifStatements.md#else-block) -- [Switch Statements](./switch.md) - * [Definition](./switch.md#definition) - * [Multiple Values in Case](./switch.md#multiple-values-in-a-case) - * [Default Keyword](./switch.md#default-kawaida) -- [Functions](./function.md) - * [Definition](./function.md#definition) - * [Parameters](./function.md#parameters) - * [Return](./function.md#return-rudisha) - * [Recursion](./function.md#recursion) -- [Builtins](./builtins.md) - * [andika()](./builtins.md#andika) - * [jaza()](./builtins.md#jaza) - * [aina()](./builtins.md#aina) - * [idadi()](./builtins.md#idadi) - * [sukuma()](./builtins.md#sukuma) - * [yamwisho()](./builtins.md#yamwisho) -- [Null](./null.md) -- [Operators](./operators.md) - * [Assignment](./operators.md#assignment) - * [Arithmetic](./operators.md#arithmetic-operators) - * [Comparison](./operators.md#comparison-operators) - * [Member](./operators.md#member-operator) - * [Logic](./operators.md#logic-operators) - * [Precedence](./operators.md#precedence-of-operators) -- [Keywords](./keywords.md) - * [Reserved](./keywords.md#reserved) - * [Builtins](./keywords.md#builtins) \ No newline at end of file +- [Arrays in Nuru](arrays.md#arrays-in-nuru) + - [Creating Arrays](arrays.md#creating-arrays) + - [Accessing and Modifying Array Elements](arrays.md#accessing-and-modifying-array-elements) + - [Concatenating Arrays](arrays.md#concatenating-arrays) + - [Checking for Array Membership](arrays.md#checking-for-array-membership) + - [Looping Over Arrays](arrays.md#looping-over-arrays) + - [Array Methods](arrays.md#array-methods) + - [idadi()](arrays.md#idadi()) + - [sukuma()](arrays.md#sukuma()) + - [yamwisho()](arrays.md#yamwisho()) +- [Built-in Functions in Nuru](builtins.md#built-in-functions-in-nuru) + - [The andika() Function](builtins.md#the-andika()-function) + - [The jaza() Function](builtins.md#the-jaza()-function) + - [The aina() Function](builtins.md#the-aina()-function) + - [The fungua() Function](builtins.md#the-fungua()-function) +- [Comments in Nuru](comments.md#comments-in-nuru) + - [Single-Line Comments](comments.md#single-line-comments) + - [Multi-Line Comments](comments.md#multi-line-comments) +- [Conditional Statements in Nuru](ifStatements.md#conditional-statements-in-nuru) + - [If Statement (Kama)](ifStatements.md#if-statement-(kama)) + - [Else If and Else Blocks (Au Kama and Sivyo)](ifStatements.md#else-if-and-else-blocks-(au-kama-and-sivyo)) +- [Dictionaries in Nuru](dictionaries.md#dictionaries-in-nuru) + - [Creating Dictionaries](dictionaries.md#creating-dictionaries) + - [Accessing Elements](dictionaries.md#accessing-elements) + - [Updating Elements](dictionaries.md#updating-elements) + - [Adding New Elements](dictionaries.md#adding-new-elements) + - [Concatenating Dictionaries](dictionaries.md#concatenating-dictionaries) + - [Checking If a Key Exists in a Dictionary](dictionaries.md#checking-if-a-key-exists-in-a-dictionary) + - [Looping Over a Dictionary](dictionaries.md#looping-over-a-dictionary) +- [For Loops in Nuru](for.md#for-loops-in-nuru) + - [Basic Syntax](for.md#basic-syntax) + - [Iterating Over Key-Value Pairs](for.md#iterating-over-key-value-pairs) + - [Dictionaries](for.md#dictionaries) + - [Strings](for.md#strings) + - [Lists](for.md#lists) + - [Break (Vunja) and Continue (Endelea)](for.md#break-(vunja)-and-continue-(endelea)) + - [Break (Vunja)](for.md#break-(vunja)) + - [Continue (Endelea)](for.md#continue-(endelea)) +- [Functions in Nuru](function.md#functions-in-nuru) + - [Basic Syntax](function.md#basic-syntax) + - [Parameters](function.md#parameters) + - [Default Parameters](function.md#default-parameters) + - [Return (rudisha)](function.md#return-(rudisha)) + - [Recursion](function.md#recursion) + - [Closures](function.md#closures) +- [Identifiers in Nuru](identifiers.md#identifiers-in-nuru) + - [Syntax Rules](identifiers.md#syntax-rules) + - [Best Practices](identifiers.md#best-practices) +- [INTEGERS (NAMBA) AND FLOATS (DESIMALI)](numbers.md#integers-(namba)-and-floats-(desimali)) + - [PRECEDENCE](numbers.md#precedence) + - [UNARY INCREMENTS](numbers.md#unary-increments) + - [SHORTHAND ASSIGNMENT](numbers.md#shorthand-assignment) + - [NEGATIVE NUMBERS](numbers.md#negative-numbers) +- [KEYWORDS](keywords.md#keywords) + - [Reserved Keywords](keywords.md#reserved-keywords) + - [BuiltIns](keywords.md#builtins) +- [Null (Tupu) in Nuru](null.md#null-(tupu)-in-nuru) + - [Definition](null.md#definition) + - [Evaluation](null.md#evaluation) +- [NURU PROGRAMMING LANGUAGE DOCUMENTATION](README.md#nuru-programming-language-documentation) + - [Table Of Contents](README.md#table-of-contents) +- [OPERATORS](operators.md#operators) + - [ASSIGNMENT](operators.md#assignment) + - [ARITHMETIC OPERATORS](operators.md#arithmetic-operators) + - [COMPARISON OPERATORS](operators.md#comparison-operators) + - [MEMBER OPERATOR](operators.md#member-operator) + - [LOGIC OPERATORS](operators.md#logic-operators) + - [PRECEDENCE OF OPERATORS](operators.md#precedence-of-operators) +- [Strings in Nuru](strings.md#strings-in-nuru) + - [Basic Syntax](strings.md#basic-syntax) + - [Concatenating Strings](strings.md#concatenating-strings) + - [Looping over a String](strings.md#looping-over-a-string) + - [Comparing Strings](strings.md#comparing-strings) + - [String Methods](strings.md#string-methods) + - [idadi()](strings.md#idadi()) + - [herufikubwa()](strings.md#herufikubwa()) + - [herufindogo](strings.md#herufindogo) + - [gawa](strings.md#gawa) +- [Switch Statements in Nuru](switch.md#switch-statements-in-nuru) + - [Basic Syntax](switch.md#basic-syntax) + - [Multiple Values in a Case](switch.md#multiple-values-in-a-case) + - [Default Case (kawaida)](switch.md#default-case-(kawaida)) +- [WHILE (WAKATI)](while.md#while-(wakati)) + - [Basic Syntax](while.md#basic-syntax) + - [Break (vunja) and Continue (endelea)](while.md#break-(vunja)-and-continue-(endelea)) + - [Break (Vunja)](while.md#break-(vunja)) + - [Continue (Endelea)](while.md#continue-(endelea)) +- [Working with Booleans in Nuru](bool.md#working-with-booleans-in-nuru) + - [Evaluating Boolean Expressions](bool.md#evaluating-boolean-expressions) + - [Evaluating Simple Expressions](bool.md#evaluating-simple-expressions) + - [Evaluating Complex Expressions](bool.md#evaluating-complex-expressions) + - [Boolean Operators](bool.md#boolean-operators) + - [The && Operator](bool.md#the-&&-operator) + - [The || Operator](bool.md#the-||-operator) + - [The ! Operator](bool.md#the-!-operator) + - [Working with Boolean Values in Loops](bool.md#working-with-boolean-values-in-loops) From 998ec9bf5e03e435ecbe7911955137a31878debd Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Mon, 20 Mar 2023 10:18:10 +0300 Subject: [PATCH 162/362] fixed headings --- docs/en/numbers.md | 10 +++++----- docs/en/operators.md | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/en/numbers.md b/docs/en/numbers.md index 34e534a..3133534 100644 --- a/docs/en/numbers.md +++ b/docs/en/numbers.md @@ -1,8 +1,8 @@ -## INTEGERS (NAMBA) AND FLOATS (DESIMALI) +# INTEGERS (NAMBA) AND FLOATS (DESIMALI) Integers and floats are the basic numeric data types in Nuru, used for representing whole numbers and decimal numbers, respectively. This page covers the syntax and usage of integers and floats in Nuru, including precedence, unary increments, shorthand assignments, and negative numbers. -### PRECEDENCE +## PRECEDENCE Integers and floats behave as expected in mathematical operations, following the BODMAS rule: ```go @@ -14,7 +14,7 @@ fanya b = 3/5 a + b // 2.8 ``` -### UNARY INCREMENTS +## UNARY INCREMENTS You can perform unary increments (++ and --) on both floats and integers. These will add or subtract 1 from the current value. Note that the float or int have to be assigned to a variable for this operation to work. Here's an example: @@ -24,7 +24,7 @@ fanya i = 2.4 i++ // 3.4 ``` -### SHORTHAND ASSIGNMENT +## SHORTHAND ASSIGNMENT Nuru supports shorthand assignments with +=, -=, /=, *=, and %=: You @@ -38,7 +38,7 @@ i -= 10 // 93 i %= 90 // 3 ``` -### NEGATIVE NUMBERS +## NEGATIVE NUMBERS Negative numbers also behave as expected: diff --git a/docs/en/operators.md b/docs/en/operators.md index 5972659..49eef51 100644 --- a/docs/en/operators.md +++ b/docs/en/operators.md @@ -1,7 +1,7 @@ -## OPERATORS +# OPERATORS Operators are the foundation of any programming language, allowing you to perform various operations on variables and values. This page covers the syntax and usage of operators in Nuru, including assignment, arithmetic, comparison, member, and logic operators. -### ASSIGNMENT +## ASSIGNMENT Assuming `i` and `v` are predefined variables, Nuru supports the following assignment operators: @@ -17,7 +17,7 @@ For `strings`, `arrays` and `dictionaries`, the `+=` sign operator is permissibl list1 += list2 // this is equivalent to list1 = list1 + list2 ``` -### ARITHMETIC OPERATORS +## ARITHMETIC OPERATORS Nuru supports the following arithmetic operators: @@ -28,7 +28,7 @@ Nuru supports the following arithmetic operators: - `%`: Modulo (ie the remainder of a division) - `**`: Exponential power (eg: `2**3 = 8`) -### COMPARISON OPERATORS +## COMPARISON OPERATORS Nuru supports the following comparison operators: @@ -39,7 +39,7 @@ Nuru supports the following comparison operators: - `<`: Less than - `<=`: Less than or equal to -### MEMBER OPERATOR +## MEMBER OPERATOR The member operator in Nuru is `ktk`. It will check if an object exists in another object: ```go @@ -49,7 +49,7 @@ fanya majina = ['juma', 'asha', 'haruna'] "halima" ktk majina // sikweli ``` -### LOGIC OPERATORS +## LOGIC OPERATORS Nuru supports the following logic operators: @@ -57,7 +57,7 @@ Nuru supports the following logic operators: - `||`: Logical `OR`. It will evaluate to false if both are false, otherwise it will evaluate to true. - `!`: Logical `NOT`. It will evaluate to the opposite of a given expression. -### PRECEDENCE OF OPERATORS +## PRECEDENCE OF OPERATORS Operators have the following precedence, starting from the highest priority to the lowest: From 03b5aa999a41f361264f9847fe1ecdef59bfba05 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sat, 1 Apr 2023 23:10:42 +0300 Subject: [PATCH 163/362] return string instead of empty --- evaluator/builtins.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evaluator/builtins.go b/evaluator/builtins.go index f9d3cd7..6472ed2 100644 --- a/evaluator/builtins.go +++ b/evaluator/builtins.go @@ -49,7 +49,7 @@ var builtins = map[string]*object.Builtin{ arr = append(arr, arg.Inspect()) } str := strings.Join(arr, " ") - print(str + "\n") + return &object.String{Value: str} } return nil }, From 26246045070d4b3624450fd9a9143953aa1b9d28 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:25:24 +0300 Subject: [PATCH 164/362] add more gitignore files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index dacbb88..e84e4f9 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,5 @@ tests_random/ nuru Notes.md gotest +tutorials/en/* +upx \ No newline at end of file From 5964deb23abb76392632dbcc87bda59e0cd39a79 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:25:37 +0300 Subject: [PATCH 165/362] add verbosity --- Makefile | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 7fed082..8b9dab1 100644 --- a/Makefile +++ b/Makefile @@ -1,21 +1,31 @@ -VERSION=0.2.0 +VERSION=0.3.0 build_linux: + @echo 'building linux binary...' env GOOS=linux GOARCH=amd64 go build -o nuru + @echo 'zipping build....' tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru + @echo 'cleaning up...' rm nuru build_windows: + @echo 'building windows executable...' env GOOS=windows GOARCH=amd64 go build -o nuru_windows_amd64_v${VERSION}.exe build_mac: + @echo 'building mac binary...' env GOOS=darwin GOARCH=amd64 go build -o nuru + @echo 'zipping build...' tar -zcvf nuru_mac_amd64_v${VERSION}.tar.gz nuru + @echo 'cleaning up...' rm nuru build_android: + @echo 'building android binary' env GOOS=android GOARCH=arm64 go build -o nuru + @echo 'zipping build...' tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru + @echo 'cleaning up...' rm nuru build_test: From ba7970d2af0685da8d66f93aca16c2ea9f990a07 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:39:57 +0300 Subject: [PATCH 166/362] delete docs folder --- docs/en/README.md | 102 ----------------------- docs/en/arrays.md | 107 ------------------------ docs/en/bool.md | 97 ---------------------- docs/en/builtins.md | 45 ----------- docs/en/comments.md | 30 ------- docs/en/dictionaries.md | 107 ------------------------ docs/en/for.md | 175 ---------------------------------------- docs/en/function.md | 97 ---------------------- docs/en/identifiers.md | 31 ------- docs/en/ifStatements.md | 38 --------- docs/en/keywords.md | 59 -------------- docs/en/null.md | 26 ------ docs/en/numbers.md | 76 ----------------- docs/en/operators.md | 76 ----------------- docs/en/strings.md | 148 --------------------------------- docs/en/switch.md | 59 -------------- docs/en/while.md | 74 ----------------- docs/sw/README.md | 1 - docs/sw/arrays.md | 1 - docs/sw/bools.md | 1 - docs/sw/builtins.md | 1 - docs/sw/comments.md | 1 - docs/sw/dictionaries.md | 1 - docs/sw/for.md | 1 - docs/sw/functions.md | 1 - docs/sw/identifiers.md | 1 - docs/sw/if.md | 1 - docs/sw/keywords.md | 1 - docs/sw/null.md | 1 - docs/sw/numbers.md | 1 - docs/sw/operators.md | 1 - docs/sw/strings.md | 1 - docs/sw/switch.md | 1 - docs/sw/while.md | 1 - 34 files changed, 1364 deletions(-) delete mode 100644 docs/en/README.md delete mode 100644 docs/en/arrays.md delete mode 100644 docs/en/bool.md delete mode 100644 docs/en/builtins.md delete mode 100644 docs/en/comments.md delete mode 100644 docs/en/dictionaries.md delete mode 100644 docs/en/for.md delete mode 100644 docs/en/function.md delete mode 100644 docs/en/identifiers.md delete mode 100644 docs/en/ifStatements.md delete mode 100644 docs/en/keywords.md delete mode 100644 docs/en/null.md delete mode 100644 docs/en/numbers.md delete mode 100644 docs/en/operators.md delete mode 100644 docs/en/strings.md delete mode 100644 docs/en/switch.md delete mode 100644 docs/en/while.md delete mode 100644 docs/sw/README.md delete mode 100644 docs/sw/arrays.md delete mode 100644 docs/sw/bools.md delete mode 100644 docs/sw/builtins.md delete mode 100644 docs/sw/comments.md delete mode 100644 docs/sw/dictionaries.md delete mode 100644 docs/sw/for.md delete mode 100644 docs/sw/functions.md delete mode 100644 docs/sw/identifiers.md delete mode 100644 docs/sw/if.md delete mode 100644 docs/sw/keywords.md delete mode 100644 docs/sw/null.md delete mode 100644 docs/sw/numbers.md delete mode 100644 docs/sw/operators.md delete mode 100644 docs/sw/strings.md delete mode 100644 docs/sw/switch.md delete mode 100644 docs/sw/while.md diff --git a/docs/en/README.md b/docs/en/README.md deleted file mode 100644 index 179dd0b..0000000 --- a/docs/en/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# NURU PROGRAMMING LANGUAGE DOCUMENTATION - -This documentation is intended for people with some experience in programming. It describes the syntax, types and how to perform various operations using the language. - -## Table Of Contents - -- [Arrays in Nuru](arrays.md#arrays-in-nuru) - - [Creating Arrays](arrays.md#creating-arrays) - - [Accessing and Modifying Array Elements](arrays.md#accessing-and-modifying-array-elements) - - [Concatenating Arrays](arrays.md#concatenating-arrays) - - [Checking for Array Membership](arrays.md#checking-for-array-membership) - - [Looping Over Arrays](arrays.md#looping-over-arrays) - - [Array Methods](arrays.md#array-methods) - - [idadi()](arrays.md#idadi()) - - [sukuma()](arrays.md#sukuma()) - - [yamwisho()](arrays.md#yamwisho()) -- [Built-in Functions in Nuru](builtins.md#built-in-functions-in-nuru) - - [The andika() Function](builtins.md#the-andika()-function) - - [The jaza() Function](builtins.md#the-jaza()-function) - - [The aina() Function](builtins.md#the-aina()-function) - - [The fungua() Function](builtins.md#the-fungua()-function) -- [Comments in Nuru](comments.md#comments-in-nuru) - - [Single-Line Comments](comments.md#single-line-comments) - - [Multi-Line Comments](comments.md#multi-line-comments) -- [Conditional Statements in Nuru](ifStatements.md#conditional-statements-in-nuru) - - [If Statement (Kama)](ifStatements.md#if-statement-(kama)) - - [Else If and Else Blocks (Au Kama and Sivyo)](ifStatements.md#else-if-and-else-blocks-(au-kama-and-sivyo)) -- [Dictionaries in Nuru](dictionaries.md#dictionaries-in-nuru) - - [Creating Dictionaries](dictionaries.md#creating-dictionaries) - - [Accessing Elements](dictionaries.md#accessing-elements) - - [Updating Elements](dictionaries.md#updating-elements) - - [Adding New Elements](dictionaries.md#adding-new-elements) - - [Concatenating Dictionaries](dictionaries.md#concatenating-dictionaries) - - [Checking If a Key Exists in a Dictionary](dictionaries.md#checking-if-a-key-exists-in-a-dictionary) - - [Looping Over a Dictionary](dictionaries.md#looping-over-a-dictionary) -- [For Loops in Nuru](for.md#for-loops-in-nuru) - - [Basic Syntax](for.md#basic-syntax) - - [Iterating Over Key-Value Pairs](for.md#iterating-over-key-value-pairs) - - [Dictionaries](for.md#dictionaries) - - [Strings](for.md#strings) - - [Lists](for.md#lists) - - [Break (Vunja) and Continue (Endelea)](for.md#break-(vunja)-and-continue-(endelea)) - - [Break (Vunja)](for.md#break-(vunja)) - - [Continue (Endelea)](for.md#continue-(endelea)) -- [Functions in Nuru](function.md#functions-in-nuru) - - [Basic Syntax](function.md#basic-syntax) - - [Parameters](function.md#parameters) - - [Default Parameters](function.md#default-parameters) - - [Return (rudisha)](function.md#return-(rudisha)) - - [Recursion](function.md#recursion) - - [Closures](function.md#closures) -- [Identifiers in Nuru](identifiers.md#identifiers-in-nuru) - - [Syntax Rules](identifiers.md#syntax-rules) - - [Best Practices](identifiers.md#best-practices) -- [INTEGERS (NAMBA) AND FLOATS (DESIMALI)](numbers.md#integers-(namba)-and-floats-(desimali)) - - [PRECEDENCE](numbers.md#precedence) - - [UNARY INCREMENTS](numbers.md#unary-increments) - - [SHORTHAND ASSIGNMENT](numbers.md#shorthand-assignment) - - [NEGATIVE NUMBERS](numbers.md#negative-numbers) -- [KEYWORDS](keywords.md#keywords) - - [Reserved Keywords](keywords.md#reserved-keywords) - - [BuiltIns](keywords.md#builtins) -- [Null (Tupu) in Nuru](null.md#null-(tupu)-in-nuru) - - [Definition](null.md#definition) - - [Evaluation](null.md#evaluation) -- [NURU PROGRAMMING LANGUAGE DOCUMENTATION](README.md#nuru-programming-language-documentation) - - [Table Of Contents](README.md#table-of-contents) -- [OPERATORS](operators.md#operators) - - [ASSIGNMENT](operators.md#assignment) - - [ARITHMETIC OPERATORS](operators.md#arithmetic-operators) - - [COMPARISON OPERATORS](operators.md#comparison-operators) - - [MEMBER OPERATOR](operators.md#member-operator) - - [LOGIC OPERATORS](operators.md#logic-operators) - - [PRECEDENCE OF OPERATORS](operators.md#precedence-of-operators) -- [Strings in Nuru](strings.md#strings-in-nuru) - - [Basic Syntax](strings.md#basic-syntax) - - [Concatenating Strings](strings.md#concatenating-strings) - - [Looping over a String](strings.md#looping-over-a-string) - - [Comparing Strings](strings.md#comparing-strings) - - [String Methods](strings.md#string-methods) - - [idadi()](strings.md#idadi()) - - [herufikubwa()](strings.md#herufikubwa()) - - [herufindogo](strings.md#herufindogo) - - [gawa](strings.md#gawa) -- [Switch Statements in Nuru](switch.md#switch-statements-in-nuru) - - [Basic Syntax](switch.md#basic-syntax) - - [Multiple Values in a Case](switch.md#multiple-values-in-a-case) - - [Default Case (kawaida)](switch.md#default-case-(kawaida)) -- [WHILE (WAKATI)](while.md#while-(wakati)) - - [Basic Syntax](while.md#basic-syntax) - - [Break (vunja) and Continue (endelea)](while.md#break-(vunja)-and-continue-(endelea)) - - [Break (Vunja)](while.md#break-(vunja)) - - [Continue (Endelea)](while.md#continue-(endelea)) -- [Working with Booleans in Nuru](bool.md#working-with-booleans-in-nuru) - - [Evaluating Boolean Expressions](bool.md#evaluating-boolean-expressions) - - [Evaluating Simple Expressions](bool.md#evaluating-simple-expressions) - - [Evaluating Complex Expressions](bool.md#evaluating-complex-expressions) - - [Boolean Operators](bool.md#boolean-operators) - - [The && Operator](bool.md#the-&&-operator) - - [The || Operator](bool.md#the-||-operator) - - [The ! Operator](bool.md#the-!-operator) - - [Working with Boolean Values in Loops](bool.md#working-with-boolean-values-in-loops) diff --git a/docs/en/arrays.md b/docs/en/arrays.md deleted file mode 100644 index ee40671..0000000 --- a/docs/en/arrays.md +++ /dev/null @@ -1,107 +0,0 @@ -# Arrays in Nuru - -Arrays in Nuru are versatile data structures that can hold multiple items, including different types such as numbers, strings, booleans, functions, and null values. This page covers various aspects of arrays, including how to create, manipulate, and iterate over them using Nuru's built-in keywords and methods. - -## Creating Arrays - -To create an array, use square brackets [] and separate items with commas: - -```s -orodha = [1, "pili", kweli] -``` -## Accessing and Modifying Array Elements - -Arrays in Nuru are zero-indexed. To access an element, use the element's index in square brackets: - -```s -namba = [10, 20, 30] -jina = namba[1] // jina is 20 -``` - -You can reassign an element in an array using its index: - -```s -namba[1] = 25 -``` - -## Concatenating Arrays - -To concatenate two or more arrays, use the + operator: - -```s -a = [1, 2, 3] -b = [4, 5, 6] -c = a + b -// c is now [1, 2, 3, 4, 5, 6] -``` - -## Checking for Array Membership - -Use the `ktk` keyword to check if an item exists in an array: - -```s -namba = [10, 20, 30] -andika(20 ktk namba) // will print kweli -``` - -## Looping Over Arrays - -You can use the kwa and ktk keywords to loop over array elements. To loop over just the values, use the following syntax: - -``` -namba = [1, 2, 3, 4, 5] - -kwa thamani ktk namba { - andika(thamani) -} -``` - -To loop over both index and value pairs, use this syntax: - -```s -majina = ["Juma", "Asha", "Haruna"] - -kwa idx, jina ktk majina { - andika(idx, "-", jina) -} -``` - -## Array Methods - -Arrays in Nuru have several built-in methods: - -### idadi() - -idadi() returns the length of an array: - -```s -a = [1, 2, 3] -urefu = a.idadi() -andika(urefu) // will print 3 -``` - -### sukuma() - -sukuma() adds one or more items to the end of an array: - -```s -a = [1, 2, 3] -a.sukuma("s", "g") -andika(a) // will print [1, 2, 3, "s", "g"] -``` - -### yamwisho() - -yamwisho() returns the last item in an array, or tupu if the array is empty: - -```s -a = [1, 2, 3] -mwisho = a.yamwisho() -andika(mwisho) // will print 3 - -b = [] -mwisho = b.yamwisho() -andika(mwisho) // will print tupu -``` - -With this information, you can now effectively work with arrays in Nuru, making it easy to manipulate collections of data in your programs. \ No newline at end of file diff --git a/docs/en/bool.md b/docs/en/bool.md deleted file mode 100644 index 5df0764..0000000 --- a/docs/en/bool.md +++ /dev/null @@ -1,97 +0,0 @@ -# Working with Booleans in Nuru - -Boolean objects in Nuru are truthy, meaning that any value is true, except tupu and sikweli. They are used to evaluate expressions that return true or false values. - -## Evaluating Boolean Expressions - -### Evaluating Simple Expressions - -In Nuru, you can evaluate simple expressions that return a boolean value: - -```s -andika(1 > 2) // Output: `sikweli` - -andika(1 + 3 < 10) // Output: `kweli` -``` - -### Evaluating Complex Expressions - -In Nuru, you can use boolean operators to evaluate complex expressions: - -```s -a = 5 -b = 10 -c = 15 - -result = (a < b) && (b < c) - -kama (result) { - andika("Both conditions are true") -} sivyo { - andika("At least one condition is false") -} -// Output: "Both conditions are true" -``` - -Here, we create three variables a, b, and c. We then evaluate the expression (a < b) && (b < c). Since both conditions are true, the output will be "Both conditions are true". - -## Boolean Operators - -Nuru has several boolean operators that you can use to evaluate expressions: - -### The && Operator - -The && operator evaluates to true only if both operands are true. Here's an example: - -```s -andika(kweli && kweli) // Output: `kweli` - -andika(kweli && sikweli) // Output: `sikweli` -``` - -### The || Operator - -The || operator evaluates to true if at least one of the operands is true. Here's an example: - -```s -andika(kweli || sikweli) // Output: `kweli` - -andika(sikweli || sikweli) // Output: `sikweli` -``` - -### The ! Operator - -The ! operator negates the value of the operand. Here's an example: - -```s -andika(!kweli) // Output: `sikweli` - -andika(!sikweli) // Output: `kweli` -``` - -## Working with Boolean Values in Loops - -In Nuru, you can use boolean expressions in loops to control their behavior. Here's an example: - -```s -namba = [1, 2, 3, 4, 5] - -kwa thamani ktk namba { - kama (thamani % 2 == 0) { - andika(thamani, "is even") - } sivyo { - andika(thamani, "is odd") - } -} -// Output: -// 1 is odd -// 2 is even -// 3 is odd -// 4 is even -// 5 is odd -``` - -Here, we create an array namba with the values 1 through 5. We then loop over each value in the array and use the % operator to determine if it is even or odd. The output will be "is even" for even numbers and "is odd" for odd numbers. - - -Boolean objects in Nuru can be used to evaluate expressions that return true or false values. You can use boolean operators to evaluate complex expressions and control the behavior of loops. Understanding how to work with boolean values is an essential skill for any Nuru programmer. \ No newline at end of file diff --git a/docs/en/builtins.md b/docs/en/builtins.md deleted file mode 100644 index 5c075ca..0000000 --- a/docs/en/builtins.md +++ /dev/null @@ -1,45 +0,0 @@ -# Built-in Functions in Nuru - -Nuru has several built-in functions that perform specific tasks. - -## The andika() Function - -The andika() function is used to print out messages to the console. It can take zero or more arguments, and the arguments will be printed out with a space in between them. Additionally, andika() supports basic formatting such as /n for a new line, /t for a tab space, and \\ for a backslash. Here's an example: - -```s -andika(1, 2, 3) // Output: "1 2 3" -``` - -## The jaza() Function - -The jaza() function is used to get input from the user. It can take zero or one argument, which is a string that will be used as a prompt for the user. Here's an example: - -```s -fanya salamu = unda() { - fanya jina = jaza("Unaitwa nani? ") - andika("Mambo vipi", jina) -} - -salamu() -``` - -In this example, we define a function `salamu()` that prompts the user to enter their name using the `jaza()` function. We then use the `andika()` function to print out a message that includes the user's name. - -## The aina() Function - -The `aina()` function is used to determine the type of an object. It accepts one argument, and the return value will be a string indicating the type of the object. Here's an example: - -```s -aina(2) // Output: "NAMBA" -aina("Nuru") // Output: "NENO" -``` - -## The fungua() Function - -The `fungua()` function is used to open a file. It accepts one argument, which is the path to the file that you want to open. Here's an example: - -```s -faili = fungua("data.txt") -``` - -In this example, we use the `fungua()` function to open a file named "data.txt". The variable faili will contain a reference to the opened file. \ No newline at end of file diff --git a/docs/en/comments.md b/docs/en/comments.md deleted file mode 100644 index 8e69b6b..0000000 --- a/docs/en/comments.md +++ /dev/null @@ -1,30 +0,0 @@ -# Comments in Nuru - -In Nuru, you can write comments to provide explanations and documentation for your code. Comments are lines of text that are ignored by the Nuru interpreter, so they will not affect the behavior of your program. There are two types of comments in Nuru: single-line comments and multi-line comments. - -## Single-Line Comments - -Single-line comments are used to provide brief explanations or documentation for a single line of code. To write a single-line comment in Nuru, use two forward slashes (//) followed by your comment text. Here's an example: - -```s -// This line will be ignored by the Nuru interpreter -``` - -In this example, the comment text "This line will be ignored by the Nuru interpreter" will be ignored by the interpreter, so it will not affect the behavior of the program. - -## Multi-Line Comments - -Multi-line comments are used to provide more detailed explanations or documentation for multiple lines of code. To write a multi-line comment in Nuru, use a forward slash followed by an asterisk ( /* ) to start the comment, and an asterisk followed by a forward slash ( */ ) to end the comment. Here's an example: - -```s -/* -These lines -Will -be -ignored -*/ -``` - -In this example, all the lines between the /* and */ symbols will be ignored by the Nuru interpreter, so they will not affect the behavior of the program. - -By utilizing single-line and multi-line comments in Nuru, you can make your code more readable and easier to maintain for yourself and others who may need to work with your code in the future. \ No newline at end of file diff --git a/docs/en/dictionaries.md b/docs/en/dictionaries.md deleted file mode 100644 index e70b4ab..0000000 --- a/docs/en/dictionaries.md +++ /dev/null @@ -1,107 +0,0 @@ -# Dictionaries in Nuru - -Dictionaries in Nuru, also known as "kamusi," are powerful and flexible data structures that store key-value pairs. This page provides a comprehensive overview of dictionaries in Nuru, including how to create, access, modify, and iterate over them. - -## Creating Dictionaries - -Dictionaries are enclosed in curly braces {} and consist of keys and values separated by colons. Here's an example of defining a dictionary: - -```s - -orodha = {"jina": "Juma", "umri": 25} -``` - -Keys can be strings, integers, floats, or booleans, while values can be any data type, including strings, integers, floats, booleans, null, or functions: - -```s -k = { - "jina": "Juma", - "umri": 25, - kweli: "kweli", - "salimu": unda(x) { andika("habari", x) }, - "sina value": tupu -} -``` - -## Accessing Elements - -Access individual elements in a dictionary using their keys: - -```s - -andika(k[kweli]) // kweli -andika(k["salimu"]("Juma")) // habari Juma -``` - -## Updating Elements - -Update the value of an element by assigning a new value to its key: - -```s -k['umri'] = 30 -andika(k['umri']) // 30 -``` - -## Adding New Elements - -Add a new key-value pair to a dictionary by assigning a value to a non-existent key: - -```s -k["lugha"] = "Kiswahili" -andika(k["lugha"]) // Kiswahili -``` - -## Concatenating Dictionaries - -Combine two dictionaries using the + operator: - -```s -matunda = {"a": "apple", "b": "banana"} -mboga = {"c": "carrot", "d": "daikon"} -vyakula = matunda + mboga -andika(vyakula) // {"a": "apple", "b": "banana", "c": "carrot", "d": "daikon"} -``` - -## Checking If a Key Exists in a Dictionary - -Use the ktk keyword to check if a key exists in a dictionary: - -```s - -"umri" ktk k // kweli -"urefu" ktk k // sikweli -``` - -## Looping Over a Dictionary - -Loop over a dictionary to access its keys and values: - -```s - -hobby = {"a": "asili", "b": "baiskeli", "c": "chakula"} -kwa i, v ktk hobby { - andika(i, "=>", v) -} -``` -Output -```s -a => asili -b => baiskeli -c => chakula -``` - -Loop over just the values: - -```s -kwa v ktk hobby { - andika(v) -} -``` -Output -```s -asili -baiskeli -chakula -``` - -With this knowledge, you can now effectively use dictionaries in Nuru to store and manage key-value pairs, offering a flexible way to organize and access data in your programs. \ No newline at end of file diff --git a/docs/en/for.md b/docs/en/for.md deleted file mode 100644 index d12ea51..0000000 --- a/docs/en/for.md +++ /dev/null @@ -1,175 +0,0 @@ -# For Loops in Nuru - -For loops are a fundamental control structure in Nuru, used for iterating over iterable objects such as strings, arrays, and dictionaries. This page covers the syntax and usage of for loops in Nuru, including key-value pair iteration, and the use of break and continue statements. - -## Basic Syntax -To create a for loop, use the kwa keyword followed by a temporary identifier (such as i or v) and the iterable object. Enclose the loop body in curly braces {}. Here's an example with a string: - -```s -jina = "lugano" - -kwa i ktk jina { - andika(i) -} -``` -Output: - -```s -l -u -g -a -n -o -``` - -## Iterating Over Key-Value Pairs - -### Dictionaries - -Nuru allows you to iterate over both the value or the key-value pair of an iterable. To iterate over just the values, use one temporary identifier: - -```s -kamusi = {"a": "andaa", "b": "baba"} - -kwa v ktk kamusi { - andika(v) -} -``` - -Output: - -```s -andaa -baba -``` -To iterate over both the keys and the values, use two temporary identifiers: - -```s - -kwa k, v ktk kamusi { - andika(k + " ni " + v) -} -``` -Output: - -```s -a ni andaa -b ni baba -``` - -### Strings - -To iterate over just the values in a string, use one temporary identifier: - -```s -kwa v ktk "mojo" { - andika(v) -} -``` - -Output: -```s -m -o -j -o -``` -To iterate over both the keys and the values in a string, use two temporary identifiers: - -```s -kwa i, v ktk "mojo" { - andika(i, "->", v) -} -``` -Output: -```s -0 -> m -1 -> o -2 -> j -3 -> o -``` - -### Lists - -To iterate over just the values in a list, use one temporary identifier: - -```s -majina = ["juma", "asha", "haruna"] - -kwa v ktk majina { - andika(v) -} -``` - -Output: - -```s -juma -asha -haruna -``` - -To iterate over both the keys and the values in a list, use two temporary identifiers: - -```s -kwa i, v ktk majina { - andika(i, "-", v) -} -``` - -Output: - -```s -0 - juma -1 - asha -2 - haruna -``` - -## Break (Vunja) and Continue (Endelea) - -### Break (Vunja) - -Use the vunja keyword to terminate a loop: - -```s - -kwa i, v ktk "mojo" { - kama (i == 2) { - andika("nimevunja") - vunja - } - andika(v) -} -``` - -Output: - -```s -m -o -nimevunja -``` - -### Continue (Endelea) - -Use the endelea keyword to skip a specific iteration: - -```s -kwa i, v ktk "mojo" { - kama (i == 2) { - andika("nimeruka") - endelea - } - andika(v) -} -``` - -Output: - -```s -m -o -nimeruka -o -``` \ No newline at end of file diff --git a/docs/en/function.md b/docs/en/function.md deleted file mode 100644 index cc70da4..0000000 --- a/docs/en/function.md +++ /dev/null @@ -1,97 +0,0 @@ -# Functions in Nuru - -Functions are a fundamental part of Nuru programming, allowing you to define reusable blocks of code. This page covers the syntax and usage of functions in Nuru, including parameters, default parameters, return statements, recursion, and closures. - -## Basic Syntax - -A function block starts with the unda keyword, followed by parameters enclosed in parentheses () and the body enclosed in curly braces {}. Functions must be assigned to a variable: - -```s -jum = unda(x, y) { - rudisha x + y -} - -jum(2, 3) // 5 -``` - -## Parameters - -Functions can have zero or any number of arguments. Arguments can be of any type, even other functions: - -```s -salamu = unda() { - andika("Habari yako") -} - -salamu() - -salamu = unda(jina) { - andika("Habari yako", jina) -} - -salamu("asha") // Habari yako asha -``` - -## Default Parameters - -Functions can be provided with default parameters: - -```s -salimu = unda(salamu="Habari") { - andika(salamu) -} - -salimu() // Habari -salimu("Mambo") // Mambo -``` - -## Return (rudisha) - -You can return values with the rudisha keyword. The rudisha keyword will terminate the block and return the value: - -```s -mfano = unda(x) { - rudisha "nimerudi" - andika(x) -} - -mfano("x") // nimerudi -``` - -## Recursion - -Nuru also supports recursion. Here's an example of a recursive Fibonacci function: - -```s - -fib = unda(n) { - kama (n <= 1) { - rudisha n - } sivyo { - rudisha fib(n-1) + fib(n-2) - } -} - -andika(fib(10)) // 55 -``` - -The fib function calculates the nth Fibonacci number by recursively calling itself with n-1 and n-2 as arguments until n is less than or equal to 1. - -## Closures - -Closures are anonymous functions that can capture and store references to variables from their surrounding context. In Nuru, you can create closures using the unda keyword without assigning them to a variable. Here's an example: - -```s -fanya jum = unda(x) { - rudisha unda(y) { - rudisha x + y - } -} - -fanya jum_x = jum(5) -andika(jum_x(3)) // 8 -``` - -In the example above, the jum function returns another function that takes a single parameter y. The returned function has access to the x variable from its surrounding context. - -Now that you understand the basics of functions in Nuru, including recursion and closures, you can create reusable blocks of code to simplify your programs and improve code organization. \ No newline at end of file diff --git a/docs/en/identifiers.md b/docs/en/identifiers.md deleted file mode 100644 index 0f94880..0000000 --- a/docs/en/identifiers.md +++ /dev/null @@ -1,31 +0,0 @@ -# Identifiers in Nuru - -Identifiers are used to name variables, functions, and other elements in your Nuru code. This page covers the rules and best practices for creating identifiers in Nuru. - -## Syntax Rules - -Identifiers can contain letters, numbers, and underscores. However, there are a few rules you must follow when creating identifiers: -- Identifiers cannot start with a number. -- Identifiers are case-sensitive. For example, myVar and myvar are considered distinct identifiers. - -Here are some examples of valid identifiers: - -```s -fanya birth_year = 2020 -andika(birth_year) // 2020 - -fanya convert_c_to_p = "C to P" -andika(convert_c_to_p) // "C to P" -``` - -In the examples above, birth_year and convert_c_to_p are both valid identifiers. - -## Best Practices - -When choosing identifiers, it's important to follow best practices to ensure your code is clear and easy to understand: - -- Use descriptive names that clearly indicate the purpose or meaning of the variable or function. -- Follow a consistent naming convention, such as camelCase (myVariableName) or snake_case (my_variable_name). -- Avoid using single-letter variable names, except for commonly accepted cases like loop counters (i, j, k). - -By following these best practices when creating identifiers, you will make your Nuru code more readable and maintainable for yourself and others. diff --git a/docs/en/ifStatements.md b/docs/en/ifStatements.md deleted file mode 100644 index 5e74560..0000000 --- a/docs/en/ifStatements.md +++ /dev/null @@ -1,38 +0,0 @@ -# Conditional Statements in Nuru - -Conditional statements in Nuru are used to perform different actions based on different conditions. The if/else statement is a fundamental control structure that allows you to execute code based on specific conditions. This page covers the basics of if/else statements in Nuru. - -## If Statement (Kama) - -An if statement starts with the kama keyword, followed by a condition in parentheses (). If the condition is true, the code inside the curly braces {} will be executed. - -```s -kama (2 > 1) { - andika(kweli) // kweli -} -``` - -In this example, the condition 2 > 1 is true, so the andika(kweli) statement is executed, and the output is kweli. - -## Else If and Else Blocks (Au Kama and Sivyo) - -You can use au kama to test multiple conditions and sivyo to specify a default block of code to be executed when none of the conditions are true. - -```s - -fanya a = 10 - -kama (a > 100) { - andika("a imezidi 100") -} au kama (a < 10) { - andika("a ndogo kuliko 10") -} sivyo { - andika("Thamani ya a ni", a) -} - -// The output will be 'Thamani ya a ni 10' -``` - -In this example, the first condition a > 100 is false, and the second condition a < 10 is also false. Therefore, the code inside the sivyo block is executed, and the output is 'Thamani ya a ni 10'. - -By using if/else statements with the kama, au kama, and sivyo keywords, you can control the flow of your Nuru code based on different conditions. \ No newline at end of file diff --git a/docs/en/keywords.md b/docs/en/keywords.md deleted file mode 100644 index c94365a..0000000 --- a/docs/en/keywords.md +++ /dev/null @@ -1,59 +0,0 @@ -# KEYWORDS - -Keywords in Nuru are reserved words that have special meanings and cannot be used as identifiers for variables, functions, or classes. This page covers the syntax and usage of keywords in Nuru, including reserved keywords and built-in functions. - -## Reserved Keywords - -The table below lists the reserved keywords in Nuru. These words have specific meanings in the language and cannot be used as identifiers: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
kwelisikweliundafanya
kamaausivyowakati
rudishavunjaendeleatupu
ktkkwabadiliikiwa
kawaida
- -## BuiltIns - -Nuru also provides several built-in functions that are reserved and cannot be used as identifiers. These functions offer essential functionalities for common tasks in the language: - - - - - - - - - - -
andikaainajazafungua
- -Understanding the keywords and built-in functions in Nuru is essential for writing clear, concise, and error-free code. By respecting the reserved words and their specific meanings, you can create more robust and maintainable programs in Nuru. \ No newline at end of file diff --git a/docs/en/null.md b/docs/en/null.md deleted file mode 100644 index 75d8883..0000000 --- a/docs/en/null.md +++ /dev/null @@ -1,26 +0,0 @@ -# Null (Tupu) in Nuru - -The null data type in Nuru represents the absence of a value or the concept of "nothing" or "empty." This page covers the syntax and usage of the null data type in Nuru, including its definition and evaluation. - -## Definition - -A null data type is a data type with no value, defined with the tupu keyword: - -```s -fanya a = tupu -``` -## Evaluation - -When evaluating a null data type in a conditional expression, it will evaluate to false: - -```s -kama (a) { - andika("niko tupu") -} sivyo { - andika("nimevaa nguo") -} - -// Output: nimevaa nguo -``` - -The null data type is useful in Nuru when you need to represent an uninitialized, missing, or undefined value in your programs. By understanding the null data type, you can create more robust and flexible code. \ No newline at end of file diff --git a/docs/en/numbers.md b/docs/en/numbers.md deleted file mode 100644 index 3133534..0000000 --- a/docs/en/numbers.md +++ /dev/null @@ -1,76 +0,0 @@ -# INTEGERS (NAMBA) AND FLOATS (DESIMALI) - -Integers and floats are the basic numeric data types in Nuru, used for representing whole numbers and decimal numbers, respectively. This page covers the syntax and usage of integers and floats in Nuru, including precedence, unary increments, shorthand assignments, and negative numbers. - -## PRECEDENCE - -Integers and floats behave as expected in mathematical operations, following the BODMAS rule: -```go -2 + 3 * 5 // 17 - -fanya a = 2.5 -fanya b = 3/5 - -a + b // 2.8 -``` - -## UNARY INCREMENTS - -You can perform unary increments (++ and --) on both floats and integers. These will add or subtract 1 from the current value. Note that the float or int have to be assigned to a variable for this operation to work. Here's an example: - -```go -fanya i = 2.4 - -i++ // 3.4 -``` - -## SHORTHAND ASSIGNMENT - -Nuru supports shorthand assignments with +=, -=, /=, *=, and %=: -You -```go -fanya i = 2 - -i *= 3 // 6 -i /= 2 // 3 -i += 100 // 103 -i -= 10 // 93 -i %= 90 // 3 -``` - -## NEGATIVE NUMBERS - -Negative numbers also behave as expected: - -```go -fanya i = -10 - -wakati (i < 0) { - andika(i) - i++ -} - -``` -Output: -```s --10 --9 --8 --7 --6 --5 --4 --3 --2 --1 -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -``` diff --git a/docs/en/operators.md b/docs/en/operators.md deleted file mode 100644 index 49eef51..0000000 --- a/docs/en/operators.md +++ /dev/null @@ -1,76 +0,0 @@ -# OPERATORS -Operators are the foundation of any programming language, allowing you to perform various operations on variables and values. This page covers the syntax and usage of operators in Nuru, including assignment, arithmetic, comparison, member, and logic operators. - -## ASSIGNMENT - -Assuming `i` and `v` are predefined variables, Nuru supports the following assignment operators: - -- `i = v`: which is the regular assignment operator -- `i += v`: which is the equivalent of `i = i + v` -- `i -= v`: which is the equivalent of `i = i - v` -- `i *= v`: which is the equivalent of `i = i * v` -- `i /= v`: which is the equivalent of `i = i / v` -- `i += v`: which is the equivalent of `i = i + v` - -For `strings`, `arrays` and `dictionaries`, the `+=` sign operator is permissible. Example: -``` -list1 += list2 // this is equivalent to list1 = list1 + list2 -``` - -## ARITHMETIC OPERATORS - -Nuru supports the following arithmetic operators: - -- `+`: Additon -- `-`: Subtraction -- `*`: Multiplication -- `/`: Division -- `%`: Modulo (ie the remainder of a division) -- `**`: Exponential power (eg: `2**3 = 8`) - -## COMPARISON OPERATORS - -Nuru supports the following comparison operators: - -- `==`: Equal to -- `!=`: Not equal to -- `>`: Greater than -- `>=`: Greater than or equal to -- `<`: Less than -- `<=`: Less than or equal to - -## MEMBER OPERATOR - -The member operator in Nuru is `ktk`. It will check if an object exists in another object: -```go -fanya majina = ['juma', 'asha', 'haruna'] - -"haruna" ktk majina // kweli -"halima" ktk majina // sikweli -``` - -## LOGIC OPERATORS - -Nuru supports the following logic operators: - -- `&&`: Logical `AND`. It will evaluate to true if both are true, otherwise it will evaluate to false. -- `||`: Logical `OR`. It will evaluate to false if both are false, otherwise it will evaluate to true. -- `!`: Logical `NOT`. It will evaluate to the opposite of a given expression. - -## PRECEDENCE OF OPERATORS - -Operators have the following precedence, starting from the highest priority to the lowest: - -- `()` : Items in paranthesis have the highest priority -- `!`: Negation -- `%`: Modulo -- `**`: Exponential power -- `/, *`: Division and Multiplication -- `+, +=, -, -=`: Addition and Subtraction -- `>, >=, <, <=`: Comparison operators -- `==, !=`: Equal or Not Equal to -- `=`: Assignment Operator -- `ktk`: Member Operator -- `&&, ||`: Logical AND and OR - -Understanding operators in Nuru allows you to create complex expressions, perform calculations, and make decisions based on the values of variables. diff --git a/docs/en/strings.md b/docs/en/strings.md deleted file mode 100644 index 4132953..0000000 --- a/docs/en/strings.md +++ /dev/null @@ -1,148 +0,0 @@ -# Strings in Nuru - -Strings are a sequence of characters that can represent text in the Nuru programming language. This page covers the basics of strings, their manipulation, and some built-in methods. - -## Basic Syntax - -Strings can be enclosed in either single quotes '' or double quotes "": - -```s -andika("mambo") // mambo - -fanya a = 'niaje' - -andika("mambo", a) // mambo niaje -``` - -## Concatenating Strings - -Strings can be concatenated using the + operator: - -```s -fanya a = "habari" + " " + "yako" - -andika(a) // habari yako - -fanya b = "habari" - -b += " yako" - -// habari yako -``` - -You can also repeat a string n number of times using the * operator: - -```s -andika("mambo " * 4) - -// mambo mambo mambo mambo - -fanya a = "habari" - -a *= 4 - -// habarihabarihabarihabari -``` - -## Looping over a String - -You can loop through a string using the kwa keyword: - -```s -fanya jina = "avicenna" - -kwa i ktk jina {andika(i)} -``` -Output -```s -a -v -i -c -e -n -n -a -``` - -And for key-value pairs: - -```s -kwa i, v ktk jina { - andika(i, "=>", v) -} -``` -Output -```s -0 => a -1 => v -2 => i -3 => c -4 => e -5 => n -6 => n -7 => a -``` - -## Comparing Strings - -You can compare two strings using the == operator: - -```s -fanya a = "nuru" - -andika(a == "nuru") // kweli - -andika(a == "mambo") // sikweli -``` - -## String Methods - -### idadi() - -You can find the length of a string using the idadi method. It does not accept any parameters. - -```s -fanya a = "mambo" -a.idadi() // 5 -``` - -### herufikubwa() - -This method converts a string to uppercase. It does not accept any parameters. - -```s -fanya a = "nuru" -a.herufikubwa() // NURU -``` - -### herufindogo - -This method converts a string to lowercase. It does not accept any parameters. - -```s -fanya a = "NURU" -a.herufindogo() // nuru -``` - -### gawa - -The gawa method splits a string into an array based on a specified delimiter. If no argument is provided, it will split the string according to whitespace. - -Example without a parameter: - -```s -fanya a = "nuru mambo habari" -fanya b = a.gawa() -andika(b) // ["nuru", "mambo", "habari"] -``` - -Example with a parameter: - -```s -fanya a = "nuru,mambo,habari" -fanya b = a.gawa(",") -andika(b) // ["nuru", "mambo", "habari"] -``` - -By understanding strings and their manipulation in Nuru, you can effectively work with text data in your programs. \ No newline at end of file diff --git a/docs/en/switch.md b/docs/en/switch.md deleted file mode 100644 index 6286429..0000000 --- a/docs/en/switch.md +++ /dev/null @@ -1,59 +0,0 @@ -# Switch Statements in Nuru - -Switch statements in Nuru allow you to execute different code blocks based on the value of a given expression. This page covers the basics of switch statements and their usage. - -## Basic Syntax - -You initialize a switch statement with the badili keyword, the expression inside parentheses (), and all cases enclosed within curly braces {}. - -A case statement has the keyword ikiwa followed by a value to check. Multiple values can be in a single case separated by commas ,. The consequence to execute if a condition is fulfilled must be inside curly braces {}. Here's an example: - -```s -fanya a = 2 - -badili (a){ - ikiwa 3 { - andika("a ni tatu") - } - ikiwa 2 { - andika ("a ni mbili") - } -} -``` - -## Multiple Values in a Case - -Multiple possibilities can be assigned to a single case (ikiwa) statement: - -```s -badili (a) { - ikiwa 1,2,3 { - andika("a ni kati ya 1, 2 au 3") - } - ikiwa 4 { - andika("a ni 4") - } -} -``` - -## Default Case (kawaida) - -The default statement will be executed when no condition is satisfied. The default statement is represented by kawaida: - -```s -fanya z = 20 - -badili(z) { - ikiwa 10 { - andika("kumi") - } - ikiwa 30 { - andika("thelathini") - } - kawaida { - andika("ishirini") - } -} -``` - -By understanding switch statements in Nuru, you can create more efficient and organized code that can handle multiple conditions easily. \ No newline at end of file diff --git a/docs/en/while.md b/docs/en/while.md deleted file mode 100644 index 45972c0..0000000 --- a/docs/en/while.md +++ /dev/null @@ -1,74 +0,0 @@ -# WHILE (WAKATI) - -While loops in Nuru are used to execute a block of code repeatedly, as long as a given condition is true. This page covers the basics of while loops, including how to use the break and continue keywords within them. - -## Basic Syntax - -A while loop is executed when a specified condition is true. You initiliaze a while loop with the `wakati` keyword followed by the condition in paranthesis `()`. The consequence of the loop should be enclosed in brackets `{}`: -```s -fanya i = 1 - -wakati (i <= 5) { - andika(i) - i++ -} -``` -Output -```s -1 -2 -3 -4 -5 -``` - -## Break (vunja) and Continue (endelea) -### Break (Vunja) - -Use the vunja keyword to terminate a loop: - -```s -fanya i = 1 - -wakati (i < 5) { - kama (i == 3) { - andika("nimevunja") - vunja - } - andika(i) - i++ -} -``` -Output -```s -1 -2 -nimevunja -``` - -### Continue (Endelea) - -Use the endelea keyword to skip a specific iteration: - -```s -fanya i = 0 - -wakati (i < 5) { - i++ - kama (i == 3) { - andika("nimeruka") - endelea - } - andika(i) -} -``` -Output -```s -1 -2 -nimeruka -4 -5 -``` - -By understanding while loops in Nuru, you can create code that repeats a specific action or checks for certain conditions, offering more flexibility and control over your code execution. \ No newline at end of file diff --git a/docs/sw/README.md b/docs/sw/README.md deleted file mode 100644 index 698fdad..0000000 --- a/docs/sw/README.md +++ /dev/null @@ -1 +0,0 @@ -# NURU PROGRAMMING LANGUAGE DOCUMENTATION \ No newline at end of file diff --git a/docs/sw/arrays.md b/docs/sw/arrays.md deleted file mode 100644 index bbc6434..0000000 --- a/docs/sw/arrays.md +++ /dev/null @@ -1 +0,0 @@ -# Orodha (Arrays) \ No newline at end of file diff --git a/docs/sw/bools.md b/docs/sw/bools.md deleted file mode 100644 index 16f7a44..0000000 --- a/docs/sw/bools.md +++ /dev/null @@ -1 +0,0 @@ -# Kweli/Sikweli (Bools) diff --git a/docs/sw/builtins.md b/docs/sw/builtins.md deleted file mode 100644 index f807886..0000000 --- a/docs/sw/builtins.md +++ /dev/null @@ -1 +0,0 @@ -# Builtins \ No newline at end of file diff --git a/docs/sw/comments.md b/docs/sw/comments.md deleted file mode 100644 index 2a30807..0000000 --- a/docs/sw/comments.md +++ /dev/null @@ -1 +0,0 @@ -# Maelezo (Comments) \ No newline at end of file diff --git a/docs/sw/dictionaries.md b/docs/sw/dictionaries.md deleted file mode 100644 index 469ad6d..0000000 --- a/docs/sw/dictionaries.md +++ /dev/null @@ -1 +0,0 @@ -# Kamusi (Dictionaries) \ No newline at end of file diff --git a/docs/sw/for.md b/docs/sw/for.md deleted file mode 100644 index 52b9109..0000000 --- a/docs/sw/for.md +++ /dev/null @@ -1 +0,0 @@ -# Kwa (For) \ No newline at end of file diff --git a/docs/sw/functions.md b/docs/sw/functions.md deleted file mode 100644 index ed2c3d8..0000000 --- a/docs/sw/functions.md +++ /dev/null @@ -1 +0,0 @@ -# Undo (Functions) \ No newline at end of file diff --git a/docs/sw/identifiers.md b/docs/sw/identifiers.md deleted file mode 100644 index d89ef81..0000000 --- a/docs/sw/identifiers.md +++ /dev/null @@ -1 +0,0 @@ -# Tambulishi (Identifiers) \ No newline at end of file diff --git a/docs/sw/if.md b/docs/sw/if.md deleted file mode 100644 index a364c61..0000000 --- a/docs/sw/if.md +++ /dev/null @@ -1 +0,0 @@ -# Kama/Sivyo (If/Else) \ No newline at end of file diff --git a/docs/sw/keywords.md b/docs/sw/keywords.md deleted file mode 100644 index 5160a95..0000000 --- a/docs/sw/keywords.md +++ /dev/null @@ -1 +0,0 @@ -# Maneno Muhimu (Keywords) \ No newline at end of file diff --git a/docs/sw/null.md b/docs/sw/null.md deleted file mode 100644 index 628c65e..0000000 --- a/docs/sw/null.md +++ /dev/null @@ -1 +0,0 @@ -# Tupu (Null) \ No newline at end of file diff --git a/docs/sw/numbers.md b/docs/sw/numbers.md deleted file mode 100644 index dd4ec8b..0000000 --- a/docs/sw/numbers.md +++ /dev/null @@ -1 +0,0 @@ -# Namba na Desimali (Ints/Floats) \ No newline at end of file diff --git a/docs/sw/operators.md b/docs/sw/operators.md deleted file mode 100644 index cf38456..0000000 --- a/docs/sw/operators.md +++ /dev/null @@ -1 +0,0 @@ -# Matendaji (Operators) \ No newline at end of file diff --git a/docs/sw/strings.md b/docs/sw/strings.md deleted file mode 100644 index 0185efb..0000000 --- a/docs/sw/strings.md +++ /dev/null @@ -1 +0,0 @@ -# Neno (Strings) \ No newline at end of file diff --git a/docs/sw/switch.md b/docs/sw/switch.md deleted file mode 100644 index ec1fc19..0000000 --- a/docs/sw/switch.md +++ /dev/null @@ -1 +0,0 @@ -# Badili (Switch) \ No newline at end of file diff --git a/docs/sw/while.md b/docs/sw/while.md deleted file mode 100644 index e022883..0000000 --- a/docs/sw/while.md +++ /dev/null @@ -1 +0,0 @@ -# Wakati (While) \ No newline at end of file From 48fedca712fecaf1e0a15be07c2bfbf244fb923f Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:41:36 +0300 Subject: [PATCH 167/362] add docs folder inside repl --- repl/docs/en/README.md | 102 ++++++++++++++++++++ repl/docs/en/arrays.md | 107 +++++++++++++++++++++ repl/docs/en/bool.md | 97 +++++++++++++++++++ repl/docs/en/builtins.md | 45 +++++++++ repl/docs/en/comments.md | 30 ++++++ repl/docs/en/dictionaries.md | 107 +++++++++++++++++++++ repl/docs/en/for.md | 175 +++++++++++++++++++++++++++++++++++ repl/docs/en/function.md | 97 +++++++++++++++++++ repl/docs/en/identifiers.md | 31 +++++++ repl/docs/en/ifStatements.md | 38 ++++++++ repl/docs/en/keywords.md | 59 ++++++++++++ repl/docs/en/null.md | 26 ++++++ repl/docs/en/numbers.md | 76 +++++++++++++++ repl/docs/en/operators.md | 76 +++++++++++++++ repl/docs/en/strings.md | 148 +++++++++++++++++++++++++++++ repl/docs/en/switch.md | 59 ++++++++++++ repl/docs/en/while.md | 74 +++++++++++++++ repl/docs/sw/README.md | 1 + repl/docs/sw/arrays.md | 1 + repl/docs/sw/bools.md | 1 + repl/docs/sw/builtins.md | 1 + repl/docs/sw/comments.md | 1 + repl/docs/sw/dictionaries.md | 1 + repl/docs/sw/for.md | 1 + repl/docs/sw/functions.md | 1 + repl/docs/sw/identifiers.md | 1 + repl/docs/sw/if.md | 1 + repl/docs/sw/keywords.md | 1 + repl/docs/sw/null.md | 1 + repl/docs/sw/numbers.md | 1 + repl/docs/sw/operators.md | 1 + repl/docs/sw/strings.md | 1 + repl/docs/sw/switch.md | 1 + repl/docs/sw/while.md | 1 + 34 files changed, 1364 insertions(+) create mode 100644 repl/docs/en/README.md create mode 100644 repl/docs/en/arrays.md create mode 100644 repl/docs/en/bool.md create mode 100644 repl/docs/en/builtins.md create mode 100644 repl/docs/en/comments.md create mode 100644 repl/docs/en/dictionaries.md create mode 100644 repl/docs/en/for.md create mode 100644 repl/docs/en/function.md create mode 100644 repl/docs/en/identifiers.md create mode 100644 repl/docs/en/ifStatements.md create mode 100644 repl/docs/en/keywords.md create mode 100644 repl/docs/en/null.md create mode 100644 repl/docs/en/numbers.md create mode 100644 repl/docs/en/operators.md create mode 100644 repl/docs/en/strings.md create mode 100644 repl/docs/en/switch.md create mode 100644 repl/docs/en/while.md create mode 100644 repl/docs/sw/README.md create mode 100644 repl/docs/sw/arrays.md create mode 100644 repl/docs/sw/bools.md create mode 100644 repl/docs/sw/builtins.md create mode 100644 repl/docs/sw/comments.md create mode 100644 repl/docs/sw/dictionaries.md create mode 100644 repl/docs/sw/for.md create mode 100644 repl/docs/sw/functions.md create mode 100644 repl/docs/sw/identifiers.md create mode 100644 repl/docs/sw/if.md create mode 100644 repl/docs/sw/keywords.md create mode 100644 repl/docs/sw/null.md create mode 100644 repl/docs/sw/numbers.md create mode 100644 repl/docs/sw/operators.md create mode 100644 repl/docs/sw/strings.md create mode 100644 repl/docs/sw/switch.md create mode 100644 repl/docs/sw/while.md diff --git a/repl/docs/en/README.md b/repl/docs/en/README.md new file mode 100644 index 0000000..179dd0b --- /dev/null +++ b/repl/docs/en/README.md @@ -0,0 +1,102 @@ +# NURU PROGRAMMING LANGUAGE DOCUMENTATION + +This documentation is intended for people with some experience in programming. It describes the syntax, types and how to perform various operations using the language. + +## Table Of Contents + +- [Arrays in Nuru](arrays.md#arrays-in-nuru) + - [Creating Arrays](arrays.md#creating-arrays) + - [Accessing and Modifying Array Elements](arrays.md#accessing-and-modifying-array-elements) + - [Concatenating Arrays](arrays.md#concatenating-arrays) + - [Checking for Array Membership](arrays.md#checking-for-array-membership) + - [Looping Over Arrays](arrays.md#looping-over-arrays) + - [Array Methods](arrays.md#array-methods) + - [idadi()](arrays.md#idadi()) + - [sukuma()](arrays.md#sukuma()) + - [yamwisho()](arrays.md#yamwisho()) +- [Built-in Functions in Nuru](builtins.md#built-in-functions-in-nuru) + - [The andika() Function](builtins.md#the-andika()-function) + - [The jaza() Function](builtins.md#the-jaza()-function) + - [The aina() Function](builtins.md#the-aina()-function) + - [The fungua() Function](builtins.md#the-fungua()-function) +- [Comments in Nuru](comments.md#comments-in-nuru) + - [Single-Line Comments](comments.md#single-line-comments) + - [Multi-Line Comments](comments.md#multi-line-comments) +- [Conditional Statements in Nuru](ifStatements.md#conditional-statements-in-nuru) + - [If Statement (Kama)](ifStatements.md#if-statement-(kama)) + - [Else If and Else Blocks (Au Kama and Sivyo)](ifStatements.md#else-if-and-else-blocks-(au-kama-and-sivyo)) +- [Dictionaries in Nuru](dictionaries.md#dictionaries-in-nuru) + - [Creating Dictionaries](dictionaries.md#creating-dictionaries) + - [Accessing Elements](dictionaries.md#accessing-elements) + - [Updating Elements](dictionaries.md#updating-elements) + - [Adding New Elements](dictionaries.md#adding-new-elements) + - [Concatenating Dictionaries](dictionaries.md#concatenating-dictionaries) + - [Checking If a Key Exists in a Dictionary](dictionaries.md#checking-if-a-key-exists-in-a-dictionary) + - [Looping Over a Dictionary](dictionaries.md#looping-over-a-dictionary) +- [For Loops in Nuru](for.md#for-loops-in-nuru) + - [Basic Syntax](for.md#basic-syntax) + - [Iterating Over Key-Value Pairs](for.md#iterating-over-key-value-pairs) + - [Dictionaries](for.md#dictionaries) + - [Strings](for.md#strings) + - [Lists](for.md#lists) + - [Break (Vunja) and Continue (Endelea)](for.md#break-(vunja)-and-continue-(endelea)) + - [Break (Vunja)](for.md#break-(vunja)) + - [Continue (Endelea)](for.md#continue-(endelea)) +- [Functions in Nuru](function.md#functions-in-nuru) + - [Basic Syntax](function.md#basic-syntax) + - [Parameters](function.md#parameters) + - [Default Parameters](function.md#default-parameters) + - [Return (rudisha)](function.md#return-(rudisha)) + - [Recursion](function.md#recursion) + - [Closures](function.md#closures) +- [Identifiers in Nuru](identifiers.md#identifiers-in-nuru) + - [Syntax Rules](identifiers.md#syntax-rules) + - [Best Practices](identifiers.md#best-practices) +- [INTEGERS (NAMBA) AND FLOATS (DESIMALI)](numbers.md#integers-(namba)-and-floats-(desimali)) + - [PRECEDENCE](numbers.md#precedence) + - [UNARY INCREMENTS](numbers.md#unary-increments) + - [SHORTHAND ASSIGNMENT](numbers.md#shorthand-assignment) + - [NEGATIVE NUMBERS](numbers.md#negative-numbers) +- [KEYWORDS](keywords.md#keywords) + - [Reserved Keywords](keywords.md#reserved-keywords) + - [BuiltIns](keywords.md#builtins) +- [Null (Tupu) in Nuru](null.md#null-(tupu)-in-nuru) + - [Definition](null.md#definition) + - [Evaluation](null.md#evaluation) +- [NURU PROGRAMMING LANGUAGE DOCUMENTATION](README.md#nuru-programming-language-documentation) + - [Table Of Contents](README.md#table-of-contents) +- [OPERATORS](operators.md#operators) + - [ASSIGNMENT](operators.md#assignment) + - [ARITHMETIC OPERATORS](operators.md#arithmetic-operators) + - [COMPARISON OPERATORS](operators.md#comparison-operators) + - [MEMBER OPERATOR](operators.md#member-operator) + - [LOGIC OPERATORS](operators.md#logic-operators) + - [PRECEDENCE OF OPERATORS](operators.md#precedence-of-operators) +- [Strings in Nuru](strings.md#strings-in-nuru) + - [Basic Syntax](strings.md#basic-syntax) + - [Concatenating Strings](strings.md#concatenating-strings) + - [Looping over a String](strings.md#looping-over-a-string) + - [Comparing Strings](strings.md#comparing-strings) + - [String Methods](strings.md#string-methods) + - [idadi()](strings.md#idadi()) + - [herufikubwa()](strings.md#herufikubwa()) + - [herufindogo](strings.md#herufindogo) + - [gawa](strings.md#gawa) +- [Switch Statements in Nuru](switch.md#switch-statements-in-nuru) + - [Basic Syntax](switch.md#basic-syntax) + - [Multiple Values in a Case](switch.md#multiple-values-in-a-case) + - [Default Case (kawaida)](switch.md#default-case-(kawaida)) +- [WHILE (WAKATI)](while.md#while-(wakati)) + - [Basic Syntax](while.md#basic-syntax) + - [Break (vunja) and Continue (endelea)](while.md#break-(vunja)-and-continue-(endelea)) + - [Break (Vunja)](while.md#break-(vunja)) + - [Continue (Endelea)](while.md#continue-(endelea)) +- [Working with Booleans in Nuru](bool.md#working-with-booleans-in-nuru) + - [Evaluating Boolean Expressions](bool.md#evaluating-boolean-expressions) + - [Evaluating Simple Expressions](bool.md#evaluating-simple-expressions) + - [Evaluating Complex Expressions](bool.md#evaluating-complex-expressions) + - [Boolean Operators](bool.md#boolean-operators) + - [The && Operator](bool.md#the-&&-operator) + - [The || Operator](bool.md#the-||-operator) + - [The ! Operator](bool.md#the-!-operator) + - [Working with Boolean Values in Loops](bool.md#working-with-boolean-values-in-loops) diff --git a/repl/docs/en/arrays.md b/repl/docs/en/arrays.md new file mode 100644 index 0000000..ee40671 --- /dev/null +++ b/repl/docs/en/arrays.md @@ -0,0 +1,107 @@ +# Arrays in Nuru + +Arrays in Nuru are versatile data structures that can hold multiple items, including different types such as numbers, strings, booleans, functions, and null values. This page covers various aspects of arrays, including how to create, manipulate, and iterate over them using Nuru's built-in keywords and methods. + +## Creating Arrays + +To create an array, use square brackets [] and separate items with commas: + +```s +orodha = [1, "pili", kweli] +``` +## Accessing and Modifying Array Elements + +Arrays in Nuru are zero-indexed. To access an element, use the element's index in square brackets: + +```s +namba = [10, 20, 30] +jina = namba[1] // jina is 20 +``` + +You can reassign an element in an array using its index: + +```s +namba[1] = 25 +``` + +## Concatenating Arrays + +To concatenate two or more arrays, use the + operator: + +```s +a = [1, 2, 3] +b = [4, 5, 6] +c = a + b +// c is now [1, 2, 3, 4, 5, 6] +``` + +## Checking for Array Membership + +Use the `ktk` keyword to check if an item exists in an array: + +```s +namba = [10, 20, 30] +andika(20 ktk namba) // will print kweli +``` + +## Looping Over Arrays + +You can use the kwa and ktk keywords to loop over array elements. To loop over just the values, use the following syntax: + +``` +namba = [1, 2, 3, 4, 5] + +kwa thamani ktk namba { + andika(thamani) +} +``` + +To loop over both index and value pairs, use this syntax: + +```s +majina = ["Juma", "Asha", "Haruna"] + +kwa idx, jina ktk majina { + andika(idx, "-", jina) +} +``` + +## Array Methods + +Arrays in Nuru have several built-in methods: + +### idadi() + +idadi() returns the length of an array: + +```s +a = [1, 2, 3] +urefu = a.idadi() +andika(urefu) // will print 3 +``` + +### sukuma() + +sukuma() adds one or more items to the end of an array: + +```s +a = [1, 2, 3] +a.sukuma("s", "g") +andika(a) // will print [1, 2, 3, "s", "g"] +``` + +### yamwisho() + +yamwisho() returns the last item in an array, or tupu if the array is empty: + +```s +a = [1, 2, 3] +mwisho = a.yamwisho() +andika(mwisho) // will print 3 + +b = [] +mwisho = b.yamwisho() +andika(mwisho) // will print tupu +``` + +With this information, you can now effectively work with arrays in Nuru, making it easy to manipulate collections of data in your programs. \ No newline at end of file diff --git a/repl/docs/en/bool.md b/repl/docs/en/bool.md new file mode 100644 index 0000000..5df0764 --- /dev/null +++ b/repl/docs/en/bool.md @@ -0,0 +1,97 @@ +# Working with Booleans in Nuru + +Boolean objects in Nuru are truthy, meaning that any value is true, except tupu and sikweli. They are used to evaluate expressions that return true or false values. + +## Evaluating Boolean Expressions + +### Evaluating Simple Expressions + +In Nuru, you can evaluate simple expressions that return a boolean value: + +```s +andika(1 > 2) // Output: `sikweli` + +andika(1 + 3 < 10) // Output: `kweli` +``` + +### Evaluating Complex Expressions + +In Nuru, you can use boolean operators to evaluate complex expressions: + +```s +a = 5 +b = 10 +c = 15 + +result = (a < b) && (b < c) + +kama (result) { + andika("Both conditions are true") +} sivyo { + andika("At least one condition is false") +} +// Output: "Both conditions are true" +``` + +Here, we create three variables a, b, and c. We then evaluate the expression (a < b) && (b < c). Since both conditions are true, the output will be "Both conditions are true". + +## Boolean Operators + +Nuru has several boolean operators that you can use to evaluate expressions: + +### The && Operator + +The && operator evaluates to true only if both operands are true. Here's an example: + +```s +andika(kweli && kweli) // Output: `kweli` + +andika(kweli && sikweli) // Output: `sikweli` +``` + +### The || Operator + +The || operator evaluates to true if at least one of the operands is true. Here's an example: + +```s +andika(kweli || sikweli) // Output: `kweli` + +andika(sikweli || sikweli) // Output: `sikweli` +``` + +### The ! Operator + +The ! operator negates the value of the operand. Here's an example: + +```s +andika(!kweli) // Output: `sikweli` + +andika(!sikweli) // Output: `kweli` +``` + +## Working with Boolean Values in Loops + +In Nuru, you can use boolean expressions in loops to control their behavior. Here's an example: + +```s +namba = [1, 2, 3, 4, 5] + +kwa thamani ktk namba { + kama (thamani % 2 == 0) { + andika(thamani, "is even") + } sivyo { + andika(thamani, "is odd") + } +} +// Output: +// 1 is odd +// 2 is even +// 3 is odd +// 4 is even +// 5 is odd +``` + +Here, we create an array namba with the values 1 through 5. We then loop over each value in the array and use the % operator to determine if it is even or odd. The output will be "is even" for even numbers and "is odd" for odd numbers. + + +Boolean objects in Nuru can be used to evaluate expressions that return true or false values. You can use boolean operators to evaluate complex expressions and control the behavior of loops. Understanding how to work with boolean values is an essential skill for any Nuru programmer. \ No newline at end of file diff --git a/repl/docs/en/builtins.md b/repl/docs/en/builtins.md new file mode 100644 index 0000000..5c075ca --- /dev/null +++ b/repl/docs/en/builtins.md @@ -0,0 +1,45 @@ +# Built-in Functions in Nuru + +Nuru has several built-in functions that perform specific tasks. + +## The andika() Function + +The andika() function is used to print out messages to the console. It can take zero or more arguments, and the arguments will be printed out with a space in between them. Additionally, andika() supports basic formatting such as /n for a new line, /t for a tab space, and \\ for a backslash. Here's an example: + +```s +andika(1, 2, 3) // Output: "1 2 3" +``` + +## The jaza() Function + +The jaza() function is used to get input from the user. It can take zero or one argument, which is a string that will be used as a prompt for the user. Here's an example: + +```s +fanya salamu = unda() { + fanya jina = jaza("Unaitwa nani? ") + andika("Mambo vipi", jina) +} + +salamu() +``` + +In this example, we define a function `salamu()` that prompts the user to enter their name using the `jaza()` function. We then use the `andika()` function to print out a message that includes the user's name. + +## The aina() Function + +The `aina()` function is used to determine the type of an object. It accepts one argument, and the return value will be a string indicating the type of the object. Here's an example: + +```s +aina(2) // Output: "NAMBA" +aina("Nuru") // Output: "NENO" +``` + +## The fungua() Function + +The `fungua()` function is used to open a file. It accepts one argument, which is the path to the file that you want to open. Here's an example: + +```s +faili = fungua("data.txt") +``` + +In this example, we use the `fungua()` function to open a file named "data.txt". The variable faili will contain a reference to the opened file. \ No newline at end of file diff --git a/repl/docs/en/comments.md b/repl/docs/en/comments.md new file mode 100644 index 0000000..8e69b6b --- /dev/null +++ b/repl/docs/en/comments.md @@ -0,0 +1,30 @@ +# Comments in Nuru + +In Nuru, you can write comments to provide explanations and documentation for your code. Comments are lines of text that are ignored by the Nuru interpreter, so they will not affect the behavior of your program. There are two types of comments in Nuru: single-line comments and multi-line comments. + +## Single-Line Comments + +Single-line comments are used to provide brief explanations or documentation for a single line of code. To write a single-line comment in Nuru, use two forward slashes (//) followed by your comment text. Here's an example: + +```s +// This line will be ignored by the Nuru interpreter +``` + +In this example, the comment text "This line will be ignored by the Nuru interpreter" will be ignored by the interpreter, so it will not affect the behavior of the program. + +## Multi-Line Comments + +Multi-line comments are used to provide more detailed explanations or documentation for multiple lines of code. To write a multi-line comment in Nuru, use a forward slash followed by an asterisk ( /* ) to start the comment, and an asterisk followed by a forward slash ( */ ) to end the comment. Here's an example: + +```s +/* +These lines +Will +be +ignored +*/ +``` + +In this example, all the lines between the /* and */ symbols will be ignored by the Nuru interpreter, so they will not affect the behavior of the program. + +By utilizing single-line and multi-line comments in Nuru, you can make your code more readable and easier to maintain for yourself and others who may need to work with your code in the future. \ No newline at end of file diff --git a/repl/docs/en/dictionaries.md b/repl/docs/en/dictionaries.md new file mode 100644 index 0000000..e70b4ab --- /dev/null +++ b/repl/docs/en/dictionaries.md @@ -0,0 +1,107 @@ +# Dictionaries in Nuru + +Dictionaries in Nuru, also known as "kamusi," are powerful and flexible data structures that store key-value pairs. This page provides a comprehensive overview of dictionaries in Nuru, including how to create, access, modify, and iterate over them. + +## Creating Dictionaries + +Dictionaries are enclosed in curly braces {} and consist of keys and values separated by colons. Here's an example of defining a dictionary: + +```s + +orodha = {"jina": "Juma", "umri": 25} +``` + +Keys can be strings, integers, floats, or booleans, while values can be any data type, including strings, integers, floats, booleans, null, or functions: + +```s +k = { + "jina": "Juma", + "umri": 25, + kweli: "kweli", + "salimu": unda(x) { andika("habari", x) }, + "sina value": tupu +} +``` + +## Accessing Elements + +Access individual elements in a dictionary using their keys: + +```s + +andika(k[kweli]) // kweli +andika(k["salimu"]("Juma")) // habari Juma +``` + +## Updating Elements + +Update the value of an element by assigning a new value to its key: + +```s +k['umri'] = 30 +andika(k['umri']) // 30 +``` + +## Adding New Elements + +Add a new key-value pair to a dictionary by assigning a value to a non-existent key: + +```s +k["lugha"] = "Kiswahili" +andika(k["lugha"]) // Kiswahili +``` + +## Concatenating Dictionaries + +Combine two dictionaries using the + operator: + +```s +matunda = {"a": "apple", "b": "banana"} +mboga = {"c": "carrot", "d": "daikon"} +vyakula = matunda + mboga +andika(vyakula) // {"a": "apple", "b": "banana", "c": "carrot", "d": "daikon"} +``` + +## Checking If a Key Exists in a Dictionary + +Use the ktk keyword to check if a key exists in a dictionary: + +```s + +"umri" ktk k // kweli +"urefu" ktk k // sikweli +``` + +## Looping Over a Dictionary + +Loop over a dictionary to access its keys and values: + +```s + +hobby = {"a": "asili", "b": "baiskeli", "c": "chakula"} +kwa i, v ktk hobby { + andika(i, "=>", v) +} +``` +Output +```s +a => asili +b => baiskeli +c => chakula +``` + +Loop over just the values: + +```s +kwa v ktk hobby { + andika(v) +} +``` +Output +```s +asili +baiskeli +chakula +``` + +With this knowledge, you can now effectively use dictionaries in Nuru to store and manage key-value pairs, offering a flexible way to organize and access data in your programs. \ No newline at end of file diff --git a/repl/docs/en/for.md b/repl/docs/en/for.md new file mode 100644 index 0000000..d12ea51 --- /dev/null +++ b/repl/docs/en/for.md @@ -0,0 +1,175 @@ +# For Loops in Nuru + +For loops are a fundamental control structure in Nuru, used for iterating over iterable objects such as strings, arrays, and dictionaries. This page covers the syntax and usage of for loops in Nuru, including key-value pair iteration, and the use of break and continue statements. + +## Basic Syntax +To create a for loop, use the kwa keyword followed by a temporary identifier (such as i or v) and the iterable object. Enclose the loop body in curly braces {}. Here's an example with a string: + +```s +jina = "lugano" + +kwa i ktk jina { + andika(i) +} +``` +Output: + +```s +l +u +g +a +n +o +``` + +## Iterating Over Key-Value Pairs + +### Dictionaries + +Nuru allows you to iterate over both the value or the key-value pair of an iterable. To iterate over just the values, use one temporary identifier: + +```s +kamusi = {"a": "andaa", "b": "baba"} + +kwa v ktk kamusi { + andika(v) +} +``` + +Output: + +```s +andaa +baba +``` +To iterate over both the keys and the values, use two temporary identifiers: + +```s + +kwa k, v ktk kamusi { + andika(k + " ni " + v) +} +``` +Output: + +```s +a ni andaa +b ni baba +``` + +### Strings + +To iterate over just the values in a string, use one temporary identifier: + +```s +kwa v ktk "mojo" { + andika(v) +} +``` + +Output: +```s +m +o +j +o +``` +To iterate over both the keys and the values in a string, use two temporary identifiers: + +```s +kwa i, v ktk "mojo" { + andika(i, "->", v) +} +``` +Output: +```s +0 -> m +1 -> o +2 -> j +3 -> o +``` + +### Lists + +To iterate over just the values in a list, use one temporary identifier: + +```s +majina = ["juma", "asha", "haruna"] + +kwa v ktk majina { + andika(v) +} +``` + +Output: + +```s +juma +asha +haruna +``` + +To iterate over both the keys and the values in a list, use two temporary identifiers: + +```s +kwa i, v ktk majina { + andika(i, "-", v) +} +``` + +Output: + +```s +0 - juma +1 - asha +2 - haruna +``` + +## Break (Vunja) and Continue (Endelea) + +### Break (Vunja) + +Use the vunja keyword to terminate a loop: + +```s + +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimevunja") + vunja + } + andika(v) +} +``` + +Output: + +```s +m +o +nimevunja +``` + +### Continue (Endelea) + +Use the endelea keyword to skip a specific iteration: + +```s +kwa i, v ktk "mojo" { + kama (i == 2) { + andika("nimeruka") + endelea + } + andika(v) +} +``` + +Output: + +```s +m +o +nimeruka +o +``` \ No newline at end of file diff --git a/repl/docs/en/function.md b/repl/docs/en/function.md new file mode 100644 index 0000000..cc70da4 --- /dev/null +++ b/repl/docs/en/function.md @@ -0,0 +1,97 @@ +# Functions in Nuru + +Functions are a fundamental part of Nuru programming, allowing you to define reusable blocks of code. This page covers the syntax and usage of functions in Nuru, including parameters, default parameters, return statements, recursion, and closures. + +## Basic Syntax + +A function block starts with the unda keyword, followed by parameters enclosed in parentheses () and the body enclosed in curly braces {}. Functions must be assigned to a variable: + +```s +jum = unda(x, y) { + rudisha x + y +} + +jum(2, 3) // 5 +``` + +## Parameters + +Functions can have zero or any number of arguments. Arguments can be of any type, even other functions: + +```s +salamu = unda() { + andika("Habari yako") +} + +salamu() + +salamu = unda(jina) { + andika("Habari yako", jina) +} + +salamu("asha") // Habari yako asha +``` + +## Default Parameters + +Functions can be provided with default parameters: + +```s +salimu = unda(salamu="Habari") { + andika(salamu) +} + +salimu() // Habari +salimu("Mambo") // Mambo +``` + +## Return (rudisha) + +You can return values with the rudisha keyword. The rudisha keyword will terminate the block and return the value: + +```s +mfano = unda(x) { + rudisha "nimerudi" + andika(x) +} + +mfano("x") // nimerudi +``` + +## Recursion + +Nuru also supports recursion. Here's an example of a recursive Fibonacci function: + +```s + +fib = unda(n) { + kama (n <= 1) { + rudisha n + } sivyo { + rudisha fib(n-1) + fib(n-2) + } +} + +andika(fib(10)) // 55 +``` + +The fib function calculates the nth Fibonacci number by recursively calling itself with n-1 and n-2 as arguments until n is less than or equal to 1. + +## Closures + +Closures are anonymous functions that can capture and store references to variables from their surrounding context. In Nuru, you can create closures using the unda keyword without assigning them to a variable. Here's an example: + +```s +fanya jum = unda(x) { + rudisha unda(y) { + rudisha x + y + } +} + +fanya jum_x = jum(5) +andika(jum_x(3)) // 8 +``` + +In the example above, the jum function returns another function that takes a single parameter y. The returned function has access to the x variable from its surrounding context. + +Now that you understand the basics of functions in Nuru, including recursion and closures, you can create reusable blocks of code to simplify your programs and improve code organization. \ No newline at end of file diff --git a/repl/docs/en/identifiers.md b/repl/docs/en/identifiers.md new file mode 100644 index 0000000..0f94880 --- /dev/null +++ b/repl/docs/en/identifiers.md @@ -0,0 +1,31 @@ +# Identifiers in Nuru + +Identifiers are used to name variables, functions, and other elements in your Nuru code. This page covers the rules and best practices for creating identifiers in Nuru. + +## Syntax Rules + +Identifiers can contain letters, numbers, and underscores. However, there are a few rules you must follow when creating identifiers: +- Identifiers cannot start with a number. +- Identifiers are case-sensitive. For example, myVar and myvar are considered distinct identifiers. + +Here are some examples of valid identifiers: + +```s +fanya birth_year = 2020 +andika(birth_year) // 2020 + +fanya convert_c_to_p = "C to P" +andika(convert_c_to_p) // "C to P" +``` + +In the examples above, birth_year and convert_c_to_p are both valid identifiers. + +## Best Practices + +When choosing identifiers, it's important to follow best practices to ensure your code is clear and easy to understand: + +- Use descriptive names that clearly indicate the purpose or meaning of the variable or function. +- Follow a consistent naming convention, such as camelCase (myVariableName) or snake_case (my_variable_name). +- Avoid using single-letter variable names, except for commonly accepted cases like loop counters (i, j, k). + +By following these best practices when creating identifiers, you will make your Nuru code more readable and maintainable for yourself and others. diff --git a/repl/docs/en/ifStatements.md b/repl/docs/en/ifStatements.md new file mode 100644 index 0000000..5e74560 --- /dev/null +++ b/repl/docs/en/ifStatements.md @@ -0,0 +1,38 @@ +# Conditional Statements in Nuru + +Conditional statements in Nuru are used to perform different actions based on different conditions. The if/else statement is a fundamental control structure that allows you to execute code based on specific conditions. This page covers the basics of if/else statements in Nuru. + +## If Statement (Kama) + +An if statement starts with the kama keyword, followed by a condition in parentheses (). If the condition is true, the code inside the curly braces {} will be executed. + +```s +kama (2 > 1) { + andika(kweli) // kweli +} +``` + +In this example, the condition 2 > 1 is true, so the andika(kweli) statement is executed, and the output is kweli. + +## Else If and Else Blocks (Au Kama and Sivyo) + +You can use au kama to test multiple conditions and sivyo to specify a default block of code to be executed when none of the conditions are true. + +```s + +fanya a = 10 + +kama (a > 100) { + andika("a imezidi 100") +} au kama (a < 10) { + andika("a ndogo kuliko 10") +} sivyo { + andika("Thamani ya a ni", a) +} + +// The output will be 'Thamani ya a ni 10' +``` + +In this example, the first condition a > 100 is false, and the second condition a < 10 is also false. Therefore, the code inside the sivyo block is executed, and the output is 'Thamani ya a ni 10'. + +By using if/else statements with the kama, au kama, and sivyo keywords, you can control the flow of your Nuru code based on different conditions. \ No newline at end of file diff --git a/repl/docs/en/keywords.md b/repl/docs/en/keywords.md new file mode 100644 index 0000000..c94365a --- /dev/null +++ b/repl/docs/en/keywords.md @@ -0,0 +1,59 @@ +# KEYWORDS + +Keywords in Nuru are reserved words that have special meanings and cannot be used as identifiers for variables, functions, or classes. This page covers the syntax and usage of keywords in Nuru, including reserved keywords and built-in functions. + +## Reserved Keywords + +The table below lists the reserved keywords in Nuru. These words have specific meanings in the language and cannot be used as identifiers: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
kwelisikweliundafanya
kamaausivyowakati
rudishavunjaendeleatupu
ktkkwabadiliikiwa
kawaida
+ +## BuiltIns + +Nuru also provides several built-in functions that are reserved and cannot be used as identifiers. These functions offer essential functionalities for common tasks in the language: + + + + + + + + + + +
andikaainajazafungua
+ +Understanding the keywords and built-in functions in Nuru is essential for writing clear, concise, and error-free code. By respecting the reserved words and their specific meanings, you can create more robust and maintainable programs in Nuru. \ No newline at end of file diff --git a/repl/docs/en/null.md b/repl/docs/en/null.md new file mode 100644 index 0000000..75d8883 --- /dev/null +++ b/repl/docs/en/null.md @@ -0,0 +1,26 @@ +# Null (Tupu) in Nuru + +The null data type in Nuru represents the absence of a value or the concept of "nothing" or "empty." This page covers the syntax and usage of the null data type in Nuru, including its definition and evaluation. + +## Definition + +A null data type is a data type with no value, defined with the tupu keyword: + +```s +fanya a = tupu +``` +## Evaluation + +When evaluating a null data type in a conditional expression, it will evaluate to false: + +```s +kama (a) { + andika("niko tupu") +} sivyo { + andika("nimevaa nguo") +} + +// Output: nimevaa nguo +``` + +The null data type is useful in Nuru when you need to represent an uninitialized, missing, or undefined value in your programs. By understanding the null data type, you can create more robust and flexible code. \ No newline at end of file diff --git a/repl/docs/en/numbers.md b/repl/docs/en/numbers.md new file mode 100644 index 0000000..3133534 --- /dev/null +++ b/repl/docs/en/numbers.md @@ -0,0 +1,76 @@ +# INTEGERS (NAMBA) AND FLOATS (DESIMALI) + +Integers and floats are the basic numeric data types in Nuru, used for representing whole numbers and decimal numbers, respectively. This page covers the syntax and usage of integers and floats in Nuru, including precedence, unary increments, shorthand assignments, and negative numbers. + +## PRECEDENCE + +Integers and floats behave as expected in mathematical operations, following the BODMAS rule: +```go +2 + 3 * 5 // 17 + +fanya a = 2.5 +fanya b = 3/5 + +a + b // 2.8 +``` + +## UNARY INCREMENTS + +You can perform unary increments (++ and --) on both floats and integers. These will add or subtract 1 from the current value. Note that the float or int have to be assigned to a variable for this operation to work. Here's an example: + +```go +fanya i = 2.4 + +i++ // 3.4 +``` + +## SHORTHAND ASSIGNMENT + +Nuru supports shorthand assignments with +=, -=, /=, *=, and %=: +You +```go +fanya i = 2 + +i *= 3 // 6 +i /= 2 // 3 +i += 100 // 103 +i -= 10 // 93 +i %= 90 // 3 +``` + +## NEGATIVE NUMBERS + +Negative numbers also behave as expected: + +```go +fanya i = -10 + +wakati (i < 0) { + andika(i) + i++ +} + +``` +Output: +```s +-10 +-9 +-8 +-7 +-6 +-5 +-4 +-3 +-2 +-1 +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` diff --git a/repl/docs/en/operators.md b/repl/docs/en/operators.md new file mode 100644 index 0000000..49eef51 --- /dev/null +++ b/repl/docs/en/operators.md @@ -0,0 +1,76 @@ +# OPERATORS +Operators are the foundation of any programming language, allowing you to perform various operations on variables and values. This page covers the syntax and usage of operators in Nuru, including assignment, arithmetic, comparison, member, and logic operators. + +## ASSIGNMENT + +Assuming `i` and `v` are predefined variables, Nuru supports the following assignment operators: + +- `i = v`: which is the regular assignment operator +- `i += v`: which is the equivalent of `i = i + v` +- `i -= v`: which is the equivalent of `i = i - v` +- `i *= v`: which is the equivalent of `i = i * v` +- `i /= v`: which is the equivalent of `i = i / v` +- `i += v`: which is the equivalent of `i = i + v` + +For `strings`, `arrays` and `dictionaries`, the `+=` sign operator is permissible. Example: +``` +list1 += list2 // this is equivalent to list1 = list1 + list2 +``` + +## ARITHMETIC OPERATORS + +Nuru supports the following arithmetic operators: + +- `+`: Additon +- `-`: Subtraction +- `*`: Multiplication +- `/`: Division +- `%`: Modulo (ie the remainder of a division) +- `**`: Exponential power (eg: `2**3 = 8`) + +## COMPARISON OPERATORS + +Nuru supports the following comparison operators: + +- `==`: Equal to +- `!=`: Not equal to +- `>`: Greater than +- `>=`: Greater than or equal to +- `<`: Less than +- `<=`: Less than or equal to + +## MEMBER OPERATOR + +The member operator in Nuru is `ktk`. It will check if an object exists in another object: +```go +fanya majina = ['juma', 'asha', 'haruna'] + +"haruna" ktk majina // kweli +"halima" ktk majina // sikweli +``` + +## LOGIC OPERATORS + +Nuru supports the following logic operators: + +- `&&`: Logical `AND`. It will evaluate to true if both are true, otherwise it will evaluate to false. +- `||`: Logical `OR`. It will evaluate to false if both are false, otherwise it will evaluate to true. +- `!`: Logical `NOT`. It will evaluate to the opposite of a given expression. + +## PRECEDENCE OF OPERATORS + +Operators have the following precedence, starting from the highest priority to the lowest: + +- `()` : Items in paranthesis have the highest priority +- `!`: Negation +- `%`: Modulo +- `**`: Exponential power +- `/, *`: Division and Multiplication +- `+, +=, -, -=`: Addition and Subtraction +- `>, >=, <, <=`: Comparison operators +- `==, !=`: Equal or Not Equal to +- `=`: Assignment Operator +- `ktk`: Member Operator +- `&&, ||`: Logical AND and OR + +Understanding operators in Nuru allows you to create complex expressions, perform calculations, and make decisions based on the values of variables. diff --git a/repl/docs/en/strings.md b/repl/docs/en/strings.md new file mode 100644 index 0000000..4132953 --- /dev/null +++ b/repl/docs/en/strings.md @@ -0,0 +1,148 @@ +# Strings in Nuru + +Strings are a sequence of characters that can represent text in the Nuru programming language. This page covers the basics of strings, their manipulation, and some built-in methods. + +## Basic Syntax + +Strings can be enclosed in either single quotes '' or double quotes "": + +```s +andika("mambo") // mambo + +fanya a = 'niaje' + +andika("mambo", a) // mambo niaje +``` + +## Concatenating Strings + +Strings can be concatenated using the + operator: + +```s +fanya a = "habari" + " " + "yako" + +andika(a) // habari yako + +fanya b = "habari" + +b += " yako" + +// habari yako +``` + +You can also repeat a string n number of times using the * operator: + +```s +andika("mambo " * 4) + +// mambo mambo mambo mambo + +fanya a = "habari" + +a *= 4 + +// habarihabarihabarihabari +``` + +## Looping over a String + +You can loop through a string using the kwa keyword: + +```s +fanya jina = "avicenna" + +kwa i ktk jina {andika(i)} +``` +Output +```s +a +v +i +c +e +n +n +a +``` + +And for key-value pairs: + +```s +kwa i, v ktk jina { + andika(i, "=>", v) +} +``` +Output +```s +0 => a +1 => v +2 => i +3 => c +4 => e +5 => n +6 => n +7 => a +``` + +## Comparing Strings + +You can compare two strings using the == operator: + +```s +fanya a = "nuru" + +andika(a == "nuru") // kweli + +andika(a == "mambo") // sikweli +``` + +## String Methods + +### idadi() + +You can find the length of a string using the idadi method. It does not accept any parameters. + +```s +fanya a = "mambo" +a.idadi() // 5 +``` + +### herufikubwa() + +This method converts a string to uppercase. It does not accept any parameters. + +```s +fanya a = "nuru" +a.herufikubwa() // NURU +``` + +### herufindogo + +This method converts a string to lowercase. It does not accept any parameters. + +```s +fanya a = "NURU" +a.herufindogo() // nuru +``` + +### gawa + +The gawa method splits a string into an array based on a specified delimiter. If no argument is provided, it will split the string according to whitespace. + +Example without a parameter: + +```s +fanya a = "nuru mambo habari" +fanya b = a.gawa() +andika(b) // ["nuru", "mambo", "habari"] +``` + +Example with a parameter: + +```s +fanya a = "nuru,mambo,habari" +fanya b = a.gawa(",") +andika(b) // ["nuru", "mambo", "habari"] +``` + +By understanding strings and their manipulation in Nuru, you can effectively work with text data in your programs. \ No newline at end of file diff --git a/repl/docs/en/switch.md b/repl/docs/en/switch.md new file mode 100644 index 0000000..6286429 --- /dev/null +++ b/repl/docs/en/switch.md @@ -0,0 +1,59 @@ +# Switch Statements in Nuru + +Switch statements in Nuru allow you to execute different code blocks based on the value of a given expression. This page covers the basics of switch statements and their usage. + +## Basic Syntax + +You initialize a switch statement with the badili keyword, the expression inside parentheses (), and all cases enclosed within curly braces {}. + +A case statement has the keyword ikiwa followed by a value to check. Multiple values can be in a single case separated by commas ,. The consequence to execute if a condition is fulfilled must be inside curly braces {}. Here's an example: + +```s +fanya a = 2 + +badili (a){ + ikiwa 3 { + andika("a ni tatu") + } + ikiwa 2 { + andika ("a ni mbili") + } +} +``` + +## Multiple Values in a Case + +Multiple possibilities can be assigned to a single case (ikiwa) statement: + +```s +badili (a) { + ikiwa 1,2,3 { + andika("a ni kati ya 1, 2 au 3") + } + ikiwa 4 { + andika("a ni 4") + } +} +``` + +## Default Case (kawaida) + +The default statement will be executed when no condition is satisfied. The default statement is represented by kawaida: + +```s +fanya z = 20 + +badili(z) { + ikiwa 10 { + andika("kumi") + } + ikiwa 30 { + andika("thelathini") + } + kawaida { + andika("ishirini") + } +} +``` + +By understanding switch statements in Nuru, you can create more efficient and organized code that can handle multiple conditions easily. \ No newline at end of file diff --git a/repl/docs/en/while.md b/repl/docs/en/while.md new file mode 100644 index 0000000..45972c0 --- /dev/null +++ b/repl/docs/en/while.md @@ -0,0 +1,74 @@ +# WHILE (WAKATI) + +While loops in Nuru are used to execute a block of code repeatedly, as long as a given condition is true. This page covers the basics of while loops, including how to use the break and continue keywords within them. + +## Basic Syntax + +A while loop is executed when a specified condition is true. You initiliaze a while loop with the `wakati` keyword followed by the condition in paranthesis `()`. The consequence of the loop should be enclosed in brackets `{}`: +```s +fanya i = 1 + +wakati (i <= 5) { + andika(i) + i++ +} +``` +Output +```s +1 +2 +3 +4 +5 +``` + +## Break (vunja) and Continue (endelea) +### Break (Vunja) + +Use the vunja keyword to terminate a loop: + +```s +fanya i = 1 + +wakati (i < 5) { + kama (i == 3) { + andika("nimevunja") + vunja + } + andika(i) + i++ +} +``` +Output +```s +1 +2 +nimevunja +``` + +### Continue (Endelea) + +Use the endelea keyword to skip a specific iteration: + +```s +fanya i = 0 + +wakati (i < 5) { + i++ + kama (i == 3) { + andika("nimeruka") + endelea + } + andika(i) +} +``` +Output +```s +1 +2 +nimeruka +4 +5 +``` + +By understanding while loops in Nuru, you can create code that repeats a specific action or checks for certain conditions, offering more flexibility and control over your code execution. \ No newline at end of file diff --git a/repl/docs/sw/README.md b/repl/docs/sw/README.md new file mode 100644 index 0000000..698fdad --- /dev/null +++ b/repl/docs/sw/README.md @@ -0,0 +1 @@ +# NURU PROGRAMMING LANGUAGE DOCUMENTATION \ No newline at end of file diff --git a/repl/docs/sw/arrays.md b/repl/docs/sw/arrays.md new file mode 100644 index 0000000..bbc6434 --- /dev/null +++ b/repl/docs/sw/arrays.md @@ -0,0 +1 @@ +# Orodha (Arrays) \ No newline at end of file diff --git a/repl/docs/sw/bools.md b/repl/docs/sw/bools.md new file mode 100644 index 0000000..16f7a44 --- /dev/null +++ b/repl/docs/sw/bools.md @@ -0,0 +1 @@ +# Kweli/Sikweli (Bools) diff --git a/repl/docs/sw/builtins.md b/repl/docs/sw/builtins.md new file mode 100644 index 0000000..f807886 --- /dev/null +++ b/repl/docs/sw/builtins.md @@ -0,0 +1 @@ +# Builtins \ No newline at end of file diff --git a/repl/docs/sw/comments.md b/repl/docs/sw/comments.md new file mode 100644 index 0000000..2a30807 --- /dev/null +++ b/repl/docs/sw/comments.md @@ -0,0 +1 @@ +# Maelezo (Comments) \ No newline at end of file diff --git a/repl/docs/sw/dictionaries.md b/repl/docs/sw/dictionaries.md new file mode 100644 index 0000000..469ad6d --- /dev/null +++ b/repl/docs/sw/dictionaries.md @@ -0,0 +1 @@ +# Kamusi (Dictionaries) \ No newline at end of file diff --git a/repl/docs/sw/for.md b/repl/docs/sw/for.md new file mode 100644 index 0000000..52b9109 --- /dev/null +++ b/repl/docs/sw/for.md @@ -0,0 +1 @@ +# Kwa (For) \ No newline at end of file diff --git a/repl/docs/sw/functions.md b/repl/docs/sw/functions.md new file mode 100644 index 0000000..ed2c3d8 --- /dev/null +++ b/repl/docs/sw/functions.md @@ -0,0 +1 @@ +# Undo (Functions) \ No newline at end of file diff --git a/repl/docs/sw/identifiers.md b/repl/docs/sw/identifiers.md new file mode 100644 index 0000000..d89ef81 --- /dev/null +++ b/repl/docs/sw/identifiers.md @@ -0,0 +1 @@ +# Tambulishi (Identifiers) \ No newline at end of file diff --git a/repl/docs/sw/if.md b/repl/docs/sw/if.md new file mode 100644 index 0000000..a364c61 --- /dev/null +++ b/repl/docs/sw/if.md @@ -0,0 +1 @@ +# Kama/Sivyo (If/Else) \ No newline at end of file diff --git a/repl/docs/sw/keywords.md b/repl/docs/sw/keywords.md new file mode 100644 index 0000000..5160a95 --- /dev/null +++ b/repl/docs/sw/keywords.md @@ -0,0 +1 @@ +# Maneno Muhimu (Keywords) \ No newline at end of file diff --git a/repl/docs/sw/null.md b/repl/docs/sw/null.md new file mode 100644 index 0000000..628c65e --- /dev/null +++ b/repl/docs/sw/null.md @@ -0,0 +1 @@ +# Tupu (Null) \ No newline at end of file diff --git a/repl/docs/sw/numbers.md b/repl/docs/sw/numbers.md new file mode 100644 index 0000000..dd4ec8b --- /dev/null +++ b/repl/docs/sw/numbers.md @@ -0,0 +1 @@ +# Namba na Desimali (Ints/Floats) \ No newline at end of file diff --git a/repl/docs/sw/operators.md b/repl/docs/sw/operators.md new file mode 100644 index 0000000..cf38456 --- /dev/null +++ b/repl/docs/sw/operators.md @@ -0,0 +1 @@ +# Matendaji (Operators) \ No newline at end of file diff --git a/repl/docs/sw/strings.md b/repl/docs/sw/strings.md new file mode 100644 index 0000000..0185efb --- /dev/null +++ b/repl/docs/sw/strings.md @@ -0,0 +1 @@ +# Neno (Strings) \ No newline at end of file diff --git a/repl/docs/sw/switch.md b/repl/docs/sw/switch.md new file mode 100644 index 0000000..ec1fc19 --- /dev/null +++ b/repl/docs/sw/switch.md @@ -0,0 +1 @@ +# Badili (Switch) \ No newline at end of file diff --git a/repl/docs/sw/while.md b/repl/docs/sw/while.md new file mode 100644 index 0000000..e022883 --- /dev/null +++ b/repl/docs/sw/while.md @@ -0,0 +1 @@ +# Wakati (While) \ No newline at end of file From 42cb79b664399013297d7194cedbcc54003cbd04 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:42:14 +0300 Subject: [PATCH 168/362] update dependencies --- go.mod | 35 ++++++++++++++++++++++ go.sum | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 go.sum diff --git a/go.mod b/go.mod index 352462e..7391844 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,38 @@ module github.com/AvicennaJr/Nuru go 1.18 + +require ( + github.com/charmbracelet/bubbles v0.15.0 + github.com/charmbracelet/bubbletea v0.23.2 + github.com/charmbracelet/glamour v0.6.0 + github.com/charmbracelet/lipgloss v0.7.1 +) + +require ( + github.com/alecthomas/chroma v0.10.0 // indirect + github.com/atotto/clipboard v0.1.4 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/aymerick/douceur v0.2.0 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/dlclark/regexp2 v1.4.0 // indirect + github.com/gorilla/css v1.0.0 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-localereader v0.0.1 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/microcosm-cc/bluemonday v1.0.21 // indirect + github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/muesli/reflow v0.3.0 // indirect + github.com/muesli/termenv v0.15.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/rivo/uniseg v0.2.0 // indirect + github.com/yuin/goldmark v1.5.2 // indirect + github.com/yuin/goldmark-emoji v1.0.1 // indirect + golang.org/x/net v0.0.0-20221002022538-bcab6841153b // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..8943fce --- /dev/null +++ b/go.sum @@ -0,0 +1,95 @@ +github.com/alecthomas/chroma v0.10.0 h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek= +github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= +github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= +github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= +github.com/aymanbagabas/go-osc52 v1.0.3/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52 v1.2.1/go.mod h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/charmbracelet/bubbles v0.15.0 h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI= +github.com/charmbracelet/bubbles v0.15.0/go.mod h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74= +github.com/charmbracelet/bubbletea v0.23.1/go.mod h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU= +github.com/charmbracelet/bubbletea v0.23.2 h1:vuUJ9HJ7b/COy4I30e8xDVQ+VRDUEFykIjryPfgsdps= +github.com/charmbracelet/bubbletea v0.23.2/go.mod h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM= +github.com/charmbracelet/glamour v0.6.0 h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc= +github.com/charmbracelet/glamour v0.6.0/go.mod h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc= +github.com/charmbracelet/harmonica v0.2.0/go.mod h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao= +github.com/charmbracelet/lipgloss v0.6.0/go.mod h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk= +github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E= +github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= +github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= +github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= +github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= +github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= +github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s= +github.com/muesli/reflow v0.3.0/go.mod h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8= +github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs= +github.com/muesli/termenv v0.13.0/go.mod h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc= +github.com/muesli/termenv v0.14.0/go.mod h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8= +github.com/muesli/termenv v0.15.1 h1:UzuTb/+hhlBugQz28rpzey4ZuKcZ03MeKsoG7IJZIxs= +github.com/muesli/termenv v0.15.1/go.mod h1:HeAQPTzpfs016yGtA4g00CsdYnVLJvxsS4ANqrZs2sQ= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.5.2 h1:ALmeCk/px5FSm1MAcFBAsVKZjDuMVj8Tm7FFIlMJnqU= +github.com/yuin/goldmark v1.5.2/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark-emoji v1.0.1 h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os= +github.com/yuin/goldmark-emoji v1.0.1/go.mod h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b h1:6e93nYa3hNqAvLr0pD4PN1fFS+gKzp2zAXqrnTCstqU= +golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 93f4b7f4d94d2807522df048ff143c8e143d6dde Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:43:20 +0300 Subject: [PATCH 169/362] better tests --- Makefile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 8b9dab1..cea847f 100644 --- a/Makefile +++ b/Makefile @@ -33,11 +33,7 @@ build_test: mv test testbinaries/ test: - go test -v ./parser/ - go test -v ./ast/ - go test -v ./evaluator/ - go test -v ./object/ - go test -v ./lexer/ + ./gotest --format testname ./lexer/ ./parser/ ./ast/ ./object/ ./evaluator/ clean: go clean From 1b22689ee2aa929a8bcbf0aa276f9881fb9a45a2 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:51:53 +0300 Subject: [PATCH 170/362] better tests formatting --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index cea847f..05bf6d3 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,16 @@ build_test: mv test testbinaries/ test: - ./gotest --format testname ./lexer/ ./parser/ ./ast/ ./object/ ./evaluator/ + @echo -e '\nTesting Lexer...' + @./gotest --format testname ./lexer/ + @echo -e '\nTesting Parser...' + @./gotest --format testname ./parser/ + @echo -e '\nTesting AST...' + @./gotest --format testname ./ast/ + @echo -e '\nTesting Object...' + @./gotest --format testname ./object/ + @echo -e '\nTesting Evaluator...' + @./gotest --format testname ./evaluator/ clean: go clean From 0e77096421877166f2fb7fdb5d9e40f5eeafc9a6 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 16:53:53 +0300 Subject: [PATCH 171/362] add ability to shrink binary size --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 05bf6d3..3182aba 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,8 @@ VERSION=0.3.0 build_linux: @echo 'building linux binary...' env GOOS=linux GOARCH=amd64 go build -o nuru + @echo 'shrinking binary...' + ./upx --brute nuru @echo 'zipping build....' tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru @echo 'cleaning up...' @@ -15,6 +17,8 @@ build_windows: build_mac: @echo 'building mac binary...' env GOOS=darwin GOARCH=amd64 go build -o nuru + @echo 'shrinking binary...' + ./upx --brute nuru @echo 'zipping build...' tar -zcvf nuru_mac_amd64_v${VERSION}.tar.gz nuru @echo 'cleaning up...' @@ -23,6 +27,8 @@ build_mac: build_android: @echo 'building android binary' env GOOS=android GOARCH=arm64 go build -o nuru + @echo 'shrinking binary...' + ./upx --brute nuru @echo 'zipping build...' tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru @echo 'cleaning up...' From 3eb5698c0ee304ca576f2b96ef4ea9878b58d479 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Thu, 6 Apr 2023 17:13:22 +0300 Subject: [PATCH 172/362] add more compression --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 3182aba..eb038ad 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ VERSION=0.3.0 build_linux: @echo 'building linux binary...' - env GOOS=linux GOARCH=amd64 go build -o nuru + env GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o nuru @echo 'shrinking binary...' ./upx --brute nuru @echo 'zipping build....' @@ -16,7 +16,7 @@ build_windows: build_mac: @echo 'building mac binary...' - env GOOS=darwin GOARCH=amd64 go build -o nuru + env GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w" -o nuru @echo 'shrinking binary...' ./upx --brute nuru @echo 'zipping build...' @@ -26,7 +26,7 @@ build_mac: build_android: @echo 'building android binary' - env GOOS=android GOARCH=arm64 go build -o nuru + env GOOS=android GOARCH=arm64 go build -ldflags="-s -w" -o nuru @echo 'shrinking binary...' ./upx --brute nuru @echo 'zipping build...' @@ -35,7 +35,7 @@ build_android: rm nuru build_test: - go build -o test + go build -ldflags="-s -w" -o test mv test testbinaries/ test: From f25e94dc2a243ad1845b016d25b2f4a384f1a542 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:23:26 +0300 Subject: [PATCH 173/362] update makefile --- Makefile | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index eb038ad..dcf67fc 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=0.3.0 +VERSION=0.3.0-dev build_linux: @echo 'building linux binary...' @@ -12,7 +12,9 @@ build_linux: build_windows: @echo 'building windows executable...' - env GOOS=windows GOARCH=amd64 go build -o nuru_windows_amd64_v${VERSION}.exe + env GOOS=windows GOARCH=amd64 go build -ldflags="-s -w" -o nuru_windows_amd64_v${VERSION}.exe + @echo 'zipping build...' + ./upx --brute nuru_windows_amd64_v${VERSION}.exe build_mac: @echo 'building mac binary...' @@ -27,16 +29,13 @@ build_mac: build_android: @echo 'building android binary' env GOOS=android GOARCH=arm64 go build -ldflags="-s -w" -o nuru - @echo 'shrinking binary...' - ./upx --brute nuru @echo 'zipping build...' tar -zcvf nuru_linux_amd64_v${VERSION}.tar.gz nuru @echo 'cleaning up...' rm nuru build_test: - go build -ldflags="-s -w" -o test - mv test testbinaries/ + go build -ldflags="-s -w" -o nuru test: @echo -e '\nTesting Lexer...' From 34ecf71902545edb92f1a6abec960bb9792993a5 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:23:55 +0300 Subject: [PATCH 174/362] update dependencies --- go.mod | 14 ++++++++------ go.sum | 22 ++++++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 7391844..0e16c66 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ require ( github.com/charmbracelet/bubbletea v0.23.2 github.com/charmbracelet/glamour v0.6.0 github.com/charmbracelet/lipgloss v0.7.1 + github.com/lrstanley/bubblezone v0.0.0-20230303230241-08f906ff62a9 ) require ( @@ -18,21 +19,22 @@ require ( github.com/dlclark/regexp2 v1.4.0 // indirect github.com/gorilla/css v1.0.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect github.com/microcosm-cc/bluemonday v1.0.21 // indirect - github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b // indirect + github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect github.com/muesli/cancelreader v0.2.2 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.15.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/rivo/uniseg v0.2.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/sahilm/fuzzy v0.1.0 // indirect github.com/yuin/goldmark v1.5.2 // indirect github.com/yuin/goldmark-emoji v1.0.1 // indirect golang.org/x/net v0.0.0-20221002022538-bcab6841153b // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.7.0 // indirect + golang.org/x/term v0.7.0 // indirect + golang.org/x/text v0.9.0 // indirect ) diff --git a/go.sum b/go.sum index 8943fce..32ba547 100644 --- a/go.sum +++ b/go.sum @@ -28,13 +28,17 @@ github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lrstanley/bubblezone v0.0.0-20230303230241-08f906ff62a9 h1:w7W7F0EBRNTRRy+MFNLGrhJLn2Ldzl8Ms2AtHtgFtuw= +github.com/lrstanley/bubblezone v0.0.0-20230303230241-08f906ff62a9/go.mod h1:v5lEwWaguF1o2MW/ucO0ZIA/IZymdBYJJ+2cMRLE7LU= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= +github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4= github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -45,8 +49,9 @@ github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWV github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= -github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= +github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= github.com/muesli/reflow v0.2.1-0.20210115123740-9e1d0d53df68/go.mod h1:Xk+z4oIWdQqJzsxyjgl3P22oYZnHdZ8FFTHAQQt5BMQ= @@ -62,8 +67,10 @@ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI= github.com/sahilm/fuzzy v0.1.0/go.mod h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= @@ -83,12 +90,15 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220204135822-1c1b9b1eba6a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= From ed7889016a2e6237b91c07266244e2b51b9825b2 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:24:39 +0300 Subject: [PATCH 175/362] add tutorial flags --- main.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 4a6941a..0431096 100644 --- a/main.go +++ b/main.go @@ -42,6 +42,9 @@ func main() { case "version", "-version", "--version", "-v", "v": fmt.Println(coloredLogo) os.Exit(0) + case "--tutorial", "--docs", "--mafunzo": + repl.Tutor() + os.Exit(0) } file := args[1] @@ -49,7 +52,7 @@ func main() { if strings.HasSuffix(file, "nr") || strings.HasSuffix(file, ".sw") { contents, err := ioutil.ReadFile(file) if err != nil { - fmt.Printf("\x1b[%dm%s%s\x1b[0m\n", 31, "Error: Nimeshindwa kusoma file: ", args[0]) + fmt.Printf("\x1b[%dm%s%s\x1b[0m\n", 31, "Error: Nimeshindwa kusoma file: ", args[1]) os.Exit(0) } From 96ba65efbe70bae2eee4ff08ef1373784a2fe780 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:25:01 +0300 Subject: [PATCH 176/362] add sw comments docs --- repl/docs/sw/comments.md | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/repl/docs/sw/comments.md b/repl/docs/sw/comments.md index 2a30807..a0ca683 100644 --- a/repl/docs/sw/comments.md +++ b/repl/docs/sw/comments.md @@ -1 +1,29 @@ -# Maelezo (Comments) \ No newline at end of file +# Maoni Katika Nuru + +Katika Nuru, unaweza kuandika maoni kutoa maelezo na hati kwa kazi yako. Maoni ni mistari ya maandishi ambayo hupuuzwa na mfasiri (interpreter) wa Nuru, kwa hivyo haitaathiri tabia ya programu yako. Kuna aina mbili za maoni katika Nuru: maoni ya mstari mmoja na maoni ya mistari mingi. + +## Maoni ya Mstari Mmoja + +Maoni ya mstari mmoja yanatumiwa kutoa maelezo mafupi au hati kwa mstari mmoja wa kazi. Kuandika maoni ya mstari mmoja katika Nuru, tumia mikwaju miwili ya mbele (//) ikifuatiwa na maandishi ya maoni yako. Hapa kuna mfano: + +```s +// Mstari huu utapuuzwa na mfasiri wa Nuru +``` + +Katika mfano huu, maandishi ya maoni "Mstari huu utapuuzwa na mfasiri wa Nuru" yatapuuzwa na mfasiri, kwa hivyo haitaathiri tabia ya programu. + +## Maoni ya Mistari Mingi + +Maoni ya mistari mingi yanatumiwa kutoa maelezo ya kina zaidi au hati kwa mistari mingi ya programu yako. Kuandika maoni ya mistari mingi katika Nuru, tumia ukwaju wa mbele ikifuatiwa na nyota ( /* ) kuanza maoni, na nyota ikifuatiwa na ukwaju wa mbele ( */ ) kumaliza maoni. Hapa kuna mfano: + +```s +/ +Mistari hii +Ita +puuzwa +/ +``` + +Katika mfano huu, mistari yote kati ya alama /* na */ itapuuzwa na mfasiri wa Nuru, kwa hivyo haitaathiri tabia ya programu. + +Kwa kutumia maoni ya mstari mmoja na maoni ya mistari mingi katika Nuru, unaweza kufanya kazi yako iwe rahisi kusoma na kudumisha kwa ajili yako na wengine ambao watahitaji kufanya kazi na programu yako katika siku zijazo. From ad8ae7eeb7aa7a4768bb51f3ab2e2df9d8690da0 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:25:34 +0300 Subject: [PATCH 177/362] add Tutor() function --- repl/repl.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/repl/repl.go b/repl/repl.go index 9700152..827d916 100644 --- a/repl/repl.go +++ b/repl/repl.go @@ -2,8 +2,10 @@ package repl import ( "bufio" + "embed" "fmt" "io" + "log" "os" "strings" @@ -11,6 +13,9 @@ import ( "github.com/AvicennaJr/Nuru/lexer" "github.com/AvicennaJr/Nuru/object" "github.com/AvicennaJr/Nuru/parser" + "github.com/charmbracelet/bubbles/list" + tea "github.com/charmbracelet/bubbletea" + zone "github.com/lrstanley/bubblezone" ) const PROMPT = ">>> " @@ -40,6 +45,9 @@ const ERROR_FACE = ` ` +//go:embed docs +var res embed.FS + func Read(contents string) { env := object.NewEnvironment() @@ -102,6 +110,31 @@ func Start(in io.Reader, out io.Writer) { } } +func Tutor() { + zone.NewGlobal() + + languageChoice := []list.Item{ + languages{title: "Kiswahili", desc: "Soma nyaraka kwa Kiswahili", dir: "sw"}, + languages{title: "English", desc: "Read documentation in English", dir: "en"}, + } + + var p playground + + p.languageCursor = list.New(languageChoice, list.NewDefaultDelegate(), 50, 8) + p.languageCursor.Title = "Chagua Lugha" + p.languageCursor.SetFilteringEnabled(false) + p.languageCursor.SetShowStatusBar(false) + p.languageCursor.SetShowPagination(false) + p.languageCursor.SetShowHelp(false) + p.toc = list.New(englishItems, list.NewDefaultDelegate(), 0, 0) + p.toc.Title = "Table of Contents" + p.id = zone.NewPrefix() + + if _, err := tea.NewProgram(p, tea.WithMouseAllMotion()).Run(); err != nil { + log.Fatal(err) + } +} + func printParseErrors(out io.Writer, errors []string) { //io.WriteString(out, colorfy(ERROR_FACE, 31)) io.WriteString(out, "Kuna Errors Zifuatazo:\n") @@ -114,3 +147,28 @@ func printParseErrors(out io.Writer, errors []string) { func colorfy(str string, colorCode int) string { return fmt.Sprintf("\x1b[%dm%s\x1b[0m", colorCode, str) } + +var ( + englishItems = []list.Item{ + item{title: "Arrays", desc: "🚀 Unleash the power of arrays in Nuru", filename: "arrays.md"}, + item{title: "Booleans", desc: "👍👎 Master the world of 'if' and 'else' with bools", filename: "bool.md"}, + item{title: "Builtins", desc: "💡 Reveal the secrets of builtin functions in Nuru", filename: "builtins.md"}, + item{title: "Comments", desc: "💬 Speak your mind with comments in Nuru", filename: "comments.md"}, + item{title: "Dictionaries", desc: "📚 Unlock the knowledge of dictionaries in Nuru", filename: "dictionaries.md"}, + item{title: "For", desc: "🔄 Loop like a pro with 'for' in Nuru", filename: "for.md"}, + item{title: "Function", desc: "🔧 Create powerful functions in Nuru", filename: "function.md"}, + item{title: "Identifiers", desc: "🔖 Give your variables their own identity in Nuru", filename: "identifiers.md"}, + item{title: "If Statements", desc: "🔮 Control the flow with 'if' statements in Nuru", filename: "ifStatements.md"}, + item{title: "Keywords", desc: "🔑 Learn the secret language of Nuru's keywords", filename: "keywords.md"}, + item{title: "Null", desc: "🌌 Embrace the void with Null in Nuru", filename: "null.md"}, + item{title: "Numbers", desc: "🔢 Discover the magic of numbers in Nuru", filename: "numbers.md"}, + item{title: "Operators", desc: "🧙 Perform spells with Nuru's operators", filename: "operators.md"}, + item{title: "Strings", desc: "🎼 Compose stories with strings in Nuru", filename: "strings.md"}, + item{title: "Switch", desc: "🧭 Navigate complex scenarios with 'switch' in Nuru", filename: "switch.md"}, + item{title: "While", desc: "⌛ Learn the art of patience with 'while' loops in Nuru", filename: "while.md"}, + } + + kiswahiliItems = []list.Item{ + item{title: "Maoni Katika Nuru", desc: "💬 Toa mawazo yako na maoni (comments) katika Nuru", filename: "comments.md"}, + } +) From b97ecb1b624d116e8dac4cd72f74885701c3dcd7 Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:26:42 +0300 Subject: [PATCH 178/362] add in built documentation --- repl/tutor.go | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 repl/tutor.go diff --git a/repl/tutor.go b/repl/tutor.go new file mode 100644 index 0000000..95f5a53 --- /dev/null +++ b/repl/tutor.go @@ -0,0 +1,290 @@ +package repl + +import ( + "fmt" + "strings" + + "github.com/AvicennaJr/Nuru/evaluator" + "github.com/AvicennaJr/Nuru/lexer" + "github.com/AvicennaJr/Nuru/object" + "github.com/AvicennaJr/Nuru/parser" + "github.com/charmbracelet/bubbles/key" + "github.com/charmbracelet/bubbles/list" + "github.com/charmbracelet/bubbles/textarea" + "github.com/charmbracelet/bubbles/viewport" + tea "github.com/charmbracelet/bubbletea" + "github.com/charmbracelet/glamour" + "github.com/charmbracelet/lipgloss" + zone "github.com/lrstanley/bubblezone" +) + +var ( + buttonStyle = lipgloss.NewStyle(). + Border(lipgloss.RoundedBorder(), true, false). + Padding(0, 3). + MarginTop(1) + + activeButtonStyle = buttonStyle.Copy(). + Foreground(lipgloss.Color("#FFF7DB")). + Background(lipgloss.Color("62")). + Margin(0, 2). + Underline(true) + + tableOfContentStyle = lipgloss.NewStyle().Margin(1, 2).BorderStyle(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color("62")). + Padding(2) +) + +type item struct { + title, desc, filename string +} + +func (i item) Title() string { return i.title } +func (i item) Description() string { return i.desc } +func (i item) FilterValue() string { return i.title } + +type languages struct { + title, desc, dir string +} + +func (l languages) Title() string { return l.title } +func (l languages) Description() string { return l.desc } +func (l languages) FilterValue() string { return l.title } + +type playground struct { + id string + output viewport.Model + code string + editor textarea.Model + docs viewport.Model + senderStyle lipgloss.Style + ready bool + filename string + content []byte + mybutton string + fileSelected bool + toc list.Model + windowWidth int + windowHeight int + docRenderer *glamour.TermRenderer + language string + languageCursor list.Model +} + +func (pg playground) Init() tea.Cmd { + return textarea.Blink +} + +func (pg playground) Update(msg tea.Msg) (tea.Model, tea.Cmd) { + var ( + edCmd tea.Cmd + opCmd tea.Cmd + docCmd tea.Cmd + tocCmd tea.Cmd + ) + + pg.editor, edCmd = pg.editor.Update(msg) + pg.output, opCmd = pg.output.Update(msg) + pg.languageCursor, _ = pg.languageCursor.Update(msg) + if pg.fileSelected != true { + pg.toc, tocCmd = pg.toc.Update(msg) + } + + switch msg := msg.(type) { + case tea.KeyMsg: + switch msg.Type { + case tea.KeyCtrlC: + fmt.Println(pg.editor.Value()) + return pg, tea.Quit + case tea.KeyEnter: + if pg.language == "" { + i, ok := pg.languageCursor.SelectedItem().(languages) + if ok { + pg.language = i.dir + if pg.language == "en" { + pg.toc = list.New(englishItems, list.NewDefaultDelegate(), pg.windowWidth/2-4, pg.windowHeight-8) + pg.toc.Title = "Table of Contents" + } else { + pg.toc = list.New(kiswahiliItems, list.NewDefaultDelegate(), pg.windowWidth/2-4, pg.windowHeight-8) + pg.toc.Title = "Yaliyomo" + } + return pg, tea.EnterAltScreen + } + } + i, ok := pg.toc.SelectedItem().(item) + if ok { + pg.filename = i.filename + content, err := res.ReadFile("docs/" + pg.language + "/" + pg.filename) + pg.content = content + str, err := pg.docRenderer.Render(string(pg.content)) + if err != nil { + panic(err) + } + + pg.docs.SetContent(str + "\n\n\n\n\n\n") + + if err != nil { + panic(err) + } + pg.fileSelected = true + pg.editor.Focus() + } + case tea.KeyEsc: + if pg.fileSelected { + pg.fileSelected = false + pg.editor.Blur() + } + } + + case tea.MouseMsg: + if zone.Get(pg.id + "docs").InBounds(msg) { + pg.docs, docCmd = pg.docs.Update(msg) + + } + switch msg.Type { + case tea.MouseLeft: + if zone.Get(pg.id + "run").InBounds(msg) { + pg.code = pg.editor.Value() + env := object.NewEnvironment() + l := lexer.New(pg.code) + p := parser.New(l) + program := p.ParseProgram() + if len(p.Errors()) != 0 { + pg.output.SetContent(strings.Join(p.Errors(), "\n")) + } else { + evaluated := evaluator.Eval(program, env) + if evaluated != nil { + if evaluated.Type() != object.NULL_OBJ { + pg.output.SetContent(evaluated.Inspect()) + pg.editor.Reset() + pg.output.GotoTop() + } + } + } + + } + } + case tea.WindowSizeMsg: + if !pg.ready { + // editor code + pg.editor = textarea.New() + if pg.language == "en" { + pg.editor.Placeholder = "Write Nuru code here..." + } else { + pg.editor.Placeholder = "Andika code yako hapa..." + } + + pg.editor.Prompt = "┃ " + pg.editor.SetWidth(msg.Width / 2) + pg.editor.SetHeight((2 * msg.Height / 3) - 4) + + pg.editor.FocusedStyle.CursorLine = lipgloss.NewStyle() + pg.editor.FocusedStyle.Base = lipgloss.NewStyle().PaddingTop(2). + Border(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color("238")) + + pg.editor.ShowLineNumbers = true + + // output of editor + pg.output = viewport.New(msg.Width/2, msg.Height/3-4) + pg.output.Style = lipgloss.NewStyle().BorderForeground(lipgloss.Color("238")).PaddingLeft(3).Foreground(lipgloss.Color("76")) + var output string + if pg.language == "en" { + + output = "Your code output will be displayed here..." + strings.Repeat(" ", msg.Width-6) + } else { + output = "Matokeo hapa..." + strings.Repeat(" ", msg.Width-6) + } + pg.output.SetContent(output) + + // documentation + pg.docs = viewport.New(msg.Width/2, msg.Height) + pg.docs.KeyMap = viewport.KeyMap{ + Up: key.NewBinding( + key.WithKeys("up"), + ), + Down: key.NewBinding( + key.WithKeys("down"), + ), + } + pg.docs.Style = lipgloss.NewStyle(). + BorderStyle(lipgloss.RoundedBorder()). + BorderForeground(lipgloss.Color("62")). + Padding(2) + + renderer, err := glamour.NewTermRenderer( + glamour.WithAutoStyle(), + glamour.WithWordWrap(msg.Width/2-4), + ) + if err != nil { + panic(err) + } + + pg.docRenderer = renderer + + pg.toc.SetSize(msg.Width, msg.Height-8) + pg.windowWidth = msg.Width + pg.windowHeight = msg.Height + pg.senderStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("5")) + + if pg.language == "en" { + pg.mybutton = activeButtonStyle.Width(msg.Width / 2).Height(1).Align(lipgloss.Center).Render("Run") + } else { + + pg.mybutton = activeButtonStyle.Width(msg.Width / 2).Height(1).Align(lipgloss.Center).Render("Run") + } + pg.ready = true + + } else { + pg.editor.SetHeight((2 * msg.Height / 3) - 4) + pg.editor.SetWidth(msg.Width / 2) + pg.output.Height = msg.Height/3 - 4 + pg.output.Width = msg.Width / 2 + + renderer, err := glamour.NewTermRenderer( + glamour.WithAutoStyle(), + glamour.WithWordWrap(msg.Width/2-4), + ) + if err != nil { + panic(err) + } + + pg.docRenderer = renderer + str, err := pg.docRenderer.Render(string(pg.content)) + if err != nil { + panic(err) + } + pg.docs.Height = msg.Height + pg.docs.Width = msg.Width / 2 + + pg.docs.SetContent(str + "\n\n\n\n\n\n") + if pg.language == "en" { + pg.mybutton = activeButtonStyle.Width(msg.Width / 2).Height(1).Align(lipgloss.Center).Render("Run") + } else { + pg.mybutton = activeButtonStyle.Width(msg.Width / 2).Height(1).Align(lipgloss.Center).Render("Run") + } + pg.toc.SetSize(msg.Width, msg.Height-8) + pg.windowWidth = msg.Width + pg.windowHeight = msg.Height + } + } + + return pg, tea.Batch(edCmd, opCmd, docCmd, tocCmd) +} + +func (pg playground) View() string { + if pg.language == "" { + return lipgloss.NewStyle().PaddingTop(1).Render(pg.languageCursor.View()) + } + if !pg.ready { + return "\n Tunakuandalia....." + } + var docs string + if pg.fileSelected != true { + docs = zone.Mark(pg.id+"toc", tableOfContentStyle.Width(pg.windowWidth/2-4).Render(pg.toc.View())) + } else { + docs = zone.Mark(pg.id+"docs", pg.docs.View()) + } + button := zone.Mark(pg.id+"run", pg.mybutton) + return zone.Scan(lipgloss.JoinHorizontal(lipgloss.Center, docs, lipgloss.JoinVertical(lipgloss.Left, pg.editor.View(), button, pg.output.View()))) +} From 0b07512e4115a0ccebb522eb4dcf32433ef0e5ff Mon Sep 17 00:00:00 2001 From: AvicennaJr Date: Sun, 9 Apr 2023 00:31:36 +0300 Subject: [PATCH 179/362] add dependent binaries --- gotest | Bin 0 -> 4689920 bytes upx | Bin 0 -> 536820 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 gotest create mode 100755 upx diff --git a/gotest b/gotest new file mode 100755 index 0000000000000000000000000000000000000000..38d9384f848a1ac6c2d736c6ec6a792478ec2eae GIT binary patch literal 4689920 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 o&Tyrcv z9^8&E?%B!;e3hTlis*xMIKX{$@V{&+`#GatxAE4Vo{M(f6;JMBVs|&NBr=0~GL#-!KEykMFnp zkSV#kS@z3p`6p)ESoVTyQzL6Sugv4DB_CnTw%j@+sxMUjzrp9 z`req+%p-Fy^+%FT{H;&-d!{~JoHsvM7g=zQng`|vK@V55-$G0`t&X{O9p}lJ1@uRF zSi)>72Mt_#&`AYnb(U|zrBIt%SF;?W%IqEtCNxG}%QKDNw(!IC^k1%5j-XW*@!-^_ z1934Ok+QO_WfR-iX?n7IETRlNS%&2xl+oyWjPPia@X!h&RaA?OVQ3%(0N*;zWeX_c z*0cE3gW9T-!(=EK254JhtA-k~&qD05AI5RmZ@wSmZ~78x(ehh7-M~41a<1)C6y|F4 z)0(GeJQ4mk01qA@cG9riko$sIVG^e9=a!ezCoN*(!tnb#4&*Y|9{Xt&s6i+b1rnKl zA0)@6zEa0@;6QN~25i3%a);@P$zXT7J{E9rISP zx?Kxr=3p~-G4U+j{TDtw2D^~(Tji?!SGj&jE`_>9EV|@1gb?wGM%OO(%M@*rgw#yS z+IN=~YPz+~?0*~~ZQY~9r_b3c&_bn{eYe*&VSapQvEyIKPXceWf4QTN_Mb3-*Kdaj zFd)o>E?4FXdw|QW<~xXb>4uISNoruUN7`tUGK^0)sBCsuQkVD1l?4;!U3r#AaKJ;i z0g@@YXfT5c0a@SnxJ^u@FD%vA z7;XEO&16lVZDuQ$!ue*pmJut+K>(W~xBMIs5=25IM$!-5$?IbG#6RMs#D>B|vMUc_)?diCa$7=I3T-n7Jg<<_2fO=?|FK*hvbKos;d{4zoCI2F?7I z*~eXww#`Ijtfz;9{aJagq;Wl6Nx75d9~#5;6G8Rpma0v8hN}4o$56Lb%@8Z{^CeiL z%^h=%CQF7E+hJytrfTi^XHb`QzT}reD&6pJDqrXp@0M;RWfb3nKI*25NrdcGFhd{& zynH)}VFZ03$hFcN`U7dEws46`Y|$fT1_a(F=!53-o=M~wJnTI_A|SRvaK>-0n1e-3 zzRA^?X|XYlEUcwSxs-T?f)I{Lq=&w0XH{lLA_+9OVd;bd9!sy;e_@#Yly6aJmc;I2_iWTI(hWdZ{b*4u}kClDr7yn1UK;h$aa)EH5WY zJUbb25ML|V!;IL~SRkFeCYQ>3SXl?jN4W>!iv3mBU6U`T%Q&aj{90nD2Gb|C-IfZo zAA{j~#(X_v-n#T8&2hL6T^gC!B`zu0=)Uq{ul}^s{lMg9lWh-<1hxZQF|gTJ14gI$ zeOl)Y80)vKd*D~i^(8+L-FO-%SgowG9|O9F?AD1w_5tUu?YBm_$^AaAQ-$1DK9J$H zIk%?fqnBA|lrN%HLR1gUwki|dJPU^LuD+DZ`g773J9qv^7-CoCaz}&}e@W+$?K-*wpW51vLa6j4a zSNs`=#Om7AR!Y)$z$0h%w zn(Ue4zyL;58~HFs7OX^cdf?l#gUIR*{ojF${K-D2?!IIr2xuE6zTe=QijvF}!@a3wA=jAm^_w_j?@LuugX*>e%0Mh2+=Zi^l8h z^I>1+2ko+gPV3*iHih6ZC*5!(u_vQC6m$O9So&#s?sXmTK;n~MyAcBg8+56kt?X=k zJ{EoTMm9fum|HCarWi??DQZz$FMPv0po+y`wv^BPK;L~H{r_be>w-D|!Nbp9Bf(!L z__1j82L}t%*baU}wqV!H`@H)$12_t!Qa^9+K(&c*t4hvGfxrG(5Z)&67n zD<9##o<06w{A~FDtFn0=uwVSoxAcARFL$b^)c*1Rn$8dCc)L#`Gl6yX^^sei0{fAL z6%=E{>|zVX1;vTX*PzU{xx*t1i|qRqyV#y_MR{?3^u-(d*Qeg7=N9kG*ZL~Y*^z}W zQ3I-DSE=PmWWLR=XWvPvz>PZ_F#HPrXP4a1O~X6Y;0N~T^muFc*Ou+Mmd zr~4L<0SisxasSMceRluMlHFkzWlshXf6OfFDO(usRTbE)_;ZmjAAZa(w(nDCZgbC~ z_D0DPjp|~J>SA|tzkQ^8Kf(}|o?Knh^JuKFJOf-#JIa?K!44dYAhS7Y`n1lMR21ke zERu>Ojxd2r+;7=6*F%dSC`!9CcLVDA|5x;+S09t(ivMsHY}k^vv~lljeiJy}3NQ-Tz?{_7$GBTdIb0uYMh7zRohALT11!#Th`+sUpZ;mW*}CCiy1lkpKl&%=CmWy!!TqlY zzTwt8fXBtr7F)~M6RO5-Bhilg8McWhZahm5-pE5Nbue9AtCG?R|G|TM@@wj0pb*$z z*Y$**TI?=cM}1JII6HBFo$&PejWzo2BymE6IH5tLo=RB#`GR+v_BJ&u4_afkYc1w{ zgmLe`420N6&CBlYLsH{)lK$GsH+M*asK)x#hl%Lj?WDvbwVS9dA?-XZks8Vs>)Ot$ z@CDsR+DsO`z{W2`mNu53Pf#1DhH0Wl+=ZJ%GT4rVAHD84@JFdsxB7kPwKx~=vz{z2U&60IiN(@~ zB{B`%P(`>aE5#aCLlfysOXBlamG;Ae`e+;bKR4faDE_cfbf(Q5S>a|5&Ld$W;I_S~ zW5X`#ydsevbu1oxNX#YjT8W{IBz=%fCK_%(iwc;fKiOQlUIgSPqP)QC6 zaszwYCNimG==IF7=Qp2SP@_;3P5vJ}no0F<>ssDxe2xp`SCAwCPG|cWTL>DSR+F4z zuQN)Td6cSZwO@Z6qPvNWCR90xa&1-ZiwJEEArLC|uZx~<_jK8>F3Ps;M-_SfY*7il z;&UwM#$s@6zST_CV1!v%eQHNM+TQpjlh1UiNw-FF^T;bqDdSq=*l4#nttG5h{|3ev0kvHTHv;BWALwU6d8xahq+)A6Buy{XO6AX<0=wZZ#w#>JQ;k)A=1{n*miA5f91Cr225<+3atmrBF_@QpZTgj_}s2P z5awDmO3Z%$GVLR9Wo63>XFF8WK~~vMRoUSe?CbV zp<3OVC_jwF#u4J1(FXA#3b{oW`tBnz$N&+lH8QAuB^D}`sIhTTa{Bn|VW;va6ZMQ! zc!;Gqp?Fxip3=hx>&LHnZ6IhOmO5ka3*HZ`((Bgmw`AWKJgl_m>u;?qiW!n5?F_jc+AwfwGDu6;8OON|*las$c9MmX`LU zZB@Dojo#{;jdgIxpOUr)N>%q$gw_5&cV6%~V^o;mS7S7QNS>pveIEL(4d`Ptu5dLi zP_^r~3y1zi<99{gyZdGS%l-K;cj$%KLTx@)Y@z$po6I{!hhi9|#0|w~U}I84GP|&A zChPfcqUXPu_^(?0S1nC2N&SQW_?+;IB@OmD*6}(nudP+v1m76;F3NOjV2q~L9BU`! zr*BwUmdNy5S)ZwfvXqs&nv`RYjmBU#a)j&4(*I`m36>Q$)~w>Dzr@mCE9D^YrayNP z$M9?Pi!53K{kgCtJA>bQ)WD%NMrv+yj&IMJQ*fun#lRW~2 zpQt`0rm^D*COyU5!6Ht6dwzaAMZpFmCcC=3y zNI*1}t#mhREn^J>|Kcn2{-RD+sy_O1(Z(_jD>hc3az|s|ytb#4uJh91zD-?%pfX)U z^Ie!uZCtMQ-6OA}5j#5wr@rx!@#%}6EgPRcay=86#&@ziQC;Z^O0wmcfGky8e(ztM zV}(}6qp#dpIzIi?EoBqZ(?&@Tx$i-b8D%$E(WKl|0KquIM zxo{{S|NS!L{k4N3Nl4MIVc?X?`&r#k|`Q=6d#CMEO0OLA&(etAi#C2XWL-W z1LZwlOg~NlH=~7{O5vtb7F~q^H@%d;-B};#+Oi@&tz88Z0Rlt9?^{cK;=cS>z5skB zV}JB2x9|z{?*nSctP@DumLWv6jCcOjA~ji5&gHS_gQh`s#ecKMaMIW|)?@HmK7N;Y@WYjPJ}Nn_pk zvGbYo@E@Sv>hIIM-0E)}6H6{vy#-Athz+ZSv5I9Z(fjS|Ay%GyPgqg9@nYdkAuOIU zDq8H`{y#xqKim0Ck%jls4D>@$g!*H@FkT+Q*l5uxx~&a?3_%5i5tL^aJXbCoq+0X2 zNhZBWJHR@@bbZZD*7-bH$Bup7zI-@2{rKPZM}AUo{c#QIzZEx- zbsa82UBD`LTYU&_9kD|Q>@osw{GodqMsWXYm^ZHET|bDby#f`fOwhSA9|s(W>Zc{y zioAaM{*9H6>ao5a(5Ibt(0P^h>1MH0tn(&ym@8EoXz}E-O4hjw8vTLN)dq4b!Dc!Y z0!(=5c4Zf<#p3B^<>tJcev#zU`kEPb?iyL$Lou1K50;J8$8K^~|Av``k#jU5NZI+k zB%(KO=cnn6E(w!2Q><8aobq>9&@Ej)dWZYL&Q7GPw8t!ro33G7Z@W!I>feM3Z3oBKWMBH2eiWq!v2g*|NdJl>C|?o^MKX<)8^2#Q%W z=~NrE=B+>1ME$v6bxD=(2a_)sQ-9w0f3UgnL=nCMpK0~7a%v5*5?1~;Aw6=LLLhP_ zx6ca`o+qJO40pL)-OfiDE?qv>+|51Pk1YHzwee}=JJxBVgbS{>ldb90JmR&923`^! zucsb5p$1^uxa}Zi<-!5cRfNIO7IN3jDNG(G6lxK78`6 z{6XQ~`6a}CFrPmn3(dIeF$R(4m!DaOWEk@R#+^I{r*$_Q+DFTd{7-aDc6_>lTek+?7R$ts zN)O}^7y^%C>0ebMqPXHjS1lC2&lz+&Kk1pqL)oEd$1FblkjGSDf}(LsBu)1JD)oea z>fT?3bldOxmG1W`#q{?_pv;7$IRbDhe5@k?C+jy8{4Urzcc5bM7W^BT62$pNck3dV ziOe3oXQX8q3F%?aA6gBc$17RtxSzez1?kk^z)oGun@xvwywfMSyU&v{BO+&W9KwtA zPoz7R3%EL)J|9a@z(4s+BWm=L*-Xc+L<{X-p_dFB2Q9cxx%u4n3y95*$D1Q`-WB3r71T&QiM-aSeu(n*C zqLcW3Y{fhlV(DhDzFPeCAQb2#8x^=3E%`9fdY-fJWM{j|ojO0k=XS^Z%~C)5J*l$h z+>jtuJ#gP3)!V0+{q^HcH&ay!aR%6ZhWuD&u_25Q(KDlhm(u_Z-gaV=06MrT#>U9} z)fzH7QR3_CXpcDD0{6xy>V$yCoM2*!F+hNP-YZm@2&~_=E%r`1!`kQ|P3);Oy;~a3 zlY(ag+C&KBBM6~xDaItVNg;`xuo?Kbr-oEZy@qF=)4p$c4|F6LJCk(ZEPLEMh$3bQ zRo5ivaMVXjhh=)8e21~)edUf{ZeN;mEPpO5uW8=fuc=>6^39JEQ9qcP$`VmOoSHa} zW#a6n66WZ&G!%_b^Et)*&2&OcF8{4gyE#<|5Q``r^kiMHVLfd;R#2%){e~bs7`*Fy z_ILKOxO|#Gjx2w@Pb9g9N)yPVc=UkCf=7jp^zH35D52GI7w5pI z(Hg44vI>Uz(?`Tpe~+i96J+y3efs7GUzLP|dMxx)zA9Wp88bQ{8dKD1Vc+hQbS8!&a$hSIni0wYQ2;X?pF_@ z8-!Y3gjLZ}V@w0sq_jr{QhD;R#Gg$TIgAA*!F?K^v2r~=@`@yMa@2Gr;?ISNM0&X} zq4OM@!K5M`Po`3%Wr&FTtm9!HJh?+*(7PwOvqA>t-k>}I zDh>a`VqU{qH9*BP1x+K=IpHXt?ARr=xAL_PaH%k1SX+#8=R4B=(lWKN$tx{O>uni~mETAz((4CS*lF@ccj%FN#@3 z!e!QEi_gdV5`Cuw`W`ZQSY#4DXmJr%@_px?g(>eM5$(#6ayOlxnHoc z7%s#<$qn(pY!HaFU@9@lo)I(}1}YolxACBw`E!a%Yi4bHb*?X?vwq4o#TwiVBy0Rl z;#dE$h#TioMRnx+Yh#%}aMSdI);ab?z<|~Gmk;xOwc_AJ#ns3C3#0v_U!C!wcOyR# zG66EXh>-e|dQ?gQvqAY~S4N}-cc=-0Vm{PxZP}m#c1_ZkGT!x%ZupH*FiMFP-tJc3 z&p@F+DwB>A{XdAKzv4tCEVg33cy9mQ;lytv>1Xa%PXjd9uMNnWO4KLW*~r1{V!(}K zLU&=@PbLznXFE5xu!j0bKaXGKXWsVdsQ$l(&BM@z>VV%PEs}HMIbmHEJ{x-<3hkOd zbNSx)fEX&|4&+am6j^X1U*!axOx#VEa2mfvIOk(5x~}QU{}t>M?#(ORfKLO&P;u2~ zt}kSN@}=C~X#(p1l7j!L5h61z7N@3p4i|qlfm2t2YS1yrp?_J|yM;eH8SKO4mu&OXK* zLr|!nCIYVHK}PK9lJ^qJYRnHE?Q12z|9CN;aE68YX5kE*M?Pqspcq#K`2*&2^YTfU z{x3)v^+sLfE}}`oq3+udsavi0y~o7qq1;kR17~AVE8vZFuWTKa{x&fw=fQgaNuU!>{0#2xr@su(+!)x zj}{^|kFO3N8hEhGZP`s46)LBoSimaphsptmk1&dSgQRijQ|OW}D_} z)L*X|@h(zCqbk<;B1^woP9Wmz+7wYYRJDfIG1jBC(i64Pkyc*TZB;jRL;J0#tRW^d zq*c801#R1SBb+L+z`ZTfa+oof7p~pwmx<^DW+OD6Yy#J~h{+t_g!3n_U?MGVkjA`a zNcLxJ{nmr&r|dnp5gZ*zPh$v<$?8csA4Ts^ujX|oac58j=b@z~}B~5p6kg5jVf0ODSV4cqEN43Ks@$($)b!MRg zOD6~di3KJ^K~bH^c>o zgDHQodY`BwH-5DOcR^6EnRq|(t-g9k2-T<{)yghXn>W#>+E+brvL|hCI}rP?0%Wmt zwvn15YUcz4hykbZu@0tGMu_*%+ znW0=n?1v0;M$<$MW(6ZmH4lJ-yQ}jApm_(Yb}~qV`hV8hNo>>NTSe31hfy|7!3}cA$DDz^2h7#PgpD zrgM_E55SjCPxgW2Qm9%(Vd4AW{`~oXeli)}QP+FrcYl&9h5=^_A2?cOOD|UohnnPs z)k2>Ke7?IapAQb#5~Tb3DJC0@bR!Zud_Wd?>w*10yzSfDaq zvV65_iw#HJf>e62w~h+wA8Nziy2#_y)K)ih7+*+l7R)I2r~c+<5C)E)9BR&B6LFW- zgE+sK^^cH3V#57F;g!f|(T$wbYrIZZ+Ui8$L*bFU2Hk)kdYVlOXgh7cwDtI3@gtwN zEugP-74)?;xu?nhy(iK%Hum)Nrf)TV^SW=~T*kqptkE-@PM$xn_^NMDyS%CV%K7sK zee0V|M>fwpXiC$eevf}<+zodfTc8~WK?w%ZG)ZL@cja3>*{v?PXPO)Gy0OQao8caM zR^STxK>U(rTx_$K-rOmaRlAoNYVO4?R{9y0rv3uA3NF$7at!6&QlI*6W5`cGQ4kDV zXT65&)N9wKkC~#83%VGzn)Q1=qMt@Fw%xZSCf`wAy@rWv`aW0;tfHBd_es83$qY8h zM)84}(r5xr-reCIxVKUv=*0nWN>y$vHFBM6Q1jOW&3kr#^K{SLzu-s@2>|s{1k3i$25obu&ez+ti>5-%bv53C+s?x1o!P zb2j^t{Dhft%rrTiY-P{qo`Wat=IvQeX#4~%f)5SP$kI#tv|hBYR&h6f4_Z=Vs8D2w z_fRN<*lanrxIQzlOR?BQA=ED6=ntFozjCV?oe}+N-g}?n%m=C7bdFFHi)9`+mms6v zUCsoyO{(X0k+)m*{Dk89sz|d!O`1P=VZ~`~c|23i2fr$$X@$2>eJKu)%Kp*{_;k@yU5ZCL=8g>Y z<4$8q&)Z=I@zkJ|tUVTHr&;Ns)>KD!GVg-P^L$S$ICSM0Wkb`q=Zvr?=4J64ri1>- zW*^pcm|@{y!@_~WLQ}cPN6huP+?2eI zYV{^lwD(%fFNIDJKkY}S<$`aNOXF(=-`%0V=TFsUD>CfAX=orttbcCXGW+`GLsY~v z685A2F#AD1oT(2_@_|6QS{8G$6PP3>%FARQRmhD^^nEScqWFf9M3|4Q*|;?gKlaZB*N)NIn5_3D)Ze_PKecYkRZwF*GnB2G z7aX1*lH8;E+7sz?P+xnzb6tWVvN%H(Z?tl0eNk*v@Bl{G_Qa>(7 zi?PRvz_Tmc7%KmWELuSxp7u6i>kieqgE(#h2WzkgQJ+xjDA-d71@8||YYZWiGSP@aFAS8g5nhncsyRJs77OQRf z^sB9Ht<~xW;)R+3a#34R`|(CUiZ^&~V=GF_wUXcSHS>ONc9R9|*YEH1*9RVX&+J^z zoO9;PnVB=UavSyJEq-r&kfQD+R0o)jlW0^JyE^Oz z)ov_b#3oZsR<#+9aZ=M(RSdw)rYosqy%m;XZyoP9biHO!k-9uFQn`C(e*>wD(;~(r z5S3V)i#m^S7yilc_E$IgB+V2GpAy=G8d1m%9%iVWD?>WbCTuwW{3t3MEanPv7#bC1)V{J>VMZ4IluO6;OFkqLRJsLu2RX$ASE>dYsq$} z4;OqT4~p#yOdrnX@YK!i+un)9x+2cOUE9`k9{JVxoDn;nSO2Onx{M7L5$gYsmh+|V z%YTLoADN#QN}m?Wt~Orql!fXTw`aBhk@x$E6(KwP_F2_eIw@>fehP2XFuiBb;lLdbn zP71g19LFK?cl(*)^Q-UAeJgl(`wE*bOQYs`?f$O$0E2(yv>OG9(T6Hx7R=f3JY3jR7)`4s;#v+)4qPbJtI(=KwvloYBl*>i zjeTIF8pd#$7lS-l8*<_sw|AD%3usfwW^>k7Oo?+cU4SAIRCB)4z3&e7&XP2!4!hA8 zO#L^1i1J}UllccyV_L4Vgx%vLL<UlY8I%Qw`~H|~!PwdR|@5prH)^q;tYv++Mo_0m`|mk*h{y@sj6g&a2E zP!Kjz-t*y_FSd3uL#1r@#e-FfOh%~zA&mW|qi2%#iZ-$`0&_cvEKO~N@OA{PhY(u* za*NQ&IlrM291d-ktG;QbVFbp#eLii;JJ5QR8bO7Um8-!zBfIpF-DY>+fx>_&?<6bK z9xR4CoE^~6uTU2u0M9*KWhN(Qj-`UMdxDRCdV;57Eq={b|4ov#jhFr#uY#uvg;^T& z#RQ8VC`c@n?k`ie%_H61(cq3-ZK`y}FR0ReN$H+TMT$!hsQ60N>kp|?_YtK8y9SP^ z5HZhW$wGHOtA+|@Vn`C-XI}j z_~Ulik;J7LqsOBJPK`sSS-qK zf_Mp>d!E5!Zdr^U%2>|j74F^Ac#o3QJyxIjYxw+!a#BI#QLB?U(n$r0I4g5*Jg)2t zgNIhq(ibpz$|GMhhUfPE46$uv_dDDkup(o_&AvJ=5BpXSYEt-FsB#c2Cwvu-J^nT45i=K zz!t0Dw+M@tkJRUDiu9;l^t*8}FuY;Hqh+&V)dzO5d4%zm9rlVMbX0KeHt>r-RY^K; zeJ6O^2SPdCJe8zx;*BPM9wFL4|ER4yb2|vHi;pfNiB{q@S#38(-CwrGxKEUAz%}Pw z7W}{*Hc4JU$NZQe@#2>B=QCw7vSvCKAAYv}XB26-e`57Y-r?o7_ayRYaK*@17TjTA zr>yW<`5bzHa(M_Lj!eL~Y=nxCxKa!9HqI)dps zMt|n->Ojt3p|-`wJ_vJXnP3L>w>rItpZcO>C5ruYe%NPLcfk`R{k74 zVw#ibvDiQMbdL*_yPKBr+5X{bA=6`gJlpn8RJA`+mR_N|c%m$(dN{MgRLrgWP%%0% z;*NY?bwa1^9)DH{!cKAkbzmk_YusqFWkS{35 zd9TCXnMo6v#>{Is7;Zhxm#Ri}Umq(Jsfr2b_ipj_Z=3rkM%ePeJfZ_0oR>PBl1u@% zqmIx~A0+s*3b`NK>+sb7nO6!jgKGd}^#Vpy+mXlg@9(7^)8FjfGuVo>^*393G5!&i zGnqC<|2|bZN@U1lWGzayn(tgL?%Nxh+>Uv$66Q>b-NX)${u()rr!Kzgq{bdqo2(he z`<``O?Oju7h*VOmiL<|k zIoGbQ`}We`N&>Z>$Y>v=?m<5ZVbsNVcO1heUC+Q+L!k`@X@hQeajo7_TNNtq8(qiz z%Dr!a6&Qv#%-Rqm3=5o`H0wT9+3P+sD6!~sjKAnJ!dvt?*ev=S;4k_t_&$q1Ea@vb z6j!PW8{CusU}YQJG$K0Ej+nOHLIcoBp*w^Cx0OWhzDk)YskzJ_)$BCG1RB1wM%+&Q zG4K=Y@SK&bP|nv^URJI1@E-%~|;_ip*)nMrmCHs0NNlVw1K+q%qv z{?=4)C}ZdUrg+c1hzL|@II~LSyi0P{r}?@|p5^nhvNN8c%UC&Ug&9pF-$Q@qkEg}p zkZGvyFTU4HnA2bHJ$Ocht^9iS4P;a250PI}TT^BA3&1{2p=Otb%(v8h?GZ71fR;rA z9dAX{%^7lf9{EaT7((JvAY7m#w_JLs!V?+h9I83;ng%JU!Uy`rW$r`RC3{?1X7sCn zHZq?&b|1f~7s+;5b4b2nO-2iw@z+G!ZWis)=F zw$c+bJTv%R3w~kA29>H0^+;thN79kP_*4IY3q{k8R-a$y9fmS@EUl4HRK463R7X!~ z${Oc7&BTtxw%WuhJAS$>C#na+#ylZ2^axop4|o4GvlrIJMj^Z52xF@}JbhjUcb~t( z`9HS(E6QRr5(o{5q53Ci;F6hP@1DU1xpOMesS9;t>+EDqBpLj)8G0z^wlL-w)wH4J z8Frktj#pYb^~U=Ax$F~KSg4@`!|;I-M?{vzWX%}pnBj$ z1)Qi{LHm8W8L5fy3O1eYJegSpuL?As*fPs5ejhopWtJAd4~xxW@w-&h^aifM?q;e5 zm8ldes@UGNiTN~ig8Sp-&aT|nL?>BVFnhezc-V>W2+S^Zp2`%B5~S}xfIT3qItTR# zAGuX;6qr1>97v+3LBS>G2Vy&Frt!Hncuz;?Kn(u<%{aWXXyjU%0en)k$il5U`5{I>u5Ze&a@mq$0V!1FhcLbxx~HDmHZ!Z=_Obml6|VU@^?Hpi6P%L}=^1EMQwY#_}5?u1= zqvRDUMz&I?L#GWQ+&sBKvT4}cI)^zO8-aD`6~8gC4g=OmeW)G&=4B7`t+7ElI6XV~%rdixTNHU|Zze3(oj)SF}zB#BG0d zI(8oJbnH6AIhw1w)^Jak>cEcNxTW6YK?}S6mzr*9)*W<1`w;4Gr+1MqD0lyEd#DxH zdOZ~Kx!#LJBg($`qI#lpfk67fJS06}`cSuRi2-=hY;yGzz+WoS;VOnywE69YvrlpF zw5fjR!**Ld$ffQ~TkLZ!00;=cL;-kL832IgrOhR@pmCU6Z-ETat~&PJ>-?*dE+N<* zY2y}6CQhSXt6zpH{vHD=*H$xUx+hp^7F2pp`>pVJ`Z+lNL%`+s5y^oY|8fQ!sV`zB z>Br`n=bh3SJmnhdNEgL-7Cj|h5j^Yp#0%cl4ef$~iu?v9k4COjGvmQ1cBaeAj&qy- z6D-%kF}D++sIG8pK&#d99;48lUkbW{LEI$o0Sz;etDsu!ie9C(F<&kR zVMFy9g@*u9py_NYP5XMR8ziMvA$eoSqTqbJpKOiUsU0EOewyWeN*>8la<{3l@2FI3+h z_=IJ|J%~A$m=j@A&GEN$DjKV@XWK^YT4zqWeYh3)|Eq{JF_21;ry|(|EB>m&r|B_?NSqQ)?vbFI5mj0*ji;pWVoy4cS zL}t8N@IYfV+Pb61l4i!rvd~niZ!~12)fnK)s2P29*&tcMZu#Se)*BzEA($2agP!p@ z_1&jT)NxaYDgh4nLq2WeD&4U*?xqBBS?l*+e1$vG#vj<=jf`#kdfJOGcL&+{UtCRo zBmBcL0lD`P?;Z$7X58pVM#oVwvRTqD2aFwm&Zi%Y;5m)u#V{t90x8kUQc`{qCv``G zCUm-{?ObN7QlKp>3dG))j)DMA)ti_%-&A6{v5cSfm=1DuI4K%{dyV189xQ`W$YFQF z6kw?ds0>DebUSu9d2DWf!-IGv`FhBys;S_frmC89EH_o_n)qKR>bbWy?QRJ(XJkfA~%fihX$2q=JLsHn7*}y2fV7NV$8JP|jpGTMO6qgs?`^TuwryS>5M}8fIhx zl`b9nU5`KMPjV&4a>>^JQxf3#M>+h-SsF0Lze217m^Ms=vD9e)WYw#|TW?TyI1|z$ z$FKE+*=S5?C2LA0Ip?X;D&3EH=0U!&2t!#jP}NUbneovXxgR}ZIcd9l_5Wh%DJ&hj zV}JKqSLaaod8J5|tbGXPhbY5+QYlU%(*2!{`tbaWhM@f`_CR7YjXcSHV)TPeDjy`) zxZ`@Eh1xS}!KZ@j7FF@0ohX`yTkGLTBhj$rWJ&?4KV@e1WeSk;a1T+3aWcZ-wvxx) z*W$Qi0_Ypt*iJJxfWdBqI^pw`a-s*FTOQjpyo}#e&T+rl)S{jQTi2tag%((%C*1Pu z#rYiFksh3{^1b#kL-*^Hs&5EsY|2x%)hKfcbxrt^o{4b$^m`MY1Tl6$`hzmHD^%_>k-!F6u-!QM4_=;3$TV9(f&B(QG zG=r`?!pAR-w#^{qBj&lNbP6nN_A$aYbP>`IuEOoYjy`jw_(&EbwxX~n8_(>`ETC~W+j zr@!G`^@5Ws-p8q06`XUe0;x_90w{)C&5gFFxitmufBtJH>g3SV@uOz?jUAzvlE;gG zyXtp!(HjnTk^!U8Y^D+t+Wzsf-E1_WV;+tnVUnBrmC;k*{uSCsLo@8t^i}AJ@iH&I zWc#%xnj+Z)4!qw%yp&1Ueayzje&um4qFx5R?|-PhT0X6l*@mATYJoa92o1lk|U zz11)QrCRRpc*x*%;f=tho;d%5wpWoAqHmNfwXl&`S_$hvUaYr1J5>7ez~As0DI~~7 zNioZQG=@Yg2FofZGVngZ(!l@!RmFu2Z|V?@}E}Mkt#X%ZsPY- z{`0!A)A-{)8^8El#2bBnOfG&mt7Dq+Yd&|_l6DLQlMz7j_y;6mQx8?@8M~BP)?KRm+wL!aVd`v| zHY}Jry@yKh>eT(~Z%yRO6Nxmo`I}UO#Fn}**{Gl1Pn3ohs{hMWf3I19FI@l=XJw&J zD@DvRa!tRIk?XKK!e*L%1JI0IhrEKy-HEoK<0SG%sQ>A8_+j^aqTF*3757Tz2QNx6 z@+{g?Fk{0_XhPves0@;v$ACP_0KYrLme)~=$CCj4kX0POO z_hlRV+NH!wl0E&A!R#^O-G_h4XSFTl#)Cacc4vS@mJt8)J6S@UzGQC_Y~}Z5Nkz{6 zalYJMJ_eR^4{XT+|5O!EMh@fV_GF`B8GmMrZ`v2%4W0c)t~K}*ADp)aYShF^X=3B7 z*nIGw6l8?@-DU($zbWOn=NmyA=N6wUvCbB>-;=@}XvESJwClvbQ4biNMjr4Pehd`| z!^e60<7QM7fWM>ho)NcwRQD1$kH0qlm>&~whO>Vao3FM|uc$|%-Ye|8DQCcX6fY=d zhwM!X@B2Td{H@mm-$>yPRLzv{>Cg43Ch+?YNvRRV>%91|#qVjUt|e5s`?4UB(U(V$ zzwN+0omV$SN4(?| z?yT9mJl6EIre6o-0p7|%7hbif<0|g~#zq=&lErvh{ z8j-+}ueAQ((Ga{@qxA zCfdnc$J|1+UoO)Fw09Fe_IiXM%BP!pzyHySFq~j;J(*dOS)-v6_cNR*HkG-)v(&Fg zy9i@2Rz2?8LseS)02La%^@X0y$R*$%L%<^lz;IqA87}%&0ak{p8T}6?e}U*bU5kSB zcF#BVOAa_4g*ljR3Oo2_cQA*g+$m@(5o|GZ;AtHvo!}`G9*?I3kh1}Gx|U$}*XrUs zkh52661#jkTWjR(bt7jhVol2^@(@sxnD$9erAf0>41?miM)c>%tYKz0TV;uLVMT_E*4bB^F4+OiZrS;NEf&sm%VLO1G|Beb=bdeDv7&KC{5`HdX91Zb%S1V;nRK^} zWwS5|aX+F*8+(Z$bp@6lJylrsNicPVkVe3!MuE9l8Iz-#A43iP`sBg};&ll_oB7!~ z&ivHveCyNGlr{dW23x#O@f#jYRxJAU(ep-NiE^*y$s69PxX#R8FT$*L=*99TtH;Z! zdVPAm=vYW@^2{a=yTy4F-o1lM?w!QI(?}JsK4LwCS3M3}atOcmIBfMGJnq9{}y#?^p=q>ST_bp`|;v|ZW|a`YuiimipEuT^YFum^D11WtwEkQ{zT3eWlLjFZ{8 zflb*|(7A7_g8Dg$!CP9n)GhInyOqreEQkR4IIz*Sv>5s9_@_pgnTLoPXccDrKm#VA zA_3w3V1uhl;njuoBEug}uX3x40l@qR(CL_|4^5h6ukvJq{fD-OsamIMdoXo`$xW){ z==oq<8@+0Ew9gzdRgL6P0M;ZO%Cp#kZ1csi?t9fj5N6sk4Hsb(oB4!)+HAe1LR-nM z!`K#(T7W{jk@>OelKDw3aIZNRxZjEF>Y7VSIQR{5%aCbuK;}q|XL$A%N)+TSodu1< z6v*(0je3Sg!xN-(oKv;=`wKL@Y;cks@btD<8AY~^+{UxP_iV-^rDl3e?n%v3YCnJ! ztJLnd(NwSUxotIFUC{FvW%cQUNd{XqoeFU;73%4(IdZQ1%~17fTD&x@e2VrOqNk@P#GO;5jHH~-xFjC;RP@UVa3+0sdvKDeBU7FiAiK%&jo@&uiOa)eGFeWmTk-xl69rA)h8QzxLSC zvQk{q`zjVC_f8M)V!`!5V&A^m0JX<1nXF*!(mswmNfgxjhUPaVn)!Lxof?)~*jQY- zR)U1u>E#tt&&vSrL;tW8w5cR0sE`TSB;=@(rG*z84=1V0S7O=)D^xE8=lz+9pGTN- z%lz|hQdrIz6z`1Ze9Zah?P64c-{|WIozD7O|ID2 zaTZgP$tw&(sy^V~hitOe$|=oTy{fB=D4R)IbsqabGOIy3oQ1KTq$H;?Bk@{P)yztB za*DmbD)HNylH9MEv0YCPPna@;OKpU~iiuS(HQmt4 z{+=;|87>tz_G@#9?ks7m#6jowb-Z&m3pNC(^BRul4&J)FN4klO1`eBu-W#TVe<3+r zIa&+1?<$K44CIIcu zCojcsm4-Wy#Jw4i$wakgGIdumPapNnr1tkYxen=_i%c1A!khc8U{-x2(sZ+vJgdSz zS9d<;s)$T_!~G+bK-@?FywG$~Hv5xT8uo{~@wznPsTtco5P+wUhu$3S9nyxp6!c_M z-oV~@dxzx9*lN#L_AJAi0n`r~{b&)-P*n9sF!kS{#yFcAJukwxi(q^s0nt=(B$^yU z;FySi{!MYuDUJ?wyjq6oAsHyUqK&}H^OD7@-9PIAoh+7*6MM(2NRvK!5`*i_?juS? z#JH^WA+*}*LMBUH_ZzRnmoW-3edch3tM-keqD-;L+SeFLJmbN>{B?eKg831v|5Ar< z3OgSKo2U4B_wQc_%QZfh*pDP1w`AjX{kM<&JNJ2yqRwDXH<*kdF|j1YQr-Rc%JD zlEbh}41PVhWa!ovf#BUMf=l+_x*X5)%C~}ZFJ=_byO#f7h2)c#74ASbHMs$AXH&$C zl+Yy^_2Rch4N6Rinfk-BFZp-~e&_l{Fdz{-&QzT1kB*?uGjvZEWz!D*kN||NQwnfJ$|+v zTm?krgRT*s<5BVkX_A*eU#t?u2H78X>6r=OKdStG!VOsoTk*U9Wl|ZvW`<1wPzL(n zp%^|8=y~V=UrS4VN$7K7;WrxkdrF4P8rRoBy7mJAB``Ip0El>kEzc)sIuKE6{ z^~qr!nnA?B=LtdslD|Bfcv;uPT>4MbuiV#Luv>#mF6!M62bW&-)t2|VI5tDKUs1Tz zDO?p?`aExb1{Vwle5-Tx4koU=u-fHxZ0aKmfX>TfC&j7=VqQm&2W-cdLgDM^m@^rPOuoI0O4+v~abiaZ~9c zj}p%u(}2u+wbEyJMiQxqSw?@X`Ti-4?UysqpMIwFr2}tx8x`KPOFl+1zN6cHv^RV5 z)*G`<*J1AwW{kuqM!w7s_aAb0xX0trJB13|tMD24DPuoA;;-0`50j`JbC2#(sAXKZ zVYuY$hZwwO+|K6?oAUeblJZbe+V(MOx^D|pdt;gxWg%wbc~)r9y9z_BOViV~^q!r( z_+qa8RrH6|oNl{^s?_`@IOkWAnWI@pf6H4(cSgK`B`7#wmjVQroTSas?ZG);=NG;W zSWmEp1#dgk#MYJ;j*bQAoXn5W&juG9kIQhkV`Ja=hBNwahW_~W=HPAGb?u}sF}v>V za(t%$0p#XjyhQ@Qrp(}Nog#e6g{8br8^g;@D}aB^c!2*$Jn*ixNQJiZqgACY#S`Bc z?ASOU{@xiK@Ad8fsY+jG_*dP^xT_j1h7O?Z6Wv2<5KZg)->eFq&1(og7Zvc%x zw{RP!K_Q~@r(GJ``RvSZva7kYh<)R+Y3K2McBZzom-ZPQn>K3nvolYPZ|v8xaeq_( zfc~$=H=WV3sc-+?h6|L-{y56*3Kq=Vk229uzO|fRg>9d8fy&;3kWJ1gygZp?GETnf z&i^i?8#7~``i*xr&t&mpE(DT+t3Br*0skWlD?Nes%QpOJ=@L6;^0vXQ!r=VBkt4CA zqpNTHrFJsJ-#sI~Hnz|yG#l%?Q6y7W2wG4B8II2E$3|WT{rf2ri04@QG;oW8^A~z> z2gG060Nlj$9XtAFfWtIB9NtjW#*8V85e7f<_nC2qaN0lq(q=F3fK1-R%N;xWW&rrX zecBk5XF;-n;oEK3^VSx24*2+{+oB(E#{6jHhh_71__{6lcKs~^yj)JNQZ~$h<2XTi zPB>b~_Fp|C(pl8iF|le)U5RujE|&p>Jl&Vwrg=Td0fz!uljj^3(nQsyV2zA zU?AFOR;VuiS>NUx`4%^o@Wevr@9~y2mB*{sJtv&|MiaBbojB(3PqkV zeW`PpP9tJVe=T&f}yj)UMeq=sFRx~!OYo=wSpoy61#kFlp_ zMci@~`J@k6-Nk}Kl=0{{$;G&tvR5?~%F3eNcnKCHdFqlt)9hho$}F*VXq zpE@&;8gMXckMZjHwk(2ul<%f2jxx=>jKzg%7dS^_&>sbL?S<{DSAlIo)+XHU=D@^h$Rv91R@#iw9*hBs2}pdR`XP`})<1A)d+x*f$v*E6 z_dR^5>nNJ$AiS;Wds(WYzjl9lCQ*!EZ1xeOE(>u#+4Yp4%rm zco0jZ8g-S*C^F?(q*j9oZ!o5He0~C**SBRwYh;L4wa!?OxO@2xo;T(ci~Gh{Z4n?H zaLhsN)#guYptSV zvo0@aJR+JL_|XXNeMt`aZya;wy0)V!gLXh`)J>ALHpx>qN#ns@w1%o4HZ3cK9J7qv z-*wzvgqYMMrwy*>ed(Iy_t;r_NIi|5m%f~6a#BPW4%D4JkE<4R1rtY$65Hz%uaA7C zX4^j!>*}gj2Is$E!lSyljlIyig%4rD_`q;^v@snpqOLqUIbmJ_4`DLssIPjnc>(=P zdI~jjcCu`a>V}~)S*Ybo4r`3oY5VayM%D^S|Zn=yYJ$1 zzBZ~|6}b$HrW#-vcT%sV|MJ=9u}s|a*#>=vX%|yLV%p|zruqGsVcrSE8{V8iq>vpMG#u4(_MnEMI;RoK{T z=k@hmM3Z&Q_Y5k!j;K%cRoG${CHKh;?=4B$c=LnqO$$qr zC%eAKrgS&1b(fU3r>71*cNi=0pJG|WMyVjTFO#WGkbSr;W(r*?U2XJg&hHG_?#U2o z#L`fiJ_l*GbXfVTwekm#*wc|ZuI$rbsN}q3jxG2!IH=_7Pu7yPrFFqsuC&pOE{#D>QmgMI(TOabc``ZAc=j@ly zl|EzNAkSnv7vNXKs;@Wjj}#b2M)X}O1Poqq_xH*vmy9>4FcNqN9vGS6bEhyB9vi1A(;w4`*z5^G+!qVIOMX?n^4$Nn(pN_(YAFdS}_&K*les+o3S#oZko6NhfV#Ds#LO^_H9pLsIT?z zH#oKje%ej2;z`;Bz2-XiruT$dPC@R6r+QF3|B#O>-C>6Qy~95^5Bz!m7W_lOzf}B1 z^7*)%IxWT_>ai5v?rT5y1RtzX1D(tL{du3*_Mcrx$p)n0dz!T|eujfzby{{yxy(2+ zIqSmUQ=9zzvEp|U9h=n<2+mumgf`X8gS=G1IohrishrvnoHxk;nnj=6FKd3e-9oKR zIv3L6zFQcKpJ*VC4XFNt^G5KiuEnI9IkY>~oc@GQY^|+~j1A8F48(#ltvqb^Ol;*hm4K+4^(?Ew!nsZBR!1_U|W@${qgOO|eM`}MJ;=T*J#+OPJaxU;PX*vwBu|KUCP zuloNv`>(zLf9?B-zUbQ8(EzUV!EXNc#Q)sBd&9r~zm31(BkGeGL{fj;PY|&11Jp^# z)`|N#4bL>O&J6AHsB6s$=pz7jO9AlRwv(!woq-URG;PSNyy6dswdg zw7PxwTEN0Q1uX5s7yqZh|C_+iX+LJ7s;zhNSpgnHHQNK<(3UdonPd&^HFxeSY<8vf z`pssW_EMhc*n0B={eH7s!I-wBc>~iU#xLlH^(Xe?hH2lXU1vzCnyk3cRu0QX|^l)!TCw`GP!+3a>%<6 zGY+5E{s-FyMOV=s-Ex`E|JJpgIAPhW35U*D9PKkdtl`6x>&u^5{PHb*Hr0=$@8?$J zc6J=sZF|=lxtxCMUS}H*PMDPH_YZPX-(W}c8gumEVpi9V-|AxZ)*$O zgAM>90p)XE9Id29qi5SZP{7l$bl|yGY z&Pj|7tg5LfXl+ei65^RozP!OzIDP-b8}Thgn}d(>`>qx7ErrOs za7n4Ny2ZCFI$bSHDGF>vn1~IkEdDu(gp0!p{3R72@t86sZ^E$gM*M|ht{15dMpvlV zn?i~0@l8dw{Z~`wO)7Kl`bL*?uSiV9^ndrQ5PcltpyvlJ9tQm8ikXv2!UZu)x!P)S z$eO#)C`b%0BZ;0mu!LgOKxt$Ckr6oL9?u$M&b3DB?YF&2!zc#^bK{cE-yn6&mdf2L z_v0X!0#;%# zU%GE*25IZxY#Yfr{~nuFVdl3yhzb<=;ZV10Rkz&tHBaqDVcc&+U|$6`U86!G1O~(; zjWG?k%H>H8dHAjjZ;A+jSlA-s@P*t1ukXPY81de(Eh8fCxPcOAf7(dY&j&%>(SVWt z`WuGepBzZgF$B5S*??0&W^{Ul0xluIO!qG7sfzEK*3@4w z%1_%5`Ht_J*|a~u`VcR~I}awFYph5#P_qew)qp+q*2K_}n0;EgtZ0E#+PPmVzh^e} zv%kZfO{dl5=sL^)?SP>DW$9?}Y5=eIGI*UPznO~*XXGAqyZDstHe$JUx)bX}G%>HoT~N~AwfCm#ZdYe={Stnma5myQr_p^>j_ zc7l(MEww7=FNR_*<~zaKw>tM>t(#MI`YJP0MdstWGn=eo-BG7o*vQw#F3^Cv^eZc{?k= zBVUnzALYOTT`?f|3P)4Z8NZDXscNkrvoLS9Hv~NzLu_jTL zni%&9DnN?Jz376B3P>_17N|g)>wvrL{gVghwms8I+`}_@tZ;ta&uFTubCnfA$=?jk zFS6RM&HoU%|L)$={fjf)r-!nL84AIONW>;OG*G>*r=)s$yY9nkmmtq?n2ahPA3|x zen4O`ew)-XEhT@iG9`N4y0*J%-{hV5LqpX?-0K1OduAPpP#2fce~ju0%)qdZ=7t;t z>P~^`I&-i&m2P?g_w2i@Ktfz(s)$p{t{;eVv9`w)Kv%gs5_(&PbgnWFa6OlK!;Kv& zt76(v1<@C`i|7OFYm8f-F#F_6+x z`=pQMsulyjyTf!Vuj;`sk4?tVKu;i0G(Ob9*ox%1!BsyNs~Q>Ip(Nbbe1@#q z6~ovC>=H2*%&;WvV`BwRBNosI5vvOZ4LZor)0g)^NSFXPQqi^0G^EVHC2t$d<A2NHA3K&x#GhMj#F zMeVJ)C&(pq1nhBX!O#Hz5oF)80*}oe(sQbN zRjQK6+LEE%dhGZkCC264AK@eirhmqg5OP$(_-p3Av=HZKwU~Q5kHA}UMHm%(=qU<8 z(fx^iPVS9Q>wGK+RF#F znVvSz{S@v4Ouse$NMDxUF5r`~H~fFv1OJ88goppxU;zFz6yoFm7@M;4<1awqZ{P|4 ze!~Coz2g4?_3%aT&#gaHy8HY$zi8cw2bTVAw*Gqd;mDu%M>Zd+mDTIz4bE#O>BN@G zD4%=Ozd4 zdpniPWRL^ygPi0gz^Ky!_w|fn*XoSfB9kp@7X>2-!FMKyHGdoRvNt9tb8!Bjp+H-N zj3#2gxyhx+#qKLL4PD2RyZ+>Cd)w*QeMWpEC*xn!v5GYSk5|8RzvwP;5~Z5rtoHgZ znlh!GbTuOP(mIu8&muZW4kO;tV4&VR&Nzwja@cap<~B|s$9!-h&h;i%yCVe&;|0e` zIKW|#=4u;`3fJCv;XHD!>COKDpaSzEK#fsBY|YXoj5ZI~m`4+x(ZnXnH=F8$sb@^N z+SA~j%;Uhp+Gy&U!usTIM0b7FhM?Z-0Xdy!fjQHFucFp10;=Be8p}`8_=rt4J`Encq=m=!nL14rZE51$LQ1Jmjoulr zo^YR7-M2n*+|JHH(L`6h*(mDXHkt&Gm%1L*pB8i3y;+}3iof;A`^4X9)!&2h9~iXn zFN+zM4NiKVx6S#QAncGC*`8o$4zM)cDR&K!IRyyWT?v&G+`ndfML0>%J zZQC*P2ieE7bdTHb_uBF@nITr(Utcv1^reG=s0OO`*}2l!Uo(27tDX|WBKz3^XCuFABJGS1A08IcQH~7OD%E37B&9Vy_j}SeuS1AuU>|~psB%~ z_{L6VobN1>5Xuhx3&PDE5+WI<{1NaUiPeG@vRg{0x7J;8V=o%qpbx8ajSoTjgY#RYDsprH)e{ue3AKushN&%O6=zB*S5bPc#pADDiD!e!7E*cPC%UXMqKC z$d#l#KvAchp0STyKg1WZD>ZU7^ql~1S)*jP-vzyfSeg_1LuB_TV01obNHqCR$;}T1 z&rPxuaOO`S&|`k-!?E=<7+8C+-{Aaxt^UZ;p^Uzcqnzp=G3r^pLXF(L<56SDFZl{# z`ll1-1?gYmOPyI5-(EAlBC))~ErIiWg7HTP<}rk$Ny}{^!T*Q`JJwK2euGE<;@ihhKg%$i@$vRP(`y)* z{*t)luofpZpe6X5R~H;i(BiD1#|dIn#K5?1RbJ1SsR>Jb@Kj3Fc-DQ8tt{#&TffNs zXU6zk+=X5xV8UwuPg5e0!if$~Hl`m%mF&1n*z!D8@tok}FDzhxn=cdHK8w@Mr}#Jx z@^I=*`i&nqw`6!fb~t7fb_mcvoJONG^*57L5$P9uHo^3b?%}*lp!)~g8_!Sx_oHrs zH@up2y6lxS1(_iBs~!A2OI*ySYumxd}U*|F1VG_QLJf?!4+ zW-ogd?(!P^dg||^OhHnI8U1Z+sG1Fzy8V54LL+1q_@4J~V3Bk(>#a^7b3Lf@l)v7} z0;>)!Z+p*4+^dyXXXLuv8F~i49Q}2K9iP}4y`^$`$fGiM|3u#WtH07a|JU}Ce`JsP zGq()Qq6Vghqsa(wD>)VJtuSu#vOw4SU{)c?vi3QEu_8B{8K8{4rn>aj zQ`r6ISRs+eip1HDHwS9aKPD1QMau$sD(hCCGfpMcC2p8hpB&S`fsV!!cmLxV2j?Qs zFYq7j;lI0g?29i>bb>dmm>68yQM@HMwVg$qDQhMMKQ5VfXD$B9zn~F!gr*%AoI8*5 z@Q3}rbVnpO{|^dl*%8AD&i@9|k$y|lOR%|so1;S$f3-Q-c>I>&6lb$jxR$0j^^#)& zx_*F4;IHy8YqLI1@Rl_zNE{7pu&K|yRH-Wq2CV6P$)EzNx3nuspz{wv82HH@7RR*& zh4{NXz@F@n*YWqJ(!Zk5`ux6+Ulp)*5I*H){z(7vz@Hm%9}oGpbr1c$555}&g@pN= zq|zD#8~DyPWo{sUn!iu^+oj|m=<_#yw(7%iye}H|@kU^L%-@H?a6=Y`Q{DwrN}2Kr ze>+GqaC55|@bQrC);+YqV*ZtYb&n5O_vBLRR)>x2vAvr;J(1l~8=O+0j}y|jA*}DX z3VkO8+T~0Rtdk=a;D`sc!H?VZS*y=0`mERI1AYFc&sKf9CY}u=+Rb;Z`MzSl>&^EA z^ZlFoZZ+TkiS!?@q^OVosLyNqyra)@eO}O~L!YjRQHdUW_oStFT}-&$*2QG&9@=Q# zugtdY@pG+v@~zgbzRS2@s4i*)F|j!sXq9teV6mLb1CPr2vK8WVt!2+qKZyLd>IKO! z;12;Y@*(k{eg#5b34z+5zUxUbKEh{G1D~nm`OKPXVk8@CB>GA^XeLgHbO|^G=Us=& z{dckYA4vaiNQ+g)6QaqJjQ*t~$eMoFCntt=@!%nKt5-sD!Hc*k&;s@o`g77KQ=N+X zs^iL<*4HJ<$~yn6mu^=;Hhf1NO+-_q$X?+`=mMP;g5U7P;b#uY%wVngBU!3sq>RZ; zS=TS~sNOVr33;oX^efn3$pH7kDEV6XZE$$O&}ip0*@R~3(?xZ&5DM8!4GL!Q2NVi4 zECH0?A*6g_b6ym3%f~FxUA{4;Qm$N;kGuEsm5}mrR=5+o z%U8ZHSUyIr?(&NPC;H{8eB8a4uY{D31N~UlJ^GdJ3zpA7sJnbB(UdP&<>T(Xd?loO z9O&;ZU->@2{JO*kb;uoqwQ1*cGA9wHNDP7oR(HthTF1P;Tm>f!of5kvqK1-dO4&=C zsy^io%%4Y}Sx_*6mtRe{bOhjmdMFW2wSF*@SQA!l4t)0qHKa=nu-#XxH71y^u@&Q0nt4KXRy!;Qec9Uw6(>p2Nlk!vl<#NbCSI3w~ogiN5$LW zQ`6VoSGbcfcecuXi;2Imu;L`o=z2XDM$+UWxes?duRBJtZK-x_j!o3gEikWZ-5>j8 z(COs?>@X`J$;&F7i57*1QQ?K0x^{gIL){`VMu_pLhZJ8s76PR+?X)TB4J~R?fwWVjAPJ=ZP>e^wsD^)$+IZtDSm)<7!jNfOyo6TAid<$%8&@RtMra=>2>_{#x* zITrsdX9sVw_{(SUm(SuapT%E3i@$spfBE)^KNyzF#xRqsTS`8r$#-p#nZf*wp(D)C zi1|4Pb*jkbnvK5$g?ph^?u4thD$cVUuP$Yf^ql#DrXlIgF50$s#z`wIP4|>mFZeTz?}S zDSf1Dz06KRepilC;9>zp1qHBa%L7r?nH{%??WNi-fO$_^)&?HW2wCY6_t8?FsH6+k zIc;*F`hO;MWCfnQYkMU$AoI>U%X_bfFy?^;469ckT}E{V>_NA~Gt!ns=}8TLaaOqR zGMh_}_DJ++!97XLrO%uHcGHKJHREr&8h_(@jUtOa0)?wdYsBw?vPyoq5r{DK@gs{q zMO_VUULMh>tfJ4j&?h&$3h!|}`V;|uI4j)39Qp`So1QqULS0^x+qMIEFssLZ94h`j+T=S433hi$0tc?g(IX*B?Qj zPag_#s`@i7^vTVp z?={`kEBX`xeK;%J8enwON6=pB>$VSYB`8fkmrlAyL#JHPiQAh_0)?|l>(j{(cM*sf zI{A@Br=pf|IjxsRbSkUpG%j??&8GA3A9{2u0y=S4xR(GUeUje}3Cc%j{@yc7|8(0Y z^3fj_BG4^Y^yBuXpFq)K()#rC!(9Y|hJJoz(XXgw%s{<7qF-4>zj2{oZVvq)c=Rg* z`f;Ei7~S*}^kwMBK9Z0Ah!BBpxuPGpH~j>P7L(SepC9fbO|zwk`H@AxqLy)Kt(Qmi zE34=?F7(UIq5pl4enmh(4)g<~n|^}64E@+=^3fj?BG4^Y^yBuXpFq)K()#rC!(9Y| zhJJoz(XXgw%$U7AqF-4>zj2{oZVvtLdGsp+`f;Ei7~S*}^kwMBK9rAsIzB_cT+xr) zn|=aCi%IL#&kuJI2panNkww3vmNDt}@`!$A75&DAez`gHzw6Pj2e);JSc=Y2M`UCms4_Nw@HbZ{^ z`a#grAIPDfsAb%7Z|Enh=qIb8U#{pEsBHS*_UR`=^an&gFtX?evoAw`FhBhvkA7T3 ze<&aQAxpo~X6WZC^hF?O=?~@5Pt-DA4KVbRRrHh9&@Wf?3sg4!|LxOHgy;{6eqdzL z4`yG6{^9xQ4}0|E8v4We=nq@^l{Q0v82ZiA2=spp8?yBuQOlT28~VvA`pIhOmn-@O zDx3bl`1BJY`op3h7+Lg#*_WaJjQsRRJo<4B{gHh1M=bqHo1s4f{l;P-`Xf2?6Sa)V zu%Vx=KS=>Jo<4B{jq%X$1MFyo1s4j z{bt55`eQlt6Sa)Fv!S1?qMxjWez~Gwpt9+I%cq|R(H|52z{sK>%)Si$UHR$fW@L?j z==d%D1stF-OYm9qR3Z&6N}Hjd(}IhPfk5;Z6lTjmQOlTEdwC4~x`0{zzg*ETP}%gq z>C;by=r1UQeqdzL4`yGA{=&TDpMoNf{vwb5qI~ohSz1WjO@EQQ$XE{y{Y5$S7rD!r zczby){ajRI=*Knm11g*TH!}1WS^A5h9~jy67kxSU`{bv;*rUJLqrW&G{l%6R(st8d z>@G6a1w(&v4*kXMGA8C;9!r0*M?bEiA5hu!zn-DL*wSAN{lLhkzxd11-!DJ?0gryJ z1u^X)kdOX=rG>QJ^atEU#`<9B=SF91EX0JvRh;fJChlGyOFwIArv7ma{ea4*|FsPL z91NEH2cRDq+4Kj#9R0!k^s@+R=*F^a-F))^nKm8Gp{)k6^Bp>|| zOABec>5sUJjMc)>AIYIV;x1!C@8z-dM?Cs*4gG-1rvKFp{Sixl1p0xIO@HLyp`T^G zz?RmyTiCQC&+6cdFXj!*noM=?e0CD=u})w&3-h3KLE|;iyq4m zzOC`=?sd?>;;Xkx%Q81>Hmn6`^MhG$X%09?zb=0{NBDTBge?hnA!cU4IhLCY$?Fx8 z_y>!u+;8gVX9qw9J#>M0INQ%m9>+_Xg}CQ6>-T`PYr(y#{bQfb-Mw>lhd{Eo1YR{h zFtfyc5j&hSDvWPAz7;RVs%s~*3!^C%EZpIAycc!~*O~1KD}s+~4nE=rM|P&Wf#vbV zs&BlaR=Xj?KJD;= zBJCzFd4Gc4{ao@_-}8w)W{-4wJ`dp8Vq(>wd`smYZ}U4r0C2TC0DkW0`<3r`v>U*K zJ^+^Qo;;Q<8mU8ne;iK#H=JLw6j>0w3%L`w+f-q_*`A@X)jjPioOHzk`6;eK*9fuH0>3}%ml$6)p+c&C%K21z=qO!Y+) z#Nn>8m|&q{TjhF(x*g7K+us+e2JB-Q>~JY_4+<-_YDjk=DM-KQnh9dFD#MV17t>P; zZ6XfUY!A;Ig5XEgTlx9Z7brfyJz}Ef`BDEG&asD+6jdDqjEP+1N4}%TgG?l5JsWwf zh5!P(T#-A;<5Xh?vyr#?kq;{Jzini(7x{@FxlobqHWJ)TnHOqgC9u~k^8eV#kQces zj~t`O`8G04Zl`bSeH5)Uos+$%xHFKJt_Uj!# zrv-U!iB=`?u`Nv^Mbo17c@o#MaxtLxAih1%hXFinki|pWxAH;l*p1nC%Rp}XOuUd@ zwBcWSY{Xnznl62JZ}Dq5^q#(ZPf2vbjQAn%?E!=rfA{Ca4|#u&`N4lrkx**z|6mW9 zP5ip_qR)vh{qS@0?=>F&ZQOHyZnQdszvhrWVSOrioPpQN{x|sl7oPNNN5K%cQ?3dH z2leA-|Iq*b`d?1`uN3@GwuheWF{g7f`gyg(;dx%soV!f}5%Zj--s;9z9Gw4w^#y`+ z-p3c5>-}bj$lErC1E2qGeH{4QAYaR_82uq{ZQ36i*aYVfrjLwO557cGrGX@2VTYHO zwvmu43C9r{ockkwaAd9d41JnI<{LKO3iFMaZ-e=cH{YrHKC9A4Jiy=~JHD-Q17AbHn;X^che7 zm;tleI)($&Un8z|_y+TBH{ZqP8+&g1%oVZfVv*f6FdH^+&hhSGx{niozuy+;H|eVx zIg_QIlh}>+3_I~n8}xW^;g;t<+tiOgaNrZsXHPf;AK7jS-2)m6`z@>;-nC-I#6-V| ziQ3`2S0wu3{EI!_{q)BOXZZFNVydZ?*~2$?|FBgwd-w)L=ZR?!E27y{-t6J+Hq|=o ze33lO5tF}Hh0h)yvp`y{v)DS1TBqGQJ zUU--eLSLSVzktBz3lW=O^W{B~UKA$f6%~9Y9M;Zv@?q=vHW~o4a{*jT(&lfIw0Q!u z6>Oe7oTSZ-2CNarEDXBAPK*HWh6X+}#`C#lD$+8g_Am()6iA>zR{{mT5-5WQju62S zCOCUUM6r1zi9VD9`TgnlqDOykUvNng1D;DR8u#X^OCk8 zW-~V5?iJVkqs3mx&%ENAf7$MZ{LU+`dFci(K|5sU_BV*0ht9?u9a3NMEIW z(!Bl4o2R_fJLh2~mM#v_fvgaK)PTe45%;%yApDV`mQ2cYBq5D5; zz5u=3d@*{r`P+o9Ci%>loWd1O;jWb(w=^G)eushAgH7}FRz5eY_~x@rji0ZAo4;Y| z`!bc^Xii2DML-tDLd(Zh{%l0+xFy=75&G+oULHOA)hPGzr3MW5I;3Ff z{C3!d6GN}$BdKMTSmkvmB5RY#+5}lGUSDQnxA>IMq*z1YT7sutrZ#sz&?`O08R5c4(QLsV=%v%Stg_X)QhQR`3d-tOzGNEBd z<9#@pOR=L(){BshGMvsXn-m;WTQ)T~=+-hr;~;B73l6f!cY=c+Fh`DpgX|TB!9h=$ zYZrrqo+;Y^PncHEEmNz;b8DGeG9K1Btml5S0iBQs$|`Kg!(|ccd7`YrdY&m8kH`IR zpt6SSFFbyH$j=e-VT63BA-|lEUvkLeA}~TuP^5!`0BJX_M+_hqo8KO>0En62a6-1C zNl`4d#xTrT2yqPiEJj*!5t}WBCDtXhhJi6x+$Po-c#WwSqc4@xvQqW)lW+ANji;Y} zZm$+z?AsMGZTk1a4C7VH31tCQT1b^vYAmH0E4fjbW=;;C^7{R*W zA5=!$5vCxSCiB?Nw-ozcyOKws*4AnEHLs4>48RjXb`d zX}R_H z<@Hz9m(gF;-IFInA`3fH@c-?r)_>ImYSErcCgxII7q2AIv;)bd-o#euH*r?m8 zPT?-)sq!2jO~%w=)su8Ya^Yx`l=q~P1HVZbT*bAYQFbK@D5YydT4UIF*U+Y|W)alf z2^viu`u7MgYt#fE+m}a`k^_gCj3xhcYE6D~qO0Uwli%vV@9>n!DjQ|DL^$XiZomb5&lUBA>7(+fvg>!fEcuZw?H z&{$d*-%-%Ge|>76mb&WV?d*hlNzWR$Rq`A5NDZlrQ{DZ;WI57g341+6UE*w~K5=aY zcMaIP8R`>%a!-1vtBX^x&rSh`*GG4L3Vz-6Lwnp7U_0i|Q9PD?S|2Od_#~|UF>H(s z7^_yVE(#%FtJ{CNCx{XVl7G(Y$Lt>{H4u8qrB{45{%QbiFPh|;>NEUr`!7GRcmJaL zY16$Hrq{|Jul@_*UiW3}L75>&rhZkrX?}I9+bOP~?O-3MKNRs%&T&ot)vJog!A%`x zDQI)}Wcu}7`Tl>^zrlI>H_Bo5jBL|bhMn$paO1kxWp{kVgsUBEIUHQ+0qEqeU2A$b zNVa`oqx!(dZ68Q?nRwjvzKLB<;mh3(A8D{%UpII^r1NJvJjwoH?thHra>3h~)pVNP z2S61M)iWYVT^ql~z4dTiG4FS`+^>4sDY|tQfe5&vKWHe5uk%;tFt_f9)n2NmrRG5Q zW7*~UeoAH^fNsP^zA1%qYR+xB?tS}HpyW;St#TD@Z?*IQd~W{B{y+BKJv^%F`Ww#` z0t8Qh06}hv22BJtsh~*#$w&fca7KfoMx}~36ss0VCZQ4_I0dM7u$YY zZ7qr@W)dz*P{~EPR^_5_!l+zq1%fi~=d<>i$;>3d_Wi#9{GR8>^N=}bpM6<-t+m%) zd+oK?9;pD1C>3lS<1=#pMEjVY;Riv*LnlRwIWd<+!gT)os?NUE`cMOrm}UQVv^Qyl`@5Gu@VZMpT6giY5K6O5RBD(yy;%|4Fx~`{h{GFM8-%>sj zzAw;N2zBxh`TeX>Xa0WCw|xK0*fW>^;<7V;KMSUaNcg@Lf6qPnZTQ1llH-Z%pFY^* zvO}tlp6u~XB!0fYrC5>hMSXWg`*%ftzv>Usi{+^AFGiO~|MLhxcKz`uC^@F-9-2xJ z7KQeb6xcn|u$CTE$Z4LWanVQ%9Fr&;)Cg0D{|xSkv)ohL;H{n48@D~ zfk~@b^F_GaM8FQzLc%hS8!^{Il|+?CF31=}6vpt+izsg%`{Fd0(V}W~S0eHgaQ7BA z<6_-A2MB-~(PX|qJzQ>zywoIq`BbdWDHd>lYj*^UP15mtKpCn(te4uF;`8&aJ-;k5 zx4zClaP4`RX3VFWPKsPskV*Z-e~P&*SUJcrvn>&K{=e)$3Jd)GADMCLzf0$OYf}g#`sN&irR~ah9G|q@ti&NOY zG}mqDRTg@c<+`CquXb;eUR@sSRl2o&oP~$0vJk&qeIG|2!F*GXo)abR#+y+UmRI~cQ4o8#g@|0l7)5L>7m$kVX&JE*IvLp|7z?5n%#d7@1Oq(h4#>2 zX+OGua4kms{=RDTMArBp^lw&V|AMnvfu;Xu@cwh?zuFpHrMqV75YX1FPE+z+$y@Wf zi6Jd`V6b`rZz#~SL<9bZ2=r*-i(ZQS0dpw%<4Q&7^!zJRL?S^VUWw~dqa{)ZHS*9a ze*T<5`Zx4}@kM`&!1$T*L)9M=av%WgQ$CjW%^zozQYU;p`2&oihQXM%h0OCl^7P8B z>t2a~wpae>yZuX9_tIY4&kMGnr^M*IzS^I9=JpkSNTo=+1mAk4PX?jdSKmjEn_rIT z@tNt|DykeFel zM=H3Gsqg*?shG`%r`Hu=njDAat_{-85}Y62@=U$_0{TaZF2z z$N!{-+C@HB=|d0VxgZIDu4GEn!aCQj4}FhmDNIXYn#=jnl}t%vN}80L`cOVo(wUMj zDcKL5&y*~tWJ$`%hlWG`=Hy+O<4VRuZr+u-7RJSBeCdrp#*sfj9!%b1)aWMr z;}a}qQ)J&R9d7GUX;=dBudRNR{1s`b^Ii+~Bcm55K~M1(Lz-Wk<~oaWCrC9vGY`5I zuhjv=!&<~Uu(0G%*XS_^q+_0xr>=EAb*(hvTkm9?Y@UXztQ|>;X-}EYyeZ=KZT~Bx zWBLEgHt-SZKE}_oKZi3@r=u7BL0esSX86wu!H=F?3r)5-E2<~s&fF7djPa4ZKo6#& zC(?@((3H%Mb<&GQ|36eOUheLN`P!c%`k;sPLE-s?~iBh zA4a#uU+k&sAA1_?AE~B;YI;;p|1;RU0h-idOQvhHRCR4WB4!5E5!Vh-&W@L=a}c<%D#wRmlaUf6!z4SZg z4Z)8nbq_xI*XsF>%pBKTtfwFZFx1Sae!%iU^MKM~4K7phk?Z#|`A(IE3a)tjfNc`6UNxcrKW)hO>y7@sk$?SmXg>_4lP&YB) zIsQ9$V=dK#E4mXHAKA0xh_1aduvaDIk>0ocLlx-Xl0oK|==|po{x>7B?NdR~?X2_DrU(?7|M-14cKk1e;AdFNIu&bf zM;xOUKPTXZ#W8qtPrv_sD5Jb_ zacnBy<;KN9crY(*Li4C&hgHWO{^F37yw|jsjnURD8Rr3m*=wdd~k_s`uek9D|C)8^hYUiioEJ~2|O*$q`m$91P7hjF})J5yL?kbj=z zMo&$>R$a?H?i29jzMD@tvc+8HRBT3r zocl8nAMz$Fe~iK7p!n$sNe*sJ*Kw&VAF}X}=AM2I#u@HkgTz6-Qkh3j^5a?X_ zB2^KPAwfWxVvgtqh#-DW#%Yg?QwRj^pCBxlleHR2iv+Yj3{X7?=sf`Rr;7k+t^%}$ z)KfUqgMi+n0R18}1gKOM0Vq?<`{B*>E!cWJ42Xgt5DNgrkM0E!e=ZSheJXw%Lb!q; z5DOF#i@Jf3sv>}3ifL}>1qe)vTD2Zxw6%l+9R0NX?l33AaKRDuE4~|vzwJ5)(h5k;^rjmGqkr$lXh{&GOBF^(c6Ujt ziohsS%%3*)g3(AIn!H!mCsj0R&Ub zA-w^C@qTOqdLK1Fjl_w)CXfAd=eZO|8=HdkT{o!<_Xk&JRuO*OZ(I*(&nL8-3zDp5 z;}ir0krAQ%0tIkb&5guc7o}r-H$+Yae|&+s3Qm-rrx3(8G#m7MQ2J8?8+U&OoZN?9 zJuGN2I+uX^AA)lL&BxckKj5k)2jr(*L+!}lQo4fFhRY^4B{$P5s`~)zsg&ln(PI|H6~J+LQW=h{~0G*$u8Xx8cu!4ZrS9-K5~xy~!Wxp5#rs zC-tL@;nVuDSMzk=ews(d z!GC2O`~V#Nl5lnRIQR6XaU98zM#=rKzDP80e496P7mkDQ{2%#*gCwcr`~z{HH{iP& zUn5{Pn-N*V+<-rI-8!iG>dzw>swl`%qQBkOJC$X93Qn3$Oabgo1p7NgmcvN+$US|$ zKr=9iIsahuFYpj>;Hvpe;wccuYUX4Db#Ww6!hfS90mC#BG29~|gYPq9K|s0dm)o4% z?jIh!`BRycbmK~d13RL72rS}|t&G*y%mAqNtBeF&9h}Z8i=d7bI7cGtU5renD2>XDZ)T9qt{gbzlr(LXGJ zI2}9&KNkL$k14&p+Y~lmnZmlqVNG-S5ZwzS*-dCEh%ziuJwCzDsd^x8gs(6DhN&d= zD_?Axj)#%%z2kMa?=V%t3SPXs^1TaU0+}sX1?g~PtjD#S?)p6bf&6jTmxNxs({iHi zEy5o^i0UPTX1cc|OW<4gFyOl$ix?eJE?rw=2RLzM=iwAs?2-%gz!n~-I=)-?otoj^ zAFIdi5Hnn`o829jRWz=heh1xEd~3e&oW-)86;VtPHVp`T3nSq(4-y=3Nv`%M%9z6?vKYh1^?rmGvQfkCkRZonb!7ohzV zj(rSn{IN)3>E9<)shSoPuo2~CVa`T>Ab-14WT2WaKWlY3Z2cqke=o9sislJrc`TN0 zp2YD9_I9)vGZPcCR)HjqJoXdWuRh*X4QK#Tt)Jbur$Lk~3gJ9J}i zte)Sor{D{jKyA+B?E++$1Q11|)*ul<4;KlT}OnL1lh{WYro5v>22?)o3-QNQk9niiw|q_6E8i@!fp{Jnr54#TD1qC z9o`8Ar6SsG{K;=yF^b={)xT$1Y>_*?lTz*8d8tX*Qm<*&R@WdMX}CQ|=8!yE=pDv{ zN1n-yalp0)KbFM;N`0E=g- zN{anBtk}AZEJojV^X>=23&>nz{{0Q09vhom@Td*cH&e(0$U9!MvC zf}S`u)b(F1)D4%m@c=^!!eq>oHph$CJOLC@6 zvBCNy-f(mI-?4PL&#sm(qy^SFDch~33wuYagREPAKOgIsbJmFA?^L^R`kxJOqNb8e zmGlgfu)p<>Aomknr~nIFbJJ56(rJH$u86eGCwoJ`#h<^H9*4^>5&f(&i=y8JTUYK- z8*E+Y!Pb?7C-?MKsZb;9#MpH{62#aw4iBcCju4)p|CTou3e}k{T>UKz7ubjTQb+<* z(nCIm-en?@UYei&IJ|?MmxknVgmA%2q+|*1Y<-WNx(54?P^emdP(X!h3xD!`D~6O$ z=~kw&uZVs@gTf9RHu|oC(%clGswv)o4c{1+oM)9xw5M9tjq0>7umzqnZ3acRqR}}DU($=8)g>?nhU%3`y zGM;yLdW`OAGaVU_4`5C(9JXYr!_6mvs3y>ky@>0P)x)f;gvoj4*{TF|Pz)EphIyOi z0=Vg#_A%6@)lgmWYoY>kG^wtDbwkflpSlN{h!dhS-CR-^&US1&jsDH)ojCvVE%SS{ zf0!|N!W2j~5LR6q33f-1_-5%aS2c&U4em#IngZ>RJ9`o+cLtXZL(VFTBC z)NW{&?d5)&_gVA;83%h-T!3rcFY;B4;9H}5YpURecD*ZZSv(vB8RpRkJO9xc4C~m8 ze8aa?N~yN;;Vd-)rH*Mg`rwrR4v7c9#5z?7Z13xwylQWN_G%*mD}t&xs^V*r4ga(% zJ)=$Mb{GEbnV}D8W4Q->(d({YPr~3_Rj&C3On27!Ngyn??q1b=K4^ld0JcCdne zmq0)KZqxwi8*r(q1%0y~+th0Z#$X-&Tr4}V>eRcZ0)fgO-~pFF#H<(%d^OdT53ED| zi8ZLPQJya06Y{Xr%ds6G6H2(o{txT?O43|_QpI1c6&pNXoSRSnm{vFyA^25784>V~v)F0Ee3uItfN&uu2 zTo=f1Pr|Dvn%@%NLInUr_zpQi4ORfiN@N~Xl~{~;^syi#hWVc=`N;z`fDyAl*MM9j z0=nV4g08jvM(u`nfZ19x0e>4@+Czi2lqQZ9wO+)FmeSDu&Yrz5We@vItVY?@;f*Sx zVWD=or8{eorcL2Y`6HpHyK8bOPFDL!RsHx*s7M9+sP=VWvKYN%KNnobcj*}ol;jP> zd;2kMenU@CWDI`g4Rw7G;0ZD>euX}lMfSbUJOKKrKDW4%9~uapPHJ-Rjm0o(#snVf zxP{oKL$&)~4y#%o6@H(Gwv0A%h~F&YH%rytR_DUNe;<4W6ph{SL*a%UOlv|KkiC=7 ze^k#9#H;b7JzAySn?=8`St4oo;je&`M?z^e+-#8Vk3Nnkq_tH{!QU2bbq+A7rTEM^ zAYvi*r_1OXW1R}k!X%Z`2sUINtruk74s;;nWMssQ0c5Xe(z(IHe_(rGa10z-X$_6A z@-pbwqi5Y!qM8XWs=mIXJ;I$Aq+Ga5rF3eKT!9q8x}l;U{+i|U__tyb{1yJV1bm@Ed%!G=}QaRa14u-!<6iKqf3SI2<_V;CpU+=S2#0 zg9oafYytdNlSOuf@Wi^uo+_8_?9_f%FGUO3SM6uMJf92FM5KqJozT_*1QF;;T!-@E zDRWWlEjs~NL}D1@p_L2E6%I|nWFt)VA(%`w{~=((&pUlW(LVx;h_?EsZ8$tBV-o;& zL_xjnB(;?5bmM7+xPimKshD&`RlP)eV{c4pe^9JRk8QwDJ(qHAd(eyFRW3nYYk4E6 zkJWg>Xx%6X`2T^7;5_8Oc`@{(!#_CUwR{K*yHOaJYJ;@&$7?BV#5I=Lg(o6M1I46p zREpWWIw&kr9^~%Kg9MJ2Yr*%b>7xfhpDG)mtw|h-Cu$nCiTA}9#;944ie^%9A`Pt6 zq4j1ogvpEiR_*ag;2;hVbT4J_CDPf8ecB^I#@bmXa~$Y>;m%{)1zW17C!>1og?TsdZWCzM!nZZy}umsUXu7U-d8n>@=^pP1`68p3$Y0^nYh`aDg~Lq@s`SQ zB%tT-aHY~x15Tpf0*t}@2RY2Oe53o+JC%D^HJ--Y5K)i5xe=&~@&B6G`Yy1uVc*fW z1a&`I5_-8Y@pZhgUwMFQ!@iR*4L(2kFe3Pn7<~BGKde0agAWbC2Ok~?{l-%zgWn2! zekJVrw_(rE;28kDlvs<0PCvwUklA|qRXee;8OcBNyHU^R2u@BpGr1!)jrgnQpLR+v z4EgI?EiI|RhhXa0x1f__Z$@YFr4jGILOTMERr|>btNbJ*6+8?9W_c7@ zj%f`IiG=>=l7Aj1z4`Ky<X$yP)FzorHdOpDXzYR-&DeQTpdj10Sd`e*7Qt!a*jl}LA{QeW^6E0Ngdy$6s z`H%n{!Z!~7xunm>P{J$(ju&?Bo=&;Ij2H)fQVCiYma|-vLF{@R+A*a7%bd+ZBP zm-cn+BWbI%r8YgbFweInu^{hcdFt!m1Y%;8vI))d4Wi>m<0jNU77@9Xc|H`Kj%hHr23fEM?`8NP%426Vai%oxzR z4jQJ+kE$v6KFzl;S#tK1oCCT%t?R%*VR?E35q?>|ef>~wKnwCiW%!o-z60ZZr^kDa z9B<8NU3Gwc9&jY8*U}7jtwLx}#sY31V&X8@z1Y{*p^UU|r{CFgzm0w+U;qE~!-5N^->F}pk$!6Z^EDYM(mx#|QSDFdE}N{anHL{e)m4RDl_PZH+OJ`CTaT9*U2`Db z-LljE3E)PIG2zB^EK;&mZxmap1U;}-&);5|s^_07Ux}fbkOwEndW^5CvQPAy0IE8T zPfKp3EXkuuDoxKu)WK7_=RGbjeJ5w=87E<8K*UXR6W5&LN`o_naH7f6^S6}^k3^uf zS|{qK1pq^G?KJ-ggy`}p_P^b57pjXgh?xtQvwm5%hwSU^y-surfB$0Fd+u+@{@#C$ zKV=jM8-%2G%%)1H{fX4?*U) zltl?dt4YWN>q+760U%4^&ioBLjKc6{UQ!v3vd&K|Z1o}^+<}!9*!!<01Hpc|TU*We z9|g5}AuFYlks^Pv6^+TY;zA|IKSv4ANnfC!duu%kKn}W_t7`Sw*CQn%3I$SPD$X)~ z7LyeK<4P6%-=_HUpT&=;aaM4D=Tw}wy4I>U*}ZiS>h-kvPEyFK%H8{BxLc}fi{oC8 zl+Vik>OK`;K7%j~b#Falm8D=;Wj$@au705kg30l(N6rSSV({iwzYGLaU+`k%iwr8f zOva1ajJN<#-M&h_;8$E*`eQ#FBZdA++T$GF+UiW11SfMBy{a@-Hy(s(ZhGaFGZ^^j zgRd@+@go@9^!xCR+4eGII*QXs$b_%2@#|k~o+Frd;bU|b{NI)bzdgrqPul9ugd%NC zJu*Lvgsb5&gVz-NFF*x1#yavrX4*W!xbtIUi}E^_3>5qo>T8Z=lEsL3ngcKC}*P7r^mjB@z?n;nia6s zADZ4A9xUB5J)oUt10L(5_LoFI`LFOhW{%+3^=}Km$$0O9 z-y8U~5ByH$w{ZMkfQ0`K;Me_p2)|3^QSf^|9xeRdj>lf{>mP~J>k!pJ$>rV;uNz7( z$bh8E!QPZX#RR>uBy_J;tyg>`I#<6IPxX* z3{R{7J!qBHNP>goh^nrmT6G(T|8{6^4kKY8I7)l$??~y^FbA(;Nn_d%!Du6?VUnel z{1C?89KqNR*z!(QEDG&kcg1PdHwMscVLtLh4>0y8Rdbaz+0 zR(*-&ni~%fmh$u5sO|5D7_dC$U;65xKiN zxjjsYZ%=K)(Pb`p3=B5dWly zS`ko zBvY(PilhHsZooezobf>@`uDbJkH5vrR*!%ZKr9Wzba89hUNt`Pe35HhL3Kc@@gf%j z2r^8T!&Ai&SrQ4${~Ge-EUCob{EBiuvjc4o~I3~^$cLk zlEXhni=O~Ifsd}Zh{U=?kbkZqf26)Dka9kd3IE{ax34s&>F~jA^|#{Vtz|86nBT6) z)(JK|$NbO2`x5;(N7MhvbHp4bzpdsV^}d!=;rCNN;rCYaOZ@i2q)LAu$D?7q<`9+$ z930{wtbcTrr!afG1sDOaDK>KHU>V>LCTDZ}A?ZR_vLq?&CQv*>U&@Tm; zRR1vbs~WfF|DtO6|9uzu6wqthrK?V@XrI%w&+hvqjxag3!uOq?Q+D6M;OocT@`dzx z4;Uq3R@;?`%LJdigVA4zYV-DJHGjZ&D8$gR8@0z*;zeEf0zmErOI3Xh3E(hpi*tJR zC=N(wGiM1T>eu-dgIQnZ(A=*&9r*6>n7O+> zZ4fh=BMUw6fd{E#D?U2YH+I;cz`tcM)|F)r^-)1adzZ83 zbDNmff!JM;rDe+_@b@q^E_$Qn6xKR2M}RAaGyHlMgLtRIJ=fe0p@aQXIQStCIea*} ziku8Ip2ZlU>Hdl08cl0*7C#}@0Qyb%kqMTP=12?=+&~D8aegw`A)Z0DZ z5bd+UAk!dDAa1AOZ+^uDp)aNt5s5<_p2H4f(wZxc$v@DI@>c&wB>3w=pTMoIL3p;k z38G*X0WtZWJ+`ILa{ziV#?Ob~PiviX1Rg%t>d=;D+whwRj9) z>DzI}qT4vq`9{~7HUN}-{TzG?`3kAZAa0Pa(0J7h3nz51lIg3uE=3QtC;o@TTGh1% za984_DMGzd78m3;ckbsG1kQql{mP#deA2yB!A&@oQSb0xnS@BJcx-o$+HLpXa=eqa zw}=*d$EVJWjZR~Ez?pGSpLi`ow>K+<**iXQX1wo2Wa@w;15QXM^^Sdxj0XFF?b@0; zswv1Rr9X5I_y+nCIP4pT=LAB#gDubt#G^xqrzFe!L50@rIH+fI>G6p06==zARx|$f zls^>7T*n;WZGJM5eGwlkgmjibo#-U_OAjKXrhUb1a&5Zqo${%p01{yM0sO4&|Hf!i z`W2k2*;eQOBWq2eUFSzumB`POYz(2ERaW+QOXWlsZ=KoxV!i*tRlR z)&G0pKW#PRvZJZ({-0ts1;UrYD8B-l#`YEG(n^=5XJb8eOB_3;2?X7ZO8B)Pa=y~N z%TloX(zCm|(R5rlDzHm-OfyJto~Fy<*<{Q^o-NY8x$Xisk2=j)Ch^HZ1Py^64sVmM z=v(h;dt0nO#QJeP|AfnqhCq-YOGwz*ET^Z#ncd~n(B#zO%|{??Un z|3o957Xu8v&9ocKV*QEqf6GDxN;~SphKlsgvlVUIVXo*f^_nAE4NuSV6w*NM zGTGrq=rGW*&mmtkNh^+f%!W!N=GDYFRe|MOgo}QvXFQ z6=(77f7DxBxds=Oa1{{s+Eu;Z%->ngC^4zrDTDh+bor>(d&$6sV7E~SD;cv5ZbJNR#;>^nf2c0@ppSP~pY*vr zj6PrXPM_Z0BHt*RTUy?Y~4O#g)s2pw_6@&SbEib*2=5bZ!O8$^EUR6HfS=1JdTEK@TWY<8U z%5|#XEdE$jK~t$H_y3A2Qy*1SxdgxFMfek`#H;zGQ_U~Y`a3;|IhHUX*hNx=%X~X# z5~q=x>NKu7ZCCLSvS2gxpJi|RR1dsINdpbxFt#SjG91RDI7IqJMUYXQn6dSa!*+al zKbVV2?ya$y!<(Ho%?_>Tuzx7h>}{XB560Rta|AXyFt->#j8}rG+0Maz67}0VK6lo1 zx^NiLjtp&wZSZ4r4A_bS7XJrg%Lh1&IS^9sRsOROPR)yv(S0!9?(2j`_b&6>2cYT| zfbe9ztI%#-9n0y+>DlWX^@%;O(I#Wd-m%A-vBBvv0h2R-1C#@(of~mCXuLiD9oS(` zJ3a3>JsY9;umwm@h*yB@M0Yzrchr1=EM4~euF3&eJ~Vf}4+fzQl|$toI@El6bj$3< zaMoNq)xnc_M%p zrVO~JAKgC_e!+vd-2;taaf<&eoYPN{S94o6W$cvg9~EGQpV-77PeHnS`dd;4=Uo?P z`QatLG|T)ma;iR3xy!LbDI+C(fcBa1Ul0SP5RO6To!((~;hj$u3w@5s28%MAOkVbm zgU}?L#%w4QP4|UVvYe&9aSqr>9dj|3 z8A_qph@+O1x52`g-{Bgz&<4-dFSVP*KU68e3+?ca=+>@@-Xx+NjS@}t-sY+EEHa0v zxVh$UZx5ezEOas-u$LwM&k+?jx0C*H(MG+ncZcy}rim;ngvzB@s3L^Q)6k0;LZyzs zhV{$f4U+zR<{$8D?(>WPA{K<(naumX<=6V`KBDIP;-czitvVH-sJP$Es3|NSTp!!v zfb_^37W8~%tG2MGVND)La){lbUt0+DV+}o{t zaTODA1?ga3@tN{J)vCA4$mM5a>|-53_WA#U7_Q#!8bDh|Cmkk2L*9{!A%Ayj#E{>x z%o_3t>mrnt_%C~ATJ|-7qZp?+MdH6;Osf>JkFKjC)Wg5tRRF-Je9j-wVhrtlAFJ{h z+{MAc{RH#E6nZyY5fS$YDAO0p&>=U-1Q5*=81~N&1H}Ir76I|l-XLDg7F{9e&@SSq zNuZcenmJfOdy9hh>JYS(rEEB?`&ZI0wH_$V5O5W1^a5YkP{21l622u5^@7pXkG>tg z`_U?}xqhc$^RN67Y(6Dr!{M75f^XGAqO*7SIOKZcN-~h|VUBR0xfZ{5-9pP8a0_7w zDa6m7!F%zYcPM{weY+)pCM)@)*ai2;$H$2LQSzwT;;!d2Uq-rl`@v}WBg_X5m(THF zZ>~2=BIM5v^M3Vl06tm7IdpN5Ln0_*CvrYE#b09 zhwQnGvgcAIdk%l8WY1&F1PqDnxl9&?W@);}p8F|#E`{uY_6yllAlWS0gERc7&$O$Y zGoc>CDH@Ka;ligRNG-vc1syBt^#g@Zi4s1&eiz{bxq~~}B7{#!3W4q+`SV@yK~VlE z6bI$c983Nzp!^|L$uO@nSEQ^ia$3y3Xg$D1NN-vp=8>B+`Bb z)j=7i%xAL|ci82%uCJjIxcua`35E`%kkNHGYmFi`fBte*N5fPqE_(``{`IBrMpt=%+dc21fXu$ z6CkxcYu27*Q^D8nnM(mOrzar(XQG=8y@$mg{27_xTjCGOp->4VwK#=3{bINFqb|X2D#}lCS7ch)vV&Es(;M#TMn*janNH5r{7K=Ze?e%j&bXcW}JT2zax1(V- zH$jT(W^FEx_X7v_kj-)^O-_(Qyi3v%@hVIAmV^IJ1h56nGr7Q}8;h3aZg6l=bc#hy}u-%#>bC-!m-02&WtgynxrU$4$AOO{N^CWL)rk0SyYurA_Ec~ zk(~Cw&tVFqC3Y-yPm&*jqc_Wod9Mq-FcKS+7-0?f2PB~|ase2Y`;(ND;SI==>OuvJ z&0H2lP5{dZausvdDMyQMaEP2^3^&Z*~DVEwyNuPT=HlX$2p9dr`L0g zJ3T)Cy_%eVXU5B_x_;ooSz#*&Wd?Id`}{t#s%xohXy|*2^*syq1(4Bxe23k4Vg?QA zbBxrO^(^lnw4Mel1t@HQuKsTqFj=GhPJ4t?s@4AKfi9T(u#E>_nrEMpf1~_3v3feC zI~}?CFU3DzuYsorkDJo2zquaP^Z-icw(G~g0({tSkyw@h<>840@G?w!tR9o~p*xlGu(=?Oy>m~$s?}mbDkxM=EfXDH z%`X>|xrP^RDS!x{GKD{)nVv0W!Zp)o<}}6*>;;a1&*}Nhp5LrJ{vy}_*49Y_ZB^gg zibXj>1`o1{yMfd5sefCMvAk92gZ*z@1l+`mRg;AwCGbsu)dep=_u|Ewa>k$O z;9TDWoVD*ofy2&)q`1(Fzx*9N<_eKJ= z@%Cu^WJLoM#wG7QAov-lpwU9m{OetIA{>_AFsCv0lk0kNw~@Fh7J%%Hjlj&b9)SE( zDuvAKg2R?6;PR<^j_&*tN^?l-?S4@D(MRzy)Q>Pg7{3(r1H=O?3&HuJKR-kA zLExv*#cDkFz~HaO2m-#Y8SZ@u{MW$9*`94sY5j2jywEiY-i;8QNA%+#>Aur5+y{_n z6F&I+!K(=&9BtZD*r0_zOrH;2kZ=U1WAiF%_E?;iLJ|EV=1%$#c4#$OY~TAJ{E%!| zo(-^)2Tyr6vH&mKs7bZ>kHUBt?)et z*pt`|UxjbWbCRKZ%lUv7{*d`6H1~TbfH$rBH+blV|Ae;sNmgYf7N14{tnZ&jJRQst z>GJ4c9gnaFU4Ok1+4Qo7u~7=6z9e^6(0H#2EYG zTqTmQ1rH%<^%N%H<2zuG{|b|?t`)WFp4Q-ivvL@T&wm4$U;8Ek<_SGuc1im|EJwn8 zwu1TQ4Fa=+KLWFjWg_M0VQ~c@(18{Joz)xAM&ba1lo<)qlO+m`p{aI%Q#jotA*z*T zhVN_?h+6m~5dBrkC@g}#mS&0kXJ%vU^TlCuG>E?)_^=L!N6@isB@|(;19-ydGRFQ^ zrQX8SlkGj1>mn?~el}VsNqZ3(`^4~~8o|%jI zV%T`XARor;*a)0Nfj|h|(~oZ=I1~ui2&f@}FcYulvv(69da_B?0pHa|Y85x4uQn3q zLcVR)9{&ZZ!FFHrSvI#1?w2PAl!JzeFLY%fzTCR52xJ_wMI+;f(z@`zLPkh`;Q2sv zv@}2bKA+&@d;Af6T)|>d`orOcf{~o7dSC>TBeZZ3)2)?6QJ>B$p>ecddDz@@G@DBNt{DY$j6R~_?tl91}CyX^qFZx|rw8T|jjFpKC ze(EK$aL}zfb$eNI)u|tp^ZOiW~ zeFzSIID8fKr!E)&VWwDRK z`qr{x>ofTLq7v-NY!&{DJcwCIu2A1(DbZ#g21iD^Ptd;wRAn$3%*xmq#%5xQ{7u6| zizU;t9PCdd%l(d=e>*UHmZJbdM7(R^TIT8fy6;dtOjS?nZ3lVm5b+Y1sP$bV0M$2F zrN`r!kMJS$pH)yh8CMxeB1K_MdnH2T;i3t5Ewgx^W^T+rskk3=)hWI#dDnl3?ycja z?h${%I)8uNBN>C~@Rvj2jhh&0iup<>poX{r9OQG#K0p(gBsW)arsqGRCJO^52V-%E z_==nDWaQw>MtNyfw?@7$FHP#@Pk0H#VI+TXKh%FVJnIoTdRiO?VAULB+HBa+TCtMT zJ;xx6=vN^w2Rmui>wtgBX%~*KO4n8lf#aie_sz~)tVl4v;P0i?@GyKh4!h~%j{@?}=bn)_p*2f`v1 z&Lxd@oEFVEV$V2bUv*O8`bQ^EMmdaxC+%%}IDPFZKShm z6Oz!T{~c!BY#oB|uXlKASzleRRK$%8H{tf2DzpTHX%Aw)*Bdc|d~Ojl5t7E?X;PFu zaaY)jA1_b@Lgxc^^P`dQHu?kfAow_X;;7kF<_CFz|ITM%3Jm5q|ANe6#K#DTq(5ea z(dQO`y9STJ5Ah@JR0l{uW7^FQZ^CKaD?JbCPYSWxBedE>uRD!>iL%ovIBJ35#+#|1 z9$!8RLVWoU3h@3U%y*0OTFUm7$J+x!2eg&Q})MAZdLsY));rh;!vwFY&ZU7z*KT@6H@+n#L77DmAC#Y2@%CqFW(Ue zD31DF@Ttyx4v%lJRkICGK!EuYenU*6^qWW6x5)G1LH}n2qU4IAX7|dH%JV6f(jb=7 zA(k-Vt(%5&<}*ssr+-Da zwEK2>pK=CyA4Sc5x1r-IxHzt7;(^ip(!+sVAIm5Od>c2#(ixL-p z_Q9#*S=19EcTfGpE2qaWA*QZm6#3nLL~a(dAB;FSuw_hp4g)lS$DCWCwAI^$`&I!@Z9NOZynJ$Z>C*S*9zg@jX0RcKc+dhA1w9|98#lv1x^30I02&I-4_$n7 zIdIc-5)Ph~&z$2;g=T;e!76Yq0~>|6x?P(M{pI+o1I&(76;f(U9n_8hO~;c__-J`D z`iAhGTtYy_!IbUmoB{bd0M=X{Fc3BBsNK_rdE1e(S?7*yb|a^wbo=oJsS(y~I%lH8 zv97a%wVk9Q37Pj}iBRcz4+PL-k20`@uk%uURbveFd{9W&X5%)2FZH%B5LPHoC48yF z^;2JU@^pVFLH(=>efuVd;(^BK8AtU2ko!0w_eSRoo3>^rMj4j7ZE}25QA(BT!JM4G zg7k%_T4Lb*Gt&3R|M&ED{qsMi?|QP%434ynZT2^UFZTRnuB(DnDw^Y+tVj%s!blWF zWjnm|-wqaZeFGQK1xy_h5c$J$Qw@QQM%h-^=(8(x5J1$63iM{8KVyX zct=6qFUEtqZD2Q0_dPhaDbH+%gN(eBKAg^K{;458-JdO>re8u$AGRXctKly?gEPlc z@j8HE?phqo>PlNrbH1)!eN65$!bY4swJd>dOQ~%r#t*`owAvEcqD%*mF^^0xcJfwrR=`KXxyQzMmwxR(Cr{DM^0xXOq z$+emil$Riq{NTd}ZZON5#Pe9DF10?NS%6=s_qHUbH~VU1+9di)Q+tAsx%+E8b>NA` zeg#a>XWV*y8n5C{z1`k%h)(42AkWzD@azrxK0CZGsxlex+YKB?lCPbi?H`919%ZP* znemwu1cY|Gmn8_CGviZd%`SWXcCF@JzSewRc9uHzZVbQlVq9rF9-om!YXXc2pXMSd zIrz32Zx~pExTXFpX7IkLdYXT{^fJ=t9(HCAzgR8=iM1}Q`y1Q70bQ*xUWFB|Yd|-Y zc+ZqE4OPHcL%(S zHyrnL#{Uotc$|L@+^$tGL)Y-Mw5%Wgmbh|QBgtj+v^qUqPR|y&u|sNmj(fJ514pyP z$d;<6Z~MjNm{Y3bD2Xjj!8yUZiIoMYsG#=E%o6-!Y5b;mOUOe~FeMES+}V5VGE9VA z!fVxskfh+7U2!&&ipuzRHm@)F%0Gcz=(nryckv|V!dNC@i20`>+ug2gWCNF2$Jadn zg0udo%whMu>+l?4{|FZJlfhOw#V8K&sR@)iV830;^NovxbQOUAfKT%9G9E-f(`p#j z8k{>od!i0cx&hxZ{(|Ty_zTa97_=lJ0nh9*pY2|pNJMz1Hr-HHXF5E7hv%S)8yA6H zHPnJo(q-{(y7qD8=w8KV+8TvX2f88PhEc(aOR)KsHo+;%9hvcwWq` z!tehU!h6pp5KpPP++9Qex6o?8*x-lR?h^9q4(=1x>8MLs&0uW9JILdDo`r>|cS{ zECAqx{Dis1zas1f=SNqe0c5(1cgsALnZitBv00CFHA#e(y$LxNx+aElPJAj;4UP6* zvrpvt;*)nn|LU%T{J~bRcN~_88QNm12xcloFH;o%F^Ddo$)FM%k}qtWFX=YzdH91X zp@2;zoFpjpZ1-%#`sox$e3Uo{=Il*;{E6M}Bfkgo{0pb&gn1yfmrO>Y_5%bIFvc#v z5O;l?dri+RHklpM=@6X7sTYT9;Phke%n4ti$(EbUz3H5L;bOy#Sit3V9zo35sOeGs zr=Je_Pd|mF3+6|YKbRl)@E7x={6c2a-c0FtM7}?tc>=!$wV(&mdAQ_m2X5@l!ixja zAzd;*mPzFmx6fgtjmE>Jy76Xa6>$W|F~~P+9M<`R@8S%s@*OLrY_iUGF2gYq;+xg- zU?;?c)STU+!&z;qx$X!L>_F<$bytm%;6p3HM1BDq#~UB}F3645)MEm0H-A^04K9QH z#b1%XyZt&;}LO z@IVjZhf?8n{L&u5=lb9?hSJkaL%t^d;$51@JF(a~2AETT0LaCJPKW?3kS^x+`1AiB z222D3)2jkQ2u~zaMK=Bxm1UDYkWUW4OLRIRpKc-W3b*Z;|87N&yIk0lcnC-jeehq2 z+usJIDXY4|b0EA>p@_D-T{t2fs$chPSE9#i0`DL^g$WTHlrltYNXig{ zB4rA+=i!8BjUV8ULxY>BcXLY`jLPw3(shUeWDj2SRU0@KvEU3EWvFpMSAy4DL9KP9 zE1RPWvH)(OJaSiHHccXf1x+?05agx~Hl+@CW#djrN(B}HK?^$nEt_r8!U6AUeUQlc z$o&}-S0js51ZC+;Rps4U4OIbBsTRM~|8PEO#ZWz8xsR?) za>CM#2ww5{1;2dktl4c_2c10z$MPE;z%bi&8g~SsHhjH2(VpM#Pjcq(S*hdcKLFOD zUEOXst_c(ww$n5LaDKR%ONtQO|3M|r{9UZa$*>gda#4pJuTq`)z@YHT;K6{1U`I>8 z%ZreybQRVXO+mGG-BO~TfmKBf@bxuXaWW>30REDk;3rzb3iv8e@%6#B7Sp^o8{pQMv z5s(HMWqfr$cjo;$IbR5`47Gk+hXI56>1pB|^HUvvF+a&K&#%8gF$ER(Wy$bn=Iinc zPUWxn25eJd89xt8NL;UmV|glc(!`h3In)+?C1Fdv{TqEOibzK?)^-a75QTd-xEhkKk$+K zGurA0Nr0ol?Qn4n+wF@+uQ3~E7+%e+LT1|NveCU)Xis$*2@qEv63U5q1CPHBLQ^Q~ zOfbg8VW3xLJMy2;EI`5v-c7H-ud}QDAPnKEM$)8|d*;i`J6VE6FyG=!g0*^-eBJpAS~k`!6rX4ay-{biUa6o04)5`K6K zS?}5#`(u`jz=C}sdZ!ag-tb;Y_Q;*Kkc`f(tqEKzb-x0h$w*iI=ntYgcQ6qoo@96+iwf1^$N zWj))fN64YF!9}=C>I%>YFRnp&(W$TyH&VeV*T6V$(I58{K2{G{>4ATQ9d&z7sC}Qm;05Ms_40ze zSR0N{;iay(Y1}+}0)gu}TX)8CPUiWL6H55SCZcbvKI6_*S3^c)r(!6>VsTtJ4Tg8!S$YM-ZOxLE z0B0^j@Db*(o6$D?<9>|ryAEdzQBy~_!Q9D30N1_v0LAz+5_E0 zRr($(?I)EYf@O?3RqAE8qPj!H=bkIjsf*Z&KLApPaSH~@E~n<$WrtJHN;T#>M}g`T zr@vwrtG^)u)UQ)>pRV}*gCQR-HPS}U@`XSVQc{|!fFQERJKYNR` z$AAXdP!pI7)7E0@6pL%e&QkR@}szj9322x$-()= zR~Hak@T|}5e6zc`d#G50OlT8eNsFoR#tm#Z9`b2Nox~bNv+;!b^+DTzvv~Tz?Z4ro zK{XqKgpnqWAGRO?{@aTdwLc5MZN5XvvyIdzZEgEtJ1)#_hx^uZ_O^YF?Com*?`Y{% zvXp`pLk#XDiT%2vovNUX=Kz}B4K4YCL&lCs*6{j*A4W2w$tt)l_~QV-sEwA4S+#+p zrxCbKf`ej%6T#hpll*O!4kxZvcI3B}enOP#gr-Ch$pO2Jk+}3$#oI5#7t3K>D`W2W0bE)@J^{(NREa45$1kAbBAODgKP?k z)v8+{f7ZPb&9!>>rN&7VY8wkPM`n zex;ELuBE{M)SSZEf+P=b{?Ff2&402M&7&rM4>nB-LRwW@g&xbS!bhH%fxM!K&k^5n zYr_NtSxPGk^T-;(pSmgGJ76sA?`{f-SNOLmtgN_PiIUBwSog?L3J3_GV+`PttpgDx zR{<&|Ncfd|cCz76?0=E_tCX6@$almS=8+Wz4k#0(;KkNhr#K`9jl>P}S#KNce+aZ6 zlua1zLE@!c1XcDNwoL7X^3&r>iiAjsf)2S&AsaW&SG0XNyBP{3AW ztt1FG<CL*3fd32 zevjT?#Q9RPK5@rg2_lcfs#usBy)57y2_ly9+zi&c*yOa9yjeG6T;1_nkpIOXgiDHlzU$#Yx|Y(f83ad^y!&jC!I^ zkfXiMjGfr2Yuk&EuEpHrwFZdiMUnlMWj=?FA}kEH`tHwhCT)di_e{& zt>T}C8&1Kt{HHlGS};{$x73+&*ootCh^OTk&}A2s9@B^5*3xL?LEZEVm=DmioFMqbWO zSUQz`k1UJRVWn45VhT@qc4D(jc$PMriV`sF-(C$etjeRUQI(RP*a)q0i@Cvd5Ag)r zELBqkT#O;6;t`Xp6ucw{JHSwFs9#B{vsw9ds2ox%o*LAGZ?9Pd$fkr8IMbD-!~$)0 z-{EOQU6FAsB1FwkiL?9mCMdO{Cb0Z^Qt2wrN$llRa5O}W)j`C?x&Z*Z|9929VA~>U zM9GkT1-r!A>7vd>SR#PySCj;+oEcT+ELOQHs>*IeL5lTJHG;d}i)q|*Orl>Gf^>Pu zT>aNB27djCYm4y%T@1bWSLtL(<^Y2D@VzA>QnMqgy=L1>$AO9BQ17r#!M`{=9*3ucX z>rTyh1l7U?3|d&28z#hp{rDkAY&-Q;%rSNxe{y6ap0sGL&g>?34FnQC#R)1fU)Ob< z5dZ=1t7bGzGg|v%INe#2dqsUWiyI%YUho@`l_=NqT9Zz%LG<6W4nS0 zLJBZ-E3-kELdq=kTLmVJv4pf+;TAO)9cW=PPt`iI;kA|uzwmudPm?{n4Jt?#UhLWJ zGJmo^AQP5=L^0G#7#z{53DKRJ_lk&V3;^_pVinT?3!#rz&vaZ11I<=?H&=RRGp^xp zTxTMuCu2!MAKk(gEtoVLiWb!?h1`Tfo=|0L+fxYGLw){VcbVkOZfA$*NM9+|XS3_< z@Z@<>RJ`M5=`doAqQjKzvq?pC82Q6{{rWEs|9;bzmw9aV<0f#PqzFtzfW9_EFcD{A z0(5PH#t+vKYBg0Pwx#qJ*3!oxtA+guPRh21kbNlsW9@M_a#EFo?vAK~5F~pwnA(yD zV0}Qb1vLzFCsh@!{y>lJ<$AXin|CdS#uI<-*0rFtpioep1joK8FSBIS$of4fS2}OT zTmWY4Uu>oIeap|PFY=l0F@z3l8NB~0z#+yMn2`d0z1xp}&QKOy?n1hmI;efdv)iS?EW9+03WqvR4B26%;T=r$eu z3o{z$7|8=+^M=I1(wJS>^+j#A$+2LjhO`4?;I0X$3iu=7bB=D@fUxUbqgM`q3BjiQ zTv;ed4~bTIE*K}1t56YKbqL7-%b;f5#PN!eoddECfPc%t()2k-YC~Nv9Armi)$E_*Rx;)*aPQT6-Irc2e+g&D#}=bEpWyQdHAk7MB}vACHB)2o()742bizcusn@n-yG{qQAPsdqp}s zmP1J&sCRg-Nbe?+1d^7PJHbJ)@Ne>*z>siw+7TLb`CgdQL$V6~X!hfK;Bt?U31gmg z=IMhuZg1{5fCoC-j?Oe3TG>x&!do*!aPKpf7Tc7~yD zfvRi=XW;BfMw3%ZG$wINcr-7PM-{=scr;n@ zC~W85OuC1gK4;)kNNQozEs9M)zEaq7PJ9xYk=~KgXcOkq8;k zevv!zav4y^l2MT=qN*5>(CrMgh2HmInm_4^+W8|+<5(#zq1wakBo~&&zC-Ddyspv6 z)pqFZ%W0eBJu1FK6AHiIa%W-o7XNuXjoRi9)Ayu-LkqyM ztIOb!GG?8&s>Csfo3%Bg;s1y7k7R(AI*+qQHSOhCh$mpGDzNNl7C1bdPB?V$jY+yU zAMU$G5y45G>%{gfpc$a!a*Wl#L^kLEmj{SD@lS&7c?mY)JD`(dZ-{*>U95AX$orsG zQ6VYaAl5nHc& zY$C&hr%#ShMPGO^SW}Gr<}&rTmMxnP$jeUoE-COoKoX5M*Wy=YvRf&(P|9U^LU-1} z>nz3`h?nm3C}HdSgItyMvA*Z#`Xmv;%`0uX_GSk~>hYaCf7ViYiCU`%^bWtC@i7>XanD~#%%VQk*n_ag#IQ}5*kD76a zazk?q)Y^-vt3qMrE&ygY-8_&a-?+wvE0^`HKz(b$H|j2)c8Ji)p07NcX_meix@2MI zMg9fd4Xi=~oKd-w?9sxV*2jB#YhpG(qKySgN=LLH3X};_QjgH#KYQ}B75#B8wI0Nx zUY!Rdj)J)*t#lr=Co0*+*j(4DPhtSVg|+i-4n!^iJ`R!?csBn{-iV^Ir9(z8B#2NL zICd&M3^UDc8>}6koniNId}t56YlqZ?8+^ttIa=`%0lUYUafrOdqctBpGW>L=O%}2H zvqn6_NGjod%7#->NMQt(rPvMsB*v!wxY3^|@AQc`?hatI!!Whmp%ophgZbtPoIgcZ z)y*I{#egW@IDd37^2Mthi6WDG#z*^k;jxw*gtk*doK_5(oKG;!) z3t~)Ul~O=0{VmWI#tjfxHVcg4AJS{R6Z@(c9lZL%U}~uaI}Q05q@#PZQ+B-=Vv{HdFM3d*YxcY&owl zec(rledq%_!Z(bpCZe8rbG_L0UF^)yM zVp^V^>dfB7+Xvb@yYq0q!LcRZA>`So^6a;JzDD@}@I25Vcp?{h4yin!K|@=dzpG-X zeX}hM1dDkcf*_{z8lbt*xFZ&844YQ;PsW!SSVVp0sRr1`;eBFTbt>krcgMnIM23*R zKRz`UWxy;3bHMgOMAgAXVCq^wy1r0>$ENJ;^Z~%{NMwQpfDM*oMrArE42n$n4x`Gg zQ2A%4(ZvEj;#XtVM6k9J-Z6spH*e-#&EOlD6jNkU#E#7k$lShSzV02byH_T~l;2Y| zHOJ)?mnD1(Tn!e#0o9Dxy%m@?yJDA2Ro`&d`Fc!rm_9<=?t1Jl_w;SR1&A(*@HyX|JIbH6s^hdlD8jG+&dS4nW3?LPzH`pys z;2iUJpya*9I0ts^uOEOC=N2NufvxReVfIOfu@uvChZ8qUKvX)tqn!C&6|eapvO^_; zKfcqu2&Yq||4kJO^lY3WLwfc`r)N=${rHD=-#0Vt8524fgTW4VpS5W)U z#Z2JT{<`1p`|RA=#-tZ*ZJ*jaTMM&0ZJuwC?zj6sKi8K3;gXAN@K%e>Kji`jV~X-W zEl@3ip+T^c;V15i0kd-cl5Kde<+Lg{6seEw_=VMBt=M>G}esyV| ze+b@jJzgR95j-FJ;|o1LTYjK)5S4HnuFXJgnEYX+#0=q2hN2e>M^fKuPF4ua3iqZJ z%L;LfsO`{tOOf6NrkL>kt~+hnftkj%8OF+3_>fVP)7*c;Ux&8<`Y{}|#>PyYfQf3& zw5jxNb64Zr%-U%K!Af?OzZBn0N^z4ZshYapE^Av^ybPnvgm`Ctf2v;UiHTO$8_{wMQz+*7^9Xxky zk3sqO2QpmbN(olC@9V~o!VUmeJg5%yPO1I%{~_&N;G-iptuW073*Wfl@`& zuOe;rT~{raluK60|9Q^5v-{>vu=e-o^CA1*o|!pk&YU?jbLPwhi0AYnXs#Hqb6>0b zT|_%PevqS+mIM8uDNutu-FLQ(|4nQRCW#H0*Px&RUK$7cxmv!=bM-$0^B7CI5#ee% z&=;oycPfAT$W!S4K!ND~rC*JTG2h96?(Z)8=7z3QT`=6hH$6WQgd&J6VJiI|QuJkU zB$&aGAY2<+NuZkM<cs=k&>-clb(6+Mnkr9qqgO$V`-5){+OqNiVaI<|T z9%Ujc#qn8vXTEhFqA`ekPr?=ShZ(@HO&^-RukExp2GecAzz*N>PsvBi|3<&W@AoHf z-1bfM-x8%CUYX-RyzCq3hZJzpILZdt^Dtyd-v-VdI@z!TBW7U(;-BNv+>AeVCanI- z&V=C5)AK;lKY<;-WB)ML_mMx=bZ=KNV=#9zz-aiJaH?y-GBl&_VSNcZ?~OGbeCQwC zxRw0qR7Q4=+aEsxA!y=CR-Rym8Eb^eRIi_wAl%%lU*jQ0W;@1n^qpERabJPClxup0 zbn1XK(hCj)j%*q6S-u_Gi{RiDBd~waO#d;~Q82u4Q2}81CSP;(hh)kTej$yv82NYD zTrf&?i{<>ZkfXU=ilExLjP*=bfwf+LftX2=ckFsw%<>GX+7=~$+eXmHK)QR(Ts*gN zKRS8JvS*nmJMEPbokC?0DdgT!b4{H;CVY z>(f^b=3h>JL+!x+`Y-jv`Ike=|LiYRSSvs0sE+=5JH8-5kLA&$PoRD~gdbAstdD%^BUw>m;{;s!+F>(A8fFee zLmc8H+%@9MZM}q&$YyKJ8r#KVAg!8Qxt$ffjpeQ>K=6*&B+SRj2|U%zKMRFC&Uo*f zUt%Z)t6vjs-XjV4pcf%6^91@Rm=NkFWV@mMPscrKP`x|@H|i>0K0EPBCKDKnn<;CT zvcka!O#FWia}dM1GH-}ApNXNTd*pkp=gJvn{`simf`7g$b$sOngfJ*txHWWX2|}{E z{e$0B&r^qzz{->fh{a8{@EVct^u zkX28kqztWsF)(bOi1z{HQ4NDJA${=nvQY<1t?6HDd}+=9PJ#qk;<^5k3u3PIkC|TP zzlRgQ*rek*0U6}E=@{e<$8p1Lusd}87z_Uyb4Pe_c;8M3Xi!u>fn5d1#;zdsALcmF zX-$ibOku-yLV7RHqw?0$?J%HaZc`R!}*&cx?(>7Wx9pq6n9fMEXT(jlT+bg*;e^`XsJM__j!@Wbs2Z+8} ziNul9*IlslB${D~zcfzd5957M$$Bo!5>&!2&i zpp<9KowzeTZPsFJ2JM57FDYvNA|6fa3#hh_F3ya>5PQre^zU=$9ju&Ly!LL(mkZUy z-5S5jhG2ZWjx}?e@(lf!xg#qig-n(p6BK3g+PnK;N7$@PZn?Om$n!4)Ip1A?Y(J>1 zkWC~yZ#v~D>F_69#O&ut_7se7N&M}yjYcThHD&FXj8HL7A&0sz_I_F{dvM{FV7e&^ zYHjx$IEj*%04q7;{G!#c(YiuqYIDhv%8OA|s2$dpKcV&#ly$QYZAkAcX@ww(C?FNt zT7nT87HrT#is@tdQFAHKdl>fl;BT_OqKbvBdz|^!zrUq+0lV=%?6YrmzSG}PWQ=bh zgLhLg@DG~6Z0>wr>Voqp-Q`Q*P#{u0k4{9;HpO&zLVp@{T)ywS;Kg$fk{9&-orMt+ zR{ob_+`ky*!T0zJD5IY?TK&(;u9*D@`ZT!M|Kk`86N*-Lc8y4hS(JcXO>C=wH8-$m zmK*c=(x@a;%b5B4JIFCta;#L6Lb{i(O--}L#pM`3&p^ZKHXjH|WP5ogiQxX>%nQxR zFMDv7ejFqqQwo296#l~CE_Cye;fFOpzPF$75A3-cV=VA*LBxcz_836>(7@dZrx*Oh z6dIe~mG+O}VSRsS2T#{5qn?3gT<{fFCbBZK(Dxbjb%3nw;@_q5n0&k#AvSJH!?)1T z@-1{Hl{1tRGl5ZIZI+me{gp<2n8{i!gl!i!1z#Hj?scwJvP%VQOQdiuhlVn@umC(< zyp5Z)f5y~Ln4b=X9#ip2QM!iL@zmJ7UfyEw;3Oa-Zy{`9y!i#toJyR*8aQL8W5j812(mxuF4qSPprwW)- zi4Uy&Kw>s+Ta1+yi7r2?CxDR$Q14qGnO7`82jDpoZ>)KUFTiqg38pdT8<`otlRC&d zzEJij*WoQ@d(`kcVHS%3&hn}G@EWk1CLh)SWEf|q1$msoj%OZHg=-o09UU7E!9FtE zY2V=Md2CO}jXg!Qz!+__xaJMwg`^Gh?o#2Q;~UQq^mO$z>RDD#S7KGE>i_t%;Q*dN zKxF$FoPLCbQ7QS!#VE$U)hN0pA;QDC>|UxGgJrZ@PK&*n*vEUt&Jp}@ z^bDnbl=i8)9#7F0mqHaPri|;sl=@ND{)s??gE5xe2!C$aG8`ENSw>N4sAvRgRB4Xx zk!Cj1H0Sq74;V?Tddom2)~OnaRMvNUr15zc(zvKc8cH!pGK-;{`yjG*Ve`M^q0-*L zpysXf#3C4YCfm?eqTVBIXaf?o+E80PH3i#{(iFweGSoLpt0SETqyu!HI8J;Qc@D6% zk5A#S6a}4*tvOJ)S4UDVl9czD4@k09-~5FA1Ui@al;BY$t(k=`*CCaCfM)y1C%T7V zE)4$3hDK|2pkKd;=wh^-u%|ct+|Xi-Q>yb%pT9>^!2D{j_7-uVT^g71r=UEHVv0np_S_QMh=@Zzwteh{JG{tx+b?V%ryiPbX_=jT;eMM|&58UoUZ_@e6-;M!SPqWYoGKov+o z1D$>ryeHY&^t_fejp!?KZ(4Vjndkk>&KPmo)kNEV75y8~iGh9?91%}M5San_5z@IP zg7XS;_f%)soxBL=6`VY;`a;AS|Mx8z!1xjl;Rm5N+TrB`mgwbJ)xXts))}5lfv@YF zWi&8EEjeO5^fz4bcr`=>I0fHN`p1BC@a&H(iEY7wYsQ+bs1w9T=)An<-n!27s;;W* zyr?PZ?h~hl9IXIhLm~Z^8sx)(YEe*;Jm&f1`lmwq%raryA*H2N> znse$pZ>U-V`lZ;6>9%DS%7Ya4;kvH#*6M*XJqC$sR=vre`osSFLta4v{omxdB>g0rsk z-s+Ss2*<+*U*L!RGs=&zlGQ`>)Xd_<&634Q{PfHM@As?s@Av*5M+BE(W%c++SaF}mq*)YF8qU2txKuXOdV!KvTR5>EaBKRr1q@`L)V zS%@IdZvXXYC)fxDXT(nUZfq@!#rAmC&*JKVW!?|GM^I_G(9Vr3Psxbx4F8WfptCG0 zLp~9$5gdfCkoP#1_ocn&O;3*4zWA=Ix#eJ=;{Mo^aUyQnC7?bvu?VdW8w>g^I*3$0 zuMi5pz)w#KQ0T9sg)Z_Oj6jIg9kL-mBJ#5phyyX1ivuge2I9faA7o`z-e=Fz3y8PBJ zru+`DAf9lXvF`1VoWxZwib5I#6QmeD){&^c)rWd5>ASn0DfNl_DlTg)4%v41Q_+&>z7jP6qIe zn=V3t@KcFH;KdubVa6J(D)|jMcGY1cPBypCv#^Mu)F0+ZFw6*17S=_Q@_>kZSK}pQsQQ6kvM2_Q>E9Je zfBJt*f8Z>nkI7rfgZ2rwo}8_$szkN^8p6_07#^{YwS0gL6yZ#TB+XJ)TnI$6$|L z&PUSUa7hUBlWkR&_d{4?$4Qq-E#OptuNfaCZPWuf<=YCax%9y z^WaaoeHa@K?c?gNRR~d~PFg52oP$96vO-`f5e`3aIK%>|;r;nrvXI4ZpLiDyjTC@r22}Ajx3&;M~RnCb=}e zzP)-0msEJ?#$=X`<%siF|Ei{yScFg+)EJzF68fI4W|dUA&^KUc_pX@@R-?;9n@|bS z;fe!lt;!KPayMp@u#%vPur_{NqZnG4m2@Nd7(Mlct_Cw$nBX^w0Qsb|U?ihk2amw{f*bDFjZ)hV;)bOR2!?c7s}je$h|CMa zZeWO=Adaeoh-?kcrs*W9VzbfP+!U{j4$G`Sy&gaU;=8gx_`0|tfb7F&A9_{6DJvhp zwwVkuVAo(9Ea#NbHNmD;2JBy<#~ijJZ@Z7m3urnozoCG$qsvCYV*StN320!0e=k4h zJS9Kl_u~gy;_Nlp*T0Bm6HNYGefUfD;k)X?hoc{cCiqILkjHUG#NVOwJguU#w$iQ-E;C91bVW@FYg(v2cZm8e8YcOgvqD@WjF=} zes{5hLhlS|48ak5Cnv93miCkJLTF&+5PWvcT`a67_qK-H4f0j$Ag_GvL0vlzO!1h(%VWT1W5u2$!V4&o>NjiO9DL_5_!1Z9{Y)t$5au&`P9eVMe>*=$(f30|Uxsar>T^Lmz^u%6<&`E@-|6zz zrn&MKr&Zq~qgQIaY`QLCg*NZw6J2m?6K{`fmv3eYCm*w1zA3o4Ce0kCUSCAx5l^|J zeoKAGI?=q}YBOc4gh$T`L3#yi$jl-@^Rl|^idp_n?@T4yuSDlN;$E(NU zah&z|Qa;Y+UiBH|0m#Sk)@<&o$Qd$WO6`m-JTPrPA*4u;L+ACZIA+d_X5y%u^whO08+V79;0jd1QN7s9PSivF22 z%^dN|(Sgzwr~_;2(R;yVvQYLVxC!v$$_@` z76`O1V10pK1^1+k1O!P{_jmi^jLp*$F%O6hG0iM&BtNV;z>A0@I#4|W(mfRVgmt5|AYRw@Wi~LkMsK2H?{wREWReSH?&Vv7o<6 zOg0*(?bfYH)+eigDZ#*$h(t3n4V2J_sR%zFKniPTWsU$(_*Di)XMuTsGMOTe@vQMLsCVhJ z7aTHLvb){}y%_JJMFDxP_ozAjEX9*7V$Q{>y09eS#K#@usNcN7Z%)7=?l@9poXa;Y zQAt@}(29W7Xu`7C%w{(mGCU8H{`#13bsv>Rkz&*JmR%%8;)Ag3yUC@NQJeqo+IST4 zbpF4})r`|k8--hzKQP7vFUWn98iV;0N-JTs^<4?3qdIau1s_0AW2%$ofC7AJoEd{) z1r#-FnB`A6n~08stR@C`M}?rXj;W6mkwBe9rRVMvB|SqC<3Xfnh6K=JgD5D+I}3r~ z(qg0#vqQ-RWD%>2aMdqQ9*KD#2uXF4+jj=#3H?(7O>Ioco7o4+;;ji&6NMcB1I%(NqSZsc`&_ z&P3BJ<#*XBUgC1J7Z+7Pxz%1=uHHz+3_!sT29AXGu-cD{%Al{bAECCH4QK>e=O9@+ zjqY@-*l^60bbqT{n&lr#EZ+24A@*q9-y5dAs;N3L{GsY$bJkW?0d@-LkJ?cIMKX-Jn<)dSOcr& z0SlMmDJYW&4F}p?E6SG^KUvN5vQT~u4%ocNgYY*kd z8HWru@~q%@oYVa5e;3_?zSm}Zkcp@+oEd=j4`x`FKpGXiZ~Vk73Z>UQm-Cn~pPqQ= z6wRmoks*yTB)Sv*Du$qo8cY)d0FU^qpqrK|8QqBdOd3jmNpd#{`MeMJ@c_e{Wh9xtj;r*!2-H1glD&wo1{fp>Z z-M?s!tFY{6MA$)59nxX>3t6IPB=m{QKF@YKin zS{Xe`a&Ni|$~kp0k^#l&z4df76!ZTs{3HbIXNc9@iyT(srJEvg4l)6nPvhIH+M zxr?zDhh1P+hDz=bv}{fy*aJr(jwkYr{}%+F2+` zhA_%sii-4KjYLnv78<+P4AFT2rsU4T4CZR1KTC61quV--@cAoqluSBUr_RABce#w|~Fy6oaN_I;}s&D||f)w`U z5I@B1ZnXL(0BF+r$KM^pJ_w^|b^(LX|B#`W{BD(8IeJx`9)}mlAh*Mxhm3fS!eAe_ z;w0EKdO}2FDagdM5aK$#suJ)c{0ZVg{`y0Z?x$0~#IJu2 z=|YY&*rCrb|AtXgXc$|tkiBv{xqv|+24iNP%r|f%0x=s_kdWCFScqFT4_pMTkjN5< z9xQ)z9dPL1Ugu{h3!4_MvUpWaWhRAITCs>lK<+N{_*$hEueplEL8*$l9<^Vy&A)-7 z;612EM-dy9C2IcX&$_ZlcNcN7FDoG18Me7O6g>-SgGVZeCq4 zCgsNwlhT?_%NzVUKEMJzrB0sd{Ht~Tp@+H)m}*}u)cg|EjE-MP_Lcim;Q7_gDHCp6 zZKj4~#O=&;*UsVu5JnMTTLw-M^&CvV)fj}bsY>9QIQ;Zm&DbYNGd==?$8g%>98RE| z%O;b}aHjx@A}Z(FX~U(EZp1z)^0dYl9dALOjJsWvjpEkH{-VT&y_1c}t+3@%5EAQP zOlAKf&l~X~-;9D%iiaP^E-WlYiQuY|fTkT2I2S2Ef0^OO6z5U9rz;9j#VBJ2yaT^R z{EA|4+o8$Ei;0Y2)yPG=#3Elx5Q|t{@QSUU%2wFWRXx~j`IVwC8*<0+nB^P{kwwO1 z+e-X}@uHE2^$uybOdNRFDF8Dg%C;77H(3JND0F*xCh(pc^rXKeXI?H@B% zHGmMTXTt&O4evIwNQHyJ`6v+2M>i*ut zEvNc49IM7`W5Tcsi{++oJ?X`#U^j#q)L`&qw4Ce%zZisqJc%|EN_ZKIQC;ZJ(XCM6 zJPd`(?!kO(i>j?edwkVJ-$DC8W7WQ+GB8vF!bTYpUXJoGCB0O_lsr16(5u}gzWbe$ ze^Dyk+8~zMDQS%h&u781&`W27%n+3GuqP}FK$9o^&+2U z_!)j^HOFm;r08w+e$W!`gMuRlPR#MG@cW6W&h{@n;dvWMs|CVmyf{|X)*hF?D1NLu zgw@>CEumQ@ley_&txVL5NI-LE$C*saxs%wPhN}; z1bV3;$WE@A^JCaeoRI(mSD2t6qL0hh2hqp6+Fqu#JsVdw+;iY-h~OFck6xI)m2be@ z#;!dSwlkiMtvVCyd-@%edR$i<=?}f}bu=ZcOzU(MDowR$tDJ4W_1i*@Cgri1T|1`H@6{eW~L4AS?RljBhTBV1n%>6Cz zFS-rPO=)C&ik5%$bNk|lA(F(fL?&f;N;`3TNw zZiYhw3+%sTwK zV9-B~U+CGZWj1;?Zsfwn3-eRVy>scopS*0`q?j!b&KPt`Fd^XC2~Frvn2X0|3p#O8 zeuIhC;Fovf zOE?VW#!uflm+{h9FhK^U?^Tu}liM(bD7&8CHPf!4(^>LJy!8}3hs@dby$P|nZbE<132UcH?~2kB6_5MFD}KXkL=k4r4WK zJS`e%!t-2|4{Xq8yJ!E2S^~6=UnvzMTju$J&pGdH$yeL|EB>(g8#Gof_=BsF+Pbg}ST^nb^?_kS<^KlFdaN`FF6j==x`|9uJPk41(0 zk~8sx9o0#$omZ!UeK817i}`_NSSG!)t-hb9pf=m;Dy~l9>kzj5-;x4XQtYO~syFJl zb`PlX9uNHmY5pNw(tH6wR+^&XtTaoRCZc+J3NDmHv7T~E3a9I8U{Rky8s@*@aZMp54(yH`Uo+}mopM!i9ZLk7ni{mp!!B^8-vC9Q87m7 z#^j?V-kdYJ_ABwuIumXT=KZAf6@DfP&1JNxg>sf&jU3dP zOwVhz%Jv8}K_i3O|VLK6*k&(f49dboRZ~zsdV=wP28VO-Tbk@9PWA#cPOIi-Z zPxV#BC0^qjh%m^5w<2ipT=*C7fieWkI4&Q1Y^wjtIQY)-5N9xG`FF^mv!?EhhxW!% zhdYboRG)2NBI~@jDXj0A!{oOWlRPr2v2#ni5h#wKs2FUTccH;3HYxwK-&*_$9=3^9 zL_idOjv;sO2Lhq}dwS!~pYT;Nx5k1y?*3bQu;wkznvw64Gh&~*@(vlRIq9Q3e%#{_ zgcNe-PyYEt*J}A=267O;KYN=9ECBG3kuCoyR_Auc|TvUAV?Ag zk<}jjsmExx4gDuZjC5ysmu0|b*{B+{9a?k#gsWK2v#oMw@pXo4&&Pz8ya z^3b)qyk}!;1<6Z|kT;d-p+RS3$ddv6zd+q0HzAL+kr&A*n6=>9UWk4^a@AcqDEa@5 z!h@d?{cusVl3Blt%DU?YRAy*EBTamOZp=c(R;80;V0WAOJo))X)q!tnhwP0#I^WQf zk;c}`g_18iK%)$hs=Glqr5y*>pOrK3=y@HB2sz#HqGHZ}wdhWCQJF5Q7rx^9PvbZ+UYWByQ(6f$=gv*lU zHc`Rm&(TYX-jx$Td!bA{68@eC+8_aX{QYtU$TjCY$^;@E*Y!v*)N_a}_|wck%}Aj~ z!mpc`8@Ns-cIQ6ZL%2szybh%mXW?vD-55`nAP4%Hx0aFA(~xQ9jhF*3D2~ zW1DTG0!%F8)C*~XsJ`cdwCB(s*?yZ*xa(5I&O!cP@!T1K^1@EgO zlp4dtOROSmElD{J$Sf(Yg7-&z)o67q`TYq}Mj5kNM%(yVGzi&~vT`fFC`20?zOs{7 zOEFqah`A9A&A_cWM2r}WH6hHyF@Jp_seytjhni=n&}Qa5Os?^v^8J)AUAG;yR>O?b859F%PWdwZu+`D*ql7!ddB8b6zQNq~KOgVdu* zd~_imHA*`bQ^`E`3yXMBf<5h{rHX!A8-ObiO@RHJ+M#oAFa!D{4<5f5tU;LDXb~l0 zf*z_6UN+RM{z-}E+v`*5~W)jpuLlg)GNm-JsP*f25C6_Dcl{Byy>$=I#jPHvPG%m+~z@`ASv!N_&)V z?(0%MjIvm8%pOI{hxH#U*XCWHhU!5Fi-_JCugpgEn|n8XgM0X&Wb#{E+0Oc*ez)=O z6-?>Hn5&RpZ)BTyc1tVt=V)d0a;4hm(@H*V`bBoiEXn{gb1}+X-7q0WsSMxXRdS8M z=-BRignH zf-3)EA1+*0y(y~I`fd*oT8=hos>^jxt8nnaNva}6ervkRuav#!YN>xj3Rz+JUB^8q z;};FXP1WGgc?Fz~s8aDm3O3@p+K8+)qGe$}j(wm6@?TmsA%?B8)%+bw8I^X5n%TM0 zDp9ZcyL-t*Nnv~Kpyg*+@yF&Oz*tNT<`9F_;4ork;O#vc-M{r$<00+=mhibaFlj$d zVwm8L-R9a8cKhSc!p;(7HPy?t{(*&zALE)^ocG?sb8$J#h4?+#ZxXH?EYGklCl$uv zwAj#7h=LP(0{d9puK2lFx55d$Fu-F%gNsMKHy3*70`G~jd*>cMJQpVS`fl5F?2J+E ztNpiOPJNo!Z$~>r-;uX_`AlR~f=x2z(BE^hsq(5~B$FM`SNFL;h;NNNVB7LWRfCrM_K*rMY{z6F14VGxtQ zN4G}!i>=G4CB7Vq{{{A5j>YE2cry1RpSv;9R-b2%Iu6cW!px2z{>HrQd^Ho1rDmzp z4<0h9yN$&42yCvQ=OhTa2(ma0GFLq1tKz(EHRwzZ;Z!=fIGJG>%4{*vgcvD8IYJ36 zK+AV!3I7Qmo_Fqw2*R9-!9xVlXf;I(%?2k%Uc*l6f_XNTnRr@~dr*t@Ics@LQK;%cU8C07zqW9iqSZXwtVh$r zfO>I006T;M@ZixCGB(26L|5K9_883fEV$KGrF!yhU0r88)4D&}4u!Q4xH zk#(3x8XXVNI{vzJa2^!?GPy(>$+?`{-$Lsd-0ESUyM8z}M0BOZEI+q+)L%XSIE6DX z`)`{F^(L#$(W3d|&+h)DahrF4_p-NQPoB90zDG)erGL1tI~NcqYQ+%0>nVRZc5I$) zOxYUE0Lp&Ja`bh+f?D|*zZ5?_gww<_g@~nPT!QmT|ApaSfc`Bp^q7P5>Q?ff-fRA^ z`O7nU$-i@%Rr4w;9lsuX$EYNlBHQGK}VO?%%Az%xkpkG^ldfJ-@E z#+>pKRcY`)ZwIK?nv2$-vHJCV(SPN%kzE|a;!nb@4~>WkWP)`V*$uu)%|#W`diN*q zSUW04;uYbuEAW~5w`b^Kg`LK!^Cn;#>R)Lzr*YsFeW1KM%^%UT!JlB@Q(BURNTT+k z^J89%L+a*FH1@{{r}T+VDI4R?&%Xf7+samEc1|Bb2NBHz<6n4PU;-;vVrEH2yQ;-1APn z_&4|y_N|MO@3QA#q47rqKi`Q@SNX5E;Ro39=^DR9@S~mhcK9=pejEPHb$0qUYWf8q z8sem1;Ztq+hwS(b8b3|Z@5EOq{61fl{&G9MLgR-i`knZ6gXt0xhg-^BN*W2+MG=7WZ|GX1lq44`2jM9Ij9bcjGn*=}K ziBDJf^)~#xZuD#XGm3sEzMbw5px=i7;6Xe6KeOmxBKT0MlYWIywc($%<2PvhOhvyF zU!m~(yixkUZ^u_?{CSFgCq7-_*W2(Z_4fMLc&q(8@$Gab0R1-nL9dB4zI~IT--bW5#!mkRi~cJl|InFE`V~IahTmkzZ_xO0f`8tL zuTc1XtE2Q++3^(`-}wX9-+U)NUE$Z;@R!-~=^DRP@S~mh_7@fXHvE{?pq~S3>HnUv z=zmbrpW>un;Ztq+zYx!^U;00dpQ-3~;wuz>Uqh7sIy=5XxSOlNL{_MxCG6w`3@4)^^ zVZUp`Ui(vExhiSCtg&kZ+j>TKdLK~OBc3R|cm5by`c%OF*WhUa_C>+UzRFkVCL8+y zp0skNeC2EWFu|8P@nNq2`xB~c_(a-AtT5ukKeh-zIEze6a^eFDpJT&6@-*;>a47hI z#y=nBa8kxMZXgtQ1~1h{s$X?XU#MJfX45wApdp`bkeWz9V?^sPiX|6Qb&BP z#y=r=pA(<2@J%-SHILcp*Z4VtFLmO>^lw1@+wi}8!dCvU>_5lI=3>DoIq?C7&#~e6 zvbAdY326M0nL>Y(lYWKosEgA7=HGxnOVh9MTLtfP;`0^0$%Y^FFz}jxYX3aS|DfPY zo%k?a7eK!azwI612U+=t5&c3&cGCo(V+_pU;WUSNJ9yKKUoWYx&F9_$`7jb>hR%Df(^rEx!OB`}`&UuhSHGeG^@@MEd|2yS3(*8Ami{N+nbJDNy9ZRG1S5tp${?%&yD#81l_?-K1_E4&~L+w{*BasqecH9MZXgtQ1~1hK9%}g;{zK1!HuH- z`a0=X_>S5r{mZDoBlK(hGlKUy@%akhWW(QM$LDMOLcy0h@nQNWfPNc(9Q$uAKVjJp zkM@6s;FFwq@o&KXZ5w{TgTP1HzsAQY`V*Y=tNc5bMCl(!{jK>|tMR*T5dG)G=PP`Z z4gYvO@LK-zHU3e-mpbub`Za)l8@^yY@S6W&*-;MqX9_;ai4Q1zjtzhN3&1B^@)ywf z^8~*;-bug0cRUcK|Mef*@~_qS&!!9gPJF(?H`(wlOM&mBFyH#GekKT+_z`#9-W_>RR<`bSd#N9teW2PpcT z_GgV*X(S+>rV|IF0;Ea^eH@MnL`Ufcbo%n#l=h*Py zv6nxf@q4c$|8~bX=~wuU>L~sHq5g}|uklX^-si;UD}0j;{{+V$T7Tzj{2alTI`Lt+ zH;{fC{`pWZd z-@5*4HGYfWeNKG7!Z+FQPg8$JlbrZ~ z!spoV`OEF}Yy2=p|0yT^3g1x~rGJpePQS(^;k;C)VfzQQ-z@PDNKiO9dkUo7}iCq7I^ z1JG~7AE5r!`G*^<{Ew6g{Z4#9;d5;GOpbrF{t0OO7QychJLy;Wjs;Qr@3rS&tMRJ@ z?{nhw6~4)aKlLl*ukEjVjh`y`QYSvVLD6r+mr;L4#y|BI{pTtAo%n#l=h*NsZv>t` zdOy{^v|>7Yc>9Z zQqg}-e7?dr+3>GY|3u_p?{@3^|g5UigC;bZFaaWZ7d#Jz8wDf1K#;+2* z&xy}h_$C|vP4<5}|9p*~D)>?-UgGPZ{oC*laQ-AB|I01<2PyiUc!?i@@sAB(Y{v&Q z{)4N@zug^9`X3Yicib7JfB7Hn^lSVxg7-P``3m1;!@tY%Lxg^fzf16?PJDR1s(%~) zS+>83{4cZUA1C-ECqAI?IX3(~c6>nNJEsW!N1gO5e8;>f{g2ar)%vqm`496ui%g&sX>+8~zmgzexRS{CR>eb>hR1D*A2szx*0_ zJ%1Cfwdfxp_#`Jjpzt|1{CesyJ$?&l{E^90|A(FQD}2Y?DE*hS|JCwWtMOX|?{nhw z6~4)aPp18>>n~s99~6A46CZv=(Qm`=W&f%97hYn~KTYsSPJBS&b8Pr8mH@BiH=yws zEBX&P=~wuUA4KVIvg2zt{zx(T=X2uo6~4)aueIazHGYfWOP%;|qoUu2e}Vc_%WwDr zi~d!DPjcb|3ZG-c_qXRC(D-~DeV{R-c4dzAk7IR4Z8tJU~%g7-P``3m1;!_TAs zjkJG_@0>*bl{)d^hZX%c{P*qohZkG)Zxwu!6CY6c92@>wj^DNX1vLIa!SDXkNx#B( z+!m$3ne)%O{IwcCP4GS^K40ORZ1}0vzqSOq$J_JI z*Z3<0U+Tn%{fd4Y{%g*k>+**eS@g#VKFNs>D143$-*`9hT7LyJepiv`zt5fYD}2YT zQTlJN<7+kkQNjD1_a!IwJm zVV|Pkh96uDe5C%XEc&MkKFNs>D143$e}z5&fW{9}^nd20U*S7$iPHZ%^{39iR^vaI zK>qoh_S&0Y1(eKjdrt!K=u>QYSv_ zRrK5N_x>DsJ%18jXwkn(@JWK#{&BhVk87V``NzE=Nflg&2lS6ac(+3Mx2yD1k$&KO zlnMTEtyxxJ3$>Zxy`LgGnp>EL_~K?v8Lib>UUE5${J0rmnfS+*s1Q?)JCpS+b8 zAA1bbt+5q?o#ntLE9`0;_Aitcwl*_GW8V{Oh6B52t#E3p4f`@JRa#2szWXgU{ampB z{Iq+SA5+*fY}lvS%GgVqk8A7-!9MH2-lVX5XGQ6~jTR;2p zZ$nSiIU8Vhy2fu6{Aee>eT`5(-G+C~NA9|Pv@fs-e^l_HPa=e?{5L3kstup}BJg^B zWrN1g6#Vl}e1*dAtB6wn)0cqP^K%s%f1aY>iBDJf^)~!y+Q+(mrfd9Xmr>Y8JMrzS z75z4RlMi@ppS0g+(f@(qL;rHpukfih{Ecq{KNPh`{%_FusfvClzCz*m&5Y7tY{yq< z{KdH}|9mGtUE$Z;@K-&B{B`?I*Z8{xKiY|JZ&38x@G0kJ#=Lf(RsQySE&9g^KJ-r~ z{R*FI!|&qyu3lf=pz)oGekZ;{;rHDXrT;$aCp|w>q47$7=R5J~3cucl|0C^796}=e zPuFFh#!;U!m~( zW<=>X?D-}j>QkG7Y;LgSYRe!df*uJG$^_$jn6wSAPX z@e>6<+KF#prRcZeLtLNG{*mqTE&2xtKJ>AZeuYo9;g52CM9c36jgJ%j^GYt$*9^>Q4Uw zC;bYaYQx8OqhI4K`knX+h2M8Wl>TMEME;up6&nA6qTh*6SNQcde7|n=Yy2ifzu=X9 zBjJn_mh9E`OM|FNP!>&=vS{wR*4khKizXczo15=cOiKQx zWU}KUG70eo6C2h3$Qvc)gnv(0L?Q%E@@+SO$T&0-^8pJyc!7Yu0*>yjyh36BXv2O- zW3fLnU!$)ObZHc=`sXmp&-EW0{LpkOYxYm!c~#_!6Z zeD40xAs@90-*J7E^hNgkYc>8+!TSWS>j(T!*wv=%CtH##cm)q6aEa7Ucp2*F-E&m^ zWT^V-GY16HfC1sP$k-fWWs>~Gr7Yxyl8LQ;HZK<@U27FG1NC$1%}9fd(0u<6i$gC9 zIQV}N3dLM~LSfIcVgJqnCQU!o&jyWNCFth`t?5H~6OO#2=_{9%3O>dI(w8ChrGq~1 z62`Xo?d97{_ss|ZdC~UBo?jIophfMEUd;Wy3%I{`fvcf;*(Hc0jNhsu5(V~3`CIr3 z6?P@KisDqP6}2L@)j zy53;u8_$UW3vsrL_9zr!L$cno9b3U3sa? zU!J{oI+F2U_qmG!7dt1oMk2cUEIc~?A%Y6v5VdKSGm0#tE$$CiBU}K=@d|a6`2^dC zzVSER&XF7zi1P~=Y0zio z?q81RPm423ys3v>o_v^Jg)v6`$COQm#$KOUhoTuNg^9+Q>bx;rr}3IGcX6G?>u1$< zF0Wt4HO7-OFnVK%!Um*-_`e^pXeBz}E|2gg$tB(toT$>Qq=qnv5G+i({cINW!B->oQQ#gPMnz?z(coh0FFT$T;?m!Mm&H)h!oM~ zI{txskNl&nrRTD26pI@uijUqJ| zKOUi43)@^iOUzbor}RlolkQIt4<*~!d_AKcAUZ|~x#Aj$;Hc%k4up>>#3QO=VH@MHTeZA$`&tkK@$30adWJ)y zpOhjMp+f(geq%SW`fW7ywe(PK|1UBZLoX{4n+>A@DmIZS3nIoq#1t|9vO+xvN4WhH zyGlGK&NkK@hH>D+@pBpSaeZcrd^|Yxvr#bNG=HM{c?{LKY1O9$gT;dQuJI8fC2*!JMl(2!%BgN68k>MwM8 zw&HY}I`9f-MGd}*m@{3Tg74uXeqq0{dxK?|JssOj`3!!>R%K!E@fd!57Cych7dSsx zK0l7aBKgNiq3`-aMgbb@Vpu4guT_z4zASM|x|61wy`5MqL|OOGB3wc#V*bKE<^b~5 z$tcZClv|zpX#PWJ{if7VTFjpXdj0On%rs35H8PHDDDPewk@i{J8=eOa%jpilGK{>` zJvtDTs3jA5?=G8&W7~7xzDb4dyd9NOdFI1xQO>?u??L9Lzn9{Qg_7K3E`n4dbpNk= zaIH~=&gsdILv9`aof^r(F6s8Yg^6x|{33>(zQ#YWk2E@Td9l~{_bzl*m zq4QPxlU*W?ttc!+$aL#`Zck^N;b-t})urL@s{)e?QJ7FN3&12qoQmH=C9_zc)~Ga3 zVWHbP&VT_ESu~fA21$y?Jc*2)IVf0b0gyg;1{)N&+!eZ~W&_wh0QWL>8 z=_m33?&)f)loXmPbJria%tLq4}&>Fy| z&3Gz&*{CmwktfZ#AYV4(*J9Qq~(h%KX#k zPA*N{11`;NWRMcA6JJ**5|NWJGm zjUb>L3|!+ORvKy<0m|j?4EZ|`?IvUL+07;R$h)UVVip(u_2A@@TZ`-8Eqa;#LD3fK z{4!%QQbI`e65|gzd?`MOH|4bEW-PS27s(=W=SOR+zeSsu| zzJN?de6Clu{6txbQZ)EPDn7XyQt^{}MVc0>M@NhCXf+<$%oq_A9$lBgL*cT_tIK+b z3`4(X@ch24;2U-mhxW|@6hYZH?R>t#e`{`07cUyk_=qkbmd@Syr8QkahltIO{_cbol1@b^2v4%gWon6e5yo&aF_R5p8v7i z5{0YfT;Cc@_+S`(+*~~$q7&Q?gb2n>!h&aV6sH1{`k@Iuo%M$Ca#vDoBYj*3crhn(?|!6ELWr zEH<^pJg~*eK@M(YQ{x9T@~y(KNz8+OFUe~&9^z~kHS^*U-|#&YV6i*3sJ!we^ftt# zp_xe_UA|?>2Xh!V4-rvg%P?duIljMaWUISRUs@9jm?A!1W(s+48>@!! zV$|DZ-rXgm_LTZlE93-~mXip^$=d;u_Jw%j^<&T*q5htDlZc${B?ds%#e#K;O(^8%^n-$CiP zeetMf##80_Blv`DV>P=_%?Po&l#0n`RdX8NQAQ;nR`ZQ`tK=Vszp?5{COB#bf{hlI zjA{b|;!9difB|i&=~x{8V$`Rghe8cgkvVG^ttH01;eJfohETcgQMy`Shd;~D{okaX z(TPO#bH=@veuiEZfkZ=L3N-#H#0F;EUa;=xS@+G>{bK9B&AMM}-5iYCk=`Ne zeTwz|gmq5_GyOzxg85}z_i5IBp>>~yd(IT*l4IyQ3VH8o!3@gBCs?B{d5=B-zlheG zIb|+Bnql1(^JXT$z1HYXpxw%^_g{GsF5-;h2>!!{!1}--pdC{30Z%dcOhh%^%@UvA2!EdqeWFIrvAMg0AR( z!=n2IrfJdLtgeObHe8c#z8AXJi3MKf-Nj~F(h>ySdvFQ5PsUYV54vX!oKog}v!vx? z(7mgyVeiu160zf8#DVTTMKni2_rE5Od~0(5&=j0TJjJ5B6s_lN<6+K(2XDk5#8)mS z#jQfI`Sv_3*y&-@1CmH|zR=%h{t>Ut-{TKX(Zz5yCB}RjZ?L|?=Rd+9huMs!Uc4@AjvLDRb$c2$qY7BNq_ zeMX$Bg00)EZR617E5XkkHB0sxyOP9U!Si>3A>{2SIW9VSNkipAmR4Or?MWgZnQW ziog9T`?!4Ruq)L874a}lW;H@V6nPGeU|*Di7M@x&sKj56Y&v5XozMHKGeXzmcgUi_ z_&XG5Nq7)c7-u+)!0oW=92{}ozmh2#xRMNb5*j}69FDc0?_j49lJeEOj2QE!|KKQu zorQ^9n#0oL-SAJx+A)WMDK1!*GPR$uHyI0=_so&8!VaQVc1K;-E9yz2E(Z$DgF=QH zL3(aTI)@XimMl`7Z5}P`y`Fi@Q5HMe>|hG|A8T1J^26~3J1;f9_%sa!to(cd#R20B z_97f#$S+zadl9zII{AGyvr&GVl&;3{jP)zvHBm;3z7iKM@2i>Y7ibgY;+Orw%ixe3 z{Q&z9_6O8iOfgID>!l-SO>k;-D-KyZ$3H42G|3$DXMBbZT0Zx!xB7dPEEm3*4fVYw zkMEd#36?Q=zKKelM|dOE5-(0IxM1fxq&k=SX1|nYI#2mJf$;l~A@jLcPoI}F4>znC zbTm&&0ZP2vajGG86;st2m*pMg;XPQYIO)bYH|yr`-KZIs>Dz>H|lC~!ovkaeL z3!pSyqrM%N(ynm2iB%cCOG6ov8}ElW#>-hS?}y0gRpB`XQl3xIQg{1%1-dft(K7G8lDs2s?}uf^ z#J{^CG*lXHW8x=nFUH8Y7X8p44e-+kQNJ0Ok-+>w`xc6Z^|4QV$Z-fn1NAR`Cz=zc zBA(22QHqdOIesaeGvpV;YW^Y#5n6x3s4-A`e%La2jQQ!ZsK&9Ke7IJe6jw zxi49j_*sh!Na{8O(Z%~NjP8+777Al*9>g@*MqJ*vp~*S^gm#Us%3M1=a{}vEnk(|B zfT8mS-mF+iq`X&^k;`*xX`#*IN0#s+nLag_;%^)ede(+{f9UU-d}TC@##+BFh|BoP zfY3x`U*l~&PkUBHbQ!M=z!=hVGJ)spSkG=75E_g}eIc<>u#v|;9^tlL$icb}nJScd zI{Va&;dHJ_K`8MJ3f+K5D8_tA!6MN3%UO+~EAc`~pdY?=7E916C9s~|b{0#}i4u&q zLSH|YB*K!=9iSyKN}jQKKnU^qPxdz&9)r)6CeL_jK&U|VuLF2E zy5faTaVIGX$06;)oqIxBP)zL#RD?|o-swCCwes>b=D7R&JHY$acvDB3C;p6fKHV_Py*rNyeF zMoR2aV`ejsNA#RL!)WL$NhmfR!8?$rWSJ(3=VUS>_CtV45Ri#LzQF=ez5!mF!t$%v z0OM@=@3x|AH#Rhnl;dT32(wY0?kotBEs2+OX``eVFbw_H2EL=jUu&MKLx{t98mSsm0E*U;cLId=qR?P zpV$c`wJWtM9r6>L4M%d^4biVI!p%^Msmco-9QrfRn~&$9bSyrXG>lbmAq%Uk(_g!N z298R$pg7e8V@`r6*TZ)D89uM?6E$O%H3Q=m<CI3CDUYjZk+AXBY|0=Apd}l($G;nroW(34g>(RBxIT zNb7VEir^ruH?n$HJ zQ<1XTM9I5v84f8A!82*8^39-FD_1Y`-w&d!kbbI%NJB^OA^jE>(B|p9;MZu)Ka}Jl z{c1^HE2}-`MM&Vk%10bOLS~j=8}-8^6;;79Mul%(!qVmNss-OE1tD~T-Gve3kBZ+j z85br`_IK@Z`PM$pvh!Nk&xypUe(1a>_2G9GJTGC^GZSKHPFXgv4@W&tOANt~(7H~Q z1M8o6Fuf1pDoeEJfV_lrEwt_r`?-885<}y~-H5~SR*QkT7D;5FIhHA5fZ}3@EMIs( zqJvysXH`7bk#MT>A*qKw=9)qt{n)*G?ydD$j)wMuLXQ@V2CQkE3R57Cw^EjvfkU~~rvryttewcQQ|1F7;k2G)O)4W|mOfm-hB7bIJLQh&E^`N;8 zopR}V@)=7E{~v8{0v}b8#E&PCk$}Jp5Fmo+AVGto2D}mhNf2-X69~#`6x@xgA}YH^ z$b={e!AXEPJc)|eio1Bj$||lbhjj${(p-~adH z^C9m|zdov~s;jH3s=Fbv)|*CU=!f(4sZ+T#naczeId%;ri~9g)(STCEcV!9mIf6+L@W(OCR$Gs+$%wf$0ZQPWgBy&><=(n z(y-$Q6*klH#0QwkamJWfsgUHEstXJM0V7e2l_4c#2)#sMzi`+Ug_yeQKl(y*MuRlu zme}0}UQ5}By44QOLjJeRs}rqGkShF-54-2~CO_Jvv z@zPKW)AV-gcIs^et!vD{sAMIGSiFt~{Sl;E1NBkb15mm>$amZijk{dCb6iQE5XJ(k zFF;K>@bS()0z+uT!+r_bpHP^o}8tw?HVu&*gO2WrZu;`!g^?7`*BR{B^?CzUL7X1 zPC!A?&sIej-iEWyVlvA1|Dy1pSvcJKdwFR6ep5jQ-FizLZW6QgM_Ivzy7ieXm>pek z3r>ZN+47An_-l@Uoy&rWreJ&B;u0K(5wk@%3$D@ylUZ={XBtta;N);Ykq{yN{Qg%I zd{7tMGZF=#Fa_J`7JJ>*NQMJPJ~OiZ1%YouQ)9ZBAm*wz}x|w~PDkDL33> z$2`*Uk9ATxlN6Fp;!a^?T87Z~ne$HOS78)NM)1w=8ah|tWubosCjc7%%D!gcuo?Rm z#c##p)V+MdzamczzXOs!KlQLY5gfwo6uNxUt>Tv#7z^&lOJ(VR-(DJsZC@8)7us>W z`3JOlWe{SeT6!wF{fgg+9YT1&JwV}IZNCQnsMyJIDWe$5NhPU)(J#LtVY^w&CU(xQ zIN<;8Y~C+xz4b#2#0I&&*5FN*wTKVd&}UnpJ!o~7w2FOVZDvZVPrhtg9WafpCexQ< z515E|(68%Iwu|vh^#Xk~j;Qb(*stj_Isix1JXYCX?({t7t@u=x zNv+6Cjk(ZN&5%awoKnB|pS}p!kLV)UC}Ft6jyfo)e$U}L$p5e}NSI*8TJlD<1p091 z(ouZQ3x&C))DVdX9N8kz=};C!Q6f8rlV2IdXM&K;{H^+0zt!PgOYTsoMMVZ;fSn>@ zXK-qU*VdYVCGiV;zR~N?NbnF5CweLrg(GVBPzVJq2BI>=@Kvf&sj){=a2M_?4ml+2 zy>R@*g~rdT&Cu@|`%C%2_$lEN<42xkY)J?7@_zH~uh~~?+1rwbj<1$G;fA}n5KBRXvz31# zl{wq-wCkx7Y?=NEYt+#hLdMn12r|~lGgf#e#8il~?qPw01nYitEj_@3T!T(i($G<@wA{u1FWHZ*1_pnp1Tk{vs0qxq1 zJ@*{==NAJLwyW?DGVT1-1#?Wwzb_y@idh$-y-z^bO*;8bjkyc#<&5vqZgG`?iu1$!?MX^l{ZgdBvs!Kl*mft%R1 z(H|zk@#jG#5Yn1W`kl3GYGMlZ2{wm_^Yq#Tfjkx7uoDP?LLksjvV&&(cZ0ic$|^fi z)M{A8yz14UM(wM^)|bf}e#BMQ&Sw-&K7!i|s@0FZsot1apfw2Gsr(S|W0k>6k^z4b zxW0cXX0oEwIGNOT?6X>5o}Gm9DZuJ*>_Iy~Q-<9?-eXUXx0Vg`+6g%$?1bz}tZJtY zfe|Y!_lynM6-WKwPnT$=D$n-sz1=q>R37t2sc#hqT5If8&S~bU;NTcd6er+iJK@yr zsA~YHxnMp9eAcq0gKL_>C<72HYr6={|0AH*oX3EilLEWk6Tcg+>>;7hb^B86z3iWk zjyJ2{@j+2_mq6O{_}K>qUabZ z5UH(TB0-3?r#8jGfsXGHh)FDn$C&ie_AS~X=6p~e8POg1QabP&sC@P?yFUVqrZ*!2 zG>;5G3@m)d^jF!fukzTq&K>TEEfaDqbm!L14yhMGq%@d-Lle-5Z znR9zc1Xp@y9K&z7Wv^(?(slaB-TZ-_HV@+`|M9(2zsh@A#5tTyp;CL_cKp*s`<`2QrAB7XS z*J7Zz;x?#`wkvrIHw=FRtC|Y_ixKzO&@J;DEM_zHgssCxCDvhfk^~My7(?!2V{GQm z99ZNm?@k1nGnf?WDp?B?z3&)8i#WC#pD`6q(x@!b~-@d>d~%-J(vDHgrn3EvUCv z**=hiwR-gU^JE^f9;`(gRlD)tUh6&f$P;|e%f;M~ler-Wu{D-=LoV3h&~EU+KyUXQ zo_LJt`KhF=C-WDdD>w7g+EGUJhM`aJO&ifu%z(i+*`vom7STE$CPkwZn;e+fN~B4c z$^GpKEyU}y#OHWlDK-lcDlMzIu!#zEj+l!LeZA;p5P-}+HjI|t5 z)rdi*Ufy~jK%rPVqT=Osi#l@E2^xA3+I2DB5QMc-_I#Za`Jt(xcyMgANEZmQICD)(b z@;CK}TiG2Mu@-WwxII)wpVjITmf!TUQ$E!x-w)+6NYw^X zGn`;8^CWZgf(I|1CDfzpM`$mJllwyBo<6J>0-QF&lIcN=`06bF$>5(n{>cyh45y{T zB~cx&-Sq#SXf1#+x&!%Xdj0>~Z*}VOL!4N=+@X~NaGDjJ%eaV%=X>g~`}AmGp> zsIn`Oq&ZMM+{pp?HUqM?EUPot?ol|6#BZY?OeXfPcw998RSV3d)Drtx%kxefSH8`6 z8Y~Y7Yb~0lA)00!je|}R=b<|*&xvOF=eC07FT!SGb?0*q$G?Q>TLJ7v@a6U4o{BJN%x;yxOwf4Z3gXjD{!3%$ zXZ;6vhu8GT%Ps@ zaQQVh-qOCez`^FddBEnJOG4PZrM)98mdDbJHHN7lKc)3!o{~c2sI&!p5}&qyinT-* z;;>a5mJieS>hXzDdw`?%fI1VLM9Y_952OG1kDTFqKt0YVF0q!-42eogr4pD*IP6UY z{UMvhbOuQeb#sokR)ktyDuqI-xv4)~{5QxLUEBZn zAz~Od4mo@J-UuY@xWd6=VP_bEVGjWQcy!dyg2H4hEsez(h~b*UV@G50;FS&bVK{w2QzE(mDA727 z-fYGP?QeRJ&C~rxd$R$6$6hM!hH8-YQJBBGMU)qOfw0jXT`Ki7R{rx0hcOJsW~?P5 zt5pehbFEAx1Y!FA=|@A~Dc^#=%bs!Q+u95Io_BFf`l=t>#G-2u?KY}nYWe;i8?QIV z2>V0+p6K8!w3ZbnXB}LJJ+v!5$Xe@KnSlqilk~85(gyaMMA1!>;wE2;S#T1hG4`<< z0e{_1u>>sUS8hbus^($8m);il5O$`i+Y$S?vRgDt{()n4)r5UO$18tv(DBP%`8Pnlnf>-Sw$ZAbsn^G|4Id+5ek9jR9Tgu+rELP-2X9$${ zasbM18UwWs_4?@sakWwNzwF;@IQKjFIio@Qui$Wl`YQK=-Dv-{uhD++DF+n;+5S!8 z_AmZFYQKZ8t+hNWJ*;G?^Vq&Sy8oA~VE@_vouT&M^RWN42%7%4irIf_W`K3o8y_OR zFg}iU@Lh?K(09hyvX>m%I(N~vBS`UUtmPYF4w#(e=>=yS%mU6bP$i_}1TtA4BfimD z7(466KfMQ7AN)%6i&alL*lI^;dxxQocc2a45QA|HkL&UMO_T6j<($W?WqHX5*EAgB z5gpUZklxnv!u0r`VOC6(?roZ!OKVOAtQVi+;Irm1u;cX0O`iA@)bAh%pcsbb!0_v1 z4j&^1>#Zd$?HrImaT;@mszAjxr#DQc(L;50Iuc|+ScK%#uNwY4U{nNuW^uO6pf)H= zD_9G~Zw#AY?P+pa<^hR6z7Vqx4pGa-qtcVP+nRMIi}%7x@(Z(+_jKRxiLaLVkGuPi z16qV=ij^Gp?6Up%?X|P82ONh%tg{~ejJ-ijwSNPuguSJ8N@xzuEgkYr#2O5@I0(dSze%3^PmJ8ppv%{Mm0I57viCSP8m|z83unp?F$8 z0xkA>d=? zChW^=z`RJ%{7c;&{F_Gpb(4SH&<3Z17WP!~bCd#kS#P%WCv!dp8G24P77utbJem1f z*25Nm!9@NP$!fyvVNM+b>TXSB)CJb31J;fbF;v&*py>v@itI}sc?67*uvKO61OCB4 z;24HWpi@b->!N38ZnTzlJy@M+J?z_`)Pk{zb3P(#N!ZBm zQ`ib@|E-v*fSJZeX7X+XSYDXEZI`Ssy(=L0(8L1i99D0Gu~dWiqZGfjFpBPPtoNUG9z^BCGw1-;k{%p&=6i(yJKb^;s&5g*GR>BPbz|dC$XE7 z24}(+ehcJ)I@=jVuHF984b;>9X}qU=3+wMUV{XywQ;jZ(meugm(k}4hsH2A|tjIs5 zdW8F4S zL^M3|ol%s`Z#tijPJ;iZ6Vag4a>8XLY_*2X0rMI;a1jMJP-FxQO>lS!GC;xRxiF-2 z{dJ(|AFJXcY0t(=QOXH+tPH{y7h(p7DI%VXPr=cAW_|cjB8tw~pTzkDEFy7RU=eu& zP{yYSYoss(Si>#PDAu?>O;btoad{;#A|Qa_P(rEmrP6s>;Jhrs3oBnC&_6B5j( zgM%a+iH2;dBMf7BpM!T6L-{$bLYVgboWQF4e^NAPR z^(%G`!D0rM%*)Bn{6;ns_6M^_83ceGKsx-8a3SKvp~~8fA!U1tUJVX{?l71KQyFZ{ zSW6^gbHE(ESK43Ymdytz&;-vRqWE?Wl`>g~V1Z|TYAK#{P#u=v^JIZeSIKlwU{n%; z+sh1r`yfBw*4w@V-MRBSi~X`)-+w__foky6Tk(~8^2fv6<6VT4)t8M;o$j0n#efxQ zF@kB>V(rbS$sJBo(X=Pm_;ym2{hWWRlicFG2Ju>kQ-XR>r=J_ zzc{pL?iR3N@HO(HU4TRM7E85W7&X|mx8jHFitV|yxqj)bIEvsjZv`x9R9hZ+%@eo@ z@_kqqHv{-ryENSv5Gdd@gE#@2(xn!?S7Y$(v8mHY01iDbh%7^qr%oenH46rk;ThS& z`SWuQNhj6WxppaLkjpv#u&Pch8V-rS5oY&$jm4>xuOB%_tVMuep+Hij3jfWjX2%IY zvYW>FhW!jWdu=lsTpghX0~7~Xpl{s{Ifl78wfxbk)5^A4{C6Mb==0XD;7^=5!Abwg8e0k4&$zzY5O8%}ZLGzNfm(TJIlTU+^woOh$ zzw?r_;-IeqmQ7UjZh8s|IKir66_OnginIrgSF<=mfCzv`5W7V!l-bDy$?;5V@Q~!o z+&K}BXuT^CJH>3*iM|?iT^rUwJ5=qHXwJS4g`6n6&1C5XXvbTTaDXrf)7UxSQ9bEF zon^iHfQ8x#B)z7wJ}{fi_Y}dz`3R|QL6zpkojmk!3fl8BdIptMGMCdXfMzMDakypS z>L&D3w*doP#{sLOPlr&LdU^_$bf3eAar%3hO@z9g#?1!4lV~z z9H@o%?dpd1No_E8duba-3o;)XWDmGv)Tf5-B^Yvk{5(_hJVB19BKa2tNFjVgrqYuV zCJXMClc@-oxV4I)cdsN84l`Y1attnmwOkEBR8nPF^HHB1=Jgp=gv5g|6#i_j#87|X zT1u<910W%xzf_XS6^m16^9lV$o)E-rN`QMxJ|MtWo>BVC6K8ASX!kr{hO*!Z^S?ZG zC30Xnq!0%z1H5bhp!*^X%~;F!aUM>1cI7}G8AzxaVl9h9NP1$H^*AU7uZrB+aAD+w)ta3THSnt;(iqst~C~Rl9}Sw;PgK0@?A61D zqJ%md2d&4(uyNpv(BGexm{ANLaKGdSV9|tFD&<4A2g;X-@;96EE6@fiF=RE^&MK?3 z%5W69X1-`}qUgI!;@$KhUVw`DPk2IRX}hDiNRsCvUw$j5-z5)jDx*H`4XS z;D6SzePsVvuod8KwLDMK|A_KZE(ZQsPh;(O3zd&X9b^Uf8EiWvYRHjoN>Q7->A#Uf zkH9lI=!e+G5ajy5I1_7sHz|b~h<~tRN#jiqqMzNAB(e6Gdp^acRdu=x(mB9f{!$%X)lk`$9ID5cx~lMhV*}3FP+{{^e;PTq<&;lFJeF(Q7gy zn-N}Wy9Q3i#*y8r*kHB6cMbWMIn;*F9BYc0`aCvG1a`N-@59RaqYo&c5nV=@5I}?V zJ@z%R(<}-F1=sC#Oe{hJIDYl4vgRg=q67#itycH!W)}z|e^PU@+dT6ZST_$ofKEf* z&D=h1s3&mg7Ek7gbl(r0ABqPO&vC%*nm+n zG;RIR-WnE-Gb~u3^tZip+hg%@@&2FB*Q3{eIDYE>itBOObr*pKr|FMKXRQ6SbhU_4 z47Te*pP*)pPf#;&B2aVj1%jH{cqjg?`Zy7UpZ_!vUOp8Fm!Dnvvlu^RI!RQ4pADM@ zpX16{^Vjo4UX*`;^v@zHJv8pzOP+A^CzzWb0*_I~LMMe40B4!_a5NcBM0UsC17#Bh z4|73yJMraKk`-*By*nWHEHaSYX79o7urCu*+x6?kn5gY;@7IC}6FW!@(^op_c_#h0 zz2oGN!6J|d|EpC$MGhMhIVE@=#I;%Dpz<8Yspab;CCFv6}wb$ z7pRC;_CR=D62kt+4pGrj)~u%`JAyuGwgK+JU5+9zG3US6Q|=NrKVvPSt`5x%k%--vf-)KeiLa0M6{+GaBEw`nOuOiSR>gXl)K9IULkrl#uxyr7%_?w*q(=41E7F0>~a@L3~I<_k7r_2U`ln zociFzA?}UFNfJEifhGjQdYO4y)?BCvby!3?Y0MLZQymqVT#`bY*s1Xf{o6J4Z!cvq zP{l4zl#B2R8)Llizj{VuuCQrNP9<;xeuu-3{TV49C<=%l~2|??5*xMYh11xcR6C=i{)b;TARGBO*H% zvs}tAk<4;eB(oI%Mx=`4^IGOYj(l;^=;`|aS zX2gM0OTC{F-5UPy$Zk~z`^D~;(?{LEM~S3Z{@tE#V7XF<|B`tlL#pIzH% zec5;}na`Avve+o+3Cz}WHcg5S@!Wc_2Og16=z0PD6<$t8A0P?{@WkQDDJ@jfRq+uS z|0W&cN9F`^gb;0cD2s|yoH{ucnO-oiQrDWo`QdTQ4?cM5bXjHcn6koAA)uU(1*W`) zN|27zAPrP{{@8Q)P@VrkJjSshvq6MzrUGJEK*`g62hS3lflzt@)2r$H1@+Yk0V?DM z4l%3fQ{oEM7o3b!kwj*l=sWzO`hpX9I6^~~`jfdI@I1Hxpg+xK8x@OFOZl|TGqc(% ztAcR?5$~c&83xAq#KOM(ahfgci5S8sENkXO{0gn%cz%#o_6KJ0AMIk5{f=)T39l~| zoNe5R2xYNmWeKYtZD*Cy561YG_C;8q;Zr%!IA^5GxXkPN`Z`GTS0&!lal6U3;EmA! zw5lY4o2%}quVrr6LIG&iGmAQpDMU2k*X)`d`uLE^E~2|IB)TU_GQ|ilvROdnfFvc9 zB!y~+*Z>W#Ow+1rw{92Hj1m8@GX?GDIjv$bWk5=f*(&Y#+gMBNb~(Pr#Aq7m>S)c{ zVepsiy9`=%RveDO^iRPfe7s{MrW)c-^Y55Xbua3nW3VL021~7nbrT}X)n|2O?bV?! z_K}{LIWdgbE=_ch^N(0cqfv|gb+%@{ZTbgS!QX@&xLJ=%RQYuIg;;Rv7su8{zzfFWio2fJFC#Y;9k_$5O=4N zqVd~xYXp2@tRzTsBlx`ob1n@?rDz*#2aeeA+95KrAs8XGF*2J77jZ{NbdHM^t+eA3 ztX-DP*c#k>nGteSZ9{_BPRQ~GMj&wnkPq(_>!%>Xen5(L{6YK+HsK8mB&=8WR7dnR zi&%&7AI){qrPzUXK#k;gq@pTV^@d7Sh92{Np@g@}`Un(Ii)HbX6BxTCkw-q@a@eT| zuCQGb(&@~va>gjmr$O*H3w{SAS z;Lk?LGgQ^s-XIvzyCQ~DO#LE>;1=Wtyt|TcBA)LG^!N*0wzCUfIC|hr)NGI`MxK~#pyr;2u(yZshg87|Qx+$h2k=`Rpyq{cAsI`iWQs)jgNGGcsnm9McGneywILn15eSWxq9T54-JBnga^9%}J>14ugM_pWJU zLmwVC`d_rLA}Hxvb9=%%xE0a+6CR zC^&HV0?k_}81}L*v;6_5!Xx@@t2b~1M#|Y7Su+oaX@Xm0;dj|3?Q%rHV!8r97_Wxm zJ6{&U9L6|QCAEg``6c+8Tk*+|K6SwtSqj3G&=UO%<;g0srVjdI>tfDc}~f2Uj=uOJKQ_V7z$V`@-&NVUvo@m_rWu2W-1}5Ujd#@F~HeuUhb@Z;eEJi#VJF(uF55+$uK9 z_z126G!it(c)}nz(s^;IcSTUGVPFw09znHSUTYXbxEQaM;o*z<;q%C`8}y_vVDLzX7+S(aL2o*tPZ=bH^M`kYth6D8W7qhm*G*Ye+s zDSC;^9j5}VA#Y&^Yl)%)v!XD73x`4>)Nbe{0{$}%{IC+AI}NsZ4L=XuIY@8<@Q@%P zNNSsesaV$-QNE>2EZTo2*^u3B8c&la_P;~|LHb9O-ylJrEMKO}fwQC>24p(RqrPYY zER}n(BC41ds=^QthF6dZI)=e1sw9q;>tXVEYizcvUuR^PAJ^|;`d$&Ld`@aUG143a z;1hL_Z=sz$jLS1s%ee?b%Ib)@&7_C!=aQuHC=zHXF(Ej>hnbjyv#yH=!nB4Ru=nBe zznS*|Z2y2~ZyJO_13yTfn;C^Y$~V-)b6?_C*)S7Erk)=0gG`hH4yY`e3@up|ui;QH z)8~PMe`LTKoTwZ5(QY$hGX`@7Py%mFB8tYXJe{4w;Ab=l1p-T9Xa23om@W5FK_KT; zAb8DOIcs;DavWZeMQ zY*$sh8xI{;q<+0sqrnXjm?+iTuAA?NNZ7@1cDF~EA1&!D0|w!f94+H2xoIHIS4c9x zXqCI1+H*Hv8O~mJf?U<@J4h zoOudZ9`%jqv%y$is_&@`58@g+XG$^5VlA82kk z|2^-*fuiZHs)eL^qSQr_x$T>l8F{xWag}o8EMp zJh_jaKm14A72*DeL2^F2HM5FHkU5V&bHwjIfdrU$dXVjDOPVQbeeBxg0XJDpgH?(9 zqiXMgc+8@+Ee~fEj3C5-0>@%ed(J{wSuxgNJCkzacR`=pnTTjsmRGcYQcZ>b11EUX z(2ga?c&yo=KH;r|2R-48C0s_2ga7Y?3oRQiv~?5zUWtYjQDc$m? zPK-YQKB+&*Il^HMuw68BaDBUT(hz|4aXSYr)iN5Qr>~6-(K#BTCMhyF5H|$Z_TkcE z`iW;Q1%eRbm7L^UvOIKlaBco!&_aGhrICdyD z=boHn9)MO3j@k3y-*BbnYPB6taL$K#Kr}kbb1{so8@8e;FbcTPIqffaHSCHIVp@JJ zLdPM$Jd|G$75u|>FQu2hXg!@u`@uDC-w?U8Wjy{SPU_1{Ze~hTA3w$3(8oXvBE7z7 z&kgy#>TkMjH`~Tnm``duN+l2=P?_OmuSK|{IKqr)3f442;9rYVb!^vP+Jf?Sx4=e( zQM~q(2>$5a-M6J-@38+$OMTrx?r%qZrR<-MKSBhcmY?O@tTJ}r8|WGLkE`Nv-+eqD z#TM^V&J9dR#$DXW$+ZJH+stMy6z!JK&J|Ey?oDE+s=WAOx0>6w;{shVt3n!t%@soIx*D0cQ#V}!;FF}1h?f@)T)w2 zWT;SBlCDaMJr+@H)d?1Bi(={yv>#D`+@P-8Y_JpzLO3|nm#pu`16g`~_g|_BGxlpG zaIra+(|Nj<^upXb+|LOdLI+${y%Os(pk(t3l#5e^qtS%_u*;hDH`aqpz=-S0`=DZV zWGS#kzUY?gvyxcQKj8Bb92;N+#1D8X5^HfS0+zY>p>F#Tb*;~GBOBs%v(lRJX?xQB z0~SdcOb4D6IovZvWiT&VEAZHuwXj`nOKAB9AVaF*3=9qGS70~rCNeu=dr@0d#+Y1c z%?cpV$y4!NL`Bb2I*Xzw%`Ht`P2j=}J?MOg;#JB|P{f1@{Kwi(>+gAM;_c%m+RvP^G%`qu=U+z+;#* zG>ho*vyl}<`>zoIbOYCaiwf|KB%A>Ilpii+wFtFDFKB*#muHnxClsz7z7J!h`o-gz z0pP#6$x#U3Xa)BA@IO!o@8ARnf@W#CV7of~ikw?ZH4kNwhx`Mc^MZFOc{U9V=D6+@ zT!j`u2=;s5Q_lHksL*g#mTLPS=x#e$b)p*dA*qPBV2UFwLZc%5qWdo!9HaX0*w45* ztxVkC8WE#$w`Ag^NOb%Kayl9vFI_`)baBwp{~MrV=?hSEN8ae*;-!`Ze=x|iYCjNi zeSRhC7 z)e}JIr~eKi)U75UJfRkWw$W4E6B`U-Blz@9{^7PW`Sd%*9;%b>6o9* z9eX$?s)*O<;Y#GTC?fjpzlibhwLlQyxH0u}A_S`eOykY4I}30ROClN4K?a;=heZbZ zhpuD)a?J7%ner*PA}w*!cvb}*V278Gx_rX}t<;)ZIY|K>GI@9oeRXdOu0zsl5lO^` zD|TQXI`qFS#b>|?;B%?1D4^yzr6jMMz$V9A8Ni^wo+kV;e~safDM4V@c8%7_J|wI0 zIw@NxUCX53F$u7djEjB*8E<1)=lal<${%$y$Nn=*=$?V;^FY2XD2iz&nqc3qZ%D9F z&X@>G7f1j4Q1f3*`f2{_>>DP8RJCtL(yJ2T5twmlyJ?hIw(AC$;N+<)^z?3JdaB~# zp%EgoVywwrOMXDd@1COh7Xy+~w%;`k_%{Lp(;fo?&X5{q-gc|S-^b$L9qSsRqge$1 zzTQmuw}kwQ37mgmtf(Yb%;qaE^sj~TTiiBfsipEmPplEkYO7oaIF8ED_7`tvc9u1> zAM1xlAYYcpg92xAJDQfS{T9R1v@8*4JX&QRa2NrR`JO;~=l*c&hxbVOM2rFrL`c2B z`eeX@nTRCx4`LP!3k)}|rNP&Efw5Hx#)PJ!I-?C*VWb17AFIsP8*x-JB-`lJte~vu zVTCMwout*-Lh}p#RomEC#GD33Cnlhc{(+*zL^P8TI1?bTf#O%4P88h^LY@bDtLN_n zA;Fg8Awr>iGTUZk^A8w5gd}y8u6QowvDQ{U@8imW`B0$0x)pf|UIF_uo|7tFYov^S zZ3#W9b~pcL=fvrm4c0)Rhw+L)iT!U^&QBcyxcYQH#%- z&p=)}_kq@c@4W#JV1faaV}RkT2wpt^v|%Tb8{~NAy>s-5DhQ3GRpo9`72v6qA%pQH z&pD|}@D$r^7HwV7i#_t3ejq~eJpsarVk|cVRDDZ!PL>1Pq6@{|Uvx+!D{23nmn!+u zfh}wujqQ@>QfV|a`s(>dmYeb?gEHTNl4~>83-z46RY?RGn0<f+l6Kr@n0kQ0$JskH`3+hp7uxc-C`RBR#ypiD-YU1ik$U zgoU@0?fG@P@Rn?D!>d7)npy48Wk@Q#4@%;Xr_2vGe=NigDU7Ehe{g7aGi&Z|=qcXf zt@3qvt7Im!6Ko~d;`Ws7*|2HibF%N^vgWd>7TVwytRgfoub!SkB=9nMDQ8idEDOpE8b)d z5CoOt7m$1y*L&O^Q65OS2}t=Y+yBkkJiq){vadVqWb3(sTY-xg*RH_IE4Sh^r>WY0 z&KqxiX))={?1O9FMV-6|0MMm+r+O zx0d`9d>3%*hEgiC55Dg%YL|;)8v4xXh?O&MWspZR0Z9o~c>$_sV@ovh%J4z@Z(06+ z_!NsN*nhAEdZMX9reHf+=zr~%(bVrM)DICbH_$$m6Mc55s>|~CY~Yi)PDVMLnzh0M zXlh+6GVmB;Ex##U(|6nu1W+g9qz4`u599Zm93E&758|xiR_rFi<{Az-{j%5@oT-HVI6bm%5j=XMSwW+Q1B%$E^qdg%>YIi=7{z z+v|94#o^puJ4f2dSvfFE<=}|&-0t`}dH}dcv95&}@3}Yy0~7HAzA~!g4yocr?UqDG zOQZ{<*C*!Mx7X!nex@O$WD*FQ5;dF;{+lno zKE_~1ND0C@0N3|`>nPwlI@0ccK0c5}TR;q)>F;aHnXByYP=JGfK}n)}FFuj$2^GXq za|;3}ADlJPJ`(_rNpjNYxiV>PC#?i&ly1xqne>6Qvd@}%De6X^7OcyIdPmsFX}R{b ztV={+emISFN!oa%u`cG1FY3%NpBe#ep3JN`c8e1&y_kf=n+Yh9(<)bBVa`+qEDszN z5~g@@e{x11X1B%#G?*N>tCbH?uEP|>oOZ{Dj&(x;&1Wn~z9S;`;u)L;oq)KSITh7A zT~VkSR}`QtVYD0$r-jgx$Oh0A=8xx%=x}HY>>A5`4hD0DkRRi=I=saAJ`5#8upFZ% zfI6N+wcbD+hVtqbIsUzez0KiGhHT*7IalI24!jkIc04ppE=_eK36Une#Ytu>bd9=$ z`ez*7n?^q=uPYkrAMnMMgD^Xs<$)VlvWDl z#Zh(4gdKpY1)8z-UR$yIySNXb8IO))%)YJFBs&3z`eW}75oMp*iR<5E3)zxWhgPH3 z#UnIHQ%Fq_>S5!Hlhw5^G*hHdabM0Jk8IvtV#^b@u|49epD zYMF5pfnxrU88?Oawo{99s`e#}w0ob24@2U}y({p63Ay&4$h|tTMiNtzcv~uoo{-9{ zyI2QA4O{VMz9>bl^2?D*_;UQmn-zKSx4G~BGRem_Ln;)AdK~i?L?XW7#1?!T5qNR$ zYW#NQ$KUXsBWy&)i~Bimg=;bO__`4737Ut4n*Q*hjdq2aAiD=oC8zWwYs{Mf61?7|Ol z$-M_b8oOKjH=&}Je|l6hLz=~@6(+O%cvXHVS+|J&Bl6?Jx~B7VO}qYyn);z8RGzGp z-e*!8lIoE-4c#DBg~S==hmhEVA0$sYpUq#CE%@v>ON_Al_dvg!S!M45PP{eu4I`2k zOXP$_`yVlB`FZTch`?gC8rl2-{JlZAnsJ(;h3Wa0}_Z1v07(whjM+-3m2-PMS;T*9OArdDOxyUZ#662HAghivC zMktn8EjdG&;(jniNLG!6EhEGnHQdc?yKeba_~FslKr-J>%@4vn3-$MG{r&4D`2IWd zU07r`zGLmkJG`-fTxU+!nIC87G-k$5XQ&5UF6d6EmN)SrH9UUV=1f{L^;Fl&}nfdCvlL7D{LIlo*D zY0yQ}kjL+h%eJOfkEob0V=1^8HE9y=#oNfhnO!2sKk2>->7nco;0NbBLOL?g8r4$8 zt&l8pLKu zQ>?jjBT0SRL6Um43}D!w_Xx)uv9Jk0K>0g<7Ro=h7{r?LNd)Cz)8DVr-*=HS#^AdU zTRoybp07W?ijSm!KPkV3$8e>8%E9#&j;~VRN~?PrTzQkcN}T0LdBs@#N+mdXx2csn zuj+%R>Wx2xD|Q3n&_N-eRaa!xVyqoL0r$1sZsTmG~YIpytpya~+g zKi+i|&QCYO?%^Ha?3CA5J+W!R^5s_7zKM)6EE2){egr~cWuTsuo7p?nDt{I!Iq*@U z|G`J_9%-xu#dH@urqc9xN(&L zY*#RlHCLJb-(&}a<|s+zVUe(_xIKZc3>!TM_hY2{zb-H*?|WKq^~~5%N|<1<()-Qo zA0evz^BIAFsMFOvK6y0j>MM8L!{-qGh5eTYi(thoP88b?Eqv+P@{DxcS2_*%l^(_o zj5!ENvEKU8xvzAyxv%tKpKZJy6nht^0^&pK3(#wd`nc>BZv4%$h8)gmiC`A$iL}3j zzy%*X|D*81tz_b5+qBV^R@zpdf-B#@9U2hK)8;1JoFj})gaQ=hUD(U8tSKm3S>HT8 z^o<6*5X7ZY7_MtzR6-=$}Gt$z7a=RO$WD~ zz)C0K#Eh>OfEYL=$I}^+6=!=}Zp6Y(&rdi_C*GIBLudUPvvT|!+&o^#YYo|0S&4Y& zN>B5#C%`;giJ25w9^JGc&i+9#bK|RN@NYe{HH?}ccLFtkXRKJ*a(`}JEY!R|)v@o5 zLHYXl5o4a}zN7(?NJn>2MPN$fXCkGUe?QEm6X;mxAK<5u_$i?Ud$!>3M10XjXo~0x z31IL)_HSt;g}#@-$&X$CgFJzOit`-1Ux4n9$2C(MFu$wYC6Ok7h5+e;l-X){iUj}9E5o)Kwa>@38Rbt-akp`1_fJ>0mI!9L_E z-!lXv%1d+xb|6!pc*Ka!;h5(@!ns=@!DlzOCuL;w&@2Ej1V`VMWx(>!7`MqCahNdT z-j2o><36LK$wlpgj|!rWb}H_OgwD80*xxVCnzyF52Yz<(O@`G1x9oP|qs64ta2qA= zXX7QhFw)OkQ?|`_HPEB(lpS*hnURnXD+D6Q`#{id%Aeq?#H400jbSj@dHaRI5*K0U z_1i4^-@H%2S|k4$#aao!g;*;q>=e4|evCR7O96dZ>X|QCKSLp8u-L9)tjWci086^| zvV3ykAZT9D5C6Q&4xI^w}9?=HV#x*?UJCN7XC)?Rpu z)iy~o9HFH%g|E>k56e*rjJx1gpP$rMkl>DeSqg?q#kMbhF7ct-zN{P4rysDjC4>aa zP_`Nxn=(Iz*QC#y^4JnNgd9#IAvss%ESu2H`}} z$680H((@%nZuyLyqxTFETcxZQ@_#$!{~yRdCcH!(b&p;^7CM)SRL*5K&=rMQbMs^{ z(p?`KM$#G8(GS2&ID0(Gff?o{)kPdZjd(IDgL|6hA1xoJ5;Z5AKic_*doXucGcOZF z;zof(YYNbnmG~d`t{ZFd7+HlZDd2T@ow{^mWNN z>L9Cm%2nV-92>rkYS^_~6kvyc&tq#A^0Fk)b7^e+zepwZPOb4kE z&oE`EL{-#OM||Te@n4Ml4^Ed1Y8J@P$eGcv6je{Y+!Fx5PQzv{^2AwTp6C$C z6N3L^_rPDrGs<{HEzjrqg*y`L0U3!s;@<6qbet)TZV9Q2{YsKKL z=liM9pIe^r99ma^I%rP`O<7-9%O>jC1t+m`hqC%!tmTeM@2COJZ%D|OzY@N>VLnLz z)>>hZ$8^$QCcVNWYL^_pX7{;A4@TSd?~P!6E0-h4q%-!*TwSr)Y#B69 z5Ox<(O2Y1yCwWu!Gsp$R{E&kJh0gq*y#jd<9pc8{Tx&=bR-Pkd<(b>EM$?>!3LBc= z8p(28Gv#RnX( zVNvLxHUpgfy-ZX0CJ;%qZP=IMlrV{g@*Ya^+6jlecI!jAb`CgYcz1G2 zTTey8A$0suV$cWWpDWJo*kb6d*sM-pgYj6v6`TM?U;qP$Q~u;mqM74|q1ueKBxbc* z{=W2e%NN4cGoA(u??dz?QJ10aHwS>^5z*;DNv|3(@V?QSficIBftR{N42*ojz)(h< zFv>#{z`&16jl#frs%KRU238{%5SLM^Z15!fspTg(Vbz<1{UvE}MSmi-u-(!F^3|xk zKcjkxhrz^hn%I+yVJ*5AmY+2Rs6nKHqjv7LmR&D*gEOYOnMGUdQMQqW|Ku?&B(OW;!nVoqDu4!oWdEQ zo!G8;-Iqb^OGn+kANEL(|HhJEVv*Ey=qKT{QSr%` zYGwXM)JMnY(B#3XN$Omlvj^66b4)R&^^>(2Q9$ba!eI;ZC%#?hZ4?F{uKvTpPVT~^o4Hwb6ZBtZk| z9~{#J@F0c2&-)1h(*%?Q@1a72*)+s|V!U*hb&fgS3`+3YlxmeaQ!haDPf*~xY9O<1 zp4JP^Vq@-UF%}!=kB2aO|80j;BDzrdOoJ{|o(lZdOl?++yu+A%0Mv1>>?JFEnJIpR704)o}kRS|qNb5$(yyyP!2`q%H| z^g*vl4MZ;x$2B`+1kxsteqHp*vg-e6LC8=BPLclGLW}>H$ zTn(-aaWAYFMZGnAU3^y)FzyP1l3LWmkz!mkMU+6b;o>-jV5f+p7*7qX$6zIBB_!ciX3d;J=K7c z!E3{dk_Zu}=hq>ceuW%k(4+VVHI{^|UNE6+eO{kCCW-^Kv@Ggt1yoG)N$Wh8@)#3@ z?=%d{#EIupv|lbKjEb$AIx!?b9<|g0(SjI_n^l>Mf!s3Z(CPxdcW&Jk-!i%FLw0%&&HAcT!= z=aH#WI}Pl~<1r#|EEW@Zl0VYS`feOPhyy9Ftc8ETtDQO0T6!wZu5Bsv*OV1RH8JL2 zTZka-C_>a%*+)FtfG+h^_Tb&oWYYB6NM>nje+dmC`O%0!QzQtnzhWa1$$1CeN~38c zzf#oq!7?=BeQmO4_hTQ@(Fg7>p}fA8M-8DjZY=<9SNnIty&nyWk~`0KYD(_x{Uf+| z%JK-g({_0bxucCZmpst`HDbgG9*ssw1n=@yOl`uzD{ppVusG}+l+eI~A$ z*ML&>nRr}?X8*6~vrkUKq7Cen=yO?V1Nyj{pwIgqV$x@%xbVqchCb7_3VnVIfIg2d zb?B33j(iLaotFOXKDeb1X==kG4e%qt;yZv%i{78D`FEL?zZk}$^$%o8I?(}1BfTY(qA`O*lnrLC z;D806Mq)-wV5%laQN`d>r(Lj)qm-3&y; z|FbbfsCAW%pdg6TxniteKWVc6Q#ofgU<{dmgfTMA5vRKQlocK_1hGT;*?e*r{B7pL zDFpp$FJywR4<@AAbBui{!RH!>FCFm3RXM%kHq?{c80_h5~l zWR0HJzKw;RYsLaSUoUBh9uakF;oJt;5djzcF(lSPvykSGeHuUDg&6)BM>|T3W{>dv zoMO)Q)blf&ikhE0`_6;YD`_H(LQ`aTm}wgK%Y7)~r*sy?PX}~IPY;XUt2aI5F9Tva zTpcBTzG+Jd=O$Oim>kX>0|ZsQ9x*eFem%y_teX#O5V)0ls4 zDe+gr`Mac{DH-l;V%Z%1?}bHj34VtUjl`B1`8{7-E_Ij(`3v^R8Hhrr{TzI1!a~MZ z!c<88N1KL8x3{unEBR=PLSweZAM zaojzkOPXCEDOUMFXenLf2kQj*0%D$;5D=qQKN4n5r{Z_b&d$@skmSRP|$i41%DgD|2)}5ch+3i8JI69 zqzjuxcvTkk==oSAzk3FL!^%%2ZG_|@bqE(12&?6(i-5yR`4gUeNw$XkqMH!lKS2i# z@EiF`BufvV{*0!g)I}Tm@ka154l>{$%#Z3AU|h%+03*plfBynL?E$~yYH|lo)zbhe z-vFePfn#6FI6&&1o^Wb^5XN&(2wu$}R(WC=>ffZr#-LV((V#-Urlp*JvysP7)xrE9TbJSpDacJL0rIr*6D)+_Y7H9d^))(*aLe}lMI z1mpQ??)6c)wq1X%5dkyO4*~PfS0N5;S3oEAN0O|6p3%ugI=Lrv&eln{=%n^c@-Ybr z@u<^RY3WqJDI*INzV!yAlkX}mowBq&V@Rt(j&wr4MDhcMt~1Tgz8=!4htw!~QGr_a z_r|1?gbj+nM53v93Tu`ZEqm0Oir8W+>^_mmDKF@e<%KBl1oIF>5-Gd*uI2xCByp6D zje^F}4^B2ero2OTaMXha^JB}&Jt4(f==t$Vye9fua(=wn%#SU77ju4e<4Y@36{R8;cs7FelHBjY`;0f~O?^ zYc>9wnm@(PKzE8+uqD#EFs^c9cbW94e{Lmb0gcWy>ev^I_L+idv|k(5vo|6@X-t4Kd#V>>L#Po@Ye2iFzSc>qNdULQdeWs=$F?4ZTByXm`2-Rw@VX_ zJ#`^AAaUe^ujiia2LJjqSCYR#UpC^^Q|ox{5Q5=SGrhbgAuMtlL{t$27Kf(i1`wS4 zI`*)^z2l8v;~#LzX@+P?wHL!2uJ*kQME3L#=ql+lfuP|ebAl1vKWYtfNPT4pRHTQx>D;%h@vG9dOqkrouKSwuiLdl(5(wH45Cg z|0R*)@2`>CX0o>nh%HOaDr<^M?~L>~lRr-(ekO&+II!Co@Wcer z$}e{tZl!-+7$=+-1rxp>Lv(t*5z{b!M(Ed=edtit*=VCEpEs7arz>G%Ykdg8f-Py- z(W;&n2xcGVgApkDWLW30*vA4q_KRmL%5ew(C_!x19k>*O{Rr6!%2!~MKli>wq();` zUDB{0l+UMjKTb~$z{chu#)ol%&#qbiGD1;xq?Hr4$Nj+<;JgAHs*hVyXL7qSZ!uHf zz#yv8@bu<1fg2MH7g~TDOobsX`m^dc!I``=KPbLRPRSUXh)^-)()vNDo>BGcp@C~a zbeiqzy;>Oa*{M`7pr5OLF9^dX>-2J@t2CW7V-e%W`dzMB-$deX-Jn@NDt_#S5#aov zpKr+1;Gb198t_l>m9U)E^7Yi?uR{Kf*NJiC-^hcY4f{7F3ODTEXb;+j^my*3z%Yn* zEmQ(gzxLJ4V~9Wp2MpBU5AB+Se}k8-B*yu!q+EjhXs%|AGX9NcNpd|gB2>>YuNe76 zM@KJ6x&JdS#{=&Qxh}d7WO?K{q13-$fk1lcQcabvY}#()N3c*s7w2j($TCKkx>Q%x zkrjD#Qg@xS4en%h8ItM?B+VbkrZ=QtgZQiC1f$;i(u5|N^&~kO6J!ym%KAY}dgbXg zD^ARKxXFgWP{(-a>Z<2?Dt!@VpwQw=PjeL_FwFWy->y`kCuDrb6cPH)H3`2bV9U+e z)I^98ED2@{%}l(MJz#s$IdSh|p2nmMlQ9+3e6QW{oBJSpR$=Xo_~v|^pE9>Ku#OqT zc76MHH#2^Y{jDM9>RWV|Piug~u-3sA(}PRHLn2BAX8h0!9Y6Ff7uhrR%W|h;aq4RJ zz&20dZVP{7DYi?V*d;AbeHMxdLkk&8==R-A7<94egEskiC1s|yXXx{ENwpEuqfelT}Y%aAV}PwEKl7OyN|OLx%_u* z1yakcOaAv-a&?Rz0WZk$A8uE4H})4E?p$;m{-)@iA0yR6ce3JWSAuNya3DSju)-bV z&4!N>Z20gc20w?4!M>8gvqz^6gr{voQ9EaUUyfF%i=gJ!sJU_gl5R&eBOIXHQ$i;l z(8sGq29|9oI-Mv3sgAa*MJ%3P$f~V4$CB%EDS-I=N-2n|&v$_#^IpOXh{$5Zzst6E zLunS)`E>)_sx{Bh0o%b~0YUhS@I3KVJESs9IEP#qw`vE2@BmT)K_VsDHtt;K37{1_ zNzw%b#%TU?Dm>Xz@EiSd0 z0*7!S8q@58L9Ipz9J+Z#6=A~*HwEeM4kodbq0AOJ-?180vgj_uzvASJZAw@ zni+v9hkp@&gXKyx%L6%C+*~#17j_=p;Nkp>tx0n>GXa5mbKexSxX$b7Mtl%EEy@fE zrsM2x50#b-5W#Nq@;azInKizN;^L>Z;L<_tlmNl$wStZcF-i=FJMW1j*?L9Uyf%@` z$@8Ap7)Xb+d5l!G#iwtNT&ZIXoH-cLS*wn9C#907;bw*(n*$`f+d`cbk0iu@NSZ5o zxlFW|O{D(w7a?7|PHNAjjymawWs>X1dy&*kC+*QmA2R93ryHT3`d3M8njyZW5y5X} z0Zl)nU#G?Pk9et%gh?kMQ(hvQ`04jPQN4vbXBZJf*O6+G4QOz>t=J@Vas}Fz&ZmR8*8}#th_3O9EH;wTpPayRRV|Dy9PQ_$rZo@r= z!#j%!`XCN%9_pFVFAmf6WL(hgYLz%B4kyWip}|J7gxsY%4J2@aC#Fc46-C#sdLdQ2 z`s@iSaNv|_M+6l+r+|6>iSqMLn#SVCLJE?@GAps$Y}mcG{BkG`&plfKryDSgdjt`7D3`Hk#Ca4adoOB?AX^%te}mnWfLL4VOA zX0e{Wpugy8%$S*tDcQNm$k9hA%PEIBpRC4{ORY&gW%j{cNuc5{&W_Oa-il4?yithh z#l)bC$eu&ls4BjRHFBHKc6H7}ynmMG3-=Z2X0l^|6snnid=vaKerYVeV?vU8jBzI! z(MrgPDY{=AcT?!XefF#rzZfPD>D7$2>}<8p2^v5F-rA>5&6bceM+=4%gmdy1b`M7h zB{`L;Tl$lN;L>@irTl0bQHy?$$r#(Z5lv&Z8e)!=92Fh>1Md2jvQiWXC~wy#)?Vqc z>DGb+Kv|E&r~|;At~zS4=*w?Q9cp+#@~^4TO7+cr`X$|lL)TnJ^v_3SOZDHURIHlDJ`4XkRYt;aU{xP#X;KRjG-;?kj+9M2V z6+nacBK#|R6<0~BeJ(WkkI2}f!S{HB8a&p&^P` z@fgxp?AgIqk>(j=zfLEI`S+Jleizby2u?8C2{>N&7{^etGvM$AcnXK(^N@Qk1~=IC5bIq^u5nW+7G0#9nC=Kz%+AXCYt4KGPw9CgGLFrDZ?rnplb z_zhht$gbN$c>xCp4#Sib)%PaS$87ZVgcZ@yI*VY#def7@(#J}~cyLr^v*tX>vKx~1 zeL-T!c_pg{(4U3)rC}h;<+u!9lV#59-LU`T(WYpk#^2inC4vt{O{jYQ{0fr;@Sj2a zV^ZWFaF~bP$ud`RL9=aZ&ANhwvL~LvO}7b?3oy&bRbD2gRq+74{eo}t#c-aNqDQC| zcb1f2%k`7(dZh}>aG)(6XhWPA?t`kIVAo5Scm%b%CXa2F<=mgy4 zJNZ6Tku>@IP(%JTKj})-b)~scMWla6+gs)B@zudKsAV|UBLlq7-KiiDHRZgS6fxN0oDaOuM? zHBRT#1CpEKc{o8`OBAjnjU&~ zR6?H(v`?4I{jTM0h%FX(4ng6*M-nzkl^{SLhCK(tAR?9MuU-xquespoW2^KZW?OfN!M zG?p{gvK#|ZG7R#zYaC9wkD|!qQ3*6vMM#sBsE;V#B02$ZCX$De)KIgx1M@z91`i!= z=va+fU;Kj{Q*RG|mqHRD0_?t<)uuVumRB66ISq}G|5jZ>VeF+xtsR)9*7uloMC_-qqc}ew zLG@&@M5zzTq8Ov`CD=D+C)vN^d+O6Rs&9xB1Y`~RroQU)Tiq`LHFAJWLE{kU6jUvD zH%T3-HWKtV;J6adrP4^yZ-@!HaHyuwYccp!mUc84kUxPZ@M|MfQk~J02p&!Jo$XLV zq9xotb|(5w@JQ^PNsID4DGVQC^!WM)zlN%KtAFOG)z+q>9Psa5Y3pCshdEi z1rsCCA@rL9`gtOK&r_-9(cg)_=dtE|)?A?X537Yg;mX9Td2azer}HxgF{cnmD=Sdn zen}a}H0!OOWbozjfC&I4qBDbXCkrDDHx!Z2SqDfdOKPgTXgf`Pb%*JO2pQIfH737O zAr4-xJE7^v!`09SfI0zM7xXXmrigd1IZCimE71e4MId$x;V*_~9QK(5y#H~j?hN`N zTT>~U&{P4NLI@d`57%*0?|f{y5bldbwnqB5Rnrf=GyyCF`lUreJC!_$o#d5a zH-j7AgyxgakobK>o+8wt7W;z`d3v4Kdbhd6(j@p!^IGpUmxu@#vfSF-1fF6Y)!euO zxXg=t%gxrUAy~MBb~sJ!kQ$0h4@uB85Hy{N_9t^N6;+;r#T~r#=2U_nuY`=V;8@2v z`)VJUS%=PSa)Hs}_9jpiD}LFWANIfD2XRM&A4DDzKL{g3A8g8jLIq9ywj-)?r7dfU2&C>!IrJ0if#k6pbq5)op|Iv+*BBpsF+-sOnnY z6sj;jZ*2lsxZm-V;**SgKSlgWNH->t=D$Ewxu`u%Ii-D1rWldp3ZTw>s2x%n#TMXz?`(K+HU$Oc>n*GQB zHj_rBA$sVdn&K8ed#&E9YZ2={wn|=ethdy_lMJl?{5KYYCRYGKeLF=VsA@?p1m#`? z1gQs`M9`vJnnF-*)bicvXFDhXP8mN!)<)z{{>kOfWsS)n>xR`o=UC^j=BY_IpQ|bw zSGFr}Hqdl>$0#B6*XLuQ>D&u}rm7iDqUphcrqHy{ph?d^r*U!gzvAbl^5_1O%Ab6o z3L6Wjwz6*6K-ARKo&g_h&Q^tE5aV$eg_HcVmA@e-=UGWO8bGi)>DMUEgV|`-+2Vib z5GAQ@jVaW3TmXFDTiPT(`~IORd^YBP*Z8Fc82H8XJOK)ZwjXhs2WZu2?X)>kZv5Cg5uK`qe}D6tJ) z2(3U_RPn!Pj2ml})URXsqDwgqHH#?wQgm53d?`prmSX_4Y9A#ho{l-S^gQ1=pK{f- zrl^Ma^qZR?8|If&@}I5K@}m*@kzgd9qrb>bDqyw)FuM)UF$s9tV|G#v0CusPDhZKv zv5;jYt+A4Dd>?sQ?3?}SVTwAp?dnf-Qkq4T> zl)83o6Nn1_8ZA~sUMS7qotort2R~u;4tm%BN8Fo$S5;kq{{aaGB;F`QqksmD8d`@$ zQ4+gm&M=l!e7mYJ#PqQ$>+Tf=A-w5m`VPA76h~iQKa4=iqUMn4hhsD2cLs&pB{NJ|v-1mOaj=xd z!vgweX^gi@Vqd#@0@lP7&Hr~2G{@JFMRPi)dKvbO;X1SD;}Jg0`cqn#FIeJ*r_Y1% z?-geW@^3$!kMPCELioq-=#%i*U(pw%$FdpS@prt>@t=~~NOJ6~g>`Gs))w^G&?raF zA-8AUr{h%7A(vy2(?P~v-rr6MsFJ~i!5NNh@MVX)IMjGmtCscNDXe2Nh|=q-I%b<( zdSfeHg_;_>dU5!D+u>KI`H77!`a=UuO*#kw(Kby>>M5G3P_ca%W?Azfcp)0Qum~F* zM+%-yY)zzNEBpJam$A|!49DcxqA?EB;OwbvSD!9;7Lr;w(g;VC7_tL>Wc>i$-jFr> z_2qr^Ch~oFF2-5t8~!t8AL&K5t4G1z33%^jdeZKs7NFJ3)c#ececYbB{+*B3lU=sk zr?;NWvXA`V=)dV02=esbQlC>lR{tG~Q9{i65&Cc2r~i-oPw@deU3|cu5|Z=YcHYpR zRm>Gn$NeXUBD2xrEj9g!IK{{G9dGHc?3woO%MKR19NstA=RFVEXL(U>^@%eRtnt}NNr9zU^hq+hHfvsgPUZ4mI0;lt9HCGq%HY` za6zz;v#Fv1*Xp0yrtK~X%y6x~cFxfSUd0Kzei;Aiwl@OTYV}uetwx&(_MpZ_hP-{> z^D{u|=t?e7i!`6d(6{r_KDsz@Mz+As9-h8@`l$f#ZGV6hO(vwwz$oK%miwAibm^k$ zgXuU?zbbi_fW`dN-$e}YkiBL+!&N*htu*Yz>_1$Wc}PH z!+Za{q%Ts0ddey%pD%FpKT_yMIu!YgRF;<>YSYOr@Cb}N7obv$iLf%%WzxaB_;80Q z7;4!8a^=<5mv!E0KUOFD_Cr)8^lm3=vc+Zap*dW#mqlAuTwEtpAV`QIMk^sRIxYcFh_bA zzr)-m0SGo6%Kea$9{Yq`jEQx==+nA#GKRg8A8xX!q)%T)R8rL+ck~e)>0L}bzJM$e zKqUgGOaRg8P1vJn{_7CodX2B9#na;<5h>voEclUQBZ~_Iw zTTDbrrs`mN8eOFL0B`9QeN<8(Y@O1?etsK8rVYqip^f}rK25B3ggYN&_^o{@WAMjC zeNdhGdr^M62V%m}|9VG%Mn&Ks(4nE|6ZqHug#3z^KJf)Y(a=!oA{!UHIsMiG$2tF) zb3>B@C`EYbsTc4gh|j3q9%}!90nj?O;bk#9M+=pHZrRxd$sxoIUB-*IOUFsZOE0bF z=aQasNkf(N&K5?HS2>X*E?Zr{OpV6I9D|9to0+#xy}-@_1yN|`)ziP0wfP23)RkT_ zMTJ6HxI;H8PUW8YJ0OF|WJ%%pLU$<=vuM%tNL(tC+@;e>^oEqineHv1jH|Fk6*3!I zoAXu*gcZ81MK>$yvXC>B zz2vXeaG5o^(wcn6pMU46kFxB84#7IkE%X3fP(MtzYjrZk=Xd=W@!78i59j{q5*Wd_YY1K!gNpo3+PWxQ#2i7_VjrYNd z6tq9R(1$j04O}OHYuu$gxA9XzCvMK1MU6g30XsYdZlX`w65HqS`K#b~2vPL0n=a zW~l^cZc0^^_r>79G8_J&ok@QGo*Ir#hQt_q=z?H*c4#x(YFV4Hg?fW`*$?P^N7od_ z-owjNM7_+mEQkf}6MU5h-@^vqqP$?G5)Hm{^TT(R58p^`5J-W@Qudx-I97C&_YOpBgR-x?&3ry9+8`ES|}n?4@&y!WlH6dfl1ckN%BAOFwz_;b!!&;DWg z9FDPYAi~y`&+przRN36`6KLnM6o5Yu2LxJR1akEGhSBH#46>wNMW4`uKfCdpF$Q24 zSZ1hBfvvreGsay++MS$LJd1e5hi!P8xRpZ1)@$zRte&h$u~1u^KH9t%JC}ZKlFIy9 zUdESs2U-^HSoc38ORuc-vrNP^@~QIXh&TEM+mTl%nZsnsP2A{PSjA^lEh)2h*Q1(v zD=y!m`=Oiizd1j$-%o`clr-fal54AcCW>*7r2Q#37(`+UdXIJ zIF8b9r(<`jDal^Hl|$04Xy=!cjfp=H|DOeS@FTsTgc2uR+9MaKTWflx2Blwkf$zIc z?E8CdZQtLosOtOs?fWQSyN~|8eIMU&lUTi-x79vWERPKr~J42>Yq&h-^chGVWD@q<7-i0-1T3K zuO}@^&RWSBU(MCM;FvYOUcRVDF7Uto)E=p65{W*a?ECxHeU#r9e;;<*KI-2``-knL z|GzbQAN7BtkMG9+7v=Cj>Q3!Yjs%M}6v604IzzmH39=D;!iCJRmzLnMU4}nU8(`n} z4x8HhT*CUbE|cMt_oYd1Z`S_Uoc1;TmXt8a8Gm~|tMXcfwk|L6&FdHRrut6IZtVO1 z`r>BlXFvyw8}UpHk<)fG73Wf{o>M2g6SYf+j*saV-tdmR2B3SUDfHXBUqJ*|^fqba zOg`t#E8TYWLQ(QbY5Yv(Zuyg*$`v1LTklk{tTKrkbB4R{4=u1=o2_q87K{y=%^Czy zSb$DbZBxRr(!mF^GKrnsZO5kqa5}27^zX&?Ng|4zlyR9%F{$yj53B}W=*Q49^t$rEr-57EaXgYh1!>(j%9nDQnLdLg28Bu5r@Cbh4Qd=4KYL*n!tq%!*0 z;nyy`C?|%~Om0`pGocvHSm`Gm5)Skl;a6oX@@fAxe&nQ#%T#WVyPg1|8t<>fw=-}9+lm!fiw_k(f=m!CgHW$(*lGYPz}`N7~L#yoR_aF>7RI*nd$y z^Jxige16A`&)lBU`VTZ_`e<<2Z8S*8 zP4@lM;v3QsGq?6j4q$Uyzi{o2Irx1v8Fjpu94A86AYtn8^&Ak6&w)s?@M}@W(tD5d zxJ`ERB`aGbq*?A{odg5)SGmD!-)-R**kwelP;W^%M!$WQir8tpJ)?r4gk_;vJqO>b zHd*QCyBmV?$&qz6nIuTdk;Hp>m$8oj4#(Qb7=j=Y)X)b?r6c=WGznU?zs-5TAa9Ip z;W0$6spZIgfo{l}H%8e(cA5at6-a|7#OwM+YgdKteT2S%he?R^zpgV{`|_O6EAYKc zhh|i&GoVNfB_^r_96d1{zp6jfVcWE+0Z0>T#xl~3T>q6i!9Sgv1%bX(xn2KI6Ylq} zny8G#M_5nOb&!3vDh{<*GDOwE{#2EI%R^@y@{CXKs?+n++q^y>)&KA}$DdO~|H-01 z4C(t{8&ga=%kk{!m&J2X=mHJtiaG^6c6sMah!3cNV%?DqJCoJ=0DdniROE2_T{NhQ zbgveX!s?P)V#fyc5JDwNCGE>*uT5U!`XF{nBz_itiq$?-Z}y8(f(eu|@G-k5Z2j*o z#W|!ZDkI%|%c@@U3y0Cn{;`NUnNc$(!%V7fU`%Q1D?2Se2~~by@!PWEzwZ3^pVB7S zd2c@?TH-}8KYiSP;=gzP`Uib~ecGQd2l!L)KX-=fZ*o+WLt;94)44GEC}bG`tLi(p zaEMN{W0Ni;AN_LRzwaIry7$-GUE2OZsO^5efK+(gJ>x1)yk}Ac{``d%b5$Go&f>5h z_IHYD5z1XfuI|Qg_e=6+s!e(Fl{+{nMwF%BwabJO|B`0dx~G5BaH6orRh)z<2nvkT z#%Ub6$&1A$jLe|EV2^!JFL}I2F<|=x*iRmfW7{qSSrs0=KHR-J^dz9SZComfsKO~t z6RgP-X|m};VCdI;er_9HXJG;Mwotp>7DIJY0^qDR1J6~G9ORyw-`dyQHK2N163_4h zJ_Sw=$8Sd*!Ye!3zqz?}d%xc5k;k28+O}zXW3Z1MecIvf_;ZoC!c82r435x~S67^v zIFwP5r;HbsB-F6Fhg?CsQq4y*csLVDhYpS2t!@cNx_0fSUY#7ST|Vb*6=Fc;lAWIO zh^V41&Lq+>Y>3t_4}F);V$}Ip&do}mC!baozHd;?Q-kh@8=6@Or%<~}f?fq+hZn0I z+VZ)6-pYsQKSHTq_8!=iHy!=P_Ge@l5H3ZMJ0ieTeBm?Y*5?fxTa0^aG~RBI|@L;Dt;l<(S?x=7e+)$azD|}#7OPCbF?BJ zAu5;aVmL%PQcDuX$vLt!ZN97`t}v&(%`U87*2(r3SB6QR+1HpYx7a!|w;ZK>2tLl= zLoUAGjqOqSv;x%(-ThLs-p}D`5@(jU@q_g99pL+@!l5--u>C%HLmIo6X6IsOXr)lh zi=B#$%0SK)$-t0OI)9{jZSvj>$o*^vzB`S^hrL&xxS}e*_!eO*6MJCD9G=Mh>G)%> z#LT|pn1(H1-W7AyAdReRo&CRccj4^2B)-bsRa~_@ zLTy{rougm2^<``K$)SZym5^4LQBAfx-9r2G8Aqm2OjFR$XwGZc)xV`!^sR!viDM-? z$kM3$X-9Kh#jgILg;S-eAuZ9b9;Iq$>kXq}u)7k23f+pcXvbZqWuKCxVEaRSn$ID^ zR*b6YsnOT5>!f2pY4{~D4t8hOZ%Tst&6?|E21+Z!Xs#?%97>1;6AiS3!X(Mx7^z(y zy7$MLco16T<=}D2s`wQo*zyLUMZ-TAJQ>9jGi|O)H)BH0nhEk5wb-rEFSKyI)sM>S z*FQKMpX}=I-azHQO;_&ld&tjUlq2uG`N!wyy97q8^oVx+b%2xa;k@ey6xP=6qL!)yHvhb`-rlGW9X;@`r-Ht}J%Pl#Uv8mnQ# zdXuV=O>a&Zg+hjuP0mhh?K%LSzSKbNc!|?$i^J6j{CC4$?;I4oy;W#$Ea@WgaCdkV zD}tAzqt`@hUkZmNz~Tpl`@upi=eP-ZefI_(5RY700A3AW`*OC zev#U>bLJ*)6>H`h%-+eL?1i37=z&a;nDy@HYxhI#tTD1<1UQntgHK+aM!=i zW}$T`dP;vO^b_O5A{WI+L?*^74$Fw&-(3`1_?`;3?q;NJ(iv7dZ;zKTmPRh@7Cc>Ip zM9Vr?5`s?i-nRCULzHz2p=jJdS=yr%M0r~;PN~vvsZj`)AEly- z>tolyFR0aC=0CAG6c4684T#B-aKyY9*?qt)V0YGQaB~g2NsewzLXz$x9J3qm4SJ`P ztbc**VU%cQ)8{FYJ5B89(&qPWI))@!=e1_0jENGmQqWtvYyS1C(Xw>jarvQ4a1Lr}z`FjkqjYlo2U`CC<23yVtJ+4vUH6nu zXsiAp2|iN!5ltPhc$fWC+PN(OrqhXCO28)mbyi_!hAcdX^tDFv28 z1?=QEG!ZJqq%uwoRw`b3!y9^qTrbJw)W~7`;o4W`AUIKW_Nr}*{dY~OHJYlixiI;J z=+gl269`KcRmhMM-==V#jS}RdbrypY1~Z_uYH;@DmuGiL*U4fC@0eqI&^GaSzA=)q zzCZTAS>G>A-D9Jrd<2uGO-KDgZFLOwsDA)Nq~qP_XiYu+nz5HIPuzh7GqJYe9k8y7 z)NY@1K%`@LRI>FwA~!qU)2|MuiI*iGXQ?k)(=&XMCu`BT*ryNuy+ zF4x%X-7IAxRUDkt`1yEEj@E9RJ#<3thB*fkIA${UCGT`Amb1o0yo(}14Z7Des2M_r zQI_UFQbzjt_y|0LMi1I!$Po6oo;j|2v-EG@FUS`PB{4N=+(`AJWb)glbWVqOL3ld_ zHM2V%4Q>z2BR(*-Ywvm?cln&|&>kiR!N-FB`8l_!=jy~O;SK*%e`1y_%8||?rv!F` zCu1e~m>y=mY)C#Bj-7(lqo2;3G@?k+0nRJVfs z>}+B>WqkZBnUf**t5Ie%&W18`B`b62ywEq`0ht)vl(xEX?amhXLrAo)oQ7=EtQb3B ze0)p+m8l}zKD%8!qE9_4Vj-8R4K+j3l`4OmAkNBEKc>pwz^d%Kwg$HIv^*Uiy(96A zhD@*B_*Quj@hONvgHBF_GX$xdpSFpJIr@d!T71(>SWRL0zu3GUm*MqzMP3gXQ#v;5 z2=LUz9&2O{mNc^IWeahAqW2_mrrCZO1tvmlg$Dus2?5B|6d4h88=U*&G&O+I(8vs~ z8iUFN7#aDJRXAg97HV&T)Q*29^rmkwKQcd!@|~Y@q~q^8@ps@Kl2m2POp_dL5PiZ) zmXe%09ga<>hix!k4SUo7m5%55Vn%g;RW?PR%EC@d7D+?*{+xb@I%i0KoFQ{=FdCau zB#MGE{^IyqxIFGcoi-N;D8x@p z_8kQAA!vZEBk_YeC&*!X`*$?2L zzjRs6ye;aR%i$Cj&a%UH{o@>{%Ndfa3^(jfj?srIE&GUAuCOUbzq`$}4ezNgI*4we zB1zLavp;W~y(&3gT|lQc;20WHWE4k~yep@@Dbke6@O(`3o@WWH8dw*u_Ok@F%aiiB z2pHH0^3csYc4U5%CH|Q)bZs3d{bzfYf5Y4a_&3Zo5%-_yG3M`Jf8s;XvWGuIALY-` zNA(L-&Gl!nNXL`$oD>9kG9J+jB>yO$j2$_i3ac2f_{N?xj-uaQ#V>T{@NI&q~m|*^l3vydB_`IdQ zQ=?5Hf-Z-BTsu9S8ag@&r%&L~z(4YU5BYQkwTwLIXu&ztyFQ9zL;B6Orjw)rSjVAo z`qc1N=67q97~A*E{%JuEIX{kD!}SlojdN5InVj1Z^kt_<^nfj0KB{vgyDyC$R(XeH zR?@q31Lp&6`7A$grAC4|H-76oH*83x)3yHa_W1sd%x}VnQQmWT>cwsEU~l?Sul|jH zio7{%)D|~u)To_0NisxpLuHn1Q5tiu24sWpm?)DmnH4?q+o%6~=Gwp%YYVeEzNu(Q`d%4!4>_ zPBGoP;#Q+|P?CaclC4_FF<0)3s2`N}MbyQ)lV%2mo&I~2CbOLQ7T*}nOsLg?NjSzL zmYH%*Rm|+H5hV67s6a04pgP)LNZ=3KTR8i6>+a6PY=n?>ySA6~V#Wo`sQ;rM8M-o3 zU`t9@MrX7mKVAuseh;f_{}!{+)g;aq7tp{o=VW%{pYNfCUy@Q5zr0^U3Z(N!)UkLW zp3=z*7Fn-2ZwGt1GWF@ee=cMVbfIFbC|2PXp=E}o{2fmuh_m)x9j@|}tHW=L3YZ0) z@=GQD$*(nT0f1C6=|DUFLTj4jZ=`m8=-!`dR&vU|BwY+4=C2_TOj58U%>dy$jxZS& z6eMo387;Tvat%ytS(H=(RfNte7l`;l9ZDuwj^;4*BZBD$3mG7QmF6BxHW{(YOg%;eH+S-zbf4L4NHHmlm3c;Hr^4njVFp)t`z`Nq*5^nq*yNW zyH}J{9$xi4)K^IGW)ZS=cU}0f4{(C)44fbsx`*Hd!32&`uVX{X2@)Okn#s<@JYzXE zEymCS8k%Ux5ys#37yKYJgkRua_(9y;-|>U^jmIy;53-w_(b3CUm*5B4t;uRU-UAqy zb#?bf4GKbt{6P`0kP0khsC)($&3KZT9|KidB7 z1&;oVWv%LS>=Pf)GXm*xi0puv!T8JYip(Whltmh_2GKpkX|G75dUaOsUXhapBV3W; z6;XBhydty2VQH^Oqo)nzD(k!=DyHtp>lLxGX|G75r*kI6yY>Ndg)N@UD+0t>UJ>b2 z*!XC7K-#%;2KF+;JZf3 z)VhfnN?gJ)L$YWsO%q{Ts%QCADxHsn{3%mP9!lAqV&(vEzfgXfnef)y6Ysd}XWRBo zzdrmYET^$*fI9F`68@NXG*hwq-5|NH4;u6O<`&X5A`LdQwRf%Vd*=4)56q82@BS0I zF)cq$M4H4zk_KKALS}7^FRzK=?+wp&oiM-HY-i=ut`phnnajQ8+elf4*A(F~S-sVe z?K&}Df(p5=lja_-6I)*_vf(9R@9Oj2CsUHY5_#&}EDeD(-6vnPGT6eb9|QMEZVgWU z)V@4>S+Xr>Sb2XN(u20W`%irP!D#0{>Dzwb?#I(k%!dRdGlorH_)9J}gMhP>M~L4T zjrqNfQ7NAZR>FktP&Mlbn|I=8ogA)xPd<}f(b20S@|p0;lZ=7SL~_&&{JziRF(Zm^ zhmX1TMW1OBb=b+%J`-C)Y95vS2Di!i8aB91hTt|yxLFoET4eMZg{1n^SKue0+bO7s zC$WIHbt2D;&VNZ)k%OKqHGxKlaWdYVP*koHTuaY$|AdvxUh}350{-QJ3SthRgQ{Uh z=bUDZ6zpYZ9prl?W<_IljB*AyQFXgm(*-1%r2!L8{zMN}UN*zmBp2CgH9ir&$+xRm zQLXXICCB2TB^;Jq}jHsVFNg z6R9t76|hQLL-M;0)?4wP_+a=l?A^{xcug7f89T5}#c>YdLV2bK%)Lox?@NPv3_Y;` zl3feDg*h%1H-F8}qo1U`CbKlUnT&0$joz#&7z+T)X2;)6V?~>?*$2C2fk-yFdQC!S z2BlLPCd7wS`7F#fr-bdtAHBCT`5O(n(dc$quGw=}=Y)N1R%J9k;2?QhY=odMu5kth zC+`Ihq@{mNad5Y23Qb%cyIPh?wAp;m`W}X3(vw@@tb-YBHOfxHhX?k+JZZ;^xZ^v%FHky@ALaaxoc(VBd}pQMs?<0Pz{%+huPhHBAM5;% zG5P6VqlU_aF%(K|B+BXqBZv2m!c0mee`@`~5(fGGkTH?cx4drWuvt*ofEg?9D*c9`aJSc5BXF!qxK0bSmseBYA_@&a2Va zyDDh7+(`W+Yxtqm004e^5U|AgCAsax_KihshMVz;aO|vC8Syg?3C9MoJ|2J%_pG&I zxf1ZxeLX<%u6JMn!Momm1_9?2-svOWYx^IGeh&oI8TWc&pP}< zZDxd*uyQ!wDjcJ+0UUH29g6HcYpC#SaCi;?&nDs71p4tYgImXj=GU{aaUi{Wc(Ty@ z{wVEfj1Fc`;|KHXL$qVS;3Nfhcmt0XJ~^F#kYbJ;B?j{9y>WXUN-XTxlM-bks{plcX^j^; z#weiI0laqR$R6*$f}Y4<)i-{w|9|cDn=0XeBA`F6m$Bc!A8Ngu&(ZjRt0u;VEC>AM z0DJZF5`rz36N|ch0xnK5c&K%f@)2c3h-8aw{IXsqSEqG)XDdnFS)rY>h6Va0p; zUZxi-);f0gUF!P-CUzXZd}2q-@}eZi!V$MPp~G|hzsEu)(9b4x?DXE@hg5Y4b@h8( z?EE`dINC9UdMCYCl;nnRB9cADS42Dh9_`rZU1jAP%IJ}DIwREj2+TY_HljB~)HAm; zZdrLo1$$JmM+G}=#E%E;o8Z`SuHo?=1D22HYf-Y;+lU*THodjPE%@La;c|sLM)=?z zBHwAkGW?6^Rpx(hk$K-m@m5_$<2w3S@xN9+YrNt1DtX|QxKzCs^4g>OJNN1+VogVA zeGF1&9nL@Q+rAKuKT^>Ei#Qkc;RE2kd2icwqqwLo5IF8XaZ%TZO;}pGgZ|Q6@*a|W zKqqNbByLFe7TC1~1sB@21-tH${)R@pB^+E^kTNe~pW0a(YCljF18*bCcHOu~UDMqB zjs5D-<^$8WmCh;Rb}h6{x7vKL!Zp3YYr0I05Lt%djbq?{xN%egR<4d+-lA{p;e%W9 z$nGUYHD1`xcgJ6M^1V~K@-!@mrA=J?9Bkl1hsHm>=yOy|gIacTz{}Ha|6%-T7b6(I zYrDqGc8!_s-l-KDe>Z_junb@5vh&*k8bs_FstYTYQK1FkslB`=ySmzFFa=h2S~;q^xMIvv)NlHa+^=fFQR%C z8;JEL)oqlHLgoPU$?CN!$c&khj_CFh>?zw>4e>w1NPG3pddY`K$AImTj;ps9B@d=5 z?+e2<$X-_ejDY3=CMWusgab@io4zt##|IFP(4ek0zA;t}aEces(g~NgP*ODSW^eV^ zd*TqzgF`P6R~p0zrXWt7YYP~Hbzk;=&KbOt0e=I2COXz9$LM3c@QFi_1)*Q+1SE^} z*6D0!JPRY{Hs2u{pz$sAX;zdhv1kPM+q+z~k)7@jm+J*o!p_rIIg= zDf#k1h+5~pT_Wy7z7!c3`cFEi%+epMD7WX+6;2L4VR9$UFo8MaiHg?+Bz(Tbo)5Y^ zu&HOYej|zwHc>>l@A7E8c>1T1MrV3A%oKut9YlCoUhFVd7vo8F1)LvIkTp^(UGuN> z74~T$OsHvSedwvz2TjK`wmTXhd9dogm;grGc+%zd@1voh0j--G6xX9xBlH6IHA8&0 z60|x2UA+B^gxlDTTI~I+J#V;<#%m*!?bmIK=xczI3D78hrcUdhNb9b{LU;eZSmnh9 z@xrxrl?CT^SFG+t>bYyfLr)%@X04apji>#ZM%^>1;&ee{)P)AG)12m>#0k1F-aan0 z#F~Ses@gU-l`f{+jA^W2=dDyXuL!%{LE@#%WGCM;Q;_ug-G;iueIUl^>#edu$t(0B z)V|I3Jp1>Yhn^XntT+7lI6(75@Zs6PNoLYrg{s3(yLK>YLF=x8q4sZN))5_8eTUj4o+UK525xER)bHA&@)3jlV|h6AP5ql9m-u8?5b0F zKkeF~$wNs3f zSxz*&!BpIg&~;;l!h`I>r4cFphVri!i7i|X$`9fKwq?!z?;PY0p5zH6tRZ248)C^L z?1Hw`*APFuX8PakP|EDF28^L*w5DwEfh3}fiPq@4(p@E?_M?3uH1LE3|06{?nE3T* zR8amPitB=-E8GP~em&pfy7>%b4x*kbigGbJk%W!S`*mibw0>q5O3O1*;_&&4C?X=H zGO3PjX{sE_&#mbyO8B|1Gqa8y5!6#8B@Wcu3z4_lMtvamG5z^-j6Y8V;#>OraJs&2 zTd2LmisTf9|(K{cBeaIxrP;>MS+-X!HPEwpz1ZKG%WpE7I@RC54Bm+S>6 zZ#--ugr@pFlPp>U2pw~dAHSV7%}R?n;2fsGLEZpj25kH@Ph#}IRK?4!opZ zj@Gx1lrt;z)I0mveXy!L8XEU}XR?H?Qq>zdm12MYMbf>KinO$3q3&M-lA7CszHoxW z3!hD2WU3Fs>y)#>tI#{1)1`%q;iU1;dlP64O`&zLp>=c$t-%3W{e;%r2RXDnAFb_r zf|mUTts@CS9e?Qg9c#G(@5l)q>$r3=v48ys%gZN(#%(pswgs5ki?~&oNvQ)f;z3@U z;8d1xl8SzO=LZg8Bzulj$mR2(ZzE$V5ol4+O7bA(L`u;t5VF1sI?M{`KyU3E>8y1AFsTqaA1w5)#4KcyXMR_imgCP)Wn6_01z$HRoQyBOh#4XmP7Eve-ypm& zELs%qW0u`Q4-_+i-elKtPi^L?u4aJaTJScT;BULFk#JSXSiIa!UnQIN)SzfUq4Bx0%vA!|He)Jx>grDra9|1qS!S@K*c;OpEk1SyQ{19tSE0+5q|3{BCz6NKxxy)r;sY(pno?7x}8PT16`7G%Y zSw2v;Sm|7AX0oF(0_#%NzYfKf z;O%;xQ2TfItSfRt^M3#(?3$eY!m;7u_HA|zYN$<)oKE&))pId}*_k7)JBQtNcqHCH zJG=YMJW0Qs4l(Dv$q#fktn`9YvGpV=E22ii3_u^Z`9`H^k) zkOKk3d5h+muRfSHuEMAL92=FpIS>NBcml?Y3^I28KBdqvuF5V~lDFJUl{?6l`;uBa zCcD(Dr{!y{PNlXL?VCTp@%Mf5XOl(yX0fLIaQt~cT?v0yW%xhf$_5PvY-);^bBg0~ zsI`{6g3U|631tENZ-Z_qfn0LYz`)reLt@y*rE?QIyS^rxAl>6|xiV)Uj z_Z~8i>N3mZ8aqXQvdqb{Qa0AQtPn{`~CN{lb^HHe;D5N2Te)yc$9fnQeWm# zQ&cgBepB2`dZ#@D6R)q}#tR2=ce2Hp?9xbF)MWe{YX7@(#|x8OT`PTOu70Ays1a{w zkm-At>h>X;eAF#eW*HF>wj1ODgCqF`X^I9x{M66=<2WMA-s3tmbR9vLEL_ar0&W0^ zHI{_u?JbyFP%xV-sQ32MNpl6^P;^JK@EN7rECg8pK1%ms5&5>&TQgh3C#va#NCASW z#Hhxj4J`R!41XLx=r4>GT9a;MHNvB_2=q;5p@|fl*;#D0ZqutZLDM#XpRih^u}_uR z$i*j<5xciZd`-R@jhHF^`d8;#GrJ{RQx-3`K6Ll%Y8b$)A%fucXBlu1p7&yl;Yv~jqHhsGf->HH%;Hd*_%%bPzVYE99AsnJZ> zR&JVN>GhPr{y6dqp3N7C&~-LM6+7&;70Sk3C;rEOz^CeMM4yeys7Z;OPb?5FcOXpG zgT*+qz^60Emu@3Cs8fg*i7+Mk^b3u`8gJtp`x+4%m^BG>kqkj+{`VWRV>4V2aO6Jx zt?_>fM%KIbGj1_@bBusOXJ*oaglR5w`(LWUqt7i7=;g3TB`h+s{t6@PxjdYJ^S|W5 z#VhRvc|or#~>m6v2hlvGDZOV+*{4M{{dwy!ZgM!9i>7 zw(mh>iPIwJEgMt}F6%*!$k=pz`Y2r&^6^f3j`gTE!Q(^K2w`4n-`2F+W(M&btbH|I z8!ue9imUnJBOhrID&o7Rj-%aJ@l}_rx0R=M6K0y0EC3TUhm(hALIE zPLv44EDbOVY3jj@B!c+j#dF#r^ww!vaVlQowM<4&yecu@>pv-Q`S>Czu&?jNA6Mn@ zhY?Yv)vRP)!B8+7Nx?}ReFS{6$?LjF6C!bUV8c6|rHQ`D7E;?H!ii9@-&)s=y`W;T1z8?6wkj#s@=JUi3f>s9|Ti*M!C z4#xKqr=NheVzwCH{3#rD%Mq-f&+LSYurJ_lqW_9N*Nv~egMhH&@qa`q=qMfzcCBOo zeU&5*R^Y;+{Fa}3>|kDGzuaS@=l3@sQQ-aSK3A8H;G%|+Rc_S~FW$S&>iXBEs_U^- zU4Q4dS(IPn#jAETeOWdA(60%1o@$yuAgJjHS5vdq^x0HRHw86KRZV}F&pTdNr<$(v zYueA%G;>pc-bAO8 zUm4J9hw9Qjr0?+JUF>T5iE4W8UPq}sQgxl}>N>~j@~#N* zJ6&}NzY}@!Zgn-Sy^)&!7I*lKbogz)Ie_ZlTMfUjT`a19H&s)d-&Ru_FWzyg3AV?| zKy0Zuc`H-cDft(OCO_+uO&PqMj$&oVS4xglX$4s7v?p)SE*audwV!cumiSlpGVgC& z1VL7)R`LNwYvx9=TKjdhU#_uLrm>ZZAD=9dV@)3xC~mvFpYCw2yA?n5Z|K>)Ek?X+ zdct5rIvEonmCk-^LB0F9UvQ@2%R`@uf{)v8mo@qDc_;e7Il@c7^oHkw&wKurp5*yj znmmtMknzKs1C2hP$)=CRE=nzE#C^#{OjQzM^pl9ClgHloezekl| zSkm{+f+uFdm7Je_KUcsPE1u7w>*o(?7mIO@)3xM+P+wb2XJ(P0w5sKvf*n zG(a_7;A(nEH7#A>@bhcBI#tu!jfP(`BK(?CHNDAi!|zpIz;DmHhTkOBbxU?#|2QIm zYL2Vx7OSf=Ro53)m+<>6FW%#-DLpU#Wy6Q~PZL-5x%~0hk5~7z@!ybMKYHigzoWZ# z?9&$q6xej0-_}}Qyz{NC(odl`gkz^lkC34X{gSmI>&b%zhrf1feZItkY7fK!Q&hbz zVRsF=3BxQRTJs@0ki(_7P&Ivh&kM3eNr@JHHnTX~)`XH>x*pwvmE;C{FylymXerzJ zfXS!l?KW$uyft?_>*vJCc++k`C*#rbE zp}e2GD%pjdGTc!j^<4%Rt$1aRiP|MS%R~1ai_o$4dE#K+!rd!a-pqc3*n%O4)z95E zw)vk4of9Yf-_n17$d&G&UXKdYnWrl>KZF(>;q-eHjvHA{FqJe!Ry`+xqa=hSW~XVc zn8J?&a+pXCF@Ci%8JI#v8oE$paQMl(fb$X_x*+EJF9{{ZR7iy)GPA z0&ihKMr?EG&+6$T8QA_zozJdSM{e>?|AR=Xv${S3*#|XPHxA~Z_`I&rf;~Xy?lK>O z!C~BfMVzgFc?Oz>wp+`^`ggAnJsGXw_#N9eX2t>$t(9YVGm4}?JF9`qpxv>x%V%E| zdUC`;bN7sG{+GMWMJ~G?Tf$vC&k5^Ft5MH~IRY@P)QHsm^21=w8z6aL$X}!<*xomg zC!O9wZ|<@#gEh(HBNf9pl4kDyAT#Fzf7uO%~BBNuCG=?&p|JmHsjH`j0)Hh^Jto{$3zqi_LZn!{9JnwB; zo)vs-2J5(crnvcMX1spf}y`UbZ>Wx zdw(<`gL}0WzMll+-sqDbcEbiwSInh0SoM#_w!R@FUiumGr9x5Telo#JGVKd0Sh)Ds z31VTnK;nhp8Eoc|C$E!{qV#foiJcnO191mQwXFfsF`2fzlh?Yf28?1qW(XgFkWzyW z`3+FswH6j9%MoBXQjsq~w2@E0c`HTE6=4&iY(joTLNppXki~pt}5>!Lo{+pSOfIbh_ibXO{QNC%(d%@A z!kl*MNhdF}-@_{OzS`a=RnT>hSfq<~X<xa+w@)hwwauqc;O_8ZRs7({pIIc5 z`k)_+c_ATwZ;Y6JwC0RP@4CbIhMGT&5%l>#pvTm%Z@yO7*~9R&!f^|hNS|3CFO<2y zpViFktvSavr)18bRC}san}f1@Syun-6bAc+4;;a`Egn~Jgo~fp#;w(zl78i4=SmIC zDseZ{jwWO=wrv=&L%nt4&=k*G?dVf30f{tK3Ama0T_pmRhPg55MaeQH!DQKsjad6D zrt#H@xVwmNfd$GW=@4-xdLrWN$)FGOJIY|6Yu}%!m}buhD;g}lt)kI>FRYkszi}|? zH)2rINB>N4)%b}IS(2ZqKz{pLCU$|NDwV7C4tlwyy4xJ4e?7nYp9wpx{+W{+r{8kz zNi)76c6^;`!q3>x8?VCv`$WZ?mePFv)X&{?O{1}FQYo=>8^WI>r+5Q}Co)NZ zrdq=cEQDnJ6(ZVJAw;9_kPvxR8gMl3f~+GQe~ffIC#DPYNo?k5Fjc+f@4KQCIVWnN z+x6CZhdA{=R1tYL06&Va^?d^tTmar7WaI0ZrY}yvrMYp2fv?b2|CV(l?=o2v%F0u+>rNdDH+4iz`zDK?c{sPmIjQR#&G-z2PC}^R!90y zW=$9k{7z0dU!BPgrl+l>y&{JFq$;xbNsWGzYVltsCj3{`Wj{3+|$Aw4_;;b zD)8PMOP-BY8nF~@KQsHq<18ff6Ou%g_$?FxpPFR9~&2YrZ32mkPoKc~qs$Z|1b zE5ac2vvq7{A{-p;7_gJWW8@#K-7&i~8XK^SIUy2?t`FD#dHNfPPimhMNEfLUlPNG) zrGB)|fu;B7F|DBK_;8#(k)$r=znW&BbWwpfXcU3B!Tg7m3bmhx-0?O(tWn?Qs)1T)(HL7Xex`XOf;nfvI-koRVp+kv;Mwxv48k))D!maBL zTCAeX@bWOcL=bMIV~zCtGhZc?)z27iecFxXQ2PRc^lg12_-?m|{b0~OCBazGRKNH; zJeC4_!4mqbpqgs-5^K#}3*K8>Gb$xgnhhdt6;)6n(UDb^#y?Wt#*S?wryJ_XwpiA3 zgVj6p3}NaE>#VBIR#ouoL*!MCoj{>}6veBTnJm}(t2Vnl{%9YRy$qL5_Lml6e)NSH zcUe<~|NS)!_IIj})Fq6Rf$HOOh(3wMelGR?+&c~{Xd1J)QNXiZbE|gr-I>#VniO-g zN*<0nGWU+kf~GSVj#Z0q^6U7scScSH?8OS2Cw?_ilT}M4LP!G%?`IYBOHF6{2hHd7 zGK4}F|GEhJ_8dnHBc>a_$B`(^R!>)KHv(T-z8Fzau%u*?#g8w7t@8KJcab{GpATiR zb=a12x6r?fOQ_EE@#WcdgxdEG5DKpOXzY?O8|nTsBGmeO0pPf04X>I2r%Y(y7+P>2 z-XjfZi7Nr)@m$3d0#o*C2GWJcR;$MzecUb(c(@G9*6Zcy%v~iU?6Z6KMr~i`WyJ1%w1TqrBC#( z-<(E|@|lnvU==@YDw(t2hugvLWYwR6pX9IbTc3&FuTSd@zyDEhYQ$#aH!r(@qI+DA zCfS7MSQz`xEDC0H@w=)u`X`&w@}siu&wTs24DC?ng-b8O!YjhdNe0^ zo5p0J7iz!G+6(5Rh7xgN+d6em>`LaB>F)drhV#t+$^O+J2;#{q(mIQ&FEn@YT(TB) zHW!kk>GZjGlovEtFK$xtj(4lOy{XyFWsH_DTDz{Y*p&koe~B^<#HwD)oRV4Q@Ws~$ zMI`@E$-%2lFu;Fqx?XIPS*YzYx`9cch>DIXEGiGPw${5Xef4CXDY4%yiS>k<5Aj?) zTTOL)UsEdt7!u{_Q#|%-$>C^hz76HO7heRHG&nbCHX7vB=GCb?Nh{_<{Hn>_YDQ77kJfK3am zOkBa%Qw+NmHf@T<3cRk9!4K`CVCjEUrE$s6NlX6YA`T|`RP4cp!^l_9=GgN?Ki%}H z4)WuymbdS|~xw07BS;&FyNKcQo7q$^R#zT^JWf6Ms)8nZ+uwL6tRgWC7#HzZK{ z;yD7O+dB>@L~X2b!5r}wqc%KP09m53Z;R?tsIg2XmT?8w672Di461QJPoS@Z! zE9%NbYq!ikS2AHS6+~iZEnj*PFN$N}axXWJnEvDKS)VoTntqUK>ANhuEaK5$CPK8^*!F3lo#KCe*f;{7&KGYnHBcM-Biv`azkXKykd8VrE}V z>(Flf4lR4k|I@;?ELbsG_o94X*Rzn!;LzAcRV-Xn-M#p1S|mQB%K9qQem6hUIkW_~ zqwya!y^u4eX4h%3{fb*=Z$;9}+*dK2Oe~g14Qpn8VN0bpZ z7vQWY;d!p;1r!Z}v?3a#*(gR@ckb8n+}v3ssK2Ssw9)EqOOBc(kpJur&HzsOldu0+ z`v>^#J1%tun>%ZGK@*pQOfFw?AXS*EXmy56KVEu5HYH50v&x>??U2c?tgN7^X7Lw5 zDYXK)J*NhoORhU@{V>aF3Ht5HB%V+$JJU=C}zM#7!rjhQyBIXqR?atn$GqGnjw14d%IE;>iC&E zM+EyRjruQc=V;nrm= zy9p!2r6dS}`f1;W9+g4c&&6U&gIm%Ai=btjY~GPDp~tuz+3CUka`XWH=gTqwQci-= zkxd3bugy<()3-&QQ^>nX$?>NvmMM4quGb-V>hz(fw~3PO^dVQ9J77pOr89iXYrOc@ zAEHq3bG_<7C)&aj91-6B@)rht-F^#6et7ypf$e%yU?)#20N8pFHH-9&m#+J&>VClK zQe>5OU|Hi9>Fb8Uvn*-J#rA_b?92CHt#KP*$TQ2kp;Oiyh2_M@up(~~om-%D?T+cT zzz|)NwW3s=$o7z`iWmOjJ%#f+8;@6Xk*cr^M0wh|Lzc~Ig&$#0|7IVKrSseF*zR3y zG2D~rMx9angfR&Izs;fh_S&2>PQ4u!Jg&6KkHi{%qeHEGOT_bK-u}OFJY8fSFcm6G zT$2b+G?ZTXKCIL-?9#^Z-m0FTt(mlnSx&e z2X4Ar#Gn#yTN&kfUh##iOO&PSJjZ>KYU z>p)!wzZ69c{<(TG`1QQU=Zq64?d@LTxKI0Pqnx|6Zd5`264uA$H5MKD!V{y2AL!7j zU|94VeMK@ydGC`4lU0=d24zA|I#%HHo5QeNo+o3i+;q1sLF=W)NfqZM59Y%;GSx0& zac*hnsDl_;#NfW{5sqXs=|mBBmI&J*a)!P6hw_0pe%cwnK1TCa3PJ0^ueMZDC zGBSue<0C)!8;HH-ZfCI7&<@8g2I1Q=^WO^7Z(x29-^xh2+P<3I%JnAg$R@8XouMaV zb9tbey{+MhXXuzF9JIyXy@Lf&ZMdj;AR9&dD@HnpB+$3UE9(L1Z+@2vXdQq)`D*|@ zDH~8m*6ob|O0RA3PH}KH4|BsMx1D|bP6-fi-7hjn1MzXax_)d9bn+vjc`qk^o>hq` zhKv+xVAN-J$mT)DAPF6QB%UC%NNePIp&+`&-J{jMHipt>(q}h5ghrBrd%8 zYqH<3^AZX4$q-X7dOLUJ2d0Y$Ad zRKwUamoPKMPaXGN9tfpIM4L8(`OVbPOm#O_j?||}D`!43@~Wa8Z*qkEgpREfVpkHH za1{5<~Rjuz!)H7vX?awkf(#>Y=!E7e}n>hpCtCS{E9**+|8B?Q5%Gi;CHLk$B z&CN~ci)xneJLjsfRC^f0PtAMT|lA%Reef#uQPaCsTwy87SqJ?(Dzj%``O%`P~Q<1w5zf zNk~KU{!AV9C$T4#Ql|RgF{{fcEpxgQ%t)-E4t$#TM>o2^im(hc4+%1F0Fc=Fti9Xz zqZVsUSVQh%iw*61CWK#b!@=O0T?G+tI^#;ap>|a{)DErqfdl1p#Z+@h>X>D+b zff+j&8F*zGE{JlE0|Dr46+O?2Vn0+%6xm`=f4EZAiQef&;n*4MaBm*K$hy=WbjSV< zK&BEy;$TDKDf&!En0{gPuakIUNoxZ)RbSAa9mnFDe8TCP=+uHX8oPjigplZ6sLRhk zYddvUc&lkZO%_%!>r6Vro#nS_&5i4;ITSlj==p8<*H)`}_2uh4bpp@uz<+ms8^)Qh zkSgCz^CkAPRhgln`Y&30QPo||NT^fJB0zHDXI!x5apYk7xn-^&AUX0gKSu0ybh(HE zV>b+Zpvd{*@xq;FQgo0V z`GG2i_=^qtM;wKTn^MS!I#?ke4Ess!ih$XcS?&jY?(z2$2WuT@XapnQT=GTzu9fH& zZRK%)ou{>b)t{tyvToB1gpf$7?3Yy5BmcZJ1w9oBEbra}F@pSuH>GIsvA!fJ_5Ei3 zh!-A8QLn!hWNdni$H>$<@`~T&r!i6{IKG7i2F14=NAVQ}d+o9`)2;l)5ZXaT-=O%~ zMbemU{@;QUXfLSZs0YC`LG%e&-IiC?YHuR2AaRAv)jM45^P)9uZ(#(aLFQCElGjL3qF{!Zf&4AJufvMg7ZzHbZo>{^|HBzLI)9@>39zXSpukk>isbs3au?7X+jfm(V*nV#|Bi85@v zRjZf1AO5LOV(YbK-0J;8Aq`qQ&NpnsaMrwC-Bf3yteH*+FSaPw)7aNUY1zUF&HxDv*A?Gg;i?pjByVi8-UP`T&$Wh)p z(GIee{_{|)_cb2PkyO31A1rcJ<0EiYAJn|RRc#d?x6g{7a25Yh6=PO4^`6!6`BrQ5 z5XhJTm207Y=z+}C?7sKbeXqwLP5icZ9<=_yKBxa%cb3mMF5UZ+x90RdF+zTSqJL>K zz-n(8+nJZZq>N`-hOGN9{2AT9Xr{zscK06_z=;3j&faB*Si$xGCtUwGN(N5T8p-DI zxirVL_)TloH~0CS?){bdLgOz`t(}_t3RzR@gT+>^iA5l`G(ZkOe+eD^Q59Y!3(5;;N%cv{eHq%o7 z$OE%0M{il`A6)8Yr5-K%jrpY1gwj8lvWiAeVML)K^#mCS;-s84PUDL#F(tsw# z|7jNXrF(fKBLPi{SGm;HN@ee+qe*d>OI@zik;AO-8U6c_c4FzNBdO zRrlcmeK;*ev$#vWSE=RVqqi%KT=7SZT*x<6(kS{0a|f^lWDCPY4Gi6#(&iwe`>pA$ z%lpT(y|9qixG0mhs@KgZ`;srA1xpA(6kX|E0l6dMO z%Ah|lVl$uy9Kp`wILBI0s`UFaY+(I>M>1+;Lgy~M(WTy`)YBaO+=#o@eVD2b;x2Fb zaW>+v{gEhTBd#3o!kv{KYfKe(d5k7eahJ2_T>tGJWJr|uCdJ(N@$sK5{2PQnoF<Hxa$D*B3Nnje}4uHh}-|O#HD8+t4!nr#t+4Wa95qZ&GSD{_ew6eQ@|6>+m;k zmf>HMi+=<7PX@3o{GBd1^;(QvMJ&4SFAwp{Ox?%=GgY0M1@l)bI?kFU-9x= zZ6vJVk-Q-2-{OTXHLg@{nAG^N{w;2GAKLVxO#S+Mo98;P`OH{N;YT`RfzxZ|%&HSrDS!d;Eb+ z3flCg^-y9-Ud6{>hh)j`n#}ntdwe`HG|`v>mBBl=+DqyH!yA3ylse>FZH`Dzbh^f5kq)&G1UevSso zmFul|!qcK^NUKKxZ5tpCnE()#bs@BCN&_t*PBPX9dwD$Kt* z{F|P{s+W1E6gfO?VZ-bgsPLs{IKa;o;1{N5umLW$P^qV;X0W~28}{8il1I{ovVR_7 zXny$M$3)ZX-xI@L=dXPFg)hI^no!_fW_F`&{o?ZmYw5LuH7&o7cc~{RHA}xZ+I^_d z2b16PM;c=uZHV<)m_Wfmzi{&Vl+Mf!%aPyt#@E$oyMZo@kBIXv%&3<=zP>Zf#@Baw zWQ?yby3}b(O^>f@Tn#OOQOP#OOG=AH->%SMcfLzuS zXZ8H3{CPC8p8jjp{GM%Jk|VlPy~`p9^@S|+etVlj(@jx|=W)+s5r_QYay<>e+UXfv6Dt>&b(el?klH&tGTzscXZBZ)s zK>MqqW|ulssYgh!`hA%VgXV8IGMZHY(~^QsQd-qCWL9H_R^@&>t?Ku`?5S0mrtMd)hSMV$iu#tb>Ej=f#^vmT-*PTXoa*PdYdt;T~T-()n3%^o7NQNP2C4Ax4Qs^pPfbrU1{hOnCS`SMB4M=8r;#8r2cN#Hr|c!THDM z^MfN+ouVEhOj-e-=lW1J3M%RoRPXp@8wJ%gvAIDt3o6XbgepxaVOkPi^*p>w?C)|t zBEe&s`_-j~$*lUTLxuH|!ejffPMdkK?d677x^;F9IN`11FUJk@sv_2)s~^zIG?>e+ znoyxKR$3fdeyGy$8UHcGi~dY}l3bBxR*oSNFHW{SKk?sfz% zO8(l8m9ZlaSK5&>&$#nD7&)2#%ix?pJKwO%D65b|PF!VtzvY^7ZbQceur_Z*WbZ^wt)?sRV_aOWp)98A1FCwH}+7n=V#CPwY` zx%)f3jEfEF=jyMYx9fze)2o_CjSKxY+Hb&h{I05M9!hJ`egm;@aN1W@s4b4_OPIYxC;W#lR9I-{!U3{HyN&^+8KDN+s1p~P)ek^W9)g|@y`jbm_) zV?Q+LHt{0p0{jB_O02R04xGsj9KomZr-kOuwN(TLksU^ zeh$q)J*eYo)e-uwfG7|_PN)jC-#``vp+6v;9%|RIbFyzFjul?&g!U`Y-?=!I2uZqZ z2xdWj4=q^B8zm?8>sLQ_H?$nUZ)o2p>J@a7RvT*DP6sEp@`swLL-!rRa?PhN3AC=v zkgUJ3Jzj03Do|q!9&r2-RTI0arw``uX`uyO4xatU(sFu~&2-V)O`!#KE-&C1{RLC= zVWPr<;qJ@0exSJXkcy{7{w8eDC)=1Z` zb0&;h%`Nl=TpY0=?w<*v_RpfP(mxK@ zF2nV6>IJri!Zd8%>n)rR4oYe4CJ=pUeT87OUv?07ZOwHuU{gA!*iIRAObEDWUmI)L@)9MK30*sHqoGwaM@gzEe}7YN2n+f?7DY-2l3- zGXN<|K0WII$dFH~85Y+56TIZeH#L+ipMK(MF!?0-rw8RftMX1Z&4q~!|0@Ih)qkgl z+P-b@2ckIfD?$P2zt1(_sa_K*NBbgVoPa`p=%kaBh+^a~u+}5{8UL5nfzREw@Xe*jz47saFPR{vH6SufTIL}&p)(Z?aDj(byKL#bwCP%e{py?pS+pbM3oJ5Fn%RH=Zoz1@rz$paJwPSIXds=Ag=47TW64wsKxyUo<-#Nu=Tb} zf-6d1k_zW&q5ht)Im=a)1*;k@WeK|E`b$n{*uoo;F;7$lW zrn!1wlnLcWw0FuJlv}{~{NGA-44${gN^?uO%vtnI;c{3mE-rI^F)$*3=KNxyEPv*# zPDz0=Jb&i=^glc|Gm@9dXHyFotTDbWq%SAbu0>VlC58%jU8iI8Ce2W|6^(XTKpS&# z=D?C3+>Q!q@*nx~CpFs#-Q5nA3@$V&vLIC|3z-x{56)#rV4Qw-U+o-{+rJicnkBw; zo!eG#Ac0(L=Fsbz1U&h#+wIjd9AmEtz^&fl>C~59-Y5ZvEA5qyYp;5>E>(HoQG`#& z>L_7AKd@9{`(E|Rc=c1`>D2z|)Z5ajZ>MXxCY`!DoqAy^)#&dn<&#}fx7Dk%PlnYO zf&v?S_zlwgg48Z=K&l$=_8^t`d8>?LLtgc+4N|+jEtYDiOh~6LPp6)4sYb1zS*p?S z4dQ%!%6>hay3SIS*N0!xKppFCSFHC7`)H-rzF+#Aq-Mky4~bBfRBq~d<( z*KBHfM?cF#3+{)hEU~_I#d_p>{oFl+W-iw%>8YdmRR7e`{EdXhZIlu}dQGHz4HD|a z=ArfT-cTHLr0b26=%BTXmgFJXNo*1O#|YA=S42k>OZZxN$F^|So^v9jUS*3NH%05# zvb2zl>YfKMB!1ISvQAk~%#V-Ka|-`)jB~23!A6b$mDu)KW6#6UQPa--iy?3nEgpQYFO=z=mm6Qkvj43^{s2m z>s$Xn;@$=@s^aSZPawg7fsHk2l%PSPl8PECDiJ7&g5K3#MWu=_tyt88Z$**-Dldsi zlx@5kEwxr{OIvHL^=a)>YZ0g>KzXxOKr3&pfUkF5s=QbOftvs4J9F>uCcJ1{p5LF= z+`aeCojG&PnKNh3oO9-tB5tZ*(^^C8+heA@mRQ7*j9aj1my$G?u*?=`-d}v$g=1@+)(@PP54%R( z!iU4F--(oLf|2tl{~M`n)z5NH zh)VQWnw3|oA*R#H#}MLL_Ug>bBJS0wZtE+FMm6?ntf{X_F`)myRV2r1FRzy}C0}DQ zC1YDN7Ty2}IO@s9<|HFS$0Z(^vrIU8B?mvikM2PIKu}2>>yG#ebl9X?{EAu z^iB=Ez!IGCQ`2^8RZdOYDb;=W6`HfiX-Cim!l&+?Oeb?)0(13SI9{&c^vQ0d+E?D{ zvYkreKCED*d%-Fc?Cw)94A1i$%|*|hdP>C2jiL8lLK2TvVY#pAUrnU!wJCqZ2m7q8 z!wIJ%D3?e}QjVQ@Qrdk_DxZ2Ggp-2~BZc5df-*_J+}QWEgm#d6uHwS3S8_};PMy~E z$;jFkB_dCMi*xshcJ~j}zsj8*Z*C<*Z+qq0v&R&3#AOf_>+fyD(og&v*|D~VWJhJD zB9O@xWJ{UhGCN;qE_a`L>xFK9H!~I`kccfXJEH!u7)u>S8o%kestL|BnQIvBShY1A z@R`lWZ}{5cZ!svOoxI2NFRnEkF$^QKr=(pVZNyMuzWO8khj$H*PSMzMf?#JBMqLL> z!0zsqCtwU3lLZEtU)xHnHYv+`gFIJ7)}WH*FRBu618zkJ9zfnTw;z1`>^b=ONt5qS ziAfG5-^p(XFha-#jbpakhW~!#2^lY)ED&3Z6@DJ#ASyq zF-UR<($c7jQ-4t7mTFEWJS?9PslsnGkWYA{nE-cR2%sS&g#6ojw%lG)pMo;b3ju;Q?Vh*d=ao{=PT~FGC`dd_^datTlCDhQ=1PK~CiDD$lPfwkdDIuzfEOsVu=vB^ z$F|^yVp+{A1>Tw;CJ29i)x_IwJZKTxpHI@R6gq*wM7>eac!0<)NJ**uz8j{lgSd z<{|fr!!+opSyGm*RSF_ob>aks$92yz@TtqTg*x`8cYil402up_GXMidSe8{fu&8R{ zvXP}-)wRwb1fUr>y_*a?=n(i%>^gkPV1t-P0L%PPv?zi58>@QE)07#%1e@a0`r=>m zyL28wEE(}vx~Y@BFNvD@V6-ke$K+RfOhjBnQE-i8y5ulFwqkGzI%VZhY?Ja}fH@<7 zhJI=o6%AVmL6jaZZk=Yj=j&f%e+jpKH(MPyZ-QQf_nVew6$~s2I@^f|KJxEuNQb~s z>@`84&pE&DpP$?Qx~HZ8rP}Ai0QDW)50D(tUHZi}(`a3)-5)NDP3|`8v_($q7Q{iG zGjUDLrI{?NS3C2vr|-P^?W{{ZlvQ+zz9fD)dwomg%2l9Yw6~84 zkKcvJ1uHuX|NHayP=&d9gN zGp}{+!i3nh$Mv_ywZF`o#AKeEhW=T3s=7QxEd^D6*H+1T(p#RXZusw2t5snFY4%dk z1W4%GMQ1l$Up4XDw-3-QS~v^V%W`xoRqS;$z6PifD=F%WpFui#v(Ke|&GMDMNm(k=>^s%s@+Zle^RzsW!6!$D}Vf*RfI zuXh4sg4dWK$$6-!5E%`Dfhho7Gk@=^4B~+TKRpDh0+%so7L4PBr?Gk8~OW z=~E74X)RMtY+K00M{YE3(h`7h8UWa4<1s(})$21G-GoK-)TrZ5+A1`XO3CTB&2blI zX+}gh)ZD*PKi$61+|e(?CK!vo$wtcjvC88GL>XS?P%+&G_#&Rg;5Lg*@#o#tKhnLN z1^JxZ@2L_bDa=dS>zLz?=99ElzZT4`@7Ps;KCAw>Ws0i%EPwJ#d}5ccx8h9H)LFl3 z_1&%*9f7+~{AbLotO%t)ud~Y4PPJaU^=Sjdv&D0DMY%Fpl&falV+dJpo?p?!u7A*2 z%4eL6T7W~E`D;%^n`RUR$-4RF{E4`DrzO5=NSUmIIv-VCD8Qqwbi?{04^a5J;U|SA z!Rc!6n!O^fU(^T#3@fG-h7|*gC~t-v^^mDN9NWQxOLC5r{m;AGG@uHQ#D6_*wT>-z;(Pfe}pJN}aX`W#Cbi{gn` zA3^adS)yXk7BANo6q_sP@XT|Pn{XA!XUL5er0g=!IUvD2C%dKG1t@QF&C5svheBJn4Nl{@7 zNh)isg=kJPQLG@7NS~{#UwMMXCiAM_A_E7))$l$V+ZBziRV>>JDHBZ zk#vZ}p7iy4GNGGVZCApvB@yJvWO!W+F4M8DO)h9Rz z$0q+$MkmV@A|S6tuqdJ8?vMFF1pE8p+P&RrDD>dvxP@_}9q-VC=d(@@>{EODhaOzX3N2i>_vldln-~zn z?wDfF_m4q-cMsi{%TtkUIkig(Z1|zjtoad-_<|~&Nq6_bjkRv~F;%(zJ+_K`mb(k9 z?~0PxFIx6q<+ottHIEmk0Y`7y{uhr*n-C!W-zsO;=z3>oyy%M%!!y52aCh8 zzXZeY+@)E4u8#j)4n?sgDbhG1O|z<0QxQzREo~S@tx}E24gxPyx7@kB4r8Pbm;JSJ zsz&N)ngaHtlCVnya#|UB#+2WYfz^OMNO5Opn4h%t+6Q(~O_SKuT-AqD#UL7j(UNug zDX_z>8{?01jdDO>wCqoncUV2t&A#)o6k?Zpzxq^&J@Dg4b#2E~ zUCQ6%stDd|>qm+*pbRzKFATU>pbW3B9H=?E+`xx6p^b{Ak0#aWJ)fkQNoAI1l^VEE z$B|uua1k&DsnYO1b~4+G zXZ03TMRRYWd1xAJBgZx+Y1wyV4}xz()cEAn7!I zuGx{|&$(jiGzR+bgq?`dS=hyA^RR=2(<=7+WZn&?j-}p;?I{Vz)&WNE5kgkqmWqYOM*IDvjE(kZyeWOr*l2&+ zTMUna-uvmZ&G!B;xkSr0hwh!qn{dm!Sr<2Eop52}m=kj1k5dP&%A2fua?tA3fmDxM zz(n(T&zsHXTSE7aS7AQCq%pVXlE#rmIq@wd>oI^m89?|nKaBk91m<_sFqIuTL2@CMHWa6NXe9v4)wDd|LJt-)>bc3%P5rO<>+4sw zd*wD4YS0ufMK6OpO^7byQubTz|J?AkX}|cv!o=UT|I_l}mt@*Kr+Y@Yx~L&-Jy@<^)PEC0?={q_7!vQQI`bM(03 zeJH}-X^$CG)0O5QHl-xr``&9?Q%dtZvBN&X??B?h&R+*snu`)$qcNsTX5e?s(80iM z=<99#+o8ln4`oO(^So`vVteW#ZR4qrJGOy={HR0Pz$h9BWB~M&7cT27Eu3oi$_+B~ z;JrLbj(_Fxe*6x+-bJdIv^f#Y0Jfpp@6lU6AqCUl+UbFE~;{Q7z>CB@zTaqtf z*6|zkT4mk{RERIkQ)!A~2W9Id+DLYg;d?{K)v7a{t(Us#Y`rUfXxLi1SxRA*YEh*9 z$sQrMhQ3DKYl~Sp{k`(rQu>Af5t_wt1IQM$D1FQOwgE&AN>;J`;^WI!c);=1-;6Jf zEV~(O=xoQ=-Rln}?w{G3hI@a0(kXeNdYwK3|H(z3`ANKG+7I}*;mh!wGw)Z=*ncu+ zU@mHD>l%rzwUU@@$@!N#EpK;mSP(U|&qvsjIeDb7w$nAn*{|0f!p<1@;_DJrnHm>s zt;860C>x4b(MBZJ9&X)4$2euV-I;gz+Mi7t-ec|0lB=z59adX6*wq&6m0-060=(a> zJ%rtlzx5&c@1akgNcKP_MzmIEDaQI=X?Jh z9IEsna8yJC0T;hFo;F56sl38N4N8G}F#Hu+pmWoK7XF6*mvF1zgTOuMwteweU_q&! zosPfXz5CzcPn8}7j_Yqr;_v*lr8!DN{4DN4qe3pK$0vuX@iSundi;$;IVM(;6(qe0 zD-F&*q;1?p8_D^Lj`b3M)JuQoMv*AhWFeHPLgJj&@Mhj1`~LU!L)ptHu_;Lzl5?0bE+5okApK3@w6q~Wt>HzXKE zVeRHF2{tc~EnP$RydW-eFYoFbn6c{!5>|J42ITDjsSn1qF~5|P-)^%V*QUVd>Sh5X zw&DPil-D`V@b6dL)Lfjoen$Eh#no7_4b2b^h!p^R=EdzNBqQAR3ydoT09&NW{I&TCkE1 z>#gtFed}TDTYnHO*$ck%CqLDcVC!{N{6scU*{rc!*uR`059}@8Pq<#}rgqe16d$hn zWt_pO{14phYwH4pYSZk2O+qGb0*jtjuC}d|Z8 zvc3c)Q2p$WFU_T__N+TMIreU$fN#Qi2BDBuKrrB~KyK>UKw z5p7tq@+Z%+4DqI6h|QKE9=%Cu+s(kAVn)#&DL0JmxMAeVs^ky+42!n@qdT}^oN;y% zZCj7AXp^`=`pfh_yk znlyfuezEay2cOr?_eiQ~d>uPr_wNpMw{QL**x9ddWm z`LV+O=g*GxMqd)^!(ZN#j+*_ zXb51#?Lvc2N@{>#Y3M(x)&;66F+>3B%#)qF7?6K*E zz5~UiwQcQ7GfoJGr1X+zeT2Kwq(Li;lSN{n^bJ#$|5iL~2Ad)f*{E0*d=4MUtBIr5 zSB4%Krg1=nJ$&r$S9lg1tu5DcCo~O7Yzs0V9wWCr;BPMsmqM5_^L7tOEyhr08{{uny z5AX}Yl+}xD9J@Y#xw=4^0eZ2(EhoNY*B`5MDomR5M7TmTWJaPQJbsYD6qBfbT7cLdINsfb7SXt# z>b&9St%I;gZtNq;bBFa2?wiagbNMCNRHLh#eKlZ-DOA97-;`+c-${w?aQg5B$zPST zpmaEW_;s``KO!h~P@c-hzk}p8JM3kxmE=P7_ut>S)9%0bQHy5(9kkNn6ND_|@>$zk zJ@W@Z?GlZP#pln?9T09`6yS(ORH#N7+rnQl?rx%|GBxbMjBXIu~XT*EQ z01p*)V2MsJxjk1-?#J|PK=SJfyZXEnLtx~QbpanAwbB@ReqFBp}M6; zwvk$ss7)ULcE1#Q`E>#C=oKTZKw&C>@q$zOg`*f zc_m*r(>?OT=qKFq)4QB&nn?A2HY8nW#_@7U7mG;=Df!rB<>SX79Qn9SWJ5lBx*{LV z6}H}``?_fkwi=B|r_o`{Yb^el%f0XG410#-IO`?~g-zi`T%+&Ek;sef^eX)_hK0(d z1KBc{mQo0*W(r;G7aFaKhNKlLavH+}Orcl25*2c%7f+DzWniCCvB5C-<-p- zZtTaK2-sA_7rRb?YlLe=+$g7Vq+yL7yFDj=MP>alMHG?5kZk{2rvR)~hK>8OZswYg zdf#}fKJo`EA3euo_UFt;03VpI&7mZ7>?}bOhWM0TMM={HXkDkTkQSS{5|rsOAbbbq z*VI4n@x$#XHDst=BI@81lEQr-6G>*V8EFi&vZ^S5(eyZo^m6-7zk!2_9wz!%!@WaA z5G}`>c9zd7@sAKCN!Bnw>?Dn6-ve`KnW)#gMXPG$l15OD{Cha2EpuiFCN9rJtuV2y zQ@&ciqUva;ad^#dhl7waYjrVVX;AZGMVY!6vG!ERsRCu{w&3+$C@z7E6)SFws9D^5d4+lC6#8}hs1D;YQrlP@$zauD=HPTp-+UfXYlUO1wr zt*BaOCsk$F3@NHUyD4$IZoWDsulgLvy%Mg*-)94M_z`t)6U)02&n{M5E#cO6a-*uK z+ngEBY)(8yQ0;f0Q)h?I;R1bn*4x_#-73q)Vy7M7s5TM5psrX}YYa zYEx68}WHF zY(U;mdy7&(2p`uuhQaMGahv`1bn;hC@>eMh(S|%_HSGMKWBumWBrb@=R%*g9#$~@X zd0%P(X&GR6Ikw$M&x+WeDq@>7;Y^a^GlWX;j*G_LVacQcW(>#-xF%khxl9_7DwZc) zfw>|CxQ?8CYw`KUxzEgRnpA+pdJcF4e@(wx0;x8ZQclT^FcaiGw|$vXZGi}W?#AG*4ME%6bD#{<`{1{7N4)Mzp>l;Pc*O(Z-S#AoSKui zLC&Lop$8YSIm)l2@vAc+S#e|JZ{41*({H`0cF5PpRNq)Lt;>1U*D>T@&0sLpEhcZw zrX)9aB@|wI`Z%p1n?*pnn<0p?Sxk_xm8dCem8dJj*acFz#3IDupl}wSAO8;SC*H)8 zjEs8vBp)ha#b8GY>t6>5Eliihx|uQS^fQ`_&}f{6C|qtDw21iP&?ILfD>E>sRt)`Qi;gXG{D5%|W+aTB(`V^_(izT70N#J)2q`*I^Qx#7U5Mw-KR|6w=+C z%wFM!RM(QzBo>F6^Ng};ec3J)l2l}SHDoh7E6%s2EO<&4<&r9u%4(= z-K}O?w{xn-fPmSDtbuYcF1M#7eWr1+`bDia9f}fsR@80j9?oouvxHSwkE!a$-{Y$9 zg!>LN+_(4XL(|!KCskb0jJ;@2heoq$ z6c!kF0;?A$9L*kPq0d#qbAq`p^qsSpo72C&k_C2l*$mE1m^fz+DvLI6E#uSg5bXQre+%TYBw$O^W^-)+@X;U){28n3K8Pxn%_x92p6&<&)40Um{;h z6`I$n)!8V4937)!_MjCHDM-+k47bC20J0t&<_~GEqh24 z@{Y+UMUbSPUjBfYd`HpUZZH?&*1gCO+~^ z5C;))&t*Ng$k#9<{g%prB)o+)w|#Ljs0NSk1gZ=}8O zr>gjg01q2?nLZ%<P!;XQx$lhU;kI_ z&!qjEq`w)L*9SyWZn6!sz6-Jf|01j3HSCdpTVwAh4mT+KAs0~gBVE!^=DEMqNdB*M z7SOgobiGE%6YVeTVcP#A7utVGm-O~~{-3pf3GIh#_ZVc&Y4M722{q%dp}o2Q{xGRM zru3RmwhN@~nI8`5myyU5Cd?3Gz-kC};vtmFgKDsbhx{54#%2)uxIF-po`J6+qHz*? z@ItJvqOV*QLl4fi{I6iLnLP%rh<{AtN!H(VDThbZMH10{w1%~-$c`zfFu+jI1ftRR z0dfL87?BCvJAhJdhsFNr`>{gUYIj>_%0!a?5F}aC4-dVNQ`fSpW_R}~(hny5(V46ktpH??@CzsH8jMK`(P?Ir+PR0OoAEg`VJF(#&G7KM=w8aYBW0dot8k%Rmk^yqOziQF zJNs6UP=# zp9Pb9nY2g@t1kUMcUbM0B;nYfQVYX>e^^~^!LyEhJ+Qnb-HSB7tV>_9H2d1!y}4Lt z@L+$>r{?c|bcm?Al=d;mgTItA-vwo!4VD~bJFkdV=b9PDZYZ6oXQO#G4-T^vQ3AVa z&;G!Zn!>;M3>-hdbN{XX-9|HN=Y&UMO!9b4RARbPh53svS=>C70ijS;m zJFTjFP20dw!{5w<%QFLO?w?I#_0|mvdzj{wq){9oM(ZBAImBEsv3dO;X9E4h3iiL* zn&WT(>O206&Qo=sX)+B7elJO*U>bei2Ld4nu<=>uVUS+Z2L8TC$1~#BV(UtuxdWwF zn2RsMf|MNnX8zo5{0kp^f={8XxnYjX!b#QW2X(u0Q41I|QVY&4{QpIMNu2{WBfo%c zf*e3$IpnHg68FprC;n$}1y;APuhfdc?3&?=s4FSMX|U+>zgC2LCUzC=4=CF6EXIfp zQpFb8@NJf2%A|O{@LRt|=OS5u9wK*hXY_LF7Ud=g>DCko8pFKMR^O+?E!tdV*~^o5*sZ{LnJ~wY=a79G`x=N=KyKZ#Dy*n3GdC{M%2IgWHfuv)S}45C4ul>F@p%ub1)E znB#9Kj4r4fKGb~EOC`3MZ${@aeYw+&ZmlQYhG8Vw2^}%5$XQlCg!VZNu3PFOi^9>R z=A%+oqbJ_a`H1q)2?pTakG&z`IJ(?qE_H`rQhYMEOO@l)-vp^$vX0NtYM(VGXVdF0 zP(k<$)$bByZuaQM>GrQ)>)h>WkE`1z+S>1S$4(z3SOCn_5>uzoH(wmA)9(%4r_)EI zJ~}|BpW`ESy2y6=`o$eOeRcl>bef(`d5oT|ezkMYe)QNrJ7%-30U1 z!FqStzP&pm_0a)(x8@w%JCh^d?cMZ9hu%#;;Q+nUq}mKZ5Ck*2RT!N~{%skMG}`cP z#UHt5L_?AH%vKBj$~puuwt;OSM#PApGa}f)4Bh`6r5I^ln8aF_8WA!sEd~YSNb5&V zCaI;`y2<}W8Kz2h98iAzF(p4fbXt%fe@w}bzfSHw-v|x1ytlEUAS1B3l1G}M`%~8R z6^;1|Bks3-|FUr1zj!`F&rcb%aIZ6dO{8o?$o;$Eb+do;D0JQZ=gxFp`e^wBXd=MJuIO zJW?JI-@p>fONuMqdpDmALEP-FH(39m1uMlpz-zy5489KbMsxhH?Y)<)uYqVTknly` z(((ejz0d-&?1BPXU_bbRB3z^J;uqxUxXw$MEMD_goM`}fdwikdD~GE67b&fO zHBKz&re)<=L6(;HNUyiluXl*8_r33x(?``iAn_%~y>ft0*xOY#dycV7MmyM~%|CR3 zE7`NVGS8`-Rls>|C&Nqx8!R5m5~plg#XPl(0v!>wXW){-EM3$8kts-Li4sP@E&0 zIxt1$0G}no^8%JoN*h$Cr-9C?ebVp`ZI6%!ZF$P)HTXkiY)br&Qbd;@G~DEt zo~atSZm#Sr=!(`iTARsWNbkL$7U?0LHhQVST6t73R9_6}g2#pi5c|z4^kQnv7Meu8 zLauktFx4aB!kLC=%M3pjhv@1Y)yw!B$f+jmeKaTf%ZJ4u;NGbI8Z~@m$|nvpmqE?- z%~i9~sCHf1eyEm$_ket4poNcAG~gqP10Oe<^LV#EK9YF2;B~~q+e@u@n5M3$2KX}% zmmgF-Ty%yRo$p>J@xc85xT;BgeoOHA0p!EhuSh;-(b-IMFjV!qp4?&A#VNhrG}S@;rUs&x7<0r*8Pd2Yp63zZ`k)&MfyXI$hQH z3x$&kP(M1Y5j1`t1T8;Z+!-z3HkBQ8{i9BHK+I6{&A||}0f6+)qZStf>V_Yd`evNP zMUh$l6see=cu)D?r11Cp1L~-0=K%Pd%r`=Out@sy(FahyKr;TMi{Weg>qUM=VxDm- z^q$rDj_ooxRzC2+zIw>KT4itQb>n9L%LS8T7j?$ui3ZvOFR7NE))|jG-DLl^S)6oU zM?UO-Q)FL*$Cp#zlm~c}eroWjC(=)^@jolDC1Azbsn6_iNnd^HiFY#Jq@!|E?*pI` z4D7j|My_b-jDh~9kpp93$*G+&u>Jne!$6b&O$q~lOnsBY0Qyo21LU{RNB+1Jf2HtH zllnM`hu(pDuP287efZuC%WatqOJt`RmScrYMq(592-7)dDbS@SH{RhUPC9*z7MOMr z*2yvYi&N6Z=so%Sj?ph}%{5)4UEi!~4OH@kGZ3;XXI2LETlfhqsHxpKVm8<@!MRI5 z1i9>JaBwr;0yBGZGLnp^P58o2Nl4F=9_d|-Jx)lR&5gRRhfdj!$!8mHz12y#v^S+d zji$vgi%MJ^Ng5i%n}?ugR;bn#8ZThxH*3SyUaN*X4cG1NGNTkjpfZ|Ne-x7aS=)Z^ zYTIwqeomfY+b^*U@6%5cAwG||xi6ICLw}(=_!6q>I-|eVPi5<8(3xSGb<0+j*R*$^ z@+KC$s)D46l-9KWSbc=Ps5+dzfoB>xJx0gQl&zooHJ$dB^zn20y&|8o*q%Wv_DdiV z+64y3U^jWT~#D@#hI@@96n$@9gy0OkUjlo%^c#X0EcJLYNk;Gg4IU?mDZ8zg?zG(eLV+Cf=!2`@G4j9w3BF zxf74LF;zLWL#_;usi+>kzs^%SyZQw7NB3k+8D29jYfN>Cj#ur3qb4HicXzAq)e+*3 zccyj?m^{R$0Zj9ES8mey!uxKwbRLKo<1;P_Tl(H^>5EP3*5Xn{Q-Uc2 zwZZPGa@#tkDi?tdGE1GhB|})UUIf3U2!~(kawBs%>x#k6Syyk)n23ZaO`df%Hg(pO z;>)IT{_y?|yE5`kCtm#lH`S4~@)X&GPrAI)o5}RwcxGv*XD8BB=)U_!MPyRR&W_Id zoD7SvKIcYo6x9%px2x(ls2Te;De$KkV?Q85Kp}@kgpq2D-OyVzw(^Y=>NP;(tcbodL_=u;C*I#OnLRtL)5>{BLv{GD&vL4|k0AjZ`6JS~B-t1SAInTWH|v-}PCwYEhNi{y z=)2qvULPQ_xxu@LtDjS11O4}ga&Pt6?I(A@yCHd#cX!ux>>HAs0DFsm^6x)c>@XAC z_=-2M!xCRHMC6D)>*w_Gujmv;$6`V*vyOA8Rvq4ir`##k$Mg5p^3a^69XT=xANi7v z=m3E^!7p4DGph?LYKD|nA0@QtKsLXf+9hg!ag=GgP}+@YlqH?R)AHF>#h2h5^b|Pp zGXF%3xIOWgxKoaUgDx-JP9%`Go@EkW7MX55Q9M_4aB7Z?+ARqgEnXmSF7(H7urLwh*d@RMeE6R{a$@ z(=G=sqzWM3XGvPTPZa6az9W>Ez4GIe2v|WF{Ua{lr-+18GfDaN?$^8{NVU30)2RC9 zQ2j?#4)9e{MH<>e^~X})_a9gM;C)ZXzHLL|pYY?57a9*y`SPv;4CxciTz73{gsxgH z%zpCGN$lUB)-ok$M*o1PknT}9|TA}Rz1&B zPtw&W^G%9{>MkSfChk(yTiUYk(7F2-hR**enwFtsv`7Zsqx2l)U-2+Q=Z@dmp<|wz zq4U*Q<-yRgALJ#1{WaYi{bb|uX82s&e$xJjPkH^Pp@!e6nUq1hY<1|~1|CVi_1O=o zt8NC=EH0bKCe0RTi1+n;=r z>)ip~v@bJfr`Axr8K3Ued)wR5|ML$UN8Bn#A+Qb5_FDWG)k{jQHe)8GRE zWsXAK>E!~7*nEJ`Udz>Nry1D$U?K1xY2GaKH!Pnw^A4t(-xmj_8cx>;$2J0=-#{D!twU*1HfVVe`vSe zAQb<)4c<0}8mBH>y`^l+j9KIW7?xS#PQ`NaS@)?EM%DiVGt5hY&@$hXA7V<5^+HH2 zj=1?RBfYLP((7e_*FU6J+mt-bMWU5o^ik%ho=<;p5;Oi)oCnGgCH8fEx^&U9Ee3|E zgQBs&M@wG8`6ycUPDSW@1grgxV=9Pl84>NbKAPDwN=Ny;6OQdA!D{>#lJLVNN_6#< zghp(a^aaU}^mXDbyA&oK*b18Bdp_B}VZiUD){j#-d0}gg6B}6Uxct}9Jgb-YQjt&~uCT?D$F^OGkf0%OXzPK&dmn4wu{rHj8i<2I> z=Yf}-FEI*&bz7u0oWVCGuLbEJo%d-w%k(Y@WL~Q8uao5={|QL+?OC6u^SW69dUyTP z$BF^YE&y-ph@UXZw~-{Lh^;rgEKfqX@bF4j5ZQ%W`KX1{(flfXy6U<~3v z!ZMvP-m~EdIU5<4b+g;x%+wcw3C)7-eGlal03`NA9K#vH2^>a;yeoF@!y_pJYWz{g zM+c;*-8hXoYzl7~QF*a!WUD#SG=99vB=j;Y(+*i+?$*jaP0sw3&jRT+8OgOp6c~{> z%AU{Sw7h?u)BR2A`e=j`D^&^*n1RDESqnS?J~x(!e!R4N$g2_!qjPXpXxKP2FHOW! zW1^R1jyj~x8nv)kU>>l~CJC1ikI{IH@bHS$Z?);l$YJ1?i8 z-;=;*CMlnKrsY1XfyI1>n?|1O?7mZ#JD9_EbYJ$?%)<A+&;t*}h;6T+oTFqh~KNUC>>p1oeZ$SZ{##(Se7{kcx=m(Q>S+L;zTha;xVwsE3$o=k-Z@SwNse{Ot{OcnU+2$WHC6)<*DXSLGq-cDHPXM^ zF*Hhb=3&YeE_1a`bXt#d+=}(bGAL#_ZWfLTl8=);fqmLEt<)nx`hWY-yoy{M{>!B1}=KRu(3Inl<^{8yfrfQZYz z_tdIEP!iu5y-Y^h7CDRILYT;_n2)Ui8&We_trmPx#0o!!w_zkqL{f6bSGqm4GXl$@ z|3~}cZ&_#jeSbgv1y`B%2}Td_lYX+v=bmqki5Cl+Q?k;T*k%ut{;b2{Jo1)x3%|ly z(wy>!*R0%ScRIK1l238Tn!>bv|b^ z_>G@OwWxr9e!IxV@TupVcDAH^v1y%oXvKW3bvRs6r^dzJ9I4IVMWiUQ>xa5s-Dg}a z*_q0@sBOykZC1`)vh{9>l)OsDr5t;ZE#dSHpRyKc8O5`Lup$ZSb{&svF>`v|($aHh zS7jZYm_zl62W5Yv5PSM2bbvyY6k0km|LD`GMaQ$2gVkMhD#~-iB+2v83;@}YTNZJ) z;!;|y#<8NJ-JBxd$5fJgbZO#Jh@I#?(!GMybI0T!ZD#E^;b^k@@X3_ZBl@Ic*VrTX zyXGID`zHQ(Qy0diYKwIm)=atDah>G(9|q}lO}t$?GVAEuOl?UZ6&)$(-E=sQcHHwm zbC^@=t}q`J9#tCu1NaxHcOv>`5S?J6fr}~~Re7pJ+9Di}i>7|raWCAg{S7gHzm=$* z`30yrsC%*P-Wf|-n z@6zP23si!XS=0c2*yFPo?5?7zvm_%BWi5#_40DvN znu4InI=a-LWmSB+FGD%k_5Pls@Wr4zQV7Gt?agBKf#$o8tiJCk)@JA;99D(wMTwvD zE&M};v}~~D-EMAHdna+_uqR{x<)?jlDZi`^>pkW9LbNGPF5LskPKi=0KabPss@qy1 z`N`5#e^7p{UM?jB5gI{vnD^()u6}&(>GMYFRF0N5wx4zf2Ov(|A(85oY?r2AgzjHU zUiAjrxMclfvjI(ZBlIZIW?&ZFq7o!?hAoD^I_6;YubAyO}GhDkF zIy5`uSA@GmezUsO9~=Ol!60E51V*opTE)k%FNPfjvS;KtWo^@8*-vMl0{^znJh3TI zywjBIm7327IJGwvTRj`{YN}xAQKW?+ztm#}H2a%N3hW}Q)7n7e%eOBC_7Z(%wv3D7 zKQ)uE#qSR-e#=wylk{#!^^F#4$Exvh=7@E5c9Qx;CO?*F%2a`KWopMKKQ=3WTDuKQjx3S=mH0*C)E^Hnu%lvNAexrRZxHFcq~Vv4zyq;j(!Bqxa zDcEB0P8DMu&x3FDuO@|s{b9zeG1H24)T~4fn2n{MSq6Dmytj{1l3M>+2bv>OI#;@i zBKl96#@K>xx5}WQKTsSYZI;~;Eyb1VGBkhlh{|KVTaTrsQ?iHOP@a+UdS-{Sm-i(p z5=@*z);i5|AOr?wT`d5pWx1B>_ZuXtk-8Q zsk9$Ob>8!hTl()j_SyHOSDG2@2xsCBsRSJ4_uF&2u>Hx3`ZZ^D+?luH>RuUbwG?gL zqE%87upViGQSk=B zufW)|2m7{)`zC{Qs>>mZum4F_1rMV)+(owD(Ymg zmbGR4VyF8y#-%rcyfvTvMkR1|1ZcmIUB3?9vZp;h<$z%j%L*q1t#%V{t zMgUmpZ{`7H+n{#uJA2cPziD!Y=bg+(Z{58H*zBG~g&Bi3zIY;c-j=)kbmaP2LJ&*x zOEi>GF;DMVRK7l!y`1^|^{E7>7n&v3<1A)2#rsR_lpBMaG0nKyzdark>DIeZWBqi| zo9R>h*`2CwtqHiVyH~C>l z8S7Z_>)ow{)PyDrNSRGhs?v&SdQYGh3#eN?bWy5nsSsY1=b;p2Q_<- z&nNkEWA@-*L%+r|&(uW{bQ9eu9^WrxK_9C2UU)`R&lusOixaz=4dA-#%B`LKLhZQL zEy^=f)mkq%LrlrGlqN3muWe|5W;DwmeKzgWOEY!EPcS@V`}e%<-#GPetojEnO%72L zNE7rF=C}=Q&a%YhGJ5dV9S~yo!yO3m^LINCqU)wKLW~6~<3zzf^)-AX*6@BXO)D2Q z0uwP!EgSS{#XP-%gC6=(zlC2gYirs2z9FW)Z>ozH;si_sAO+Q0A9B}>0^ z)9BZ%MSq7mK9!#Ury5tU-OJe>STkcNd#Va!1F5M~pJHz~t%*p9l9qP0LUuz~r_YWo zmdC?o7rFUAbKJ`gXBC<|eV|$6CJzc!veOTBzy?_jx`y4X!b{xZ8#vy#OSI%2nO0xN zLubZ_upFaFimDYzpv3EhA;dd+yq^$(Gxfsl%bBmFwIS1wh@z|WQ!C)bBps2 z&>A;iXRh+U374#H!a6pC(;`S*Ky%6S(`{Rt5ZhPs4TsR%6bvPAI_MnN{aEd^ufQIE8R5Wd9d}j%^KQZP6H+8j zo@1CLJE}d&u`42o zAmv7wQ!88l5y=#Lk#fTexBQEg8y|vPl$CumZX7&f9xE0HI&gm1^jcrkicRU;f%-jSjAlNa#Hcg+~hB@HR}+4r%EyK4S|15 zA9dJlA&V3X0Dp_fuBf!404|mWCWU^m6yVe`t4V#h7lGzx*BwJj^zv4AEta0*;$~u&$m5bVE-yA#kgx_%wJwTpsBIv zoGZ&S8dg;I6&Dr(em(bq-*?~%8QzfN{$*A*MJauf5^w)Y$PW}uGeLU~to1=p+~;eM znt!I8O#4jm$^F%DA=x9p8?VX{8!Zno*S$Z7e*4LL+kvBBbcSwT7%b zjbjl7<>kiy&35xu5zGPQ5%>cIMTQv!hwQ1v3`(=TfOpVZZ!*wfbFc1aj5pE|1_*7% zCo5kOoV)iQVAz+O4C- z@Udr&ySd}~SDfO;n&*D93Kn2Ske|aha9VKqYs-qch*RC1P2*rp>I85Zln@ODo|lg1FW-RQ$oyF?&jBk@B8HB7BfgZC>M zG2rwtt<@*}`)gFUJuPA&yDd0`&DN9JMcYV2f+D0y76b1u<-*;%F6L)wl%|>H0H|tA z{m-D3YX6|UI``#}YI1vi^DveU>>J#>MhdGB987!!Uibs62Jm-i)d@CA1LqfbRvz!_ zdB<+C>$cE%Mw=gVsoVT`F8I+L{E)+&d9{uoj(Z(drbnE(S-2Ry?p>8DU{apD1%`_E z`{4@QPntNdJZ z^-rnsV*wQMIFIL=qv5%=-ebMhiIF-O$7WK}mx4?Ty~n!=d$Z0f#f>%2c)7@OQ})M+&74{-JK2xz>D`m| zQyRT{1A2E*)au>4B>g8vGTXv9vqWQ?!Y%KhcW;Vhz80PMny+^|6Wfig5V(Cv`DO_2 z8KDPd01B7woyAJ2Fdx@O%O@P?Z1-LM`7hYVvX=Qt$x15_hj#J|rOOTNC?`C{!CyFflOZK-s~0kYo=(1?!U zt2>t!zFZM75voxa?8rZcKLQUrS0kzidTdKTv$$13!TFh~ccviVkN1V!{JN@6LM! zHot;X|7ck>H2OkJbxrwO?uQuhf}ck{7p$fDb+LyF)%P$h()ws$TLrE{zncKR#n3}p1D_{O9v z)|qw8z0P0rtnzZ9Cj8p1MtGyVG=T~!FXqZ*GgtR;Q>Be_t}ZkdB@El?RD?*($%$ee zu28U_i~u~>%K5E|(41yzu*YLcsqUqy+E1b5ns`q!GE2%LO>eVlkvBwh`7~zEM@}1n zYL^I3*kLusq6pu6u~CUdq%v?OSK%eW);+m12Frg%ye>f^&xALp8%hG%bTQutm>^-NqO zn}U{G7uS6Coa*pC$^oz*XTmm*;210Z2TI}3_%&cui)UnmSeIXuq*>KaCz~FhCN7eG z*2;_JqXv_!DI2WjA8GinA~mM2$xJxn({Um& zzi0)6pay_<)=W#7Nm46oOsf>Jw9!OcT47>AlA~`N$4%oNgw?8|Zm*%!;1{Cf*Dw)G z#=y1;1KZHh1Gk`-CsC2OLc9x|KAi!6ef%UU*q?tTbe~Q?4VSDBx35r?W)PoAGKme= zCG=Q*28DvpdYGT)T|HV`tpGO0o^3=IR-IpS&NLQ_0ETxxg3*q0b zjw3k@nb!fVM%eib(g)KhJZ5^5!gNEQ$BuHZUuE@A zL*J7aEYO#6IQWhfeJ4ZT0A2B;xJgnt6g(#X_rKWD0pO_@hf6j@-3!}0P&ne|9&5-b z4VhZUTxt-AI85N1GGyF&XZ8}Df!t3S=O1FE<`Pro5mSe^8 zqkmH0gI(`&I!y_2YOO-)%$fY^qp^V5`sD6^L1{NCcW65`yN3oXIlYY-xm@CNaIbEjp} zahe~HIg7)wzo{v+qHDB>8|B`@kfu=d!z*fr6`vleuTcXurV-EfFEfIFyeN%|5w(JB)|C~c_)+)bIo*pb17hvF zGF<4tw^8EJ*yd<#eZ_p!p-w~$yVrD-rrK#@@<6{Ms?1nNjCu(J3C#Z-M4JaqtHZgb zo{k`*0m5WHh;oi5BV$KyJ4E<5rW7oc#BUPl1Pja7NvMS@(;|YiFw>9U@5szw6*Eus z=hxSbf7r$;mZy=q{!m8tIw{`P02E~;6q3AM5^)D2a5rA!7TywduUW+|Om66bYBQnw zBRMh7$Pe*1>Gwa&)chE{8YNKg>!qPCW&U!M`P7k!+I`A2yqxGO`OxuGrq+$-<)Ae% z`53nIHlpyHb6Ry+y&Ag@A2_5dR|;jxn0Jkg*%-f?uE@V(wz>vKcwDu9AE2o<5j|ui zg8m=s^mO-COO)a+6}5Y7_$|?LbEZz?#C4WVl z;9Z3PHu)^VC9f-RGa0cN>9+w-6-$^toj-#t@21Fd6`8H8#y}P9kI}FjDTctWB+t6x zD8npHfZUr|b#f$zd!rD5?cP5s0eWnvgA(!L&-iNH*vX{*kclr?=k!26B4rIXG@I)a z*0e<8HHj$rlHk-hClf25p0%HvAChC{N4fy}BD0N&b=@5)TOV?@(ZWz2$b|E+8h(o_ z?#xV7XpBxUwjXpUZ)l|*pJq+M($esQ#g)!LD&kn#uq^Zbk#?{Oxcp$0dt;jZi+-ea z%6kEOz!cp=58MG$1elF~Xw({iE(!&Y(T`U10&u5BoRZffm_XAR0!Nx*b~-{$jKtoK zKWS=NGeh~Hq^Pzx#UJ94;S7rCNxVj7v{QrlDknY!|0Fa)?|0^keze+qnx9bU_<%y- zCP^Vfk-x>KWAQjd6iE}FZ_tnto*ktoqcd=Zs?tL7b?>P=>^Q9vWNC79bV_dSGOs$x z%~LwbO`VUnM_Pduo<7z##y>N7#D;I>9}$}dog3rt=|$P?64jgj@dc z)u=n>OnuTtjj|JtpNBg+)0uZ-_~ByxA5UpHa;(PWYt!?)gYm}5pBye>U3wX|`^h-g zufYKQru;$OONo<_tNBVpskl6_u*=~g!BXECmE%UCnYh{*jIDR(O&xq3)s;@G5*cMwf7AFE1>P7P zAeEsd1!=f!O**8c_F3aBNI^=`&XD$A(3ciSz^06q8+3kwuGUZFpF*G8`-Ag_W}Mqt z_*j_iN%l;VHM}_YlxrX300T03UwT+_0@b0}50)S)<*T$I^?`|4b9?`gnl5znAA=?N z^h)5p9BbH;97r_#1HKTZJMp?L`)Bu5Ald$ zQtUya*8(tMd@Af^ZvtH2nF*5u1YR_b`3hUZ8>kNG>B4&UPUXK(J2Zmh%)X7tK6V_m z*E>I%0&MQPt~XAi5`1PblV^o>{%zUz8F$ik+!V?Sh?J?ki-=06WeZ)7l+oqTch2))i%VKe@kSL|W1wGW+>-XcABC*D&orwEU~J zJ1`)g1{xo0;~XtS#KTA37iv=Y0L^k zai-m?7c{Tk1>m36~=m@4p8&m#~jw#-`~&xY8_7g@|`_abY?5vD3b4uGk{ zTf4DKD98osKQTlw^RxH(@BGfj2f=Ckbk*Qj`6pmDNm%fkr>~2=E)?fS?(A!eN!Ot# z+Zg<~CKMlzN$&(sq&kifl1sE^%a$Udyt)T4Bn36EifG z5>DBto~B*9MKJhFAfa~aIy2t=^CPfNtups$sOHM?kpA^Kb6seUNI>Oo=6-3tIZgpV z!m3~I*)G)-sC{9*$8j-hMt`IG>9KS~71KZeQ_=BL#A)3!=x09;yVJ~XQ$Z_&sC`7; z2hg)s1@w86e4&Ojxvl-`n5!o;2b6Qx;)!bI0KjN{+Mf4Cz&RUmwxxk%es=(eSoIV* zd349FpX+w#g&Jyg`@&iHMUZP2crp?Nr1bd;H(I?U4(H~K>JcUjt@ispfvkm;xmw-T zU~Ds`%@3{W&5sOGw(W6$fj$p6KsoPRhK@4sr_k2ui#${rzv?e!b0p9hxzJ;lKK zJ1+aenwr1aPz*h=#MJzJu~Evg6^p6VbJj1jupQ5Ix(3b=3$3$+JNPp_GfQo*oAtd* zm>L~u<~!r0V6OH6m2lav8OI-#ClkYo^b6f{7@jQQl5OF-=B*J3WH{I;id(^n}Z$3+hObjho1l1lc+dbptgF>d=B=$j? z6YS#yq1RIo;xXob&juQP39=tjn=cEUer-`VAK%nDX7H#dO?t~~)5*_@FRa0M9f4j_3&B0ieqTI!ha2LbS#wI7}E|3Q<1rFq{w-<&1S4;#lMx zqU=Yk7}KgO$cZ7$h3>fx7{Vo=2onauaD7KqIsM*@WPTJdyd-JlSb7I%65^z4yCpCS=$^W{*|2ah@a=q| zBisZA=ksm-95_h8I%-gRVz3S{yyr^bh?X$+eJtW~-VqCtek@wecoTMO7TU=$)G&%W zshguU=!ygx3iAYQ+>X`o8(>~fm+Fjy8et&j@uW#qvm?#NdKz0Nk%uX+%gpID=k%za z%5LKH{Pv2P_8wI|J!;!Gen4R%;Py$He;mxiXP6@zyM(~$l=Aia{O^%g7u}f zAKg6?fWW{6K1CJ3n3>_x6V1%<11|f{47{Ia-`{zF_Xs|<#CZm|wbB>0Z*1#fCR>?; z%xh+(Ni^x*jX^{~k~$MzrOitg$SrSYJLB=GvXF&i)ARBm$3i>oL7+YsrZoKJc(tp7qe2R~@tF&1aCnRkoq>i}Q;GyzW^ z=Z}8;yqVkS$Ujb4dzU!Ih#H}{d^O(Bp)OD2n!4PC%$*AztuUWJJVU; zLjoJyOiX2VYWAL2{Q1V}qPVQi!Bg!YE!biCcaNTrZ#EKxpK`xyd7ESDpD-u-I5C23 zA;!3{GLzhjCy=Jq0klhw$$VC~c0VkNwd8?^_?&zyNAeUenkcT;MG?37NQK38mpm=7 zUkw{Ds=l2>Fj>V3O4`S=Xgkre%`^HtZvK%NRgzLD65FM0mWT08=zCq_+YP1c&TIT# zOSYf%Gi3WImwm|wIcn|udk*yedi(yH`+v_6WtrQaIr%WN0m=CyvBiT{SYInQ`)k|D zpg3CeQz#G{&T=@?zZ&wpEiKQ<;M72pe9N~9;qE(P!{j2Zq*tjZ=w_dG6BJo-74ec_ zcdmISYl~ADzZ2j}7{ZN6Gz!sR0fV9hD>V_LK?H6jXc)98w&IKx zD`J8Os0m4sc)1#tR$Fb0)>eJAb*!RT4WNKp711h4TW3AjYg^PRQ)}MOckOfTkOYV4 z*XPY2Ip^-P$2IM>*Is+=eRC$3Z3-`5NG(;d@iTCJ4G}7$p}f$B(4(sPq#0FZ8-Z8z zE-o_n#?xnhW72B5>f%WBj0o2^R>-?#w&vn#*4IzW_OZd+^%7o2EXWrMNTv3POBM|+ zOPv!sZf@g*1cPAn{OU;aoN1Bh96EObQwEV;aKWm<1*k1vNb$MFmGI>W(SCGB_eMI% zv$bjw_&2D5;4)$P*Szfg9LW|yA@NdV-CEZ3+7W20`CcS?0<9dEM+lB^!vpHmst>qS zdTm4bpzjEG*iPrnNSMd62IYmH-qn_P2s#~iI^;g^`;JcCU=)@59|x+GUGn8dn%9!N z+fxbNwQJOu~{rfwIO1Qnn6~7(SQ6x39sfa<3Hkwl~$%tPvm9WG1w=?Uj*9mUf~&O zYgJ^Z*Z|x8dZb^$c{(3Z>&4r)t8m;qOdOO~wj9ueZZCNO{d%|D4XW@CYkE@(E;39?hUHn$3!5oN zsZUUY{p7n%0I}frGV6_6%U-#+3J83m5B}Oe%Uf0I)SVm~&6>yDXGth7n*!&qDen#I zKr2@e!;s2*e6&l_yu<$K_UZ|tJ;IG1l|yYDx%^vEaJ9=5HdLv9COukeU4z@LAHD}q zEL1k4Fw2`dS;EX$_Obppln>m$0{vMRiv$N}QdbSD2Jf~fcey=iflx|&2~YiTQt8lN ziawS)&oF>ez$XWC+K_OFM7y+YkX#d_HCC$xQ6m(n$10(wRjDj-hU@yLBm7*`($W%s zbWYFn;E)reC-jDrr$#5|;Y?BuY_IuC|16ZrvyaSxF1p*)=9l1^>Lg(62}q#zL2W_! zQ7Tfpz^j~?o2K$=@Oy{5v%PUoS(8SgKpRdxuUX>1O_ja~i)3TT%rl)F!4 zn{UPL8GiI=B-M_B@S=QjRmDbol?~gwUBRT+nh2*ZhA9{q?WPTi0pUgOQa#5h-qZYp zM|c$ zMF$m4j9q~L5L0J(Q4cb6(fncIMW3?LtBPH~oiBgYzWeBg_YbSger96!b0=}shtTz` zGA18Zg?HJaCzKOAX6)3BI?NPAoqwY;d$m?8Ga+w{AG2S$=?t5L{c~uj2lKQ)hmOGF zQyxk)WKU^@G-Z3qq98|@f`yT$)=hWYzTLr+A9s<>*hy=9%j-8L8;I(Ne`*o1aB_C= zl}|*sfY%xh=2|LTDB<`goY?l4u56*rU8XHG8Gu!FwYovo(|CGE&T%{_87OjX(K8mB zF$}@BV4~wcOEdn9>{}7=pDU2!KmGQeeQfvqck<8vPx(*F{YdOoj@DpPb%R*>dVftC z-i?Q6$TNvX%fVU;sWu}i)$aMV<|}y*1v!A0(;~BZG4>wvR z;>i8Ni+15LK+$fU7TwPkCB|=eE1H<@nDS8-;$X_QO_i&*!wPThe?qKVm%!pQv21;i zpCz7K#fw-Ex%2b3hOODj;U}R3=qEO>=R8T%R=|@sJ|xC*G*ua!-Gya?;YQR`rziJ+421>eo#0r&(u@Vh?p+bEfGdz< z0sZ#YKC*ijnEccKTNZG$u*RaPNUHB_{V3KCp3(=BD%w}66v6D&UX=*y%~UB2yzjia zJMf-7%YpYTpd;`u(K8nM@*u#wZ>0mTr5SiX=vNVd*A+;CSHHdUaW}9r*a$N#x+R@5vtv4QX;e3jp?i55_Ab*}dmhaNtnkn@#?EEA?|feRx1`IeNR3 zH&g}9Pu?v`J&aVX@2=$s&IWoNqx6H7`*OV%>Fr{@scP?By;*b9^;V#?NqS@df%`9b zYw@!0+HP95BeQ^90*y0Jasu+nB$rNCH5+c&&8p@|jE@ElEKmLoSZDb+ zF?wDR9>lf#MWV;$ct8Jz76UC2z$tb+3rkqM}N!Hb=_8@l{%2^EPk3*1BmKw3KD^v9?^xIs|!4;an~-QOt_? zMa?^EMvG%)`*L2r=l`ntnGKU2@RlFmkI5l|?_=%$IxR3f5*zv3>4koLfk@dUIkn%3 zG#uN7*gCP1F+P}f?M&d@&)1#Q%PbYcs=5_eRb!#qXiO_n1GBuj|HQ7tt)Q5uLOah_ z+?~Q*JbWFTFYA8T!2S%QGU!zK#j zS5VeW0B;5Z4aV-xm%fMf_)xPFbPAJ4|Kh_$&h9}rU}F8-$U#|wkQX zZo59F3%B$%zaI2JEnI0r{7ihS9>WH~AfIr^rjx>g*K(eOxXmZJw;>if_CUnhaz`L>%JDn44DecvJ_KJsp<1%Cn~Lq_TXxW94RDYCwNgWhdp3E^rfoCpVW5Sb(L$%u949;os9p zpnOGTTdVYPQPD&Kd0%&!Z^KwlLO=_ON8S8s{5SM4FxaL8r8A*wRxodFtaAaOeiX;I zb37qaDx`i@HosTNg|K-{H;ZnR!bm)+@Zx4CDprszJJS7nVn@<5&5m@Jea7v|p0^HK z&y(43xEVWI_@O_W$8Y9`z0~pI&AiFLTMIAZ2uS)useAd8)Tk+nB+rP%q%y*+YDKkj zEM(!JnU7_enQ8Ti*3TmMnA`i7#E-Nt@6euUd6X3~EYTBkSMvh4`XeoVxjkKB$s@Ne zx8c@5t#LbrduXY_`5Z(tvoG2=>*$Bm16|rzFtwO-7l-=QB-DPweyzjB3Q$uW0Ak_U{ zP@naJ!Wf0p1`%$&(~ScAwVD2I<|hNmTFyCzKiOuRPZU(Kp4Pm%1;~(2krd0l-Pe~5 zH*{|a1soNDpu6}HiS}d`Nn+2(7F9beB4I5P8)EkK$u)()hmAI*y;%WB$}(yZpaMR5 zv}@A0zFCglHWhRwqe)TB<5|=kmVMt_@O$Y}fB2=-r9`DE0t~tw5N0rx_VooSfp=|l zI-g6wiH|~9q}aK`+t=$)r!9jU(LZufQ1aGz(Ix*2{pnn>Zl-^DEcD5h{*@u#O)I`^ z(?R!r#Jif?t9hv_J*qa}LOi6$Ov>KG`nvgzB#S_h;l_cMouj0`7NIF6Op3vm^C4Yp z_dKt@^yI0vJ?rLm853^&Oso{moqVC@@$xD57&%ps=2yIrzcASoZhC=Sjad!lr{z>I zpB*ZX;O5-l_ePtE%|^{EzlT@xCmP{aX@pz7Upy$_UzA0t`dDG3av~aHp`S$0f;VaIRXMzz=WH-%muOWN+eb_sMH<5Z$^U@eM}EJbhO{0XS=IIN4pLcraH7A zuSu{ZU()*bp9j+V_g=4{e>=z1zd!s!{W~7rq+xrX+8;(98-8xh*~4dDe6|xWWj$+8 zs-K^8=B%0vYR8>dKfm`y=hhw*Sr@vUT0+3Qq5Qknt31Yg_2ME%9%|qdClq7l^VJf{ z6v^K2e+%(o=Q3>}G?On4aK$qp?dGT()Q{4?f<^aVku-770FKNSt zH5J`xoXT(b1*F9OIPVz%tYH5N{~BnjW-Q(PtY>)^lt`nE)~LFB;8oV$SNW9S8jbSj zc_FzM$+mvl^_%o=h$13Zmbhr5h+8eYQN+)9O~O5C|47lt75AsX{~VPw`j|fs_>a6* z0x&e0R0q#@LxPGrcx01x@Vk5xWtAVSlCe+`$+u1@j1Tfh8AjFlO` zCl;zNDCGW@TgudOMNU71Uhdsn)EWey`#-jZ&0UZsBu%yMfTYl+{Kk9}EB_HM+F!hb zQN=<>P?>jJq|_;l;b&)%4Lm)D-e-LL4&K+*zxG zn)O3H+>UHE@|& zmDGGmYD{e4j?+lN|#Aa0Z^Sf36R@OQOywJ}+KRQdU9_1~(SfcmA?Ev^TqE<(Ur`#O6 zxJ!jPT(UQqn{cGYS&`FUEyr@7?Cq{7jOCuzFof!JFZ}Xo=&74EA1-xFNo;=!6-gUC6TfTIpL<))QRYVf=C%>lbY7MU+f?AyExn= zt(~Jgct9^G4LALd`^xgG0>{63k#LhKK+s~bR)Z(sj;8}WB)u5|J+dK#-1 z)bU7k94{vpc&q&HKMcMX1>bo&vDmxK|9(vH9aYkm=jFswuipQ@fAGCRFVue=FDFF2 zGxeSO`&tDiwpE@kO51Gq#?%Xb(k$SLy!flAZ2`>EpQb;Y0_-XTyHdffG_b!^YktI( zP83)a+}Sy{yu9iTmX|u)!+LbgJ;A9S@6~D2NL51vo913<2Ys{kjQ4n*-;uaA?Nr<;=9)8W{A0TsGk;qB$7R+Z;O}T3eua@J6iKY$C}DnC4S0PWC>_ms zr*2DvvQN--;!c4Q{xD!ZYQTITvt{?|f7AXF-=gQYzxj(~``22WCxH2X+J5n`GRL24 zzt8_K?Jo&uw7>cD)cCImc;#Ec|Kv>kr(~Z`-$Rr1-9Mo3nr`fL?d8+>J~3!~4-$4m z=iV0Db>2B!z?##-*p1#A256wY7H#}V@88uHb3abw*Ny%v~H+o3? z2MMhETKEutM3<-yI)I~5!%g}04H5P}Q`S4I4?3BSM6XsR!kAipZQ&;K0OEq$z3NJb zGmoOE&ZdQ|xc2Or-HN%C0}G+k?|0=(@GZ4AWjL6je=}9}G)dlwWOlU#`)oUia9Ve& zD8o7MB~I|XDEw@y$@PAExA5+}g|hIsku~qqE$RoD+pYCicBa{!EDbO2O)bZ*?bdyG zq>UtZB8&@Y*&0afO9vOvMx9oVC12)29CbLjt+FUbr*{K1i&tS4#hW(gyq1c(w&7@C z1fHmD-k#XZ&%?q^inW9z0WoASH?FB!6JFdz0o>lIabVT?NNycNtx`9a!J35^g-JugK+E2itOw-+}gQ$Y``^ zgP1fbFwBLowF$ccoN*xU1{+wFVzgrK1s+!x;2PZ9dR9wSt*)w{C>yw7P7BR_Oc;CK zJF%aTrL?cX)NA3Zd(ageBO|)_4J3uUPi#TsBPSYAnPG@-8k#hsY3kPOVEs^8_H4M} z5r95sZMPhUu82R5<#fUw;7d z|GVkG835P_0G+e5YX>MP+<2~OqNMoy7vaV!eu_x{cQid;{w&z@8^Owi&%5eM3Qlx9(CumT4P1W&uY%BSxwE?tP&ka~T_a^<&My$3Dn z6YnFQZs}p$tlm*ILO`Iq#P1;(QzRSiWB*iW(WZ#Wj+pn!b3jKhadZmvTi(zLP1(+w4dUr0EK= zCGz`JSV0i68UUcHlHqVnuF`D_gvY|E4==F5@tThg*qs&Csz@q1h ziBY~mRBYtd?xl$Bjhp#w^r`a&Cs)OOh*$dNO9{?dBaMj02&o*Zpx00uq2;{VKHPAn zI3q#tVQ!Qta;x`hOf*m-E}Ol!Tgh$3;b_=3%NCh0Cw`g9nl|_orr6WYear zz(EaphpN}F#A3-n`OkW@%@y1SpE?k;-v0%?poka;+Uy9 z`OuoDbLU-WBmOE7hp$}4*=s22llTa80~Dp86S7jO8dO01BMbEukdNvwh_7Qy*QX(r zs{(1ISo-vjP8UHWwbH_}&QFtIer$!d=S4zcjtq3g!-@H&Zs+itIERLaFQY4)nl>&h z4L@>(%{8_Eu=U%J?M4|3g}TYTm;QVG2RnPwJ^&kg(Yn7B zK{K*H9(;+}i*8BC%Jb^hV|^>njr=zI<2Agh-D0q7Z~%9q&x3X9#*Ra$Ptj@)pp$$B&L@t0O@H)(G4^LYOVq><#9& zu9S(*`}1J+Ldj5Y0WJkMQL=d*@f@M58SF^Et?+fYxQ^Y|5AQhom3PJte7WWLru8+= zY*L`(XqINy=~n`I#T9(k=nG$gp6or99BRkL;BKaMT!9JBqAoG29X-OasNP~D`(M4g z?iMAxD=WD-#P6<6*6Qxti!-~sz4Pv>w)UnM{%)w$)WKd`oAyR zSLPnGcD?L>Hk*1`ogdcoE$&`dM(JGm7sBhb`Z7hitZVS zUc!08(Ro$&q1zxavrJbyGW-cv(8JFdl4a*Ps$%(nIU56(-8breHr@?!8bh4H5b2?f zZ`Vcs^buFQykx(E7uOALtZ81~=@``i@M5PGW=M)??$GyTj?LdskLLU_ABa!x{kzX6 zxuf`P*3iRw@kU;&UgYlWigb5HO03A`$s)x;kponui!1Wbd)CSwdNk+1K*@&kamgaj z@Y`B>f*0)9*2;2M7&j;x<)OZ|J zc^Xg4dqQ!f?6@Mcwe;{lxpw!KL~q%J8b&b9#K#7-2IV8&hgnpkz^+#)qio-34!2v2 zcOp?fHxOsYyY5{qNiy8!nc0q5wAes52Bg~Q)A;Lqw8Gq_Jz@$c{qIU_{%Nh*6Z0#l zJPgeKF7jZtWK80{@gu+IiHB0=S7K7q^i#q8V~So!8zpL^SZx$1-AwSDLp+A%63{2B zMKUM1;G<*R?6o!gz`o&StGHq(v_zwU?*{4!2M}AM~ZlbFp zhS(kkISOcwLuV?&{zNGb<(Bt59F44Or#8wtggG|{b09jd`yP%&Cl^V(kovZ@4G)q4 zW(Z#Se8qB44iCuk?*B9(3R9q*ez0<824N3t2T8}DUpKz<-b#({{P$DiJ4NZ=XnaSE z`0DY&@n1E*+CGeL!zZ1LZ_D}rh4C$ZGc~@e-%E{euF}8J_@h_xc@}*lp2r8VRSnpj5^WnGB&$Mpy z&J5Hw=W3Yz)f#wdrl+j(F2(hzMXfX41gjr|3=6kn@AGrgsUQU%gb4nJsp+;;`50dO zjG)j?hdW*88lJF$`T)X@(+ALRpV}RO&Q@OR=|Mqr!mS!qy9_4@ zCnDHaNK*5*MtC2`00SRbg1o%!)xYs29b(0|hb?~K4f9=G@6Cjdk;y$YMEudwDu64d zEL7wG=ba(i#vwCfiMPjB4Mw(~lK2=W$gTfp(0}-xsa$hAvupkzUpR`k*H}b4-Nd)S zo3h#A!H9LO{IO$&=l@te^og|yCN5sXdY~6NO+d3Q(R%A$a+VL_^!1_6M^^(}XTo_- zL{R^6i7YvoaEkSexhGTK6N7FS9mbw;zVA-{(Ce-0^;Yk75G?<%NUYH^y7_Cti|RM0 zqOMk1ICGHNKqeRI9)rRB2=96Ppn>`^(*H3+KgRk$M(fAP{*Ot%>S8(wb(|T_Q&}oF zOK&6eHb-xx!(5KAh!*u@l748{!~9`4>Q*ihanv7R{nHxn8U+V%SSEmO!}ifvjA8qz z+nEh(H(;6WaT$71zZ)XqC%@o%iYo;`~70iB;IfmR|KDkdmUExdq{)mwuNNBV8U_Rv*1wcN0~tLwsn?rw?L z$ZIKkHF}VyFP4?lG};o5y-ngwL~P`2`zo2C(0Q2?P-cn~ltWjEWr~Qt4gpz})E2D& zvBq7iJDB{bNXjWUnPW+KT>sc4e9pUBpS90GbjXKCMS&JI589d4{k|8RmnaFcsksOG|;HZboeo>8NFlB|iE zBC~J!AF^x8^`W=^=}5+V9K5TYCH)cBk@QOpH`pDqUXcA}umff)U)#51cH7--4{O=p zFkCioPVRlWsUPvvS$+s2CpFi3eSg?NfCInyEh$@Hhsliuoxkzz$FtzV-Pn(f?dPSe z#5#85o0M6U9En3cG8!z%iJlp)QO4p$-E=;Og(qti7cqr9(ApA*1;6U%AI|q0IB{h6 zKcgl_%X4^WX*}}cnaI^x`MkfNNpg0l>7PN(Gnp2Cq;A3ju!T&*I9&4P&Qqu_n0Olp zEvG=ETZ4H!*<7O+*i&$4CY{)VI@f(@@OyOK<%ehKbAH{cM`H#qtml#FgLTC_e+b*i zg`aFWmV3!I);ecdOgQ;h8@=QIFYEM-NX$+Ga3WgmcTLPsLPJLDh-}E!4obkGjvn~2 z6Ev;Cmk}`;8bPK#JXwct(q5=6HWA|MzoUKbU@Vo`jRN@MVU-t_M;>q>vgwwwD`gQJCu8-T*pE&hf)z2#6@}2{;Ru(}Qof+Wxe(gf+ z@bXye?7Lfkek!WU&|zdw--L@WHkPb8$7mXCc$Rr_RZe8vs_ku8WrZ7U>d%@BGz8 zxUo;m;|*IQ;Rkw|(W2&$B9?;0Axw+FFHmKs%3Luf$2)6`(4}AXtEqr@&8Uy*wXHkd zX?m`9Bj?+S#ilCJ+bgjWRs7Q2kd-BJ%tonGIXXyDOT0=&pS7dnY3;^BBW_}e7%N{qv#vBUj2wy?f!52vD+5`5?Q2tASAS#f9Tg@4Et?EVs_*TVE*sd_B4Xd|Dn%=Am zk3}8i?CSQdRpAGEa{cCNB1_dg4*cJ&A$+Zf4*2~Z_z6~dqwC+^0Un4~kj+h<0#gAX z!vU4}oXZSMhfEwI{e$>O8DP2hlytBlpLXpAFg_uge7YRiKqJ^S1)ID^i=!v*ggzWQ z)*Of4y4^T%y*O|$$AO#c-%&TEz2d0BEqoXG!pv=hNv}}f-7osy$MyZbRF?rsUgMblJ;zelET`ud(@seoneTPUd$-kcm7e6-a>ZN0|xtF`t`8<$shmyWG z2PLApm$>vf%DoTBa_g^K-nPZ;(KEDEbcd^7NrNE72-jq{!(?)1s*KJL`jym;?+ z2z31S?+*Nj%du~tBL0MYl$PKZ;{A9il~FkavpxH&G19NmPu=>PMez3Q+RGGxzm#}? z8qvki+xTbmNK~MDz0S5Q>d#vnkIhPy;6iu2xPE&V8~v1nE$>tw_)Iix?^-*I8Ya3L zPSiu2)HZa-YQd1*FYlF~m_)jiEyR^X3eWOZ+mST->aDnSdz-h{&HOv;ry1Tc zRzl{ZY6AW=ATS*z9)5r^_?kLoBW&IUcQLwh+9+JyMEMp7tA`hw%gi@!?QKjvA1oqClXWK zQ1p@Y-hLdKfJ*UO5wENpJq%o>$)I%=mJm>rFA9?kWXn?dQWbfhRHygUmbUU-DvD2Q z$5ZK2%+ZG?>&*F0{X}rkOAMHFb-mX&xdp#&bOHGdVbT2O_ZMCfpVOFuHnGiX?1wnY zaTEEv(Rnn_7WOJsiS=IZqg*FpKg*Jwm^32quwV%BbNoKL{@ves{~EPFsrb&VHPc#z z!Vy zhcK(6bFG%n6>fadkRqb;r`Xl3PdC=Qq^#1H*IYWJZh_W<45VhQ4WyO_>=?`a%c(Yy z_g{c*yUAWDyzgh!WyZAB=qgYoB5Q0R%#4$Ji#2MBqO3S9SHUwPR-Mi^&*!TrASuVN zR`Z76j;#)`Ku@RJ_TN5`jvZ{a6UO=gRTPP%T`S0d{!5KXXB`id4!;;C_2Oqaj_#1z zNGLHefcI_UQsd9BT;Cjp!0*V!LZ z^(T!Q+Wt^5Uiw&)xHQ9>_ES#gg&Ut^DB;Ex{7<^ybAI4bPPhGBgKQ}46>eIrw_taq z;i>`(T&H4>oOHOPRE0s-8|Q#pv#2EzQF4h^L8XYefPg+x9YTw@;1SusF(}qb%Em_a zqARY^GfeDa^7v!?B)tZ$+D0R{*89H`=zMOsM%Zz0?0Y5Oh1`84=2J3}fG4AE)ojxT^Tz4bl8XKYgxZF+MXfR}eXb(osr zzMlWzAox)_|5tu1{+E66Ek9_7bo=^`mkYyeZaAiK&!jZ)BeEa>?y_ty=AaCZHpL+j zL_VDegxO|u?6Wl`3{-)901_q)^eYes`8Tx+KO=AEAz_f;HbufxYj3fwy5!U$|r`G+2c}YVw^E z0C0qhl8FDbyNvN0m~?|uiN47+)yDlgx#`1!^nvw-$=BzVBlXzQg1jZO;D z$tz8WPT`?Ld-;!JM1<_ttVTobA;D|w3*>1nZuzdW7R!cC2RBFv^UevZnhIVP<01g6 zm5dsubBFx2VP#`~Nl8Tup(RiMbcrUQG(0_>o{t2oT@N*ve zL}G%knRMQr7H`%6nEwNkYJt=b_GRgWYwuiNHDQ13@%R+|Fr@^8E`5hr&8vpPgFdeU zq)aWaLURJ(Nx~!+`s^xOCmdhOI-&d7S|_YJC5=lul%Syw{Bhst-SEdLyWOPudj5EW zXz6MEaStZiZ_OWyh75l|FS8gn{1HjxiwdCRuMe?mYN59^*ci!NAAT+@bC-ZyAMT9} zIdgrumi6J4{`zq03Q>Rl$vkX*_{0QJfBrL1rL7NZi7R_LsL>9AY2PgWaue2w&QVFj z*Lsk*szKJt>;&H4W)PGsZgRaGfvySKgS-dL)Pv74SqfNIbu9Gi6-FL|zXy4EGejP@Pj%$cA#;*4 z%)jB5W7BCOK8xukrCs{=->+O>zTsu!|Cs*;{^f80{#k$pHg;CV12@V)dz8HG)>Y*6 zRhC$8{*oeaoWt7*$AYou+~_0nDF4@!$NJ|x8u%@xuzWr*tlt)BTOIhkjH&IP@=>F% z@3^{7&I%%ee0hx3b&}O}SF*10s>|Zb@ZybdHC>~ce&g4~-2>`XPmbESUOnt;%D0++ zn5-!`sHvN3`tS#Wd0_YV3IJLBvvz>@kpNU+<6#;8*F_>4oMuC9f5#A5q%K6s(I6M> z-jCozX)f4^K?~L6rz}dIG>2iq!Cq5(xof|;%N9Bf-Ee{L7{r(u>_Z5B{exKt7{N8eU1}y({ zG~{2xgvY+Dbv(CQj{OW0dUPcVityO&RncyP zwCw~Yw%Y<4g>7Ax;)~9L4I79LgK6S+Fw3Ik*F4OaiNsHRPC@SwI;e>y$Ci2Qk25=@ zy4&H+@Ka0QktefYd}Jg4LW3vw_uz)b z?Ay9Ad3rXKuVq|zyH3{@*1_nWr)cXw7J6yZehfh^G{_as&Q~oM1#!;ZZ71dbHj}Sz ziTE$w#ZmvU!WL_Zs1r$%nEzzmRbuH&-GxX|gn1=rmm{1@meE~GMyVAD-MOVO%R5d! zdguaHC|cIoy`j8M(C_h)1TI4BBEmoZ0Cc_PJMdMwksYB}ZVtl;)-SrRrm2c<>BdA= zH4#>+j9w8@eNR3vID{h22P8t?4Zwgqc+_Nty1|l4-KmPgZd;g+7-U;z`1rq0jGm*V zhPw|?dXilZ$_)n2F~z@bag>&18yHq)^Only&nI$KoDKlJW;?}fi#lLbHNT@vy8R~A zMHR7Cz+pWFl9XXhDv;K&TCr6n4Qwn6b%*CxOI&6*R_X@E+1fFkscQq?;!7oyPF`hM z4JV4O`;~s9iRJNRjCqY+Dx*i>@k@}O6Cuef(XKXl;}!Fa1&wv4`M4Z)sOioe3N*~m zAqL|_z4}84IiYTM2H4$er5e^~waeFQkxXMe=HrE#`yD0qt!u0!-B`n`!T zO5Q|qo(_F4x*V8jjkxGs1J1)PuD)A-&X8M;TXt5l>}2T6sVfrecBEGPn|Pmy9~@wr z#xYfIFce|*t*aA<%iVzqmb?Epgs<+WUocc834v@G#b9yy3NdQc<(-2=hvrX}zi|&r zU>~T`@LJSra_o2bFme7(YGj`D*qPD;SlBcg#so44jim;Fcq{5y(2`h~uF$qOTWvl< zkiXe~M=dvZ3#8MF>cT4am8)WB?q%0qPAq#ryy$k@X-2cGDtjlqXjl*6+VJnaxTJ%( zs@Pe7Pu+GwA$NDwNwIFjFku`k>^84=^M`FJ_Ttd=(Zjfw^RSwIY{TmZ6|+)$6~iw|nI%MRy%c5QD#u1n$^!#^oqxW+mwtEgLIvNF|<*XO##ST}x> zaxUAC|9e=jtZs>6N~#@*cj|$RpC3Klmz;ze>Fs`GCqj=&U_fujYdB7bVVAhFRHUh> zah!6g;JPd8DghN(osGa0u*&PHfC{+WH@^vuP`J_0?M`@m7cx1EqOA&8f4xSEU2VHP zeS2Fp|A_l-HX5mi6wx3W_%LXQ?WBqSB~opP_hV@-!KL;InjUT{5I2AV34^NGdDz>1 zK~VPL9JbLM$tN(!genpP$jOC&)^*N#f8fP7?BJaD*=D3y1@fm{^#OP8-RmwhX&zQm z6&qGEF?JDg=Gq>X_zvr%pn%{j$sxp{uDSWAfUZRE7I_~~3o^Ej-^PLg!^uA1XsB=) zs*3iljGo3K^Mnd!|3eS-4{GAngZJH>-a4R}|9lrY8TK8`F{Css+@-41u&~0K%K!cE zl{x=D9!V^4O`P{zm=G-d*969O3ayZigm-1}gns4)7|__O0t`sl5NSLXI%X=X4qy7% zN&64HUM~e0kje3@z+d-J68svz13!)v0r-{3{*L?~u>x{W~XRLuPky@Mue zOm7O}ZWLe2tx3W?pzi>vmCam>=uhH41qPfKf5SHB{28NZBN~k__mFvdwW@`~poXuR zO4Fv$_*S2)Z8rLUukNi(-;)j@^-;>f=+OfU8K8*~UP7P{#L^vO@(a|;br2h@Vx zF((#55vV+YhDiYTNu`|Tu81^8xDfL8`@#EpEy8?t9;c*Y^YXlt%vZwfTGd4jRmtK={@;I;nAp5|qGl_8a_z;Za8&y;!7Y(1 zpzm=g4%|W6R{K%>L4K-vg8%?()yRQJT6cCg{M~jhy*?AUne_$3`$phfv6lec{I>Tj z-bZ@Y+p|@XKYnVj#5ddNO^|OAfQse5{c3;NCsz1}7BOCEZ=V^z*c*2knb7kJgxVsZ zwm80#i;g=i?|lEuR|Jbp`v)3m5%i-Q*DgCs7ylAi12uf{FUT5x1e%!@xDAq{_6K;e zWzW4V{Ak(-lb@9ArWjGXy3VbNrhO!xQzzJ;8g_M`%k@)fpH`p%gP9=yjnOZMG0eX7 z%pmMbOHSP0wgQz)nY@*JUjc#GkKgk{M$T2<9lW(jjb?o*FIT_@uZjCy5~M#zWGfk+{=u z;%n>QvMQtg-n*;+yI)a%yZEpE>Wg5ZQG7De<7-4LzD6bHzw+CPxEuv-Uz;A>h9jzb z#e1=f3!(u)bakpm=RJO~Kd{7&DX=BqB8o{GodyMcRs4)UL*T%;LNtKQSO2IxBD7bF zw5N%*XUL{>dbB#Pe&;E(vyW0Boc!O6K&Ms&D>p}Z^XNmjD z#_|~OGrc%bSike3UoU%z!1b~GO3JeTx1knJ8B@Y%8dWQ_R}v{(RePA4H$2n(9bRAT zb-F!mKlRng9%U5P#a}b1@v@Pwy%3R!6CpEsg`3Rxn|&HOF!Fo1F;$f19>hbtKI`34 zUGLE1Ak z`I+U`*a~y)`75HHYNT#EoeURP?D=sFIBN~2HoY1gX6R&ssDJB z#@2kVe^0M_R-qATsjl^KmOY>F7qm|Ak!{eka!zAXOwPu8NT_U>SAqR-xn85yL=M4L zg+V}SuLY!g#k-}PYH=ZF?Hy=aex0aMRwrv!YZKjTyULMIeSr#Ng`q>mF`L6pbC~ZU z>&E9`Rl$JT^jm3u>oFcj$^e&!!uTa{0-nGB9v39Wc zy=ihxbQT0HQ=;+}=b(S`t`Vav)TkTuLsa|zZwNy3tejXjsw=b1#563JxI!uFKM(?!> z;fH_8o}=sLS7)`<43o_cd*%l3fj>LGfm?#sf|h7S_Qlx~qdg`@EAtZFE7vhCDZBIY z&~i-u)Y_|6&)BKiuKkH+Z-g6uNLDq&sz22090gu{9S<7QpS)cfKOj@Fj>B!&feN?J zE8#IMopg+OPqh~L-vWgkD$*p2AAZQgc z`KTg#1?MmI`9n*W4}YCpm%L?_uz(@{J|V^#zEZr!<|vU|$UI^NSbu5-+srD4{WGm% z_~}ho)>z@chr$TKty>#Zt54Q$B8-KmoR5sS_I0-zF;h}4qK>Vr$RRUDIhvC@yirPI z`OHh%cZ-GIer|vC=atvs{tmomx+C|#Tu4^Fp0*3_9-y)Ac^VsU_x>&;Mo3DpOcRLf z5A0lirwPP!v09mslKcxVj!Wib__rqa4FvY7!^Q&g4_@|z@MTm+${o6%yk0~w6iVvlLhO7CrkoQ#|If!g7R*$^72Fb9j-n-*~rd&&*%a!e|+( z_s*Jsw>@UNeyL*DL>S}+nI#OAXjX&qV(EVA0Rl#O{3JT6Qzl&HlH>il$S0Ecj*hc>YW|W=w?A<#x2?L0N@{af#p(RB95MF= z3~FP00#PFb)=!RjYIHsWrkN!$yXduBbWq-wwMYej+k*Z zs%b33?TC_0oGrM2o=}DNoi`4jP&RP}(Is)xkr#rEE9NZUG6>;J`dUzyu`k+CI;0+45dgonXLa3%cv)a!;g8Ry*en-)rN}bvp3q_Ad3Jy`Fh!!*ojjMZM5tM)w#4jJ~O% zU=6UA!0*m$md8V^u;-AZL`y=%D5H6QpEAV1@ll=c%LgcS_Ul;+7I zf1d+1?Jooz5CHraZX9N1OL_YnRAP|JP`+OE2AR~qq@pTKJ>;-sQb~} zEqWM%(D4!*xZ&4#V$oR&=#NPz9rzFlA39{Vd{!dJ>|od-V~1MtpO1w$-N(f7*#<{4 z{T<2lyTg%8EVoOc=)edR)jPdP|Ih|~%xIf2e(_Tq<2F6M)fi);3F^#wnVp&S>!35W z1JXO=^9>8x^=WWoe_wSR=+`m84e0cHf;vWgeH~s?Nt*8%mL?{kBo z0E=R-iFZ#)Oj|#ErGL=QIg(mQ|HQ_S)FE0>9GMqb4u=^u>0xa}W5#n*9?vCB$&xWCLCv_`~c6AP$ zidgc~P*x)?J}07y=AS~*NLk@{9vt^fmR@(Xt@pup;jK3srT>CQf_)Zs!nlDxfd|Rk zSg7<7MDmRxSs!c}Y<@smr7NVR-gC+t zE4=UkaSFROX4(?OCA<x%w+oR!)#<#AD~sxx5zMstS6DY?b*2p{ zB-EJ2&MG=psrSZhKrHD#vXF(2?zqMeh+K;YVopDmxZk^_S8rE-$Nrs<7Vj${jy_Lx z`o|3Qahm88(qwnDgZ%kY#1I|X#v@(+{KqFi24#l?l0pdizw3F#P*dO^SA`_eBC%|> z$R_`nF{|%aJUCT}FO-IF6b!hK5G~jrw$#i)08f2u0A#ozr*=Ai*hNHIgvKy-b;lol zl3cJ*Dk*|qBA4+J@BKCza-Djqr;#JL=9>`Cl&q|(1K;%~f+*-MoP0xrAwl|6xY4%A zqWLSA($%uUdwH}MmYa@roMf~_)f9E?R4V`BaMPSkokXo1{bYK3Co!sxM<&H?YU_E5h4lMIgN|9-qAGND=UVA6?cntnp6nv!CSqHTlu zckhoJoBCJLKZfZ7)0- zV}Wqdtk_j)R&B5O3xw=PQ$CFEHa;#=n^I93Y_?_0qwMZC}FI~iI8ITx?-hUB4S zHmVoa{*P(DMD08M5wbErePoRt!~mn-zwQ)SnV?Y`0}^Eq;`}d`4GFQ{%qM`x*A;c4 z9TF(~_y;}1Hyk%PSg)pOk}0C3xgzffdZha4d7ws%bH3L9H_d*2giO$#+s|c~dUHt|UWtY=-o@klgM>Ov;OBH0QmNHve^A6Hrt><0)#a;KkYHtG(Oty&h-sS4Xldb0WXTiL3K*B zbCRxY`h*YYCkv-k#l~?V$=W%%27i|LuI8l~;t)9y;m5m{e%~=s4%ii(FHH3ug+Q0Q zOJJ?-#>qtK7hK2_UNpky*PuOlel~B548<#-YZCl}lH7MPpcJoiG=FX8{l*UM$|W_M z8CNCBUJEb!oB9iy8jphPQP)0fvN>%N55+E?Dy<~gFfb9j$*D}<7bU?Qr97%n6ibvF zK<<8vESar>vra)@128(vy-fS92D3~wI64FN>-Eu{QfZHvhkb; zr``u6B$7TwK6+btZSnp*Q0vv8On~g5uAr@;jrMg0YM=M}-sxOu_8o!<1-ev9YNg&x zethNn_B0_E$&iES;ePXbdVTBlE%)IG6z%3n8RsB8P-+t(TO5y#hIu6I*l`oPa+=L1 z9#A(;R5!y^7cXw!+pMKDKJEV?tMa=omTEFG#3ON_sze?#oq{Z{ETjQg3iju}*)%Kj zaoCmLqJ^5N3vPXwHuoBNrTq@zY;&=#v^0X^1Fq0_1%>Kv>wb*Z1S{fH+>)t-4nl;D{><*b_@kC5 z(qCeslkUbm@|+SNhYG0_=dG(K$;MUEZ535Clt-JB$|mGlU229^RGz6=ZcFgA;AWvg z2Q8_d)KGq=a<uncl+tV`8xk20f^L- z=;3R}RWqdh81UaV$~u(0?E*6rZJI_@u|sA%>kt`d!6XgsA7m%lPWVjy9ff>alInsdZQW;&u<`)y!fO7_l)CW?e5SEYsqt~`|(xbv-Uu%9X z{P;&b^^+yg*iY?i5B<#3SM-+nUM+a;vCMHg6dp7%IX-}RyU9VhX=XCMJJZcWqU%6r z6x*&qBZu=$K4@p4r_QE_8-Ji#DHa-f2g+;XN~gREZ$S8W-HNCoM}4n`u25c&yBhMq zzq0d9fcMR*zz9c%f_!CmS>e-6L&4+98Y`ThYYQBwrTL2k1fzkg+FgBqKcYU+)H+>0 zn5K5k9vzS=O)WmTqj2)|%kbh>hd+iUvlBWltl7xO8N1Bo&BmW*->Z&Dv|iFeNGYcu zpe^BPqtl(S(0%_H1+WSuzuqs)JNv|cw>6XxSge8L)gpdeM>Y5*>?uCt!YM27-7>^= zcUnXFKbw@fCmSOX%h-!`Ai9({k1XDee=yDoH$J0YMRTWLAsYbtNvM)H?%jaSP}dLy z-umJ|TL}H)Difx^L_M+GpY-(cYr2W}c}|1RqMa;8 zw|z%I1wUXNZXTb?N+aou(Gu@Z%4&cGhbs++AzV4k`(Lx`IRf$cG# ziL{=hxEl3L#>k%Mq(zQ9=_dIKm=2{j@WU%$%yM6uS7nm1*fRE#=N5i175=i`etL%* zc$ni*w(CHJ3_v^EY6jMoue?XUloY3tw;2S2xm3YWynr~h-X+hFv5vsvq{{4ZY` zg-?tfX2C^@?PyaUY!w`V$v2(X()RM;tgPbe)X|D&IVsA((LABJp}fAH22=8TN{Li~ z1u&Xafx&XYh=qPTd>SFG>|%`&Auw{p;pU(DX)XE%<|%m^M#{Fxi+O3G)|Rw!*0 z@}9#5Wm8IP0njAUrc~4pk=#HsQh5L)Cy4@DcfY*HP-L{I)@FR}^J4EwCP9wvR`V|D z3Wgut!EuSYn&(f|OcEMv5yL!XFf9DZLm47^X;zYj#f5B|-*=VI!Wv)3rg?=o)!Zdi zc`SFs9z%el+f!2fpQLE@PQ+{*zaR}gzJ2WphaVs*oeKV;MIQ_5>;Uicd;>10+JQ-h zV1lg013k;# &3clFbT6-zOS$7M=IWTiLQ&PjBs3g)`#t}>;nmaShV-?=H2Z%m% z&+Dm?aFJguw*lVZ6{^<^ksIOz<0|nLKu5Ihmu|r1a`rsV6?Sdo$lvgqzbh!kXG)wD ziCx-;2_d{#*e5)ta&W`>Tez!dU-?~qS)}+RWT#sLu+MG*T8L0;HN+-i<>fp0ac6THsJQx8=m(e?%53^r0#frwMj$9|_AM6kHg9$M z#g>5?j{IP&z&rmx&N`1i2Sw1mf_T4lqz8*Do~&9xoz5zNbtsb#F+8pcX?xzyKY~jy z-E+T3-MsAKHSY<4iJll>=)z~RwKRQkWxq(--@*+)18z81bt@Uo4em96jkLW8*xOzt z!@{v-xb%|b$6AlX+C5D_rT#e+oLezS`Xn;+GrPg`jmWkwkyX2njkK+e4CJi;5e139 z&hthdMY8a$`ULGrJ5CsVjK=ezg@QGfX~agaD{xUH5{^Ku5O28G-|?DphQP_Ee+lIo zdq}o(#F`6bY9(_xEp2{EG0MGOa@AyoGt2QV{H!h3pA3ZJOYYBL;M@PB4w_C~B>HYB z|HpzP1H)?RUN5EIjRWLX1EKfrDw@a8v?;~7A{07Pc<`qOWZ4BMc78$d^A>yp-5IkY z_Tb&ZoQyo$sh(z8+`QvRGSIc4?@_xD3194nI(+*qf-V*1!fW0Fbu|}$bUCVLb8dnM z@gHntJtEDa=lQLfrhGLo+TXAZ`(b|gix+lsyZ1e5^k?h)>ULBJyAk>mQWXDPr;u~C z`+5()>WI3?Tdxklfezt7|FTl84+~d(GC0eN_74K-I{uhWivnLxVp&?V$ybN}8=U+@ zFtyVk&1h57m{oV>WZalfC0kW2G&_rXE6Ua|lQgeqCgDyR2qdd^u)9^XM^$uE4i3;) z4Ia_zJoEes)~QC7gm`P-Tp76QR&W7EEA>s36Z3~u!-46V5C^If-K(Ox|G4yM5||hz ztt5$yE2H~0b{*Z=1?3>Vj@3x?C@7m_$!)Lzb1!^V(=9S|TwZF}+mQNilW z{XPR}H}SYZON<3`=r>PMcLA?IV-|QV+kI4;STm)gO}>s_%pc*#!&C`Y?p7uErCKz3)Q0Lx534ETwM%&EpZIEb zIJea8JS^PwM`eyp`4Z=?@ZuiSKmhBmUmAVZ?Ld?Hg?$gTEJKJS?s53=9f+s(E^_$r zZK*bM{`NAVgjJ{SJ*~;pcOZ5t-e5UU#Bzt2EV23X5YL}K(GUKkSO2^!kWo4F^X;|=; zpLZ)yuSv0xLGLu7w?dRXTVxt>+Z`Xi@4i;+>pXp(3B6~#cDv{ixWc&oZyl?dCl-b% z=b1-GIlq#7DClLM>nr~4E!GJw2N}2RP{jO1J}&2@P>%7*jvh1Bb3P2|&&b`P43FCz z|2-Jy-%$HQ^$oA~G2Co3p+II0sWGwgo8I+xcvUhD`SpS{c`QMZ<}*-w6174d%j@xZ z1U`+Ol*gGxHZ8mwxe+jr#X^VEfb^9&)x|oxq<{oMkx`>|P?jsvS@HdNtbn)95;MV` z#L2fWDqy)PPuBwJ8@AIK?vtJ9?4xa`Z1(m>h_rYuJ=`XOYd2^zb4V$f;MM;tT^z*w zcDhku^UGK64;&ST*qBXnP#@SIhetnLI_riMP)_wsltcUea ztHZeK_}tT|Frrn_<2YfTd-Rh7fWdkUA59x|IztsF_6*)C8;;7a;RX?o^b}G?8F3Za znCQ)i?3x2)ztXpC_buGCozi^D4LAKm9gO)W?_*bO(9FA4I_Oq!HN;@|>@jPz{0au{ z1Hv!!WEK@@{#hBbVTYSm!vJ(p@~ZxwtgZTbJg+;mDquJ+6dmzwd|&zjhZSFkoNf56 zle0PGM^f(Dtq4YA-V3m#70NMll5*C7FFCuH^ModHHXT6ztu&7Yx#gJcq*tnl!vW?K ziRNO}tQ7AW6|hB2WIJ*gNjp!l2#|nKj0l4zN{r_Ao@L0(<>BS66Y|1M3Zuv{&b+oz z=QDoe#?jr4{6)tOquy&qEEUjg zT1t|g(VzpS_fm+@Y&2agc8wTk-U^-ltDH>bTBP z$C#x~zq{qv8FYSkRuN^|(fKJC`{4F@t$A8fpKvK&zPU$CRWHo{Gbpgkbx9_FpFUiQ z_jDNgh~=M)2{+NXv_W!B6MO_Zvy)0oFZG_kI!%lfYrNp20#4}S2Hlm1w}*|jrt^xa zW*UdbQuh5ozbc7Be$m@A;IVIK@EG^wuOq)_`bb7O!-e)gQUzR>)A>ay-ZB+1ewqBQ zPRI{(GurDQ4LC6Kh9(1}Hs)kUp-|mQ5sBo_{lE+QsFwaTLmmJ#1vD;Eo&eC!Jr@!w zD?f!tjemIedjfie0d_k}cyE5*=WPvJP3Nf=@mg^yEH31Va>{hZCF>`M_6LB~>pmOI z5v0wyNeX8$fa`r?A9Q>|qp)!(#}9S2#m-Vy63|*C-8c-Aj&Ek7hE10FY@++c+2x+{ z0pmz-p5BMg7oF$l>47hXLgT;g_2e*>q~L9i&Zjqn)JK*(q}p+%Snl`pJ0bE*W_=w} zx0?5XmV744D^djvCK7_2`*xySDYpJzsX~U>%RlXi*v5)7^bP{%I_RVq6JkPbPGsA0jVxmoEmAU_ZmdbRaan&O+T ztOm1b`G=d5`l`?CL)S=SeZns)rS*Fk3Up3s<<$K5>Glp#;l{6BbH#6RZ9pBDsC@$Q zh%{ISSBA&7%9%&w;(e3SXI8dx=#;!;$!iH2gd{qs(_q@xI+2K3?z(5NQN$lK@4{ei z18|!H1tETqoGy?RIpPL-h}BE_!Ss*PwM1Jq#>an=G*G+se}fupw|{TjXvkw#7r}Rx zZZnB10mVM@l#D?mzF>XODClpg8K^L^`MG}>0PNXvb(cLpCk_d$lvd7aaNC`$-b`(G zmY5y0L-#B2e~x$3f7r;^K~2Bq`rUN@Jv8oxgYsOMkQlJ=_BqXLR-DJD{{@jU+zxB( z*jjp~2mQzpMRWxhz3$7XD%l~5K-KrQ>ssCw}&?;0NQE8z1q+e{K4-YZ`E zIKD;vin@&Ymufmp*?v;>U%LDH!;6oW;@8O-Vw13C60#e@kzW(as%)9hg$d^Zdp~l- zUM*%n#+Lb{iXS5<~+x3^(Y0d1dB(Qfh*18JAPbkqQ@PZQWRgSSm z$5anCUxqOS(FxV{Z%fHWS*gg%x@;8BJVr+pbZ_70F$IaazW+MuMWpxSv}{o~efWVZ zQF}5u4^ToC33XI)0M8j@&E>;>`tV)J7x%H|pu}L_mh-s}pZn``zp&}|JF;3y?M`X| zsdSMW!h2rYGdiY#q`i|#y@I5Dl1V*+q<$o&)6@oUu?e*ek{=6rZE44t-X0&M6SEU4 zHz1nQ7KUm38D2aJYRQx@>H0}ymOewu6=?Mrp261S2R~yzBf$ht1wmCX_{FA`%9wkh zR)>=IE+(sD7$KmFC^=~nGvU1|xh{F~a?-m=8#L9lJLYr7xxQFW2GHtbz7?tSAC|$k z`ioHfl3vNUPJ8c$e0%kxgv9;2Oi8C5s%T$4flKiO=9Qs%moV?s&7bc*B+Fz)U=Z|W zUo9TUmPWo7O?J8*X+mEp16~ z`~X$6g}I#WnO`Le6^A3-_Pw{{`_9C#4ZWl9lR!_p1hC!F3QG(AZkxzF8zc@n|6d3E zhpCkm{9k@M34i8uttme`TR=CMGPR^1t*!R1Gv@}G@lDHqDwP#+n-2bB?;Nt)c0t#V z(!gJV>~`mF(gx;XHWlCp<~zWb27vc-r)22xchkw*_$z+PZnp-E!rlBi#?klg;D6KU zz`yTJUk!g-(FZ69os#r#;(RxFc=&fd9-M#vlfpyNKfePi#$5#}Zu_Z21v7?L_z$O8 z!AHdzXYC#p-MUJ_Pom<8RMrlt*o=pRp<N#T{>_qayy3 z-C@DO|7{I1Lx1raHtcL`Zng6bdznHo!2TCKrZ8%WLsoz>LFLt#MLy2vn`F1xr6oA` z^&Vhz+6KH5d(IguyZ(w7e5odf({1lWR(;f!3FwB%%O7alu3<;NIZtyd1J6s@6RR#+ zGL)?D^X?uQmA1IT#Wt3&6tFlux@)pl;r3#$jZ z?JR0-*#^Jwh7T!CLwl$hA?<%XpNYJ8df&E|(RI6q*J83m{ZMd*NUU*C9bXAX?PWi@ zqpc-za8N*bV&$bT`0Ba~0TGGe)uPNbWHwDztGm0X!S_Fl|BiQg`Bqo)p;bR(p@SB} z9*b^t?BT~-+`P+|R7?HgNm!MiAr4`qVVN7d)qHxYj{bP}z91S3+~RMwV9;7fx!s5S*fg7BuGJ%HIa%?LttcDKeV+zOBWvAjE$Y|hdEUvkqo4oU_tpK8>-1>81aRMKc~R6R6e_z@cs9bgL>?*~?b-zIwokZF&DjCGVu3q{_Ze@z!jZYhDCpeRn*i%v8j zCo0-&-7FN?+eDXM6)AiE%0qDp=$$i~O|aU(Gp>^uS5-7r&BGJ`iG?>)npstBLL1lQ zv^~p~=)yiQP`@1bXXnASA14C}ap81Z&Csf{=jWVMNk}93yX=)YWmQ9;uZm4+n}`SP zwl^vfMO6bga&RM&V@8ZEBQ_E`6ZWcVe$&o=rdss3CyvD13CCMZG2XpdnGOW9|Ia`q zIT18itDpLhi%dS;JE%ZU?Em(JUWzUK3E%qSn;Vk?=&`o~0krPEb^@r&>rMcfo`V3Y zu!{U05-JueA}m>Tdr@WzlR?)Azs@G)Qx{ykM2U!@;gTvU<;0Llq3>i!A(4p$%Yp}Y zv?UG=vO6L4(E4^l$hR+${bRCA4$TyQh{Q0vyUlC2q?Z)hu1>^4w_PUt^{#8381nZ! z|7KntW}kF}lo)#Cw4@j^2uKXc+{m)YS;V}P@nX=AI#q4T(;}6@f7yhWwJ1^K+i#Xx zAIyHypOQ9vKmL{klFi;e#_FFg0zxK`rg=B&N<=uCfdv9-1C2=_&2R!qqxC+1K;!o# znE{8{kF`>VHxkpmX^rm~rnE7GamJ>kXzunYCX{yY@P>hUtXqxUm5;ioiBkd@G)EI; zEHra2GH6ZA$)G%CLvsZJO+*GL z5wylAD(8L*fQ96DlXVccH-F`16QNJ&VH{&rzs-Bd>LG5tIkIX$hao!zWs-x-;MYqY zO<*Q$5k4O}(PRn5^o%_e)ZuXV_ zvk@-r>b#_DBwA7MRi91&y59-EqXhl>j~&^$1CA1Y>x~SZFo?t!4k}IB=EZ+$`+l$3 z9CuL`))80edFw_|LsOV$YlmJvO@_g39e2n1B^|0Dplu6e%oaJ$b%PlRU%Ov*{S-| zG~`9Aa$Bm(vq6@K{m0l3f8Gps0J-qW8 z9l`i#`BYz8K>b|Yr^{aw_6IDrmO?>GIX49@)u^SrNhx6C+px1whXP0BzfTUIEJkPl z4d2ktK9ZOCW_Zhawmit6;{o}0k*oak(@$09{vT7hACvc z0J*%5%YyQ~Z}{IUg6{>vcOIq{d1e0h;{zZtcg5=*5G1C{>9u5HvD+^0o%Kogknlbs z+>il=oB#}lpLw0|lbQ+iJ^W77-&~|(m{72=T3GlxBbi8yu4Gzi&C%X>UpIVl3zCAO zu~lI~o511Pu%qi5zITTuud3tNt_;Q|4QJyU%lI%z<`fo4wiZ-0&nnOv{cPF(sxnXj zr&io%WW4-0NM~&6tcB-1+6{!NqNGxA=qe;S*Z=py;oY{y96> z^f$55P{WNzy_I<^edX26W0)mp=hu8QgJL-nkHqnU$McPlH)-8@&1;{y^QF&lNR3wl zY9Tc~Z`|W8>2g1$oDvLu!aT$$6f$6^V?p`tjOoH z#0TBa$h+h{Wlqk=-~7(^2Oh_Cy@`w`Em+g!?2Ycw#lN{fQ1&PHwhrb9 zPDxsJNwAnzGBq!B*D5TawZ8njT&7{{y_w>%D)CsASZl62g~%;=%3Y`-W3Nu5`+1R* zc;VK%NBM2(3A4pebHz}#!3wcLDvc_CR}^+Z`*-Z_f2OKCcJ{gMGJ3l-)f@Mx zKP#1MS*w=rx855i@GxCtnM$Ft3aK;`Uv>Y$jS~ZBKbuK7>JT^~noJBN&h0L~{O|k= z!}k~L-;;a`EiHHW2NQD`GWZ{tim#DWeY>46-AtN&wE4{3X!A4#?w6;;`}cx>BPAO` z@diPgnT3VPN|U!bTD^cW$Y`?Sf$ksr45!SqUh`%0R@vjmMslw6%GFGZ!X+H$v7U2H z@J$a3m%LnksG76<_3?gExv^qcxd=r*aOg@u3*-@_9a;$n)zuCpkLHPD#=}W&1^i)r z*UgNStY2_87qeH4UeC$Br&k=lW?DS^;4$q4DZq@|%3Rhsn7CqFxMc6*Pr}Uz^y!@N zI~~e-B_a}FS@@J>j`zG}D+F~o0@z#m{vKja&v^6r+mc4F7u%4D&%|BbAke{oVNU=U zdkjuy%g^Eo|ob(Hsu-Z)T} zs-SEbuw)Fmh+Ei|CKicj+vZm`U~cekHCIM_0Qr`No6ZNt5~5A#1I*jP0wz*Ok&~tn z@l)fiDsQl#M#1ovrf@moWwUP*k}g_TJ=+gBQ-Bd0m!Cz;ej-Zzw1efNkJA>9aPzQ8 z$*y_FD<4PGDCsTABY?k;^I^PiUh3$tI8|4-@vQgn9MGCUJo_MRT4Efv=&zOLnfTLz zz&lLm&y#)eV43p0H5s0~$?pjF!eVUQZ1Q&VG!%$+VlME`HF$@cZy+(fZ;Jr_CD(a8 z=Z*seaBc}&?X9~+!(<2|@nUXJGpIYH*)5EkZt>K3c9u6RbA*+hMmW6d5&ps!$WtSP zEEpE{vGJ~pcC2a5Bw(NC6i$w0E~NjT(69GtRK#n_;{qdIZmM+lZ3g}7?h@cwYMIYI z{Z5Ual$8O`0|m}w0&te*82t*IHQx{k1IbQwEFc;Q14%3v!5b28Gw-Y$65cS$$GIcn zfPl~TQx1Fr{yA&9vcG)#UGLqgMP4_>|B`;M&(5UZhi3kF^t;#mvu^13^YSj~_ZC~p zPf^EzOurj@rRX=?hWQ`S?**A7>`cEGbv?qr+e&z9gdOSE>%DG2(oINybh5ql)9m}w zj<$3CcIAqVcx5$SxmFmxq107Cd&I1DywZBLmu=#xgUi_n|9H2p^}E)dE3FUxxQk9R zUOE0b+Qp9$iF1??p?}~;)PeTI$198KYWwu4J`Y`9pg`J9(Qy3QKED4K+gHB0_mg;n zJ(8!3dy%+uGUGWDdx~sG$$Z5d`ZdvvzCq!$otKFmhaYAp`&wO_r(+~o3^9j%udD6P z{ShaImk`~|>oGqYeTiy#*^B(cF)I?()VSZ|IO6WsV$U({rQBH7m+&$6?{HL=cB66} zSZL{3^jvHC!R<#kY`?KjxQ(DYfc-{n@8ZS1E$1$IE}fAn&reGBNS;|9kM$^OZ!cT2 zORpCU3hEpm*e4pCl?Q@7k_Wr7QeAk{E)45J`Bd?zc}U<<;Ire^*^9eCW0Cwk2(1`SH0`nY^BOI30R2E_3{K z8axY+L)UX)0{9EmV?ALXL8;ZbBol=0S%a6lrG86wFLpLJ>VzjsR7Q>Ya#>6<7Q8-+ zDIM)qRS=1-#rlQoBC);j-&4kaGsQMDVZS+1xVK1Z8g*h;n&K4fuh@48`hB}tvi<_c zk~4iEQUE~Ck&c=xgSJ-IQxTg{MM#y&9P7cx@D;{D_+xv`*UZ1?;T&NNq#Y%s>97v( zs856)-iSmi8>bj{ka8p+nTb477G?D?&4$CD`q$O=vl$NPQJouUe>T}`5{o^t-MNd8 zfZ?amqGXW6(yf7*pO)C)vOl#dYyf}#%@FGRZ;R@ zXz97UIkR!mP^kTk*770k#gX>s>8+ySA2)@#VYFiOdle;bE&dzww--Mp$wKwo1#Htf zu_8VR9H&qFa?X2N~W*~i%Y*-Kws zJwy#!H63*029&Iu+c&-D7@vPbOFv;$^pw|rjnBiOrE=5sYF}~vmSj#ntLCjOB=5)1 zgX6b_mMZ;xqNMNf$r52aS`eatL5TH+vd--S_Mj#{V242?m#26l06H? z>4dRS;nCYNCB&Xc{Llj>A&%e(MxlI^Bt)ezAsh|bvi)wGzqe3{RPNBmN5~)YAAga4 z{GmOX9JwR?SkI%0h27ru_PAam-ry``t23FQo6fx z6p!dSHFK)H-KDpo^xHx`#&dqO`;Z>k1uy)1R1fcW|Fe_3mlqZrUCJGO(e6=(eI1X- z_V(o>aqNa@{F?TRT&D*w$>*))Xz%S-~7*v>ODg@ec{M!ty!3gTrc7jQ6;o*c6F5n86w5j~{X9!DGAVM@uhg|l{qN8@qra_3igkLfIR=73f= z$5T}RJ>y~T593TO4VScC$B5Wcq|!x$#%{x0`he?B*oXhDEWe)_A#H zK*2kE#eM)V|7rMt5I;Swi@6(iq5owv)G@)dfe=?5BzleScbs?^&hOKY?Kc`jNAiwN z@K=80F1NluR7S><_Z03_expDbj{AQ}Cb`?*|H<;=bidpx{cd1v&xAvhUNBPc&(@&= zf>k%7w6ICnhc~~WCG*?wLK~P^W*7hRs{R#C>msXP?}-h-ex3Ex;@O8+#7oq1<{KRmaf@;d7NFqbR>vJZ$E|1u_>ZN?yLP zvaYsokD4hJqt{~0cu(kH9m2e}B!Ibr1MD|PaOM#;PZGuhY6;*I!1Mbi8AyFcn>C>3 z{7CauZXf(6F{t5ATPx%b|3+ea(3=lqRz&01_e5`&oKYdoi4R)n}B^EOy(P<|tugVfQAl6OLJ9ZnmSloO^y z^)tXZ^RH-V58YnIb2MI-RZ;TvyxE%cY$kolC+SJIdUsW7(q|Bd|AI+(Io+rv853sO znRA}4ITtuwCCqxd}$>vOy=fD;f!VUx;MdD%>KRYl2~ z(9&IiL6#pkn4MENDfT7@{1RW@5?cBaAGo2hr|S2uDEUh$mW9+d62+4^Ga%DPK1yS3 ztM}$KLFDY7YK%3hu6d?2nHsZn35Kdf+(HsadPT0UA=o-{tfD(P(Wa3}-n`;H^5UL$ z<7CdQuF8+V$pgj7)w$8pYrT)(*`I(h#&CqaeDa>Kwe&c^9?^@Ny`I72hu+SuDYI*{ z_in}yhON?ET`(oe%DUd zd#NGTsk6T-1U4lB!sb0fhTAUXrJDs?YgDlbW6hD(81q*}KmWs;S1-)p91AmZ#z)#@T4{aw*_XnEm5WlKJ*qqQ3kh{i9;N=}gK2+R9r z#xI-owAm|}C7cG}aR3&Fp$jM%Y5Jc4T)3X-v>TVnX6O%z8T{+$DQ!AD&mmKtsmaTK zWIv)wWcy~5@IQY+XZrwyh+C;#u;_`;2_S_gzba&zsbd&v+Tk`Au=4POvEU}Qt9-!` zGWM{9R+}>}TVfphD{WtN$^va#{e&U(vW^4ws(+g~#)PufjZz(b>S#8`NdHP-fIjI3 zTJK_n=D1;!ZSqI?B+2hR$}DRQq8PK?YksN&CDDp^_unC*FLkOzhTbI7;{3df2hM#}4zAgLcUS}T-%w>{G-g{kh#Xfpjf3c7B*SIe`%+fuk ziDijmeRx(-o8}EO`yf(FFl^drb7wxtU+<#%!p`2T(9(N}5QdglX4UOEzB;FF&#|l$ zv**)}%1icY?QyJBkJ_xe0SEVJ-~U(WXX#g|SvT(3ngi=@AP~~OwMPNLH8~B!ikd!w z0+4%YR$1MyNT~i7eDLe@Vp^#FE?(5#pdiCrJe5Q2nuOrPO{SNG>YwK=Pgg9?ug&A}3FGnFA<_JlGYD?;VZ5WfJel00UR$(-T>l_~t`F^h+3 z{)LBQ+L0v$ZOZWRK;gSpU zL$^Q86N`{mWe_E0Vw!>IrbiqZ80SWs=VA%wX+bg?|2o%5?3nkpC?!|Xugr@G=Eba} zG^q~N=bmBj?#YU!{mDw8{m^`)jx)^{ZtBgN?c=tx?r_hQ5%i%(nqITunu6EyX;~4H z3nn%8XGNOqveCE-n-E@3{=P0=@UI8f(qphALv|KBj(5JQy;HF_vAle9R}oTyKw@a>2=1!Oj($W=+u6 zE#2k;K}ed5$+Sn}*@L`ZuZUIM71sjJ3VpQI%iusQt;c?Li~u!2;(3!5=*|8i|A*-} zZ{ag)rz7?|kjtrW2tb_*#II+{fkz#ChpdC};)YdrBAR3p=#TV2Gz#bu%Iww3oG@_2oFX=wR2?DC4xBo_ExCoKunzyE76{P~?u zV0iD0{~Z`k!i@aC1;Z~Di38y40n{Yo{zNHWOJXeT?OD?YQCVE0olGRVWwEd`FKp{^ za-16}o~HkJ&i1!CZ2n-)N<~w+L9WOfQE9_+6b?~OTx@efvTtj4F%fHS3Lr`dE3;qf zrn6YzLD;RH_m+C8qo{5BWN#osDykBA2q~{s9Eg1xw*uf@Rvq-eiu^sv0_ zsn_fH;S9NtLW6W^7yO-%9w<;atjL>mzd9i>^HC^IUtyGdh`&HVn4-ilS$y*Cd}lu? zK!W{*Z>%L@)Za|mPjhLrcFA6WW)WxDkT6IGrO{>pMG{=oGfA=r=OU+RUb;r$Z<|*N zzNiDPwNs9IZ@$w ze+!g^IW^?|NlAIZyF7JmMxQAL>#b9fH9^ zo>%>IAEC@8FL9=CooD3t<_mXu!X5wQJpJv%FrToby@gfe|DiJCIoE!C7!oizR@OU$ z7Fl0;vXjHt>8GQQn}8AY0dZ-?o<8^|XLa*<@(YJ+H9J0Fuo^E}Uo&}DTkQ9ghErn- zdvG!Rgl$I(3-;KEYxejvbY0%wF(g1-^_i^s$8Tq3-DpZI`%k>T7=dHlcF z96j%6B*tGInEk0yy74K1&}n>2YV$~|>=C--H`YaIu65B?ny*jlG?~#i~A+-yt58>YlA4(A z6>Ir?Y|Y@h+Nm8rPv#;KEyCqeE-?5^ zaWdfstpdlh^SrT^CT`it#D9V;uOi2&Cm-%Js`7lAhJr9!B!^S+gVhfBGlQF3N)bq$ zK_Sd&TzMKl%*R@TxA9&dQRy`tNrZxbbN+N_>Hj5sZr#xVJ}bxnXYe^lb|SL|`uoFY zNI|#oS-I*zfsgm-Pxb?i;Wx22CCW0WHvQ=6XRV_j2u4W~$R7~sXD$NxTA^UBFfvmZ znH@!Go8f>VAhXhA`3V^)azJ{T_^*{oU#C{_I;<=vqLn@Nt9oh4C#Cr!Br0(#u>6th z!F8*?&4&2ex2nZrbqHCb7xiJBH%DFZ1Q_*!`h3uMU1rDrMAIpZ=QaO$KR_7`b&B96 z-g0nr@Ub%yJDl&X!2zzX3M96v*YqzIuXl_R>G;aH#DZcKbue2USY*A{JNhCA1Bw6w zOE&+c7BVsr(k7FmzOP>_FVBZ9ALcOYn69~@aAyXwxq1)&=nH0;IJTpRbMyO=Fx5$Z zXvj>B`I!(gal#C|DgM#RMVcQ|)9ht^c;CLt&8m{^E{0i3bjB;DKHv0G409 z@2FkoU7&WEsC|$)>rNcF*{;0j3udeQu8#9fQ@(rB{O2!Z?xmuAd_eufjG;L>bPTV` ztJ2nO-Z3bj=9uE5!Yb$gUFl}c#{ic_3mh(s)CSX0jO$U`{>?nq2Jh5OY+b4Df9QZm zFS%^L`6SNoeh&XV{%+NAe{{MZ{yzNwhrcaq_rJ&A-XHEa-!wn|hxnTg{s6WDg5VFz z@&(5@?B9in&t&I46MJJMnJ$BC4(2YT9@TlK-pqbuGoaQu32A_o0+5m!Q4|5>JLNN@ zn}L4u{lkhce&FJZN*E%(C@HA;qNHLt?*GL>zt`U1=0YvLTSWdH>udGT$$gM35I>JK zBy$fUC7b76rGd@tkcp4}e)nZxKM{LkS$V5B>||*u7vFI%!u`X1gRwVfS$QS4wD0?L z&^0X*ds-!LR<4-{7N_AnoQBF={Dk7uLr=WZ=Q<3{0jIys-jqQ>Bz?E{rGq~QmaD_f zO}lI|cE6CApi~hm*BFAH78Ze$JN(rmz|R4-(notR6~I{38p^QI5HUs+x_9!SQVbESDx6yQF%6d-Bc>xL*t5BfJ`5@bk$BEg*4u}|-bL1-AjZfmeHYnBOH9R}o|6ZiwmTK}IKhQ1B$(DMVlZ>`f+gIO&;0PyV05)}YW7XW69BxXV|<$(O~ ztpOnm4ria}=wLRuVY4U20$bEIJ*%uOyLi;$X)vrl7%;SGc~K_4!TT@3&ukFu0IOtxY&4s zVw3Yh`dGy4`T5c2$pu8LLiJaRgGpyFQwU&~5b)zKq)=4DO*tRF2{&bPJOo~Ji({bm zE$q=WMMPQaU51hYDt;2XK!8GL{()6<-gzl7QSl#b>;f%-BbXQPPpxo{C+^n0IKSw&)A-2tvLCM9%oMzGII=s;VH*;14{&_#|`aw==$vrl~)lO)_ z6#f1%H<=Z{T>4+LIZkqGE>pVZ#Q^T!&%fl8tH2&kgB=0WE!aOWSIF$eZonQE*pZL{ z*#COazXiL4p98xD*|S@S2OeOf^O?Y+Mt53EK0zP-hi+jWE{12v0sEpS1$S2Iypqvr z&?l?mZ86n(InX|&GBQ%K33R7;n-N49frSf6YTN29JRt=rqvl{x+Vs>>zMW5!z+~i` zcc3N>eT)=+tYoY~pJHTnt3FSqryZL!dm3at1??+T_G4?wpY(}Z+V{EmOkZ@59o>41 zBo?IQ3$i8a?&YVm+8~lVZ~S+thCay!&v}V|bYAT@`|``!Cs+|d{3y1&x;iJedw$IT z7I|ZH)HMRh8j+zx(}*3oX?h+#qU^qRdsY$ORW8p>S1c6VQ9M0FIf{yD1pXRYTEeZ zCA7)3KYJmVw%vlI_|n2nlpT^;w#t=#DqU8v^Jb{vdpyP3uUR}Z)_z&_iPYyusNo*o z`dzV$BjmZ)!CUwiYrnR7fwe!sW_(>O zcYNe=f_i^TjqrNonT5Sg&*NKayio@Thf_-g`a; z51ZrFs?^U1b(XCx3SluWNj74XT+9<4AjA%J{^|HTe6mav1UBTMiC&rh^OJN3{)>hG zBH_O%w!3Qamo>lLXD&V>wtG_bc%Evmaa}(?i}FutsTli@Q6v|{c2BPU3U#VWl2c>5 zXDuEX+kHtjn{23m`Jxh6%PM%ss{G{G?klPXNsyA`x1%G10-BoM(&;L zWAhvS>pkthp<**cf#DsjW-%eq?9S*h-(XCUQjS-%(<|%6@aDZ{x_G-S?+c5)wRCEh zwNWctsq|a*Ug0~#w-AY`j-I~iQ2!F;#3#>@>06BnAJ6H_98&6o{1zL(zM~q^k2Vu2 zk6CDsD@V&3b86#v{WUX${YXr<24-a$mW`9An&ds{Uk=+<5WBw(-eKE7j_}57M+|d5 z;%y!9&3xn`GM@rOa#5mxr*NCY|IGHU z`!1`l;b*AfNxW%B8OQSS9=lvLe3#21h^;9N?8Qykm&;xTlnZ+Wpk&dB919@%`ubqX z%3s+*qS0n%nmCJ+v3>JG_2YODe)i1|HALu3ZuWW`lN+jl&3Eqgf-kis>hTdWmKTP7 zJjD;TV=KzV!M7mJ9!w7^F5e(dWC?Gxcl{{e0@7g=uhWVaX4RS!K;*)k!RWFgBJu14 zZ3S+Fw??j}Gtz_XiRrMuJVjd^TipkGZ*ewx3$2Op%|O==ul`r8gwfwBesI8h^*39B zUS$K!X5TXB+Rw*R!~Z>v@!qxGd?N3;LJc<6Arj*P^&`GA|M!7(vw&%)aj4!UT}mc%q@CAN<=4jGl{xXCF8vjSH);hzVb z#?c~Q;?R$yek^DYd50IV3A=i0K8WO;9sI_xici?egSX_DSiW|(_|6}xxSvY{&)lol z;fK5Rm(w~&l6Em=C>fb$M8PVWo{fZ_Nc1lIbWK4;sQeY0ATx_p&sDahOhWVye>!$Q zi{n7=oDrfeAb-xPYca1_vLMG&*7cXe9Hj>xK_}SuQ}c@TkH3^U&HeI7Ng)$Zzn+}1Lf9f z)685px{c^j(2~eQ3PNud@WDSZdQ-e(JOeqMfuPFd237AjiY$$S_=RJvyM6(+IqwAW z@|W-lGkh)a6EqI}JInANY-*D?5>{TJ&oBX-iy};dkt=???a0BV3A3Z|P>5vJO)DAY z0!)Z$sNeGuStHFps30bCfpMjl?`N7uXXFj*d``iT*cNSi!F#koQ1m;Hc6Xj?ry;lu zLhWCGf$3a9o3Y0gaF7W~S}Xefa|C*Rj7+etnzj1Zygkg^qWCsGGd7%;XX6W8y-(H} zC^BZYRAlFwnVSy%B9n^JiQrzOUW~6|a)C_W z$?VWhvZ8bfc%mok8SZ>>&&9_oU3|=#68&c~8U5#E^F6*Eyv@%zbWDsM6tNRYiM=y2 z8lU`rOC+`{YyKfTCf)vOe)pW;Hymp}B-HRSveoyr0}IjFe}SYSKb~l~&q1-hm$82~ zwwF}0IaG}8B@gscd$=rAe<2SB-^46?HFxosV|%X&)lYQ4LJiY-5WeqacnFth>_enH zqHmLT6}JT^CIt0kd(of0GYadz!chIwrcqhs0;$)T-5PG@WG>De@l#w1*ZBBs^)5Kf zF{rw7(YLpI3Ym%!i9fH`^1WhB7J&mXB#qp}Xm0Ssa9W@u#5U9-Kb(>%?x7LRT(k3R4nMy)#4B!ve~wH@Pc?^rT6OHUe`o3@L;VFbJQTUhKhGs-DJY_00a`HxwGhy|`|75E)O+JU_@IB+q@I3vyJMxl%%nmt6Kb672190ykZxyjOR?Yo?ZUrLhD_jpRW2W zAJ+5gD_hHlWzW$aIId@}htJCS$&u>x@t<60b7+Rq0(&A^uoOV&wXtmVMFZ+G#!J8|Xxd~x?eDscsi=o#^Q z-#*{zKI3N|OuT>w24HY)|V$tzt ze#!p%d_49K!NMW$^AwxVzV9m#HJ63fo8F2x<-ErGB-eRN_zMrgdv6!H59}cFiv@;| z#(1yhLU(~7G$OQo#?Z2+&9OH}Mw+&SLr=Vm8ML|}8YRb!r{isl|I*v_E_rMLy!wu|s5VXt$LL8uW#M$VK!XJ{(o z-@_dD%{GoswPJ@pbrb*mTwn?8+m)8j(9ymPTB&==QpG|IgCu~Z?SqH_ixbL5o(!j- zQ@B7o!4{J*HaW~h2!KqE=x?BJ%^i<6a}dI&d6PR#W$~XRL0mY&^zLu+QfYtyu1@-0CmbI4ckr2Rj58;o9D|WW&l0egjh1 z0rwv(1>9}iU#)>;^lj3`yoTBG8Y;`CwUzhlH7#-mTY{Y9Ao_WoX-|vy&*BoS-qYfP zS=dV3}n7_{6xXGF0Y<_&1I*`q+zY?oc!LL!IB>;NDJbN ztz%OFV5Q9~rkB<_ksOAuzkpK5FSkN-Vjqp%$%NLMjWD}X{&F^tW@Ii#h5u*c%QWS@ zJwE-Ld|s$!`IPo202XeVD8)ZobhbbN>czYXH%_VS?1h;8@s=&yiGAMD>Qh)lP;yqE zS9QaFvQ+k-(BKTd1WQ|iK<%_ns{0+rVWB${@LxH=V99%Ki@?K$rLuxB0ri(FwvX*m zx58E%LJhxHK?GPOUt)U~)ZD;|3zmv*V$VrDLel1C{r+X=cbQZjq|%t$DqZ)KrG>KB zMK5Dd37I`Y4WCNzHr=9Mu?hF@76kDqf3k|-7z^?5>p@-&ymO^N6n@^dQn6(sU&qsza4{nRJjb;tbQ4nOW+YG5ha~iY_)2viftBih z#P9Kj8>aBm9iTj=K)Y}1OY{QWa(9;g%A1JieDqtU{VjU6DZg*yMaWnQ(xU`F$nG`+ z0{LV>>w*FjOaD~3o+9?JDR_8YmEtEC7?2;e0_siQr9ED@zxNcX7-rjXyz;EZJ$})9 zoJ$&a3dVbR>CSe{09K_fXDLG0^)@gWj;}x}h$mC_f{*tu`_a9>-?r1@k8Jw#$zaJk zQN>#C+3vmof`1D3&be~1QGBG250M;y)V21P44CdAaxX;;A`b))%6kVQx0{}Lv`_^E z5q%d#9UmG-@LiaHGfFcH?UBN@Hh%$ciRX&VV zKrqsG!KjDP>^+4l=EEq@YTQ-miu!jTK{X!4>)ltsllU!kQz2ND2C&l5fK@=qvDKxP zy1(9RP^J8P5B>>={hTx|1+e!gpj*59V!MEBuowc}PduMN+r$fkhhm$?$sg(u2A~RP z;`*+M7unx?3RTRX_&B|SI9$9>&-^2m3k zQQBH>F+nOZxPZ^zfq!jpH>i0<-F4{=?Cy&x7%iT8{i=Os0v~h!UShk22|8(w^iNwq z*7@ETk-^$&aK1SEH*`q!l>Fu!3OMXM7vlU`ErGNZS~>HMAkweEy<5KXKE4hk`FGlS zS!&0K6N4#ae`j)Ky05OD{>%O=uT%fXRp{G7QK|mt{Xgmd)g|gb*XG}`|BtWze=+~l z=cnL*pMQLf5C3`pyZ*I);>VBfV3RM#!`)0y{+an(7!S_x>Ks49THws|*o2iI`o>bY zAlaWCkLdRZ84FE2)0;5vwj%x}437G%EYeA|+qma-%of(yl;2>xF}z|Pxow)d($VX+ zoa6ggvG#Ln$VT*Seq@6gqVRE@2J7;hh75Yr@|(6Ozv(->Y!;T^M6rAIYkyHE{jl<} z{hi@h``l1NoH{s-PyAC(<5A(J5s&i}oAAsBnlKw32KEhl*)J|UK9TVF>ay7DgvZwq9{0>ItO%8Fvhes8!s8q4z^rXg&ZS>()O-7nN{v@Z zFg`*F|I!)V4;ZR{7UQeD`Ru&1C40U*=jM3mmVU@b7r*1xS9e`EBXrA)RN}`=y^s9L zf~$B~@qBIXnxj|?c=gv9!zC|<8XC-ZR-*hcMV0Pj8#MA`49w=&3pHG#BJm+t+U^wcmHAi4520(5(LCHYC!liq#xjG7~<_5szbr{PxqNxyuF%0I&^%Gy{P z_DTiDhphUIUp{H}->@+oya6ivV{5x!-K)-?)Bf?z1+#cKZNTT3)to@Z$xJD8d=I7S zKaY@2e0~4=Tw&q*eC`*1pIS%?U+NF>d#ZM{8)E;D8t2y>PcMhZ@o#KCQz^?rZA82E zvR2kHEDl<`gbV=S_aWaH+vTO%OKR{vhCEd7cW|&eAk-IaJ_{i$ki!=7oMrRi@W&-# z;Subw;h-V$uxrGS+wfOYenalNL-}pi|FgXLIF#4t(wde|SD9mm}ayy<`0|Iq(&t`XG>HGIwW ze@VLksl2hNm%6^M5SDiFlKuTl_FUgI@4MFiBSHJa`4n32+8?j>pW_83&-m-s9~fwt z{+zkF_>CwtDdpYl{GUqmgNT0@&D_#x3oe-4lFn?69qE3Z=FD%Znz&Y$<} zf^SmkzPJ9ly5>YCy{y@A`k_Dbt541x zGyuTBh>IJKx6^=lCqJ&kE;Ti zzuq)QAd?FqmqA26L-ksd0>6=+t7q!T#faqp+i5bA6=6G4hWsnGL)z)G-o`aVp8cRY zPAfOpeU|ja_k{&YOD2ZvJ);DKrcKSx3GtQ@Zm(aZtJ#Ba7cHljU2sV3ESe-^>ljeP zGiln#3Loom+Rs_d3=@B6q)hXz-A5;C4gq*09YAUZiq^a_!qXaxkWMs;UJbuGUq(9s zk;KLCN)n$Y$%+^patuFX6UN&Fh~YW07;PGG2=9}Kn+bz>2;O_=Fe`;XsT;ggw8SDU zgvNLZ7BXibsb5rJuA=EBB()-VYqgO1W=k@6(wM*LoCy?+4-8F?ZOremWGB~G>58}V zw=*!%Uu5KwLork-6WE~>t_(uCD}P38wl`Bgki>}2^}2`~c*k7j8+h{60DF)QaUvO5 z`&(Fw58S;khz}f6z}UEg7Gy}pzplTic>9ZXb*=^{kU;2BRIkiy403Zb`03n?;Ck8H z3g=og_Y}_Nui})q+XeQ%^PkV`NL!V=W5^DoWuz^uT0|PTQe!9rz zr=n(>mLpi3IQP2pVJ!wrK4XNY-tnA@Z!0a(izN4KR~Fa`#5T0IaQt?YER~HFIwqrb zTx`N0{TfYGMWiwpTa6-D!@Gg9GH|>xt`fl@t+oaFNh@o&JeVio{K-yD0g`b4WxpTg z^k;kF?oh)@hSB1$HEO&VF`30f0x{Wq`zge~FZ_MPKt@7WPv7&Hw5`aA0~S zGggNm&~TW2@{bR-hY=NI`FZQ*pdcp9hDxF4d<+9zO_g)`AMXIAmKugo?>E;wkqGhC z|Lv9CLjFKvE3Yicr72?$!OjHfuWf8O4`!5}MZIhVw{-nDE1l`#beM^c^Nw+BWyols zLV*S-I?7L+rEw8Ke4imD%K5=^$9<#{pr60YFX@R7z2A}WlsH-?W9_{b9Oct*ti31U z+2%n>oTT<%(D9)Z2t7F{Np>dshnLyJ%0o{LN*>O04)=LpIw*NCmFthBgQ!nESf4(q5nrSO2F*J5LWh#*@}dLst+4u4aUqtRLVFDw4zP8U&QP7-J@ zgHOh`ox!J_^o}5$-g1?Nz+D}b!zDq zKlUk%djkn}Brc<{%buftsD8TWjwGd!me;hcY=ZaO%xz_xy_a`DNZLtqM+aKE*Rc2B z(b70Z0YX}Tnxdt>p9?1eFx)o0G%cxoKtqzpqN$FwG`{8E(^720NpF4u&Fs1vZ3UT$ z!^%QWyxwPCKiNQHqLyTl-t?X~Ab3-OXi0spXnLkX+l%TLmX4ux1nVY2ULChY%x7oa zNAt9uYRkQj2>aTE1BI@f-|xSn!Lg3hn>DUum!t<1^tpc~pIKETXF29ijMY#z1vdca z&}Sz0WpYErAIOr={&(Eqy{_S=);}4q%(B-Rg06t)&sv5OCj09wo!CYuQ@-;1u2PPs z4G)py)N0OCKM@&hx5;evKHTdlL1+kO=96(i+X9H2qHDvl{VY$y2{ebaGvMNHePixL z(bSf_lWoYXZsv0kMpIh_=gwTJai`88{O&i{gQVQi=3-kBf0q>BG#_IUF(%!FeIORL zF1iS(tDgF_1o*1ZcP&>ga~$1FqG_AxU9-eL;eLTo{VGM4Qe(N2I||@nQUw(siR~W3 zwHC46gQ^eHb9H{=HHeMJq16N2_hF%iXL*Gz0w@MMW%NuV_3pqZ0m_P!XXg=faY{k* ze74HKO9tn7&Z*=&24|)1P%7D#dxVEf0{!&03~g2L1`V8kM-X)Mf+7x zJSxDRNv2m)k_oxH3H@hb(vI}Azpd)v)d`?xAJh{HNG)<5qD8JDiJvh;Epi3xTX$;4 zX%UC{nDbCa5%;fGKjVUp)dEuK%6gCGzXP&Nf~W*1gJMw zwSCndbTo!q9N6GWdSkXyq9o^%7smIH)!8rHd^YraQC=dO_PjgqRPV3anVYK31XbC=MJ_E+XTC|WeS9_c+Q#2Qu=41VDF1=!B?%O z^^cYRLR)5~+!x^TMYc?A!lT>8LEYFawTqm{7i`EU9Lj<&g9wCwBvyiZC;~JIuki(9 zFjK;pWY{}b{Loa5`8Ufx)%^Z@o2REn?DET$dhrtH=yn$K!3d@K+^}$w8D60I)PJD; zUiyL4e*JAYnZo4oz7zykW$p^)8rF$+#_)^Ne;g9QF3{- zc_#AjrFqrhd);47~yzzl$KH$Vi(`vkrAeg!!r%B zSuJjaQg$WNtWd1s!3z2sm}Jo` zc1W0oNs`&`mI`2jB^RK$vs?VDmwisS%lC?hD(vKbc+&)PrSAuVs7pB#$d3#}2fGL^ z2hmr4KaJ?E-m;H7W4Xvi5abuGT+l6=gMNJUx@`rs0YfByJ!vkrhS`N<+7q_}67w$z zQE9LHHm~8&E?D)tfEEN$0(sj>ihC(ZON|C?Rmtk-T4-`n;r)TA|sa{do|KAbFAS)6|x{CL>W<1JYxI{BtRJG+>S2zpKZO|cfkwNGRf&n^rN?IO9tGV!6^@lS`zDR~P1{LL(uIpRnruL6}wJ54^uxO6j+N>TRwxbY!&^?l$2;a}PMgIb7OJ zh#*QrnGI18R-hH_a!Dtjch1Ahzo)R&#*uT}U1A=)V)7dw2$t@PFsD|`M#A8B9R(hl zO#7MCpQ`I7e}y-t0#1qqVxW8HUL*FMd-DC7U-HF65QEEf?xzcVxKk&C_t>3Ip{)F8 zXN-rfiGaVi&lAc`M%m#7wiD`9;n^RW&l8ESeI_J3z-7={kQA@|>>=w@dpEuE{kq-! zVul{O+La}(I5L; zLbpFecUrW$U59=}alWW}wCyOH-AE{osN`86!k6?w8dr^7x>|1fe#-jM{H- zzu%lOxHC1lE|S{6mS`hFV=2Acye0Sl=Y(;x9p>*Re7CO=yUK)ehSI+yj-4ntIlC)B zL(Ksd!ZmAS9B-}o(#i)NsskONLILjt-2{f9otW)NFo^H!{)^j{Y$~_<_9NV8ENyc- z54CbJYGq_a$&2&8sjFrrUs4h(o}=|!OG3pd-RixR6t?{dirl|o7(pZk*&fl(i-0Md zcNVA}Wj_&gG^{!MKjM0sc6X zCv^LrD#l<}>2C_0K}5mSfyl$#_%qJ>(m`L875TaNM4tt0;oohc`-75AJm%K)2`xV; zvCxPiw!2SFS?IBY5_9;;$G$cFn-5A{%nzskV!Qi+99~7;_x?2p>DO2EtBIMcPK?rH zJm>c{T+jZko+Kf*mF5zsL8}fJ@;xFbO;itV4bZv1IxDu}kl}v(boe!FjbPG&?NdE7 zuzSFJYD<*Zdl2~yMv$%EnTgJ_=f&qU*!zla3Flo&e~)eM-L?O_+fwbn?R9Q{US|8f zyJ`PxiALK-|7c+)&=1F2EwxXvE89}bA#45@@UsaBaaB98xd|>jOiK{A|I|wQ3xSlG zYrmZs6jKRCWzHnhiL@;h%@=BuXU~e}tGJlyRPOqjcT*HwLd+R$`ng4G0o==^5O52f zopp}re%tG9(+fNW*S>5;8#Ve^#1zPspkEzRZtXU^b|Xz~{w+*4KQOEr%_8Zs=HT|MQvPl4jCVStXw$P9Byia`o%+$BL|%@Uzj%uNURD^)O)1bnmu6`` zZbPf~**HW<_-ds#VjctU=*cBBq$Gp(-w)>;eJC!_X&n@o_><7Ai2I~lQ@ZQQw>!`5 z(`PbfcB|Ic)4I!@ONUH5RnyeKvCg5pDQNGz3?~t`XiT0OA3P({eCXy#b96ITI4s(n z=Z{j;(9pf>$Olpr1~I8H7wYApz0e(_KWE+IJPb6Qmh<4%3?QDf=GsHGzP)hYCz%|7 znnDhHk%=&!MG1R3W6w>UW5%pG00s`8f3GfF~Bi zT_rEn`loZO!$&VSw@#P(rl zS2n*bS8s0{xq3$#j;jmvG&PX9s4!1AW3hc}G26HHvOLdas%+o-rzL+xL*?(-_N~9M z_OI<*tH=Z4=90gSjKmie?rUM;HG4rxB=%Xa1qbpk>&21g;^g6x(38b2$wPR<3UMU# zR59BaW1r>l_0r;GFN)X%l5?3{Y3Qz2wY8h3au!@bu|5k%8UON#W{EV9OP;_Zi^A-u z9+x}DGU8*RWwwwt-MbwhkG<_P3G92aQw;A ziJ`#$<*vi}!*sj#r)<#IeTVj>M1kG9y|_7jW+m?GD_(!ZNlT}+6eASxJCnPnkA%)= z**`JGf8&~p?d`Rww=In)2aZ`~x7>``uoiVqe!#Og9m%fy+`2tqt9c*&nRQdYFiKi>*tfl6}*)xXR#QZoRBwC+^uWLls`(CTkkKSe2#Y?`RmOID2`lZBuDzc{`rt zWVU*;xfkNPLW4h#B@5U`^*w#3mIJ9#jZ!Q}1e@CN8bXP?Dj`mCs;{#nGn+x}JNdp;sn(8NYO$`~Fn%-cD{`p;|4?3M+qiw>@ z59#Ta*-Vz7rmQU-dX59=Gf&rm!R4W#BBo%UoO~@NS{6uM_BiY z%YB$C@hh=L;Pc_9v&lN2|MQ>1?-1sYhF^5Ye*?ciuk8rG7cK*SSN^CI{Q7hYzaQV+ z34YJNrtZ6jUq$5Xvm?_c3x1qPnwtT=FS}tl==Eg`Dd_p<9~<~SoR|r|wFW*rKd8lR zo_k)YKTF<|vQ~1Or@wLkFX6^KU>qgbR3KPmXd2D(-t;-fq>MTRn&cQL9xaQ=@hJBO z5FRIWr)jrbUkn4Qiy^4GG7!`zSIZH7!T_)%M-nWVw$_OmxtnQAqLE|_+Z4)87mNE* zA|Wrx^ylW#&7ZLV#)r_&?`UPsl0Zjqi8Q_BU(OUce9M&h;DZ!+m>xfFur7VM+d9_b zH4%z`&YLD{wuN_c(G;+fzuKtZ@ti$%MjsZKz&?538~s<|$S=oVm5XAvs=j$^#7X~T zzXYxoyqy})?rGWWZ+LU$E>cMYkkuwA*_o=ma|5V^9WGxjx*DN^svmBG{ru%vcpEXc zjSNpM6u9r+r{7SkJ`P+7(t$YIXtx4 zT)|F_rQ@`aDBMI=zmYwq`Owgm=4dFloDgvB3$hHA)vEJos+nIqtDb2$LF1RPDOg3C zK0%))euqwFf*jgq>Srr-<$asbN>D8oWDS?>^2jGHx&kUXy^}*u!6rG#Q(?jAnEXnzA(nz|lic>Db%pd*RAB%)U0bjG)g-Sa^ zw?819$UoT;TKZXE!^olB+O_utcAoHwdg(g45@&U8OBrSp4|nyA6b-%?l)ilPtZL(KzHQ~p*yk?%va8sbOs3j>eyastdIS( zX(FcrdVgIwj~34TPY`=V0I@~=eKaPH^-&6b5+CFW88s(?0ldNh30hWh_b(3j*&*=h zGnrLtz^E4_-`51Z1Ebt`}GO@Kp}i6&H0s4&Awi;p5KAaf8t{h80a0Dlj-I zK{`TvS=|$6W&+<({RW05*=_QM+v-iUGUE9)N8;QWF_mA_`85^B zS)I&L{xJ937b?GK_3OBek2-bSeCPpKT?Y^W-BjMR!yCFm?BYYl9bDBFx@_o)^BADj z+b;R&E&Brey1DudCq|?ydPiB9s%u1bsML~p2Uf0I@rY<4)Q~0qmU@xwfNVD4&RJf5|ZzJsFZ?+hM=9Vu&&25>&hSSXD!q2 z5Y-7nI^U=@lGW_K_fltiJ<`VHFN;1_1-+(2I_`clsBtv=3%(tWtsxAsS~@B$K(41x zZs}BHU?!m+=IGXoEP|+AH>9c93XZuYpg}iuULu1@fKqs{k-tEH^#Vbk<(${NPhWJ< zSKA^|P1Vl5kn9oe#l=<~#cS2&IauP~E~~=WW=(9%K1l1yRX|$#?WHSxmh{izA9TT< zb~`TSCsbjOrNl17L8g7QWaGSZWskW*`a3A&IfvRHF*{%I&gycIehtRi&A1p=FWnL_ zv9-Kc_E(}hP{fA!)5jQIi;+b_%1$(KHHb(o6Ol8Lmo;yI`?}50Um|GOuCwYVOsXd{ zgha$K+ru5Qa{a3w98g?JlqMAR^FnNh>GW>0Lj8R@@tm>qeK%*bH+zf2hSfw+mIf|j zu&L)yg>^KlF|Oh-@d2#YSIn9Fzk&);TPyH<0uuq^roIKT1}s)zOaS_y5*ZY)At$HmQUZ?&Q%>ZLJsfCJj4F0Iv&T- zm^&t=pDmmO+%1}CupQ_Ub1_=d8oJ{x;*l+hn=C519{1YY1V_t6)scwTu=`o^C$uz9 zj24sk(1S2uM%C;{oU47&?c~nYF&)G-g=ZiRLrW*Rf`ciz=g44x1`(ZS;;4S`}A0SpPH5Y72l7q8Q5Bi@m4ymNAidM_u^2)Mbu#ol~c-MA7zy{ zR!&RYphXjfc@AA(7F)9kmAi$stqc7)59+uQxi0;)RKZ6xmT0~>bn`gg^HdVLl-10jwY2rGSOi;N0J#C#&cH9O9`ldZOkM&S0b&s z174R{h^#=;PMdz-B0d&(b^Jk=>a@`0)WWmr*&{(y<**g>c9I4+DYS;jrB5f0A z(sd8?btEhC7;h}HwcBem8rLv5eMf&lFJVq5}`_Q|?-fr@4u~(Z|^kM(F zO^MGqd~3X4`z0>tZ%bEU%8U@z8z%yRE&|%=5S8q|?f?9O=w%RpStt1xTUVzu6l#^t zQY%l&$brr2uz29bxQopMHyqezm5aSsht(!Fjjcs+xB^Tzw47_J=M$6 zHcv$(p{J4b)mPfx)_Ol%@8&A##94&x)%~LJAw3t{{S!HyHa4a`(tN9^fZQ`Ob7H&l zLwB(f>i31`i4dR<>r!foUg$yk$BjGLb4cXXf0b=Rb% z$uFN3=oV4e?$$Wvkqo#!JDt&XVe1gYRJSoMV->PFhg{^Q{uMaYVYrNly|KMSVTR`= z9g!KNAkGxMg+*^VHR*q@PNQ|JH?ZTte*D{vft{#O+*md+iz@Htb+-d#ls|0nmqoQPU zI5ZuDIghRQ)gy({V%d`UChK1G7Jk)rTx>gagFP5rHhW%pGz-==;BHV4AO1`@>!a9& ztA69dEKix1ZQgK!jiW9>){rmVKOWGXT+APgBa1>H_(&4?P{=I+xkacFUTyXY&+bM5 zdhZ_J4I~Bu#r?pLaX!ds5pj3tg9N6NJ10bD-6rrX6UuB0l;SGkoxtD<`|C^+wkU4& zULk5Bu+=t#{KjbE1rjwEN>CfAInkzTkgIf4@;E)s))PYO9y6XrRn{sdnDqjSt5-Se z8in`Rbk_rj3CwFphq^6%oWx#CLz2U%hi+1bk?soJI&?J|Rkru7wobpSCmy#||p zODT%(y#0OubAHphN8H2ekMfT$I<9MUq_vO+G%hi(YdW>_b0(ujpts=u7ua&tQ$ha6 z_}AU~@mPU9KH&GK765Flml0Er8^zOVR{fxzJZL9>t@pyQ?2>;tlL*}U)oZHU;SR&P z+G0Bowz4Q(QdzqA&~WpBZ~sixIpI6}VU-QTeGVML9fXjiAqx{3YS)onO`Fg{h`rg+ z^rfm*GT<3MgH7k<`i!{g~*WG6mzLY;T?AwN0ZFYAOdSiBnte|6r znGZYGFM`LlEu5OgZMaU3(4sv7DIJ7{fAi#U@cUJ6ka+NqU>yH3o->kn-XT+irG4+8 zql4*93V7Y<=PTegPxJ#_=pWDk$Z~yr(S`5@pz~YHipk236b1Or1;2TQ-(2rILF37X zQqT$H=i3fGv(x%7()Kj(5D;?;t2p%vK(%pPnqJu~IXslP7TCYcZpdHwAT7o7Iie1& z0rCWi5H?r+EP^HZst&*@-!LCC4^6@*-0bc4|PEa0Ix`=(XYGg>H%L#V52r|G4yp+FDI)^r+|YfZNypj^&YRZ!)>d_!oC%M0?S;}Jto|I2KZqQ)FO2iicL820qG60 z@+RkUNq4L**IR81@@h{@$liew=)j8}4Ts;FMo>r0L+DvOZaffXKBp&C+C1c3{;<4$ z;Fwjh4~$!UjJK~v+uc~ue9{jP)7i61$_uj>4Ah?ku6t_*dZI^iBdHS4@_$>pudbdP z|CkBa;S92HtTw;LV$$&q;)FcVuW>G8Q`=8w^ADL$&?V>7l(MriwkxZ;zmsI{I4mmgxkaU97DC;t+o4Ag+XuKQ30!57_drL z!}r%;4<)_@BrAo(uy6?L6gF&GbbZs-om-kJ3uF5hFYfK&a`uva?Sv~A=dQpVX8-LO z@$dEED0+5l@^(R9xNVgLK=L@>KBaU!rF*ZS2kvIj&piDU2)LWUm4@5LY#7t-(lx@M zyV7`4_rG|{s3B-nHBKbQWqZwWr`28O59N%|@>NZ(J2y2=EYvy@%Vn>abQ8>6E4s5m zubnjaTaHg8rQ)N&eva+RcIQnARR!88TEB>~g_d6j!Y17KDVw{NpL9xD(+9D)dxuLt z2*uyvYuPFG0>5Sql7ByG+%ut@f1@hnJ__CP z3mz!Y^QJ>--|jCet=m@@x;f5!o}LQb5>p9QNPeybGNxU?_QmW_>}#@JSX!%UEI(La z2-Tkql%vf#f4fK0c*I}$Q}bmpok@vtX1v)hfxVMWE@OUadIF@#g+ro|52X?ppe&Bqcxbt9Wn!J3tbsrE_43CW)pH(!ij;!8wdi3yC z;z*oVG{1lv3l_1E6(0Rcq+~-hG<`!fe#U1i6gm9mX{@wzVmmj~eNg=+5MtW2So11k z1kNY&JY1^`HEI3oO6065`AOo1{7zE^!yG3e!&C#J05;y!VW!aZft$|?ei%VwPIyU4 zou<`KXr`jS;e2c{sp!o;GT^CJf=Z5^O#bP9xeWWIIb7JVVG)zf`TBAc*!A0-1@mR0 zHa;L+QUHb#ke26q|CvWe_#@7GXj{Vc|q^1#! zz8qxj-5O}qF+Vyiqc871nk0VrWXJY8|8nx}7Li|v`?)l%*-}Vz^;9X7_xeUwNu7?j zf6;I`U+YV@TJ1OYlE^gRclXeL$@)-(8RDkP*k5}!3IQraRS^L2Dt^ysi41Ub<09$0 z-sFGZC&kc*<8*Qpw;Bl9vL@lVP5k9;S5^f3kFKM)Yi=3Q!|SUF(^w@yj!oG9Q`JV# zaGagIl_Y!qYmvrwx}D&&kos+%$B3niR} z+B7}#7B9b7Q18q8T)kjZKS1Z`(18M6e8ew*2qmy&5zm>BEBcrXeK29C=+jT~l!`-x zO3h^|5_`T7 zKn^}{a} z5g)+Eo?}*FbDv@@C9W0;14iErXkRP-keTzUGjsA~-{db?uRn)ewy~W8gKY#!DE6@NW{@xee2MR@0xpPsVnhaKi4DsjjDsBrLC$gU%Osu$2fFZJ82kN3_sD?xoS0WwPk zks@7x7S4ku2IHo9-&r8=@Y>5I!Vk)-Ponx@i2^i4-}cR%!nI!2X`?epiUN>GzgUSf zP& z;NbcXiqp7h-_Fn+7eKS)pgRN{G=JF_-rnIp6iv1n6vf5`9r6d2RNWDNX{Z?xy}=yF zC#VU0Shrt1E(eMX@b>aS`jrfj_7+H6GGIDr^B2POPnj?!vpEefjS$rmI9*=u{!>m2 z?o2p76^VZ4&tdNQq8&_D{X=^N-Vq;Y|GMUjnlVgw#zR4X2Mxu{4ZQUMw|)nUvUx-^ ze}KRIfASI{jBmYn2bY1i*l4}W4hfi6D^(pxy2B4g-^ZGNv93;Ibn6Sj@&ZGh>3x5X zW6hbK_@jl8lp^xTH{iZY_Hrmb7H;{KUlUlv4SyUtvElG#VGUB%Uh#deLU?#sLCQxnsX^eJ+#1+H~# z9hJK0*sgOz^?#)8VEcyRAbp?=KxnVZ1XFIyG)q9(F-W%hncPWRslov+5mv-%Hf1FfE`ox!c4ae>M zLsAFT#)mw61V2{d!3t>c5uc1h^4R`r=(9?!S;+`nenqPfJ)1Hw!`PP#zb{MYba5Ev zoF<%&CVY6P(}YaV-F<#`YM2}D3#NCvhIy)nsa#N6@SZ<~@WvCyVv+~S|2x=cG?{jZ zU#A?84E_%-O=@Bt;}291tDRB-xsqkBnu*>6)`rO1zRj{FGV3^;y>1FDgLX!j*53#egl%Dn+VSE<33C#T47oHy;{6!{r= z75^KY3D(4Ooq*}!x7fjtK?U}UMqU6Xy_7x5H-2Z3UWR0q&kXb8}n;LFV5i^+FyyM3-M2|kwvpRGscN0$cl=dY(f z9V2QV(%RWR{^KY2eXFZZK8h0MAd%>T#R zn}AnUUH$(F5Q#{*Q9+}C2927i)u5oc0-9Kmd*McdL!}O{IMm|!Mo1u5j6lM0jYnfA zt=N`MYFpb{=c$?i%HTi(77$dx@!Ve9GB_}_Uu|}OfH_-i&ZljBsQm#Z;^f$C)84D= zPG?E(FweYw%wF!1yW14%w*fMj(^t#_tv83a;XgP61J$MW6`*)+&RM1|h+em`j<9<7 z4LHYZ{dWfa*UOhbjVtnbqXalZXY@TXC(b+n&3##)&+8v3@#JFebCh@k_Ycv1E02bb zspbBG&*Egyd0zkUYU~7wD8Cesadfao(Rcl2$~stV-}>c#OasKsG`J(N0!7?g#R$n) zZcBOPAn%oz%quK>nmw-%NWM0HE?kjle4)P7h%96L8Iy%PC*h@O&kQm$kV4%WpiYlB zOV?^X;J}8&owt-+&y3Ed1-qWnLc`0I{OL9T2q*8+lva#<9-L_DUbS==Eoo(I{<#8__@5Rnr6*Rm zgAL9Kj=a>YZh-llKvpm(rgeb)eZYrwxY|Eaka|js?Vl59w9gHjZi71Cmoip!{S zR*pwJ?6!K?og(@FGaCQ<5@9!@>$BWjwdtvrkNLie#I+M!5@FWl~XU zD=mpua=8tEonQsh&L7j}0D+nmM&JF0FN}s}hwmlE=QFcAJkj#Q8urg=*q21^52&J& zE`|P3kRpZ7J|s;FJ;nOz9`%96XQ~uBS3q9(lJJ?3Lcu$Q&vSc_Lf7=mirBnVz#D$x zBld4W=mwuS@H~{ibRo@3FaHBngL_X0 zn`9r~ZXdI9m5YjtEe1xIhjod`UZHQH8t>adJdPig0hwLjyFn)e-Xps~II*p-qplc` zZH@ma(K$ZrNJ*)E{EU74LF`K0XNJ(-W&3&b9XsPI6FgJ$<8(aCzsiquhCZ}66)DJX z`sR4tlYNoyu1e^htoN15&R@(pLd(xK=`Bf|;H+byi)qgNl9QXYvRq`A4etZ*?6#0Y z@|F9!_N7AsxKj+?t)46W<5I7?T0N;qPL~f4ee_Zv-}Cx-3}6&{JDFXL$ELirdQa-O z+-rDU^8=T@WiHQbM%S7V#%2XTA_ zU%024Llgb6psD_qWz*0P@xOZHzRm}VPU3Ky*XC-q9icm*e^MdiHo{c_5hw5WKlH}! zmfY$jJ zSZEUfL9+5sJxq^I^!T{r_gJbPk2XEtMvwA~K1H%Z{AE+8qTO9cZWC~)1x-Xn#qOKA z00VCGMF-|nC_=%a`kp9M@^6dvkNj2hHs{mDhA|#ByG}y*NABlu>_o{8@r!Yrc!o6R z|KS464>&PBbVh!5pzMRuhftG-8@J~{DDhKCGkGE3eB9~&?P-y%*N8K68Sl#-&E#6k zyv6nt+*|*!JD0*x{(X1Q$0>i1kpfA|4auNuBw;O3>q6~+Ig2FhP$#9$E|jcf8@_EA z9}0A1wh69xry?>9sZI7D3thFsG_B3T1Ah*01PWIe>f$928FQ8`W*kdHS8oa-lp|I? z-L^GTGyFmC6wUB%99b#$>7rqX?EJT_FmDhMOo8l9{~i;5{*%nVB_0{4N6m&%sc$_| z_juFVrdDbeoSS2{Lh~n+VRTH+|D~OfV-uU*t6F?|+Mwpw7DK_-&EDW%OTt9__lAT3 zq0kzo_jYM=Af5#6u)f4L^+Y+=M78owd$7fJ1xKAA^{a<^qVN%454WCT9mua|B2|k9wf_w;t72vYy3UwyymeT(Q?w{wjGhey@lCN$NC9QH87Wkk(ti&UbR6UdP`4aJe* z^6BFt>baxMeis#^edc~pfy9MjCloi08GpM5eE=ue@xd&@EFhkX+c5;`74^#!+D^<~ z-y${y9TiiMr)k#|4hg?YGz7|O3B@~;Oens?ef%4k3kEdzI0I={-7$*)PN{#(_U$QD z%=W`(d%Q;3WVX{3d|Wq5I?5+pOfE-_aL+$lB%HkaTP^Nu+yM)H+&6R2=m)nAwf5)q zdzg&7ALBXpr~Iod3i+4&_UDiPVds-JMG;Qk*hHJpFYwze=bn24?U_-uTKRHmr^$J+ z`|SC6EQtr8Cgd);2)d7yjBVO|SzX_z-AC20w5C?ATWUYSqwT$VAFsxLlZl0&t=mOH z@oj@iK4O2$+0q3P2>J7LgOGK)q@u!Mlu`_8+};VWZ`H`_h8VrbV9hMlc~>P~-7w!D z;kkM>%&Ta0(`*;hGrKt6|IUtoQR3qR^>KgOkMystdpydHo!+yIvhqpiGiJsI3G9i! z_pbKvYtGELdIbd4!J@YROfMphS}^HlZsg4*iEGkIn|pLLKYwcAOFa3teX>6SVEGcv z5ZNmuF$_%3NM-kwnnae-@HQoA@tPkv6xp$Cd+=TA!?#j2^}h;VU730*GL;wh??|K$ z+x#g%4b%SB3d!Dk7x;hlcb3Avs)Pk+_!R!aZcE|CqVQ5)zsj+sQtWPMPRu{|-0`x+L-S1BtH-_4NUK-KswFEq!d-~pGcGSyuMNg4ZRQ{7Es9IT&do|sd-_d7<+tz>>B z>h3!|A?jZLoKoy&76`XkvU1e~}#DC~%$}PPbnX&fl!y6{{j21KFb@heS@%N4=W# z-WA<=in;%ycY;x~sTYgtJlVTlWUhCaN@T1O#vcI0&z%Is*gP0!zn4%Y1%KXQMB=2_ zs%V)ub2hI>i)oowIA`C{v4)!i3qE4OHuOJd-;pn@{(4}+g}gXtUt8myrv~Q#j@j_@ zbLQ;(^YUqx^~a!{Z(np6Cd!Wb16yfWFva@qJZD2=tMZVqBdUd@BpFjG>&Sxy{XN1vXA&rW@`q7t0MfX=mA{ zB>bhBZ56AnpBt0HwiWFad(>;^W<^f7`z}&9%g_!^0Vf1JLp*riQ|Or1 z)|n9U$VZ>=0Y7F;1B}h&kICToEo?7+|3ki?v#;TlL&Eh{0P`Wh`16|`pt&E3T@$#D zwRjCxn}&py`txXL(Y+R+QQ1a?eA4;DI|7%q`AzK%9N3G$+qs_I2l^Y~HT#8BP~iL< z*TnAhYr)^QFQ5FpPv5&fd2nH1!6VE?lD?;P{^L9KoU}2rv(-Yv-l}x`&gOmhVBqj! z!1x1(11IFu|C2=D)$a`YowH9J82pTV`z!EMs0Oe4FxlX>OxO)xLtpa-a*PH7{BP{} z;XP*lx6`EfFFU#qPHE1}zt`M*hOvbNL)Rxh+r#`<3Z?;@lQ7YU_~R{A#?$=Mj;@Mc zrQvth;a9H^?a&OWtTe5bN02*xZ}h63ux}fwb{wdoo?p$MNc$b zfd###HX(vmBXHbX3K2oCSkV((K>MQqIs3L0Jhii)64N6O++dsTCN2c2J3U480O#$t zoz{5OoPBQw*8PLcN6yIAj%|TRLK+3SU;J6Py2}8!FgI3dKQ{HRB;4<&1F9bf{(BVF zk5A`p>;e308grx>z=4Uc6(LR7S6|B!ui-PC6e29K6XcIyim0!RNJDj_oJ2iM>))B*3IpEs_d zpDWc*1_gY!Ruqu(m0U3%aJ#4+9y`$jR~T3@L^x~OJz&PA2}FExhL4C(uTMpU&ezI< zisJ~a`K_mQ>i+c-x@wn%^5Am^o8pz0T;1PeI47RuN+L0rMh9Uo7i*G)*ue8!_n$_2 z=0R5gmdH-C9WT!8(Z~;XlmQqo@Ox~FMN8YJt;i4BM&St4sKteu#n*{DWHw|vbugE9Z?l0%e-s7geV8&L4qq(lK=cp;Q8*LkLTv= z5_kp$kEthP2e(WLX_tt9;3D`Z!;2FaZ>Jd_a~=eNBgfLsCd~y+tT0VnCd-37NlLT$ zwGYN(Os~5|y(ux5!*w$uwZlL4f`5=27u&05T55{K3C_@KhiU@uGKwY%MpEj44$nR& zil>&&Ste~2M?k@IS0gimdB5ROH`>HN$^|sA+3SNP75dxBd*lwO&<~p1?%@^mJ3j2+K=Vs{V(0Zq zJJ^p$YOvnX;T>I_&kZ!=5CfU{oOl*v9M)#%bBlTQV99Jqr-Xsl-V4O!r4xD+J!Ke`2I+$K9K6MoO@khqcif!T}LQ>Qtri1_A}AHqrK<}i{Cc)cRwb-%35!{-^}|uW@JNfPyJ)Q z^l`&0l0uyG<6lqy<(?#EEBf}!mFiF4K~L^~10TAtpP(4$#(qKoBy{!0kRwmy{VOs( z-;e+0h@|JcYX^TMQ}CY62lvN#xOYuQUa1u)@7(Wzq3e`U2<{h}XNq;4_HE%lq?`5w z;r{whvf};#rq9Pc_;YWY=A(bR8vnF!0{veLxI;Y*9@)}B#) z_JgUYK8z21R6p+HP5p0rH3h#nzn1bxyA%?TU2MjgM0N}#&00iOA;c2OjeU*e8xP?T z_qgSm2(OBzAbi30G=z^Q;n#igB}?qvOlMy0GAHld25_=VDT?5>)jSizU-?!7;r0U| zeD_CL5&pofNrbxvxA@p@;`n=LTJTKw5`uhjIuk$0{D`)X@lQi?DPZ8QTqW9w8MEUg@OsN?x)Uz2L zSpb6)oQDFUdjhV(RCzpt)ju%zFr(xvgQ$$^E337uqkT64_|A~ihmg%)_xP*#bd6D+ zky&}eSGFptXV52q(*E3$E*FlGjnS&fLy7N4 zO(+xc%A0l_Q$IzkJif{ihbO)YZVxn{Y2dTE3Q1!oO<<>j$9|5$&P0;6)8|NX4rJfC zw_UY|s1@at8_i(xgxWoGBB=`9j0h1 z9?DvsZX)>&WX@rT^On(f5{)j==HimTg5KOQ>$CnocG}ulT%UvLnv@2NO3`hvZ9`&L zqE{Rw*<(w=m`k9zmO*Fgf<6irOIvdCKCg%19kfgLhMRm2-O4@We=qUpHg_$2*~*)* z)j`A`D`Sv2)p5d!Q*h;r#;MA$&$mhjn1-crIe8Bz8a^n|@IvmnO|;9bv5!Y{#n7R9 z@-`@DwmC5&YoQtTN9=XKm_o&hNXdyDpH>z4L0e*4S;}S$1mzQnIcR8|eB%79u(qp=j&F4im+&wO5&qo!?*|9UKr{e!(hiB8+%I0XpE z7!A~8EJLH{sdfMWjBTy2g3B9^mk6k|q_yZNO+3nDY%lZ+M0HPTPwHc_^CA0dTgNHy zO9=_~?VG%}IsRv5eJS*1$KMyW+F=ki=(gt#ug&5zd?ohFAI)vjisOZlr+cE`9rm{9 z-+r$>`LN)~GtI|i&N3gz2WN6=srKSO7e7|#>;-q<9v|D%=kBo#WuOo|~u?GL<2 z7sk(g9spE9$kNinZ zJlpk!Y45RH_~W(j+V+kWUY&yZPx$R^d@rNDIf?eZyv}d$Cbc(}_AoOH|GSHx@aEs2 zi8Y#uK~Fwwrtv8*(DAXRt}XI%4f1jg^;etMdhsXC$P=+U_={q%q2SKjx3r9Y0B+;# zC=p(crew&><+>a(?Vb2D!i!rA5WUmKasT6H946Anx>?Xab2Lvdc#EB~#AtphggmfM zqv>$J+e;y<4);#3ts?Mz32cZ?8yYTp*ISviW)+Iwi(*%@<;I-Pvcd*W3gz{h^Qkdz zqK|spR_rxVP3%$6x#VquqTHZ0v6@TT7_8Q@73TV6$ri4Z0YeU^6&_OomKTj`$rjfx z+&mF1I%%2_R9Vij@XBF3-c9~~#A_%w;#8rOqgF5ru)768g)%0~U^V?>V_SH3h@u5T zB)BASk1M-bNo@a=69<79%3M4nX7S|sn5FInZ9bUS)_9Pl9_Kij9HlmzinrK1bfV4> zCw)%m{0FUFGt>cPHT44K?~dDX3i^9EhHtXIqv$qjNUc%LL^T$U*3^jqIr<f%t*lvdHz0mgG9*GCj!N8);4qP#7^6?*-SUU02r~4YEc{7gmSv znip6E%?%zWJj_~pn{B?v_sx5emh&k-dOl?uFDZ@mzNDr)xUsQMBzg%qOij@T4O$c5 zBc}s*N44_LZ{XiBwdaL;&BBD1{)bFxnRQ4$h75FhzHy+dXaVVo%mKsosHUZcLDuj$ zqm3PH7GnEE`s*lT`uK0^ja=SH^e?UQE>(^9Cp;9aE2*3{!jc~Am&hm7(yOb(E)bA^ zgYZ1t-1ew^&N30biD^b|f~CH#FxUcaIfbJ8$HV0bav{&36S)UEwqRi(Wck!NBZ2JOx;Z9!e8E{6x_H zh#uJA#_^c$nx?W_nmBo(~qH9i8m)aIVul22y;_*B=~y}K*^jP#uk zl=s9jjZXhXRZVRwAl^3784`L{(20Xa!LTzzVzNWwvGQpr@NaPDF%hT5J6x}s7a_Pg zyG`ZrCuvjs6KJjcXNcupz~A`%oiP*mL44>1#p*fVgvQ*H zy|#whwj%%Sw{@m%t81d#a=+oX^(B9sLnHsj5BC-m_4g}%xIbs0=udJrWgD1x&*1MS z##Su+70I?L3h5XR8J6YbX9Oqa6EK9*OO5>knMhua`*^1k8dye@&eEbpw@dg=6)$!A zXz=Vp492#2KjL4zcXp|ck*1)CDJVvm`D?40|39bBzd40C640MHrU*&(gB;E9ghaS zZ)M^SbW8+=wfW%hV1jQ+KrL+N>@w&ZCI%{P;ZS4&6`WYe;R^y0=-jV=-ZS3ZSK02X zZ|MVdBsMcUY{H{~uOk#EqPL{hP2#A)_T~9&w1T+b3&*HeKlDWHw8xFCoumADGO=!nKXGE zQBo8sdzAxV>JL{r`$0PKCLe5|liBQ+S1XHiTJ1<`3OTDT%#P`@RpjK~F)WnJ0q&KY zfAe-=?h^>*kU1A+g&>9wO%*4v_CqCYvsIyKZ)M=_fO)g7gcFokg*#*6vh9)JYj=Eu zyi+i=J23Z3o`*T9WnFxEabYTq($h0E5U^l?gS_{)vq z_B|AHk-YFoR+nE;C$?$>ju}E))A*cVT zoL@QZVtK12WRiG7KREF4oaZV5!u{(FA_b%Tn2spfw|sn|9yN{Wn3U4lHFRc$j>Wb+ zUDA=&>$gTq7JN7s&AMgiN4lhzK)P#(R@+@}vw5A<*jBkgep<>h27wzkb)XW=_dK>s z3PEN3wDk230773#tQ%R`kg-VH%StLlJ|Z-O0J7!Ec7X0X21lGe1N{6CvW;!|&`7j0 zKVBx?w9ANu!9Du6@vW(rHDw1Yk(KLae%-bm3Pd`?)C-5G+xIbr z+b1}E0-@kio#}cZ;+aVF4g17A=8r_-*RmER`!^S0_vmb|2=*VH_nIuHT+DJ-t|@ZnebT}e)jI{jvseFidZG( zw>2ksq+rFzj<0`QBe9U-A2#-kQ7lo?L`j%+I9#y}m?jqD7jh74E( zIsyv@sIjOj0&2g{fuZ28zyjlZfuf47s@rl-QK*b))9%C>Z$=iIxGp+xRab{kpT>Up zfyf)NLLc9tNojAn%R|9E(`JUEjr1e6Ah!drz#-?rZo#2_xzuy`kv1j42N1Mb$Tt{4 z(&?6NH|x=H!ceJTPYSNdrZ(;&$SVnm5Ohf?VZG+pNcL`#YdCj@a9nUem0|S$x}-At zFQ`SMl*C1Pjk>TGaLuG+=_i-I(S54Eot!GOzDAfEm`AD?yv;u#(*618U!Z@0AG-~$ z5Lk;8roO(?0CWQv+E0Ti08FiJ>~%EMhdmOo{84S^zgB(t{%_3vgj<2kb_}+YjjtfY zWcXSB&Y)|G5HXO0dCqQv5u-w#TX9cuCd78}FN<5?u2q^p&xbDUyj&B~FcbGSG(|d2 z-VYBr95)VCsH3ahRo|8fHZM^j1UXEcXklL&9DBJg0yUw=VU2f?$ zO8lR@#TqDCUsTg9GroVv3ar}Kx=pneSTmFJo#agW%g&EU2TIo;EM4O&utHwaxZIu- zU0H;h5Gh+?{Ac8V-68MgRn^*BXu`jM1}-mD{nCl(AH+ZXqZY%%c1>_NI?x=U!RboS zPnA5AybEXFajmAMB9sgBvUl)Y+diIteArCWwyfFXlutVu=GHk@_R zs+#uX&I+(eF*g+4H|<=`G0P_>2V@m5Bpcdf_q#e0%PX>LqEd)6i}+yY^aB?T;p}!> zDcoa5gGcx6zXG5N|L$mONp7e6B(R_?< z5Miy)4PgLF{xtRh*Qt3yX-QIZgwXHMG z<)q(Jbf9pwwn%U!%iY^a%8sj+p-ay)M7oTNMT6c3S#^T+(e^7OPtH zcGP?}Cf5h%FXp{-0#EnvRW*C}?CD2^wSzZWBe-(MMpqabQz84L*&)P~N}Y;+8T#@) zDOIKtdY@AwGG$E8`{CoHealSFy`*U2CBwhl-n5HXaLe6ompWtwish)z_Z(qoF4H^Dye< z&HN_LiSK^LIyxo@mrlXtFRXI{=cJSOlUMO|ARzoXK)AX`B>-#42ADTLvm1(Y>JC${ z&<1jAWnC_If0to-h^JG;gOF7CP}(lX*0T-#>x zL9VEere%|ty5E_={3>(Hzhm_sTys*&!_YxlyR13NYY}LU3|pc5p-AouF-wE|*$WLw zRP!ewZB%$~*{d{qoO^45gd-6t{8?T&E_a(zi^RXd_UU)qI*u$aJ_znBF`qy(7P+MJ z&7HF>JO64Gv7R^DkLi4dRDqZA+v4A32WIU5Cl<{2Hvc3r*SMG&9a9w1#F(dJ$)xW3 zC&iKL`!WmbK?C_JIrzS(6*~9j6svv;=T011m^1S{f*>P!4(0LVg+2yjZ_~cJNcH?V z(1f zx-ov3hcZpOm{`XhzGmrU-loQ>oQJ~6(@SR5iob-hvAw%8QC8?)Wq1UvfD#asi4`?h ztXaWQe_OigGkbcz)|X%KsfpT`ntv-qe;UG6SiW|twsN$&d5UhG({f>R z>A1jeSDh2(2ca*|zFF5ez>jjxp0*limrACTngjUst3tmf-_a{R$TgrOnx+5?{bMQB z9YVdJqORz=w!h?Y3~$SY-wy?Tv18iiBowOE!h8Lo`rciY73=E$mhueF$>kzX=-aJ& zxD}OnV4!Nw9>di8RXg9zjdRXA<*DS(RoRi1?q|1Xu%=sCqYTmZJr?>OB2iLWg^|Mf zs{C!C7)M>vAGgNmn4&LlyKA@fK$J#fao>93tC0D0I#G6`&+{#Qfmg0q@LMd@mP>y3 zRyZ9Y7NJ^4p-yX>elU^VZ!HYwZ~)YZa*mCye>Z-b5nyj7SL{&k3M0R^6Uh5@pqTtr zl0k&IV#v0XW1aJkrUlZqRrcsLwg0V%Gg0Tw2j)L#DE{dSdy_$z!@q2qywg-JU|X=%=I7IG)Ugb)PM_{P}Kk)Ec|3$Eh*1Wa)pbjlc9H zKjQs4nU|i?kgKCEY!GOEjTtrT5B{rWQ*u{qVvc?l!Jw63zN5bhy+b2TxGSlGS2bn5^8ro)Yb%6cUs13cQ>78!NF?=Bz+Ae>Z5Fffn#0?bg%LshtNY&yatyON+LqeEQ1-)L_}+` z6KTs-EOtPBhJj3)u=#W z;|NxOz}SV6lC$`6F-OW@STaV^wTy(}2TNwtUc|YY!=|s{^q4i{hW|CT-ehj|NwIG= ziOgi3&QoH+bRS=t#n34awRj_(vrGeD>i2tQqTkWk`$dtYUoU^t*V5A4swe7%QomjC zw$ENMKL0}#hFSWnn)viPS?zV#S(RlF%y0U)-CJWcvr5j4ME_D9ePdj7cLXkR#wdOg zMikGV!!MEh6kZ!$IId!Kpm_zzko<`Rw^9*K&zUF38DUsmHz+7#&ix4PYFhV~dqFR}H_-6?UM}}eQVdrpSYzGr7{v5na6C0Sfkv6)6 zt#ZNt8usi^!@0H9PIYc|^q=AOu0G+W<$bDys{{9xBU=*rZPme#0?rZK(Q4SWQn7Pu zc87<(5iVOB$#ui51JYo2JVS=VytdnWB0;SQ4J3Rs0hLTZIz>sXVI&zhvy(lzQGZ8m zFl(%St|td765XW?w21$6tDEb;u+@Ewnm&aRecb43yz(uT z`S_V<^&Z}~G*p(JM@8;deipZUq6v%Nr!0Qc>@R8E3P1#F@*AfS1i{@a6DloQb}jbj zl4&>h9O-Js(y2RA^Hi>RLZ8{7^u&iY*@2?I=q91AZs9GGe`X(JLP&GCSjEya-fZA& zE=TBPMW`G4U3N6a0^Qt;uct>|QichED!QrYc;nC+Be69PF^SzZMI_>SF~CBMN#zU- zU8j8jEd}ejSV+AmsNRFgM)HGQ39Ki72>&y#%z(n2U9IzLe{vRqo#&?5z|KjUB&T5Z zuTug$uRNL-*zsqHW2yb1ln;qQJ|{owAtt`ihrrJNT08&6vcHQ$j{afljs3>-2kxG) z=h2$tWPH#><4 z;^GfB8G-vH89bIc+~9A$QD>WfJN}>9@k51)91+by<3$X(n4s6~nv4U_WHL^?!cN9$ zec=?Wc_U>qDt?M^hzg zw(zg9@WW&BEi!*_vhjM#;hDe~%xtnIA=QRL9C3G~gtM(jGB8)7QtV0?gq?60AE7d` zuakL3dm_1r$ghiE<@+aBExMX?Bh6N^avZ3er4Wm99D*Hn1Ie%1R6hU?`D~cskk8FU z@HHvLlKp+3P_o7uTCj*rg~wJY<)?#2-Cw=wPhZknbZdXzjjvl{dou*0PuSko;%9gF z`E~NDMk_!3(#tLW5496|DF+sY%-;L!e+}}<4`vZi zqacoe*Vbvat^Ho|+d9Iwb);!)MXBG`p=zr?zM=vAa3|T8exsINxy(X!j%{i4I=`j2 z9x+gTG+0nICR%!zzfDVT@x$$FBL9B4*R6PDcUNp@c05^*rgCZz`M0beh5vf}=q-gW zBfe+?Y=z{{P*x987#vd;Q`4AL$9Y+xIg|{FE_W~G#3?NeQ$%$&h#k_iM)VWuu{bmk z<Z`7(g1aU?o{w7p9yYSj`ZhGccTDgv7h2g{Yq$;2&I#^KU=PCF!aWt(zBMHf5?7Mb7{IytX(r=>2ruw{j~GFNme%cm-3qXMS^YMPnEcu z#@u;qI{pT~D*Tc3N4K?e_Ra>$fhPT{)Cs#>gGK7&sxEFdP+$KMPygBz48U?SAy|9Q#eHO8CgjbtXv6Hd5DbUZ_ve2g&W4T){J%n)I%M2ezw#uS5r-mPU(eVr$7Fr zH>cr1nNXO47Sfm&C}&CT(suTj@LP>c*F7iiuJ;X1{rG_rJOA#YSA4<}UAZ^@lGo@W zU&I7_u@^ENVp-+if54x|m!#9z3!JF*AM@vaA0+s5l$lNOE)ahOe}2zoZTG;RKR8-I zW#`W`G>uvLvvRA!<)k0MpBFCk(U{~<={N4+Uw8;jvS)00QdSx&{{O9CKPrCgo?mXH zo%HMLSfq-sHs^O~j-4mf{>?kwqU!gx2TK!o`V@7}OJOyNbdVxhY{48X@`)UfZcl|UC*-_RH55hE< zwDiuSE$g3H3b?0ff zYE43KUN6smahPT0%gx&O6B@QhIiIq8wZ3WTIp-N$XsozZIy3Qft1~n49d!r$Ds%fG zhUk}=ONz>T-8)9C-HFPK{(0NWp3=PAtwmI4vaUPoC*8O<);GzpcK#M-(cg>;B_&QP zt^55FOGZqLD`xdJCV;jiND6M-BCDK|K8n*6Bq)gl$pIpPdCylKqYLm@%Vx7aTn9XLFm z=k6pMz$A7B=GB0n@ba<4^NGozaTV!JD%v@NUcc`M`WZMpb`o#!_lx}PKF^1-p}H~e zi^gH$_APxTL@&!x_k8=#5PiGfgy_H=`nX3K2T?*mCZg-cEKqj--W6K9)xQo2rDP>^)r|`^b>-Gk$6D(XR+KOHk;N@m|LMKVoS+3%@PD;=G3@=c-@VS60qb; z4%G57C6v2MuazoO@(&adVJR<8^x3-9eE{TSBE@i+=bv2E4Lx>Mdf(v4;%A%HuWQ8L zXq);65(TmdX%OJ&YT>88zcAul&=p&x*MocOhF;qWtveUv+lyb5h*r7SnnCDwv+!mJg!4sChv*nhIm||G zX_B418_`tJbYhYw?e}{D-Mn7J zTI>UrIJ0?ra4hqWA<}r6BuSC-vy#Wgot>+b$ve?cCJGmRBlcr+UYuMr$Or`JUL1bk z*DhJ2Hg~Gmq6FCJpUH{0a92gQRkr;tj|`$OkR4Ad<**&G^`ue`QOp|Qj1m2mC^qfS z{FyD;FmO)}EJ|t}0)$Hq7f%1coAMsf=TEt(xS;d7Z+<^@;zdskg$J=g zJxsqh|CgKfY1wS8PYqh1mmbPEA zB!C0gV7JpfO?zy?uD3!pKx?y8G27D(sKKVwc))0t92$6fxSi*hZ8u+Py+D15`DrqX zAs~^i&A8bZKUz^xla52Z8cRGcme`j_&+^B&sc}LmxN+Jy%mU($Jp@$)aZ-#}NQ8TB zVuU-@+cH~f)ejN}7}_Flx_TVS+iu4*njIe$j}$?YwgI7ZH=d~6ybASN?k*c-_1$u^ zxLBNqkTbRHU-e+}@ou1#3=*yINwmTv(Ssq;18w}<5Gq-*hEQ!TtVlMbtXTP<0{3Wh zV~E^DQR_-+-=fz1=-Na!?Bu{NHYTXG$KiLUR;xb^{%#K>dzEo4S^3o8>Q9qJpEaUS zG%2%xhcmG7PzIVEO*tewL+Mhp^#=PMclbsz9SX`Q=h?Ibb_@fLPk1=oJo)cZdvUU^mAC_6SQQWveSyY8pPe? zrN&~kdbYihvE`v7?99r`2|Jfym9Y34Tcv`t!jNYH=LItWsj#9z4W-g3Gdl%CtvI^D zJsN{k@(!e1grr z6?JZiP(}AXP#8-TZB&CNH+A6j> zH?UPA(xy|>1f%Bz{Ht|EsIVjOgVvaq@q>;oiWit1pf9l>2h(l{G)Uxnm?B&6TTgN~ z+NtMHNk3^*8cYp0-4_07&8Az(WpDiLA5W}eFZFim5RQKMPDEt z1qye?8s(1WpjaLsajK*%_s<`@|Eh>H=<3UZIi%(G@5iBc;V(NQxI1#cgbpIC-jw9% zRAMOymwLIQ%%oB>oV*j?ke`|Sr?=gzGWnThY62GKD%%1$NAm-8vWMwY_$Y>yaG7b5 zc(ZYcoH6|(PC@K4({mrv?It8s86KP`YKH-Ys1^Fn=h` zO55+JbmD$WC+;6{CXpYtv^v@m?+B3`wO~7MhRN)ufJllfXLZCWIRo`Q(DbUIpjSje z=O)d}`T@qwJU3cGRHZt)#hpjOMYVG_`pvXz=W=L#dF&>srNMoTqoz#?mF=U-gts9w zH0;Yz?j9PSev)l9;v26=+EzW|b&Zk}EJsvAiF#M}lam7HQLJ<>6Xl+H)W zM?%^Z(3PU2IiEJ@5`DC!R#(TnvLLmZ`&5HA*XEMh=DCS|+*q|~&7SF;YEt0<7u6_-U z+dt_Oj*bZ8@CoL#Kt}hZq8Lj*Z}dv>JAvxA-AQZ@l>iU1h!Q}O%+_3>lc@a&*cOhc zhIzPDf)Ssh$5^K508 zovCbKluPP|?d`#E^UMt8N4Ht#D9!*OpW`<3jY8zLFlU(>w(BmqGp%~}su6PG_N{%+ZMiHzKa%@i zHBL}Ow2Sg;>jIh|%9Cx4I946hG)jFWe}MWISM?Fd50-RrN2~u-@y-;fm>bL;4`@_o zrTs>{s)$NZe2l-VqwiGX9U+7LZqy{ra0`W^K;zvx4 zJ6hdSu}AD0Tg6lK>u!2lv*I0rtA#`wkj?ou?v?M`gmXSwOy_!2Fp9Sg>@e3Ne zw$&CMiUUdd^)NxkRive;HPZ4+gAoen)di}9uh$)9<|lS4PD&qJdPiMPbVeK{$-^cC zTLCgc%Zqss4t_p8sI2oEVWC_y1#=_s;^jiX-bi$7B>HzZ3L3=2a6XTvnXtu;Di?1k z#hMRodDDqbpX1D~k4|?3DuNc$$vRivA9{`c5c&;+>B`@NL4TW}9Y>(+Ar`+4wJP$Xu(RRwmxJdA`MJPNN zp?ok{{l16QHFXC?99!a&lAv`%V{*1d9Q!x|>>@}14Wp}S(@3rK6f|9iC8+jKkVU<}nb-{-v>?!1_RUs+2R{ zGAQ=(%~F#c->t2}xS&@q#=wZvY=;tDQg_3y}EU!+-y&|N~}m?2joJ@NQgWr>#?`E9GSzn4;-9qur4&s6%|>DKhd z=9Y_Nkai`80@@!oHi&|A0BTsg&fJXOL^QEqXnDI-v-l;gO}p>7qpvO6T|H-a7h8b% zlLb2`e&$$bPEKi;cJAu-%>Dh3j^RCAWV{EKa^i>RPvXISp99Jq`BF{WW>e;C2nZ{N ztI-({5SBlxgPjNnos5`}(%yRIzu^nHh%=!Np9b#wiJ6hhqz_q%C0Q-;SRMVSy6hbU z`m6$B8icMgHPt1Xr)ZhFKIDWk<4`^!khU{4l%k3|Ws03{-3eYFdjmLpbN{}d`;@G=%NBmR&BbDsk5X$b3oZL3gK5L>{L zgbekB3PO_jQ=O>I7m`VN!qOt)>g2uHW(F+tb30>}HpzY#U#cK^*<=zyHIP(6IFce_ zdBOcUDwJeJgM^wd#1Plng(NE-IuBFeNk{jZjq)b2gjzk<>2rF5xV3@dk1P%*=#||0 zxkBTx zYGGE{Wr@YWpG>mN%8?#pnZsQ#Ne9Q$c-8&dVCWWJ5#@^#7n>_NWlJG4-c>@`i>6Ud zLKb|nza!h3Z+~81-+-v!Br5_~&DS13Nnw9ht$9i({Z{_TECrM5mH)H&i!S#(B~Lkd zrS^W1`|QuvgQt}Qa5VS1^$(o~OMa@_DAX+iLise4xiYwG8%1yOvO!Bm z=P>!xvAsx_beDhHUs@kJtbV>qQgY6x7ByZWdh~NcyP(PpPNz}5ulc`gp^>SpP{}cx zkm4(pq4uNjm%C6=1M@E6saZV47l~D*RSUiDhz)er{xyWtL8dJes`b5h_V6#CAS4AB z^FEt&tIOK8&FpTo=Zpz1M@9{tWPEa46&hqCCnS~}M7XkVn<40Vc)fu;8;8Hv(H?1+3q6dmb! zwaBAh@|aL`?Py1ia0wKL9pvvOi%uB+<%D_Fp<%iTr8x1h}q(yI~(J76n z&<(a7vM&CF)-nlA!bEQ*RMAuod9gnA@QyMWXd1}cE{Xy{o&#BC+8;T3SeYZ}%O4-2 zDbNcr+f)zlNXyFD+lYp68M4@e)oeG*1)>Dh(t;@=VBx|3UWIgfL!kNOLWWKc&*%VKe(wHMMO)JwOSSA{+>#)dd35&tu;;eHt$YpqTcI zG(!)V%_GUt2Q=1@&NLd&fdBHe$HsC!5??r&aibCFWe;{^Nzx)P=o1}Ein-_O9Ck3V zvn3q# zcDax5u!tg&n)FTM=rs#@C7Xpzv*w=DK>6FfbvH6#pRkl9b6li|x z(u_=yVm}i^Nwa4C^fQ(YG>IS`ULr`b(myJd2vV+JHIzp?Jt?HD1K$0atTs=@knchI zwHuL=1k2g(y~1b|P>b~LimqylQ9x~FOXRM~z%M$dy-%o-!f6;N_5jPK4{}4f8#G%C zcVOV@{LBx`?)S8Y_csk!bk_a-tJ>;QQCPP%1*mk&lO9~`e*eF_O_On_#x8|w(P}#{^7ra=M!)40nbll$Fs%nivm5P{(^}T&rLm8~%(uLzWX0GKqo_nhUO&F*{B+xeP3{!D3=!S%9`Go9q09X1tSc2#fhe0yUa_a`~N zPlZyMR>y}+m%BNmKVO$~3NBNB3n=5C(jQBDxxOmy;j1KMM(1-^+zsNC{SN-!QRa^o z{Ovwwer}V4=Oa>nT9c&b)?b&3>)1mHGLwDgo$tARKZI2F^F0+H-v;4C@T0n76P(N& z%+;QvskODk{Oup`Y0LIpOMS6j>}yyPM~eZ*ozmfA4cg7%ebC~c%;`16I;@7}UsOkO z0jOhZz_#&=tgk$5X!a9fvOdNQTsF^gS?Ugd-4JS^`5dT44d_Fq^yIVudlqiWHZ%;I zwQ7DW<}nEq))AzUwQ@rpnh|<{;Cl#{?T%>s2v1hf}9$gcHxOFTrR5mx`h%ul4OWBhFjwo99lnM`NzI-< z`e{>ZiD^p5x#xp>uw=GgGH0ZsLw>cS-dOK`}wA20KBg;N4$m{_2k!jj`)dx61NeN_T0KxQ3jZat2 z)SFF*qkHI3*|fO4dx;&565tH!CFu^Kc|Eh$rrS*RFmf6|wlKV<8a_EZ3;w{5aP%EY zDTbr(CW6WDg`FX%;vum7QH`!{{ZrM!<+%Q@=9>hEkp42oPlzE?h9ps(yCNY?tC&DE z8xC%tKE@=x2;B{;PNqn}*M2GI0kuv^Q(JBPpO@x{{!OCHjf(E_9`Q-)*qN|`LX)#; zZlcp?R3sX6e}^_Aq@XqVEb|pKWm7lA)^b|oX7_lU)QzFBSz1#ZFQJ~+4EK9)2-A!8 zna3c0?#5){-BPa|CjJ5Z?VoFVfYdlfIPn)GaLn)G(02dZM6|Ug_PSowY#4<|#6}L! z+oAT|Y_5DQlDmlsAZL+|BfGjLbeoRI#^-~4T6p=fa zGNmT+9{;&@RQ+Y2VABJzPAs@BHBn}YdYMgcP=3DgZ;ZNE7&l=A&vVPSwCr=SeO=PY zh^h>s3_|uSHh!D~zKI`aK(qYl8{GXC(x{WS**@AfnMXUDj34}Ud+S|p1nVebE9L0W`lJ zeJs!%h4lRRk&ZLGRip?^<${jd^M$gG50TEHq(OV`O4G+!m#@Z2F!6SSR$BaAx>aD4 zAddzSSa6$KN*7`%gUV^o-K@9ZEdbf4i=;-Dv8i>jyWRvs~HTyV1++8DA?6MYE`_ z5blOok_{8g|COoL`_r^Gpy^ZQff%mGb8StkUP*#;w_TB)!eY<#>_4~kb&J-5re(85 zUnCsrA5R^S=4BX9babI+9}i2Q`7lFaMnB&hXqNjkaMvrEB^0;C=IVWxXvW6-LcuY; z-W`)O>jv_ODjSEhRY?a5oD6xed4K@K*My`p(*F@1%6K-c!=~ABC=8Rdo<;lM3H6Vd z(d-ntw@%Blx3F0FwVQ3cPEJa6!g*fZIw|)$nJwUxE-Y`mju;H;-0eCyr|u-~VKYy+ zjoTMb&jKNSG#^4c)wZ>2YUnD9Bp;SXe~1Lv1m>%}xAKi@NZBtbtg84d(5#crB)?Tj zcCN}3RXbNv-1GIof?nojJa&;X{Gz_EG&1Z1=@!u;pzp$xd|}BcA_2$J7aPM3eX%WKAjc!v zy0>3RUni&0*VoL-skxh+pszZgz8K1ls&Si1UlWt`HL@rAsz}n;_pZ0}wc+2Puk7G? z^o1_#(N{`M+w;@7B-WfOvRH)TO^v8jJO3*Sw4vdbi^ z{~;Z^_mNvA8Vs1Lp}}Rh8*)@$;H~B^`GMw^p}>dunSBjA@tZxYVHaf2)3WQ=uQVwc zF%}uYtPdeA7tAC2l^dW9`6eeyd8jb-PeqrRS8DYRg>&1qZ6vH>spwHY!f}vd;*b$Q zs?bv7*7A1o7qeiN;(wFoCIyxqYAP}-scs%EH5;fp-S03~6`0*ItEVwnOwK-L@n7uU zi7!<%b~rBKyUIL&ewZyNd0SyUq@a_qZ!4;2hv7B}s~5iA^Ev78r@QFlRN%6nPac@R zObnb6|1`nQS`6VY8n00yEh^@zgi@p>RBmL+0>gjUae=wD{4_^(uM7vyqsI7l6}N0R z2P{u?hUCgvDFB;pKq?UU#uHdm9y+0>l!8m;)F3Kl`e~ffx51k7fHQ#Rp1X!yL_(o_ zVmTPRyOc?H_YeFR6NibGlYACf(4qS%$HjnG6ltj`u5Jkzads%gkgTK;F(;}M=;@3^ zHzR^MJCyvqwplZc3K+^AUyk<85%lxg8W)HR{6Ojz6-{HNuN$L6GaT!!v$~p=SGv7S zjzi+DmV$4-c?N?RG(neW4d0yQe-qL-PD7>p<_sYq<(n}p_07;TbpcC#LM`EZR24UG zra4qp(tgi(_{Paw`#obO4IGax^vMik^T3?Mmw7BM{T^4#lI|lHc~j2(#|9&Y(nC6F ze_8$;Db*}v{s~7L`M$FLvcz<8SnFAAOk(~*mCRcOSf>cj#eWuVNE)xK)D3FPFxKH~ zto^aKKK&qaMX7BOXCJ*jp#^Kp1M_|*N^Gg2hg!O?G=}-;WLKZQrLOw>U2%R1(BtwWxhw=mW7*S&j5f+D9&M$(Ey4F|%h+a_1yw#opGj)nTPA8*d2Fzk3$I^rGLZ8;Bw zjrS0CtZ5&FjkgHvM+d{#xE&^I!KV&s1i+9ZXN2`!+- z|Cg#!5AMFe$hp&kCjrX?=Cf|FjO8<{)_T(`d0Vx7p!zJJPfwRdsU`fk!#2WU55Zyo(d)#{ z11XUHND?A99-3SMOE9UeR$!mh;z)>U$4kH&lz|je;&{O=+sTS za~r?L&spVY!+)Q4ijlA5D%Q`0LwEOTJc#qU>dJeWJcmR0_vM+4x}hSce*ds?j8Bmy z^3Y=O7AhBhgWK!JF(f2ZLyAamUY$-v14B+trT8B~^@aQGTJh9!AG<}+6Jar{BM22z z3g-U|^Z;%Da?f2ei(|dO&^%3FaQn1|P#LJ%PJ@Z^aXWA-LinUi>~=qVU1dJn4d&x{ zrXr)E8fV18zDN-6oq-4YBH_rhkqMH#$b{(R8j7R))fheaAmYEl15mg75cyB;l}dt& zZqwqq&bxoN?uYruQo7{FrRRFY9_!5Jg#mRn%XjxXyR)gF(RKRo`{Prc`oUmkkg;-@clVqgU$6O4n3BGf0aBm_Nr|5h*m%6 zdBcFfVae+Z`o}j=iT_Tgy6ZfHz&#V7wn#Jt)4&^*QX07q+WhhvaLmvxTw<@8R*YK7 zQ(g=ahv>AvLUYcJ4vFF%gd+^#adk|s;M6=Z(mKg<^00xmcy%Ct|}$;HjJ%cq?fIlc5^uR`phZe=!DWp z+53zu(bHS>G{jUN=1o*cTD6X+YG+CpTZd;I1j%1h$k?YORwgixhZi!#y{qaO=zo=P zOo&@sh_91B<*tLF2vxZQ^v6oWT}(*3=x?ui)b2jP)lwz%Q|K-;WuKTbdo24?*=SP| z*wWXRl13T%B??Eda6xm*G|3R0ZXYPp>R+1z^PV+RVPqhFsZh%$C?XSzQA*!yJv_&~ zb(3+I)Yo$3jk^y=IIC3@g&M;@-qYi>1oG|0DE=3hhJqL8H)6uoDe<~Qx&%t4yI)$T!T=8pROO9j5_5?r z-MxlRy{=hlpVR!6Gk?@fYq_`rWeP|O#w>y3gM&`uQhyN>?p}jEFZ@xqaFiW+LgOl3 z<&mkU{UKW~PRiB;l=@*y^_9k{EMY)1=*iR~x2#NW=Kz@{sF6{VH<19+^0lv_xGiB% zo+Xu&*!rHR$EP2oG-uf7#wwSQZpDuz0E{f#a9S-3;zX;5e&VhhJXJLETAoGXL>X=-p{n4yxr|K4? zh3ab=aV1nS16>YoZ|foyJ4+8lT^+Y4iqDR1)4&SG>7tO&uSI4Uo`iloZoe+nG80R7 ze4#{-MC!W0+-1C=<1^>VL8=lRWz=KcrSsHLll5ucX>zuszeN-$BGbnBFLug=yic|Z z49Sp81`Ytp<5n6+7jKW0oySK@Yx9N>z( z0+r?NHcdiPMNVMe)B1(?sUm^SP&FaqYDyOb793-yyRM|TI=Z%+()HB7tsb_vI(I`P zxU_DNLHl<1Xk*L)pI{@Wxwh18h0R0_+(MD(m{WN{T56$|6f+dIVJ`Z-nw$&om;hsi zI@fA8Hj7yZ*%77Fq*D26{vI$ETOg=gSS+XHD}Ui~#nZix`)@U$07^jY63_=R=GS7yw4s76+s1pOMc&Pbw6_? zVc*^V|M%nbA@dylR99D5RaaM6SF2lT6#+jWDa69!CXt8JyQe)Vz`&1XFB%e((}LZs zABkK0UFC)XQkUV6xzEF8d&wkmGi7`$GMygLN2F0^FhO`g_x~E{n3(xdAPuCWeD0~f zRR#jOli;5igy9kV3<7KaLmw`wH#Aj)(tL)4qM>1Ma*Sv#vlAHnprIIcj4_4=4m)9t$ zJ&+Rf1)R^Z9HalDy)ybcei~k+uvfv-62}U}R!qwpPIHeDT4Tw78swGG zmdCUkrbhGs<_Q1K$M~3JyfD@c!vCS`(FU}m4DBe-#2$E^*bCf^lgGSHFC2VWUDj>$ zAbO%?;OmpEl=F}khw_PGXSedv$|8oOn%f&+nyn7ey$s$1(xS`ZV>U8YDl+DyjB!~F zRxO!N$DB{}b5-3hAs6K^~ZG_D#z&Fm68aJx#5R4o00H{N(R z%+JJlTfpXk0V}lsd9U$i*^fS=pZ-f|0rd&~n6|uwOU-|gp-=t3u!CR)@9QwoYyP`P z{C`_&$$$3xv03o7*N=6RDQ-7}*ObAdjU@Blw!S19W8 zEzORrx`WHuHn3c`uXR=<9J?qX*Aa-Z4MPYGj<9FaIj|L!k5rCIg+9*uMu?p^etdR` z)i;TOgY{=ZUj((;Spm7&CzLo&LqhLCfPk>hG6aA73J$yy5fu8RlhiHc?02&kN&N)6 zL75e?$@U5*m)df%LfXFFb`ws8vd4E~meZn(#Tyt8`I`j!yApb2HqtMCOm{#0r|lra!{FK94T-o+LM}$c@pZkALTqi5~=S4yuF@MM}&93T3b>4_%V7)MJW`o@@c035$ zb;=EU*TvoiynV=w2AvS04_xv-)CzBYJ%1QG5cL-GHo6h7gD&bIb?0BwQR*J(==KW_ z0gSJGR_7=9E(u&(cW@V()&I0k*JSD6+L{G%IOYp-whwQ&x@zJ@L;|K%-4=d?u096M zjBc)gzItOZ<^wh5anAZY4laRGn0zoyX|CRbio)>$Fe#Vc%$ix)<@{9()H9~UXK43~ zC%km&9tigg{jtnA?q!tKA)4;!6=-aZl+f{zFIdaxF&G6BUt#yJCELdWqqCpo^xx4- zesm(9lE9SmlE8HAdfii1?hTyt!&(%{PyYfxRb5Byfqah-r%3_Ga zKFs6@Q$t36oP>k=#x#T_5!ygvF_a0oV4OLp#9vtMD|q51krB~~GZT4c3r zQTP7>Jx4!$P)_RuKzoW~7Ur<*>8i1rNlh6RQkqt=l`o|+bQwULu zlXMeys&8jX6R-e>decfUqM%SIZpDD$7V9O6oIH47^e)Kt6+A4Ea6-fM%usiawIEa7 zP6(KfG^C>-WK6SA!y%3jWGnRVefJ2OZji<0(tPF4!!dydENj{gF~ zC6XiP6+Pm>1-zp9+mMkK!e~23Jp&IzH=IE(I7=kES$)cR2SR!^QA*3OTv!UM=gr{W0cmFUO_f(pmHdiozxa z8`FYDe#8Y>Ui0rzE8k@FqlsP*T!o3-U3r*^m0|&>O#D;lp$U@opcgNYtOI?7)sO86 z1V@|jv)Plgi$~g*4BU)aZhvkqKZlar1f)4nO*ReVywmcX1**8;77t~Y2+o)i3za1xih~(HlY{tpHl2m|NA&(3IknXiB+>QUz+!l*+eJ0;R6z z(=er|A5|ZN)}?}0dY0fZI$f}Gq2tP+SemMe&~fiRL*3|j4L_jP_7KA0Od1PBXu<+& zQr})pjO^SNct{7j7NPp>Jkza$`tR?Cxk~5As`MOHhWG`p48@KnTz@R>_}JrHP##y+ z2VHn~Pfx&8f$cR=C>2Faa4<8T_yn+KDPw#|L`{ZpChio|p|H?15JC%A=eahg*1;i}3K3 zJO7Y#)u(tTekK21+*jyqaOr8ZbJbA!itd)St<=B1le3)nT@OtgY@iwd7gGNDTZmuS zXTsly)JWW^Z_LfPy!jY6jWiUJ)Q_XkEf}Vgf(K!&g^eRz==n(j^?SSc1T>dhkV|=< zNq^v2-Am^0V0kD)oE5!~<{XyBcn&I*yqh&ak#gzUpBNQ{x)s|TvA*i*u-*aNLh?5) zE+Ox@#dPADA03g%5eWY$rrF-p+7K6=T78Ds@_@6pLBnI2k}qjBwl&eB_z@GE2r}Gu zT?%u=%Lcos3Ndc){?Oitk4(LHBu*Rir=Iqwi{pF+qyA>}vZD*`<$TxHKhnNe8@X6+IeGw?8XgPl zqxWoBmuOf!@d@mo=WSRmxR+B|U&e)+t0BGiDjAZjq=}8S~hCrGYhI9oXosK<%6LEp|9pGX)@?#R#WCLrs zhShyEX#bQS6cwdVIbvdNFV>qhSWnt`r!|x)XUG= zl=>R?0_ihcs0kX<8baFmxu#S<4Qb96yM3>X5K09EQdJm|kC52Dg}C7St5n)Ijj--C zuyC>rd0~Uw#%igCH9%lxhhd#fSaLouF4S`xQZgZ(V<3&ukP4^RkVa`p)sL}#A3STf z?{?e^q*=I7H)%*sn*r&-XS#jEG^F#gZAf3`O8dqLq}5?aBMFJ^8;T3GuaAaRMOdp0 ztkX2CzEf>lJ*;6l1(rJus~cgleJ6hptaeYPq}h%{m5_V94f$aogg%W{cK6MreLAkHGoVe>&Z#;ERx*fTkkg+e zNnlj{m-rrIKHOij`;k_STs&Z3JT4U^LG`HFFM+65>MJ+WX!ddjSf5oZuU8wOl#SUcvkYU{0zrjVD3%*xZHEOt<_klfSS#5WsQ-H1iz!jYVWpgL^qQC*@SH|puFkc2_fP%fHlAZJbiV?fDj5D|)hRH{7Toe8zzdVq z!50O=VpDxKtIv&;=%jiKM07r4ZPt(KwHkxP^a{91s_)%N^)f0O|J^WhEr;g09h`^Y zRS*t61CBez`PO>;ZeU$8>xZ>9XU0{{FxWq!d18fhePI0>lvaS5zJTV{>Aj3EG))u)3}$Dk!asUUt} zPwxpKHCYw%j{$w*VUPzK1Y&7~@uvg=p`r3EjPD9sN_pCCGAEQUVh@Zh9PfGs0tffb zU&IY98L-)orB-3eyq_W8oICGlgGgIXn=8{3Uk0&Q%FEQe;Y=*GlZo zxhwot9+>-6a=AaJxpFMyi(I5Gc!iy0IsQ1uB=N#Z%1$PheRGT66$-vXF%LXFSb}1Y z8gDEnS6uAS&SnfXS)6DIH^G-6DEhAy_Ch^Zx_kwLpCD`XWRV&?5uV_X6XdayWDwrS zTeSfZ3&9=om{dTMYvr9`TSk;1q7}0jfCe8T*&tkO&A~r$wH3`tQV(Pk7pkxeIt;ed zPxGN04yJMK19mI^s4thbw)qZW<&RH%ThcZQm?;25D4`uu3c`!?Q4Rq&?ZWMGHju76 zNS8i`XgT&3L$v%t0N3DoAgw6iN(}GMDn#^p{h!dD26*Ql#;>n+kh7j)?%IFmYfW|5 zbAIP*O@{jp7j><2)?ZqYb#ELF`$KeH+kmvVyKdAc=~exr7&D5C3w_51RZYeCkBihQ z5B?@sT~=6kOg=rU&}!tT^go!h0*BxoPaEUm3mQ-E1bkN7ft|bfmDG>eY+rEkgJ9CY z=rQ=wvkqkIGEGD-N0fw;-6c5>pL(|F{-x4@)mgRt5Q3d4ziYEH@asi`)8uz$R*gL0CSlRL zRUb@Di7pQ=id1X91_cBfd}8D+wvW(kdQ+zfRFH&FivnrII05xEk3P;abnEQKLSO6M zcPAB!gE%w;C*??rcRZkZ5Smzw%+=XsvJ;Zy{S5od5%&54zhJU=d_j9Alpzn0?i~+k zf`z)7Pq;#d)ikU+L(i0ly|^u|IVct9ZmF&1FaB{wx9}gpHZF8!n89As)S_Qf+SiWZ z4DAtJhp<4N;)Pv(h9+F>DQC!eRIg#I$|D$KJo3PfirShp;+*xZsFs>D39s2FqL@*v zLhf&4q5@3u!QtP*s!yvJ5GOl|)c@W9{=kkw$cNdn2p>UjGAKVpTyAn3B65?fo$GNM z$FMH_2J8hLQ{%}2#@j*}_G92G&!xYK5yFj^{{eGZb}&(M=e*(0*%oo`;4pG8LODJ0 zuM+`sJ3&bs!>pl2P{_dzY~0!J^ zec|)*LZ5>V)9CXVB>1TrKkMN5L7YffKhslYJtQ`yJ$2FWZ4_+OC~LJ*^ot^__jU%~T_7TC624GO@PbBB7v7wv{U2ZNd9;&ZiwCu1@G z@Gkg4Ctwpd54yUx9LMWb;!r8aKd+*diBO^zWS7PGqBg#y7ff`mlPi1$Zm9``o>0#9 zDVUPwX8mHPi?HE}HOL|u7J;$IZclHh+us9mHGd}!-PVO~tymZOnW4&L}TJZ;-bEPS$-(|*_;=ucz$(B(Tzs;tjC27Em^ zP$Mg|;?R8_EJ#5BGI-erO{Moyb7Ai2J}ydm2BN6uuoA?p;e9TO;xOlKCDsgd!$SfE z%lEL<7oziLqaUs=_Xch$_2z%+^l=EIl3=aqkXL?gnBfbx_Qm#WQ1}SC0_VSz4`R4r zJD13r$Gw#Vm->M{QD)X2(vT>!H6)x=rMrzpAWB~U^)Nfn2e&+5%hDRl8h7AD`8fZ} z%DF&pP_p5cFVxvF$Qf37^x-gmvAmM=ALGZ9jG_NDUUvYmCy9?7>;|=70UW_oTBRb@ z&B!E=_=pjXg#(fvl9rZmRML`8VzAL2_@h6=lKich&^ED*<{fRwVE!8Fj!$5py3yos zi~Gi@uNZKH2@!-YiLga516OBaQv~i|C=f+VlaPD^v&^zI#5xTBrI>V?{P9=dD9eW5 z88Iru!m!(_$yC!w6szCQ`(~k6Vvz{W0SaOlAu|YqJH_JjZ?zAyvd0RJA?$3<6!YX) zk5o3l@(3pCHn)FN7AGl5%n775wOTi#gOY}KUdI>Ue1$tXL>b-@H~qEn(23iFxRL-R z*ruTmL|LolBv4c436!}Jzk9TDC{Zvh{qzi~>vTDI1jk5ICtY-X1H!6cQfo*`x*q&Z1@xl_EF*~~v^9*OhYbbA1+5<{s zEhL`Q^?=GuP(BsBdBxQv>>Dbuj*7ytrGFwuri=#-vyF2j?ig6HQR=aa+tq7VVCI2YRxNd`}(NsK0#y<{38wsN6u|bDE$(e1oC1~W3MzxSb>l#k@VVC;1 z1=C~+&~PIo)_!l~k5t3aZ>3l{1bSN1*gR<_1Z^0bXaw!DGV(*STC|peW*!?sGoZn> zTKk7(t&43QsV(C*duXoLm?JzSO4drjTK{-}q=KBSHgZ<#=1_zkgXRhHmx5}%lcr)4 z-oVqXl;a?DE}qs3E$j8@gm`OA6wmYqG=V&ATeNu!TR}g83uja#Rt@aQk@(*Wdf}0? z;Q(j65K~2xf(+%L6=m%s)&SMFPoA%q6n2!?ZF0Xht4zurgG-RqN*%-5VATlroL!X9a!4Gqx` zM8k{f*Tx%bW2<`Nx#;SRwJ|b`K}`q?yjK~+6ziX(?fPvQssUkG~8y)|^;46I z%7O}6FKkhtU58$EtVA%s5zfBDW?47Z%I#K2net+V(Yve^Ry zXENr0r~}uCFmWIqzZqDmIw4A_Tj5#Al&1N~~++>BkT(`2v|# zm)tx#aQ=R8e#m*xFg&4sSdxFxxtv?Jm}_!QiT^{793=etB>!!_k|tS+y*x+X_cZ?t z(R!bkShF0MLi+C)*1=idy+Xf5@(@gQxsd=Nr_Ul(0)fjV{$QvM$VvP^LKdC(HKO56 z#8hvQ0*ryJ#|4#>W`>nnZeReCOu85hOtJsG3$HW}byAs)q~xxJ@WBAJ8g z*U*93R{*b>N|8(KV%Ve#af$d2{9RAk3gtp5JKCU85a(ex670DNy9|7mPKF0Wy z6I(z{#Gmvh1+CNtPupwq$!Ey={-SzD3ao7;9TBeRsKmXj@85z8;6Db-@aUP<0H&TX zuzG7)t1KJV%R<%EHXmWl3Bx*yds*NA1{dnP;R0zQA>C*o4bhNNf;OZo4e2d`)ISXA zbsN$aLi)3Y6h}yX45XeKQhv1!X{d&@NFcqrD%?IoV*J7_xM2TiSZjX|SUWdsS{bbN ze`&+|z$vu4R$#3N!@7#F7{4$H7wQZ`3WVbq#yKT^;XgP(VE%OUT_)F8GPu5yL2k$< zH{@=}K&#ZT{$kW%7oRLgjsqKDx{8}z*=C$SEB8}#s zdq}*P^=IOcOB|5)2_~U19}RK?6j7X zKjEDQH%+6WtfD?dV1<7lV>J&{&lp=<`3NNfsVrK%R}UN;KOaGZ{jR;6!$oSj{D>kA zvsx4~&UH5umjTO)+rj5Fk z_0`MT>2AP*I>0(I^wWb}*u`S~ZpB@LN0FRj6Gt1jv-l81E23{ALx|dz99?3`^jP;Yc<8k9NBVQ zq91+OibqrNC~BZrgStoeQt(LUEYhxL$P{FM7nh*Utq1>Ya<6~tN&U}_ovcTd7t`?F z$XwE6s%#hJaoslci&xC-)y3^=>f-S=bBP`FjKyqeiH9u{I!N%y^8t2BY}5xbnrnC}bkrsXD-bl=Y%ZOvbuiJU!` zBG*R`Bs<;iT=o)5j9<~?v=VDdJoEcEhf)fCpI(aGm3;?bOR94jQ)Cjoc$7#e@qg-R zKG?O;_ZdrM4UrN&BdK`BtX>Hy(S;uadfzd8wLA;ML$DCr zypm?I5gy;MgzA2}fi7$q*za6+gk_N&C*IxsNs_1g9~K@-u!v$@8x?Du$GxMEtbc)*XZ9u@dCSq}cc*0!o^@ks&-&0ov{3ApQ` zUkiTC^UL|TODIn;yHE-@f78|X1%dyJ-(4)<>2C<|bb{cEUh-w6gCkdJ@Oexi0Q(5P zswe-P!9OYZ!_~+{`Q69Ro8v>li1_^uzt}&fg68*Q^ZTy+Zd1GUJ>4u@7&1$1u zBL510qZ3CN5!doPmre@bK}aXu{2X&Wkh)cvIh|v-7|6?Hl zxw6rmx0UR_kBBgaAe2W!ov+;SuThShKS^*Sqy-;4m;aN*!Q_xc;s#SxfJBZi(Oc#C z>J=6%Y{QUb2D_v&W-K$glVq(TNzFNjng`iwDgPKf&((|D9C1sSa2(_c)5n9X z=*#YhZVFALiY$#Hzg2;?7s_L1mWwaZ ztJtX_lqWb~1T1y?E|H`dT;qr^zCUcD7)bznM}~;>ZXm|$T--#BHO6$}r1I$mR^G{^ z@`?_jUn0R;erJ-%G5NP75yAi$9Jdm($?R0{bl;aK1tDe2`-nUU$3&=$tOym^LMFs1 z6bi1g9=1#MklX@{u|UQtFJdF)_ez& zsU~pw7Ta?|!%#4xeL<{k^+v%2_wJLX9Gr&<)W3Bn$$@uW?+!3FxG+O)RJD zv|kcMUP?BRXqohnOm@%PkK`}8@dCqWUs|^=r;7759zD`OLO}+ z$e%<5Q9p0QjqWOy7H|3{xGZc8h5Q+h87{4%9Z2F_KkTmg#SkXphQzU^bhdi{|GwA}_)&^^RR;erIJiGin}P)EZya-M3zt zuIfB$hirW7&e^3Nus{D|I^RpkLpdR%ok4Q(i(ofQ40X4oKGyLJK+`4^C6 zo^;kpX*J>KoJIZs2$gu&)K$DfzsIQ(TrqQf{=TKx%x7x-l##+gA#zaF=X{P0@zj>+ zzYOwHrr~5sg0WBi^Iq*-gtFyq5rXb!$XBM@8a+LNpevNfegmfmT@XddfY7XV4GdS_ z+qtX`_(Tx+QV{qU2nYjL<;|ZC#!u-_{!IeLK@V(Hk9Ap_ng|SpVS|oN2m*d>QbX(_ zTTf9$EU!YKV=%i2ml&gD6jC|zd>4!}%10mEY5hV%q(z1T3O6_$GjxV1=aENU%KC|? z33VJExU!wiNqR2#b0e5IJU(qibWW^FiMiwc0HuR}k2;`a>JB~tx-s~dPGPrYeqjwh zF3+{+o3k54x7&gDCS=bP^1@8y5*+=}=zc~{)he_q4Bui$DWO{EEiS}!G!xxEATLl*n?1Y^w1aN%-RPtlH?5$gRYSWm&t=}=7Il{;_mMi zcRz@Sw`GmDFN*DpBKzVpToiZziRv0*zOSGeaiJ?P{9X)0bd;z2-Xi}e05L0Tf~Wbj z3rf1bhntyM<53{Hr2D7xrWkJq*>8&QrZ3)jnm_MZ(j6-aU#69G|F#x$7}zr=zJ&j_mDiqJaJs#)IN&c~Cd98(ADX9o`LlBxB6%@P#Ldn&cXMr9McDRQV407-s zZw|tTPDBpT@LE}8uqNU4e@X~$1-}-)pvmG9Qp*%Tnd3^s$bgqmC zgYi%=gl_td6n5WR*!=nF#oga8Z2mH-xcj%7|7Bc{?Mo(Bjp@rm=g#rE zFA<+$`m&6DN#uiHwC~Hs@;yz#f7_SkdVCopXHRmffvL;?Yn?fTNO4r^tTP$2CcTd) ztU(jFyd;VU>_ax<;cmj2V2viZH~Zrlqp%gJKRn=c1VH+K^7_A}2gk4w;y9OHQYT3PdWamGk^S#hMwS) zkl@G=qwUuVr28MI$9m6Jb?js3CV(FOXeUx(V-d)Tmo-R28isOjlw zAR>3e#pg)zM_Ig4%D33%UuO9nU4GE~zVvTC_yi4#(GTH`JAf2K*dkMdO)*=OjC}@- z4iTe6>No-w-GSTb$VA5OX7irz%+ulMiHBpSS_L-&U+u0$Hv;KCVWfxJNDL$rf53zZ zNdK-H3#J(w1wJ<@pn9T#@t+hi^)EPO{d8>V`a>5+SN?F7O|chlFcf#)ANt{gV1-G#8j_; zZ74=}s)R%mmd||5o()3f*?0 z3sq>{_T`{z}KO7E#a7Au4O!+1x2i=?}9tY*@@^9Af4j+zg zc5pD*1Fe<$;m^^wT+&a^4@&~GGntfdGW#EvRIWP^r{|25emLG?&bacgm^1#cJ$lZl zw&E}#EwpNpU2SN!7i^qYl7D_y^`AWctgO%)yZ(;r2RAm@>j#Veq}LAyvkR=$pa0EX zKe+esU~p$@pV?eL7&Xu4w6kz8>j%lWfP8I~RdAcv)WPqL#jGFDzBK3WUPUF)`T4u_ zEH)7VP{V<)=dMSYA%J&#|2hMBAdld?>X`tj07e5D>5j4P{s=?}%g;j@T7GFQ2r!Eo zAT39)k8xsU)vJ150e%3VV6Rp`w*}`1@*A}91s8PMn)KqQFp>`y#Ia{2-lGrmC;CJ#qe@2{&f9`}}1{Os|bB2v#T;sT9p9n1ce*m&>SfS#O z;lTF(i5tOxsFLeoU=fJJL`cb0iT^;uDqZftC=7Bi)3u5a}ao z{ZEIvJIMJE2ozaM+o#9(8K_@f8Ad{@fbrkP$iiJ(7CH!jG=E0p2Q>oXxUxAv+Gw^x zf&e&n54w36hbZ9RcN@DB;{E*8hi&T%CF z9@6t8uIq7gq;w=UaPikNznJ>0!M&&DRs4l@^>kJ(elZ^(!awI?QVupKgedcVm)qaXSMbnn zMh9Ih4o?P59fMkqys5oP!)YNB1~4teV(K*@dgRs!qB_s# zCJA9M^sC!KvTjzXA=n@*BILLIp9z5OJ6KK~Rz@8LY~5)%@*@L2Ppmp)6{2-XFHCQH zoKaZYT3-FN7l-&^Jqq!+CrE8<+XN3n?haI+wI0p@pql>S*ZnYl1x2c*#}L#7qM`|b z$~1`ASTybBrDWpW>dHkR2gatJYN{!v43_*fo>zfIEZ9DV}d@`Tj7)+gp%F#E3C>spW2b}NX~-QBMH(b(@X zWhb5He2VXR!n^*ydZ}ISany_TrNh;?MX0jAtNv)pcm3i*w?Kc_wLX{oV-3=`7-SD> zWUDem7m0qZYn^-guivfCvEP5M-}8fTL%4PWL^ga0m{C1o6Q}3Fe&{4vpu4E&%V3U{ zZ}zlp()PP2ztw5|gfYbFyBA>KZRraZIZ!sZ_M z0X!2UxU-hiT(315&c@g6EphO%58OS;O6*QYD336a3Eu|@tW*b^Xrf?2>O(3#u*ytI zw~ZD?DsGhg64EI?)#J#|gX>07O6plx2V?Zx2GJ8&yZ@x>gBb-$!8oD8(b8nj5;x3*gv&;eE0UOGv|hT!F>+9!IQ7kMp=WGc7(t=zGPKd&(y-D1 z!C--$?s|QtPnBrusw`@1lf?%Rc4?@8B)J0G9)3kDzO~{yD-_Q?mrkwJ`p^2sslSaU zbu^j^`6GbGO5In`i{Rtc#-^T!iggIKwy${j!)Iu6W1}~aK)-M@@{Lpt436o>{j5LT zNVV^9`_BxWZZh0F*_F(XB{5poz?A%qO*csQ>PA5H)C?>x!ioD@#YL z`(&FjcJRRM@`mbC#~G2q3Q~p7aYBT>!IDR*7i9LHm)o&Zh4|?Ildaio;E5K z`tk1Qevav4l&9am0?OaxMh6D>*YWbN0BF zqO%e+qnh*7^=u9%o#0e>v!pFG8mmSG%k!84EA^aBgX6T?vqt{|qh_HD%bu2IsJJ#2 ztU)T<#xS=8&ZhoMcIUrS)i*c_gFg1Z*p*z${Ehxr^m;iiSfu_?ivp6_<$V<4M4WkTkhVK zaUAEHAvW9av|ckpiXEG$uSBQ*@j6mL_Qh$QzA`BUYs=p7r#W5plNuwa+v-=J{h-c0 zjNB;^{q+R-0`eiMI500s_D;$CH;wzF%BTw0unbyPj@Avy=#AE4;71;Tt!lwyHqc&h zn4E_E$ATU@sT=dR|3=pKZ3wL%S_dCc(96vptt4)g^7#9X@K|FCvcDxicag_ z>G;r~qQ-|*f!c9=__{khQ2&F4*3dN_;XkP1f8VcD_~-m5@c&HsBLSZxtcS)arI@>x zLBD`E+0Us@m%@2!rN01oC3~ZmsDghm&oT@W7?0`GH3)$O0rugoTqsKFG4hV(ee4g|YF-GfCw?BA`%ObngHuVD#d^G||&oqC#lEp80V710}<3DTR3 zLr)lwcEhdGD=+mS-IxTp6iTly__|8&w)X9z1tmces%lSc5EM183xXmvTFHCm_Z+s#qh_YRBM}1v6vCu5ltGvxDy%- zETJXt82TyMgW=j}F~SqXHy^gimG5S0^?SYAw>q1uFE7?K|M61Yr7ph9ZP%Tw1S|u` zjO@E2ZL?WjuC~u`z$v)_j1{vBD-sbAJoax`K>YJ}LpDn3Tfk(Ue?-m0>;-|)AhjOf z^D0j_7nQlxA4oRK(eIAlaVl>Wnko|ue<^f#(hSkv9OLi>&mv>g6K>S16TlUtqU9KN z0K@~=x-nZVjaoeEteNV8{r_hZM|bRb%>dHAVQ3#H$ZT+EA1IZ^As@d9jcvOyLcPNb zF2F`7i_>amuw7~BrFJY8bIbg3WvEjR&W0Q1yP90&K8hb!jf4}&6RNsxgbye#G+E~A6*x>8hgbV6 zT;Y^6Y3}&LzJit0HSKXOd#Jnc$C%b*$WCsDmOVE>Mag*T2{~(7`CEG&^ci`e@ZVKbsHk`mkdMHeX@*SNDEd_{h23c zFQPi(BC+%Icwy(`015a=dWB%U?w5FWI>4!N57TR(S#+a!X!rL zZsRLmnT{eNb?5-KI}j}2?_rQRi}irzS?|mASd!(3i2I^*mY1~%P{8UpeQ&=wiO4fF zSRxqNfo^c5NsD&@rd)i4ip;x`!jX>S)90wm5FAF|17py8jw93Uv2VV zgeCdytI@1J1cPP~+{@@2X%;ehpPGB3`+5m>dTMw)U(8&>W0wn$U0w-}BIaCof+ui> zComVmkFS;Z@fZna@#`|DU157rT1otFU%|!GM2VGPqkzuUvL4u|8-F;~CNs>?8Q?9K z^C66IT#*76H8{|~Sx@E4kvf+;1Kgs|NW+vd69+tG%ccmf>3+xE5MaOtnZ`k;DV%UK zWX4sG(exejKSvN|vGxjLArn3+;UAZ&Cwy{eU6pC_qzz;20VkP|AM_HeCGe1Y#$Mt|<3bb~q3@Lgu@K@R>ulhljI03_C@`hM8{|H@IEA37YM%CF zrM{8&e@Tf~7yP3s*j`FXPc0=HqYhG1vkdGskl41Dl6XdDokAH&W19F?j12#kXFge} z-3)e80L;G46x5y3@2ab!IGAO^W6^yKhB`%+P)q6!#27Vd`{S|Q#^?$D=HJb5w0-*_ z5r~OV5mRleD+61>+_1uGT)u*eDP}k>BPUxm+I}3v_z84mwizyDAwFi0#Gu1SYE7u#9h#20PS^1;{qy@BEk=fV?6TRXR|C|L?++7F64p0WpSS;I zVx!N%m4?0A6otv9qh~nc(f~8DG^iPSwr3>iVru<&_T-PP0-xHZF!k@EU4~B7vS}Ov zGu&YHOi4s+;!iFGZ2;{2EVqUKfr6GxFOI9nqTDs5qzE?1JAT!Vp-A1hS>EBtwfam} z$5Gn1C26zjiAq9iV+=oYBlhLMSorB5{w^PkBkQ#`gg18r!k&&0bpLG;sgI740UpiQ zGe5!sA6O2qaPDyc>wP!Kj!*e&C+8oji;5VZvU)OGBKZ+;FYzh2-~#a}eb^AoQ3YUX zm4Ri>KPWxSg(KL+sSj&dmkKO*7}n1Si}?dCz=hiVjX)YoNW}({IiF)hhK$jC7CjBU0&>)-zJ49k(Cn!B zmhi{W*!hPY{{%}8$1Gg^Ep!5SUr#>NX@C&g&QK<7fOBEj3c{HX-HULh-5t5d-XHT) zNBQT02mx4x2;{mv$=PrpO9U3-gteLsXG5*fKxV8mfjxu(BQ@fEky^++3{#9C=mg9( zWs_iFQieKHzlPPt_?^JGOccSdjCzx@-TC7)tIt=%4halI&`6<)c_;{28X!=am{;9R zZF}!<8zP*Vq9h*u1^PpP)l>f@Z`kwM#$caQ&FnNaMl@~ij4a`2)GYt5#Q*gk=ZEEw zK|cGzxNza38k*B__K|*Z8&g0-PGw)sF~>6S=HMB)p-|X$YWeQlQNGb)=w*6(Xn%fT zI>bD(9J8jI{ow}?N=0_g^c6gFImL;=A@nEJ(AQU!$v;A2e2N|;KqQI`{Y=lZ`vHt9 z`;5W^ok+UosqTm|a9a$O*eT^z-a)cBBA_I+D|PxiR4iDa+C}|(f|wyc)^bSDWa46_ zb1Hz!d30xSDEq_sk*Tga#H5QrBol~aZ&r_P zhs1_nj=<{dO7~wHrw6h73(+N|?7uSVt8#i~<`~o3nA3aM=bUt^nhb_$IvZB-35Z-u zf|aRwnCp$0-_?tEl3fgXjcAgY@FC}OQ_`HPk#C|9Di4BMzo*)%hNrZOY(VUw>98XZ z9ls!tZp)k8z6IHF)gx7kpXOqNhn#|rp$hen%f>-!(*G7tv8RLU9hDel_u%+MOr9j3 zNkmi@%`i8``l`&oo@7U1v01$ZE3`fixz`}?<%p9*<#0e^(Dv_cd%JNXWE6-2r$f%> z>1k~{xG364EBW zivEY&v_n?v-D$#L;Bwrmaclvu%25qQA}7zMYr z?SYP1oK-G=EBH=$wt_{=-In};+F-zfOtrM9StWEoD*5%BsxII+s9F;X5p@QBEV0mK zHn9xSc2HB^Rt$<~b*{&?d>v$4+wJd!myy&(1KnsKXZiV#b)%t*9rOmAZkvpHM;_aP z*2;W;Do~|&!0PwNN`%f@soO3qU`&~ne&_H$Fjsd~&#Uhu!~lC-p1~Of&RE*vx)d8J-+PemRv$qUt3pawU z<{h>1)o6|h9&D%XG<~*f`hXy}p<`hiK-sg2pby9{9f}TC&){P!6cIh4$SD;{CKL+S zuhoHWTBnGp!2X6BsY0?sM!vB5(b_?D!g+tvIw4yP{1t~4sx7j)Rsv!9uX3omWI`sc zzAY{YT=)u@br77jTcXJz5VaZqAFN-@&xy6Kuv%b^M9xmezp9NUOy8JSUeptMEh2+5 zelR{fJ8Jv@SwUb%9a`x#?qz@Ptt-G#y;2#XgdcIGg!6Pl&R6MB`ozQbKPNRAEf z3j*|!pOU`SNTJxaGk$z?hlU4lipYxY{|`BG#N?+4N7~+&H3xB`n7ttMDHCjh?S;ay zkeiAOkXxBewqo zXT#5c1HZ}Si8yFb1-i8c`(rWxtwpsmcF9B+W7pg?Ine`ym#h9q>?goy*=nvMJbG!L zFKT}AQd2Xc8b_zGl|T)gCrU}Ks&xC}1wSaYxe(YNtJ2vP(0hTj1)a4Rk)m2sQAQS@ z@C5Yd!WFvF@#cpaaU%|>zZ^vOpMtXH%ek`CM$0>3NMW(#4xQh%Gr5e>A z(F#IM`oGTi((>^ujlY{RjNaxSbTU+<*k@oq?Q{Vj+;$k9u)Gv~fiHaW!zW!~q8!@f`b(gUz!v5&+BcK75z=_SCSE2ECgneJ*jw0K-3lBrFNwGr(7z{}6ktp!I`(aWBi%U98Ga{+D4FEG}j>D^hpZb%g$G zR2=P#kM!cyLK?Ak2iJ(OKCON2mifiP3jLZ~pK0PRvqE2l@+-7AoI)-hO8b4d{H762 zw$RTrLaz;zOiKQF$Uhmc`6H7OCw0KbNLbEw1~z=7Qm1cWF4A@EVfFrrxxRv?OKALI z`Dme>qCGE92d1g*A0A@>ohSs*YMv;BzF3jHeM|wip>C~8!-_3ft;#Hu8ohv`n5&}L z_5&Fx2ByFW{v(x1GS}n(=OiYjJ>3>}Or=g5h9zGAX3^iWm&|ypIpek9N9EQVv%Z2} zgS2!1T;I>x!MDeOQMx{&2gy9-7yBjlOid1tj#rCyjM4E1ksCw)x-DzaY>bf?(k0*y zT$xF0!KRm{4=or@--fQ{unQwy#y1-O+u;8xAgy}P&n*4aG9eoPp??^2YMzPle+OBk(dHCktiQc^7m>@)qDbDds*z#(j)44i{V8Dgc5-fqWl%%B%F(5@Yp z9O`XR?Z%&vcf&yho?t~LABKg@M5{|hK%=U1w0^^Dm!2QeU4x+jQv zD#BqKZeeZK=30HB z_d8;zIpWmwb&S9a8cG^tXokxn1%-mb^)q%zQ^|mgC3h)bFFTAY~c`~+y4L?7rQ<{Yc;&TwE7M)(MW9c#V&4o zy8%u*^dH>#Q>ksxtI+Gl+XvRUI>YF{{PAhkx$5T!#P2u6E(%7l9fQ=Fa1NRju;-)T zDSdy>tdH(o(Qm;qk+wvv_Q+Lu{Dk1s5=Y-c^>YYETcD>MuQkJ0$G|N$cO};!IGls= z^VB#Iny~dA8K`q&un7GwQduWgn!Zda0Q!~^2RCtWlUpl@Lphmu4pAz@UY)KIMSyc# zK5*xp@FHXY!QxI!ynhXQmiEGNm3Xq%xr{0Z+j)u-+6rrronH-qa3Zq&ZFSx=o;6{g zehxx@-*q27;BG!~sdpd_Vd{~Atq9I#^fcnbz8To$QGlQk+{T5jVJ*vL&kW~ujLAmi zfy8N@3?C@+jyoPcKL&LotX5^Ufa!RIqQn|V|BL4btzuYtu4GujEC@DQ8DkWf;?N_< zkBIWwZ&34n8b1+dT(SAw0C9#rYj=ZN8TWG>GwvlNh^9!YJ6Q`0}st*Bc3)A)ui@Xr{}t8#*Ank#@BVOcWhSC{4v%k`~j{A+o#BX{r6sR z8}R}g?$uk>oF#xrvoVe9ACE4Eqtu&)V^19~qL})5t=3Ww6!#VUX*Bf)7G~0?y+C!9 z#*}|8xGl!5^1OYlO~52Tp*a@ebE0|?>!0Q8G6pz;?rAWUruXbNui{Q1ON z2AYG=hQ&ameYBB2Vd&590x%^E@Pq9!nC--^dd7y;m9Rcu7lYY61BkNfE7&~BZsPD) zVgP00R?W5nr4Y~qv4C=704)py`tW59=nUP&UAU!vZG&W~P*w~mwy%$Y zrup->FtiCRG40F4t#aD1PA9Cw7+7i#oz!7Q9~=hMEf&zRtpK!jk0I1g1a$0gG41mk zK)V0-kFeYK21Y8%vT5HdxJCOG*`V48>Mt>%*uF6anr5q&0u3IG)K51O8q78*6__nQ z4TdR_DV*=vhF7W!;|r{U&+uHzsKZ#}ROvBH z^;`^~F)@Hvh5-$T1(ZfW!)-u`1oUVupu-Dw(>TNS6f&hi1s7SKc~WV)KTp3M34abBoA-cClX&a1JBe& zcj|7*W~IGp0m$$GsE#qHTwP?U#^=`?D< zdI-1b0UMC??=7)_W*9&?FA;#A4g;F@VGN*R+^WeoAnD(Mv4GArfEXm|E4U#HsORw* zK;3Ywy4rwb(A)P+42`zeXc}o^_ZC3x-{X4;2>nYxm_K!4W>o*CzK54;)f>{k<#;2d zD8Gy3nd40t)>ps1PD9QGiU8Q>1v{$ZbiG9ZU@k;jLTn4F88jeCjDI2{*i1R@8} zqxTZh9}T2o8j|;M8`4@0iSrG_zl0&ZZ_g>-o?r1>TtI(4s9}A7DPTDbtn)RjJ0G=S_1CcO6jh|GaTtbS+UVX9_;w+z%_Eig{hr^I=w;|0Uq#+toEg?NFG1z}A#unesp>1o5dM#CB|u#&>Ch7cC}uRku-FEymE z3INGrAnAzh)U*?J`+8_dKNm6*X_dv+IIp`0BGMd!n)JI8mwWp-eJR9s$o4Nu(HFj{!CbG-@~|2&uK`> zgmjL9G*Cmj<2oDCC=F?}K>8rZZr?B)QWhcIq#-qp1*8MN(Cs@%Lppb%4e6^VqTboUquwrMOVLw+W?&5>l~& zq|;uc*1lpxnx-Lro<*!qX4~z1ANK<3OV37YoEQESvo<>$r1_lTqe4jqZwRSGFpK{l1Lk(zsznA2oo>z;FnWGACI+RIVOZUtihpdTjTIW3<|HH!~0r`Ibh>Q{e)TkF|F9kzEF|CXP^ z5tCm}b-}g)U%_I*fMez0vrS+3#)Wc7eU7zH!#TvxRBOM6o6~o~QGIq@-fcHtcWbq? zwkC1G>_&vEZMacqJ@XY@5Qg@CPXp~uT&Tax8h+RZr~U|JaiV-U|5;@$ZfNx9m-Mmc z*VBpTo9Eb)@;5>ze?N%}@b?VDM*I~%P&=jU|gC)k=W6g z{uddBedWg42g~jydo+KEnBpFYoLg6vmxRCGyzcOt<>7#U`Pb`{8dGwy29e8mGjqGI zn2A#OgLS{YSd1E(#SX$^R7xHf7v52u5lDc{*C@Wio7>%2aHd_LM=tk_f2cM|M1#!~ zTmnW0w_(&)+_nC$8idPEy-l)mr5<~X0zh9B^hVUW2py~0L5EGOcAQ1cB~31%pHMd$ zYc>-z5hj!|qOBN--@4&kBag2Mna*}DK?vcxl(Ufr&SXV4cxL7?LpWpP$OE+l|6~r0Q6sR{r0M$ z{r(AhCcmQS3N?wJI)GbGTT|igj|+cnuC4x_A2>ZNO$3PVgG2EPu*{M~*iNe#9#k?{ zQp(u|{^zE6@FdqdP{neog1v=HJjsFR1Hrq8-NJNy6y;;l^#2$+O)8BIu7HUWoWX=(W#%Bb~t8O14T#iP-z5nO-<+30lm z)$%cu+~7OtqKv~47>OT3)DXIg$Z=~~w-I}SsVoZTb*{aC>||m!%Af&PB4qm?OQ07J zmxrGeZ>tXPd>P{hB?C4HPMU&f^R=dkpd><2jVHP^Lbt(1{nNkImD2zAue=v`|^eU?;@Y9L=l&B-O-zW6rkUvSfkeM{vzk70Yiv|H-E>i z10PzJ49FAM47}Z1KZ>*fy`(?_1hp^$=WiTKuFTY> z21}JSta20^u36zEu25=L<#e}|2+*!B#W!zjN4nx1Xb^VH+n`FJuPL`^Mg1r?v{6HT zo{x27G-MJ__$&AbuDn(XPWAF67T>%}1O5u+=zD+R?oW&TTZ(h`;ZS+NE{}pO+bwK# zoa;7qMo2xr3R->eX|Xjfj23inJ?ahP$K9-jH~%DL{nn}bUL&f>Iu>y)iCs&;Hkw18 zLHVuqV@ae7%o{|!uJd%^VHA~_x)Aq!8jcxDT4-`oE>UV$7lm$VDNK{TMy!nS1 zzSO8_0;Y6xTOJ%ecief`AS@AD4~edU{!@LbslQ@1<%@LisE=QkmBS5kGYvQTYN9;e zB{!U(MwhxETq-O2@!8Qg$+&^3V1Iw&A2#6caD|u_UCU>odO8&cm_d9+RMC%`Py94|C{1x%^e?(EoMG`$el`3z%? z7;3Ux{ehR(qy(lh@*PiGasi^(gHA950(6%4#pzG(obR~8p0gJg!jiY#{=>-mg1l=X z9JBCl=vB5RXRjU~6Yf6UjE=^Rl*n3!I_e$NjLt!@nvUXxMIY&P3NhM-u$;K$1`%F1_*6^i>=1d-rJ?sZ>t}$dDUxO zp%LPaZ$e_ALJge^k%kKj$dKmD4c-Tfs|cM`B+((Ei%R^j1sCEOaAlAHfs6dl?Z{3Z zYeri!k7oH8_Wgmy;0DBDe3}4TDYLlOXCD9SFo}x&?-cI+s(9chXn}KC1JEh4u8YUE zawkqI@LI!q?d%r^mhUmtoBu^+xg^9WS}`r_GB&XsP5kuDm?nOq&XgwJ(6Nc-(CqvW z_H{)OOzWafnvAn8oxx&QZm7J(|IgsXa=B|m8t_sNAZCcNFE;_)xP8qydyFK+_)Px$ z64@du^JzNA7jq}mJGl4aoXOe3Kb4$D7RB>b)t2B!zBACM{|FCSOMqX%8#$abd5M$Y zlK9Qn!MY#X+G=Z(+nfz|$<=ANx*b<;%bg;pR0VI~9p)F9TH7&%TK_Cs4Un<(^&wuWt{IrX2M*JY<7Zx+7ZzmF~3TWz9Vc%RNuu$8zj6Ja&SL_v|R-JbN`GIl) z-WLnrg}H`DUBNs|P#6-MyR719+lV$qmtyLXi%^$5dOo_JRRD_@Wn$m7Q<+qllc5v) zccw5u`)50aiL`ZloxaD=QJpBwKcam>nNEr7#7?wHcK~@bFk4TfEXTjr^~U<@1WY%v zn4&lHreCyQJckl*gWN6HTXhjIH`~eZWodXD7Q%wmfxjWBhOL6j>es)aD`+dk$8I?y?sNNi0Monj_WHQv+`#W@_w!g-lVqz52zpcWlF)`F&6WzbttA|7B)?hc; zooBKc-Q6u@?6?rZep|35;9@qQN$<{y#8T&tXwv-E=XOo9Od**{!8)WHSw68RigCbx zM8o=-^6o5wjbw@4km}~o&vgK4Irfm$spB=NF%^U2PdyC(qggV{(A(H{oMA{!uESnu zaiWR)CsUO^Pa2YyCc$Sw8b|Prk_#OudBZO|5R@oq249OIsFsg!iB7B!5M09bXUYd; zg7HIq!hYsl4_yW{F5RVN;_UOZOyp^vVdx)Z;vAHCVO4mtX?y!R;ddGco$~wl+dJX+ z%Dhf^{RwPww7GoFtwhJJ&oJQM)`l7Iaa?v_z>$p|=*96Tcp!#c9j55m_2b1>Yow1$ z!z>`Nst5k2IU9Ztf{x($5#))3FgPS0`3O2sIRJ3I>|!9Jq*Wwsj$;sFMmbC9GP zQ*b1)_nl0v8ftqmWDLUyx*0Fi=ud)ECe`EH^gRwr)(TSMec$!+)TUjC55xh$*mCe2VuO-fn?idw}q{sQ=p*xCKuNqsQNneR_(&%w(6a=3r}lfFyhrICD!%dhd)Px zqZ0oog_2Arn1P`sLMHkz)@%R8I9gYA2e%19p3Z9GuVsEAQ6tr}AT?zx)!opBY%Km5D)=_#u9yaR)|7*Cwsb4E z%75E=-|cubzc<7!hbyh$`-118 z-*f5zh2xZepw06TOq7LoLQ{o$ub7#VMaj=O%)@51@6|oHA5S0)0SOzfhMNWr8c;M*)C3GB3bKnE2^S@T)gXvb5h7$E z3Sz=0z`CqN#Y%-%YEiL8iP&-ybw?kr4>}vSr!#RxkbtUdCttcmt=$5@9)p& zL*Ci*iq*%69&{|g(+@l$9*1j4+tVJN zh`THI;)hKlC`q`aQOM({sH+Do`@$jo;W-^YyQ7Q```i(DQJ$4yuar0nh~?$E5%9Er za1p*)f-N*7HhRHnOgkTgJww^3H>W}AKHvUYX8IuG|2O`32Yk8I^Y4{DLGtd(JPwwOLRR=NH%| zCkIBTX6%FL^F~r?ur)2=b8(gZe8E;^OS_0EmEhfvFVg3Y% zw$D2&5UsvGZr00z-yu(k!Yv+}KxW zCzB!k*>Nmh4)nvqkL9NSB@PEH{h)L4NElGXcwjes52II9BD6D${){DeAG7Cx%HYj$ zOk>JI+*@WKza2b+iey22cNiMw?m$T7ip6uRqAU=ME=ZhOTlB`a@!0ybcV z!2DT>JjliMww_+om`Mw9lWnmI~%=#><(Vv=xw7HycV7?gIybaLSRWSF#?FAJKbR7 z)5#!p)wWr%&)!@gys1%seuEuT>wgeBx&s=$z%sq@Sh{|`D=ryVUE^fM!#M1V8>Xp1 zBu^Xa@Rudy{*X4HSAFu-JwfcnAynvh4*&i3U}E0pgbYjr?;;xB!z+m3)UUxPdexux zBIm~w`o~4`Lt7reKdKvk>q8ms7B-fOZ}4Lc?XB3|QlCbCd7oeC zBg!vZBEPKVmn8G$CH`n5KaBpiMDp%YPvBWi!J$`D>io(`IT+{&?hH%4aEkJ8`mKlk>l^6+RE^Z=#^xBWa}14@bJ%wPSW2a za9RkpHEin$dVmJ?YjZzWQ0v#!To`FP&UpTW04*S{Mb!P| zz?t_g>Zfu()Rd)|rs@eLqaKFTS|e>}s4H?pp)}zKo$))l4rnPGtigVi60nfDsASgi zY}z~qg0w;x;+!h+qI4~i8!z7AysR%+hJQ89g`;1<();l%_0n5<-=DPZ1+(5N#r?z5x;+XiDD-6Bsf20)Q% zR1YWTXK!@h4M{L-0{m8*J2B$M@-$Zwy8u)0AR0Zz`XTe{=~UcnUvat|L@8~RxeE%} z*GM|npN4|QKnZ?ZSq*1qtQkL2`Q7y7jFmi&du48`4$ek~v!4h3MqCj^znRa+pkGq_ z&(Uusd>6v>n>()w`eEc?naueI=ff_6JV~6|dUHY|l%N|=1V7_)452egvHHAS2lI~a z8Z^Hn2H-~|-zG9I7Gj_PXJ4=d$RSfPLP@|}EQ0i~`ur2{5SBNj3&|zaD@0=-S&qiu z*$<7yJc+jjn7wJ`1}}JWE{=9C-|C%Z9HCMh1I-qsdvZ?JUu_xBP<=s) zFcc;+1dpKnTOuWhte_2()G@4kHQEiB3hQmP60TC}Lj0+YkP9;&j+6@l6(OrcJ|S@9 zA&k38T)py-58YcLHVc=p5S~2nLb;_H!C({71f2c-vJ_Wl{1a0u{Wt1HlOtHlV@2v# zEv@=6zWxxFg|SjnKmFe#>jx(fbOXqqsGFP?3$cH(gjrXn0Z5ttwv4Fx4_-nwp3VHaJh=(Rxp!M^|Xtj*) z1DtC#pToA9;wz+@!x8%Z4X!zn{p&t>8!bC;S%w#HWz}eb+4o zef_qM0H!WAu)2eFVBNe07Z_+*12rtWz*0Y2uv!up{clhI00+bSHKgr!K>8v>W7Snd zIw@x~66yawOR)Mo3V3q<5Q6j)ehZ}Kgmj^XR8B}s3?yybPFjzXNrF?SKMSNz0|cj0 zAxM`KC;DIZK?3dDyF}X8kFbUrSSA){ms*Qfw`r`d5v&qJu&%POx`bFgrXd|{3rIEt zsf%vknC~q}9W|tz1kxK|O-=QD3(_D$8loXBBcyfo6$=^flRlM0fTYxRn2gYW_X?!a z5Tx;h#P*Frg5$bFZ0R$6AuCNul^Et$-5&l#&&G~pt@u2v{0*AiJDHxg&F3+v- zQ|-`r6{E1oUtvs@Z6IjZ;)AEyCPL`@SQLbF@KgCUgbP9tD23E<-m!ufWDyiCcKwC>JfQi`@9WrAcp^YU)?st2~)n) z;QUFgVG#qsx+CQD)h8`ZIEvrWe+Q93{|)$^@aH0cQ-3wE&IQ7#fBHGr_aiwgx)R$bHyJG%x92LPwVVAfEm^aCvB7LpB)dwpJx@A%>sAp0KbP4* z{;f1OaX#QvK~SwE`*{)YTUrH9FGGPBb%DRTQGnx3?RlT{`Rf_w?yQGd(ng@l%m>z)+w%SQF9DjG zZ%#^NaXZ1E^l1sMjuHrnpD?8h?zfU7=?ra8T6e`O&X!n-CB0!~Rm*iAPJhUAY;riy z754!gXCX5`>x?|af{gD(WNdF`RHJnseVEYpVnm)!7({Q%sJmR}=?^%boWVy)eyoFG zv4s4yA24j$0ttDkHetVB=(prDtvY0=$4n|+H~Y_J0Bz8^5>=|5a#B6+3XSQXOtWzw zJgIn+X_9&gd3Zm;rXxh4HCIUhmu&73qQAkty1x$Ghu|5MjtHKy*i?*Zm-PP2y#^ZS z@h@akg}UNSy5c|M73rOdtZkkw@g=R-K2jSx{Hkh&<~;d6w%u3pJc$lfpPJwepz$*BSq#Grkj% zvCPV-M(aGE>c+hok>`UD;+N|@lQo>Gh&%^EaO^tI=Nitqh&&&K-~{C;dYo2gY&j8m z?z_kIi`t^|bk=osiO6$Rh}eJ9dGt|Jo7)hH+|tj2Bm6fL`N%PkA124h^~m4@(Z@2N zKHd5$Sod7&V^GjiRT8}-{5jX-Enj3n|K+|v&VM$CelaC2N*5awuynE6C8A%{2dIms zOHI@Zj^nqC{cn&^uPhWutqG}@fh4v{tXhn*1juVhcM7CWz9r6t^cxG(C_=hRL#k;8 zNPExMI9)8nO1fd9rSlw|A~-Ek#A#6o(i8YC`qLvwK!556Sk*YWaWn@_-eOzvbv6Kj z@z%v3e{6;}nD%%EFFiR07K~0$;kUHwQ6$t!jm>4mCf{IVjA+k4Wl`u>jm=AfO$!T> z?KxsY>9`aLweV3;D70=j^XFuo{kr+P7)x_mtBd{MTC82ssgvk*fEK-e#g5}^>+!^|L%SNOa1n_9VsfJ{MSeW@_&BS0ee*|e&*K6m+V=I{11c5w$lFE zQ3uwq^lIA7vAh+BvNhU% zf9s(pJ$Nny=SR8t(qnDfl`*&9J4r=5;ivZe5Fo_^EPH};uya7e*HMmB?LelGR2vV3 zdbMnlp=#h=*(b$*M`-_s{cEqx*1eWba*e8n?WqTLO@A6p-9j>eDUxG zkWs9TJd-RO^IzeZ4-J0|0~81wYj53x^BcpTeZZdxy9++ciDD2m7#!Z^$ zZh<#I zRHuvi@D`-P{vl;Bz#Zw-Kg!be{JwEot4NusJ&y1^A&$SS7ZDyoWO^>) zURs2CY5hwz=JWb$$eE7NhcclFT(Eb#*AGq=ls)LNe zCb(vNHDlb5z?$lXx0x9WXhXy8ZQb{Ona~K!;M1`rXQ=;gq@jtHsaV}4_<_r!?|+R` zmD7omb?cHapvthS4sHuoDCHaOpRs>kp}oV)(W!9I$mgcy4(#1w6Oz7O{vPQM<2cfQ z^U=S*u*bN^ouytJ--rSY`ia}zS%GmB)!hHzs{LzeZHIsD8c>4!|Eu`)nMQUfcG~%z_9duQ;29s$_<%XauM zg-vH90lOz4O<&9I+wbu&-S%byt?qIp;pBv5)q<`(}!mx z7Ln!kJyiZg+Z&2wEB^sAojd8*4?Yd2TDJkE4|AkBz7;Xfb|x&9$084lm7{nDeyFd6u-nDkey3w;A| zPObh!vYTG}2w#TU+ zhx`kfaKKFp_px1vv-or+!RkP|$v0m<`lJHrkUmE-)YuY=!$grR;K?gUnedc@iL>8& zhi?E~SG|WxH+aJsHpOyCx|^l556`NNE(wTG#MypTcf08_A!*?42GbPBXSE)mUqZxV zd>)oItkl<@Vtgw3{kp#G6>;^2))=q)X#LVO+6f)r)pGl*`dYk!2XT6#FFJf+B%5z) zkt~%VJY0ro`Cy!D!N$|kz@_Gf*#!a{cL#9^ps%gs zB|`8S(j?_6I?n?sarR0cyLWj0$$p}X-XQ2mRTW6fsm8@tVg(Yo$QItGfMXu@_L~S24dw*nz;j)|QWi*J ztCiS8DDZNU3rj%86m*e#JSYtfF3}BTDf*YxNL~U2Llvk=I@iBVE`nsPTFK=C)iGM4 zugleyElMkwtc%k2^Xa#>PQ^`gm|Kw6_XLPd7)?>$YR0)Xj8(CT{0315QkOqi5QpO@ zK>P&W1-g;3a9)8w9G=;@J}gJQ)1BL6*Z-GtOWdI3BX1CcbbeiD^;?&S3IDH~#c_y> z#BfR0ZRtSlo`DpM5;l4kw2r-q!$kYsk^c~;Sai!GExKjucMswCp+U;&E6IY7PrTDt znBnx5NzBXS2zrVETN1L{JIH# z7~3F#Tp;m@OcJPq7o+;GKI+LCZ58i$6k@tH(Aj)#0sKZEEQzbOSNhP|zHHe?S;y`|p|@3D-hojVVzMo$-$*;|lhV zH54GCa>+?WsCaJ2bK>4Sk6-<(Wnks4;pl*-slI^Qws;aY;Dd;9QmG{i*q0JVy{81b zi%q5TO{HeQ_+aSMuA<;JezOLS>h@?1Zo>f5B2px8ST9xYjER(%WE03CD-udz2Ylf| znwL&+{4}H#8KtY4GGh3kX zZw9+R@XzJ^38v#8FgWI@EICp!R^&7FF3#+}k;#zN7lY}q;RgE098}0MHM;}+5eC&sU zRQo)hqOknGD^B)p@p;D?w^f{cZBL&BT-AhPXmqC^OV8Kq-|U^ZPpmn_#Vh!ubK9$) zL)yyux9K1)a#b;x#u50%*%#H2QW}?vlk09sNpas|m1zs;dj61-H-}2Hbv`G2%}&O< zlgj&NApV*-k>KEn=VUW?>xmWpGp5C8Y{khTWjnjL&$TM}y`YcziSR3HF)RY#;g6v} z)fY%xS?_Rb{3{1D*ISb7gUtV?&lo}ZQE}2eB#?$%j|^QFS-DpV5#s_+hYH}5)d;YE z5e#(wLF5hGFBw01&7O&9zy{g{$Rrrv#vH>W$J77(^7?R&)mD9N@G;O=a!8L>^+ei& z^XOCq=S#wAi7(;){eItpH|_IyxnRY~kKA2{&lpp2vi)1{7r4``(&bhiD_D9P{)Eh@ z;2)N;SG|h2R{mAUZ^0MrOIYqP{HZuOtM9H+VeD_V@Vb#Xrbv#@F1x=toMVEO<6`E> zmmGp|RUXn-jk7H}wP3Cb@yDva;^e@oAJ@#7QgO1p%d{F=$~6DJJ}u0@RdVwIK7>Y( z=A^N|iOER>s7*c=u!UCjH0A^-k1I}|8u!6^_aH0B*QOa&J`q6?RmniTdh*?qWS|a= zS>uS8PH%F{MZ_F>uiP)4S=u9*$MKt=)a+Z>{Y<;kbVWD=8rhzBcOnK$4A>M*Xte{f zCKoctnTl%^aTIDIjy%M>JK{{0dze@_!b25bZ0`OQS%PvW1VJ3=wl~O9ktKqMAMb4R z5w3}$Vc(#ftVY!KQAS>h{utQXSmsAg0a|`~$?MVb-&dGQX_<@0rHkO!E}9$QpZ-vH z7&1C`5cqlJr;6OlS*kcJlFw&;0{WT}xIxanh7=_NsUAiDikz zdZf$CTJ*D5{euv=vkVAXqX6M~rq`mjk(2Hof2SiG2a=y)9!xXLGob)^<{+)%w{lIyNx(a0gYp~!@>nFMi*i>4o|C29Nfhr1OG@YrEtEg5{Tm1 zN%s!8(WJ=z8Qk5c-ktA#&)IvIvwl0xTUq(u_npT-b|P4uv*!_PPIaKdk?ZRHk<0I_ zM_3Q%@sFJAPhLZx{GK1(=ubF{?z1?N{bfG(l?L=NTTS~oR)C8v`@&N^PK51LSI%IB zj9N8$dT6QMe1tXa-*ToCa+-f1M*o9jc zHM5~3(fEO2jU%ZK7qI_vf7HCU2?$}zaCpZ)XElHH-hd-`(Cbfyu7^2I3!%g5Z-Yj_ zVEZA?4zbJhwv~oUkeCl4u(v<-O+n{LpUdBB5}C<34n7LMi+#g;W9n~lt?VB zm0-~pWy@3n-Nswj@ZC*-ib};HS@*%jCQEg{dEy*-hV(6k;nDQgVzJPLrY*ofO3u#RdA>+TUj&B{> zO;4XR)&YV@s3NY{we^8_8ToA~7NVq5nHpDnIx+&2!*5pg{vOX=0t4K&7XVd%((jNq z`txQW<}@cXvEDmOq_~t(qrU)u0wypsv7E3fA%@tWuIt4X^Xw0d9mFQ^qEMOK0Py`S z@HkCmV5>v{XS$_g6MJhTcZfg&-bX(C8eq2^VH-uW)KwDs8s_l#P<`>ainaQa{)2RE ziJ})f? zUXI@i`wzPSjj6Qqsa?p@phe}nMV;BASJR|Lt($C-pn~owP+LE@x&u+RFE&hQtMx#3uS7T?NZdj&ru>l(hnKPY(fsm&m>eDY%gYP9G01M}2EgbMF6H$K?=`1czG2Hio;!RT!$lHr8YwKa}&bAza0#6R2aO>Q|zTH1qMx>8VL} z;b;}@?sCd|wLWa-njR41cr3gmJ*h(o=)O(v7B?82X|l0>bQ*pCFEL-1fxu3r6+c7jfA=F?8FNDB)<*=lkD5ul{}I@g!; zbS?s8U3(;#sS_C;YJ$%AFOzY<$*B0mc_s&z0LX_CzCfx98Ta0Pi53V>wA@K31=k^f zz`{E)zyk3cWt>xYs=4rUQt|jxO?peOB&*@h$iWrZAVZ4d$HZsZ3un!y;UmX8P9`7Fv349;=|l* zT!vwe5kr%{GhG%l3HGWNkXbKd5TE07ju!&~7vmNZN`kvpUPTt&9ZK(spa?$t#uTZo z?+ZP8R_V@YK#w1;2R*pjXh;uLy@I?MHI0LXRrWc@>jT>b3nC2ylm$5Qg?`Xa;9v2Y zAUuAGd$PUia(u$#s?^$FI6nsd&D^afq5&6WR>#6WQR6?ZGA904G>L!h3o-G3pa<}8 z9gRN&np*g`&@oUdvbgSX&*1uO@?GvJ5p-Q(7&s5DzokeOzbEuv?}>@uY^=^?iPVU` z8L{#Es5_+heN9()a+g#$B6f8b3~s7B*FPVV9QU9)+277t+|MvCRs@(uhVug$tsJy* zWOse2xx?F)8NtHfWA2MewmwomyoF^3%zK#H5DO4j7+a%6=o@G!gtsU-9K4dm`zEW)i(TEpuA0n7B9z3HPNDpP28p>Uf(y)MLS3yic2w-z&#ypZc`l$)V>d3> zjRjmwCr5lqHObUY$&TH`M3?{ic$W{`Iu9n}Dr0Qbh!o_s3emZ*9Cr!REdu*Co7M17 z^uCQ0m7sZ_Y~Y@d37R+c4zA%&Ik_JEM8u?K1?&dlKJY|d(ctvnnwjYIU!Cd6`I8iF z;q)eCV$bGEmW9evL#!%HY_NvEITNatd1ev}G(!*p%Rc`c%Xtn#SWkk4^7D`0@p1U7 zh0c1%r_%+m%8t*aPE60bp-@#Q=5ehAwiF=UOU#sZSk2iXgx~uxyPeV=1q#?MurKXa z{-hH;pn>fR%raOK=ZUq9n>XptlJpoMT%Xo`NtKTnc{UYkPboFeY6RkY4~Vhp5Me;m z_6G)3kG7u)zQCkYw;D9blfy^c^l=WKo@D?1t{{JoK^_{a*hYHv`Wp#gyM+3QKk2H- z24saBaMvGyqR+YQu2pdQ?r$0ZqdpFh)AX`lT>w|4Y8k(3T`v88f7t zawX=3Y`x7&E0hosbbW$zj^4Ybd8mxIr#gHiQ!&@$erfzlXX#|L<8*%aIQ78yXe*|z zBDh;2N~E*KY*flbmS~Qi;D@R$BJW5T3I>Zvm5kyfR~+pmSFE0stP9f0NqBg~VgK_@ zf|cCB$dM{OazKkK=@|wvc*KFbMz(~rV)Qw(BrEy~ja4p_H5nh!ZA-&h(I`i*WQEvq zK^N`GtY|G1Eb+QaRdSjHjFm!$%0Pc)F+QiIAcpNC+|ATJWa5z&;X{^mjTt`VVX(So zEunl*7aub5O$xh^1%4)eC+#a`A^XaOS_Kumig%@1`n%tlR_CyFc-&?ICZlt7Q9IYVuxN zgd-#{vdAz0XfVo2EG7*9{)SZE&RGuiYBvpscQzO)PQbvA++u^a!7k#=j&+HC#qmA! zHkQZnlrcqM$i6^Qtw20hZkfONFXAD=CUnb_;RM61i-Z!o{;?>}wK;La?m3n_vU^^P z-SaZQ=l=O90Dk{_iXquQ-?m4~VcoW2WuBayr6TU17jyr7G}u`;Fc;@fZY6#@tV%;$ z=&UE->%bz9Tj(7v2(pE~g*5R^MFbhFPLI(+)%0P-CUz~XV5j5l3;RQlb$ZrN&5m;q zQzL#P?caKxZEhFp81Ec@$BF6?`JWQK+#m@1o!|%hYob`BK=tr1d=P7qxm!`C{k6{X zN2Ohl|3jR<#YVH=e>FJ5?@Ak@UTbE2W!w`OvrY1aQ1Cr%@~;Zz-`qm?P!GXYx>)y6 zVi3k>^iZYgA)NmnOIkE&KgAM#EfH%eZHUa-oMj}j-%1=tf_a8u)wvrD;fhPe?j)U@}0O z6siKE0$Js^JCT0fR|;w1g;FPw5Zt;;(0xOuuZyT72mh?qBQqy4`^^qVFt0ls}yVw|G@c##FO1G^R*- zaDlpR%ttfOnD56(W4`#aH0B#vQiCr_6IP*wBx`EPfvGO58fDThavkoRH z+8+U!!y?oT>haBjXmENA@?*|{ZUp_YA@O0~6+SYnZDc7{P684(cm}Z4+FOKje|b?T zw;IOV01fitc}taLafopmL;2*ui=x;W9Z2gBHEcli{-N$l8n!V3f>ZYhXF}{DivDIb z_+IuWje4H7EF4!l-Q}A@O1gZH)Z&p}RpV~!@+EZyS_qlb185NtT&U?<;()(KO9b;x ztY++c#BPIaNVck&f;)B%#ZJhr1S+!nUYHP=sCxjNt;t|((m7LW%_-dASQE9Hc2y)1 zV$I9}nqebULrIc8)2{<Fgv;`qXDB|I4#peW zKCPzPhked^&ehnpAlJLVc{Kt<=e0P|;U69qz_6Li-@SvBFGV2EjvdNR^)0oPpUQDR zAbnJ3eAD-C6t?YGO17m<9pK9e9-@g1jvavoSR_eUUWb2HTG<)M3{c-vGeAxAOjIxz2C$4qJVh*-W>>qsdl(YhpY&}XED2aa<}vNerI!2&W>Lgl zo%<@y+hCsz&9J@{{wRVG4LT6bsRm!Q{XL>(*@z<)pq-t&0KiezdjKap<9|c<(7&KU zDsa#UPd9V-p$1o&?;DPDmQL7tcev1+8d3tu%9j5J zg#sd5RFPGD=cE!h@HK5qhh-NLFJ4)}L3+jCL z9_xc6QUBB-qau1ty)1zTE&MgRG^A`4devsZd&SL&JJ}2*QbDAu&n(OJF_337e@>w5 zV<1nT(SatyzJKW%?E4Tzd!z$j*ZZ#4_6y}_ynW7B5Zx4BdN){K-bOimLdsYQrY=jr zaScmb_Ux~9fZ9C}{~-ldEoKS73u(WtC{qihtmEhpA9!_<)>P5=9P1d!#~EFG{po8w zU&6?ww^3a2*m%0oN=xx9_;LZVPpxf%g>|8{~fR)2+5_-(`O63tY z0g?~GaRMeVG_n?N9NHh&<*Sfi2pkK2#Wn#UaiC4#cO~@|Gt)t-%ca>wTMw6^EC!01 zTqE{qUU^-HP3!w&DR{>0>zh+9RX;r+5B86msY|^-Ntfcp!HU;NHY0zzQ#iOgoS84; zTmNbiuwiHBl!aQkF2`3nm*(v5^b4fmqC4Ba~YP*dY?~6S)0~ z_Chz^HvGJ2^DdQo&LdO`Vasr>6Cyu%Z!B_|EjC1J+z;{86Qvw}9sTqT$`&dm zZKOF1%u?@l<7AydVu_A!rL z9gf1$n2WJjLre{&ILZ(6HyE5_jFkrV42LN zq9e)yU33URBR&Y$Kael`pc(Q8GrCpnR4*V#G8TZPe}zSvZb-DNZNbr$$i$2X6d@helne)HW{xL%_iDUgG9N}GQjzXCy#3h9gXB$dx zO6X;H${j4hHZJd{qGx~Wf}xX>*&eLNEb`MPfZ1~-!drB6`R{_me4N3G#nfEBW)JGt`>XcKyYLOW zF(M=V58!myVq)gR==N2wLdunW%I=|7$|PhIT|3RqB`0b9(*)9*><`^vP1!(N z8!ssDBbwGHpJ#({+I9{>&`w^0T?#(5esDeco6zt|hG9tq@^VoI%EH@-cv(dKl0?0n zM7`XT^Q6?#0z|!>CUT6(5A(fy1pX4~%za=M-Ly8XanmQd7d4v3SsazUby}V_aQSV$ z&@O2d=I5R2sr76ZOqT_)Ug@V=R(h7Jk&-+l=8O9v0M{(+Gr>pk{Cqtx&i}KE) zUI-UG z=f0{*?utzu?;Bla0D0%H!B6uG&b$cD5+a6F5hBL+X-;-Gw{cShQ5?0!I((aYq(&2? z$PgnuE*vr%geb7bTgzk++L^u0K5s26hOE#;fh5VN8`@_H;+oylBFf4;B8bBAyY6a3 z7fz1L0K?&ZN_vuXL0Z#g(ef}|Fv^(^aTF`INCBZthr#4C5mg#v>~zSwk`rJgslaH6 z&C~ELE?!j`bfALeIvvlZr$!YxpEX(L$Oe|Uz`fDSH9h~)9R~9sw0&s#4nO}uEi6YX zgo8NUVd8t;sI=9JAAGA0^8snvo^xUbSvL#1PGCHMZO%=Nhs&bhcI!BpP-py$UB=0C z%RJJK|EP16^J&S%;eR3tW5`5~CiVWcZ2LZ0L1W-|8bpjyBjg^{WPJ)7YY&5?zm(qP zgP@koH_o+Y)3Ks$Kgvf zZj>7%s2WZR{)}%`!2ZK*!av~CV$tJiQ<@LRF7I_{&W=Br=3I`TH$1_;5Bp#1=yAX} z52qp9V9>!(#gQIpTMV<}@6nHa@Zo=dWgm!|spZpvbAC~8h)xo?q>-PBv~OzT_LW(x zG@HmN*ySCGCLa2|G|}Zf3p$WAQFYY~#NH_DfHDcIet01wfnTyeAv{z5!r)H$cOcm4_I)-^5{@l(&s~v0Ee3oLN5D=ZY&wv<&y#Dqik__)<&ghKAVr-1&u>t=|lWm4e!w^yh9g z0VesX8T)h85;OVRJors7qMQej!1&wSpV)Nz{&$##Jvn^9rQ%5fg&ekWr9H ze%qtd;ZN0@HG-!whUq4C@@aw=$0v%d(1kjftEk`2902%R%4+}-Dg};8lv6{+IIG`W zzK1V2=O)H`a$XfE&`xaa9|3}hkd@O43G9yxew?*94Qc;?Ed!yTsc~KL_h;{K)qSxC zGh9poM){U~misLGYmUUM8xnD<9d$(H{J(xD|JvuCgVh~m2u3hxb?N}>x{p9bjAdRV zbs_l##M|h_ZCf_)Pw){s5D&F@izXQcu?*}K80!-r>Idy?OvfJZ9qHE^=Z8<1gNP5| zqOb?zgKMBk$VgJQ9mnf=f@2>woz&nnsN|xkO43k?UZ3fTfFOE2qN4bRa7$mO=UU;I zH7bg#<~3Hs&Sd{Cc{i%2ryJF@_D3|QldgqYK)4px&;5soE<;W4BJ&2P`P-v^wZt@q-AUwbweQ4aJqw%+S>8GN1V=9PK zqn3*q^Cbt@^E`wD*2@C3O_>hi+nL~@duN1n?_NV;lBXZfKE2wU1clWj7cug>q(Th+ zTI;B${=k8WlW!kkQGz+lWJVo{YHepD?gAN&W>;;$GUvO#<&vY~&

~`<1MI{MPv{ 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 z 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

  • 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

    tmO?xil{)*zKM}z+`V?heFp!_jn>>y& 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