From 26951364cfcc8a1a8ca48db19ce1d9e851c0810c Mon Sep 17 00:00:00 2001 From: Adam Chalmers Date: Thu, 31 Oct 2024 11:43:14 -0500 Subject: [PATCH] KCL: More simulation tests (#4359) Demonstrate simulation tests where we don't care about visuals, e.g. the double-map test. The `just new-sim-test` now accepts an optional argument, `render_to_png` which can be either "true" or "false" (defaults to "true"). Tests like double_map that don't render anything can use false, rather than rendering an empty PNG with nothing in it. This means the [tests under `no_visuals/`](https://github.com/KittyCAD/modeling-app/tree/v0.26.2/src/wasm-lib/tests/executor/inputs/no_visuals) can be entirely replaced by simulation tests. This is much better! For example, I moved `double_map.kcl` from a no_visuals test to a simulation test. Here's the file: ``` fn increment = (i) => { return i + 1 } xs = [0..2] ys = xs |> map(%, increment) |> map(%, increment) ``` Previously the `no_visuals` test just checked that the program ran successfully without panicking. Now the simulation test lets you see the value of `xs` and `ys` and immediately see they're correct. If our map logic changes (for example, we have an off-by-one error and don't apply the `map` to the last element) it'll show up in the program memory snapshot. --- e2e/playwright/projects.spec.ts | 1 - src/wasm-lib/justfile | 4 +- src/wasm-lib/kcl/src/simulation_tests.rs | 62 ++- .../kcl/tests/cube/execution_error.snap.new | 7 - src/wasm-lib/kcl/tests/double_map_fn/ast.snap | 234 +++++++++ .../kcl/tests/double_map_fn/input.kcl | 8 + .../tests/double_map_fn/program_memory.snap | 171 +++++++ .../kcl/tests/double_map_fn/tokens.snap | 369 ++++++++++++++ src/wasm-lib/kcl/tests/helix_ccw/ast.snap | 262 ++++++++++ src/wasm-lib/kcl/tests/helix_ccw/input.kcl | 8 + .../kcl/tests/helix_ccw/program_memory.snap | 151 ++++++ .../kcl/tests/helix_ccw/rendered_model.png | Bin 0 -> 125082 bytes src/wasm-lib/kcl/tests/helix_ccw/tokens.snap | 465 ++++++++++++++++++ src/wasm-lib/kcl/tests/simtest.tmpl | 2 +- .../tests/executor/inputs/helix_ccw.kcl | 4 - .../executor/inputs/no_visuals/double_map.kcl | 6 - src/wasm-lib/tests/executor/main.rs | 8 - src/wasm-lib/tests/executor/no_visuals.rs | 1 - 18 files changed, 1730 insertions(+), 33 deletions(-) delete mode 100644 src/wasm-lib/kcl/tests/cube/execution_error.snap.new create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/ast.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/input.kcl create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/tokens.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/ast.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/input.kcl create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/tokens.snap delete mode 100644 src/wasm-lib/tests/executor/inputs/helix_ccw.kcl delete mode 100644 src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index a280996c0..e45c173b7 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -1490,7 +1490,6 @@ test( 'function_sketch.kcl', 'function_sketch_with_position.kcl', 'global-tags.kcl', - 'helix_ccw.kcl', 'helix_defaults.kcl', 'helix_defaults_negative_extrude.kcl', 'helix_with_length.kcl', diff --git a/src/wasm-lib/justfile b/src/wasm-lib/justfile index 752959131..58c6815a3 100644 --- a/src/wasm-lib/justfile +++ b/src/wasm-lib/justfile @@ -13,14 +13,14 @@ redo-kcl-stdlib-docs: EXPECTORATE=overwrite {{cnr}} -p kcl-lib docs::gen_std_tests::test_generate_stdlib # Create a new KCL deterministic simulation test case. -new-sim-test test_name kcl_program: +new-sim-test test_name kcl_program render_to_png="true": # Each test file gets its own directory. This will contain the KCL program, and its # snapshotted artifacts (e.g. serialized tokens, serialized ASTs, program memory, # PNG snapshots, etc). mkdir kcl/tests/{{test_name}} echo "{{kcl_program}}" > kcl/tests/{{test_name}}/input.kcl # Add the various tests for this new test case. - cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" >> kcl/src/tests.rs + cat kcl/tests/simtest.tmpl | sed "s/TEST_NAME_HERE/{{test_name}}/" | sed "s/RENDER_TO_PNG/{{render_to_png}}/" >> kcl/src/simulation_tests.rs # Run all the tests for the first time, in the right order. {{cita}} -p kcl-lib -- tests::{{test_name}}::tokenize {{cita}} -p kcl-lib -- tests::{{test_name}}::parse diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 9a4116937..f9d84f948 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -81,7 +81,7 @@ fn unparse(test_name: &str) { ); } -async fn execute(test_name: &str) { +async fn execute(test_name: &str, render_to_png: bool) { // Read the AST from disk. let input = read("ast.snap", test_name); let ast_res: Result, KclError> = get(&input); @@ -93,7 +93,9 @@ async fn execute(test_name: &str) { let exec_res = crate::test_server::execute_and_snapshot_ast(ast, crate::settings::types::UnitLength::Mm).await; match exec_res { Ok((program_memory, png)) => { - twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + if render_to_png { + twenty_twenty::assert_image(format!("tests/{test_name}/rendered_model.png"), &png, 0.99); + } assert_snapshot(test_name, "Program memory after executing", || { insta::assert_json_snapshot!("program_memory", program_memory); }); @@ -130,6 +132,60 @@ mod cube { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] async fn kcl_test_execute() { - super::execute(TEST_NAME).await + super::execute(TEST_NAME, true).await + } +} +mod helix_ccw { + const TEST_NAME: &str = "helix_ccw"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod double_map_fn { + const TEST_NAME: &str = "double_map_fn"; + + /// Test tokenizing KCL. + #[test] + fn tokenize() { + super::tokenize(TEST_NAME) + } + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[test] + fn unparse() { + super::unparse(TEST_NAME) + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, false).await } } diff --git a/src/wasm-lib/kcl/tests/cube/execution_error.snap.new b/src/wasm-lib/kcl/tests/cube/execution_error.snap.new deleted file mode 100644 index 3765efbd1..000000000 --- a/src/wasm-lib/kcl/tests/cube/execution_error.snap.new +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: kcl/src/simulation_tests.rs -assertion_line: 98 -description: Error from executing cube.kcl -snapshot_kind: text ---- -No API token found in environment variables. Use KITTYCAD_API_TOKEN or ZOO_API_TOKEN diff --git a/src/wasm-lib/kcl/tests/double_map_fn/ast.snap b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap new file mode 100644 index 000000000..b628c8491 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/ast.snap @@ -0,0 +1,234 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing double_map_fn.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declarations": [ + { + "end": 40, + "id": { + "end": 12, + "name": "increment", + "start": 3, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "argument": { + "end": 38, + "left": { + "end": 34, + "name": "i", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 38, + "raw": "1", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 33, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 38, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 40, + "start": 22 + }, + "end": 40, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 3, + "type": "VariableDeclarator" + } + ], + "end": 40, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declarations": [ + { + "end": 53, + "id": { + "end": 44, + "name": "xs", + "start": 42, + "type": "Identifier" + }, + "init": { + "end": 53, + "endElement": { + "end": 52, + "raw": "2", + "start": 51, + "type": "Literal", + "type": "Literal", + "value": 2 + }, + "endInclusive": true, + "start": 47, + "startElement": { + "end": 49, + "raw": "0", + "start": 48, + "type": "Literal", + "type": "Literal", + "value": 0 + }, + "type": "ArrayRangeExpression", + "type": "ArrayRangeExpression" + }, + "start": 42, + "type": "VariableDeclarator" + } + ], + "end": 53, + "kind": "const", + "start": 42, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declarations": [ + { + "end": 107, + "id": { + "end": 56, + "name": "ys", + "start": 54, + "type": "Identifier" + }, + "init": { + "body": [ + { + "end": 61, + "name": "xs", + "start": 59, + "type": "Identifier", + "type": "Identifier" + }, + { + "arguments": [ + { + "end": 72, + "start": 71, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 83, + "name": "increment", + "start": 74, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 70, + "name": "map", + "start": 67, + "type": "Identifier" + }, + "end": 84, + "optional": false, + "start": 67, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 106, + "name": "increment", + "start": 97, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 93, + "name": "map", + "start": 90, + "type": "Identifier" + }, + "end": 107, + "optional": false, + "start": 90, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 107, + "start": 59, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 54, + "type": "VariableDeclarator" + } + ], + "end": 107, + "kind": "const", + "start": 54, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 108, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "end": 42, + "start": 40, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/double_map_fn/input.kcl b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl new file mode 100644 index 000000000..4179c641d --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/input.kcl @@ -0,0 +1,8 @@ +fn increment = (i) => { + return i + 1 +} + +xs = [0..2] +ys = xs + |> map(%, increment) + |> map(%, increment) diff --git a/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap new file mode 100644 index 000000000..3e588ea41 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/program_memory.snap @@ -0,0 +1,171 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing double_map_fn.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + }, + "increment": { + "type": "Function", + "expression": { + "body": { + "body": [ + { + "argument": { + "end": 38, + "left": { + "end": 34, + "name": "i", + "start": 33, + "type": "Identifier", + "type": "Identifier" + }, + "operator": "+", + "right": { + "end": 38, + "raw": "1", + "start": 37, + "type": "Literal", + "type": "Literal", + "value": 1 + }, + "start": 33, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "end": 38, + "start": 26, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "end": 40, + "start": 22 + }, + "end": 40, + "params": [ + { + "type": "Parameter", + "identifier": { + "end": 17, + "name": "i", + "start": 16, + "type": "Identifier" + }, + "optional": false + } + ], + "start": 15, + "type": "FunctionExpression" + }, + "memory": { + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null + }, + "__meta": [ + { + "sourceRange": [ + 15, + 40 + ] + } + ] + }, + "xs": { + "type": "UserVal", + "type": "UserVal", + "value": [ + 0, + 1, + 2 + ], + "__meta": [ + { + "sourceRange": [ + 47, + 53 + ] + } + ] + }, + "ys": { + "type": "UserVal", + "type": "UserVal", + "value": [ + 2.0, + 3.0, + 4.0 + ], + "__meta": [ + { + "sourceRange": [ + 90, + 107 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap b/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap new file mode 100644 index 000000000..fba06a175 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/tokens.snap @@ -0,0 +1,369 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of tokenizing double_map_fn.kcl +snapshot_kind: text +--- +{ + "Ok": [ + { + "type": "keyword", + "start": 0, + "end": 2, + "value": "fn" + }, + { + "type": "whitespace", + "start": 2, + "end": 3, + "value": " " + }, + { + "type": "word", + "start": 3, + "end": 12, + "value": "increment" + }, + { + "type": "whitespace", + "start": 12, + "end": 13, + "value": " " + }, + { + "type": "operator", + "start": 13, + "end": 14, + "value": "=" + }, + { + "type": "whitespace", + "start": 14, + "end": 15, + "value": " " + }, + { + "type": "brace", + "start": 15, + "end": 16, + "value": "(" + }, + { + "type": "word", + "start": 16, + "end": 17, + "value": "i" + }, + { + "type": "brace", + "start": 17, + "end": 18, + "value": ")" + }, + { + "type": "whitespace", + "start": 18, + "end": 19, + "value": " " + }, + { + "type": "operator", + "start": 19, + "end": 21, + "value": "=>" + }, + { + "type": "whitespace", + "start": 21, + "end": 22, + "value": " " + }, + { + "type": "brace", + "start": 22, + "end": 23, + "value": "{" + }, + { + "type": "whitespace", + "start": 23, + "end": 26, + "value": "\n " + }, + { + "type": "keyword", + "start": 26, + "end": 32, + "value": "return" + }, + { + "type": "whitespace", + "start": 32, + "end": 33, + "value": " " + }, + { + "type": "word", + "start": 33, + "end": 34, + "value": "i" + }, + { + "type": "whitespace", + "start": 34, + "end": 35, + "value": " " + }, + { + "type": "operator", + "start": 35, + "end": 36, + "value": "+" + }, + { + "type": "whitespace", + "start": 36, + "end": 37, + "value": " " + }, + { + "type": "number", + "start": 37, + "end": 38, + "value": "1" + }, + { + "type": "whitespace", + "start": 38, + "end": 39, + "value": "\n" + }, + { + "type": "brace", + "start": 39, + "end": 40, + "value": "}" + }, + { + "type": "whitespace", + "start": 40, + "end": 42, + "value": "\n\n" + }, + { + "type": "word", + "start": 42, + "end": 44, + "value": "xs" + }, + { + "type": "whitespace", + "start": 44, + "end": 45, + "value": " " + }, + { + "type": "operator", + "start": 45, + "end": 46, + "value": "=" + }, + { + "type": "whitespace", + "start": 46, + "end": 47, + "value": " " + }, + { + "type": "brace", + "start": 47, + "end": 48, + "value": "[" + }, + { + "type": "number", + "start": 48, + "end": 49, + "value": "0" + }, + { + "type": "doublePeriod", + "start": 49, + "end": 51, + "value": ".." + }, + { + "type": "number", + "start": 51, + "end": 52, + "value": "2" + }, + { + "type": "brace", + "start": 52, + "end": 53, + "value": "]" + }, + { + "type": "whitespace", + "start": 53, + "end": 54, + "value": "\n" + }, + { + "type": "word", + "start": 54, + "end": 56, + "value": "ys" + }, + { + "type": "whitespace", + "start": 56, + "end": 57, + "value": " " + }, + { + "type": "operator", + "start": 57, + "end": 58, + "value": "=" + }, + { + "type": "whitespace", + "start": 58, + "end": 59, + "value": " " + }, + { + "type": "word", + "start": 59, + "end": 61, + "value": "xs" + }, + { + "type": "whitespace", + "start": 61, + "end": 64, + "value": "\n " + }, + { + "type": "operator", + "start": 64, + "end": 66, + "value": "|>" + }, + { + "type": "whitespace", + "start": 66, + "end": 67, + "value": " " + }, + { + "type": "word", + "start": 67, + "end": 70, + "value": "map" + }, + { + "type": "brace", + "start": 70, + "end": 71, + "value": "(" + }, + { + "type": "operator", + "start": 71, + "end": 72, + "value": "%" + }, + { + "type": "comma", + "start": 72, + "end": 73, + "value": "," + }, + { + "type": "whitespace", + "start": 73, + "end": 74, + "value": " " + }, + { + "type": "word", + "start": 74, + "end": 83, + "value": "increment" + }, + { + "type": "brace", + "start": 83, + "end": 84, + "value": ")" + }, + { + "type": "whitespace", + "start": 84, + "end": 87, + "value": "\n " + }, + { + "type": "operator", + "start": 87, + "end": 89, + "value": "|>" + }, + { + "type": "whitespace", + "start": 89, + "end": 90, + "value": " " + }, + { + "type": "word", + "start": 90, + "end": 93, + "value": "map" + }, + { + "type": "brace", + "start": 93, + "end": 94, + "value": "(" + }, + { + "type": "operator", + "start": 94, + "end": 95, + "value": "%" + }, + { + "type": "comma", + "start": 95, + "end": 96, + "value": "," + }, + { + "type": "whitespace", + "start": 96, + "end": 97, + "value": " " + }, + { + "type": "word", + "start": 97, + "end": 106, + "value": "increment" + }, + { + "type": "brace", + "start": 106, + "end": 107, + "value": ")" + }, + { + "type": "whitespace", + "start": 107, + "end": 108, + "value": "\n" + } + ] +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/ast.snap b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap new file mode 100644 index 000000000..b54c1d1e6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/ast.snap @@ -0,0 +1,262 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing helix_ccw.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declarations": [ + { + "end": 183, + "id": { + "end": 7, + "name": "part001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 28, + "raw": "'XY'", + "start": 24, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 23, + "name": "startSketchOn", + "start": 10, + "type": "Identifier" + }, + "end": 29, + "optional": false, + "start": 10, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 72, + "properties": [ + { + "end": 58, + "key": { + "end": 50, + "name": "center", + "start": 44, + "type": "Identifier" + }, + "start": 44, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 54, + "raw": "5", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 5 + }, + { + "end": 57, + "raw": "5", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 5 + } + ], + "end": 58, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "end": 70, + "key": { + "end": 66, + "name": "radius", + "start": 60, + "type": "Identifier" + }, + "start": 60, + "type": "ObjectProperty", + "value": { + "end": 70, + "raw": "10", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": 10 + } + } + ], + "start": 42, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 75, + "start": 74, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 41, + "name": "circle", + "start": 35, + "type": "Identifier" + }, + "end": 76, + "optional": false, + "start": 35, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 92, + "raw": "10", + "start": 90, + "type": "Literal", + "type": "Literal", + "value": 10 + }, + { + "end": 95, + "start": 94, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 89, + "name": "extrude", + "start": 82, + "type": "Identifier" + }, + "end": 96, + "optional": false, + "start": 82, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 179, + "properties": [ + { + "end": 132, + "key": { + "end": 128, + "name": "revolutions", + "start": 117, + "type": "Identifier" + }, + "start": 117, + "type": "ObjectProperty", + "value": { + "end": 132, + "raw": "16", + "start": 130, + "type": "Literal", + "type": "Literal", + "value": 16 + } + }, + { + "end": 154, + "key": { + "end": 151, + "name": "angleStart", + "start": 141, + "type": "Identifier" + }, + "start": 141, + "type": "ObjectProperty", + "value": { + "end": 154, + "raw": "0", + "start": 153, + "type": "Literal", + "type": "Literal", + "value": 0 + } + }, + { + "end": 172, + "key": { + "end": 166, + "name": "ccw", + "start": 163, + "type": "Identifier" + }, + "start": 163, + "type": "ObjectProperty", + "value": { + "end": 172, + "raw": "true", + "start": 168, + "type": "Literal", + "type": "Literal", + "value": true + } + } + ], + "start": 108, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 182, + "start": 181, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 107, + "name": "helix", + "start": 102, + "type": "Identifier" + }, + "end": 183, + "optional": false, + "start": 102, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 183, + "start": 10, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + } + ], + "end": 183, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 184, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/input.kcl b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl new file mode 100644 index 000000000..2c6a03c31 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/input.kcl @@ -0,0 +1,8 @@ +part001 = startSketchOn('XY') + |> circle({ center: [5, 5], radius: 10 }, %) + |> extrude(10, %) + |> helix({ + revolutions: 16, + angleStart: 0, + ccw: true + }, %) diff --git a/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap new file mode 100644 index 000000000..3d55ba52a --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/program_memory.snap @@ -0,0 +1,151 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing helix_ccw.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 180, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 90, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "UserVal", + "type": "UserVal", + "value": 270, + "__meta": [] + }, + "ZERO": { + "type": "UserVal", + "type": "UserVal", + "value": 0, + "__meta": [] + }, + "part001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ] + }, + "ccw": true, + "center": [ + 5.0, + 5.0 + ], + "from": [ + 5.0, + 5.0 + ], + "radius": 10.0, + "tag": null, + "to": [ + 5.0, + 5.0 + ], + "type": "Circle" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XY", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "zAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 15.0, + 5.0 + ], + "to": [ + 15.0, + 5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 35, + 76 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 35, + 76 + ] + } + ] + }, + "height": 10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 35, + 76 + ] + } + ] + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png b/src/wasm-lib/kcl/tests/helix_ccw/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..10e6d789ebe9e748d5c0af37c408257ace56ab2c GIT binary patch literal 125082 zcmeFae_WJh_CEdqDybQ1TUI8RQtoEOZf#ewTdf~BWlz`JO z#60@&uhRl9R0Mqz{@V}sTGiCn<@*n>Q|c&tqHdMvgX;8s>SJlyMOlKsJDZ+H-9uI^pGvN>VcZ54^8WO zTX(cQ6PGRjDL8Zf=$7inHTYKf%=GLnv#T2h&9f}*I%cd-s53qZo_zXYZ+XONO6Bjm zx$)4N`$Nk4+cWvHR_$erN}4|k4*K}Pl;)j^JV$qQYdK!+#zwqWabSI_Wug1;g2@?| zZc)09rCK&Bv#SfrI{9P9x{ho8!yya4TD;vu>GYUS%loWYbN}qnOg@C2&k&eq9d5GL z449D8d}y(}zOCq0Ytv(`smFKqSMH4~y{2Nx;NfYXEE^s%-;BRH9vXh{vyDqi(yXJa zt8;D`YhV3wRC->^>rIsdLr+)c+@SEw-nA2w1G8@!`-C#D<7ABM0a>Gf!+7X(SfJE# z75w|$(JiwJleuDp=3P2}bY>eD(pW7r2jUHcR(el>I$jnf;PA%}+8T#vY#yF*PxhS8 zN}6}dx2ySG`O-01e{N+vo)ZtOG&b#7_H1d|(Cop(?^WjE{khB&lbiY}V`B^YHOga8 zNPc70*x0~%cq2~~L>-W~rY*Q*ceG=7lI@pjdx+XTN!GmYB_HFz*|D#B*4ew)&!tp7 zpl!Y5#fVEU7F7*S#`7rmKD)hQ&$8hq^Nt59!z1EO@`1O{Tf}w$##ErM}g+49~+TAsMy1 zl?hl}evA~Y+q)+WOyVl zSZv03M-)Dq_C%lcbZx0p2lzgc=ZUg3Yt)`g*5=Ajq(=YQ@BB{v!gFZNSgYDOvYlD5 z#mzOc$A?mQHk8cRwD{27=V4+*xkebds(@8Z8aCD_@W zDL4YXbGdUH#mo#AC!f|C9EoMA-ySBt<}o(yaTdtQ);@3U=1I^WivLaj?nuGjr)QLn z+SXkxM?to$c6aDrm{%JA`@edcH~gOFFXB4IxoPWEhJCZo(LT35ivzkJW|Z#Pvw}>fkfwCTs?~0t?wRJW{xSEQb+UXZ_F}Yey z*U4$(IwXIiMr`Xgx57}O&c6_H;?E%qe+XlivmWv)J!TI)QHa?of2VlAQDyLz&q5xs z;Cj#DQe(wQ#`kWG?=6et``j9Teox%_t?AixG4MbIJ^x>m#?3E;T0H~DZI{+ zB<>JP&n*b;`D$qgEjIWInyC}ZzSQE9zq_#!8{3+_MSIgta4?hK_SBoyrE-w*?u(pp zO54RJ+AbcA5`Rat#PLm|If^?mWAW83N1M&x(a-6ASs zt*}7f<+sf=ch0mJR^Bw(@2#)6!dvggffy`y&sE>>*@97c<%lg+gHw!Fx7yUbx+TjS zb=p){o9RmLJk#%;&(+?!Y;=6fYjG`QaoVQ;P2Y4LyK`pOId1p^bq*5)Ip6FfVLiX{ zY2JNMR6gj#rP;V`-7tfg?A^Tw`?F)kGIAoPam<#eZa& zy83AIr)ph-&9sLLUa~slLC>l4dF@L{>ZLA;%3keAXBb_y@uiRdk1uU@95hRW?KCfj z%c-87ujcSwA1tdsXr+lSopSNd^=)EVz1oUTHC>z|7Br)r3uWnvL4;znj-cADo^jV4eciT((8wyq>y2?E7bwE=4fO?!} z&ygxN^%k33{Ltj^kv?&`GkW&}HP6}_@p3g;MR>W?o`ixky8DbZ^&D{r7iavee6>2k z=J*)sic2bQ@>E>wsqGe6QMBU{EGlVXwfr6F@l{W&_xY}^xkg?uHFIC8 z(q3T-3QH%=>{uRXB=%-C)GJ- zKL|H0%gF

Trm|7M-rVdCEz8kF(?OqbbjO*Qj$5k9vq5TqpUOg1jbu{Wu`==Piq zE@wi@H|msa-D>4{^>+++v=i|Kc(VZ&Vk2Fey@>6M_t=X%!`JPZN+mhC!0@PQ$5H}) zgxV3&U1f1R4zSR@8BxXxkFzFG@|LKJe-1g-8LxKott#4yi|$z$-SeQhUeDoEEq-S& zS@uq#Kq}F5?VKQGa_JmMhzdywR& zJrb;(cw6fVck5uGQw{L7jwH!Z?LZ1!E$7xYoLM_%1oJ1ysd(2N=I(s+0sPC(zX0_| zZtE_371j`U>G$y;)R>$#!Hwcd_<|Pyxa@zZEzKh>){)WY5S3nQ=oNdU32rd=jLWh` znpSOanLfuJbtc%?_)yPfcA-;Zf!I8IvRM z8uK0YWW#D{Fh-Wk8(P$1Us_M>^B$+)7uhBj*%}IaOA32u${UD)Z-*ZXvo4OdFaAHz zjN`7~8Z+%@!}8vHGd%qEfqtK=tNs61rTXfIZ{ArS?L4E1;olyTzJEG1EBhP^5Ki?3 zrXXIMAMR`O5w+ruwc{m6Eis$F3+_2HSUnn^{Eg{eK$+;mM3;F}m1#9Y-0MkQuggmr zVvS!&HBIvM`rXX%H`i!>L(;C&9Xk%jx=zM+TwEW$7Ry@weEtU4iP~oMzB|RskwRH0>zLs9vV1*HGfr&Sq*%DCTy13r9*3!Ke?_7NuXEy%je06$) zt>`t_c!TP+6!M*DznHF~O`x}j@98uTJ!Q9^@GM*P>ynVInsR1U)>*Og5sh+C|54cU zBW#&zlHWcVch7GAh5v54*01u}-OxX5{higmFS=mgluMiI=O4T$By0a8p&kFC!@8ej z%Q&xx9RH^i`*OW-O$aS}e)*aFf-F8{8q74zu`}#sk?U*`IirHreb^D7&lTZsVmazR z#N=LdKh3H62ga5CYusczvWq=&87V0?yZGztyiaqdS4(_Q1Elg3I~30jIOa@i`cyR| zB$x}rT^kc@=9S@bzuwl}Cg|~Ok!w(PO-5NwM!P$B;eh658D8NglR*m%kp8q@6&e!%qm!GseyX8@zZL?SZ^LHE5dX5xcS24Y` za{6tnD@m?6#D)xJ8DKOVb+-G!UyLcd_>{Q1JrT}-MS!nSkHlQ*kc;tH)kXgM=13al z>kpbNXV1i%CMrc2e^GQ%Bh02wow|B%S?9NAPX^ahxPq=q4?OAyL0xTfU97A)nuAzT-?%81d9P_IjhrhPK0E&FOKiIr8;e|#TVf_W8X6R zTQy9BNLt7Z$ZSc?8e813V4S)triqUH*-rB^aXjkyqTVlx4xTG-JvSc&4_1NGi43aqiz+?GlLV0k=Jc@A&NDDh(AC z+21L$kJI)rCpL35-y8PX{7xUQ>hr!U)u}#T(;4Nc_xSCxWA@CA&qO)T#J2n-H~rdT z_@%`G0uWO@T(oQKUv7)e`q-UI^{7n}{AXnDnc=umaGrIa$+3@4`02}D(7U2m)BBe_ zv7dc8GB!RlE>yMevwd3B^Qk0B<(=QoRGUes8*JbaJ+`a4nPihv1L_x?+lcH$6_B~? z37<3V-D-7)UtqNt`g-lO7hX?I)gUJ+D9vO&ysIt`J2E>!jE8OsP}!W*$FDa$of_}^N_p>9ssjxFA77i^C%}?p zC5MHqn`yW=qK11Ss=8fs)!Jb{cI>&V-eQxmV}oKGQ#VzqcjVb?@Sk7jr9D~OY+(Xd zoCe&mOGp|+2o3M2dqq>d80JkCvFgQGo4V%v-;K|M_q|t@NZ0!^nt?G6f1lZ8y31() zj_Kqzjug6HWfABTjSJAD)Tio?uF*eNH)+ct`4aa*Lc~x%oAh7zz8}~7UAyHj@U8Yvyyz~Uv~hO5%Q4wh|u36-ma(dN_~OZhW)pS**3|% zSp0cjxN97s@t7FLoTJUA!7-&jOt3}o*;w2#NJ@Z*Jn3I_|DEp7onf6qN-xwg;mo8m z6cu|e$D)Skbw&8XQvNSTtTFWEsCVtyvBPV;TJ^?jy#2hE_HX%r-@^IvjSwMq{^jyt zFWXiLOZN4DuJw7|t-}9ujiDP?N+l~dc-@CQ?tW^SoYpWzBfeEN(eS?hfBuw7lhM+3 z)3loX&RdR}V|+AgM7qFBIlcx?q@UL#e4^!O1+M_*4}U-WvmW)~VL~Ofgy)zBgXJHc zGn|CM%F4l8;FrCIF-Wf{_e8sk$4r_><-jBm=+xgLHO~omJpgpRC_L^5+qw%I|Ml1D z?)5f!$A@(4%N3&0KY`m3g-MJQgHO229PXHJHqL;{5M|#45{_?O3nvJ=z zPZw0F_Wxdss5HF^f2c^d?tQ$}bvhDImp=E!t2ydG98)!p^xo8A>NDHAEk7R?aaWxq zc65#@Co%3rBvKlg;!XT4%k|HlVVaB}5b4VX*8|~J%g*sL7KOXEVvUw)YxJ{WUdzAL zuu0`@Vb=nx6ZZT(&z_6aGbG$v^g_ORCfxcLq|xj9c;V;(?+*Rp=C@`p3g-Ko9PH=m z?W=2>qYo|)b3Cv3b9G}!>99;)EIDJv=2`o;pN)R2uN6je6xyeantam^YxMiZf9~2C z>SzoO(lTdn*5iHnFV0#XA2y@x`8>P%@c0>Je+aiG;e99KeSco1hUcZd017$EzB6Qi z&`bJTMg|>dun?i?M>OsX$@;OM6&R0;8w_nf>l0S=!{!H-n$-I*d%KnDoj$+5QvHGc zH9+lcA_UQ`;ki!ld&CijrrwH^^TaT9Se+v^ZA0;balnjg z{+8p%1P(O#`h6=#o&bftU}v}$)lzkwwot#$lYRb<`@AA7`fy1~i@vuTT>C!pSb6YT z2uvPU_T`4PutbQ2>wf;6D`i@f<;(Hv%$TOf@Jn9_w?=HPT6XrY@jZVfN{!9xSOxB{ zJKw9(aIH7|QsK>;*TmT#h+oy#Ti$lUoCi;1t{xA7h+n)5O!>5?$FQw2;nrQX%~?gA zzboor5#iVs(f(GF{Vfk`qRzTr|6F}otA7XstFWG$*1kCGU88CBv9%Htz$cr0gG1jx z`PqUvefM-5u;QQ^f7lw0udOWHGHF>Kb?Qe^-3Ma#UNZ1wPyI?~>(s@fF3^NDzl`Y4 zi#Tw9f%RI1Y!d?URLBy>YVhkN*(~!eFn#G8YZlz2WHkn7WzSgf*BMQ|#TU~cgNzfTc~KVje->0EcvWcG*`%OZ7? zJ#|XQO5IkTR@ZqqVV!ugkam`!S7#nreG+BEr0(2sSjCB$Ces+!Syxq>KS*>%uBu!H z(|l@LQ~z`x%sFM>&IxEoji5>?Z5mfTS}VqRU*svTaXv{sN;^bM0crnQRnV_uPI>bj z=G#};2rLPHO;BI&+Y9x$ZcXaAKAg_ajb>_ZdmS&-V4G}NMSzcD)$;XII{%?P^7<#% zHu)!11{*q`oSSi5Y-ZC9559Kx2S~F`hv4wjK)9#SNH6zy9z>SB!YeM zY&_dmlW$&S1qv}NzUv-YAkpuDDq-cQf5rHui$725S5fUcU#&6#l;&$= z({|mU;ITt@7CH_Tw*M`u=Wk;0in%Mpyia`~&yE@uR3dqmX27Q6yvk*8n@UsJL6EiD_9!sIPUmYgwqiGCm3KaS;2nuTI(My@7-a}e`@^`*0-ld zy%A<#6s9!Z5#Mn~$*B)!+Kc}ak7if__ou2wcWvK)EIm7|ZEDVjxCxgTB0zPqZvrl$ z+q2S4k#C5$-XLH<3w}LmKjedU$W0!js*XA}11tRl!wQHR5P3)Y-=|J~XY3SfjuO>0 zG`G>wZF8XPdLKjHJq=CwFnszws2r?i|0B89$GNgweEyX>l3_EWbYF&e4j!$Jv8Fs` z-t}#Zr<`6))m`+(N22>xtP6Ag!JCH}y`*qFiPrw?v=#QEd7kWm}=1>j9e#)IWEIy)Lqr(^I2w%`Q~C3xgYn=BD)vG1+%_GcIJE znvu0+*1i?i<|J1$XzWt#Tc`TI@w9m!s#3kt=oDbGzG+$IvL>PqdZ@!ZDR~w3`qOyj0Jai*E#uz1TF63y(?m3R8;-si4(uL$l#phtQy?jO%~C`3W=%%Ca9-lTh{mVmJD(1)H?%q97~v1B8r%JDwf$Npt8<3w{dng$@u&2V z&hpRU!J~a1?>})KGbWq*c%$F{FO$C+?7I&9aXXSN<8QJTHp!_!Se!Xs$pY2Cw5_|K z?RZI9>$&oKDH5P?iyET=*@>a>nR;dqr*7cnqRu{<3ultnPvN_*f=A*>4(s`I*q2<4 zZ{nR#XI-3X`ayP0+VYx4Mt`@DL&Ww&gO|HdyE@J1k!kThrd4VB8_y1Pu%#!bmxn8s z-ZINU78ly<>2O$c4rpf)xW4Vicd_UomnL6rax6%a>gbEKTZVX_39~m&UiJ z-c)40wP+{#$CUH6Ke_k0FDknhTDq+7&W>8#(voPolo(*AibQmbW^(%dG7Zj<@YOi_r=HIlpFOB{fO7-EhQD)q}Z}JLOtA!k% zfaD}M^W>N{)h+d}*Ck@h)YptAq`x;Xx_)#$Vz$BmH)S!#jBGeQGVLF$7yL-c>Pj`O z4pXgRvq77*P(1fq+M3nrweS=Ek8A!tqg5~VmpbWfo2$T^ zPfCUoItyah0yuKp9Lc5h)M|q<-Q34?GstwEO+|hldFO zVaN??9|0j1v__5rpdw41b>_(^O$~1A`K;|rd9q+rdoU`8OT%4bH&s1dU1+3iisoU} z+iyy;-h{|~Z8lu7rKKyYt!q=2&4$hVuxmk4S0I%hgo`IxT zq_0IF-ktobC^I*Pu}<};^-)V^Ec|B1slVmVZKB+TYi@-;bVxRhzlCytg+4yS9u+z?ML`n#q6A6Fj$G17T8Er6Y;cI z8|2yZ;rZz-ZqFf|y)W8j{XaExLY=3lrqF_iMOcRs{Ft4uGuP`|ev$(^$r$9^@(xLW zm_|!#rnnkIT-hW9j&G}*d!qk?ub;nJPCOBvg4HNrig0FbUX)}(oobVkPi*XI^I+xdnun)7EW)$ztx zvFCQ6igvaXEarm*3<0%ubtfPRnQez|;vPN{TpBrt;?}Iju%tBTOJz3}L2_SIxsx)z2Z z!~^*DS~UTkC{Yc?fPp>|sNV}M1TY+LU5CcL-QBhpIs9KfRj>=1fl7W*P&Kb*ZR+Pc zb}W;_>t45%-9sYhIXi1?T(|Db!`QzK-wdJ~V2%k$?0TznLDjm@&L5%@bgN_y2pIE` z0dsLtmAc!1VRV03d6^)^HC6&k4(!@CsHlBVY2A*p5zNFD8doY@wf+70?i(*%x@2F? zXqvjPCiT>JbBa!(Q0B1bsuQq~rh|iR<)F-!OeA*Eh;fzUDIBim`_pPBPU;?_ue@0K z`T6^#n`a%Bp$AJ39c(94&zJ~U`Z>=3fz_EYp|19&@C79(EC`az`R0!-2Y(5cA9 zh#s9_1H9ap-`s6K677UCfT@Y)iecq*fbX3VP6%ozwmF$|m43IO>{j-)9-h?p($?Rx z7Zc|SkuqZEkjVOq7dK0aDHgFAi>Je`o0j#5X7&+LPRt6m-P~+@5Iz{|rNEICAA5a- zY%ES9$qpFv5c!RKUt3^g=m)Up`swoe^lJa3+xz|>KvB6bFAC1mC$PE3l#$dyD?w2; z*Mw+6nYV9bYCGYZ!y2ak1Uqx;vCcmhUHW5b!@06hMFIhtn)Zlv@Xv{W^Kk>RMe0&}0r&@EDt5$ujL%1=*87mix)a@gcF7eHr2aF02s`;3n^6Rz zd0>BiXxhV`6G1o>)v+@7B*+*Z3L3X0Ecmaf3YN5FWu^1=*I!S|FHRr9=e;eP{XHkU zzz3zjz_el#G!wS_B5e05NV_xpiznHZ4*V5?B!Mjrd*+uo3V;kd>E^WfwKeiiU!3tVXQ!-?7${ zW20|TVxpo+JA$Pt+ur)cIcBZQ7U>E$El(6RzclG_`3Z#2b@t5mSJV1p+s~`2s!nKa z2?tMg*hR|EPAsK9y=5)3*8o(3NNnYK+FwN(t!aW302?>BlJ}B1rG=JGB#=(x0-lH^ z-S_$tf)Smw*s&dX3RZtkQP~H;)Ne^H$(>$P^>Tey?}hJ87cY~dSDK1RXn~gRC_T5M zd>k|Bnz)R66htZ0m(tP0fWb^2=d8Vt@lyFTk3;M%wk zS*6KD1#}c161;o)*$w6IP^*!U0@Ik%9u)l^3tUnO;JN{mwN_KyWAZd!g3k6u5YnR$ zYHFeR)<(t;OgOlfm}_$tQOfNDv9D~(20CF&@C410C9{OVF}-?d82rUpxD{})jv+{9 zNAlzHbq%Z*Q*vbGXUq-D^`D4*d99Bm@zM4j;ZwPU_6^Q#0q=sv?6n6<59zc3j z?(?*!C4yQTI_|Ly%a#<4u{V8GT`8V?5((9*StqAXFu9`SK+rN5R-rVLWXM(D)a4D% zXbqk$1biyrmI&CFwPHs4`!kM{YOStjAz@4ooAyrXja8@&MF(U<*zpDnMUySI$qDmpN|{N(fw0!#-8>rk{}(^`<{EEJ49b8g8JsKr+|GW#KI&Ao%Tx9Ce| z`lM!3dM^~){sQnn0}>u~58MOo&HLeK*h|mig3`g*mZ`{q z+m0SRdi?#kGw-Jzniaa+i3S1J+e}=*8x2(Il-j-ckVuw%zwPIYv4^qUZQi?rgm0!2iW2B=gXh~WKqqfNAt^WA#|oLSgI%>&)xj-_ zTny?obT`Sp`DT4>dBXIy#SbL}JwKvOvIK(5>nf<{DF*=%R>vROcHozBn5mFYY3_0I zact)N#mnHh=(yACPlTqPo1M9LcGR10J^;kqt;YU7^_=Jt%}|>(O--6RcRnN#E@Xxu zlINM$#NvOteRtS(6;BoR{5stF5C|3WdQq1)=bmC7M9Y{`m~w7oG0Jvu0a$)TOc&(& z6c-aWyswwH+`<4&uOM^-FamQF{3I-xSubo7l3-lo9wvR&QP_$RtE9rZ+)DOOwWB>rCqrXT|n2I9RPk(Y+(;{vT z@l3<{s)lz_3>iw}ccC})qj>w0c&2OpU_wx_mmb_vI+*EIKt-Fgq0MTGR&AxDwjohW z4^!X_vfcnY_+q{UqP-)M=s$YTNzZMlHywG!E3X?vdZ!xP`UWW@3-F+FBQI@LWcm#a zrp6eK7N>#zo;TVWi(cK4byY062{~kLzr}rpa zcuAo*I!4yd3ld^yd1S+Wr|V*@`X`>`^KEUjG@nFgt~s21?z2`|AyM>Ii1T`|3y7cF zHuDE;1*n2coTSG=iXMFch131N6zh|sBJqe!_G;sa>FF}?A#Zu%8{0tV!QU|YbWnE_ znXx7E#OkawtKX~SlcsPm;O zadEeFi7>k}Z6qE(LG;m005`Yf)J^=59ibJ&v?L0`tdfD+1i8^6L`7$0WN?N-5cy?0 z+SSJ>+7X!hMNU3Ga3toIcfYKFS0l(Nwq#98txpc-f7y@J6pbMl(U51omFT)hFdxh< zpq=bRRPo})K`{R9V8PPKCIZi>ae14nE?pYW>>&N(x-foDkS&Y?-wgt>`5U5ZrXCxR zoCMCRODwiN0xeMKkC_{aMgiK?Yo&dS%}vgR#vu*a^c^2Zn+m+X|85_&Vs6#C-#NO$ zd~QARp)@|z*vwsH=eZo|Q_gLfvh3|qqu;BP@)HR$MI<0Z?kkvZBTxC+Fg}4C2$rWo z1YB1^P{rhcu}T6ip&yQf1XYDx0sVRkyoeNr9wK6(vyr+xVgZ;2xUIZez&REo@$us9 z*-N?d!Qa)@1vL`ec<{|x^A zpU#{)ldMO-MobqtmHr8_Q2U!>+h?0D%~lv-B~U92!a$G-Nl7*aqf(~qf^)>U&;}nQ z7>Fl?dNntDHcozKi{(Dk($>E{bwOW5Anf0@!BYalqoGK zS?8cd3*mH(`RM4Ll0)^WFt+rT?}U#Ij1j>a!IYw9x99g|T`OQxup}!a(?N%^nSWw^ z8$qcZWZN8Sk=%O(M?|MZR5=eRBu$(jaz?oDC%EP-Cbf#9LVhkeIz~Bv{`|Znk4Gls zV{=(q6?vKzxODkp`~#BqbxCIQ%Lk(EYdrlGb0$T1cH+1)+R9erV6>LBgz^JW^NVekbB8(BjlzSU@LqSc5D+KW>#45Z{kip9k-;H ztrhg~q$GB0c|gLfd2NDu;~Ek5pzu)kAkx}G+k=IRxmnYiAiT%~0dbdtx}j-juCq2* zqm(r0@7XSj%iP;_%;J0wAwhttWK(jaWV_(X^zEXHLx!`RkyQ6g^iJ?;)0(pK(niUa zZNhnBAmDcKzuYpQ;MW^t(G2t4`-3A-Zf2))hX#QSc5EXFpa&8FBZV;ztF?Ukk@Q!X5_{~1cFF250B zJ%xriWR+r&jS8tE=l-cv@|ca&Z&CQibR-XU>&a5k5 zI6}>%Sd)#8oKJH6uTUnW2`f#70*y%k3pE>H?;ab5=}Vv>n9C7T5<11;5Vg~@)MwhN z_#uU44Lo5R8HU6+q5!>Vd3Zq`zK883!{s(3kD8EjAO_%#L z>L(E|%D`0!?Exm7L`+17UTyOd=FSv405E$VVifceoK4riu_2@F6h5F}R)>af#!(cV zzS*_lGkg@(F)Ls2uT{**<)bjMAU{08_LuMUgk1Jg5^@sp&nG2?)H$Z3ve&R&@>&Ok zGj|JD-~_6pqN~4z`w|QCW^ZM4-_Mvr=wGWLlDe1x)Q%h}q}Qg|2v0?o-T_wV%MqzU zV;=2C%8T>`nN!X;lXM%^L3aqF+e25mwGeQ)za;zGiWe$RT z7Qbjs)lVJ@v4RoAQPN2wLpVvXJ930k#CRe9+_EL8f@h5%i1CpPX=AFZv6YH`Oz|Qw z!d+s6WIC6c%6)}3a8L0%Jk>mS4__A&!Vy;kD$2SV4)Oze`a>Gn<0)JO=eKq1p50-t zc?t_7Z?$Y=9*X6l!^B9}x#D0Y$p=Doe=(r(>)foLax4R}r~>xH5>PEM`ls+fQ7FsWIqoI)JSd1dj@nLK+Mk zO&9RSZK0v_)6({{jDGz1?Z7XbMIjpnl2ng~*z2QktzVq`Y*tFjD(Z|A5)-Wt;isd{ z#KZ*L#-C5K@dL40_aRTv%|iQU3jKf^{;*9T4kCt? zLL^ffLqxLEL)(#Bl788n(PNS{sDh$SE;zoeg<19^N$;7|ySd@un|l5l|B;p)UTA2& z;2DtI89meoyPD=wQt_4|?2cyY`+CrAN(LKL=>cW3drQVX7@D>2A8-_|Txsqo( zJH#%|*f^2v2Id;>q?#mNHboDF0Gg_qIRwcNN%gpC`k7YvMbvwqv&}Su;#Q6=V)>u@ z;Y2{hsxm@S!taKbq0@$GXFTY_`SS{dbdkiA@Z3lmL{~Q*|4bpl8o=nRFc*Z|#P3Am zI~VriKIJ&vf|4~C&a5V$hy3fWhf@BfVE_BGv-AYyYU0I1_j{0U)K|^Tcd|CL{nB@H zO5ncJnAETXu$dNskDZ>M)$Kq#>d(VMr%pcmr1X&q1Yjze?l=*aOY>kpqp^$tQ%EU0 zn4K!(7R^AuxpLHD1f)FIO*y+xv9mxx?iJi30^)^q5&eM-KGt(fq4ky!LyCV5+_`5U zrYl+-J^MJuiNvblsb8EzRLtRaO})^aynPJ~gJqxjZetjpb$qzi1Hk#%C*{R3e|3S#1CFIlDJETpxU6{ig*%@ZKh6niXK6hp~IY~+QJTvLHI+6faTG@d^F zHX?folUFSgXwCvGeQkaHOLOKdV_g;SYXxhpEw6*if2yG42Ukj{Jf=dNAYOvJnRp47 zPRTrIR<-I>&JC-I2lz&?(qG-5F5AjAY1ia;)QM}l~Cy~9d<`2Et;$O=aX ze=B~2r3Y~J%=g#|#eA5#rj?`!w&7tKRhoX8_~(Ar+d% zFmxAf1-=j;1aQIXO&}0*F1I6@WdZU`_S_fqO&j1-LjM2&Mv!uCHoj^F?-5kNV2*=2 z3;)NoY~8vs%8C^$(DQh=g2`G$6tBKo31_2h1AE3lqw1pGVp>UL9v?Sg3T` zQi+8vr7~=p)kOFcFT>lK3bMpQ^Rl#1--b8H{Eoy2B|k=@SEwxwYYKd{KBR#^#uj&G zfNy9BvaKy>9;*HU^AISuXzr+gcDNpwG$J5-uHNKpK7oRwob(8z?SsFR380ga5ln^`h6q#|w#S_7i=j~HEa9r=JR6kU7o zC)Wm*K(M=rD~y{k0;DB4^(T<79I+vbqcfxw23Ny#+hz@I3n0R&0@IA?9n9sIt z+qPR^Dhl=$>L?@?y%y3&nD%!d-o#=9AcS_=iRw8 zKoXTJSdYLNWIBpe^SbH)fvN8%LASz_!Fpnrs3$mfhAt5vl)gO|3UvZoR!uio(dAQn z5;PB`OOb-q-g!S1!ayV5*2q$|>MA1=1tcUe`5}s`MSPoj1&@teI@)m)5L)%3X`h)JcpC(TPsvmaxGP^Wm?i*E3l1gs9{ zp4u8%8*n{`vU>b3Y;XL<$Koqda_(LfW)C2`2Jn5fAHxx=J47(#QOHk1O#yAPTW&*D zh%h^>N)BM}mk^Is1i5u11Uc9pp*UEAVr_)PEqk>1U!5H$^(6FSA;SvlkP@C?Fj~f> z1Kt34<^xYdlcD3#ttCimD`t0H%QCsEem62(T|XgcTeCmkUk-w>APfX^9_9*2r3^EQ z9vU%XL_$Ksyq=4%C`=I%Y49D7Wnh4f%o^87l55a%YexO~~Hm|l1ENmYrs$4QGkhItXSUVU! zS{jHuZV%g~OI#rP_!9O+@Zu)Gn(U~GLUoJD{OyY+97)ZGPfTwkYAm`F>^QS!dK2*? zB!T&{h=>98@nF&$!i`AoB!mczLkA&VgZT>42pE^1#4jhpVU}7`LC2rg8@N+%F6Q}V za3v)%P2CVIjKOTMn9{#v^pb87j6$C*Up{1fWaNVjdw#0sA?zfuorh>wa~w>Xq7CSl zMIjCA`dJ3ce$XBTH%j4hE~~Ae&YC{k(b@#z%3jUm7>g3XOdfiaNL{MJ)Iz=BPNd<6 z@H5PEdBzkW&6uc4dejWCvn9X|In3)^10JUJ3%^@$9TVL#=JFb#ACDpvEvBTl-XVf1zH)}Lp3y*5pZVy1b6Ymx?&WAmx)DakTs9(%1NEiBx!?efL^-6>da)b zF=;i4FW6C?;g-ylD1`>W?!h!6%0P9=xgb~K#;{~hjk~zW9cExDKo|TyFU*-UI2&m* zzkIKfXak#o@~k5MqphrKK0iRVi5$WgC2MBkwhRnH8%N97vU&4PkyTSK>3YCz1!x#}y*SgQzXXn!$&xk1cFw z;q!-oZ5Np&NcSI6Cb<-2t5~nqCM}a(7fl*3G$6=ex<$35N6{-0f{I>FjS#IQ8tMZ` zasuo|?*mtYu8Y>OdQPF~B^mFT+HB5Uc(;`J!K;yd1Rs`5xe?a{JlO5RqSAWf~Drd3}M47mG1-T{s5b#gNv7-hum2L}TFW%$oANKxj^V$5U2+kS>% zOgI+NEb5bxr0}*aMY={j$|~aE`jqO)?rj$-C*h~muRTPXSimt>W;rYcte+>TrBGIr zj~vJ^9jK7|U?cb2!k{TH-HG8Jv*e4O_6rY(z|2y8>p5>o{~5PTj4mNO5S?~AE41^K(nPmY++_Ey>>?m zMpv<C$o zI>Cr7-~hx;7C-mrvD>3NIdsjzAV}2tBI^MzQnVf^^s3nVvKeE>baNu?U zJJ1OxC%+bV(9s*bifo8nYJ!adH2u))yRX$xnM8~9aB6hV*Y#~W(=Nqb?eI(Pfnp1l zLv+%EDtO^RJLgX@7BKUmaD$VqZpaqtI66cA`7N?gd%px51%13reUuiyaRaifSC zm;Di01<93D{0Zscl$k#=&`uxRXh#Y?i3%cU@G)PIv>!{}Oelzk+~Tb!Is=X5l4fEO zn*r>93X~=&@LK31$pN1pT?Yh0wd#w=OsmHOQ)u4|tQgPZ`}1MSww3+RzX2ggjDjyQ zvl2nzEa-$7&{zl!_F~8*TwA7LrruBp34-&WFTFoz*ZAs09%OsJ zfn{u<8ProUB!&F2vS;4|1T{~L%uPZu_B5c;y{Rv1B~g^Pgj=NSL*aow3TB39*%00} z=PsEbj%pv?!A-2|;UF?53V%EYm&1WEu_!ncp0Y)sR_pq>w}+N3xovHSPHkO|OXvEEr!i1#T6pW}~EpDzbP~ zA?B7^e;)T9s-`#^EKXzpUo@EtceH*n7;SEnD}oRT3D=>5JLPnfN-z(d8t{1XmOFFs zXZWMgN}+>F2FyZDOG;Ysyq5R}ft6NRW!|)Tb3g^h4=_0zO!|sPBEd%PwGW5w@!hE9 zi%tth5WwdaM)A^Y(_SAz8eKC)AehY55Wpq?Iq+Ddk%Hnk50R@?1Zug(XwD$)GXYB_C_=wjHtpAHX3sTLMt49Jqp0e;G3Sj86OVNvX z7X!i}c3`x2k(rp*v>bf^X$14ajWd6MJM7v)w+{u{0V>w5^gN{;R3=?{xT52FDb4W* zUPw(H9)o|eZRMMgqSdp!k}GqC*e=1IRnb|ImF9E^scp>2*gE3`${J*+r5#P6jksje zH{n+5U2dnMjl&~?M&%&YQ)n3B$&jOc?k#SRtd_AlSz1-qUDqI4&GMNzeN3E&AK#iV z27O!8=>0KT_~*k=l<>xgprbz@7V;9JPV5~6p@#>H*pIhbgDfCz4d#eC6E#nx66piv zUOetH!UYtKGrj|BNN$L->!S?~1D=P)Qurt5Ux6gs{4J{xBg&7DfLJ%Eg2XDtP%q{W zKgkIt>0BCZOc(BKvK-Hn)=V}9crMkHzFfb{K722eDb((ApdQAax)3_0frR2zM~hmt z^S6bMJ$gNb5i;p(MA_FPD4+0bx+Hc0-r;Qd)GqddHwzF#5X!e^5`u2RSSTMs)%5+O zs$?VpdGH{LV-a1ROjlfU=8&1A0*<^rF4`PAb6^+rKi{EANLm= zP88v$j8RS)&YRJ5-5buv2dZg&=s>q9DiLv=^O<0wq22qZ&SwXlB25U?p@_q9i&822 zrl_)X=ZMk(soLuend}bGx*<^h_Ou}@JVe#fO9(M)Dej0G&M^)4ZArc3N&K{PgcD5E zafyRp$_>|D{MvYjV5iDTo2`+moCQ6^9Ow`$e?w{#G+B8S6w(VvOTSy%y2u4%8rp|g z-s2o1z6WXC_at&LY`v342?i6P0;Rr6D)2JtH@hN;MERj9zrS#|I8e7I>L!CpXvn}2 z>)}dqm?)2;#s(|Qz^cWDt}d39k-fYObJ5ajpgFf0=oY7=1U>3#*%0t8=8{3(T~sCRdRFwMSpfWOI)ygh)x3jU7OsVT#))cgoWQN|9c($vgxvpb z=rfXb(J(sdrO`B-oiiud+OV>c0JMDk&L~5?vhkqvx#g0%tN^9M;Ces_5V~{D;l}?%ms6dzp?~Zbthh{Sa z8fn_B>;*Rhjc2nTAeF5fsC`o|XZk6?e)s0(yohaOC9X7t8GMc?F%D?Ix_a;40Vow9 zaNe5DiX*5&d?(@%vOwyqPJslXV?c$8vIrsb#v*LYL~fwDdSrUscV>R9_(^*KXlue+ z87PS@%^$u5n&yY3K0vYu&{r~7W<1h9NbPdV>o`9RhzHUq$Ko}|2@+NXFF=RRA@V{& zG7V6Xv1BaupvbkuaI1jN?Xx{Y>jYI;~GkvY9gHXGu(AXFX?$|!0=e+uUG79H`-fsF(M?A6d)HAF>b>;Vylq$KSK zEI@{SB;6-~hG2VnmKZJEn?8IG!8ynIv;Bm%2Q8J?y^417^~|4SAO1WH!8~s1cw|__ zrw9S`O{fNJw_uN1Z+srb#No}_9{aF<7{m^Rk{d00gMm%};v8%FfEgJCi{NDZ*u|tJ z5LC2dYsme%69_|WXqU_o;{hRT(Hf&UK#?;8-GmQY&i7sBpXH6o8p-7x^}4rBL9@0SN$$ z-6I4aA{hmPiX4pzI;SDYcsq)aBuwb-p{%-}5GMHj8R<8&A}y6@>S`fF8Rb61Nt0E%CQx;VEA@?j%2;Fyj#Wg3TK9vwn7{)Q)j83)Oz6EJrB5xV+0~D-j4%? z(A%XYPp<{Bj!Z2Pz8=6bI!7&tZUq!C(zIz!=6Bq9y#!+}g67Ser&OTB8aC%X^tjzd z=p3tqCc0&LIIRLLM=LqeKF?k~A9Y}gLvhL}Rg!+lEPPVm<`$hKq(IpQl{a$xnA+xU zBr{}g)N26V$=pFUyQxYDRp~t@eb4GNyS%0Ic(PD-Qfy%^;@z<-jB}TiOPVd)DasMK zTEu?sf(DX1^=%|`6d_gp8ChRmC)UWw;!M9^vtVOQ6QyUMb0-enNmh=Do(2Cz(%o9$<3D5LSji6n{~ zxc>s1jys)JCfMGAs2QsvT})?+)=Cip=v7=up;l5SyeN%A9 zLIM5m`mKA(oJIRbb3cmbBwb@%ucjB05w6JD;k(=R$rvW|DLWtS$2&Aw8h#LC!b$QB zE^i#{?mZXz6X~1~kwbF?FRzn^I9>#ahN&S}?1}JC#TdI^CF%#sL1Y)&Tf48Lo>UIX zHdrc%7Z)R~rvyM}=nUn5%|N_D0zH^};<~{ev>ejQ?Yxb#I5_7(R-ze$Yz*NTJ1seiAZ@;-L{a$-+Cg zZ3XpV1g@H#84@ubH5*@&n3)P7HbG$SChjbpBe`}&&tD>%gy4Z>uyv{bwXsWlMh+Cp z{hzLntGhq8Of8nLOFl~dpUCL4 zU616);LjmUMns1HXR{%-VW90%q}LKMHzy#XcuC;Ao$wcaQv`RfGu>sr1)PWs190D0AJ@)_u2mE{P0s8UWl^&`$nCZO7640KoPp{Dl z39D@rFgSc0EWusHA=%Hqnc*)X&NHDy@eY|0*)(G>9F96P8jC#g5k1^^s`$Q^pk)kj zAoyb&L$(*t%Q5@&D%-65mY4a*UCSW{G^PyXW=4ag(!oiY}=YS!g-lkppK>_J4LiVED?N2C=h|EVz=s9*sPv}`N z;6U8XkH6djI1ne3AD^0X>M6;zc(Hp}rW zW(Jyj(6UDD9{~wK`~_pcc10$zoTTP*fA-|x5$V^pv`_i-#+wo-u>cXcO*D-TTrZ(A!78BoDjoQl>1D$ zdYT;?03(yBQsDFeLxskZpiAaYB|4gx-2KepNQEzz7OJ*3CUl$-h>V}yzJ@2g{^m0F zPmIlDIZ`uX9f*IX4vTm@Jnm-rhb@#5BZUvT=cd6r!UXmAf~F{r`%oi#sF~SR1<6LR zbV>J7|MRB)WPv}2gom>wLjM5BLs!y_j1Q#;_W%%0@5B31WMmgRZkQBtHZ6Hk1$|KL zreqWE!(kV-No{V0&w*dkNHD&$VQ@ARLLfz!{jqAcciGIG^yq#4E_U2xwjOkPm)WIR%tC?a>1C}xpc{ZNeFO)2+r<>FXaR1;54{4>0-NcAze8k;iCr*E zM8aSs*;$}R666zN2P6`7JKzl}q<^K2dKStC^{*azycBl`-|wUI$v<>*a>I$qyhrko zOn9ZpOPqt?P+k(Zu$nRxbL98i#Lc(>p)mxFZ}$ETy=9hsPJ@vY71craT>|tAvAzF{ z4Qk}{L_0?C{X{$i6NNm5GxB6y67yqW0;R!;EfJpHCSW)%aRd=ad9Vz=WcH7*rNv2V zfvkj3MebIB;*9(59!_x=23D~Di+nFCg5Z1EMh)FSSC_k3gi`S`*a%WW7GkGP?sbRcB8Sih+HAQiZ<{MheEhU50!jPs9tRND%veZWb z(B>+cx6T_3nQm~B1r%ZA=Ou5|CX{fFX`5l>>@B_x*PL7I*Kp05PSRr!u+y!`4S;?Y zf;q$eH4A|+OQsf77kbHXalSBz;3{N|FumaxeO{2BLWmC^n9c4zbo4bz`x}H_ntiZ~ ziS=UIh&~3xmnN1*1LP4P`4~x1CgzYIMiVr0M7#r=P}syukH=+4LD)kV`$7~?p@>z) z$K{V!OGLRSm-PU)I!c*{t^%$-pqBVeN1Zt6ks^LZ%dn5O1;c&aM zsSaeb66b2X5O(PWmhpIlNi&BtuQ|X%pN&Z{y}o+cT%rTMbBXdfk!UC6>6VKZ*`0fm zmt}Rc*A03x*P9|8qi<5|$d-Q3EBE@#Kwx$n6n6ZmFtCCE!p2*6P<7UZ6wy7f3m@YN z|0P}wtZ{Ior_F%4h%Q9mGk;T|neZbCNd-kGBpO%=S02(^ZGHF#4Gsk7^`m)c_QIAW zlCO1cp9^#=KeHDw7b#W${afG08!cq@1hPYNOh2Eqz-8B%TaPw;$-Uz83$cR+>Ekn|r!sq`Pzcxud)yHqX1#;Q2B(}s%> zKZ37R;2+trU(JeMpiCgs;Aa(u09MWm(vCE8M_kFLbs7k)XD2+H59B(}Lnmb*5wFRR zn-q^7J9c?9%DdjNe6OQmDnroNjVlO;)vb5K8{n_ja(3AOxg9b66IPo!5-JmBd>^eN zq(Tty8=!L)HeO?7z;!a!N8UY$>XiO_df5*MGo{8TcbuWy6!jfV>d{2l$?>Z~H1l_J z(v(b_A}7au`CS?DtXH8}d!sDGngpJj1qFKziW*v632tNrCvfGN^VAaDZU&H4A$_1e z%^D|41SFv2ZYFKb#DWQ)d;3dAxjE;zp~(s0Evd@kwUhQSFF~~cs1({X)F4qu1P7B4 zG-_a-;`b$9(#Bzh?9E4>v_kj`0(m|F+w5T4+q#RtU{ItOO?(6pi1-K&!!+-uI(t6! z;{oj?26@vQ#==8q&8x8j?4(sx=f8YiW6 zHBxJc`K7sr!34 z)h&0EficI_Vib}@zk4MggD-x^eDzTPo$mG-C!L-n~*3`=Rv~nTF$E0W}$5wLSOei%oOtt&NuUp zL3`xo4$llGPMQ5u&K|2qZPLDOxiWsZ$RW#9P#}j&B>qeGz9)l(kb$T;>cfVXQn#*Q z7gk5wnb}f-q%cOv{acTO_54a*=db z5zKkYteVM~9ykISipn%ZAsI~)it2IqoE~evH(F?7BA@z%FBb(H(ts-DM-*?G@HVKohD~9y|yIfyPsTl<-OtG2RDt3Q>`Nk3mpy46(6CaQr_@QmH`^>VOfAH7QP1 zs8$`-##svPAzZw@5n^0U3?om_44;TRg>Zo^enaPTmK(Eq--U3?YhqsRfUxzb4D#U~ z$cQ`?4$GTg<79hRv0hxp*rs(JL1L_vvq6*0n0{S5rx3D4D&#~DO{~(*j)DXmV-_Td zkR;1RU*T372KCw0velJesFU&|>9JhiC&g;A10X}Y69gG%+LMI59PlCGK}K?*)g+x! zOf=_w7j$_JD3(T|N|2|($+H+uA-KQ?!Uh>jNy3s2gdc9%IeQNJH}VUn?242qNoH#k zUcmNhlEbza^jh(65fLORJ;`7Vb`gjIEGZDC$Pm>LlqAw+v+~=Vg=(V>1>Vb?K6+%S zO@$g!puN-}q14?=9VetE9IECG7wS!yZM`)o_9V9+7B3X0fL^YtzpvQ%w6PLJ{~-NMp4qRMsJKdIzY_7;s5z$8 zKnMo!DCBIak3?q*dLvX~zHBUWCt?#z{@=9 zU@Z^|!{8XE()@6b$3e=iP0dTipcQ^FRA^Ka_Q>M|B8_>1{6dXw5{jwM)B&1vU1mnH znbw?~3mzKdFnlUgC{uI5hMS92NJzRz8wBG{=#w0r0)!VPF~B{+)E60oOQ6PRW6gql z^ia=xM8O4^7I_CYqcTZ;fn%|SjFb^$S%6}~;l-E$BipzU2#ILmy-ES0n7G%$*=$H- z&5bgVoDK6QDUV3wy(=;kTC|6(jdV-Bl7lkQjl+zR62x#B#7wk689MoCksymam1PSK zJC@D_sl(3%RI5(pbR|lS(SVz5M(!D496^gk6Rjp!hel=_@hRRmEa&^*vCbdp!<3|wERc%~varV-wMe?tbH3RX0fz>cl}Ma|q7h&$SIh2;>|k`08ZN!5Kw~8St7;A@@;Rkn;^!ttl8h zqBO0%0Plc5n%uy2C-OxZrj@k$H_AK|mT;imlPRby-sPRe7+iq}ur!e>QvcD!IM`b8 zu^4`y(knNY+@BLP6w-$t`Ji_Y1rEIo`qnOf5DgERA}B)zp+JBKTBr(Ki#Uail13a|5-!e;KF#wFSrkwZN_a+hO7!i3CeFPxYkdT4`8^Wd0+OaG*Uiwpd3{c#hqsfvXyf8bVL1ubYU0 zkMzs>JtmQI~(@c^)`K6Eu-x<7$u21p05-gQK(jQt@&?MwkV ztyrX7EC{oiV5!A*sM>MJI3UZ{AfmsJEAM11AI6%7RbxPp9f$kZyqqbIQkURHDuRU$ z;?N1Gk?e0J?Pos(yT@69{1Y2byljwUeVjMT+emzy5Hwv1Hpe|J^}5h(2Yz3sVu1GkhOVc4qPBlkCIB5KE82C1?6ZA`a$gk z>m*z?MmfLiXug#K7Hvj06i<)OSuQtN(wj3Qch;djDZXo>fhh2bOk3m@SVmCZNZUv> zu(DEqr*_x$mqm_2dD|`8JzJtX9*LWFx*;ro2BAIu;RKelS=W%pS=M=@FhxNht?5iq@PZ240d({V};1avkJ@(n*ivbl6#ul6ecjBUFXEw$!q( zfET7I%$gn|r7X=G@)s=z3Ae&Qb%V00m{kB8CGRE^1ZScE>@y9gM9>uOZaZp2f+31T z^P|+OK(3VbB%}Us?xuIxMs?e=J#Xk#vb*J6X*s<1gojBsulAyR4@Z|OK;e;uW%^` zSICX5yj_)5>{DovFkFn1^pNLjwI01!OIic634y<)9JiK4bd{!mZYm zGJ@ZhW)v19rKW)GR@~jhhUQ{X5Hkg22Qp@M!o0?=tOPB{Ckgo{s|mP)l~mCZvISs@ zbZU?$fU#&5!VC7n1v)ZVRO*uq1TYoe8Y2bJgBd2NPq9Xb~Bs8b=6=bAK7h?Uo!1o2TV!dNUB`s6eA9_wvfEA)L&_>H^$dbo=)IOWB#g zcU_*@{vRTsMNO?!m!e=TwKH|09a~ofz1pkJwBy}cTNiMv&a^5ZWeAHQ*jA;BSe@2d zDs--Q#<}$>TCXAsBo-8{V(eJO7HYyGsil&{hzXLwJ>T=b?{E1hIK7{bk%T47|M$Mn za?W|qv*wK3EG#NgKnmnSYhtyi1Mq{@@JdF4HIFb%Z1qTt6V->KB1g5N>@4<1o9#pQ zS;h|C{RdHNfFHwW&a%X`IE5gmQocc~X}-&`5QwDZrlUW-RrDU|)mh1ffL)Iq-U1orDdi0v^j9-~bMGjVA&O_&rtgBnmGdtQ;dKuz;Qw-@ zzMk2~CuPtM?_cSJWTc~`V(XEpNE@s+ed5ReIv@UM;7n3k>b#&Jb#7U7#`8SmxB14X zPuPwnGf~M`p5pw71AY4#jwCXPE$Tkf8FIcu^jtfII)e>bt~1PAR~@15r*#;}yuJA0mu6GYT6Kj1($g#+XQ!RR487Ea(2ofd?S>CeNt7;q4?PsL|@ zLK6syoPOhm=lT^bGEYTp;AUR#IrnO7iljUMMc|-CyI)%|UaRVziR5DLDJ`fK>EuNKarsQ;zxe# z6=db+%h`UE^{sw4Yf^jGZ`km^I%b28Go|fu8ZDaqD2m~CZoFXKbb?1&bF0JT^CX2| zd&^=k<$)55(=hmgZ+1u3CQCgj}0igoT(%#8g2aZWB7G)x%Y;9L@L7s^dS zI8F)`oi0fv7X=$cNw0G7OjyVa$olD_Tf|)5V^c!?B!;S_y1n_j;54G(v6Tpd)U^JQlV_g@Q@v$&^>X8K zU(;0RYxc-(`X4No!bgu+LoHFu7%jBYS`n`Rbs?@q#%6-~qQC;^fr)~qq&9oP122_e zq9An+nyOqM14zA~r@qchuK=<&+W8a$TY%o_JSEjLPxN4U`i&YjRH1ZFBDgS&ycy}6A%RbVQeGw6*Y!X3RjnXSTXWv9yBTCbDQ zXg-5hdPNC5;VCB6T8}uDONHb#NEK5BjHQ-3V&6u+>;J3p&ZN98QJ2zON>vl?c=XHMmYGBE7m{RB~I~H7R+o!?pB`-X>jA`+yg(i*D3+B(dFORzAYaqlEusc!Sb z>*eNbgO1k)GI*uCn9iGD{fNe47msMhf_cCq=hMpc*dKE#_K|IrO33xrR->lU+1k@t zjgZ$@sO#acV5a7BmGgjc*Yj+|bhPlSKgdfeRzkVzZ6+LHi!3=K-i(d>nl}_as!>VS zrpbIdLRtt@8rm@91&O*N%yD@!4Kf(LRxF}Ya}&)v^)Cf%?QL48sxXPefBLckpbck2 zpCUvJxiAVlZCz!%_=Vi!MnNI!jP1lA<{deOg+FAkS{3gf)GNExzd$bzh$anG5u3 zCbDc+LZM7@1^eglE4uw=Lu=S5A~6B*NnvuM9R$%wf@2X9ighYX+gqX&j#@RrlIbSO z&}_MT$|8p(6MO!W>Z0Z~)=TKM06)du8T@nv)4Lo7NpmY8>H<%nR(TL)xC1JSRz^M$ zTV_%^lzs|;B`KYK_6+m1PoIc8O$|mgMlzYz3A!42HbF9R3v2CFp%t(9hCUcLy8G(M z?_O<29WMR3&tuAWCk44v0@FSD(xaxDvIcj$HMsP*i*}QrER!Ppc-__8Nb0h^<(Prh zM?=o}FzG0H7~C*Rkj6Oz`%>Ze&BS?HT#X+cy(G=>B@NP2pDb$_=oeImAS7**a8z5l1f{NrbgGec7nO9qNI~7XRL|>U^Jn|cqAJ%b zZEny;R`e`GZ2u(SxG%SV(@s}Uy)nTRc4P8PC`J@V=Ez+4Q`{;NkC#tlrKGXU*<1*fl*f0hYr7ThE3_$kH~wgS77;K0wA{;M<_WWT=S-RtM{ubX=YDw+oV z$EoVQy>90RCvJaZ;(?8$cRf6M^Q2$I3iNGn*#l&!$RHR6a;|+w!*H4DMV!?!Mi}dO zmm(HeDyqC<*!IWl~6d(I*9^e+9K;0>LG#IfjH;O()6fqy})h;S7xgr{jw z$${u?k>MCF{h;{t&wVt=aG3ji=b!7mG>v^WU?kpbjE^U!Gd2(GV_Zd^0c9UWl(6WP z9#_X(wo^9m(E6bR8*w&};H~ciEiI<2G%Rh|3RcdIhM?Ne#rFPq!Op|-8uPQ|*5iH) zu!H3Cj)}Xl6028unc%IM#>TKNVmE;yR-6ECp4>Z3Kq||P93TElLhMSPHfo>7$Z3r@ z`m7)2p|h^Ses&h?3jrQ!Yx=~wW#|LDf;OWQ#=*hOcWavS0Z{ikJ4%g#IUoLMnh1`+#AgSuC`i;QTvkqW`$a(F0d-@9eeDv{g zhm4@$a_-P-2^)QDWsOjdP(`F^j>x+)i4$Q~|9R4B+S9n@t%R3kz*z!dLEK>JDNPx` znA&8>tXhfZGmgPVrFZj$-Ba|lV;z1@o&4DJDqND7_(`>|{ zCv>936G(QDYS1<<#B!wi#NYkYse@_yN-FZGu z5~m_0oS%GAK=OrWVbvzkC&btgP^pN_@N!+!tSzBH6(>^x36b9U@zxM7Y{*K6fwaXP zNP_J`y_?=uzDnJ)PG^={T#XceW7+vb2pr5T1Ia6#O#B~;8Wk`g0bl|ED%5ImQBCd) zWb`8?nH-9@`o&F~Cp{RtVA2EAx%_~|v_$YpcxzxsyRq+8d;v{O+TPISuK4$3Yb>J` z;MiB|!P25dv}eJYMZDwg zCcyDs9st44Oed*40FsIX{q1xtoM~8PPr`)OVV{Dh42eGZlws&pGQ=u}!E^*PkUsMK z*Cd`8iAyj0gQUt(2r8p0g(7vpsd34gg&oRe^n414?3TcQ1ONEPTNPuloH_2Uzpb!1 z42=FPWAtecpX=4s!K9M|R0cF{mRF1UECFF^hk3-JF0fGL8eWDgS=P$#CLnha6WOvx zqay~M7%;2ITeRW()hEsU-O}A3h%d29}KJ+(iPkwY*nE; zYpon4##X1j(@fa&$?j23Ve9P)R+R5er`OdpSq!sji5n@H({#vcgX2ne$P4 z$_WOkJcf4xK?P?VxW0M%3hdJT6)3~y)jk$rYBqxR8L@c*PH;N!p`S57q%&xp<);_S z+`nSmXKkXLC+J1Rs&xWkowy=FU3b_)vDG_v|G3_I7hJYbV0v&RV;phN zed^CR*f2H#$%U30zthhp?Kh6H_O9Z0kgyj-0h#0YPWg{&M2$zM{X+A^d47agp(*1E z9SaWTbAPCc!~+9+&XYczL7|>Ig|#0Rti@~@CX2BgPVEe|q@vgbvw!z;r5C}Udf9xK zNOrW=aggLiTr(SH^{h;gPLPd?h7nf$^4R4=Pz&Q`+h%Ve$;oCm1TCR#*=pNZvr43u zmi2X(uk$kTgkG~xaSb5pEv@-Z#nvI^Y=Srbs6I=^hWE1I2#Uz_$DcUk&GY9dBpr{A zaH`Vn_&=>0|2=wITWYH=`paNP`cW+``a9d8f|=H|y?Mdh(|lM}ffk)=ZCNS`AX5*NA!jSjbCX~IWkWFS8ju_;2$tAXfuZk z01&-fXqVGR`V?gxP9J5c#|SN`nSb5H561P0B|t+br{X;o6^KP(Bj0?`Qjn0a%ROb2 zK&FI}#MXr0Usrzs4tPiwfX*$>E_zjatQreqa8kUyeBpFdG!#NN%S+fUPGN|B!?`)? zX5Hs_TBK#y@|JraeFjf)W`0-NfK(T`t8c|o#|j<<1Al82iYVu70%>%{eiM-gnh&m`wxKFqEraK*20I{x*W6ezoa z^!h~B{uP_w9X@Pl0apG7nTQpeZgp*IqQSH`u-yty#zJs=B^}Z*P`>l7RdA`74_klC zQL&3Htr*;!iK^6|2BcJLg?y)VN+Jt~6%@i_9i6?+n}`_+Me6&)=^>DW&Ltg;^ie24 zQ@qIYKMch#%xHND$G7r7N4>n1?}6>^O3`9>`nV8Mc*@tdZ+6MrrVXENBwe} z4t^)tn1OoXrFuOzZ;X13&gyNS2l0KQJidS;nQ1LHa|5$a)N6DP$HucKh#K~MT{MtCnB2i;Pa=G(tuvY?Q<=b`lfDZyx-1v_C{~-hPaF&hOo}>@ zAr#rH1V|RQnm!(mR)vz(r6K8Gvm~A=`8GQbF_EPYg{;iLFMKZ%w^EESU1BX0#v#EA zX&1gyHk@leMt|7BE4WNL1!^Q_O{lKxuh*7%hEXKts+p3Me7xXS{N$LtllWp)C&5_n z?6(LNdmhx3U+e5nT(7zqbH`1&4N;f{BmkdNkz;6W!EMM%@i(^~j4Guzw91-A8&>uo z_;V$yP(Tf}27J_;+dNHGSV6e2hwM@8I-OC*u@qCsCk`y6@g`;!m`97J298C)A&#ZUy%olnOCv6U zwGY@=>ReM{s#8NT94inVCmZJLvGOgi8&S`aL!jh9 zHBc^F3?vmZb`}-`ad(j&7KoXOTe{G%0_(wPu4N=DC=LTxL#N0b2X_eZkL+S*$V5x{ zsWXbblI!G?jIkPH9<(POCa}A?mC03pY9l_GT2^nd+VT6abQhXMP_fM*ahbRMIEbxn zeQ2o&PVHnAevs2Q3j7WJ^+iOOc`Bn&qE*{*60O4T@_K`Xv!FA58ERB(~TddS-Hw?OKXmreC%*{zgc# zZqsnr>$5xFVB$#+UL!GkE<(<}W8I_{+^Q32?^8iuQiMYwB-UyaKbbl_)0=!ThY(FX zf6Pu=keC&bsFQ1&Y5uJS&*=IkD))XiJkj@iT7#Z_uHkd}9QFUjK~FI|*+qlnsrZAq z6wM{Ko_m9-ek{Ts8t1!Va0EdS|UQTa)yh*7qXP2o`q5siI;vw z;zGr!1Fn=~!j_4-N*fciJH>Z=E-c=JPYr`ma$0{H3k3XBe*c~~Z0;5FXewYHUd!yI zT(B^fllFeE<)|Ph?bYn;dAwjqKe`yiLeCzoF_gKU<#N~>gQc4Y+e5$NrHb$`tY(=h z1m(J%ypys-qQh!PyOJ@r8GcSN%X%W5_6Z&tFH!{0g`Zzd4NCy|Y)B<*cqpX;iV$V0Fr?Gt`yN?cY@(?as;u zsb>91oYR#H%T^ie2Oi_vR;bD%r<)JUf4-3!q9&Y&wLFNYiDE3ft9Ez@f zynjt};KGF~3X*q|EB0JVK9OJgXxBrkGN#ETN#AX@mkYZkzWesa^!kgM-*YFO%F|cW zH0uMN^>Y_A{PkmBIpMDJRBpT-koXPPc5hJr*rh&%a}}ev=z_5)aUG@ zQdIrA36ly-d45RW{W<%2SBMw(_rtumLZKSm6I5GxjwOmmy(!2+LKyhttyp;jdbtZL z?Nc|F0sLth6971q^Gv;*31})YN8G>5ycjKPl$K|Zm)?1Q)GJaa2HAijG2o};gv<~U zv7rM%myJ7YSvy|^Xx6n z|1}8~^Xdmq1G{dv_js4?E81!rgvo(`^{OHFl~hicK=&$he<3Ib^Enu+()nwmP+r@5 z@c4}fSAr(vlE<4_^Vvy=!k&HS0QbG)%PsJep#{bzxc>oW1v^ECy|Mh2i&uPj$=jb? zA~r`8m-f+7(lDNP%Z;ze@m@IS{az$oM9;D75fC<{(MSjPeVJ}~bb40o$C8il%vKuo zT9$wj4j8c${xw%_HdR3B3;++=2Jr?pkK0m1J~Wbc0LXhOd8{~}#FUaPfz~sw_Vy}* zp`|7_QNp2J&g!JpyPSM}-|XTNi12)+>u6PmkyJ)X5L}x;Y-*1jH3|j(4f5dd^0l03 zD`4me7%?!_?-c?Z4mDq?Z$VZ{J4-B;ytIO>6tTo};t%#i#eC($HRHB^+7UXS*h~u1 zv1~ zPwHG)DR_qw^zA+Wbl*k==v@y-`G`QO zX}gV7TqF;;G&O9yZw54f1F5m0FHm(tpCQxk&rZ6tXJ0la~O^Q_dK!xmwXA=WW^x+2*gQ)snb8^<5A)g5uM+ zcEr&FsHD;I9P~}+T>&nlAXkfk(8^K{0`e6cJK_!~63ki3I&+_6eTYzVuliE-TGk3E zMzM&2fGnB1$1-{0ampcke zo*OGLl^^@cK+WBc75jPn|jpkY+(?_!$vs%^&5$UK>N>H z{ixyp%HoA(R#R4B36(uCqUerY)uqfr4i?=M=*y^8!El)#a`v)z`%gGA3T;V zrc>6{e}7#YfQD&RY@gY>IrclkKR-I3BEk+^>M%kl0urWIoiSw9(fc%CIeOQZdGI$d zom-|>u=kxiR!^D&X7_zK?i_pmrfh=jQ>Nz60uyx+fTflvYLgPMs0kJ5$vmxYeDGcH zQ>7P$1yw;nmO%WMFwmFKNcp@=f@7w19^FHgvJ1j0mLmOsIJcV{TXEn8%((WYlqB&c$z;K4W?H?Btb zv&f-A1cd2>nl`Hr_?uK%-W8(4L-6R)zU7|LH`sll>c`z56SlGEON^h<@Ty5!@^KZE zy3v)#zH;0lNc>b6N$)3Eg4gIK%|F_A6G^a~SHt5EhN!CVz_L|nsGEomoWPr_M!owf zL`&GZ_apyAT){AbhP;%t?7gOc;B9Y)s&@4wjZ-Z=_bKi1llow5gAo-|k`AA_= zoA5mQQdCH#!0~X6nK13x1Vg>D=a`}=)ASF|8BENF6!2wPxZk?3 z=T-h=Jd-7WEb$GC{Xh+2yll87-TUxHJ@?%@!#|;pm5719FBM`z{iz1lsgoYE-$w)n zRY3SO0pcGGB0GTrKoM!#k12L6NX@YekbohBW3So}qnUNNETuA_07z7)cs=mMd==hJ z{ciUC1{rA(>jZ$c>6I%Ut{`oEp?w+{xYgrgO^-bC;Y&_9RrthX{0|onc_~0~#`&^p zV6#H3kPKm?t?9f*>b>9GcY_v4@Wv8}BrTuTWbQ1;vjD6H$g_+SqUx(Owa8Q z!Q@+}b#@BNIotBBg25AEp?CxaIWmRQQ+T&@ko-a6EC#?_TgTwv6=$SMsZ7xx1tQOg zM|6tBrif9nU{sC2m78J?Ei2Bq#l#O)KUU%d9A0p?d(0+f!9n$wPqz5eP>dp^(XT_a z?zB;3(5=DzCnDsPYrE~|%WOg$_Kfgvrt3k>-)50;#op?8w%u)=m7!&baYLqS*DpUn z>p@1peY=>|jxXixT)8#*B-89s)U!t=$r+xPUa5rQX%`xhAJD+g1U3OKpTgQvqojIG zbqB}wZLDjj`mCWid1k?$-UV!{i|S&m!o${4=5f@SP>gWk1d?{2j)>IHGerxqt)x!( z?(wjR1WRbx!{!VhwM;{(LC_Ts&(>0NjN+V=x6|y>>Or^_B$XgSW=GOjO+;N$Tv&ob z^%wSXiqbbsfLt1=T1l)OlyKby_QD`V<{!dJ#mSwZmeB-Bt_94`R1SinPai&^_o*Zx z&2TTQWAP!&&87T_I7aNkq?olV2-u(b({G2F%b*(VK5fY=LPVuOrR7i1xp>GLq~Oty2m==M&vM*T+cP8`4a#7gy~f}MunJ; z)Ol#v8JtoVqJ`+po#}|&Ys@RyGxvBK*iteZp}swn>W zLSgJk2Yuxrv`v1Fl!G*}X`$i(onipqGPEsYeaG(jZ)2Y}UfN{P0fMwR+mCAv&cW=0 zuC%eH7GID2;5?>ECLEmJ1$$0;?77d|e%^v0mR|HOTfFPkAZVZS{L(Ez5DmN7$~ftk z+~WA)jQ)M4yZ-*AvyRnTwT9bpdy_nV`3F3j+fOK_OX^0!=FXZTiEpjmD-B?!O)!t{ zoj3YfRZP8&b-fj72O7R<5Z)tqbnKnpXppuguMl}@O|p7T8-d8l*0&AI%0biiZ z@$`QZuOnszGm8Apf!3<3<6?*gv_=?-yJoCDxq=K`Edh<+Bo)8z~&3as5CM{ zfHS(~rf_!6c{&=nAm{1LIyHcE`s+q4*5|Pna+~NM6Z+c)Bb$V*4Vh z&m9Z&vLr`$da10KPakHVQ(thO0-1C`ny{-wJ94^q?+FJ1%Zg;G8~f+GPHLx zHs=X#=5Or>5Q2{Ut+%2z6uGb6=`T;{|L+xB!g!x7e*jj%!Vqlk@GtA+PnJvSa0X)m z^+>QsX#%Jdy^;*>gjecD$t)A+F0f*bMOBVKK`GXD_2P=SbmF4pAJ1jT47v%#5Bw@`_^ACNd0KR%ZI&d89 z-JWYbnDl$O+D4PAzH{aJaWp1VNler?n^==MScXa4INP8;It*qGMVrb5Royql`3j5w zRn#deqsVJ0(R_io)4FaQhWbC8J^EL`HR)hjSp!^?go>3*=JxOKivwBB#6RJ) zbLgbbp<$*9yRy%pBgwj_X@ts7hSct5B`c=iOjCL&&QBlz^*Yz4CT|rW^fQ+!8r(k0 z6b-)G2I4?!ql_>}H*_P<^iCX+wgucZO*z2j34Dv>9=O}v!fpaX(-5GT)bpguAzk+L z`vZERJodQq4xY~0=gR+7@lNq-;$OsdNLF*G_N-*0vxjiXWu4O4XT=HgGa_3SI%Da3-k}Gx*M)hgt##h&#;lmZ9&4{#m@t@s+ULu~Sn zFHIiW%m4_mjO?ZK`(C7Y@5!@1MibB=VEe}}Y`IfrP`ywie|;xnlg0gbLM&bttuim& z(X?OD=;6|#s*Bcsvq`pLZ@vlLNj+09la{%@o*w7MsdT1H8ZMyV0FciKKEAfca$s(R z$#j~olMebc z7@_A)4g;MGa*TeMm8-u1n0b|&^1ba?X3v}~*974`n~*57bL$1vX&B#$8JalX0$okn zz0si5IQKinD!`Bq?-rHmyttYkDEy@LUhIoqi%ZIy15DZi{Jk3 z?|=VQu?dimn-y3*6kn3Tcd`W(Ho-@V8E@#JNvnb}?o@peZJ()YbOXfnH%?Vvzmju- zi6F@LuRsteAw^IBt_{jRkQKd4vDrOQj1webZ;L9_A0l53owFMA*1r)y;J!pKrjXxo zK%mHOQjtrIBhc60%d$QUzI0>E*NGdz6E{!<^fjKmyzvibYy56YLvpke2xk{FI3y>l z3L2Fal=t?#@3#=mt&RAp@B4Ei##{cz#VbFaYY3F$%D4*H3WdHvnd!U9>B8ojWKv>W z{8S!Z4k(3}=}#9L;8(pW^tCnPe?%wK*VnRV9FyT^p3`aeNHOTI=wRquXz$|Kb`j>y z%-StC6IAgnhY#MDpSyjDtx{7BQgg! zObD(MW*$6!!)tpDRXK1G8sW`tZOIDYv6{!(2E(?aim87HB|Ic*gc)q5tqg{&6dKod zv&DtrJx2gvyEl~%0 zz@D#RHp{|LE9%qMX^6F3#^@>qm_EQLu4o=_)j0|ZX#MP}2f?~CD?9Ynqk`S$^W? zeo(`_BG}>`%&?e}eOhJDNDn~?bs@DM`n;VF)$RHe)WPCimujZV(|vkfjQCRYw^$0t zzp&N4rnJap4|cqF!bHe}yQJ^iNG5}2HT4b&Cv6DhRA@xPymmGZ4w+$45%7^jhT5J^ z-1ZkFGx|h?*K#NeXbXEF$9_-x_?r}-YC3z@Ojrc4;7|tX9o_ZN&i?kdvfLZqh;8n; zrBW79fG*R-?J|K{k1MguCc>tP255RaG!uNRDk&W<)|mfT;~4$6LE*$e%3U4~%TrIw?(HKctjJdF@g}yPj z5jZ^tH)O@V(HLF)^lSU6qv4;A$WKelbqeBOUHh~#Cyy1lt}$j4l};M?po7TC?u$xn zWjW$hCa{6xoKAKe_bHeiBtQAqbI&~+D~F^~of_5@(|1__TN2>|&@Izhkfum+M_pIo zDFx+*{~#=r?~ynXp*i6LmCugITcmShshH8XK^l88GQKX}1f_mZ~#Y1H+`FpLyN-g>mn~JOIuzZ>$rNiNL z>-#p7Sp(nba|EVau~!$B+IOIo24Mowbh<^TTPX?fEuavX z=OG{ZN#5wzgLFczv5u22BmXVnIAWPrqoJMeBfH?l*6gYkr%sk6hyI+> zCg`Q2j^6B&FtEW`>J)Z-QVIk&XCy2+O=qZB=(w&?9bE`Q&3YxoNuD?4GEv%1J7yiw ze8aMH2yuc3HO0}LF-f61DIXsEKG6tj9|jktR{L}r=1XXCR8l192e5gv0A-d5i7pxe z1L;lZnbDSkA3#H_Ff!bSaR>-B8g~aDW_?2NVd{%jiEP+=z4L(9+Zk~{vTeZ$QrcdH zjKe3&Ol`;Eqgju3S+110?k~ao6aVnU71O45_e$W=-S)-}JKKQnklJ`D3#o*u7lcGR zrLw+Gj(v*F%2ReBMpdF&I<@yrckW}yy$_Q19iYJ- z$0ATENWMCL@wBuv3fCQzBeFOA>WYceu)Zi1vR!9x+wl{A(lpdt12KQOK7radk5sVD zktswA*}Zk&0lqd*u+7)LO(ys?G%LS_{LVH?1o_sDw6C znx-CMd$-uI=^#dAG-mX0jr8NIu2Na0(0GmNqKh8*@{)C*e|hz1zFcj{|o!H_I#~y2uqU$KR-73t-LIa;LD>~e<^m?E(PSYc16ND za%MP=E)M5(F_^tImQ~0w^3!F^T2i;8x#*JU*noxoG3p7<@RXV%2YE^y8IGds6A;I5 z>VhC|{tm}~LkA6;pr!*nkD?wAbyxr!mFb4x;Wclp{$_zB;+W7uTB+sOnDZTQbyCp!LOG^gLI}jc?#OJoC~ZO zX?OaJcPT7!s-8K?s}-Jqa`}h~gZ9XeYgI&Dxe$9+9HYM~<*9pZuv?aUdQL^7?knff z3E#WziPoK}bY56jm`y1c;IkepQte}9B)Q25&pY>yUdt+qpA0396-8INjY{$AHK(Gu?FB0L$Y?hG|5f{|Ugbz&Yx zRb}7nX3a?&&hc(iF(SR#Y@x{03Ou8cBsHGaFt*HX!nzIe{aOpVPMX|(Qf1ussSAP| zjJ#XxaR${v-F=(qo&NiT9shl&9pwJMj+4<)aq1q1(_sGG)jb+g`OraD?3l@iWmREz z7Apvqv49B%J5rycv-VhQL@GLYD$f!~&`AEXV=fX6`B5T5O=6 z0t%^e-p!Gt-XfO?bR58-34GL<#C0ugU6772u7N5YCVvnT<)Aq%7UVv2{(15`sSuFz z5|WMhmxkIJg>bqO;MZ)60BV^V9~2Fn|mn5cDSMRa=l zB&4WoxT4fZ(;z0*C~d_Vch$h$c6L5(eW0n>no-?9Uen1Gy${lYIa@v^7y|*&G_n*< z%#7~8kyw%n=p?6gW+Fbb@P1R&;snih8gH=c%K_ zr7gQOv1HI|fCx@_G(8@u+w}2?HyP)qVq!YmW0=G+{&nlG^l5&ku_+dscX^@Vk&1SL z9QP{@+^G9SE)RM$qM7ks=-QMDRWf8Y@7P${w*9*T4tp1iI1`x4sh@j*j*Sjh&<2PE z5s#*_?zZa)!;Fxe^`-ki9Au_L5PIW29(WM!I3JU5dj^eRCqWI*(f z0t4a=wmb=T$0G~}}Ji%(qKVknFlNey?D+Og2l z`t?%lN(s#D70RZE)^>|x^?QLC)w|x4%HbcSp+IjA!vdW*4ewoHv$CN&P|&Pm>gm9L zD3iKFicSAryM%nVv}j_p!)8EC-r&KmueG5AsejJS|L?``{Z%E5%~gV%HWzR|HqI2s zY5sE=pnhb9Y!P3a-6VgR%`@&%vOT{~@X|*;PRF>wN`Z(UIX|#sy0yQb*}H1=i{vAb zuyg3EDrBQNffQR6Z*y<{d3sT!y?PL}34c10{s{pXQ-e?!Q*zuU6d63#sH;=FkUzhD z`SG^Zl8M;>i%LMD!cnWL3L*&A=P54Sz8a2|i7X*%P&s31p4n(HMN0LldUFyqh;C+M^WiORj5}f~KrxdiARGF_Yk1#rW=N$N{BSY|8P-OB&9F@k#LUib zPwE|-Aw{9xO0EzIDAHo%#tbMzx!{!yJUg-YJI(+N-}8EIX1HFI!XM7cK5luJh|tlm zleDpQhe;%%J9Ct0K7oDSGmK)$8MR>^vtV%>p)~Bh`vMc?_Ax3Gyi?cc%t*0h6=+zi z5Wt-B!jjkx(x@?yNace;=z#Sd7&@^G8LA!J$jsaaHp-a^QQ+}|<+>=&3862`oToGh zVNOg~_M-KQE;uOg+CqMnB6ZFT71)F$ulmu3k@T;1aAHpnPV}Pv z0-LOWA-Ct}>M{-McxL*EZ4cJk=maIrca<-%^sc%$E`5DysC#z5x!7BF;at%}IIEzT zt&_IA;<;Ze$tLW=nQB5o&_1%blMH_1E0k3{D&a{9smK+@)Ty{FGqS_i zDGaj~Cj$p*v`SGcG-Dhqg(|dxz+MX5<6aUT+n@!qji%Fv2+O|<&rdj<^*UGfkfN5SA> z3D^<4VG`K8n1Dd)=nZ*FEH@(dw>hhwDgX^QEo&$>x@#wN)^>DL!L$}Ed&|nB9oH6= zjT9cY?u(@Yr=we{`9Cff|9UE1iT569Tkd}ngNsV<@Wow+N9Ik!`kRAcul;(xN>wq_ z+$>kBD6Cg7XtVc~K@df;X-yJHnctxg;BH1jHAFF09F5qPL+CI6-Tf;*((;x{YFH9s z;E8_|AEy%&5@ZmMXa+~gk{qYUUqTEAroz;pDHWLCfMRn%b>3yemn?2_Hnwnxx_ADR0v9{haW6?G%Lo#03Q=XKF=W41jbnhYydX5M zmfaU_oJ)RccwAU;A3boWSwkQMo2Tii;2q!a?lp4{u?dz4+m5G%zS+T(A&zc=Fz;Gx zq=R(^B;JdI3PGxZ)TzaNHPX(%Jg0g1oC+GjXFWCJ9cbwkv0zhhko=Im-_a_2cG!4j zz+3-t!P$xnJTl@C``Wr?K=~Jqtby)>SJr5ao>r_?rYc4SY+BQbmeE*Lgf`ON7s?ir zc@*&J)6}NnU;Uq}P8WsDo@66jjSg_^Z@qfIx_fIXmuif6m zz%-Tl$+PY~d6VeDd%XWK07w-LO|g$;jy$wZ_ePa%64`aJuf<|nqw;7Ogo9|fSJ8+y zTDQ>Ly^+vt&j6w7M1OAcl*}zh?BDUWxoMC9D6<{6SmwMX-L?Nc~$f%^CG9a#?9m?Ve*#m5&D-@TpQD9vx2Kp2L08Pljn0 zNY2R$wZ4+BJU|uARDQb^mxIcu7q{Hq(r!~J2s$Aqixx{9fOeHP1*FPjGcOOm77AAxK><{f>?ruf>J|x*^onHlESOm0(z{@cJRrS{ zeABTjj~2$?X9|~bt|85iO7eexCOZ>*?*Hd&8|WwoQx-al|k)6Y?z!}8EVw-G{32t9>Rqt7iEwCP7dAEdCMWF?GIvbBeBzwwUS zXC)|+K0vjnNBPK^m=zSO@Hn&~h78Xxh(vK8%UUD0xJ>I)yh0_?9s(rWY|8>j77#rH@Mh0tR&W!m(d*X?$KNOOO(HEqg4y~9D87G3b(|GHq);6tPz zE7#no>RzsR?d!os_6+&pXm{$n*X;aX7rZxyjZoU~c%SBwB?Q3SZD<>X(oUJXeO2Tc zWf3A3?$!AkckkO56xGgtK2Wwt#<1a3waq$D0jZWo|J#Mf`*^EfV@`(mURcoBM0HwR zhobYKLzRdR6|R*?x>n5!O;b#+wURIGyx9KuH_c}Ys7~c|ERj+UD(kAaEA; zzvL&&Y-#fI#d!)Ho&P)prLni-AuEj9>riswASl~}vs9oRh16Dr8fTz#RVfbVnw==^ z@Zv;aR-#ie+HcuL*lK8BqF9!<+6$cDoQAI=#N3YUso zB4{D~}VIwqykBv|6><Va0VGvH7WqzZL+Eb4ZD{E^@8-w2Ahp2>dtgqs8t7+|)n0l3#)6iT7U zd7xj*F!cu zoAEC?xzJGZEYSY)4qjeI8s|GGTNhtpI_Zib2WDij5-A{d|(RpCeh(U25z<;8_E z?doEcId2(O8P1SHQEKW2ey}%+zj%Ita#6wrpUnaam7*bHmTOO9OzMTJPh{Sf9}%{s zLc<_=l0=odW+_UsgPe4P9FE;fQA$b8t%@8KItNUCh1+MuL0OtUES5630n&ChXo@}6 zclA?PT2T^DpgtF)$1kuGTW3$>iW5Fy;$P0$i^!M5+rY|qJ~Cm~i9)36c0E*A+lFq$ zO2jocZdlW0D4-t&Q%7Oa@x!H2q#esKr)pn{_d?&JE%%(h#unK7E$-Y83v8_%T!H{u z6ZZ9Yo;>s5*SCD(^>1ZcNFSe4gPA%MBo$fxYpX^LYlhS59x0M7cE~DBp`J?aWp=93 z`lAn58(`}JSo2Br%68W}Vws7CLmLDmmoeo4>$<`UD9MrP&PVc(akOSd=VuT>%yI#H z$Ulg&D)e{NlI^^JN}7gVLrzwE;SqU`u_QZfI^vRv+rn=3ty`JLJ4Nw%bU^RSuKd7l(iRBfQi}rwu$1_BH;xlDOD*UM;3%T!n z1WC2@|2j}(pAF~e|E&A^tJ^-S!ipR6Y-r_UP%1^KkQMc`*Gm6}g>B?hho2_rMUGV0 zg1O^DDW4_6Wrm~P`I{xHOK_B^x8ZT9z?GM^j>gKF4uZ>NyXln+9j|VD`Q)K(xK{zR zOLKDP-7;8SK3oN>fgUVT%*qL%8r0RS`bbUR`oi7AZKPD zg8Zis(FFcp+Ysxa_V5bTmi3kK<)yWuIt%Xo8TC>WdlTA>U&8RITZA;Fl;>!bH$kY3 zlF+nG0gT!toUivG`P8N>kp{r2TO+dnD4?J)ctol+Sgt`N*$E0J2hF1dV}|hPLSoE2 zMFZ!hlC0bhhWb2}R>i~R%(z;rlJ~YPIrl?#4V~Y#QlNY15sf=$t<_Y45S{ED`AkTF z5Q(}h{bdJB<<_;5%h~u(5(3VcckMEW#g3D#8q0{jrIL?Zc&Ze11jZ%|TN-JI&i*RO zy0wq;4l50Nc1h#$b(;k^1+!Sh`$IB_0d<@gUm@y1LouQ2;0aG<67evR?Z{PFkGr-i zX2~_WXWHCt9!(k9_TZ=i!h}1bP-y#z_Ksc6c4C**&n$SZu6DjuPBvnIxdp z-$LpR7FCJ^J}L~pG2CRw8Jk3?5*32Fb0l?d2wGMtp)9cIS@5_8_gH)GV|zE;h@=YO z9%T%2I9&R_$orUQRqn9ROi@s@-T7Q6%U{3LO@4IBmNIv z^ne%Uo~PPrs>cdGwLiJef>1SuVYf)^%R-5sXTFCCPEdgw7GT6BLpKQ^sRVPGuDoc} z(uU|@k6Rj47SC+~NlNzdigk~!oA|s*nMWTT+KeAGAfPk~IzW{0VWEiR`&)UuD(G~8 zX3SnX<4WB;$l!K{-|fUn&?mJt4H(9~x~x3t?kSMOLoLJAUXmYze9d`b&7A!!Izdg( z(h+sYoyXfGqKYS!Qq-BQ4YQ{nrE-+MNI4^ctR~hL$8NJvxjk!udQA2m#Vyg z!0UvA1i3^L6o`tH|2&MMSfyon%l9$Ia^5D&cHzfKyd8jpph4IPLaww{JRzYQh~oM| zkpqx%Tal{CQr8|ZOydJC4Hbc6?^i6&{eur)szdpBnn^Lnp0CtJ!k*pXT{%)Zg%^V| z&Zd>~q_N~aK)sfmKn@L`!hwetMzrhqY;y##yg`8^_zNg~Jt82AlQZS5N7oIZd<0ao zeQY>A0zeC=N3*S3#j4Zet=ybo)dw9r7juM1}VMX)`rT4{B98IIanSV+@;w@qL1 zE3qPqPxKt>6jc9)5oA^ajLLFGNh}ZbvXP=$O@%1e0{&g&j!z8VcQ_d57%vWG3hM;^ zn^b;gR5(XH>*MNWFCZ=e1vG%MHA;~v(JD)AB93|oF)Io@><8XM64A5 zEWn&9U8z&=P!oR6hjemendwC{EQbKE&JRxsjf#z)lN+c);bcX)g4&K1B~dt=cW?`X zuu>dAB~G$*ZqN}zfQPNL%~|t4FF6K0MDjufrRVst4oiO=n?ou)JpUSYr>yGq0*v5& zC?4?;;c^=W0%1Lkj&-vaCdzh^ZJjiOp66bqbD&z(9NItwk|WFA-A#e53m|8$)lVpL z|2CRSK;+n5LMw3MWZcLVzaH6zE4={(k=Jh+K!{gWVCCO+dLg4xasbbr_}4@rJ$31r zyt-_9VBM_agX~t*gh6(zLjpz>Cny0nPg7pwUnm~IMb5v`SVF zq29{b!Kk)MG)NwoiZRO}?ENATh^Ed^Olkp{if1Tw5zGHAtBk3B1aH#fowSe!1P#~- zIe22!p<Ld;3OwtVv+CHV^NS!fIqF=bnK8$Z^Z(WzdjS% zzSnwSX)JfvQ$;mOr3{9b45+D;sAz0?WJ*qef$cgIdKoU_Ca~}@gQVlK)5%OEo%~f@ zVkkjvpRsB6e%z!kMBYN=+ja#Zls6rG%F`+VP zH6Br}g;aO@7^F7r{R5GMWK|tBI9%zR6*n1|y0=(+0h&t1bUg)(u%;_D0;7l{oax7F zua-`C(c)LWHndq1$nRf=?VO-Yk`~BPD6I>Vmr3Rn$Gw-eMsNwIDnSBy)m#gY0^> zi<&D_l!mQF!N+7m_^edVf4qO?CnYvHvS-7zI!^{EgNMoR&D)G-1izfhtK`s`CcJz z!%po+n7pt3fn_Fe2qNW#fLm~q_F>f2vsj%`HlcIhEz~AKsg&&zSB9I`L>Uy6**bC~ zEK;Hta;vX-+cUYtdLqJbVcQMRVmqzi={=7|_I+p|5--5~yTP0JHDFvp7-EE1znO)U5Rv}NZJl?Gu#ck5V9I*X04 zm<%$Ea5oe;Qc8(BJziUc+&DruHPTj;$QR*SuUQ1NECXeQx_ zM{Vt!IFAwaid7_9LwT$KpM+(b4VR_dDpSx8snG&1&*M+(*71gQBI5u#(T7Ba?K*o{ zLLv+Nh>GM;)!=h~)`yUHBU_@jPVPt0+-dEKqykW|{*L@q_Y!&HF-u2jkh6mzAS;qX z$sD_{z>|a?G`l_9PhQ-jQRu5RLoSh`0ubQi)k3o=({#3_<|rN$`uRam5r#o%Gf6Hs z5(T_CcyaGJfkr9eLdPm0Oi9U04pxily|Q^*yUxl_pq90Oz4Xoc6+-4gt-Xe-*r(Bo z5S^c2N;*I>I%>zior~MjfX$#y`;^L`_wEX_0|?uCXLNm@s`+`o0gb46qmSlHCcEjf zVTESb?C|KF>~J9*6nkjlMMA|EiUvKkFfoApW11L{>ilWiG94#nCO^(1REIPhqSMaZ?jF&SUCHxyji201t}8bxf;8=h=9 z!Fu=ApBR4-Xil=42-pwOe#V!EA)$nQ0~@kU34@iOOBZTg(?-n?3~ghNN1c{XNEblh zWAWikd4gYA@k%XvaMUL|o9p_{tc=$XZufKn0lPOYUG~RlAhCOF*_34WSFN<2@TXPd z|MX;F*J>!DMN#y0{pP;$A6CKh1)b4)z6upz?!>0sjk@hFl(h#a%T{R3JkzbJFkpwe z)imzbE3xEUAka0^HIu-3!$wKl5<lnq86PqxFD9P7QS4zT0YpCMqyH_ac z=<6%|95zfA5?@)ePV;cNr(Zlh)X$|T6ouj5Ci=4|fMX7*NZY*38|HoG{n$W&X1d| z6@zr~sSFu+uM7~8JRiLL;@f&_=^fK&)HJv}vw zG_tSP#@oKX4I7GiVzJGFDs$BwPK`!UreQ$+&@E?tZ}>$g+~q8+Of2)i$kV22C!>+_ zlJJR8n7J z?mUexIi2fsdE~nCXwujx!U|H)^Ix~QGA*y&7K0@!rxU9c1YgHo0i2Qn> z=@Io0udTy=GaNo^Sv)t){?T2`OERjU%++@QF(!!ApeigtLOO#jD&4o*+%WE@aURtP zgdO}*FbK(*FlaCjjYL2oW+p{LWy8S}RSGyUGbNprzUh#R5(1d&nHW=a{6B$<)3zNS z5y2&sbk)Fj9CmX}D60IW7Zp;Um;(xB(n16S>4%^I5*3g~NFEiZ=1GS73Z5-avHe68z4)vNj z&skc2byos@RS|C|B`CRFX=P$`6(hGy)*kT!JGni2`UAX`bTNlBE18t8n9 zLJfPxB8GzuG9k;=a~~WcdZ+@arPDH49h_RKVp$yWPm{*gH61~2cY>EokqQG|UA@vj zJ!AGE;raXMgrgKRLxs?i<)(=C6i%Fyt>&>4F3j*_R>Taz2y2hm-VPDE1@Jr$K&X`bt#hXH$u2 z{>p+yt*ss2%w8hTwJFJ@tE-od(Bk(N(wn9A1ZffyT&;RKs@_+EJ^`Jha`_Ldf#nT zNpa@9E3Ck7YP!Zs7Xf~|vGv4-YXx1_ST~^JrX7zbArox%(c##)hyaEVpfx^CvM<6( z0ZMz+AB5WgZh40%beQMaJafJ4(MkMT5wkhoTec{Xq0ERfERYN0AZ->L0%;G`#mKr+ z-n2nGr2Wes(mKXnM!_j;Y@IIavK8;5udtap3Ngmf#>p0d;U66F-B{!2t>X8GWFJ>D zPVRS9>RAh7cqXAY=Bi|#?gXUd;_Ga_eAfTIYty3>w>|288}Q|s^d5X8HAAX;Ta|SZ zC<9Ot@!@f>RnZZjvX^`$(@Kw!!)|n#trT$MM!Igp?bjtWwD+hKSe1 z5=WnP;{V{5_Ft=W@z7c!T}ZuUMSIJkc*h#x!_!@pj5jP>T?A;78d0ZYAOgKKmZz%kpkC3vFUr91KSRpEn??jGHo-LrKC44=vbgIKW@W6E-UDhc~kX zaL&66cK=~PLm|gZugWoNi#bNw&_Wxt77BvnJG#f$sp4lBWq};X&IrB(5f01OYEaL{ zasH<%iS!D_B2qWZB$HLkw(NlKr4*H#b3KvszmI!HJP=`H-F2nvopueC=9L+VZz(&0LH zQ|Nuv1@V)Lo=-r^WIQZJ*)1cD@h~`FXtuMV2M-5#~T~j~qzDshY@}8P9raQR@cl^aW z{!X>-;(nruCUEeO-c9gA>(1-4PcxtPZG2uT7F|hb(*{*l0!~a}qYtZG0ELach@PYp ze3;$}Q|K8JY5NIVw&v+(P`i!>K-;)`B`$F4F6>_++km|3l%&`e&^JH-1h~bZQuSdT zMN)B97Kny35gOw7emE*BTvWg&B+kuEe-=G-NT2|ZTJ@=iCN2^7b=iuEC+=U%_vhj@ zqmYWhBo(&Ey`Pa%3#XQOEaqX0i^Ao+^yEW#+^h(LYHh)df4Z_prPLPGRJ@KwVznWXhzNXEJ^YBhRI7(pMUvl(Zy5CsX5+2>)*SbLV(#0Ya6=X6Y^3|L zE2hHA%#-47%ZyZ z&(#k6i<(a@Tq}fDF#`|lwK^RwEuY%IA}L4>qrjl+WCe551+c^q%dsT>8O<^4LW{@= z`K9l1ji_5skp78;T^`wIxRwv+(4|rCY@Xpy2R+CON(yCW)6M(DO zA8`uQBJ4Zv#vqDURyWe#&+?Uio}5*I|G_N-k>E68gw8|}x-X7lVP`z3`CI^63myiV zWVnTa?qrUsX_?(0*HMtZ{DL;{1yLD_1QB2zP@d{U!~^19#d$BBpah;}s4B-JWs>-A ziWKJqv+9&W_|*Ji*CH{66K}u#u)}Vi#~G-rJN)K(mmgMteFnJt@p}f`wMHH}u3RWd z9-~lakACmJjQV>`kYf2QJISH(pSaWwbRd&iENL`1sg=s6Z&AabR8S;gn-B7|4A9rj zp8Lz-iJ)!ThGXp#q<+5j0iMX7@zroy^|5Fum|-x6NV{s;lS-Yfx$J4GR4Ii$1#$*I z4S;<=+Cjg>*3NmmAqd%a^p|`C$kR`Dfg)+R4v&ft#R4ee%$6|2Q^8VsgJ=I}^>zY~ zvBw0utLfVx{cc5{qxLd}UIK{=d$QjJ^+SrRj&oU6gc!ghQ(43gEX4(v9qEHuX=FzQ zjW|f9R5nP^#`+|jqOAyRO6)ouW4gu$10CJrC_*UK7fvVYY}jYbRvaPv8z$>isGY#W zO8G+$hlG&Ws0J*)2Rm$(vy~%`JW|`Z#(mRUJJPy#`;QUr1%YVGLlEBibBufEpX=U0 zce1S2ILC{|JWk5dj+4vzWA697r>lc%WY2?YS*EDCV7G2FSlLw8p8IiUb7U+RCXQXfRNoxe+lTPbKQ1-V$EQI5cQjErx^WDaFe(RL-0I z;N@B)sJ+3chJ31Xa(3w>kJRd`CpR5`qkl##qR&t$GWkf)zPgGKa;Z#rU^A&sDuFxX z)Ll7G98B#|^DjT__SG6ek#$!%NHEz~YvF)nyq`h{2k{v2frg+oAA2*(5rv0-eL|Q> z-el5~K(qYcs}g~#BPwzTHgs^(*>98?_W-Ja?2a0pHq)kd=_H?NPT*+I_4__o^djR~mm2FNI?)k9U&*Mu>t{e5zN1vx)M3z1(* zBi**p_V_oF6HszS!5io*su-4nM~Q)QUu{2se^Ed00mXs-JWCb&2Z98D@#v#ZE3FIg z)Mc7lU!SB^h9+X`sdg)?AdBx8ew%j_BBrRa{4YbTAM!i;LzM`s8O8gq_fv^|_V%UP zZPLDIHiV|Se{7ReiJ7pe$7)!So;fa|Ejf5m=RW#1n>K1=PerMmgxn3?O9fFJisz|K zGCgjYbB_u9>+<2WCFMbnJzr)5sP`-2=kNS>oKw{T(E~%AV zjzc*uuWZa|G|~GL95aGBjR|Lo%`C+?$rZ-RxcD<@C8LWL*PS%bjm>|uIEn}0Hrqjn zQWKwcRJdTp=b7jFDj*`}rAubN^{8q&bjjhFDq@ZL&XzQxvdcN4P(S!wd(oAGD_b&)Q4i1t_l zG8n8k&?^fX)hp32>7-_?D^^wXnp!wf)9iXthN|#nXhyi_C`|Wu&#$Sv=gXxoo6+}w zX3V;8#(UTLo(FeWQML!h%x+H*ku1B>9kR?5fZG-UikX>gBBwjpkq+Il6THbLSN!A! zwX@Q{b9WmXCG-Ze$Fy+!KkC_Au3B&<5moZ3FNOAG<=37FO^e-O)&{-2a&L~4^TU7vQn_`cr^^6R^RiE zs(XG!>7L(p-}oK>+h+T@xXaou*Y;^(VrBQ~O?Spw8{akE-K^#FZ5JZGVX^>O+Xo>4 zfM`&uhuGJfb1S;u!@QJ`FamfFuCRFty%wm=c3i3NA=?lPop>2EZikS`30MZVr$H0h((+7{Q3o=@gm%p-R$xL6gl9ZU_0+1 zvI_;cuD4bv!#x(*1C?%!A>i$VT_KNMW+}*HjOawpfX5hYQ{rz7p1U)EkSFVlS-jQn zQy)aAT`-=vnKgkDIXhl)v7;R!R0X)$p`%g%&=q;|i*n zXYhw&rkgk6#Qn@j3DZn7Qn1g-2Y4+uZkVywP7yT7HDk8LVi{#@Sjb-_2tBjqycLj(X!gT>J`Yy6~ z7)I6Q@_pwfnp;F`8Q>_)+u7-b?(POLXsIdBv~kPM2dv?e#~l>Yg!mfmg?OG44uCrI zbAj@7>8Y=Z4>f=68A(v}HwuqEUD>@wa~}4s`&QL$4(t^HIQro~HecSjy5Td=dS>bt zQO1`a1{5o+z^qZH7>i7i?|LlZebn&Twx zS*PWZ$Pc7P8g7eeyZ@ne3zslt>J1$tfil~XnRH@IR<>kOZRNd{ z_jSw;DZBleBhK}+-nUT&zn;_Mi^J4xVLF7^ZX8!vJ;ix!SEQgrdbVM*rndoR1bqk% zy|swVSf}4FMWuUOm})9DUf)w>B@rzoYGH?1yY~zI+CQjn_Q6@Zt17kAs=?Yxnw@8P zH_%+J%wNCs#*umPRsm$e7VG)vW!66hm)YGq6F*@Djn(PJIeI5*Cv|(w;kU*TK0`~q zkD{2Fptwf?w1p1~+)fDkiJKq(yY=fg1I`+Q6OJ+9DHqH1VhpId;pwSoKx~ZRM-R!L z|NL8#CCXX|w+QVD*r{~AvSV56DYvPi|MdQ~8at%F`vfqIiQLp+7qhs*xyK&a@fGyRz$rZ6ELvLIj)8(fG|M<>^4wOd4A)alP1c4Ey+YX_txTiGJ{52j zFjG;qgmJ;@H``e=m}}-xO7``Nc{lH}R9DBpkv+>R`@H@m(0I4!sQ1YR4BINyCI_k0*v;{?m8-5%75*c{ltS;x~mpcCJJZN z-wR8hBF!DDG!>pqa9d>T+#D|{_7*HwLYSdT+Mqy>e45b|S6#s2J)0`|F8AeD+Jy`?1{NOg zMY2rJFKgM8JL{V?xt(3tsKv7>H+sApjBuy%MljaRmGMNCaMM9JMp-}I9QZEg)abKg?5SqhiNA1wz%pWE;YG&^rTEQ7>X@(6lRWe)4WhjJu80v; z`g)4D6l&>ESO?WaoqSxrB7A$wssqe?i4VO&-NHkcoWM;Eoe|CQzpJXk>TURYOewbP z)SmSEI2coAd3Q?Y>8p zMyFR$7TjmWIFXVnJT~5{#kWY$K(+LSjSP}kxnvh;s_fzD0q(6R%KlDzfLXZZp;hzN z3CBv0tyn8Xf;%1@`(i)w;Hr~U$h~&8C?$17ixwwdyAoE>t})P&C(r!hU8eZUG>9zf z|7rLWGOjgiCCyiqe21x5@}{>n{A};oHJ`vjwb)*&c>B8kt;f^95vU z>%@1zI_Z!`6!cq`Hf&oOZeB8nQi7@1)xFN{__pGNp56!?Y4d$`En!gELIW%AL-8U%mx)sHV~F?Ck`mf}OELP@EzL^7mDCNE`2(sN>dOcydz z4JwE%YiN1k)xTLcT~-NdI^>0S=vD4-gjy&gLwkm(X?!YRRmEBecNb|A*8m7uiJ-Q| zV|bBw3SiX?k$Zj>bu>o(L8#@T~riRa`d%J zwQCV-ta?o4#7SsKR43JnK6I$eYMk_t?zla?Hy~=xzf}YG>E8(QP>htoUGff%$$&m+ zJwRQoUJH*bK*^yWjZh=tqVAlU|0xm)G6dMFO)g5=n}qsb&5%uecA?p%LDA?m4a&^- zy?p&um+$UEag&U4Xg!1y&3$_P%D2|vApJ*Wkrp|0lTU5q9mk!5tOK2SJ;TL=T|l*l z_yZK%Nfdl4@R4=|K4 zWeBO}rJge`UH9;pkE@816-Bpb@jv|Jur)srllPe~d~dTn;rEFi0f_=g4-SZ!D`*Hw zqkp%+_shHTN4p;Q(y`l@wU0ttB@icb4@{Sk1!HzDowjT6yf@*%G7vmrJ^X)@Ty-GeTG;G6*biMNG_4U0u!b2<)hsUK#%*T~<5 z$m8J5@Bc>qJ-Qo1KWeBV^fU2x=`^;_VBiFyy(~cwE@6Gy!}0AJ@Cd^#b($-Jym`|f z5?S$qg)|o<2Ek2# z%M9aqSRJ;84GtsO#RObCuK&#o+AW}Z_UutZh?f-MKoLr0J4Yszo(UkZy5(kNm`62E z$4FH0mQshHo~7Zz|;Ew`uUglY1TAs#oHIZJ!Yb`{Q#)$>QXEW6-Y>HwDKC(lL0U) zs#Xbam|N!=Iezk3<1<2>R~mPIzj9<+Rl7GERH$w@vh0poM%;(tEQ6R<1;rb7b15s` z2#iFn0@qEHD`{i-b2W4|K;ytIkZ68i#YT3$;s%TfdWC76^?&Kz^sJ;enmv2u`If|P z64rLkfZlwNt2Iagsk>hl3PS;z-zOy+ym64uPoCVpK@jRZC9P$b{PhfHovW{| zzTh^%<4I6?Dm!$W)Yxg(=@$~wYWoTMqOcX@O;Y>}YE9~UJu{Ux*FU~-7;k!Pb>Hv+ zRxt3sSKi-?Gg(0t8{?yBC?|{;d(z8ey@!zk|2Q6}o13VKZ8-M)T+{ zR}I2il^&HMYm->6=~-_c;G*?vNh^=zd&8TUOmrF1+HXNrsQ9LYYf&BSN{CA7uQ=G1 za}^1%@PJ}9A0i)5DtHi|a+{vR=2MQI{|`T*K`$`dPL=Aqg;&L1t%RqHT>p(r&wb#B z;*I=|a-V^(oqv%DxC7f@h`$Xj9vR9_Sd*k~Ix0r>3Tt2X@s$ zrCmp`>k9uNqar*Q%<}C2D#hsBRdIc2pdFN_YFQVIyxd5a8nCQwPCR4b;S>adtfx)| zdN{TD$K^m5%05Rm;UUWuoOp3Wwp<<%FR6Y{o&D}{X--zJe!{3TCNec%Db(q~@LMh~ z^4paj6^~g(sfO@%d5BqLAl;>}J)lD4YY!-c;a%3PVFX;M6`KLOl8Df-2p`l+ukJ{y z6%D@{@ix}G)s~35FUMEim!*Ri?5HzY?{NrCEJ@~_zis-A$&FM+xH8b-+FBA0-+g#M zx-`3ZKx(8}_e437G+oo4jJJhlZ?QQZe&&Z-!mVM=&)yzLIrEgb!*7kzBl^L&#^{;o z{{?g-2{&U&uA-q(+mVc1Zu{;805uqDwOBtf7U1m@94L4tY*%9Ze z$C3nG>*`ZxDv(C}yF?O-C=^L}D9GXhg|38Bs3;f2G*97UFQxQ=l#;Fq zFT0*xB-RH(B}fzT0)#psz4Y0Y2oJ-3QUaQUXKCe^8m9UCs+swhzhIMJq-&=hajNKA zsccK_Z7j2S9tv2})l!zCt37n-db%7{ zQj!TzElcrw5d+3o&Ifs4V~jzGBt41v0P>b6BqCkw4NLy%m)D+jFaMLTXBU+;MOt9i zoVI|&B_5F!k)vcn$U%ALRrrE?rilkD_*{) z`}2ZXz2=wa@cmqPW_gNare)z-AVrMuz*cIwRk0|TK*fMWyXk;bfD7Dl26qi2@}Cop z(qH10Pq{n1^n6sz#d;)pah38wRt@W&VnY+-*pQ#S`YU7uI?PB%PyE8c4}4Y~OstTt zDU7A?z?VNzT|!NH1p3z_!WjGDRn(s2s; zYZZk8;1+w3X=*WJ&*6o`Jcdl`3&<9ALhU(r>|Hr_n)6fGd3=B47-b5I@s zIQ8s|Z5{=F(Jm#qap)KKoLDt8KEeG*gFBA~v%-ZgB+J6$^@iD&1}@ibjZj9$KQlRI zxD~<7D*m5T4HwEA{1U32n*^J&opE?GmR6&rD&{eyXz$!O;A&Jq1wPI~P!Xk$g;7?+ z@(#gBi8y8hl}zg1Yi`|Fw2*N!4aO`#>VeNH?f&E#{qL}0^2<*?G=-oa-u>%?f4fcXhWf+WASWj+$VgwmD zM3g~Z?U-&0YV}gplfBqkEYE73@EV6ubI?JWidHEhSC6ZN{?C2xGhbk$=%e#>xKFuF z-H-Ow`9+S^Xbz1$_jyPCf8BN(iBMC~3iG=jSod{3niUhnny2^a*9KHPlinxNB+LFj z_Ca}N9wp4b2%kdhKuLp`7#Y+U0)sLOafc)Jote#uCMOj;F(j7E(>3fyM;oErU5{_S;NvG@o`gAU9+S{^*;+sJgoVC%kPiMCOq!n-BWhr zd+;>Prhn5GeA9!cb>Vcoh%wFORn)w|4CkRzsb?5#(PHT4qz;PHSQMHn;e`iUB@%1( zfmrR{erG`Gk~LAK^qDG_6fN{RLmYl@^Q~i^nRaXUEzt34#P~o_xmmh{iaF?bgZ(O=t{m-j2_WVI{x_wFl?k?TYRF>aP zf2Fo4+d<5`E(GhXcQgHf!Kq(YPd~73$)nMtE09LJkA?E3ca8cCk3Q;b0xBd#Aw=JS zFJY)Tis3l?9Xa1s`#YgXi>sI=I{uF;#B_@PUwc;@Q&kzq4+2XasNl>GwIYU=`aw5~ zxr6|N18_R?W=UTR@Tkqiu6ZHeRUB|rkHccIAuj{&zk=~|m zI2m9zxcz?r=RD^;=Wt!$`gHhk?_qH7?)l&U%kTg8dmvBkFqlA5n{}g~NZsyAK?iVX zZWernJsfSl^5VjkH8sgmB(Q+*voFj^gTEP;{p3cekgCV-5Ay#>GqiPmp=TtjqrS+5 zf+S#SsA4(p`aTMaEx-*>M^Q<#RzI6bY|Xczp*T2OfSt{<1`m;L$qo@F*$QnQBNeUg zo8gETcJ)-4kknxe7>(c-5eT~ld;1`t5|z{d5(v?8$96$fWl1WMs!~9xIg zNs=(lshrrl=ZFmf4qB>|QiE%{3>7=Kt;}v}#&XWW8O15&ghAd?-?d6Q0KN0L_{Th2 zwZ@eH#Cr8Jy^^3DXm>O+9`&Xs?ITZ#LVn1(AIxMO>t8OV#@{50)wO9!G7j-1@m}`2 z=tp(#eV=-jaLKq0W>1XwrhNtuQ{r}AgXHcsNnh^a`b57~kG5{HX(9&KBr=L->|8o) z*)KrEvrB7RuWf2shZ-Spa5Gm?0ckO0^}1o%agt!Y=3|8IxED|MOlgE~^z@>?GEogW z?lApklGwIAYEIkcxcRsc@u`|Mm4QVwkro3-)0Y?eoi>avcrmgHj{xja@HP2LvO}TS)`0T zKKIsQ882&pANWs}xXF?_?iYF#KbD;qjJF{|dg6nl!j=^X|&g zX7*vSa(&|&6Cvg>Dg92DiU$!E{o%)nB3g-)?& zgjNQ4Rk3O_e`{J9GLkH=PUM_GlMIIWYcyJ;j?u9?IRODE;pNbQ81CabZTBObbR ztwmZo@{HONwnL61AfnRLy>7qER$Ked&D%|AEpL>a4V^+I_HgH&DZ028(1jcq@6vMKTk=$ zy8PJTpgO-pu`$Wx77>c_II&)G_%W1OBv+x&1F!`<-v$yFUvy=KOn-#ybyMR3uS4nuMcM{>`D}k z6f#!=&`JPy2XI?q-(P4Qu<&C>B6?SI%+3qWC6qUhW$h10|FgaZ3yJrk&Ly?iQstDW z{D#3>N6DTak6J>iGv7z8Q@L!QD%Iya8&64}%~FkNg&8eX`T*_Zt-(}>>rPU{1o|K_Z9N2?RsZY5bg%zohX|h_3 zu5Z@>Sz{XSuhOUdW?i+FhtEm|tQb&5ty7h;E4`k2i46me3si$^JOsu)G|%>YjdQ$* z=I7<56!JtnUGI{xhtIC>L*ile=FO9ZuLIvG@=1&Yp!HpS0;@lC*enko61S8D#y#6F z%AD?$PUsF&X}&ZXU!K$pIO_os5sg0uY0U^ZTuITXc` zPr+qs{j3OTiR-(#=OYiP#PYj(lGKy2?sFvWJGi&KqyDPEw`8oOTt5?Hw`rHf>mt#N zB>7`M$sFqDh<&UWX_Y&bzEuALj!>MuWATfd^1FB>KI~onG&FRsArkqR4$}{0Q01LQ zLIJd~mA7B|?lvp>e$FG2FQ&CTaC}`^*mEjc7{@y-f6|9QjkjeTwd^G)cXG2Rxr(9{G4UXQ^YEBUkdGOGg$0hlc?8bm|19SG@o3UJ10UaRI#_<# P!cSSr^TiztRy6$!h1RjO literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap b/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap new file mode 100644 index 000000000..e5568a45c --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/tokens.snap @@ -0,0 +1,465 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of tokenizing helix_ccw.kcl +snapshot_kind: text +--- +{ + "Ok": [ + { + "type": "word", + "start": 0, + "end": 7, + "value": "part001" + }, + { + "type": "whitespace", + "start": 7, + "end": 8, + "value": " " + }, + { + "type": "operator", + "start": 8, + "end": 9, + "value": "=" + }, + { + "type": "whitespace", + "start": 9, + "end": 10, + "value": " " + }, + { + "type": "word", + "start": 10, + "end": 23, + "value": "startSketchOn" + }, + { + "type": "brace", + "start": 23, + "end": 24, + "value": "(" + }, + { + "type": "string", + "start": 24, + "end": 28, + "value": "'XY'" + }, + { + "type": "brace", + "start": 28, + "end": 29, + "value": ")" + }, + { + "type": "whitespace", + "start": 29, + "end": 32, + "value": "\n " + }, + { + "type": "operator", + "start": 32, + "end": 34, + "value": "|>" + }, + { + "type": "whitespace", + "start": 34, + "end": 35, + "value": " " + }, + { + "type": "word", + "start": 35, + "end": 41, + "value": "circle" + }, + { + "type": "brace", + "start": 41, + "end": 42, + "value": "(" + }, + { + "type": "brace", + "start": 42, + "end": 43, + "value": "{" + }, + { + "type": "whitespace", + "start": 43, + "end": 44, + "value": " " + }, + { + "type": "word", + "start": 44, + "end": 50, + "value": "center" + }, + { + "type": "colon", + "start": 50, + "end": 51, + "value": ":" + }, + { + "type": "whitespace", + "start": 51, + "end": 52, + "value": " " + }, + { + "type": "brace", + "start": 52, + "end": 53, + "value": "[" + }, + { + "type": "number", + "start": 53, + "end": 54, + "value": "5" + }, + { + "type": "comma", + "start": 54, + "end": 55, + "value": "," + }, + { + "type": "whitespace", + "start": 55, + "end": 56, + "value": " " + }, + { + "type": "number", + "start": 56, + "end": 57, + "value": "5" + }, + { + "type": "brace", + "start": 57, + "end": 58, + "value": "]" + }, + { + "type": "comma", + "start": 58, + "end": 59, + "value": "," + }, + { + "type": "whitespace", + "start": 59, + "end": 60, + "value": " " + }, + { + "type": "word", + "start": 60, + "end": 66, + "value": "radius" + }, + { + "type": "colon", + "start": 66, + "end": 67, + "value": ":" + }, + { + "type": "whitespace", + "start": 67, + "end": 68, + "value": " " + }, + { + "type": "number", + "start": 68, + "end": 70, + "value": "10" + }, + { + "type": "whitespace", + "start": 70, + "end": 71, + "value": " " + }, + { + "type": "brace", + "start": 71, + "end": 72, + "value": "}" + }, + { + "type": "comma", + "start": 72, + "end": 73, + "value": "," + }, + { + "type": "whitespace", + "start": 73, + "end": 74, + "value": " " + }, + { + "type": "operator", + "start": 74, + "end": 75, + "value": "%" + }, + { + "type": "brace", + "start": 75, + "end": 76, + "value": ")" + }, + { + "type": "whitespace", + "start": 76, + "end": 79, + "value": "\n " + }, + { + "type": "operator", + "start": 79, + "end": 81, + "value": "|>" + }, + { + "type": "whitespace", + "start": 81, + "end": 82, + "value": " " + }, + { + "type": "word", + "start": 82, + "end": 89, + "value": "extrude" + }, + { + "type": "brace", + "start": 89, + "end": 90, + "value": "(" + }, + { + "type": "number", + "start": 90, + "end": 92, + "value": "10" + }, + { + "type": "comma", + "start": 92, + "end": 93, + "value": "," + }, + { + "type": "whitespace", + "start": 93, + "end": 94, + "value": " " + }, + { + "type": "operator", + "start": 94, + "end": 95, + "value": "%" + }, + { + "type": "brace", + "start": 95, + "end": 96, + "value": ")" + }, + { + "type": "whitespace", + "start": 96, + "end": 99, + "value": "\n " + }, + { + "type": "operator", + "start": 99, + "end": 101, + "value": "|>" + }, + { + "type": "whitespace", + "start": 101, + "end": 102, + "value": " " + }, + { + "type": "word", + "start": 102, + "end": 107, + "value": "helix" + }, + { + "type": "brace", + "start": 107, + "end": 108, + "value": "(" + }, + { + "type": "brace", + "start": 108, + "end": 109, + "value": "{" + }, + { + "type": "whitespace", + "start": 109, + "end": 117, + "value": "\n " + }, + { + "type": "word", + "start": 117, + "end": 128, + "value": "revolutions" + }, + { + "type": "colon", + "start": 128, + "end": 129, + "value": ":" + }, + { + "type": "whitespace", + "start": 129, + "end": 130, + "value": " " + }, + { + "type": "number", + "start": 130, + "end": 132, + "value": "16" + }, + { + "type": "comma", + "start": 132, + "end": 133, + "value": "," + }, + { + "type": "whitespace", + "start": 133, + "end": 141, + "value": "\n " + }, + { + "type": "word", + "start": 141, + "end": 151, + "value": "angleStart" + }, + { + "type": "colon", + "start": 151, + "end": 152, + "value": ":" + }, + { + "type": "whitespace", + "start": 152, + "end": 153, + "value": " " + }, + { + "type": "number", + "start": 153, + "end": 154, + "value": "0" + }, + { + "type": "comma", + "start": 154, + "end": 155, + "value": "," + }, + { + "type": "whitespace", + "start": 155, + "end": 163, + "value": "\n " + }, + { + "type": "word", + "start": 163, + "end": 166, + "value": "ccw" + }, + { + "type": "colon", + "start": 166, + "end": 167, + "value": ":" + }, + { + "type": "whitespace", + "start": 167, + "end": 168, + "value": " " + }, + { + "type": "keyword", + "start": 168, + "end": 172, + "value": "true" + }, + { + "type": "whitespace", + "start": 172, + "end": 178, + "value": "\n " + }, + { + "type": "brace", + "start": 178, + "end": 179, + "value": "}" + }, + { + "type": "comma", + "start": 179, + "end": 180, + "value": "," + }, + { + "type": "whitespace", + "start": 180, + "end": 181, + "value": " " + }, + { + "type": "operator", + "start": 181, + "end": 182, + "value": "%" + }, + { + "type": "brace", + "start": 182, + "end": 183, + "value": ")" + }, + { + "type": "whitespace", + "start": 183, + "end": 184, + "value": "\n" + } + ] +} diff --git a/src/wasm-lib/kcl/tests/simtest.tmpl b/src/wasm-lib/kcl/tests/simtest.tmpl index 785cba1d7..a47690b98 100644 --- a/src/wasm-lib/kcl/tests/simtest.tmpl +++ b/src/wasm-lib/kcl/tests/simtest.tmpl @@ -22,6 +22,6 @@ mod TEST_NAME_HERE { /// Test that KCL is executed correctly. #[tokio::test(flavor = "multi_thread")] async fn kcl_test_execute() { - super::execute(TEST_NAME).await + super::execute(TEST_NAME, RENDER_TO_PNG).await } } diff --git a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl b/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl deleted file mode 100644 index 76f31c6df..000000000 --- a/src/wasm-lib/tests/executor/inputs/helix_ccw.kcl +++ /dev/null @@ -1,4 +0,0 @@ -const part001 = startSketchOn('XY') - |> circle({ center: [5, 5], radius: 10 }, %) - |> extrude(10, %) - |> helix({revolutions: 16, angle_start: 0, ccw: true}, %) diff --git a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl b/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl deleted file mode 100644 index 93f9d7711..000000000 --- a/src/wasm-lib/tests/executor/inputs/no_visuals/double_map.kcl +++ /dev/null @@ -1,6 +0,0 @@ -fn increment = (i) => { return i + 1 } - -xs = [0..2] -ys = xs -|> map(%, increment) -|> map(%, increment) diff --git a/src/wasm-lib/tests/executor/main.rs b/src/wasm-lib/tests/executor/main.rs index 986fc8e09..5e46ce084 100644 --- a/src/wasm-lib/tests/executor/main.rs +++ b/src/wasm-lib/tests/executor/main.rs @@ -153,14 +153,6 @@ async fn kcl_test_helix_defaults_negative_extrude() { assert_out("helix_defaults_negative_extrude", &result); } -#[tokio::test(flavor = "multi_thread")] -async fn kcl_test_helix_ccw() { - let code = kcl_input!("helix_ccw"); - - let result = execute_and_snapshot(code, UnitLength::Mm).await.unwrap(); - assert_out("helix_ccw", &result); -} - #[tokio::test(flavor = "multi_thread")] async fn kcl_test_helix_with_length() { let code = kcl_input!("helix_with_length"); diff --git a/src/wasm-lib/tests/executor/no_visuals.rs b/src/wasm-lib/tests/executor/no_visuals.rs index 1a5bb6056..034bc6032 100644 --- a/src/wasm-lib/tests/executor/no_visuals.rs +++ b/src/wasm-lib/tests/executor/no_visuals.rs @@ -172,7 +172,6 @@ gen_test_parse_fail!( // "syntax: Can import only import at the top level" // ); gen_test!(add_lots); -gen_test!(double_map); gen_test!(array_elem_push); gen_test_fail!( array_elem_push_fail,