From 0698432abf5b52e94608ed70426d53cbcf5a5cba Mon Sep 17 00:00:00 2001 From: Jonathan Tran Date: Fri, 17 Jan 2025 14:34:36 -0500 Subject: [PATCH] Rust artifact graph (#5068) * Start porting artifact graph creation to Rust * Add most of artifact graph creation * Add handling loft command from recent PR * Refactor artifact merge code so that it errors when a new artifact type is added * Add sweep subtype * Finish implementation of build artifact graph * Fix wasm.ts to use new combined generated ts-rs file * Fix Rust lints * Fix lints * Fix up replacement code * Add artifact graph to WASM outcome * Add artifact graph to simulation test output * Add new artifact graph output snapshots * Fix wall field and reduce unreachable code * Change field order for subtype * Change subtype to be determined from the request, like the TS * Fix plane sweep_id * Condense code * Change ID types to be properly optional * Change to favor the new ID, the same as TS * Fix to make error impossible * Rename artifact type tag values to match TS * Fix name of field on Cap * Update outputs * Change to use Rust source range * Update output snapshots * Add conversion to mermaid mind map and add to snapshot tests * Add new mermaid mind map output * Add flowchart * Remove raw artifact graph from tests * Remove JSON artifact graph output * Update output file with header * Update output after adding flowchart * Fix flowchart to not have duplicate edges, one in each direction * Fix not not output duplicate edges in flowcharts * Change flowchart edge style to be more obvious when a direction is missing * Update output after deduplication of edges * Fix not not skip sketch-on-face artifacts * Add docs * Fix edge iteration order to be stable * Update output after fixing order * Port TS artifactGraph.test.ts tests to simulation tests * Add grouping segments and solid2ds with their path * Update output flowcharts since grouping paths * Remove TS artifactGraph tests * Remove unused d3 dependencies * Fix to track loft ID on paths * Add command ID to error messages * Move artifact graph test code to a separate file since it's a large file * Reduce function visibility * Remove TS artifact graph code * Fix spelling error with serde * Add TODO for edge cut consumed ID * Add comment about mermaid edge rank * Fix mermaid flowchart edge cuts to appear as children of their edges * Update output since fixing flowchart order * Fix to always build the artifact graph even when there's a KCL error * Add artifact graph to error output * Change optional ID merge to match TS * Remove redundant SourceRange definition * Remove Rust-flavored default source range function * Add helper for source range creation * Update doc comment for the website * Update docs after doc comment change * Fix to save engine responses in execution cache * Remove unused import * Fix to not call WASM function before beforeAll callback is run * Remove more unused imports --- .codespellrc | 2 +- docs/kcl/std.json | 162 + package.json | 2 - src/clientSideScene/ClientSideSceneComp.tsx | 6 +- src/clientSideScene/sceneEntities.ts | 7 +- src/components/AstExplorer.tsx | 16 +- .../CommandBar/CommandBarSelectionInput.tsx | 2 +- src/components/DebugFeatureTree.tsx | 7 +- src/components/Stream.tsx | 2 +- .../Toolbar/RemoveConstrainingValues.tsx | 4 +- src/lang/KclSingleton.ts | 11 +- src/lang/errors.test.ts | 7 +- src/lang/errors.ts | 111 +- src/lang/executor.test.ts | 7 +- src/lang/getNodePathFromSourceRange.test.ts | 30 +- src/lang/modifyAst.test.ts | 116 +- src/lang/modifyAst/addEdgeTreatment.test.ts | 60 +- src/lang/modifyAst/addEdgeTreatment.ts | 7 +- src/lang/modifyAst/addShell.ts | 3 +- src/lang/queryAst.test.ts | 151 +- src/lang/queryAst.ts | 9 +- .../__snapshots__/artifactGraph.test.ts.snap | 559 - src/lang/std/artifactGraph.test.ts | 960 -- src/lang/std/artifactGraph.ts | 546 +- src/lang/std/engineConnection.ts | 37 +- src/lang/std/sketch.test.ts | 180 +- src/lang/std/sketch.ts | 37 +- src/lang/std/sketchConstraints.test.ts | 12 +- src/lang/std/sketchConstraints.ts | 3 +- src/lang/std/sketchcombos.test.ts | 21 +- src/lang/util.ts | 3 +- src/lang/wasm.ts | 108 +- .../modelingCommandConfig.ts | 10 +- src/lib/commandBarConfigs/validators.ts | 8 +- src/lib/operations.test.ts | 8 +- src/lib/promptToEdit.ts | 6 +- src/lib/selections.ts | 29 +- src/lib/utils.test.ts | 16 +- .../kcl-to-core/src/conn_mock_core.rs | 5 + src/wasm-lib/kcl/src/engine/conn.rs | 10 + src/wasm-lib/kcl/src/engine/conn_mock.rs | 4 + src/wasm-lib/kcl/src/engine/conn_wasm.rs | 10 + src/wasm-lib/kcl/src/engine/mod.rs | 3 + src/wasm-lib/kcl/src/errors.rs | 12 +- src/wasm-lib/kcl/src/execution/artifact.rs | 865 +- .../src/execution/artifact/mermaid_tests.rs | 527 + src/wasm-lib/kcl/src/execution/cache.rs | 4 +- src/wasm-lib/kcl/src/execution/mod.rs | 67 +- src/wasm-lib/kcl/src/simulation_tests.rs | 112 +- src/wasm-lib/kcl/src/source_range.rs | 13 + src/wasm-lib/kcl/src/std/sketch.rs | 10 +- src/wasm-lib/kcl/src/test_server.rs | 15 +- .../add_lots/artifact_graph_flowchart.snap | 6 + .../add_lots/artifact_graph_flowchart.snap.md | 3 + .../add_lots/artifact_graph_mind_map.snap | 6 + .../add_lots/artifact_graph_mind_map.snap.md | 4 + .../angled_line/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 82 + .../angled_line/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 52 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_commands.snap | 937 ++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 109 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 92 + .../artifact_graph_example_code1/ast.snap | 837 ++ .../artifact_graph_example_code1/input.kcl | 16 + .../artifact_graph_example_code1/ops.snap | 130 + .../program_memory.snap | 1904 +++ .../rendered_model.png | Bin 0 -> 61402 bytes .../artifact_commands.snap | 609 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 31 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 17 + .../ast.snap | 638 + .../input.kcl | 18 + .../ops.snap | 45 + .../program_memory.snap | 616 + .../rendered_model.png | Bin 0 -> 38312 bytes .../artifact_commands.snap | 508 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 12 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 9 + .../ast.snap | 314 + .../input.kcl | 7 + .../ops.snap | 104 + .../program_memory.snap | 197 + .../rendered_model.png | Bin 0 -> 36466 bytes .../artifact_commands.snap | 1409 ++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 186 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 319 + .../ast.snap | 1348 ++ .../input.kcl | 28 + .../ops.snap | 208 + .../program_memory.snap | 4666 +++++++ .../rendered_model.png | Bin 0 -> 73616 bytes .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 64 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 39 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 64 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 39 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 64 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 40 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 49 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 31 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 49 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 31 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 27 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 17 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../comparisons/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../comparisons/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../computed_var/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../tests/cube/artifact_graph_flowchart.snap | 6 + .../cube/artifact_graph_flowchart.snap.md | 62 + .../tests/cube/artifact_graph_mind_map.snap | 6 + .../cube/artifact_graph_mind_map.snap.md | 39 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 227 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 113 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../helix_ccw/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 27 + .../helix_ccw/artifact_graph_mind_map.snap | 6 + .../helix_ccw/artifact_graph_mind_map.snap.md | 17 + .../i_shape/artifact_graph_flowchart.snap | 6 + .../i_shape/artifact_graph_flowchart.snap.md | 307 + .../i_shape/artifact_graph_mind_map.snap | 6 + .../i_shape/artifact_graph_mind_map.snap.md | 191 + .../if_else/artifact_graph_flowchart.snap | 6 + .../if_else/artifact_graph_flowchart.snap.md | 3 + .../if_else/artifact_graph_mind_map.snap | 6 + .../if_else/artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../import_glob/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../import_glob/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 27 + .../import_whole/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 17 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../execution_error.snap | 1 + .../execution_error.snap | 1 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3107 +++++ .../kittycad_svg/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 1977 +++ .../tests/kw_fn/artifact_graph_flowchart.snap | 6 + .../kw_fn/artifact_graph_flowchart.snap.md | 3 + .../tests/kw_fn/artifact_graph_mind_map.snap | 6 + .../kw_fn/artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 11027 ++++++++++++++++ .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 7017 ++++++++++ .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 49 + .../neg_xz_plane/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 31 + .../parametric/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 82 + .../parametric/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 52 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 104 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 66 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 101 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 82 + .../pipe_as_arg/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 62 + .../pipe_as_arg/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 39 + .../poop_chute/artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 315 + .../poop_chute/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 198 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 3 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 4 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 60 + .../riddle_small/artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 38 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 139 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 90 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 139 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 90 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 117 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 72 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 116 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 104 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 142 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 118 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 83 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 63 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 116 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 105 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 116 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 105 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 116 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 105 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 18 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 11 + .../artifact_graph_flowchart.snap | 6 + .../artifact_graph_flowchart.snap.md | 47 + .../artifact_graph_mind_map.snap | 6 + .../artifact_graph_mind_map.snap.md | 30 + .../xz_plane/artifact_graph_flowchart.snap | 6 + .../xz_plane/artifact_graph_flowchart.snap.md | 49 + .../xz_plane/artifact_graph_mind_map.snap | 6 + .../xz_plane/artifact_graph_mind_map.snap.md | 31 + src/wasm-lib/tests/executor/cache.rs | 6 + yarn.lock | 29 - 328 files changed, 47353 insertions(+), 2589 deletions(-) delete mode 100644 src/lang/std/__snapshots__/artifactGraph.test.ts.snap delete mode 100644 src/lang/std/artifactGraph.test.ts create mode 100644 src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs create mode 100644 src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/ast.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/input.kcl create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/ops.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code1/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ast.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/input.kcl create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ops.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ast.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/input.kcl create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ops.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_commands.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ast.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/input.kcl create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ops.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/program_memory.snap create mode 100644 src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/rendered_model.png create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap.md create mode 100644 src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap create mode 100644 src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap.md create mode 100644 src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap create mode 100644 src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap.md diff --git a/.codespellrc b/.codespellrc index de14c377bd..0000c2b5a0 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,3 +1,3 @@ [codespell] -ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,atleast,ue,afterall +ignore-words-list: crate,everytime,inout,co-ordinate,ot,nwo,atleast,ue,afterall,ser skip: **/target,node_modules,build,dist,./out,**/Cargo.lock,./docs/kcl/*.md,.yarn.lock,**/yarn.lock,./openapi/*.json,./packages/codemirror-lang-kcl/test/all.test.ts,tsconfig.tsbuildinfo diff --git a/docs/kcl/std.json b/docs/kcl/std.json index ca3e134797..cda0ffd07a 100644 --- a/docs/kcl/std.json +++ b/docs/kcl/std.json @@ -750,6 +750,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -1608,6 +1609,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -2517,6 +2519,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -3885,6 +3888,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -4743,6 +4747,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -5652,6 +5657,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -7054,6 +7060,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -8378,6 +8385,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -9750,6 +9758,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -11177,6 +11186,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -12501,6 +12511,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -13873,6 +13884,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -15300,6 +15312,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -16624,6 +16637,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -17996,6 +18010,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -19418,6 +19433,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -20353,6 +20369,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -21677,6 +21694,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -22985,6 +23003,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -24397,6 +24416,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -25721,6 +25741,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -27093,6 +27114,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -28505,6 +28527,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -29829,6 +29852,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -31201,6 +31225,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -32287,6 +32312,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -33700,6 +33726,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -35548,6 +35575,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -36872,6 +36900,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -38244,6 +38273,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -39666,6 +39696,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -40990,6 +41021,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -42362,6 +42394,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -44286,6 +44319,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -45610,6 +45644,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -46982,6 +47017,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -48455,6 +48491,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -49417,6 +49454,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -50759,6 +50797,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -51699,6 +51738,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -53057,6 +53097,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -54381,6 +54422,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -56146,6 +56188,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -57148,6 +57191,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -58473,6 +58517,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -60239,6 +60284,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -61623,6 +61669,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -62947,6 +62994,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -64319,6 +64367,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -65842,6 +65891,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -66878,6 +66928,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -68696,6 +68747,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -69658,6 +69710,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -71000,6 +71053,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -71940,6 +71994,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -73778,6 +73833,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -74684,6 +74740,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -75590,6 +75647,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -76666,6 +76724,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -76944,6 +77003,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -77299,6 +77359,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -78680,6 +78741,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -80473,6 +80535,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -81844,6 +81907,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -83216,6 +83280,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -84245,6 +84310,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -85626,6 +85692,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -87117,6 +87184,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -87871,6 +87939,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -89268,6 +89337,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -90838,6 +90908,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -92162,6 +92233,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -93534,6 +93606,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -94936,6 +95009,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -96260,6 +96334,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -97632,6 +97707,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -99062,6 +99138,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -100384,6 +100461,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -101704,6 +101782,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -103027,6 +103106,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -104349,6 +104429,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -105299,6 +105380,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -107280,6 +107362,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -109355,6 +109438,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -111434,6 +111518,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -113689,6 +113774,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -114766,6 +114852,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -116080,6 +116167,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -116978,6 +117066,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -117741,6 +117830,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -119119,6 +119209,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -120168,6 +120259,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -121555,6 +121647,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -123324,6 +123417,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -124702,6 +124796,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -125735,6 +125830,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -127122,6 +127218,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -128507,6 +128604,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -129894,6 +129992,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -131652,6 +131751,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -133030,6 +133130,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -134053,6 +134154,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -135377,6 +135479,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -137142,6 +137245,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -138586,6 +138690,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -140660,6 +140765,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -143429,6 +143535,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -144831,6 +144938,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -146228,6 +146336,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -147684,6 +147793,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -150441,6 +150551,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -152514,6 +152625,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -155290,6 +155402,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -158047,6 +158160,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -160122,6 +160236,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -162195,6 +162310,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -165120,6 +165236,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -166165,6 +166282,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -167105,6 +167223,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -168922,6 +169041,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -169828,6 +169948,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -170739,6 +170860,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -171645,6 +171767,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -172551,6 +172674,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -173457,6 +173581,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -174368,6 +174493,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -175274,6 +175400,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -176236,6 +176363,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -177246,6 +177374,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -178218,6 +178347,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -179634,6 +179764,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -180958,6 +181089,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -182865,6 +182997,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -184269,6 +184402,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -185240,6 +185374,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -186725,6 +186860,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -188218,6 +188354,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -190180,6 +190317,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -191600,6 +191738,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -192587,6 +192726,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -194398,6 +194538,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -195331,6 +195472,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -196655,6 +196797,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -198027,6 +198170,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -199428,6 +199572,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -200752,6 +200897,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -202124,6 +202270,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -203525,6 +203672,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -204849,6 +204997,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -206221,6 +206370,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -207724,6 +207874,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -209048,6 +209199,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -210420,6 +210572,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -211816,6 +211969,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -213140,6 +213294,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -214512,6 +214667,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -215908,6 +216064,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -217232,6 +217389,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -218604,6 +218762,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -220000,6 +220159,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -221324,6 +221484,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", @@ -222696,6 +222857,7 @@ } }, "SourceRange": { + "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", "type": "array", "items": { "type": "integer", diff --git a/package.json b/package.json index 50f9070b9c..495ec14362 100644 --- a/package.json +++ b/package.json @@ -154,7 +154,6 @@ "@playwright/test": "^1.49.0", "@testing-library/jest-dom": "^5.14.1", "@testing-library/react": "^15.0.2", - "@types/d3-force": "^3.0.10", "@types/diff": "^6.0.0", "@types/electron": "^1.6.10", "@types/isomorphic-fetch": "^0.0.39", @@ -175,7 +174,6 @@ "@vitest/web-worker": "^1.5.0", "@xstate/cli": "^0.5.17", "autoprefixer": "^10.4.19", - "d3-force": "^3.0.0", "electron": "32.1.2", "electron-builder": "24.13.3", "electron-notarize": "1.2.2", diff --git a/src/clientSideScene/ClientSideSceneComp.tsx b/src/clientSideScene/ClientSideSceneComp.tsx index 6d2bfebd97..5a1f20cd25 100644 --- a/src/clientSideScene/ClientSideSceneComp.tsx +++ b/src/clientSideScene/ClientSideSceneComp.tsx @@ -25,13 +25,13 @@ import { CallExpression, PathToNode, Program, - SourceRange, Expr, parse, recast, defaultSourceRange, resultIsOk, ProgramMemory, + topLevelRange, } from 'lang/wasm' import { CustomIcon, CustomIconName } from 'components/CustomIcon' import { ConstrainInfo } from 'lang/std/stdTypes' @@ -600,8 +600,8 @@ const ConstraintSymbol = ({ if (err(_node)) return const node = _node.node - const range: SourceRange = node - ? [node.start, node.end, true] + const range = node + ? topLevelRange(node.start, node.end) : defaultSourceRange() if (_type === 'intersectionTag') return null diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index b5544f8a82..acceab1caa 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -59,6 +59,7 @@ import { sourceRangeFromRust, resultIsOk, SourceRange, + topLevelRange, } from 'lang/wasm' import { calculate_circle_from_3_points } from '../wasm-lib/pkg/wasm_lib' import { @@ -628,7 +629,7 @@ export class SceneEntities { const startRange = _node1.node.start const endRange = _node1.node.end - const sourceRange: SourceRange = [startRange, endRange, true] + const sourceRange = topLevelRange(startRange, endRange) const selection: Selections = computeSelectionFromSourceRangeAndAST( sourceRange, maybeModdedAst @@ -2012,7 +2013,7 @@ export class SceneEntities { kclManager.programMemory, { type: 'sourceRange', - sourceRange: [node.start, node.end, true], + sourceRange: topLevelRange(node.start, node.end), }, getChangeSketchInput() ) @@ -2263,7 +2264,7 @@ export class SceneEntities { ) if (trap(_node, { suppress: true })) return const node = _node.node - editorManager.setHighlightRange([[node.start, node.end, true]]) + editorManager.setHighlightRange([topLevelRange(node.start, node.end)]) const yellow = 0xffff00 colorSegment(selected, yellow) const extraSegmentGroup = parent.getObjectByName(EXTRA_SEGMENT_HANDLE) diff --git a/src/components/AstExplorer.tsx b/src/components/AstExplorer.tsx index e029b24640..8878c22032 100644 --- a/src/components/AstExplorer.tsx +++ b/src/components/AstExplorer.tsx @@ -5,7 +5,7 @@ import { useEffect, useRef, useState } from 'react' import { trap } from 'lib/trap' import { codeToIdSelections } from 'lib/selections' import { codeRefFromRange } from 'lang/std/artifactGraph' -import { defaultSourceRange } from 'lang/wasm' +import { defaultSourceRange, SourceRange, topLevelRange } from 'lang/wasm' export function AstExplorer() { const { context } = useModelingContext() @@ -118,19 +118,19 @@ function DisplayObj({ hasCursor ? 'bg-violet-100/80 dark:bg-violet-100/25' : '' }`} onMouseEnter={(e) => { - editorManager.setHighlightRange([[obj?.start || 0, obj.end, true]]) + editorManager.setHighlightRange([ + topLevelRange(obj?.start || 0, obj.end), + ]) e.stopPropagation() }} onMouseMove={(e) => { e.stopPropagation() - editorManager.setHighlightRange([[obj?.start || 0, obj.end, true]]) + editorManager.setHighlightRange([ + topLevelRange(obj?.start || 0, obj.end), + ]) }} onClick={(e) => { - const range: [number, number, boolean] = [ - obj?.start || 0, - obj.end || 0, - true, - ] + const range = topLevelRange(obj?.start || 0, obj.end || 0) const idInfo = codeToIdSelections([ { codeRef: codeRefFromRange(range, kclManager.ast) }, ])[0] diff --git a/src/components/CommandBar/CommandBarSelectionInput.tsx b/src/components/CommandBar/CommandBarSelectionInput.tsx index b864b523b4..39c891431d 100644 --- a/src/components/CommandBar/CommandBarSelectionInput.tsx +++ b/src/components/CommandBar/CommandBarSelectionInput.tsx @@ -17,7 +17,7 @@ import { StateFrom } from 'xstate' const semanticEntityNames: { [key: string]: Array } = { - face: ['wall', 'cap', 'solid2D'], + face: ['wall', 'cap', 'solid2d'], edge: ['segment', 'sweepEdge', 'edgeCutEdge'], point: [], plane: ['defaultPlane'], diff --git a/src/components/DebugFeatureTree.tsx b/src/components/DebugFeatureTree.tsx index df9e53bc1f..b4bd1b80c2 100644 --- a/src/components/DebugFeatureTree.tsx +++ b/src/components/DebugFeatureTree.tsx @@ -1,10 +1,7 @@ import { useMemo } from 'react' import { engineCommandManager } from 'lib/singletons' -import { - ArtifactGraph, - expandPlane, - PlaneArtifactRich, -} from 'lang/std/artifactGraph' +import { expandPlane, PlaneArtifactRich } from 'lang/std/artifactGraph' +import { ArtifactGraph } from 'lang/wasm' import { DebugDisplayArray, GenericObj } from './DebugDisplayObj' export function DebugFeatureTree() { diff --git a/src/components/Stream.tsx b/src/components/Stream.tsx index 70bbea337c..d80f6426c9 100644 --- a/src/components/Stream.tsx +++ b/src/components/Stream.tsx @@ -301,7 +301,7 @@ export const Stream = () => { return } const path = getArtifactOfTypes( - { key: entity_id, types: ['path', 'solid2D', 'segment'] }, + { key: entity_id, types: ['path', 'solid2d', 'segment'] }, engineCommandManager.artifactGraph ) if (err(path)) { diff --git a/src/components/Toolbar/RemoveConstrainingValues.tsx b/src/components/Toolbar/RemoveConstrainingValues.tsx index e4fe8eb15e..f28924678c 100644 --- a/src/components/Toolbar/RemoveConstrainingValues.tsx +++ b/src/components/Toolbar/RemoveConstrainingValues.tsx @@ -1,6 +1,6 @@ import { toolTips } from 'lang/langHelpers' import { Selection, Selections } from 'lib/selections' -import { PathToNode, Program, Expr } from '../../lang/wasm' +import { PathToNode, Program, Expr, topLevelRange } from '../../lang/wasm' import { getNodeFromPath } from '../../lang/queryAst' import { PathToNodeMap, @@ -41,7 +41,7 @@ export function removeConstrainingValuesInfo({ graphSelections: nodes.map( (node): Selection => ({ codeRef: codeRefFromRange( - [node.start, node.end, true], + topLevelRange(node.start, node.end), kclManager.ast ), }) diff --git a/src/lang/KclSingleton.ts b/src/lang/KclSingleton.ts index 345e4c996d..07f282b2bc 100644 --- a/src/lang/KclSingleton.ts +++ b/src/lang/KclSingleton.ts @@ -22,6 +22,7 @@ import { ProgramMemory, recast, SourceRange, + topLevelRange, } from 'lang/wasm' import { getNodeFromPath } from './queryAst' import { codeManager, editorManager, sceneInfra } from 'lib/singletons' @@ -376,11 +377,7 @@ export class KclManager { } this.ast = { ...ast } // updateArtifactGraph relies on updated executeState/programMemory - await this.engineCommandManager.updateArtifactGraph( - this.ast, - execState.artifactCommands, - execState.artifacts - ) + this.engineCommandManager.updateArtifactGraph(execState.artifactGraph) this._executeCallback() if (!isInterrupted) { sceneInfra.modelingSend({ type: 'code edit during sketch' }) @@ -473,7 +470,7 @@ export class KclManager { ...artifact, codeRef: { ...artifact.codeRef, - range: [node.start, node.end, true], + range: topLevelRange(node.start, node.end), }, }) } @@ -594,7 +591,7 @@ export class KclManager { if (start && end) { returnVal.graphSelections.push({ codeRef: { - range: [start, end, true], + range: topLevelRange(start, end), pathToNode: path, }, }) diff --git a/src/lang/errors.test.ts b/src/lang/errors.test.ts index a26b3849b0..9ae26011cf 100644 --- a/src/lang/errors.test.ts +++ b/src/lang/errors.test.ts @@ -1,4 +1,5 @@ import { kclErrorsToDiagnostics, KCLError } from './errors' +import { defaultArtifactGraph, topLevelRange } from 'lang/wasm' describe('test kclErrToDiagnostic', () => { it('converts KCL errors to CodeMirror diagnostics', () => { @@ -8,18 +9,20 @@ describe('test kclErrToDiagnostic', () => { message: '', kind: 'semantic', msg: 'Semantic error', - sourceRange: [0, 1, true], + sourceRange: topLevelRange(0, 1), operations: [], artifactCommands: [], + artifactGraph: defaultArtifactGraph(), }, { name: '', message: '', kind: 'type', msg: 'Type error', - sourceRange: [4, 5, true], + sourceRange: topLevelRange(4, 5), operations: [], artifactCommands: [], + artifactGraph: defaultArtifactGraph(), }, ] const diagnostics = kclErrorsToDiagnostics(errors) diff --git a/src/lang/errors.ts b/src/lang/errors.ts index a85c8b5927..1cf2d83b39 100644 --- a/src/lang/errors.ts +++ b/src/lang/errors.ts @@ -5,7 +5,13 @@ import { posToOffset } from '@kittycad/codemirror-lsp-client' import { Diagnostic as LspDiagnostic } from 'vscode-languageserver-protocol' import { Text } from '@codemirror/state' import { EditorView } from 'codemirror' -import { ArtifactCommand, SourceRange } from 'lang/wasm' +import { + ArtifactCommand, + ArtifactGraph, + defaultArtifactGraph, + isTopLevelModule, + SourceRange, +} from 'lang/wasm' import { Operation } from 'wasm-lib/kcl/bindings/Operation' type ExtractKind = T extends { kind: infer K } ? K : never @@ -15,13 +21,15 @@ export class KCLError extends Error { msg: string operations: Operation[] artifactCommands: ArtifactCommand[] + artifactGraph: ArtifactGraph constructor( kind: ExtractKind | 'name', msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { super() this.kind = kind @@ -29,6 +37,7 @@ export class KCLError extends Error { this.sourceRange = sourceRange this.operations = operations this.artifactCommands = artifactCommands + this.artifactGraph = artifactGraph Object.setPrototypeOf(this, KCLError.prototype) } } @@ -38,9 +47,17 @@ export class KCLLexicalError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('lexical', msg, sourceRange, operations, artifactCommands) + super( + 'lexical', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } @@ -50,9 +67,17 @@ export class KCLInternalError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('internal', msg, sourceRange, operations, artifactCommands) + super( + 'internal', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } @@ -62,9 +87,17 @@ export class KCLSyntaxError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('syntax', msg, sourceRange, operations, artifactCommands) + super( + 'syntax', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLSyntaxError.prototype) } } @@ -74,9 +107,17 @@ export class KCLSemanticError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('semantic', msg, sourceRange, operations, artifactCommands) + super( + 'semantic', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLSemanticError.prototype) } } @@ -86,9 +127,10 @@ export class KCLTypeError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('type', msg, sourceRange, operations, artifactCommands) + super('type', msg, sourceRange, operations, artifactCommands, artifactGraph) Object.setPrototypeOf(this, KCLTypeError.prototype) } } @@ -98,9 +140,17 @@ export class KCLUnimplementedError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('unimplemented', msg, sourceRange, operations, artifactCommands) + super( + 'unimplemented', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLUnimplementedError.prototype) } } @@ -110,9 +160,17 @@ export class KCLUnexpectedError extends KCLError { msg: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { - super('unexpected', msg, sourceRange, operations, artifactCommands) + super( + 'unexpected', + msg, + sourceRange, + operations, + artifactCommands, + artifactGraph + ) Object.setPrototypeOf(this, KCLUnexpectedError.prototype) } } @@ -122,14 +180,16 @@ export class KCLValueAlreadyDefined extends KCLError { key: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { super( 'name', `Key ${key} was already defined elsewhere`, sourceRange, operations, - artifactCommands + artifactCommands, + artifactGraph ) Object.setPrototypeOf(this, KCLValueAlreadyDefined.prototype) } @@ -140,14 +200,16 @@ export class KCLUndefinedValueError extends KCLError { key: string, sourceRange: SourceRange, operations: Operation[], - artifactCommands: ArtifactCommand[] + artifactCommands: ArtifactCommand[], + artifactGraph: ArtifactGraph ) { super( 'name', `Key ${key} has not been defined`, sourceRange, operations, - artifactCommands + artifactCommands, + artifactGraph ) Object.setPrototypeOf(this, KCLUndefinedValueError.prototype) } @@ -167,9 +229,10 @@ export function lspDiagnosticsToKclErrors( new KCLError( 'unexpected', message, - [posToOffset(doc, range.start)!, posToOffset(doc, range.end)!, true], + [posToOffset(doc, range.start)!, posToOffset(doc, range.end)!, 0], + [], [], - [] + defaultArtifactGraph() ) ) .sort((a, b) => { @@ -193,7 +256,7 @@ export function kclErrorsToDiagnostics( errors: KCLError[] ): CodeMirrorDiagnostic[] { return errors - ?.filter((err) => err.sourceRange[2]) + ?.filter((err) => isTopLevelModule(err.sourceRange)) .map((err) => { return { from: err.sourceRange[0], @@ -208,7 +271,7 @@ export function complilationErrorsToDiagnostics( errors: CompilationError[] ): CodeMirrorDiagnostic[] { return errors - ?.filter((err) => err.sourceRange[2] === 0) + ?.filter((err) => isTopLevelModule(err.sourceRange)) .map((err) => { let severity: any = 'error' if (err.severity === 'Warning') { diff --git a/src/lang/executor.test.ts b/src/lang/executor.test.ts index 32a30a5326..37395a820a 100644 --- a/src/lang/executor.test.ts +++ b/src/lang/executor.test.ts @@ -6,6 +6,8 @@ import { Sketch, initPromise, sketchFromKclValue, + defaultArtifactGraph, + topLevelRange, } from './wasm' import { enginelessExecutor } from '../lib/testHelpers' import { KCLError } from './errors' @@ -480,9 +482,10 @@ const theExtrude = startSketchOn('XY') new KCLError( 'undefined_value', 'memory item key `myVarZ` is not defined', - [129, 135, true], + topLevelRange(129, 135), [], - [] + [], + defaultArtifactGraph() ) ) }) diff --git a/src/lang/getNodePathFromSourceRange.test.ts b/src/lang/getNodePathFromSourceRange.test.ts index 7349bb6022..e48b019ab3 100644 --- a/src/lang/getNodePathFromSourceRange.test.ts +++ b/src/lang/getNodePathFromSourceRange.test.ts @@ -1,5 +1,12 @@ import { getNodePathFromSourceRange, getNodeFromPath } from './queryAst' -import { Identifier, assertParse, initPromise, Parameter } from './wasm' +import { + Identifier, + assertParse, + initPromise, + Parameter, + SourceRange, + topLevelRange, +} from './wasm' import { err } from 'lib/trap' beforeAll(async () => { @@ -17,11 +24,10 @@ const sk3 = startSketchAt([0, 0]) ` const subStr = 'lineTo([3, 4], %, $yo)' const lineToSubstringIndex = code.indexOf(subStr) - const sourceRange: [number, number, boolean] = [ + const sourceRange = topLevelRange( lineToSubstringIndex, - lineToSubstringIndex + subStr.length, - true, - ] + lineToSubstringIndex + subStr.length + ) const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) @@ -29,7 +35,7 @@ const sk3 = startSketchAt([0, 0]) if (err(_node)) throw _node const { node } = _node - expect([node.start, node.end, true]).toEqual(sourceRange) + expect(topLevelRange(node.start, node.end)).toEqual(sourceRange) expect(node.type).toBe('CallExpression') }) it('gets path right for function definition params', () => { @@ -45,11 +51,7 @@ const sk3 = startSketchAt([0, 0]) const b1 = cube([0,0], 10)` const subStr = 'pos, scale' const subStrIndex = code.indexOf(subStr) - const sourceRange: [number, number, boolean] = [ - subStrIndex, - subStrIndex + 'pos'.length, - true, - ] + const sourceRange = topLevelRange(subStrIndex, subStrIndex + 'pos'.length) const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) @@ -81,11 +83,7 @@ const b1 = cube([0,0], 10)` const b1 = cube([0,0], 10)` const subStr = 'scale, 0' const subStrIndex = code.indexOf(subStr) - const sourceRange: [number, number, boolean] = [ - subStrIndex, - subStrIndex + 'scale'.length, - true, - ] + const sourceRange = topLevelRange(subStrIndex, subStrIndex + 'scale'.length) const ast = assertParse(code) const nodePath = getNodePathFromSourceRange(ast, sourceRange) diff --git a/src/lang/modifyAst.test.ts b/src/lang/modifyAst.test.ts index 97a38130cc..e49d6747f8 100644 --- a/src/lang/modifyAst.test.ts +++ b/src/lang/modifyAst.test.ts @@ -1,4 +1,11 @@ -import { assertParse, recast, initPromise, Identifier } from './wasm' +import { + assertParse, + recast, + initPromise, + Identifier, + SourceRange, + topLevelRange, +} from './wasm' import { createLiteral, createIdentifier, @@ -148,11 +155,7 @@ function giveSketchFnCallTagTestHelper( // making it more of an integration test, but easier to read the test intention is the goal const ast = assertParse(code) const start = code.indexOf(searchStr) - const range: [number, number, boolean] = [ - start, - start + searchStr.length, - true, - ] + const range = topLevelRange(start, start + searchStr.length) const sketchRes = giveSketchFnCallTag(ast, range) if (err(sketchRes)) throw sketchRes const { modifiedAst, tag, isTagExisting } = sketchRes @@ -230,7 +233,7 @@ yo2 = hmm([identifierGuy + 5])` const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex, true], + topLevelRange(startIndex, startIndex), 'newVar' ) const newCode = recast(modifiedAst) @@ -244,7 +247,7 @@ yo2 = hmm([identifierGuy + 5])` const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex, true], + topLevelRange(startIndex, startIndex), 'newVar' ) const newCode = recast(modifiedAst) @@ -258,7 +261,7 @@ yo2 = hmm([identifierGuy + 5])` const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex, true], + topLevelRange(startIndex, startIndex), 'newVar' ) const newCode = recast(modifiedAst) @@ -272,7 +275,7 @@ yo2 = hmm([identifierGuy + 5])` const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex, true], + topLevelRange(startIndex, startIndex), 'newVar' ) const newCode = recast(modifiedAst) @@ -286,7 +289,7 @@ yo2 = hmm([identifierGuy + 5])` const { modifiedAst } = moveValueIntoNewVariable( ast, execState.memory, - [startIndex, startIndex, true], + topLevelRange(startIndex, startIndex), 'newVar' ) const newCode = recast(modifiedAst) @@ -306,18 +309,16 @@ describe('testing sketchOnExtrudedFace', () => { const ast = assertParse(code) const segmentSnippet = `line([9.7, 9.19], %)` - const segmentRange: [number, number, boolean] = [ + const segmentRange = topLevelRange( code.indexOf(segmentSnippet), - code.indexOf(segmentSnippet) + segmentSnippet.length, - true, - ] + code.indexOf(segmentSnippet) + segmentSnippet.length + ) const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number, boolean] = [ + const extrudeRange = topLevelRange( code.indexOf(extrudeSnippet), - code.indexOf(extrudeSnippet) + extrudeSnippet.length, - true, - ] + code.indexOf(extrudeSnippet) + extrudeSnippet.length + ) const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) const extruded = sketchOnExtrudedFace( @@ -346,18 +347,16 @@ sketch001 = startSketchOn(part001, seg01)`) |> extrude(5 + 7, %)` const ast = assertParse(code) const segmentSnippet = `close(%)` - const segmentRange: [number, number, boolean] = [ + const segmentRange = topLevelRange( code.indexOf(segmentSnippet), - code.indexOf(segmentSnippet) + segmentSnippet.length, - true, - ] + code.indexOf(segmentSnippet) + segmentSnippet.length + ) const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number, boolean] = [ + const extrudeRange = topLevelRange( code.indexOf(extrudeSnippet), - code.indexOf(extrudeSnippet) + extrudeSnippet.length, - true, - ] + code.indexOf(extrudeSnippet) + extrudeSnippet.length + ) const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) const extruded = sketchOnExtrudedFace( @@ -386,18 +385,16 @@ sketch001 = startSketchOn(part001, seg01)`) |> extrude(5 + 7, %)` const ast = assertParse(code) const sketchSnippet = `startProfileAt([3.58, 2.06], %)` - const sketchRange: [number, number, boolean] = [ + const sketchRange = topLevelRange( code.indexOf(sketchSnippet), - code.indexOf(sketchSnippet) + sketchSnippet.length, - true, - ] + code.indexOf(sketchSnippet) + sketchSnippet.length + ) const sketchPathToNode = getNodePathFromSourceRange(ast, sketchRange) const extrudeSnippet = `extrude(5 + 7, %)` - const extrudeRange: [number, number, boolean] = [ + const extrudeRange = topLevelRange( code.indexOf(extrudeSnippet), - code.indexOf(extrudeSnippet) + extrudeSnippet.length, - true, - ] + code.indexOf(extrudeSnippet) + extrudeSnippet.length + ) const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) const extruded = sketchOnExtrudedFace( @@ -435,18 +432,16 @@ sketch001 = startSketchOn(part001, 'END')`) part001 = extrude(5 + 7, sketch001)` const ast = assertParse(code) const segmentSnippet = `line([4.99, -0.46], %)` - const segmentRange: [number, number, boolean] = [ + const segmentRange = topLevelRange( code.indexOf(segmentSnippet), - code.indexOf(segmentSnippet) + segmentSnippet.length, - true, - ] + code.indexOf(segmentSnippet) + segmentSnippet.length + ) const segmentPathToNode = getNodePathFromSourceRange(ast, segmentRange) const extrudeSnippet = `extrude(5 + 7, sketch001)` - const extrudeRange: [number, number, boolean] = [ + const extrudeRange = topLevelRange( code.indexOf(extrudeSnippet), - code.indexOf(extrudeSnippet) + extrudeSnippet.length, - true, - ] + code.indexOf(extrudeSnippet) + extrudeSnippet.length + ) const extrudePathToNode = getNodePathFromSourceRange(ast, extrudeRange) const updatedAst = sketchOnExtrudedFace( @@ -471,11 +466,10 @@ describe('Testing deleteSegmentFromPipeExpression', () => { const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = 'line([306.21, 198.85], %, $a)' - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest), - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) const modifiedAst = deleteSegmentFromPipeExpression( [], @@ -549,11 +543,10 @@ ${!replace1 ? ` |> ${line}\n` : ''} |> angledLine([-65, ${ const ast = assertParse(code) const execState = await enginelessExecutor(ast) const lineOfInterest = line - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest), - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) const dependentSegments = findUsesOfTagInPipe(ast, pathToNode) const modifiedAst = deleteSegmentFromPipeExpression( @@ -638,11 +631,10 @@ describe('Testing removeSingleConstraintInfo', () => { const execState = await enginelessExecutor(ast) const lineOfInterest = expectedFinish.split('(')[0] + '(' - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest) + 1, - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) let argPosition: SimplifiedArgDetails if (key === 'arrayIndex' && typeof value === 'number') { @@ -692,11 +684,10 @@ describe('Testing removeSingleConstraintInfo', () => { const execState = await enginelessExecutor(ast) const lineOfInterest = expectedFinish.split('(')[0] + '(' - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest) + 1, - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) let argPosition: SimplifiedArgDetails if (key === 'arrayIndex' && typeof value === 'number') { argPosition = { @@ -889,11 +880,10 @@ sketch002 = startSketchOn({ const execState = await enginelessExecutor(ast) // deleteFromSelection - const range: [number, number, boolean] = [ + const range = topLevelRange( codeBefore.indexOf(lineOfInterest), - codeBefore.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + codeBefore.indexOf(lineOfInterest) + lineOfInterest.length + ) const artifact = { type } as Artifact const newAst = await deleteFromSelection( ast, diff --git a/src/lang/modifyAst/addEdgeTreatment.test.ts b/src/lang/modifyAst/addEdgeTreatment.test.ts index 9305992297..65293f8a53 100644 --- a/src/lang/modifyAst/addEdgeTreatment.test.ts +++ b/src/lang/modifyAst/addEdgeTreatment.test.ts @@ -8,6 +8,8 @@ import { makeDefaultPlanes, PipeExpression, VariableDeclarator, + SourceRange, + topLevelRange, } from '../wasm' import { EdgeTreatmentType, @@ -77,11 +79,10 @@ const runGetPathToExtrudeForSegmentSelectionTest = async ( code: string, expectedExtrudeSnippet: string ): CallExpression | PipeExpression | Error { - const extrudeRange: [number, number, boolean] = [ + const extrudeRange = topLevelRange( code.indexOf(expectedExtrudeSnippet), - code.indexOf(expectedExtrudeSnippet) + expectedExtrudeSnippet.length, - true, - ] + code.indexOf(expectedExtrudeSnippet) + expectedExtrudeSnippet.length + ) const expectedExtrudePath = getNodePathFromSourceRange(ast, extrudeRange) const expectedExtrudeNodeResult = getNodeFromPath< VariableDeclarator | CallExpression @@ -112,11 +113,10 @@ const runGetPathToExtrudeForSegmentSelectionTest = async ( const ast = assertParse(code) // selection - const segmentRange: [number, number, boolean] = [ + const segmentRange = topLevelRange( code.indexOf(selectedSegmentSnippet), - code.indexOf(selectedSegmentSnippet) + selectedSegmentSnippet.length, - true, - ] + code.indexOf(selectedSegmentSnippet) + selectedSegmentSnippet.length + ) const selection: Selection = { codeRef: codeRefFromRange(segmentRange, ast), } @@ -260,12 +260,12 @@ const runModifyAstCloneWithEdgeTreatmentAndTag = async ( const ast = assertParse(code) // selection - const segmentRanges: Array<[number, number, boolean]> = selectionSnippets.map( - (selectionSnippet) => [ - code.indexOf(selectionSnippet), - code.indexOf(selectionSnippet) + selectionSnippet.length, - true, - ] + const segmentRanges: Array = selectionSnippets.map( + (selectionSnippet) => + topLevelRange( + code.indexOf(selectionSnippet), + code.indexOf(selectionSnippet) + selectionSnippet.length + ) ) // executeAst @@ -596,11 +596,10 @@ extrude001 = extrude(-5, sketch001) it('should correctly identify getOppositeEdge and baseEdge edges', () => { const ast = assertParse(code) const lineOfInterest = `line([7.11, 3.48], %, $seg01)` - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest), - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return const callExp = getNodeFromPath( @@ -615,11 +614,10 @@ extrude001 = extrude(-5, sketch001) it('should correctly identify getPreviousAdjacentEdge edges', () => { const ast = assertParse(code) const lineOfInterest = `line([-6.37, 3.88], %, $seg02)` - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest), - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return const callExp = getNodeFromPath( @@ -634,11 +632,10 @@ extrude001 = extrude(-5, sketch001) it('should correctly identify no edges', () => { const ast = assertParse(code) const lineOfInterest = `line([-3.29, -13.85], %)` - const range: [number, number, boolean] = [ + const range = topLevelRange( code.indexOf(lineOfInterest), - code.indexOf(lineOfInterest) + lineOfInterest.length, - true, - ] + code.indexOf(lineOfInterest) + lineOfInterest.length + ) const pathToNode = getNodePathFromSourceRange(ast, range) if (err(pathToNode)) return const callExp = getNodeFromPath( @@ -660,13 +657,12 @@ describe('Testing button states', () => { ) => { const ast = assertParse(code) - const range: [number, number, boolean] = segmentSnippet - ? [ + const range = segmentSnippet + ? topLevelRange( code.indexOf(segmentSnippet), - code.indexOf(segmentSnippet) + segmentSnippet.length, - true, - ] - : [ast.end, ast.end, true] // empty line in the end of the code + code.indexOf(segmentSnippet) + segmentSnippet.length + ) + : topLevelRange(ast.end, ast.end) // empty line in the end of the code const selectionRanges: Selections = { graphSelections: [ diff --git a/src/lang/modifyAst/addEdgeTreatment.ts b/src/lang/modifyAst/addEdgeTreatment.ts index ccabe905bd..53ca8bc014 100644 --- a/src/lang/modifyAst/addEdgeTreatment.ts +++ b/src/lang/modifyAst/addEdgeTreatment.ts @@ -1,4 +1,5 @@ import { + ArtifactGraph, CallExpression, Expr, Identifier, @@ -31,11 +32,7 @@ import { import { err, trap } from 'lib/trap' import { Selection, Selections } from 'lib/selections' import { KclCommandValue } from 'lib/commandTypes' -import { - Artifact, - ArtifactGraph, - getSweepFromSuspectedPath, -} from 'lang/std/artifactGraph' +import { Artifact, getSweepFromSuspectedPath } from 'lang/std/artifactGraph' import { kclManager, engineCommandManager, diff --git a/src/lang/modifyAst/addShell.ts b/src/lang/modifyAst/addShell.ts index c010812504..92a66a5f7b 100644 --- a/src/lang/modifyAst/addShell.ts +++ b/src/lang/modifyAst/addShell.ts @@ -1,9 +1,8 @@ -import { ArtifactGraph } from 'lang/std/artifactGraph' import { Selections } from 'lib/selections' import { Expr } from 'wasm-lib/kcl/bindings/Expr' import { Program } from 'wasm-lib/kcl/bindings/Program' import { Node } from 'wasm-lib/kcl/bindings/Node' -import { PathToNode, VariableDeclarator } from 'lang/wasm' +import { ArtifactGraph, PathToNode, VariableDeclarator } from 'lang/wasm' import { getPathToExtrudeForSegmentSelection, mutateAstWithTagForSketchSegment, diff --git a/src/lang/queryAst.test.ts b/src/lang/queryAst.test.ts index d250c5f073..6e8de22154 100644 --- a/src/lang/queryAst.test.ts +++ b/src/lang/queryAst.test.ts @@ -4,6 +4,7 @@ import { initPromise, PathToNode, Identifier, + topLevelRange, } from './wasm' import { findAllPreviousVariables, @@ -57,7 +58,7 @@ variableBelowShouldNotBeIncluded = 3 const { variables, bodyPath, insertIndex } = findAllPreviousVariables( ast, execState.memory, - [rangeStart, rangeStart, true] + topLevelRange(rangeStart, rangeStart) ) expect(variables).toEqual([ { key: 'baseThick', value: 1 }, @@ -87,7 +88,10 @@ yo2 = hmm([identifierGuy + 5])` it('find a safe binaryExpression', () => { const ast = assertParse(code) const rangeStart = code.indexOf('100 + 100') + 2 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -100,7 +104,10 @@ yo2 = hmm([identifierGuy + 5])` it('find a safe Identifier', () => { const ast = assertParse(code) const rangeStart = code.indexOf('abc') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('Identifier') @@ -109,7 +116,10 @@ yo2 = hmm([identifierGuy + 5])` it('find a safe CallExpression', () => { const ast = assertParse(code) const rangeStart = code.indexOf('def') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('CallExpression') @@ -122,7 +132,7 @@ yo2 = hmm([identifierGuy + 5])` it('find an UNsafe CallExpression, as it has a PipeSubstitution', () => { const ast = assertParse(code) const rangeStart = code.indexOf('ghi') - const range: [number, number, boolean] = [rangeStart, rangeStart, true] + const range = topLevelRange(rangeStart, rangeStart) const result = isNodeSafeToReplace(ast, range) if (err(result)) throw result expect(result.isSafe).toBe(false) @@ -132,7 +142,10 @@ yo2 = hmm([identifierGuy + 5])` it('find an UNsafe Identifier, as it is a callee', () => { const ast = assertParse(code) const rangeStart = code.indexOf('ine([2.8,') - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(false) expect(result.value?.type).toBe('CallExpression') @@ -143,7 +156,10 @@ yo2 = hmm([identifierGuy + 5])` it("find a safe BinaryExpression that's assigned to a variable", () => { const ast = assertParse(code) const rangeStart = code.indexOf('5 + 6') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -156,7 +172,10 @@ yo2 = hmm([identifierGuy + 5])` it('find a safe BinaryExpression that has a CallExpression within', () => { const ast = assertParse(code) const rangeStart = code.indexOf('jkl') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) expect(result.value?.type).toBe('BinaryExpression') @@ -173,7 +192,10 @@ yo2 = hmm([identifierGuy + 5])` const ast = assertParse(code) const rangeStart = code.indexOf('identifierGuy') + 1 - const result = isNodeSafeToReplace(ast, [rangeStart, rangeStart, true]) + const result = isNodeSafeToReplace( + ast, + topLevelRange(rangeStart, rangeStart) + ) if (err(result)) throw result expect(result.isSafe).toBe(true) @@ -222,11 +244,10 @@ describe('testing getNodePathFromSourceRange', () => { const sourceIndex = code.indexOf(searchLn) + searchLn.length const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [ - sourceIndex, - sourceIndex, - true, - ]) + const result = getNodePathFromSourceRange( + ast, + topLevelRange(sourceIndex, sourceIndex) + ) expect(result).toEqual([ ['body', ''], [0, 'index'], @@ -241,11 +262,10 @@ describe('testing getNodePathFromSourceRange', () => { const sourceIndex = code.indexOf(searchLn) + searchLn.length const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [ - sourceIndex, - sourceIndex, - true, - ]) + const result = getNodePathFromSourceRange( + ast, + topLevelRange(sourceIndex, sourceIndex) + ) const expected = [ ['body', ''], [0, 'index'], @@ -257,18 +277,16 @@ describe('testing getNodePathFromSourceRange', () => { expect(result).toEqual(expected) // expect similar result for start of line const startSourceIndex = code.indexOf(searchLn) - const startResult = getNodePathFromSourceRange(ast, [ - startSourceIndex, - startSourceIndex, - true, - ]) + const startResult = getNodePathFromSourceRange( + ast, + topLevelRange(startSourceIndex, startSourceIndex) + ) expect(startResult).toEqual([...expected, ['callee', 'CallExpression']]) // expect similar result when whole line is selected - const selectWholeThing = getNodePathFromSourceRange(ast, [ - startSourceIndex, - sourceIndex, - true, - ]) + const selectWholeThing = getNodePathFromSourceRange( + ast, + topLevelRange(startSourceIndex, sourceIndex) + ) expect(selectWholeThing).toEqual(expected) }) @@ -283,11 +301,10 @@ describe('testing getNodePathFromSourceRange', () => { const sourceIndex = code.indexOf(searchLn) const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [ - sourceIndex, - sourceIndex, - true, - ]) + const result = getNodePathFromSourceRange( + ast, + topLevelRange(sourceIndex, sourceIndex) + ) expect(result).toEqual([ ['body', ''], [1, 'index'], @@ -313,11 +330,10 @@ describe('testing getNodePathFromSourceRange', () => { const sourceIndex = code.indexOf(searchLn) const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [ - sourceIndex, - sourceIndex, - true, - ]) + const result = getNodePathFromSourceRange( + ast, + topLevelRange(sourceIndex, sourceIndex) + ) expect(result).toEqual([ ['body', ''], [1, 'index'], @@ -341,11 +357,10 @@ describe('testing getNodePathFromSourceRange', () => { const sourceIndex = code.indexOf(searchLn) const ast = assertParse(code) - const result = getNodePathFromSourceRange(ast, [ - sourceIndex, - sourceIndex, - true, - ]) + const result = getNodePathFromSourceRange( + ast, + topLevelRange(sourceIndex, sourceIndex) + ) expect(result).toEqual([ ['body', ''], [0, 'index'], @@ -375,7 +390,7 @@ part001 = startSketchAt([-1.41, 3.46]) const result = hasExtrudeSketch({ ast, selection: { - codeRef: codeRefFromRange([100, 101, true], ast), + codeRef: codeRefFromRange(topLevelRange(100, 101), ast), }, programMemory: execState.memory, }) @@ -395,7 +410,7 @@ part001 = startSketchAt([-1.41, 3.46]) const result = hasExtrudeSketch({ ast, selection: { - codeRef: codeRefFromRange([100, 101, true], ast), + codeRef: codeRefFromRange(topLevelRange(100, 101), ast), }, programMemory: execState.memory, }) @@ -409,7 +424,7 @@ part001 = startSketchAt([-1.41, 3.46]) const result = hasExtrudeSketch({ ast, selection: { - codeRef: codeRefFromRange([10, 11, true], ast), + codeRef: codeRefFromRange(topLevelRange(10, 11), ast), }, programMemory: execState.memory, }) @@ -431,11 +446,10 @@ describe('Testing findUsesOfTagInPipe', () => { const lineOfInterest = `198.85], %, $seg01` const characterIndex = exampleCode.indexOf(lineOfInterest) + lineOfInterest.length - const pathToNode = getNodePathFromSourceRange(ast, [ - characterIndex, - characterIndex, - true, - ]) + const pathToNode = getNodePathFromSourceRange( + ast, + topLevelRange(characterIndex, characterIndex) + ) const result = findUsesOfTagInPipe(ast, pathToNode) expect(result).toHaveLength(2) result.forEach((range) => { @@ -448,11 +462,10 @@ describe('Testing findUsesOfTagInPipe', () => { const lineOfInterest = `line([306.21, 198.82], %)` const characterIndex = exampleCode.indexOf(lineOfInterest) + lineOfInterest.length - const pathToNode = getNodePathFromSourceRange(ast, [ - characterIndex, - characterIndex, - true, - ]) + const pathToNode = getNodePathFromSourceRange( + ast, + topLevelRange(characterIndex, characterIndex) + ) const result = findUsesOfTagInPipe(ast, pathToNode) expect(result).toHaveLength(0) }) @@ -498,7 +511,10 @@ sketch003 = startSketchOn(extrude001, 'END') exampleCode.indexOf(lineOfInterest) + lineOfInterest.length const extruded = hasSketchPipeBeenExtruded( { - codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), + codeRef: codeRefFromRange( + topLevelRange(characterIndex, characterIndex), + ast + ), }, ast ) @@ -511,7 +527,10 @@ sketch003 = startSketchOn(extrude001, 'END') exampleCode.indexOf(lineOfInterest) + lineOfInterest.length const extruded = hasSketchPipeBeenExtruded( { - codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), + codeRef: codeRefFromRange( + topLevelRange(characterIndex, characterIndex), + ast + ), }, ast ) @@ -524,7 +543,10 @@ sketch003 = startSketchOn(extrude001, 'END') exampleCode.indexOf(lineOfInterest) + lineOfInterest.length const extruded = hasSketchPipeBeenExtruded( { - codeRef: codeRefFromRange([characterIndex, characterIndex, true], ast), + codeRef: codeRefFromRange( + topLevelRange(characterIndex, characterIndex), + ast + ), }, ast ) @@ -651,11 +673,10 @@ myNestedVar = [ }) const literalIndex = code.indexOf(literalOfInterest) - const pathToNode2 = getNodePathFromSourceRange(ast, [ - literalIndex + 2, - literalIndex + 2, - true, - ]) + const pathToNode2 = getNodePathFromSourceRange( + ast, + topLevelRange(literalIndex + 2, literalIndex + 2) + ) expect(pathToNode).toEqual(pathToNode2) }) }) diff --git a/src/lang/queryAst.ts b/src/lang/queryAst.ts index 77885aa74b..c9e43099bd 100644 --- a/src/lang/queryAst.ts +++ b/src/lang/queryAst.ts @@ -2,6 +2,7 @@ import { ToolTip } from 'lang/langHelpers' import { Selection, Selections } from 'lib/selections' import { ArrayExpression, + ArtifactGraph, BinaryExpression, CallExpression, Expr, @@ -16,8 +17,8 @@ import { sketchFromKclValue, sketchFromKclValueOptional, SourceRange, - sourceRangeFromRust, SyntaxType, + topLevelRange, VariableDeclaration, VariableDeclarator, } from './wasm' @@ -32,7 +33,7 @@ import { import { err, Reason } from 'lib/trap' import { ImportStatement } from 'wasm-lib/kcl/bindings/ImportStatement' import { Node } from 'wasm-lib/kcl/bindings/Node' -import { ArtifactGraph, codeRefFromRange } from './std/artifactGraph' +import { codeRefFromRange } from './std/artifactGraph' /** * Retrieves a node from a given path within a Program node structure, optionally stopping at a specified node type. @@ -819,7 +820,7 @@ export function isLinesParallelAndConstrained( return { isParallelAndConstrained, selection: { - codeRef: codeRefFromRange(sourceRangeFromRust(prevSourceRange), ast), + codeRef: codeRefFromRange(prevSourceRange, ast), artifact: artifactGraph.get(prevSegment.__geoMeta.id), }, } @@ -937,7 +938,7 @@ export function findUsesOfTagInPipe( const tagArgValue = tagArg.type === 'TagDeclarator' ? String(tagArg.value) : tagArg.name if (tagArgValue === tag) - dependentRanges.push([node.start, node.end, true]) + dependentRanges.push(topLevelRange(node.start, node.end)) }, }) return dependentRanges diff --git a/src/lang/std/__snapshots__/artifactGraph.test.ts.snap b/src/lang/std/__snapshots__/artifactGraph.test.ts.snap deleted file mode 100644 index d31574a2d3..0000000000 --- a/src/lang/std/__snapshots__/artifactGraph.test.ts.snap +++ /dev/null @@ -1,559 +0,0 @@ -// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html - -exports[`testing createArtifactGraph > code with an extrusion, fillet and sketch of face: > snapshot of the artifactGraph 1`] = ` -Map { - "UUID-0" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 12, - 31, - true, - ], - }, - "id": "UUID", - "pathIds": [ - "UUID", - ], - "type": "plane", - }, - "UUID-1" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 37, - 64, - true, - ], - }, - "id": "UUID", - "planeId": "UUID", - "segIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - ], - "solid2dId": "UUID", - "sweepId": "UUID", - "type": "path", - }, - "UUID-2" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 70, - 86, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-3" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 92, - 119, - true, - ], - }, - "edgeCutId": "UUID", - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-4" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 125, - 150, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-5" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 156, - 203, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-6" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 209, - 217, - true, - ], - }, - "edgeIds": [], - "id": "UUID", - "pathId": "UUID", - "type": "segment", - }, - "UUID-7" => { - "id": "UUID", - "pathId": "UUID", - "type": "solid2D", - }, - "UUID-8" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 231, - 254, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "subType": "extrusion", - "surfaceIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - ], - "type": "sweep", - }, - "UUID-9" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-10" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [ - "UUID", - ], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-11" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-12" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-13" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "subType": "start", - "sweepId": "UUID", - "type": "cap", - }, - "UUID-14" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "subType": "end", - "sweepId": "UUID", - "type": "cap", - }, - "UUID-15" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-16" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-17" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-18" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-19" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-20" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-21" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-22" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-23" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 260, - 299, - true, - ], - }, - "consumedEdgeId": "UUID", - "edgeIds": [], - "id": "UUID", - "subType": "fillet", - "type": "edgeCut", - }, - "UUID-24" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 350, - 377, - true, - ], - }, - "id": "UUID", - "planeId": "UUID", - "segIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - ], - "solid2dId": "UUID", - "sweepId": "UUID", - "type": "path", - }, - "UUID-25" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 383, - 398, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-26" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 404, - 420, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-27" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 426, - 473, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "surfaceId": "UUID", - "type": "segment", - }, - "UUID-28" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 479, - 487, - true, - ], - }, - "edgeIds": [], - "id": "UUID", - "pathId": "UUID", - "type": "segment", - }, - "UUID-29" => { - "id": "UUID", - "pathId": "UUID", - "type": "solid2D", - }, - "UUID-30" => { - "codeRef": { - "pathToNode": [ - [ - "body", - "", - ], - ], - "range": [ - 501, - 522, - true, - ], - }, - "edgeIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - "UUID", - ], - "id": "UUID", - "pathId": "UUID", - "subType": "extrusion", - "surfaceIds": [ - "UUID", - "UUID", - "UUID", - "UUID", - ], - "type": "sweep", - }, - "UUID-31" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-32" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-33" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "segId": "UUID", - "sweepId": "UUID", - "type": "wall", - }, - "UUID-34" => { - "edgeCutEdgeIds": [], - "id": "UUID", - "pathIds": [], - "subType": "end", - "sweepId": "UUID", - "type": "cap", - }, - "UUID-35" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-36" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-37" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-38" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-39" => { - "id": "UUID", - "segId": "UUID", - "subType": "opposite", - "sweepId": "UUID", - "type": "sweepEdge", - }, - "UUID-40" => { - "id": "UUID", - "segId": "UUID", - "subType": "adjacent", - "sweepId": "UUID", - "type": "sweepEdge", - }, -} -`; diff --git a/src/lang/std/artifactGraph.test.ts b/src/lang/std/artifactGraph.test.ts deleted file mode 100644 index d9087e709c..0000000000 --- a/src/lang/std/artifactGraph.test.ts +++ /dev/null @@ -1,960 +0,0 @@ -import { - makeDefaultPlanes, - assertParse, - initPromise, - Program, - ArtifactCommand, - ExecState, -} from 'lang/wasm' -import { Models } from '@kittycad/lib' -import { - ResponseMap, - createArtifactGraph, - filterArtifacts, - expandPlane, - expandPath, - expandSweep, - ArtifactGraph, - expandSegment, - getArtifactsToUpdate, -} from './artifactGraph' -import { err } from 'lib/trap' -import { engineCommandManager, kclManager } from 'lib/singletons' -import { VITE_KC_DEV_TOKEN } from 'env' -import fsp from 'fs/promises' -import fs from 'fs' -import { chromium } from 'playwright' -import * as d3 from 'd3-force' -import path from 'path' -import pixelmatch from 'pixelmatch' -import { PNG } from 'pngjs' -import { Node } from 'wasm-lib/kcl/bindings/Node' - -/* -Note this is an integration test, these tests connect to our real dev server and make websocket commands. -It's needed for testing the artifactGraph, as it is tied to the websocket commands. -*/ - -const pathStart = 'src/lang/std/artifactMapCache' -const fullPath = `${pathStart}/artifactMapCache.json` - -const exampleCode1 = `sketch001 = startSketchOn('XY') - |> startProfileAt([-5, -5], %) - |> line([0, 10], %) - |> line([10.55, 0], %, $seg01) - |> line([0, -10], %, $seg02) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude001 = extrude(-10, sketch001) - |> fillet({ radius: 5, tags: [seg01] }, %) -sketch002 = startSketchOn(extrude001, seg02) - |> startProfileAt([-2, -6], %) - |> line([2, 3], %) - |> line([2, -3], %) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -extrude002 = extrude(5, sketch002) -` - -const exampleCodeNo3D = `sketch003 = startSketchOn('YZ') - |> startProfileAt([5.82, 0], %) - |> angledLine([180, 11.54], %, $rectangleSegmentA001) - |> angledLine([ - segAng(rectangleSegmentA001) - 90, - 8.21 - ], %, $rectangleSegmentB001) - |> angledLine([ - segAng(rectangleSegmentA001), - -segLen(rectangleSegmentA001) - ], %, $rectangleSegmentC001) - |> lineTo([profileStartX(%), profileStartY(%)], %) - |> close(%) -sketch004 = startSketchOn('-XZ') - |> startProfileAt([0, 14.36], %) - |> line([15.49, 0.05], %) - |> tangentialArcTo([0, 0], %) - |> tangentialArcTo([-6.8, 8.17], %) -` - -const sketchOnFaceOnFaceEtc = `sketch001 = startSketchOn('XZ') -|> startProfileAt([0, 0], %) -|> line([4, 8], %) -|> line([5, -8], %, $seg01) -|> lineTo([profileStartX(%), profileStartY(%)], %) -|> close(%) -extrude001 = extrude(6, sketch001) -sketch002 = startSketchOn(extrude001, seg01) -|> startProfileAt([-0.5, 0.5], %) -|> line([2, 5], %) -|> line([2, -5], %) -|> lineTo([profileStartX(%), profileStartY(%)], %) -|> close(%) -extrude002 = extrude(5, sketch002) -sketch003 = startSketchOn(extrude002, 'END') -|> startProfileAt([1, 1.5], %) -|> line([0.5, 2], %, $seg02) -|> line([1, -2], %) -|> lineTo([profileStartX(%), profileStartY(%)], %) -|> close(%) -extrude003 = extrude(4, sketch003) -sketch004 = startSketchOn(extrude003, seg02) -|> startProfileAt([-3, 14], %) -|> line([0.5, 1], %) -|> line([0.5, -2], %) -|> lineTo([profileStartX(%), profileStartY(%)], %) -|> close(%) -extrude004 = extrude(3, sketch004) -` -const exampleCodeOffsetPlanes = ` -offsetPlane001 = offsetPlane("XY", 20) -offsetPlane002 = offsetPlane("XZ", -50) -offsetPlane003 = offsetPlane("YZ", 10) - -sketch002 = startSketchOn(offsetPlane001) - |> startProfileAt([0, 0], %) - |> line([6.78, 15.01], %) -` - -// add more code snippets here and use `getCommands` to get the artifactCommands and responseMap for more tests -const codeToWriteCacheFor = { - exampleCode1, - sketchOnFaceOnFaceEtc, - exampleCodeNo3D, - exampleCodeOffsetPlanes, -} as const - -type CodeKey = keyof typeof codeToWriteCacheFor - -type CacheShape = { - [key in CodeKey]: { - artifactCommands: ArtifactCommand[] - responseMap: ResponseMap - execStateArtifacts: ExecState['artifacts'] - } -} - -beforeAll(async () => { - await initPromise - - // THESE TEST WILL FAIL without VITE_KC_DEV_TOKEN set in .env.development.local - await new Promise((resolve) => { - engineCommandManager.start({ - // disableWebRTC: true, - token: VITE_KC_DEV_TOKEN, - // there does seem to be a minimum resolution, not sure what it is but 256 works ok. - width: 256, - height: 256, - makeDefaultPlanes: () => makeDefaultPlanes(engineCommandManager), - setMediaStream: () => {}, - setIsStreamReady: () => {}, - // eslint-disable-next-line @typescript-eslint/no-misused-promises - callbackOnEngineLiteConnect: async () => { - const cacheEntries = Object.entries(codeToWriteCacheFor) as [ - CodeKey, - string - ][] - const cacheToWriteToFileTemp: Partial = {} - for (const [codeKey, code] of cacheEntries) { - const ast = assertParse(code) - await kclManager.executeAst({ ast }) - - cacheToWriteToFileTemp[codeKey] = { - artifactCommands: kclManager.execState.artifactCommands, - responseMap: engineCommandManager.responseMap, - execStateArtifacts: kclManager.execState.artifacts, - } - } - const cache = JSON.stringify(cacheToWriteToFileTemp) - - await fsp.mkdir(pathStart, { recursive: true }) - await fsp.writeFile(fullPath, cache) - resolve(true) - }, - }) - }) -}, 20_000) - -afterAll(() => { - engineCommandManager.tearDown() -}) - -describe('testing createArtifactGraph', () => { - describe('code with offset planes and a sketch:', () => { - let ast: Node - let theMap: ReturnType - - it('setup', () => { - // putting this logic in here because describe blocks runs before beforeAll has finished - const { - artifactCommands, - responseMap, - ast: _ast, - execStateArtifacts, - } = getCommands('exampleCodeOffsetPlanes') - ast = _ast - theMap = createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, - }) - }) - - it(`there should be one sketch`, () => { - const sketches = [...filterArtifacts({ types: ['path'] }, theMap)].map( - (path) => expandPath(path[1], theMap) - ) - expect(sketches).toHaveLength(1) - sketches.forEach((path) => { - if (err(path)) throw path - expect(path.type).toBe('path') - }) - }) - - it(`there should be three offsetPlanes`, () => { - const offsetPlanes = [ - ...filterArtifacts({ types: ['plane'] }, theMap), - ].map((plane) => expandPlane(plane[1], theMap)) - expect(offsetPlanes).toHaveLength(3) - offsetPlanes.forEach((path) => { - expect(path.type).toBe('plane') - }) - }) - - it(`Only one offset plane should have a path`, () => { - const offsetPlanes = [ - ...filterArtifacts({ types: ['plane'] }, theMap), - ].map((plane) => expandPlane(plane[1], theMap)) - const offsetPlaneWithPaths = offsetPlanes.filter( - (plane) => plane.paths.length - ) - expect(offsetPlaneWithPaths).toHaveLength(1) - }) - }) - describe('code with an extrusion, fillet and sketch of face:', () => { - let ast: Node - let theMap: ReturnType - it('setup', () => { - // putting this logic in here because describe blocks runs before beforeAll has finished - const { - artifactCommands, - responseMap, - ast: _ast, - execStateArtifacts, - } = getCommands('exampleCode1') - ast = _ast - theMap = createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, - }) - }) - - it('there should be two planes for the extrusion and the sketch on face', () => { - const planes = [...filterArtifacts({ types: ['plane'] }, theMap)].map( - (plane) => expandPlane(plane[1], theMap) - ) - expect(planes).toHaveLength(1) - planes.forEach((path) => { - expect(path.type).toBe('plane') - }) - }) - it('there should be two paths for the extrusion and the sketch on face', () => { - const paths = [...filterArtifacts({ types: ['path'] }, theMap)].map( - (path) => expandPath(path[1], theMap) - ) - expect(paths).toHaveLength(2) - paths.forEach((path) => { - if (err(path)) throw path - expect(path.type).toBe('path') - }) - }) - - it('there should be two extrusions, for the original and the sketchOnFace, the first extrusion should have 6 sides of the cube', () => { - const extrusions = [...filterArtifacts({ types: ['sweep'] }, theMap)].map( - (extrusion) => expandSweep(extrusion[1], theMap) - ) - expect(extrusions).toHaveLength(2) - extrusions.forEach((extrusion, index) => { - if (err(extrusion)) throw extrusion - expect(extrusion.type).toBe('sweep') - const firstExtrusionIsACubeIE6Sides = 6 - // Each face of the triangular prism (5), but without the bottom cap. - // The engine doesn't generate that. - const secondExtrusionIsATriangularPrism = 4 - expect(extrusion.surfaces.length).toBe( - !index - ? firstExtrusionIsACubeIE6Sides - : secondExtrusionIsATriangularPrism - ) - }) - }) - - it('there should be 5 + 4 segments, 4 (+close) from the first extrusion and 3 (+close) from the second', () => { - const segments = [...filterArtifacts({ types: ['segment'] }, theMap)].map( - (segment) => expandSegment(segment[1], theMap) - ) - expect(segments).toHaveLength(9) - }) - - it('snapshot of the artifactGraph', () => { - const stableMap = new Map( - [...theMap].map(([, artifact], index): [string, any] => { - const stableValue: any = {} - Object.entries(artifact).forEach(([propName, value]) => { - if ( - propName === 'type' || - propName === 'codeRef' || - propName === 'subType' - ) { - stableValue[propName] = value - return - } - if (Array.isArray(value)) - stableValue[propName] = value.map(() => 'UUID') - if (typeof value === 'string' && value) - stableValue[propName] = 'UUID' - }) - return [`UUID-${index}`, stableValue] - }) - ) - expect(stableMap).toMatchSnapshot() - }) - - it('screenshot graph', async () => { - // Ostensibly this takes a screen shot of the graph of the artifactGraph - // but it's it also tests that all of the id links are correct because if one - // of the edges refers to a non-existent node, the graph will throw. - // further more we can check that each edge is bi-directional, if it's not - // by checking the arrow heads going both ways, on the graph. - await GraphTheGraph(theMap, 2000, 2000, 'exampleCode1.png') - }, 20000) - }) - - describe(`code with sketches but no extrusions or other 3D elements`, () => { - let ast: Node - let theMap: ReturnType - it(`setup`, () => { - // putting this logic in here because describe blocks runs before beforeAll has finished - const { - artifactCommands, - responseMap, - ast: _ast, - execStateArtifacts, - } = getCommands('exampleCodeNo3D') - ast = _ast - theMap = createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, - }) - }) - - it('there should be two planes, one for each sketch path', () => { - const planes = [...filterArtifacts({ types: ['plane'] }, theMap)].map( - (plane) => expandPlane(plane[1], theMap) - ) - expect(planes).toHaveLength(2) - planes.forEach((path) => { - expect(path.type).toBe('plane') - }) - }) - it('there should be two paths, one on each plane', () => { - const paths = [...filterArtifacts({ types: ['path'] }, theMap)].map( - (path) => expandPath(path[1], theMap) - ) - expect(paths).toHaveLength(2) - paths.forEach((path) => { - if (err(path)) throw path - expect(path.type).toBe('path') - }) - }) - - it(`there should be 1 solid2D, just for the first closed path`, () => { - const solid2Ds = [...filterArtifacts({ types: ['solid2D'] }, theMap)] - expect(solid2Ds).toHaveLength(1) - }) - - it('there should be no extrusions', () => { - const extrusions = [...filterArtifacts({ types: ['sweep'] }, theMap)].map( - (extrusion) => expandSweep(extrusion[1], theMap) - ) - expect(extrusions).toHaveLength(0) - }) - - it('there should be 8 segments, 4 + 1 (close) from the first sketch and 3 from the second', () => { - const segments = [...filterArtifacts({ types: ['segment'] }, theMap)].map( - (segment) => expandSegment(segment[1], theMap) - ) - expect(segments).toHaveLength(8) - }) - - it('screenshot graph', async () => { - // Ostensibly this takes a screen shot of the graph of the artifactGraph - // but it's it also tests that all of the id links are correct because if one - // of the edges refers to a non-existent node, the graph will throw. - // further more we can check that each edge is bi-directional, if it's not - // by checking the arrow heads going both ways, on the graph. - await GraphTheGraph(theMap, 2000, 2000, 'exampleCodeNo3D.png') - }, 20000) - }) -}) - -describe('capture graph of sketchOnFaceOnFace...', () => { - describe('code with an extrusion, fillet and sketch of face:', () => { - let ast: Node - let theMap: ReturnType - it('setup', async () => { - // putting this logic in here because describe blocks runs before beforeAll has finished - const { - artifactCommands, - responseMap, - ast: _ast, - execStateArtifacts, - } = getCommands('sketchOnFaceOnFaceEtc') - ast = _ast - theMap = createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, - }) - - // Ostensibly this takes a screen shot of the graph of the artifactGraph - // but it's it also tests that all of the id links are correct because if one - // of the edges refers to a non-existent node, the graph will throw. - // further more we can check that each edge is bi-directional, if it's not - // by checking the arrow heads going both ways, on the graph. - await GraphTheGraph(theMap, 3000, 3000, 'sketchOnFaceOnFaceEtc.png') - }, 20000) - }) -}) - -function getCommands( - codeKey: CodeKey -): CacheShape[CodeKey] & { ast: Node } { - const ast = assertParse(codeKey) - const file = fs.readFileSync(fullPath, 'utf-8') - const parsed: CacheShape = JSON.parse(file) - // these either already exist from the last run, or were created in - const artifactCommands = parsed[codeKey].artifactCommands - const responseMap = parsed[codeKey].responseMap - const execStateArtifacts = parsed[codeKey].execStateArtifacts - return { - artifactCommands, - responseMap, - ast, - execStateArtifacts, - } -} - -async function GraphTheGraph( - theMap: ArtifactGraph, - sizeX: number, - sizeY: number, - imageName: string -) { - const nodes: Array<{ id: string; label: string }> = [] - const edges: Array<{ source: string; target: string; label: string }> = [] - let index = 0 - for (const [commandId, artifact] of theMap) { - nodes.push({ - id: commandId, - label: `${artifact.type}-${index++}`, - }) - Object.entries(artifact).forEach(([propName, value]) => { - if ( - propName === 'type' || - propName === 'codeRef' || - propName === 'subType' || - propName === 'id' - ) - return - if (Array.isArray(value)) - value.forEach((v) => { - v && edges.push({ source: commandId, target: v, label: propName }) - }) - if (typeof value === 'string' && value) - edges.push({ source: commandId, target: value, label: propName }) - }) - } - - // Create a force simulation to calculate node positions - const simulation = d3 - .forceSimulation(nodes as any) - .force( - 'link', - d3 - .forceLink(edges) - .id((d: any) => d.id) - .distance(100) - ) - .force('charge', d3.forceManyBody().strength(-300)) - .force('center', d3.forceCenter(300, 200)) - .stop() - - // Run the simulation - for (let i = 0; i < 300; ++i) simulation.tick() - - // Create traces for Plotly - const nodeTrace = { - x: nodes.map((node: any) => node.x), - y: nodes.map((node: any) => node.y), - text: nodes.map((node) => node.label), // Use the custom label - mode: 'markers+text', - type: 'scatter', - marker: { size: 20, color: 'gray' }, // Nodes in gray - textfont: { size: 14, color: 'black' }, // Labels in black - textposition: 'top center', // Position text on top - } - - const edgeTrace = { - x: [], - y: [], - mode: 'lines', - type: 'scatter', - line: { width: 2, color: 'lightgray' }, // Edges in light gray - } - - const annotations: any[] = [] - - edges.forEach((edge) => { - const sourceNode = nodes.find( - (node: any) => node.id === (edge as any).source.id - ) - const targetNode = nodes.find( - (node: any) => node.id === (edge as any).target.id - ) - - // Check if nodes are found - if (!sourceNode || !targetNode) { - throw new Error( - // @ts-ignore - `Node not found: ${!sourceNode ? edge.source.id : edge.target.id}` - ) - } - - // @ts-ignore - edgeTrace.x.push(sourceNode.x, targetNode.x, null) - // @ts-ignore - edgeTrace.y.push(sourceNode.y, targetNode.y, null) - - // Calculate offset for arrowhead - const offsetFactor = 0.9 // Adjust this factor to control the offset distance - // @ts-ignore - const offsetX = (targetNode.x - sourceNode.x) * offsetFactor - // @ts-ignore - const offsetY = (targetNode.y - sourceNode.y) * offsetFactor - - // Add arrowhead annotation with offset - annotations.push({ - // @ts-ignore - ax: sourceNode.x, - // @ts-ignore - ay: sourceNode.y, - // @ts-ignore - x: targetNode.x - offsetX, - // @ts-ignore - y: targetNode.y - offsetY, - xref: 'x', - yref: 'y', - axref: 'x', - ayref: 'y', - showarrow: true, - arrowhead: 2, - arrowsize: 1, - arrowwidth: 2, - arrowcolor: 'darkgray', // Arrowheads in dark gray - }) - - // Add edge label annotation closer to the edge tail (25% of the length) - // @ts-ignore - const labelX = sourceNode.x * 0.75 + targetNode.x * 0.25 - // @ts-ignore - const labelY = sourceNode.y * 0.75 + targetNode.y * 0.25 - annotations.push({ - x: labelX, - y: labelY, - xref: 'x', - yref: 'y', - text: edge.label, - showarrow: false, - font: { size: 12, color: 'black' }, // Edge labels in black - align: 'center', - }) - }) - - const data = [edgeTrace, nodeTrace] - - const layout = { - // title: 'Force-Directed Graph with Nodes and Edges', - xaxis: { showgrid: false, zeroline: false, showticklabels: false }, - yaxis: { showgrid: false, zeroline: false, showticklabels: false }, - showlegend: false, - annotations: annotations, - } - - // Export to PNG using Playwright - const browser = await chromium.launch() - const page = await browser.newPage() - await page.setContent(` - - - - - -
- - - - `) - await page.waitForSelector('#plotly-graph') - const element = await page.$('#plotly-graph') - - // @ts-ignore - await element.screenshot({ - path: `./e2e/playwright/temp3.png`, - }) - - await browser.close() - - const originalImgPath = path.resolve( - `./src/lang/std/artifactMapGraphs/${imageName}` - ) - // chop the top 30 pixels off the image - const originalImgExists = fs.existsSync(originalImgPath) - const originalImg = originalImgExists - ? PNG.sync.read(fs.readFileSync(originalImgPath)) - : null - // const img1Data = new Uint8Array(img1.data) - // const img1DataChopped = img1Data.slice(30 * img1.width * 4) - // img1.data = Buffer.from(img1DataChopped) - - const newImagePath = path.resolve('./e2e/playwright/temp3.png') - const newImage = PNG.sync.read(fs.readFileSync(newImagePath)) - const newImageData = new Uint8Array(newImage.data) - const newImageDataChopped = newImageData.slice(30 * newImage.width * 4) - newImage.data = Buffer.from(newImageDataChopped) - - const { width, height } = originalImg ?? newImage - const diff = new PNG({ width, height }) - - const imageSizeDifferent = originalImg?.data.length !== newImage.data.length - let numDiffPixels = 0 - if (!imageSizeDifferent) { - numDiffPixels = pixelmatch( - originalImg.data, - newImage.data, - diff.data, - width, - height, - { - threshold: 0.1, - } - ) - } - - if (numDiffPixels > 10 || imageSizeDifferent) { - console.warn('numDiffPixels', numDiffPixels) - // write file out to final place - fs.writeFileSync( - `src/lang/std/artifactMapGraphs/${imageName}`, - PNG.sync.write(newImage) - ) - } -} - -describe('testing getArtifactsToUpdate', () => { - it('should return an array of artifacts to update', () => { - const { artifactCommands, responseMap, ast, execStateArtifacts } = - getCommands('exampleCode1') - const map = createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, - }) - const getArtifact = (id: string) => map.get(id) - const currentPlaneId = 'UUID-1' - const getUpdateObjects = (type: Models['ModelingCmd_type']['type']) => { - const artifactCommand = artifactCommands.find( - (a) => a.command.type === type - ) - if (!artifactCommand) { - throw new Error(`No artifactCommand found for ${type}`) - } - const artifactsToUpdate = getArtifactsToUpdate({ - artifactCommand, - responseMap, - getArtifact, - currentPlaneId, - ast, - execStateArtifacts, - }) - return artifactsToUpdate.map(({ artifact }) => artifact) - } - expect(getUpdateObjects('start_path')).toEqual([ - { - type: 'path', - segIds: [], - id: expect.any(String), - planeId: 'UUID-1', - sweepId: undefined, - codeRef: { - pathToNode: [['body', '']], - range: [37, 64, true], - }, - }, - ]) - expect(getUpdateObjects('extrude')).toEqual([ - { - type: 'sweep', - subType: 'extrusion', - pathId: expect.any(String), - id: expect.any(String), - surfaceIds: [], - edgeIds: [], - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'path', - id: expect.any(String), - segIds: expect.any(Array), - planeId: expect.any(String), - sweepId: expect.any(String), - codeRef: { - range: [37, 64, true], - pathToNode: [['body', '']], - }, - solid2dId: expect.any(String), - }, - ]) - expect(getUpdateObjects('extend_path')).toEqual([ - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: undefined, - edgeIds: [], - codeRef: { - range: [70, 86, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'path', - id: expect.any(String), - segIds: expect.any(Array), - planeId: expect.any(String), - sweepId: expect.any(String), - codeRef: { - range: [37, 64, true], - pathToNode: [['body', '']], - }, - solid2dId: expect.any(String), - }, - ]) - expect(getUpdateObjects('solid3d_fillet_edge')).toEqual([ - { - type: 'edgeCut', - subType: 'fillet', - id: expect.any(String), - consumedEdgeId: expect.any(String), - edgeIds: [], - surfaceId: undefined, - codeRef: { - range: [260, 299, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: expect.any(String), - edgeIds: expect.any(Array), - codeRef: { - range: [92, 119, true], - pathToNode: [['body', '']], - }, - edgeCutId: expect.any(String), - }, - ]) - expect(getUpdateObjects('solid3d_get_extrusion_face_info')).toEqual([ - { - type: 'wall', - id: expect.any(String), - segId: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: expect.any(String), - edgeIds: expect.any(Array), - codeRef: { - range: [156, 203, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'wall', - id: expect.any(String), - segId: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: expect.any(String), - edgeIds: expect.any(Array), - codeRef: { - range: [125, 150, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'wall', - id: expect.any(String), - segId: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: expect.any(String), - edgeIds: expect.any(Array), - codeRef: { - range: [92, 119, true], - pathToNode: [['body', '']], - }, - edgeCutId: expect.any(String), - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'wall', - id: expect.any(String), - segId: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'segment', - id: expect.any(String), - pathId: expect.any(String), - surfaceId: expect.any(String), - edgeIds: expect.any(Array), - codeRef: { - range: [70, 86, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'cap', - subType: 'start', - id: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - { - type: 'cap', - subType: 'end', - id: expect.any(String), - edgeCutEdgeIds: [], - sweepId: expect.any(String), - pathIds: [], - }, - { - type: 'sweep', - subType: 'extrusion', - id: expect.any(String), - pathId: expect.any(String), - surfaceIds: expect.any(Array), - edgeIds: expect.any(Array), - codeRef: { - range: [231, 254, true], - pathToNode: [['body', '']], - }, - }, - ]) - }) -}) diff --git a/src/lang/std/artifactGraph.ts b/src/lang/std/artifactGraph.ts index 92ff13cd4d..879203d181 100644 --- a/src/lang/std/artifactGraph.ts +++ b/src/lang/std/artifactGraph.ts @@ -1,17 +1,25 @@ import { - ArtifactCommand, - ExecState, + Artifact, + ArtifactGraph, + ArtifactId, PathToNode, Program, SourceRange, - sourceRangeFromRust, + PathArtifact, + PlaneArtifact, + WallArtifact, + SegmentArtifact, + Solid2dArtifact as Solid2D, + SweepArtifact, + SweepEdge, + CapArtifact, + EdgeCut, } from 'lang/wasm' import { Models } from '@kittycad/lib' import { getNodePathFromSourceRange } from 'lang/queryAst' import { err } from 'lib/trap' -import { Node } from 'wasm-lib/kcl/bindings/Node' -export type ArtifactId = string +export type { Artifact, ArtifactId, SegmentArtifact } from 'lang/wasm' interface BaseArtifact { id: ArtifactId @@ -22,30 +30,12 @@ export interface CodeRef { pathToNode: PathToNode } -export interface PlaneArtifact extends BaseArtifact { - type: 'plane' - pathIds: Array - codeRef: CodeRef -} export interface PlaneArtifactRich extends BaseArtifact { type: 'plane' paths: Array codeRef: CodeRef } -export interface PathArtifact extends BaseArtifact { - type: 'path' - planeId: ArtifactId - segIds: Array - sweepId?: ArtifactId - solid2dId?: ArtifactId - codeRef: CodeRef -} - -interface solid2D extends BaseArtifact { - type: 'solid2D' - pathId: ArtifactId -} export interface PathArtifactRich extends BaseArtifact { type: 'path' /** A path must always lie on a plane */ @@ -53,18 +43,10 @@ export interface PathArtifactRich extends BaseArtifact { /** A path must always contain 0 or more segments */ segments: Array /** A path may not result in a sweep artifact */ - sweep?: SweepArtifact + sweep: SweepArtifact | null codeRef: CodeRef } -export interface SegmentArtifact extends BaseArtifact { - type: 'segment' - pathId: ArtifactId - surfaceId?: ArtifactId - edgeIds: Array - edgeCutId?: ArtifactId - codeRef: CodeRef -} interface SegmentArtifactRich extends BaseArtifact { type: 'segment' path: PathArtifact @@ -74,15 +56,6 @@ interface SegmentArtifactRich extends BaseArtifact { codeRef: CodeRef } -/** A Sweep is a more generic term for extrude, revolve, loft and sweep*/ -interface SweepArtifact extends BaseArtifact { - type: 'sweep' - subType: 'extrusion' | 'revolve' | 'loft' | 'sweep' - pathId: string - surfaceIds: Array - edgeIds: Array - codeRef: CodeRef -} interface SweepArtifactRich extends BaseArtifact { type: 'sweep' subType: 'extrusion' | 'revolve' | 'loft' | 'sweep' @@ -92,58 +65,6 @@ interface SweepArtifactRich extends BaseArtifact { codeRef: CodeRef } -interface WallArtifact extends BaseArtifact { - type: 'wall' - segId: ArtifactId - edgeCutEdgeIds: Array - sweepId: ArtifactId - pathIds: Array -} -interface CapArtifact extends BaseArtifact { - type: 'cap' - subType: 'start' | 'end' - edgeCutEdgeIds: Array - sweepId: ArtifactId - pathIds: Array -} - -interface SweepEdge extends BaseArtifact { - type: 'sweepEdge' - segId: ArtifactId - sweepId: ArtifactId - subType: 'opposite' | 'adjacent' -} - -/** A edgeCut is a more generic term for both fillet or chamfer */ -interface EdgeCut extends BaseArtifact { - type: 'edgeCut' - subType: 'fillet' | 'chamfer' - consumedEdgeId: ArtifactId - edgeIds: Array - surfaceId?: ArtifactId - codeRef: CodeRef -} - -interface EdgeCutEdge extends BaseArtifact { - type: 'edgeCutEdge' - edgeCutId: ArtifactId - surfaceId: ArtifactId -} - -export type Artifact = - | PlaneArtifact - | PathArtifact - | SegmentArtifact - | SweepArtifact - | WallArtifact - | CapArtifact - | SweepEdge - | EdgeCut - | EdgeCutEdge - | solid2D - -export type ArtifactGraph = Map - export type EngineCommand = Models['WebSocketRequest_type'] type OkWebSocketResponseData = Models['OkWebSocketResponseData_type'] @@ -152,437 +73,6 @@ export interface ResponseMap { [commandId: string]: OkWebSocketResponseData } -/** Creates a graph of artifacts from a list of ordered commands and their responses - * muting the Map should happen entirely this function, other functions called within - * should return data on how to update the map, and not do so directly. - */ -export function createArtifactGraph({ - artifactCommands, - responseMap, - ast, - execStateArtifacts, -}: { - artifactCommands: Array - responseMap: ResponseMap - ast: Node - execStateArtifacts: ExecState['artifacts'] -}) { - const myMap = new Map() - - /** see docstring for {@link getArtifactsToUpdate} as to why this is needed */ - let currentPlaneId = '' - - for (const artifactCommand of artifactCommands) { - if (artifactCommand.command.type === 'enable_sketch_mode') { - currentPlaneId = artifactCommand.command.entity_id - } - if (artifactCommand.command.type === 'sketch_mode_disable') { - currentPlaneId = '' - } - const artifactsToUpdate = getArtifactsToUpdate({ - artifactCommand, - responseMap, - getArtifact: (id: ArtifactId) => myMap.get(id), - currentPlaneId, - ast, - execStateArtifacts, - }) - artifactsToUpdate.forEach(({ id, artifact }) => { - const mergedArtifact = mergeArtifacts(myMap.get(id), artifact) - myMap.set(id, mergedArtifact) - }) - } - return myMap -} - -/** Merges two artifacts, since our artifacts only contain strings and arrays of string for values we coerce that - * but maybe types can be improved here. - */ -function mergeArtifacts( - oldArtifact: Artifact | undefined, - newArtifact: Artifact -): Artifact { - // only has string and array of strings - interface GenericArtifact { - [key: string]: string | Array - } - if (!oldArtifact) return newArtifact - // merging artifacts of different types should never happen, but if it does, just return the new artifact - if (oldArtifact.type !== newArtifact.type) return newArtifact - const _oldArtifact = oldArtifact as any as GenericArtifact - const mergedArtifact = { ...oldArtifact, ...newArtifact } as GenericArtifact - Object.entries(newArtifact as any as GenericArtifact).forEach( - ([propName, value]) => { - const otherValue = _oldArtifact[propName] - if (Array.isArray(value) && Array.isArray(otherValue)) { - mergedArtifact[propName] = [...new Set([...otherValue, ...value])] - } - } - ) - return mergedArtifact as any as Artifact -} - -/** - * Processes a single command and it's response in order to populate the artifact map - * It does not mutate the map directly, but returns an array of artifacts to update - * - * @param currentPlaneId is only needed for `start_path` commands because this command does not have a pathId - * instead it relies on the id used with the `enable_sketch_mode` command, so this much be kept track of - * outside of this function. It would be good to update the `start_path` command to include the planeId so we - * can remove this. - */ -export function getArtifactsToUpdate({ - artifactCommand, - getArtifact, - responseMap, - currentPlaneId, - ast, - execStateArtifacts, -}: { - artifactCommand: ArtifactCommand - responseMap: ResponseMap - /** Passing in a getter because we don't wan this function to update the map directly */ - getArtifact: (id: ArtifactId) => Artifact | undefined - currentPlaneId: ArtifactId - ast: Node - execStateArtifacts: ExecState['artifacts'] -}): Array<{ - id: ArtifactId - artifact: Artifact -}> { - const range = sourceRangeFromRust(artifactCommand.range) - const pathToNode = getNodePathFromSourceRange(ast, range) - - const id = artifactCommand.cmdId - const response = responseMap[id] - const cmd = artifactCommand.command - const returnArr: ReturnType = [] - if (!response) return returnArr - if (cmd.type === 'make_plane' && range[1] !== 0) { - // If we're calling `make_plane` and the code range doesn't end at `0` - // it's not a default plane, but a custom one from the offsetPlane standard library function - return [ - { - id, - artifact: { - type: 'plane', - id, - pathIds: [], - codeRef: { range, pathToNode }, - }, - }, - ] - } else if (cmd.type === 'enable_sketch_mode') { - const plane = getArtifact(currentPlaneId) - const pathIds = plane?.type === 'plane' ? plane?.pathIds : [] - const codeRef = - plane?.type === 'plane' ? plane?.codeRef : { range, pathToNode } - const existingPlane = getArtifact(currentPlaneId) - if (existingPlane?.type === 'wall') { - return [ - { - id: currentPlaneId, - artifact: { - type: 'wall', - id: currentPlaneId, - segId: existingPlane.segId, - edgeCutEdgeIds: existingPlane.edgeCutEdgeIds, - sweepId: existingPlane.sweepId, - pathIds: existingPlane.pathIds, - }, - }, - ] - } else { - return [ - { - id: currentPlaneId, - artifact: { type: 'plane', id: currentPlaneId, pathIds, codeRef }, - }, - ] - } - } else if (cmd.type === 'start_path') { - returnArr.push({ - id, - artifact: { - type: 'path', - id, - segIds: [], - planeId: currentPlaneId, - sweepId: undefined, - codeRef: { range, pathToNode }, - }, - }) - const plane = getArtifact(currentPlaneId) - const codeRef = - plane?.type === 'plane' ? plane?.codeRef : { range, pathToNode } - if (plane?.type === 'plane') { - returnArr.push({ - id: currentPlaneId, - artifact: { type: 'plane', id: currentPlaneId, pathIds: [id], codeRef }, - }) - } - if (plane?.type === 'wall') { - returnArr.push({ - id: currentPlaneId, - artifact: { - type: 'wall', - id: currentPlaneId, - segId: plane.segId, - edgeCutEdgeIds: plane.edgeCutEdgeIds, - sweepId: plane.sweepId, - pathIds: [id], - }, - }) - } - return returnArr - } else if (cmd.type === 'extend_path' || cmd.type === 'close_path') { - const pathId = cmd.type === 'extend_path' ? cmd.path : cmd.path_id - returnArr.push({ - id, - artifact: { - type: 'segment', - id, - pathId, - surfaceId: undefined, - edgeIds: [], - codeRef: { range, pathToNode }, - }, - }) - const path = getArtifact(pathId) - if (path?.type === 'path') - returnArr.push({ - id: pathId, - artifact: { ...path, segIds: [id] }, - }) - if ( - response?.type === 'modeling' && - response.data.modeling_response.type === 'close_path' - ) { - returnArr.push({ - id: response.data.modeling_response.data.face_id, - artifact: { - type: 'solid2D', - id: response.data.modeling_response.data.face_id, - pathId, - }, - }) - const path = getArtifact(pathId) - if (path?.type === 'path') - returnArr.push({ - id: pathId, - artifact: { - ...path, - solid2dId: response.data.modeling_response.data.face_id, - }, - }) - } - return returnArr - } else if ( - cmd.type === 'extrude' || - cmd.type === 'revolve' || - cmd.type === 'sweep' - ) { - const subType = cmd.type === 'extrude' ? 'extrusion' : cmd.type - returnArr.push({ - id, - artifact: { - type: 'sweep', - subType: subType, - id, - pathId: cmd.target, - surfaceIds: [], - edgeIds: [], - codeRef: { range, pathToNode }, - }, - }) - const path = getArtifact(cmd.target) - if (path?.type === 'path') - returnArr.push({ - id: cmd.target, - artifact: { ...path, sweepId: id }, - }) - return returnArr - } else if ( - cmd.type === 'loft' && - response.type === 'modeling' && - response.data.modeling_response.type === 'loft' - ) { - returnArr.push({ - id, - artifact: { - type: 'sweep', - subType: 'loft', - id, - // TODO: make sure to revisit this choice, don't think it matters for now - pathId: cmd.section_ids[0], - surfaceIds: [], - edgeIds: [], - codeRef: { range, pathToNode }, - }, - }) - for (const sectionId of cmd.section_ids) { - const path = getArtifact(sectionId) - if (path?.type === 'path') - returnArr.push({ - id: sectionId, - artifact: { ...path, sweepId: id }, - }) - } - return returnArr - } else if ( - cmd.type === 'solid3d_get_extrusion_face_info' && - response?.type === 'modeling' && - response.data.modeling_response.type === 'solid3d_get_extrusion_face_info' - ) { - let lastPath: PathArtifact - response.data.modeling_response.data.faces.forEach( - ({ curve_id, cap, face_id }) => { - if (cap === 'none' && curve_id && face_id) { - const seg = getArtifact(curve_id) - if (seg?.type !== 'segment') return - const path = getArtifact(seg.pathId) - if (path?.type === 'path' && seg?.type === 'segment') { - lastPath = path - returnArr.push({ - id: face_id, - artifact: { - type: 'wall', - id: face_id, - segId: curve_id, - edgeCutEdgeIds: [], - // TODO: Add explicit check for sweepId. Should never use '' - sweepId: path.sweepId ?? '', - pathIds: [], - }, - }) - returnArr.push({ - id: curve_id, - artifact: { ...seg, surfaceId: face_id }, - }) - if (path.sweepId) { - const sweep = getArtifact(path.sweepId) - if (sweep?.type === 'sweep') { - returnArr.push({ - id: path.sweepId, - artifact: { - ...sweep, - surfaceIds: [face_id], - }, - }) - } - } - } - } - } - ) - response.data.modeling_response.data.faces.forEach(({ cap, face_id }) => { - if ((cap === 'top' || cap === 'bottom') && face_id) { - const path = lastPath - if (path?.type === 'path') { - returnArr.push({ - id: face_id, - artifact: { - type: 'cap', - id: face_id, - subType: cap === 'bottom' ? 'start' : 'end', - edgeCutEdgeIds: [], - // TODO: Add explicit check for sweepId. Should never use '' - sweepId: path.sweepId ?? '', - pathIds: [], - }, - }) - if (path.sweepId) { - const sweep = getArtifact(path.sweepId) - if (sweep?.type !== 'sweep') return - returnArr.push({ - id: path.sweepId, - artifact: { - ...sweep, - surfaceIds: [face_id], - }, - }) - } - } - } - }) - return returnArr - } else if ( - // is opposite edge - (cmd.type === 'solid3d_get_opposite_edge' && - response.type === 'modeling' && - response.data.modeling_response.type === 'solid3d_get_opposite_edge' && - response.data.modeling_response.data.edge) || - // or is adjacent edge - (cmd.type === 'solid3d_get_next_adjacent_edge' && - response.type === 'modeling' && - response.data.modeling_response.type === - 'solid3d_get_next_adjacent_edge' && - response.data.modeling_response.data.edge) - ) { - const wall = getArtifact(cmd.face_id) - if (wall?.type !== 'wall') return returnArr - const sweep = getArtifact(wall.sweepId) - if (sweep?.type !== 'sweep') return returnArr - const path = getArtifact(sweep.pathId) - if (path?.type !== 'path') return returnArr - const segment = getArtifact(cmd.edge_id) - if (segment?.type !== 'segment') return returnArr - - return [ - { - id: response.data.modeling_response.data.edge, - artifact: { - type: 'sweepEdge', - id: response.data.modeling_response.data.edge, - subType: - cmd.type === 'solid3d_get_next_adjacent_edge' - ? 'adjacent' - : 'opposite', - segId: cmd.edge_id, - // TODO: Add explicit check for sweepId. Should never use '' - sweepId: path.sweepId ?? '', - }, - }, - { - id: cmd.edge_id, - artifact: { - ...segment, - edgeIds: [response.data.modeling_response.data.edge], - }, - }, - { - id: sweep.id, - artifact: { - ...sweep, - edgeIds: [response.data.modeling_response.data.edge], - }, - }, - ] - } else if (cmd.type === 'solid3d_fillet_edge') { - returnArr.push({ - id, - artifact: { - type: 'edgeCut', - id, - subType: cmd.cut_type, - consumedEdgeId: cmd.edge_id, - edgeIds: [], - surfaceId: undefined, - codeRef: { range, pathToNode }, - }, - }) - const consumedEdge = getArtifact(cmd.edge_id) - if (consumedEdge?.type === 'segment') { - returnArr.push({ - id: cmd.edge_id, - artifact: { ...consumedEdge, edgeCutId: id }, - }) - } - return returnArr - } - return [] -} - /** filter map items of a specific type */ export function filterArtifacts( { @@ -676,7 +166,7 @@ export function expandPath( }, artifactGraph ) - : undefined + : null const plane = getArtifactOfTypes( { key: path.planeId, types: ['plane', 'wall'] }, artifactGraph @@ -778,11 +268,11 @@ export function getCapCodeRef( } export function getSolid2dCodeRef( - solid2D: solid2D, + solid2d: Solid2D, artifactGraph: ArtifactGraph ): CodeRef | Error { const path = getArtifactOfTypes( - { key: solid2D.pathId, types: ['path'] }, + { key: solid2d.pathId, types: ['path'] }, artifactGraph ) if (err(path)) return path @@ -881,7 +371,7 @@ export function getCodeRefsByArtifactId( artifactGraph: ArtifactGraph ): Array | null { const artifact = artifactGraph.get(id) - if (artifact?.type === 'solid2D') { + if (artifact?.type === 'solid2d') { const codeRef = getSolid2dCodeRef(artifact, artifactGraph) if (err(codeRef)) return null return [codeRef] diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index d4e469ee53..5d65a4e449 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -1,9 +1,7 @@ import { - ArtifactCommand, - defaultRustSourceRange, + ArtifactGraph, + defaultSourceRange, ExecState, - Program, - RustSourceRange, SourceRange, } from 'lang/wasm' import { VITE_KC_API_WS_MODELING_URL, VITE_KC_DEV_TOKEN } from 'env' @@ -17,12 +15,7 @@ import { darkModeMatcher, } from 'lib/theme' import { DefaultPlanes } from 'wasm-lib/kcl/bindings/DefaultPlanes' -import { - ArtifactGraph, - EngineCommand, - ResponseMap, - createArtifactGraph, -} from 'lang/std/artifactGraph' +import { EngineCommand, ResponseMap } from 'lang/std/artifactGraph' import { useModelingContext } from 'hooks/useModelingContext' import { exportMake } from 'lib/exportMake' import toast from 'react-hot-toast' @@ -36,7 +29,6 @@ import { KclManager } from 'lang/KclSingleton' import { reportRejection } from 'lib/trap' import { markOnce } from 'lib/performance' import { MachineManager } from 'components/MachineManagerProvider' -import { Node } from 'wasm-lib/kcl/bindings/Node' // TODO(paultag): This ought to be tweakable. const pingIntervalMs = 5_000 @@ -1309,8 +1301,8 @@ export enum EngineCommandManagerEvents { interface PendingMessage { command: EngineCommand - range: RustSourceRange - idToRangeMap: { [key: string]: RustSourceRange } + range: SourceRange + idToRangeMap: { [key: string]: SourceRange } resolve: (data: [Models['WebSocketResponse_type']]) => void reject: (reason: string) => void promise: Promise<[Models['WebSocketResponse_type']]> @@ -1994,7 +1986,7 @@ export class EngineCommandManager extends EventTarget { { command, idToRangeMap: {}, - range: defaultRustSourceRange(), + range: defaultSourceRange(), }, true // isSceneCommand ) @@ -2025,9 +2017,9 @@ export class EngineCommandManager extends EventTarget { return Promise.reject(new Error('rangeStr is undefined')) if (commandStr === undefined) return Promise.reject(new Error('commandStr is undefined')) - const range: RustSourceRange = JSON.parse(rangeStr) + const range: SourceRange = JSON.parse(rangeStr) const command: EngineCommand = JSON.parse(commandStr) - const idToRangeMap: { [key: string]: RustSourceRange } = + const idToRangeMap: { [key: string]: SourceRange } = JSON.parse(idToRangeStr) // Current executeAst is stale, going to interrupt, a new executeAst will trigger @@ -2087,17 +2079,8 @@ export class EngineCommandManager extends EventTarget { Object.values(this.pendingCommands).map((a) => a.promise) ) } - updateArtifactGraph( - ast: Node, - artifactCommands: ArtifactCommand[], - execStateArtifacts: ExecState['artifacts'] - ) { - this.artifactGraph = createArtifactGraph({ - artifactCommands, - responseMap: this.responseMap, - ast, - execStateArtifacts, - }) + updateArtifactGraph(execStateArtifactGraph: ExecState['artifactGraph']) { + this.artifactGraph = execStateArtifactGraph // TODO check if these still need to be deferred once e2e tests are working again. if (this.artifactGraph.size) { this.deferredArtifactEmptied(null) diff --git a/src/lang/std/sketch.test.ts b/src/lang/std/sketch.test.ts index 60dd3f4ed6..5c631666d4 100644 --- a/src/lang/std/sketch.test.ts +++ b/src/lang/std/sketch.test.ts @@ -11,8 +11,8 @@ import { assertParse, recast, initPromise, - SourceRange, CallExpression, + topLevelRange, } from '../wasm' import { getNodeFromPath, getNodePathFromSourceRange } from '../queryAst' import { enginelessExecutor } from '../../lib/testHelpers' @@ -124,7 +124,10 @@ describe('testing changeSketchArguments', () => { execState.memory, { type: 'sourceRange', - sourceRange: [sourceStart, sourceStart + lineToChange.length, true], + sourceRange: topLevelRange( + sourceStart, + sourceStart + lineToChange.length + ), }, { type: 'straight-segment', @@ -219,11 +222,10 @@ describe('testing addTagForSketchOnFace', () => { const ast = assertParse(code) await enginelessExecutor(ast) const sourceStart = code.indexOf(originalLine) - const sourceRange: [number, number, boolean] = [ + const sourceRange = topLevelRange( sourceStart, - sourceStart + originalLine.length, - true, - ] + sourceStart + originalLine.length + ) if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) const sketchOnFaceRetVal = addTagForSketchOnFace( @@ -292,11 +294,10 @@ ${insertCode} await enginelessExecutor(ast) const sourceStart = code.indexOf(originalChamfer) const extraChars = originalChamfer.indexOf('chamfer') - const sourceRange: [number, number, boolean] = [ + const sourceRange = topLevelRange( sourceStart + extraChars, - sourceStart + originalChamfer.length - extraChars, - true, - ] + sourceStart + originalChamfer.length - extraChars + ) if (err(ast)) throw ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) @@ -357,7 +358,6 @@ describe('testing getConstraintInfo', () => { offset = 0 }, %) |> tangentialArcTo([3.14, 13.14], %)` - const ast = assertParse(code) test.each([ [ 'line', @@ -366,7 +366,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3', - sourceRange: [78, 79, true], + sourceRange: topLevelRange(78, 79), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -375,7 +375,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '4', - sourceRange: [81, 82, true], + sourceRange: topLevelRange(81, 82), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -389,7 +389,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [118, 122, true], + sourceRange: topLevelRange(118, 122), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -398,7 +398,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: false, value: '3.14', - sourceRange: [137, 141, true], + sourceRange: topLevelRange(137, 141), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -412,7 +412,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '6.14', - sourceRange: [164, 168, true], + sourceRange: topLevelRange(164, 168), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -421,7 +421,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '3.14', - sourceRange: [170, 174, true], + sourceRange: topLevelRange(170, 174), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -435,7 +435,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLineTo', - sourceRange: [185, 192, true], + sourceRange: topLevelRange(185, 192), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -444,7 +444,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '8', - sourceRange: [193, 194, true], + sourceRange: topLevelRange(193, 194), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -458,7 +458,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLineTo', - sourceRange: [204, 211, true], + sourceRange: topLevelRange(204, 211), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -467,7 +467,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '5', - sourceRange: [212, 213, true], + sourceRange: topLevelRange(212, 213), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -481,7 +481,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLine', - sourceRange: [223, 228, true], + sourceRange: topLevelRange(223, 228), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -490,7 +490,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3.14', - sourceRange: [229, 233, true], + sourceRange: topLevelRange(229, 233), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -504,7 +504,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLine', - sourceRange: [247, 252, true], + sourceRange: topLevelRange(247, 252), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -513,7 +513,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [253, 257, true], + sourceRange: topLevelRange(253, 257), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -527,7 +527,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [301, 305, true], + sourceRange: topLevelRange(301, 305), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -536,7 +536,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [320, 324, true], + sourceRange: topLevelRange(320, 324), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -550,7 +550,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [373, 375, true], + sourceRange: topLevelRange(373, 375), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -559,7 +559,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3', - sourceRange: [390, 391, true], + sourceRange: topLevelRange(390, 391), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -573,7 +573,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '12.14', - sourceRange: [434, 439, true], + sourceRange: topLevelRange(434, 439), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -582,7 +582,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '12', - sourceRange: [450, 452, true], + sourceRange: topLevelRange(450, 452), argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -596,7 +596,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [495, 497, true], + sourceRange: topLevelRange(495, 497), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -605,7 +605,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '10.14', - sourceRange: [508, 513, true], + sourceRange: topLevelRange(508, 513), argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -619,7 +619,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [567, 571, true], + sourceRange: topLevelRange(567, 571), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -628,7 +628,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionOffset', isConstrained: false, value: '0', - sourceRange: [608, 609, true], + sourceRange: topLevelRange(608, 609), argPosition: { type: 'objectProperty', key: 'offset' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -637,7 +637,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionTag', isConstrained: false, value: 'a', - sourceRange: [592, 593, true], + sourceRange: topLevelRange(592, 593), argPosition: { key: 'intersectTag', type: 'objectProperty', @@ -654,7 +654,7 @@ describe('testing getConstraintInfo', () => { type: 'tangentialWithPrevious', isConstrained: true, value: 'tangentialArcTo', - sourceRange: [623, 638, true], + sourceRange: topLevelRange(623, 638), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -663,7 +663,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '3.14', - sourceRange: [640, 644, true], + sourceRange: topLevelRange(640, 644), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -672,7 +672,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '13.14', - sourceRange: [646, 651, true], + sourceRange: topLevelRange(646, 651), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -680,11 +680,11 @@ describe('testing getConstraintInfo', () => { ], ], ])('testing %s when inputs are unconstrained', (functionName, expected) => { - const sourceRange: SourceRange = [ + const ast = assertParse(code) + const sourceRange = topLevelRange( code.indexOf(functionName), - code.indexOf(functionName) + functionName.length, - true, - ] + code.indexOf(functionName) + functionName.length + ) if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) const callExp = getNodeFromPath>( @@ -717,7 +717,6 @@ describe('testing getConstraintInfo', () => { offset = 0 }, %) |> tangentialArcTo([3.14, 13.14], %)` - const ast = assertParse(code) test.each([ [ `angledLine(`, @@ -726,7 +725,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [112, 116, true], + sourceRange: topLevelRange(112, 116), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -735,7 +734,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: false, value: '3.14', - sourceRange: [118, 122, true], + sourceRange: topLevelRange(118, 122), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -749,7 +748,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '3.14', - sourceRange: [277, 281, true], + sourceRange: topLevelRange(277, 281), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -758,7 +757,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: false, value: '3.14', - sourceRange: [283, 287, true], + sourceRange: topLevelRange(283, 287), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -772,7 +771,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [321, 323, true], + sourceRange: topLevelRange(321, 323), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -781,7 +780,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: false, value: '3', - sourceRange: [325, 326, true], + sourceRange: topLevelRange(325, 326), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -795,7 +794,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '12', - sourceRange: [354, 356, true], + sourceRange: topLevelRange(354, 356), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -804,7 +803,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: false, value: '12', - sourceRange: [358, 360, true], + sourceRange: topLevelRange(358, 360), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -818,7 +817,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: false, value: '30', - sourceRange: [388, 390, true], + sourceRange: topLevelRange(388, 390), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -827,7 +826,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: false, value: '10', - sourceRange: [392, 394, true], + sourceRange: topLevelRange(392, 394), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -835,11 +834,11 @@ describe('testing getConstraintInfo', () => { ], ], ])('testing %s when inputs are unconstrained', (functionName, expected) => { - const sourceRange: SourceRange = [ + const ast = assertParse(code) + const sourceRange = topLevelRange( code.indexOf(functionName), - code.indexOf(functionName) + functionName.length, - true, - ] + code.indexOf(functionName) + functionName.length + ) if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) const callExp = getNodeFromPath>( @@ -872,7 +871,6 @@ describe('testing getConstraintInfo', () => { offset = 0 + 0 }, %) |> tangentialArcTo([3.14 + 0, 13.14 + 0], %)` - const ast = assertParse(code) test.each([ [ 'line', @@ -881,7 +879,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3 + 0', - sourceRange: [83, 88, true], + sourceRange: topLevelRange(83, 88), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -890,7 +888,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '4 + 0', - sourceRange: [90, 95, true], + sourceRange: topLevelRange(90, 95), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'line', @@ -904,7 +902,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [129, 137, true], + sourceRange: topLevelRange(129, 137), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -913,7 +911,7 @@ describe('testing getConstraintInfo', () => { type: 'length', isConstrained: true, value: '3.14 + 0', - sourceRange: [148, 156, true], + sourceRange: topLevelRange(148, 156), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLine', @@ -927,7 +925,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '6.14 + 0', - sourceRange: [178, 186, true], + sourceRange: topLevelRange(178, 186), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -936,7 +934,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '3.14 + 0', - sourceRange: [188, 196, true], + sourceRange: topLevelRange(188, 196), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'lineTo', @@ -950,7 +948,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLineTo', - sourceRange: [209, 216, true], + sourceRange: topLevelRange(209, 216), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -959,7 +957,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '8 + 0', - sourceRange: [217, 222, true], + sourceRange: topLevelRange(217, 222), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', @@ -973,7 +971,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLineTo', - sourceRange: [234, 241, true], + sourceRange: topLevelRange(234, 241), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -982,7 +980,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '5 + 0', - sourceRange: [242, 247, true], + sourceRange: topLevelRange(242, 247), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', @@ -996,7 +994,7 @@ describe('testing getConstraintInfo', () => { type: 'vertical', isConstrained: true, value: 'yLine', - sourceRange: [259, 264, true], + sourceRange: topLevelRange(259, 264), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -1005,7 +1003,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [265, 273, true], + sourceRange: topLevelRange(265, 273), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'yLine', @@ -1019,7 +1017,7 @@ describe('testing getConstraintInfo', () => { type: 'horizontal', isConstrained: true, value: 'xLine', - sourceRange: [289, 294, true], + sourceRange: topLevelRange(289, 294), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -1028,7 +1026,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [295, 303, true], + sourceRange: topLevelRange(295, 303), argPosition: { type: 'singleValue' }, pathToNode: expect.any(Array), stdLibFnName: 'xLine', @@ -1042,7 +1040,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [345, 353, true], + sourceRange: topLevelRange(345, 353), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -1051,7 +1049,7 @@ describe('testing getConstraintInfo', () => { type: 'xRelative', isConstrained: true, value: '3.14 + 0', - sourceRange: [364, 372, true], + sourceRange: topLevelRange(364, 372), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfXLength', @@ -1065,7 +1063,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '30 + 0', - sourceRange: [416, 422, true], + sourceRange: topLevelRange(416, 422), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -1074,7 +1072,7 @@ describe('testing getConstraintInfo', () => { type: 'yRelative', isConstrained: true, value: '3 + 0', - sourceRange: [433, 438, true], + sourceRange: topLevelRange(433, 438), argPosition: { type: 'objectProperty', key: 'length' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineOfYLength', @@ -1088,7 +1086,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '12.14 + 0', - sourceRange: [476, 485, true], + sourceRange: topLevelRange(476, 485), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -1097,7 +1095,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '12 + 0', - sourceRange: [492, 498, true], + sourceRange: topLevelRange(492, 498), argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToX', @@ -1111,7 +1109,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '30 + 0', - sourceRange: [536, 542, true], + sourceRange: topLevelRange(536, 542), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -1120,7 +1118,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '10.14 + 0', - sourceRange: [549, 558, true], + sourceRange: topLevelRange(549, 558), argPosition: { type: 'objectProperty', key: 'to' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineToY', @@ -1134,7 +1132,7 @@ describe('testing getConstraintInfo', () => { type: 'angle', isConstrained: true, value: '3.14 + 0', - sourceRange: [616, 624, true], + sourceRange: topLevelRange(616, 624), argPosition: { type: 'objectProperty', key: 'angle' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1143,7 +1141,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionOffset', isConstrained: true, value: '0 + 0', - sourceRange: [671, 676, true], + sourceRange: topLevelRange(671, 676), argPosition: { type: 'objectProperty', key: 'offset' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1152,7 +1150,7 @@ describe('testing getConstraintInfo', () => { type: 'intersectionTag', isConstrained: false, value: 'a', - sourceRange: [650, 651, true], + sourceRange: topLevelRange(650, 651), argPosition: { key: 'intersectTag', type: 'objectProperty' }, pathToNode: expect.any(Array), stdLibFnName: 'angledLineThatIntersects', @@ -1166,7 +1164,7 @@ describe('testing getConstraintInfo', () => { type: 'tangentialWithPrevious', isConstrained: true, value: 'tangentialArcTo', - sourceRange: [697, 712, true], + sourceRange: topLevelRange(697, 712), argPosition: undefined, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1175,7 +1173,7 @@ describe('testing getConstraintInfo', () => { type: 'xAbsolute', isConstrained: true, value: '3.14 + 0', - sourceRange: [714, 722, true], + sourceRange: topLevelRange(714, 722), argPosition: { type: 'arrayItem', index: 0 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1184,7 +1182,7 @@ describe('testing getConstraintInfo', () => { type: 'yAbsolute', isConstrained: true, value: '13.14 + 0', - sourceRange: [724, 733, true], + sourceRange: topLevelRange(724, 733), argPosition: { type: 'arrayItem', index: 1 }, pathToNode: expect.any(Array), stdLibFnName: 'tangentialArcTo', @@ -1192,11 +1190,11 @@ describe('testing getConstraintInfo', () => { ], ], ])('testing %s when inputs are unconstrained', (functionName, expected) => { - const sourceRange: SourceRange = [ + const ast = assertParse(code) + const sourceRange = topLevelRange( code.indexOf(functionName), - code.indexOf(functionName) + functionName.length, - true, - ] + code.indexOf(functionName) + functionName.length + ) if (err(ast)) return ast const pathToNode = getNodePathFromSourceRange(ast, sourceRange) const callExp = getNodeFromPath>( diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index 947db85c7e..136edbd58d 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -12,6 +12,7 @@ import { VariableDeclaration, Identifier, sketchFromKclValue, + topLevelRange, } from 'lang/wasm' import { getNodeFromPath, @@ -222,7 +223,7 @@ const commonConstraintInfoHelper = ( code.slice(input1.start, input1.end), stdLibFnName, isArr ? abbreviatedInputs[0].arrayInput : abbreviatedInputs[0].objInput, - [input1.start, input1.end, true], + topLevelRange(input1.start, input1.end), pathToFirstArg ) ) @@ -234,7 +235,7 @@ const commonConstraintInfoHelper = ( code.slice(input2.start, input2.end), stdLibFnName, isArr ? abbreviatedInputs[1].arrayInput : abbreviatedInputs[1].objInput, - [input2.start, input2.end, true], + topLevelRange(input2.start, input2.end), pathToSecondArg ) ) @@ -266,7 +267,7 @@ const horzVertConstraintInfoHelper = ( callee.name, stdLibFnName, undefined, - [callee.start, callee.end, true], + topLevelRange(callee.start, callee.end), pathToCallee ), constrainInfo( @@ -275,7 +276,7 @@ const horzVertConstraintInfoHelper = ( code.slice(firstArg.start, firstArg.end), stdLibFnName, abbreviatedInput, - [firstArg.start, firstArg.end, true], + topLevelRange(firstArg.start, firstArg.end), pathToFirstArg ), ] @@ -905,7 +906,7 @@ export const tangentialArcTo: SketchLineHelper = { callee.name, 'tangentialArcTo', undefined, - [callee.start, callee.end, true], + topLevelRange(callee.start, callee.end), pathToCallee ), constrainInfo( @@ -914,7 +915,7 @@ export const tangentialArcTo: SketchLineHelper = { code.slice(firstArg.elements[0].start, firstArg.elements[0].end), 'tangentialArcTo', 0, - [firstArg.elements[0].start, firstArg.elements[0].end, true], + topLevelRange(firstArg.elements[0].start, firstArg.elements[0].end), pathToFirstArg ), constrainInfo( @@ -923,7 +924,7 @@ export const tangentialArcTo: SketchLineHelper = { code.slice(firstArg.elements[1].start, firstArg.elements[1].end), 'tangentialArcTo', 1, - [firstArg.elements[1].start, firstArg.elements[1].end, true], + topLevelRange(firstArg.elements[1].start, firstArg.elements[1].end), pathToSecondArg ), ] @@ -1052,7 +1053,7 @@ export const circle: SketchLineHelper = { code.slice(radiusDetails.expr.start, radiusDetails.expr.end), 'circle', 'radius', - [radiusDetails.expr.start, radiusDetails.expr.end, true], + topLevelRange(radiusDetails.expr.start, radiusDetails.expr.end), pathToRadiusLiteral ), { @@ -1061,11 +1062,10 @@ export const circle: SketchLineHelper = { isConstrained: isNotLiteralArrayOrStatic( centerDetails.expr.elements[0] ), - sourceRange: [ + sourceRange: topLevelRange( centerDetails.expr.elements[0].start, - centerDetails.expr.elements[0].end, - true, - ], + centerDetails.expr.elements[0].end + ), pathToNode: pathToXArg, value: code.slice( centerDetails.expr.elements[0].start, @@ -1083,11 +1083,10 @@ export const circle: SketchLineHelper = { isConstrained: isNotLiteralArrayOrStatic( centerDetails.expr.elements[1] ), - sourceRange: [ + sourceRange: topLevelRange( centerDetails.expr.elements[1].start, - centerDetails.expr.elements[1].end, - true, - ], + centerDetails.expr.elements[1].end + ), pathToNode: pathToYArg, value: code.slice( centerDetails.expr.elements[1].start, @@ -1763,7 +1762,7 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(angle.start, angle.end), 'angledLineThatIntersects', 'angle', - [angle.start, angle.end, true], + topLevelRange(angle.start, angle.end), pathToAngleProp ) ) @@ -1782,7 +1781,7 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(offset.start, offset.end), 'angledLineThatIntersects', 'offset', - [offset.start, offset.end, true], + topLevelRange(offset.start, offset.end), pathToOffsetProp ) ) @@ -1801,7 +1800,7 @@ export const angledLineThatIntersects: SketchLineHelper = { code.slice(tag.start, tag.end), 'angledLineThatIntersects', 'intersectTag', - [tag.start, tag.end, true], + topLevelRange(tag.start, tag.end), pathToTagProp ) returnVal.push(info) diff --git a/src/lang/std/sketchConstraints.test.ts b/src/lang/std/sketchConstraints.test.ts index 5d4734956d..f471e56bab 100644 --- a/src/lang/std/sketchConstraints.test.ts +++ b/src/lang/std/sketchConstraints.test.ts @@ -5,6 +5,7 @@ import { initPromise, sketchFromKclValue, SourceRange, + topLevelRange, } from '../wasm' import { ConstraintType, @@ -31,10 +32,10 @@ async function testingSwapSketchFnCall({ constraintType: ConstraintType }): Promise<{ newCode: string - originalRange: [number, number, boolean] + originalRange: SourceRange }> { const startIndex = inputCode.indexOf(callToSwap) - const range: SourceRange = [startIndex, startIndex + callToSwap.length, true] + const range = topLevelRange(startIndex, startIndex + callToSwap.length) const ast = assertParse(inputCode) const execState = await enginelessExecutor(ast) @@ -375,7 +376,10 @@ part001 = startSketchOn('XY') execState.memory.get('part001'), 'part001' ) as Sketch - const _segment = getSketchSegmentFromSourceRange(sg, [index, index, true]) + const _segment = getSketchSegmentFromSourceRange( + sg, + topLevelRange(index, index) + ) if (err(_segment)) throw _segment const { __geoMeta, ...segment } = _segment.segment expect(segment).toEqual({ @@ -390,7 +394,7 @@ part001 = startSketchOn('XY') const index = code.indexOf('// segment-in-start') - 7 const _segment = getSketchSegmentFromSourceRange( sketchFromKclValue(execState.memory.get('part001'), 'part001') as Sketch, - [index, index, true] + topLevelRange(index, index) ) if (err(_segment)) throw _segment const { __geoMeta, ...segment } = _segment.segment diff --git a/src/lang/std/sketchConstraints.ts b/src/lang/std/sketchConstraints.ts index 95f3e84fbe..1c0d0eb047 100644 --- a/src/lang/std/sketchConstraints.ts +++ b/src/lang/std/sketchConstraints.ts @@ -9,6 +9,7 @@ import { Path, PathToNode, Expr, + topLevelRange, } from '../wasm' import { err } from 'lib/trap' @@ -31,7 +32,7 @@ export function getSketchSegmentFromPathToNode( const node = nodeMeta.node if (!node || typeof node.start !== 'number' || !node.end) return new Error('no node found') - const sourceRange: SourceRange = [node.start, node.end, true] + const sourceRange = topLevelRange(node.start, node.end) return getSketchSegmentFromSourceRange(sketch, sourceRange) } export function getSketchSegmentFromSourceRange( diff --git a/src/lang/std/sketchcombos.test.ts b/src/lang/std/sketchcombos.test.ts index 8c809fb638..dad5515ff5 100644 --- a/src/lang/std/sketchcombos.test.ts +++ b/src/lang/std/sketchcombos.test.ts @@ -1,4 +1,11 @@ -import { assertParse, Expr, recast, initPromise, Program } from '../wasm' +import { + assertParse, + Expr, + recast, + initPromise, + Program, + topLevelRange, +} from '../wasm' import { getConstraintType, getTransformInfos, @@ -125,7 +132,7 @@ describe('testing transformAstForSketchLines for equal length constraint', () => ) } const start = codeBeforeLine + line.indexOf('|> ' + 5) - const range: [number, number, boolean] = [start, start, true] + const range = topLevelRange(start, start) return { codeRef: codeRefFromRange(range, ast), } @@ -297,7 +304,7 @@ part001 = startSketchOn('XY') const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - codeRef: codeRefFromRange([start, start, true], ast), + codeRef: codeRefFromRange(topLevelRange(start, start), ast), } }) @@ -386,7 +393,7 @@ part001 = startSketchOn('XY') const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - codeRef: codeRefFromRange([start, start, true], ast), + codeRef: codeRefFromRange(topLevelRange(start, start), ast), } }) @@ -446,7 +453,7 @@ part001 = startSketchOn('XY') const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - codeRef: codeRefFromRange([start, start, true], ast), + codeRef: codeRefFromRange(topLevelRange(start, start), ast), } }) @@ -541,7 +548,7 @@ async function helperThing( const comment = ln.split('//')[1] const start = inputScript.indexOf('//' + comment) - 7 return { - codeRef: codeRefFromRange([start, start, true], ast), + codeRef: codeRefFromRange(topLevelRange(start, start), ast), } }) @@ -610,7 +617,7 @@ part001 = startSketchOn('XY') } const offsetIndex = index - 7 const expectedConstraintLevel = getConstraintLevelFromSourceRange( - [offsetIndex, offsetIndex, true], + topLevelRange(offsetIndex, offsetIndex), ast ) if (err(expectedConstraintLevel)) { diff --git a/src/lang/util.ts b/src/lang/util.ts index f7147fd041..eda767a658 100644 --- a/src/lang/util.ts +++ b/src/lang/util.ts @@ -5,8 +5,9 @@ import { Literal, ArrayExpression, BinaryExpression, + ArtifactGraph, } from './wasm' -import { ArtifactGraph, filterArtifacts } from 'lang/std/artifactGraph' +import { filterArtifacts } from 'lang/std/artifactGraph' import { isOverlap } from 'lib/utils' export function updatePathToNodeFromMap( diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index 823e44ebe4..f0dc3530bb 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -44,17 +44,30 @@ import { EnvironmentRef } from '../wasm-lib/kcl/bindings/EnvironmentRef' import { Environment } from '../wasm-lib/kcl/bindings/Environment' import { Node } from 'wasm-lib/kcl/bindings/Node' import { CompilationError } from 'wasm-lib/kcl/bindings/CompilationError' -import { SourceRange as RustSourceRange } from 'wasm-lib/kcl/bindings/SourceRange' +import { SourceRange } from 'wasm-lib/kcl/bindings/SourceRange' import { getAllCurrentSettings } from 'lib/settings/settingsUtils' import { Operation } from 'wasm-lib/kcl/bindings/Operation' import { KclErrorWithOutputs } from 'wasm-lib/kcl/bindings/KclErrorWithOutputs' -import { Artifact } from 'wasm-lib/kcl/bindings/Artifact' -import { ArtifactId } from 'wasm-lib/kcl/bindings/ArtifactId' -import { ArtifactCommand } from 'wasm-lib/kcl/bindings/ArtifactCommand' +import { Artifact as RustArtifact } from 'wasm-lib/kcl/bindings/Artifact' +import { ArtifactId } from 'wasm-lib/kcl/bindings/Artifact' +import { ArtifactCommand } from 'wasm-lib/kcl/bindings/Artifact' +import { ArtifactGraph as RustArtifactGraph } from 'wasm-lib/kcl/bindings/Artifact' +import { Artifact } from './std/artifactGraph' +import { getNodePathFromSourceRange } from './queryAst' export type { Artifact } from 'wasm-lib/kcl/bindings/Artifact' -export type { ArtifactCommand } from 'wasm-lib/kcl/bindings/ArtifactCommand' -export type { ArtifactId } from 'wasm-lib/kcl/bindings/ArtifactId' +export type { ArtifactCommand } from 'wasm-lib/kcl/bindings/Artifact' +export type { ArtifactId } from 'wasm-lib/kcl/bindings/Artifact' +export type { Cap as CapArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { CodeRef } from 'wasm-lib/kcl/bindings/Artifact' +export type { EdgeCut } from 'wasm-lib/kcl/bindings/Artifact' +export type { Path as PathArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { Plane as PlaneArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { Segment as SegmentArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { Solid2d as Solid2dArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { Sweep as SweepArtifact } from 'wasm-lib/kcl/bindings/Artifact' +export type { SweepEdge } from 'wasm-lib/kcl/bindings/Artifact' +export type { Wall as WallArtifact } from 'wasm-lib/kcl/bindings/Artifact' export type { Configuration } from 'wasm-lib/kcl/bindings/Configuration' export type { Program } from '../wasm-lib/kcl/bindings/Program' export type { Expr } from '../wasm-lib/kcl/bindings/Expr' @@ -76,7 +89,7 @@ export type { BinaryPart } from '../wasm-lib/kcl/bindings/BinaryPart' export type { Literal } from '../wasm-lib/kcl/bindings/Literal' export type { LiteralValue } from '../wasm-lib/kcl/bindings/LiteralValue' export type { ArrayExpression } from '../wasm-lib/kcl/bindings/ArrayExpression' -export type { SourceRange as RustSourceRange } from 'wasm-lib/kcl/bindings/SourceRange' +export type { SourceRange } from 'wasm-lib/kcl/bindings/SourceRange' export type SyntaxType = | 'Program' @@ -105,35 +118,36 @@ export type { Solid } from '../wasm-lib/kcl/bindings/Solid' export type { KclValue } from '../wasm-lib/kcl/bindings/KclValue' export type { ExtrudeSurface } from '../wasm-lib/kcl/bindings/ExtrudeSurface' -/** - * The first two items are the start and end points (byte offsets from the start of the file). - * The third item is whether the source range belongs to the 'main' file, i.e., the file currently - * being rendered/displayed in the editor (TODO we need to handle modules better in the frontend). - */ -export type SourceRange = [number, number, boolean] - /** * Convert a SourceRange as used inside the KCL interpreter into the above one for use in the * frontend (essentially we're eagerly checking whether the frontend should care about the SourceRange * so as not to expose details of the interpreter's current representation of module ids throughout * the frontend). */ -export function sourceRangeFromRust(s: RustSourceRange): SourceRange { - return [s[0], s[1], s[2] === 0] +export function sourceRangeFromRust(s: SourceRange): SourceRange { + return [s[0], s[1], s[2]] } /** * Create a default SourceRange for testing or as a placeholder. */ export function defaultSourceRange(): SourceRange { - return [0, 0, true] + return [0, 0, 0] } /** - * Create a default RustSourceRange for testing or as a placeholder. + * Create a SourceRange for the top-level module. */ -export function defaultRustSourceRange(): RustSourceRange { - return [0, 0, 0] +export function topLevelRange(start: number, end: number): SourceRange { + return [start, end, 0] +} + +/** + * Returns true if this source range is from the file being executed. Returns + * false if it's from a file that was imported. + */ +export function isTopLevelModule(range: SourceRange): boolean { + return range[2] === 0 } export const wasmUrl = () => { @@ -234,7 +248,8 @@ export const parse = (code: string | Error): ParseResult | Error => { parsed.msg, sourceRangeFromRust(parsed.sourceRanges[0]), [], - [] + [], + defaultArtifactGraph() ) } } @@ -258,8 +273,9 @@ export const isPathToNodeNumber = ( export interface ExecState { memory: ProgramMemory operations: Operation[] - artifacts: { [key in ArtifactId]?: Artifact } + artifacts: { [key in ArtifactId]?: RustArtifact } artifactCommands: ArtifactCommand[] + artifactGraph: ArtifactGraph } /** @@ -272,18 +288,53 @@ export function emptyExecState(): ExecState { operations: [], artifacts: {}, artifactCommands: [], + artifactGraph: defaultArtifactGraph(), } } -function execStateFromRust(execOutcome: RustExecOutcome): ExecState { +function execStateFromRust( + execOutcome: RustExecOutcome, + program: Node +): ExecState { + const artifactGraph = rustArtifactGraphToMap(execOutcome.artifactGraph) + // We haven't ported pathToNode logic to Rust yet, so we need to fill it in. + for (const [id, artifact] of artifactGraph) { + if (!artifact) continue + if (!('codeRef' in artifact)) continue + const pathToNode = getNodePathFromSourceRange( + program, + sourceRangeFromRust(artifact.codeRef.range) + ) + artifact.codeRef.pathToNode = pathToNode + } + return { memory: ProgramMemory.fromRaw(execOutcome.memory), operations: execOutcome.operations, artifacts: execOutcome.artifacts, artifactCommands: execOutcome.artifactCommands, + artifactGraph, } } +export type ArtifactGraph = Map + +function rustArtifactGraphToMap( + rustArtifactGraph: RustArtifactGraph +): ArtifactGraph { + const map = new Map() + for (const [id, artifact] of Object.entries(rustArtifactGraph.map)) { + if (!artifact) continue + map.set(id, artifact) + } + + return map +} + +export function defaultArtifactGraph(): ArtifactGraph { + return new Map() +} + interface Memory { [key: string]: KclValue | undefined } @@ -543,7 +594,7 @@ export const executor = async ( engineCommandManager, fileSystemManager ) - return execStateFromRust(execOutcome) + return execStateFromRust(execOutcome, node) } catch (e: any) { console.log(e) const parsed: KclErrorWithOutputs = JSON.parse(e.toString()) @@ -552,7 +603,8 @@ export const executor = async ( parsed.error.msg, sourceRangeFromRust(parsed.error.sourceRanges[0]), parsed.operations, - parsed.artifactCommands + parsed.artifactCommands, + rustArtifactGraphToMap(parsed.artifactGraph) ) return Promise.reject(kclError) @@ -613,7 +665,8 @@ export const modifyAstForSketch = async ( parsed.msg, sourceRangeFromRust(parsed.sourceRanges[0]), [], - [] + [], + defaultArtifactGraph() ) console.log(kclError) @@ -683,7 +736,8 @@ export function programMemoryInit(): ProgramMemory | Error { parsed.msg, sourceRangeFromRust(parsed.sourceRanges[0]), [], - [] + [], + defaultArtifactGraph() ) } } diff --git a/src/lib/commandBarConfigs/modelingCommandConfig.ts b/src/lib/commandBarConfigs/modelingCommandConfig.ts index 8b7c9a760f..7e9a3e4efb 100644 --- a/src/lib/commandBarConfigs/modelingCommandConfig.ts +++ b/src/lib/commandBarConfigs/modelingCommandConfig.ts @@ -280,7 +280,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { selection: { inputType: 'selection', - selectionTypes: ['solid2D', 'segment'], + selectionTypes: ['solid2d', 'segment'], multiple: false, // TODO: multiple selection required: true, skip: true, @@ -312,7 +312,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { profile: { inputType: 'selection', - selectionTypes: ['solid2D'], + selectionTypes: ['solid2d'], required: true, skip: true, multiple: false, @@ -337,7 +337,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { selection: { inputType: 'selection', - selectionTypes: ['solid2D'], + selectionTypes: ['solid2d'], multiple: true, required: true, skip: false, @@ -373,7 +373,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< args: { selection: { inputType: 'selection', - selectionTypes: ['solid2D', 'segment'], + selectionTypes: ['solid2d', 'segment'], multiple: false, // TODO: multiple selection required: true, skip: true, @@ -578,7 +578,7 @@ export const modelingMachineCommandConfig: StateMachineCommandSetConfig< selection: { inputType: 'selection', selectionTypes: [ - 'solid2D', + 'solid2d', 'segment', 'sweepEdge', 'cap', diff --git a/src/lib/commandBarConfigs/validators.ts b/src/lib/commandBarConfigs/validators.ts index 0032187719..5c7281f65c 100644 --- a/src/lib/commandBarConfigs/validators.ts +++ b/src/lib/commandBarConfigs/validators.ts @@ -116,16 +116,16 @@ export const loftValidator = async ({ } const { selection } = data - if (selection.graphSelections.some((s) => s.artifact?.type !== 'solid2D')) { - return 'Unable to loft, some selection are not solid2Ds' + if (selection.graphSelections.some((s) => s.artifact?.type !== 'solid2d')) { + return 'Unable to loft, some selection are not solid2ds' } const sectionIds = data.selection.graphSelections.flatMap((s) => - s.artifact?.type === 'solid2D' ? s.artifact.pathId : [] + s.artifact?.type === 'solid2d' ? s.artifact.pathId : [] ) if (sectionIds.length < 2) { - return 'Unable to loft, selection contains less than two solid2Ds' + return 'Unable to loft, selection contains less than two solid2ds' } const loftCommand = async () => { diff --git a/src/lib/operations.test.ts b/src/lib/operations.test.ts index 5aeb278367..f20397b706 100644 --- a/src/lib/operations.test.ts +++ b/src/lib/operations.test.ts @@ -1,4 +1,4 @@ -import { defaultRustSourceRange } from 'lang/wasm' +import { defaultSourceRange } from 'lang/wasm' import { filterOperations } from './operations' import { Operation } from 'wasm-lib/kcl/bindings/Operation' @@ -8,7 +8,7 @@ function stdlib(name: string): Operation { name, unlabeledArg: null, labeledArgs: {}, - sourceRange: defaultRustSourceRange(), + sourceRange: defaultSourceRange(), isError: false, } } @@ -17,10 +17,10 @@ function userCall(name: string): Operation { return { type: 'UserDefinedFunctionCall', name, - functionSourceRange: defaultRustSourceRange(), + functionSourceRange: defaultSourceRange(), unlabeledArg: null, labeledArgs: {}, - sourceRange: defaultRustSourceRange(), + sourceRange: defaultSourceRange(), } } function userReturn(): Operation { diff --git a/src/lib/promptToEdit.ts b/src/lib/promptToEdit.ts index c59ebd4dce..ce76751f87 100644 --- a/src/lib/promptToEdit.ts +++ b/src/lib/promptToEdit.ts @@ -3,8 +3,8 @@ import { VITE_KC_API_BASE_URL } from 'env' import crossPlatformFetch from './crossPlatformFetch' import { err, reportRejection } from './trap' import { Selections } from './selections' -import { ArtifactGraph, getArtifactOfTypes } from 'lang/std/artifactGraph' -import { SourceRange } from 'lang/wasm' +import { getArtifactOfTypes } from 'lang/std/artifactGraph' +import { ArtifactGraph, SourceRange, topLevelRange } from 'lang/wasm' import toast from 'react-hot-toast' import { codeManager, editorManager, kclManager } from './singletons' import { ToastPromptToEditCadSuccess } from 'components/ToastTextToCad' @@ -334,7 +334,7 @@ const reBuildNewCodeWithRanges = ( } else if (change.added && !change.removed) { const start = newCodeWithRanges.length const end = start + change.value.length - insertRanges.push([start, end, true]) + insertRanges.push(topLevelRange(start, end)) newCodeWithRanges += change.value } } diff --git a/src/lib/selections.ts b/src/lib/selections.ts index 7822c12354..9b4c4ddba4 100644 --- a/src/lib/selections.ts +++ b/src/lib/selections.ts @@ -10,6 +10,7 @@ import { SourceRange, Expr, defaultSourceRange, + topLevelRange, } from 'lang/wasm' import { ModelingMachineEvent } from 'machines/modelingMachine' import { isNonNullable, uuidv4 } from 'lib/utils' @@ -63,7 +64,7 @@ type Selection__old = | 'line-end' | 'line-mid' | 'extrude-wall' - | 'solid2D' + | 'solid2d' | 'start-cap' | 'end-cap' | 'point' @@ -103,13 +104,13 @@ function convertSelectionToOld(selection: Selection): Selection__old | null { // return {} as Selection__old // TODO implementation const _artifact = selection.artifact - if (_artifact?.type === 'solid2D') { + if (_artifact?.type === 'solid2d') { const codeRef = getSolid2dCodeRef( _artifact, engineCommandManager.artifactGraph ) if (err(codeRef)) return null - return { range: codeRef.range, type: 'solid2D' } + return { range: codeRef.range, type: 'solid2d' } } if (_artifact?.type === 'cap') { const codeRef = getCapCodeRef(_artifact, engineCommandManager.artifactGraph) @@ -269,7 +270,7 @@ export function getEventForSegmentSelection( selectionType: 'singleCodeCursor', selection: { codeRef: { - range: [node.node.start, node.node.end, true], + range: topLevelRange(node.node.start, node.node.end), pathToNode: group.userData.pathToNode, }, }, @@ -381,10 +382,13 @@ export function processCodeMirrorRanges({ if (!isChange) return null const codeBasedSelections: Selections['graphSelections'] = codeMirrorRanges.map(({ from, to }) => { - const pathToNode = getNodePathFromSourceRange(ast, [from, to, true]) + const pathToNode = getNodePathFromSourceRange( + ast, + topLevelRange(from, to) + ) return { codeRef: { - range: [from, to, true], + range: topLevelRange(from, to), pathToNode, }, } @@ -447,7 +451,10 @@ function updateSceneObjectColors(codeBasedSelections: Selection[]) { if (err(nodeMeta)) return const node = nodeMeta.node const groupHasCursor = codeBasedSelections.some((selection) => { - return isOverlap(selection?.codeRef?.range, [node.start, node.end, true]) + return isOverlap( + selection?.codeRef?.range, + topLevelRange(node.start, node.end) + ) }) const color = groupHasCursor @@ -575,7 +582,7 @@ export function getSelectionTypeDisplayText( ([type, count]) => `${count} ${type .replace('wall', 'face') - .replace('solid2D', 'face') + .replace('solid2d', 'face') .replace('segment', 'face')}${count > 1 ? 's' : ''}` ) .toArray() @@ -650,7 +657,7 @@ export function codeToIdSelections( const artifact = engineCommandManager.artifactGraph.get( entry.artifact.solid2dId || '' ) - if (artifact?.type !== 'solid2D') { + if (artifact?.type !== 'solid2d') { bestCandidate = { artifact: entry.artifact, selection, @@ -873,7 +880,7 @@ export function updateSelections( return { artifact: artifact, codeRef: { - range: [node.start, node.end, true], + range: topLevelRange(node.start, node.end), pathToNode: pathToNode, }, } @@ -887,7 +894,7 @@ export function updateSelections( if (err(node)) return node pathToNodeBasedSelections.push({ codeRef: { - range: [node.node.start, node.node.end, true], + range: topLevelRange(node.node.start, node.node.end), pathToNode: pathToNode, }, }) diff --git a/src/lib/utils.test.ts b/src/lib/utils.test.ts index 959b55f7ca..ebc1d0ef6b 100644 --- a/src/lib/utils.test.ts +++ b/src/lib/utils.test.ts @@ -6,16 +6,16 @@ import { hasLeadingZero, hasDigitsLeftOfDecimal, } from './utils' -import { SourceRange } from '../lang/wasm' +import { SourceRange, topLevelRange } from '../lang/wasm' describe('testing isOverlapping', () => { - testBothOrders([0, 3, true], [3, 10, true]) - testBothOrders([0, 5, true], [3, 4, true]) - testBothOrders([0, 5, true], [5, 10, true]) - testBothOrders([0, 5, true], [6, 10, true], false) - testBothOrders([0, 5, true], [-1, 1, true]) - testBothOrders([0, 5, true], [-1, 0, true]) - testBothOrders([0, 5, true], [-2, -1, true], false) + testBothOrders(topLevelRange(0, 3), topLevelRange(3, 10)) + testBothOrders(topLevelRange(0, 5), topLevelRange(3, 4)) + testBothOrders(topLevelRange(0, 5), topLevelRange(5, 10)) + testBothOrders(topLevelRange(0, 5), topLevelRange(6, 10), false) + testBothOrders(topLevelRange(0, 5), topLevelRange(-1, 1)) + testBothOrders(topLevelRange(0, 5), topLevelRange(-1, 0)) + testBothOrders(topLevelRange(0, 5), topLevelRange(-2, -1), false) }) function testBothOrders(a: SourceRange, b: SourceRange, result = true) { diff --git a/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs b/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs index e3fd9c7987..3c9e9654c3 100644 --- a/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs +++ b/src/wasm-lib/kcl-to-core/src/conn_mock_core.rs @@ -17,6 +17,7 @@ use kittycad_modeling_cmds::{ websocket::{ModelingBatch, ModelingCmdReq, OkWebSocketResponseData, WebSocketRequest, WebSocketResponse}, }; use tokio::sync::RwLock; +use uuid::Uuid; const CPP_PREFIX: &str = "const double scaleFactor = 100;\n"; const NEED_PLANES: bool = true; @@ -369,6 +370,10 @@ impl kcl_lib::EngineManager for EngineConnection { self.batch_end.clone() } + fn responses(&self) -> IndexMap { + IndexMap::new() + } + fn take_artifact_commands(&self) -> Vec { Vec::new() } diff --git a/src/wasm-lib/kcl/src/engine/conn.rs b/src/wasm-lib/kcl/src/engine/conn.rs index fe00394717..89bdb84709 100644 --- a/src/wasm-lib/kcl/src/engine/conn.rs +++ b/src/wasm-lib/kcl/src/engine/conn.rs @@ -383,6 +383,16 @@ impl EngineManager for EngineConnection { self.batch_end.clone() } + fn responses(&self) -> IndexMap { + self.responses + .iter() + .map(|entry| { + let (k, v) = entry.pair(); + (*k, v.clone()) + }) + .collect() + } + fn take_artifact_commands(&self) -> Vec { let mut artifact_commands = self.artifact_commands.lock().unwrap(); std::mem::take(&mut *artifact_commands) diff --git a/src/wasm-lib/kcl/src/engine/conn_mock.rs b/src/wasm-lib/kcl/src/engine/conn_mock.rs index 3b868f48c1..93ca6b0a97 100644 --- a/src/wasm-lib/kcl/src/engine/conn_mock.rs +++ b/src/wasm-lib/kcl/src/engine/conn_mock.rs @@ -77,6 +77,10 @@ impl crate::engine::EngineManager for EngineConnection { self.batch_end.clone() } + fn responses(&self) -> IndexMap { + IndexMap::new() + } + fn take_artifact_commands(&self) -> Vec { let mut artifact_commands = self.artifact_commands.lock().unwrap(); std::mem::take(&mut *artifact_commands) diff --git a/src/wasm-lib/kcl/src/engine/conn_wasm.rs b/src/wasm-lib/kcl/src/engine/conn_wasm.rs index 367f75ba1a..f9b69a3261 100644 --- a/src/wasm-lib/kcl/src/engine/conn_wasm.rs +++ b/src/wasm-lib/kcl/src/engine/conn_wasm.rs @@ -52,6 +52,7 @@ pub struct EngineConnection { manager: Arc, batch: Arc>>, batch_end: Arc>>, + responses: Arc>>, artifact_commands: Arc>>, execution_kind: Arc>, } @@ -66,6 +67,7 @@ impl EngineConnection { manager: Arc::new(manager), batch: Arc::new(Mutex::new(Vec::new())), batch_end: Arc::new(Mutex::new(IndexMap::new())), + responses: Arc::new(Mutex::new(IndexMap::new())), artifact_commands: Arc::new(Mutex::new(Vec::new())), execution_kind: Default::default(), }) @@ -106,6 +108,11 @@ impl crate::engine::EngineManager for EngineConnection { self.batch_end.clone() } + fn responses(&self) -> IndexMap { + let responses = self.responses.lock().unwrap(); + responses.clone() + } + fn take_artifact_commands(&self) -> Vec { let mut artifact_commands = self.artifact_commands.lock().unwrap(); std::mem::take(&mut *artifact_commands) @@ -265,6 +272,9 @@ impl crate::engine::EngineManager for EngineConnection { }) })?; + let mut responses = self.responses.lock().unwrap(); + responses.insert(id, ws_result.clone()); + Ok(ws_result) } diff --git a/src/wasm-lib/kcl/src/engine/mod.rs b/src/wasm-lib/kcl/src/engine/mod.rs index ec7350771a..fb687a1637 100644 --- a/src/wasm-lib/kcl/src/engine/mod.rs +++ b/src/wasm-lib/kcl/src/engine/mod.rs @@ -67,6 +67,9 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { /// Get the batch of end commands to be sent to the engine. fn batch_end(&self) -> Arc>>; + /// Get the command responses from the engine. + fn responses(&self) -> IndexMap; + /// Take the artifact commands generated up to this point and clear them. fn take_artifact_commands(&self) -> Vec; diff --git a/src/wasm-lib/kcl/src/errors.rs b/src/wasm-lib/kcl/src/errors.rs index 32f7cbd760..6bfb7daa49 100644 --- a/src/wasm-lib/kcl/src/errors.rs +++ b/src/wasm-lib/kcl/src/errors.rs @@ -3,7 +3,7 @@ use thiserror::Error; use tower_lsp::lsp_types::{Diagnostic, DiagnosticSeverity}; use crate::{ - execution::{ArtifactCommand, Operation}, + execution::{ArtifactCommand, ArtifactGraph, Operation}, lsp::IntoDiagnostic, source_range::{ModuleId, SourceRange}, }; @@ -114,14 +114,21 @@ pub struct KclErrorWithOutputs { pub error: KclError, pub operations: Vec, pub artifact_commands: Vec, + pub artifact_graph: ArtifactGraph, } impl KclErrorWithOutputs { - pub fn new(error: KclError, operations: Vec, artifact_commands: Vec) -> Self { + pub fn new( + error: KclError, + operations: Vec, + artifact_commands: Vec, + artifact_graph: ArtifactGraph, + ) -> Self { Self { error, operations, artifact_commands, + artifact_graph, } } pub fn no_outputs(error: KclError) -> Self { @@ -129,6 +136,7 @@ impl KclErrorWithOutputs { error, operations: Default::default(), artifact_commands: Default::default(), + artifact_graph: Default::default(), } } } diff --git a/src/wasm-lib/kcl/src/execution/artifact.rs b/src/wasm-lib/kcl/src/execution/artifact.rs index cf0a3b5639..3dfb2a3ba4 100644 --- a/src/wasm-lib/kcl/src/execution/artifact.rs +++ b/src/wasm-lib/kcl/src/execution/artifact.rs @@ -1,15 +1,29 @@ -use kittycad_modeling_cmds::ModelingCmd; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; +use fnv::FnvHashMap; +use indexmap::IndexMap; +use kittycad_modeling_cmds::{ + self as kcmc, + id::ModelingCmdId, + ok_response::OkModelingCmdResponse, + shared::ExtrusionFaceCapType, + websocket::{BatchResponse, OkWebSocketResponseData, WebSocketResponse}, + EnableSketchMode, ModelingCmd, SketchModeDisable, +}; +use serde::{ser::SerializeSeq, Deserialize, Serialize}; use uuid::Uuid; -use crate::SourceRange; +use crate::{ + parsing::ast::types::{Node, Program}, + KclError, SourceRange, +}; + +#[cfg(test)] +mod mermaid_tests; /// A command that may create or update artifacts on the TS side. Because /// engine commands are batched, we don't have the response yet when these are /// created. #[derive(Debug, Clone, PartialEq, Deserialize, Serialize, ts_rs::TS)] -#[ts(export)] +#[ts(export_to = "Artifact.ts")] #[serde(rename_all = "camelCase")] pub struct ArtifactCommand { /// Identifier of the command that can be matched with its response. @@ -22,8 +36,8 @@ pub struct ArtifactCommand { pub command: ModelingCmd, } -#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash, ts_rs::TS, JsonSchema)] -#[ts(export)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, Hash, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] pub struct ArtifactId(Uuid); impl ArtifactId { @@ -56,22 +70,835 @@ impl From<&ArtifactId> for Uuid { } } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] +impl From for ArtifactId { + fn from(id: ModelingCmdId) -> Self { + Self::new(*id.as_ref()) + } +} + +impl From<&ModelingCmdId> for ArtifactId { + fn from(id: &ModelingCmdId) -> Self { + Self::new(*id.as_ref()) + } +} + +pub type DummyPathToNode = Vec<()>; + +fn serialize_dummy_path_to_node(_path_to_node: &DummyPathToNode, serializer: S) -> Result +where + S: serde::Serializer, +{ + // Always output an empty array, for now. + let seq = serializer.serialize_seq(Some(0))?; + seq.end() +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq, Hash, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct CodeRef { + pub range: SourceRange, + // TODO: We should implement this in Rust. + #[serde(default, serialize_with = "serialize_dummy_path_to_node")] + #[ts(type = "Array<[string | number, string]>")] + pub path_to_node: DummyPathToNode, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Plane { + pub id: ArtifactId, + pub path_ids: Vec, + pub code_ref: CodeRef, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Path { + pub id: ArtifactId, + pub plane_id: ArtifactId, + pub seg_ids: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub sweep_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub solid2d_id: Option, + pub code_ref: CodeRef, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Segment { + pub id: ArtifactId, + pub path_id: ArtifactId, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub surface_id: Option, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub edge_ids: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub edge_cut_id: Option, + pub code_ref: CodeRef, +} + +/// A sweep is a more generic term for extrude, revolve, loft, and sweep. +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Sweep { + pub id: ArtifactId, + pub sub_type: SweepSubType, + pub path_id: ArtifactId, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub surface_ids: Vec, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub edge_ids: Vec, + pub code_ref: CodeRef, +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub enum SweepSubType { + Extrusion, + Revolve, + Loft, + Sweep, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Solid2d { + pub id: ArtifactId, + pub path_id: ArtifactId, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Wall { + pub id: ArtifactId, + pub seg_id: ArtifactId, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub edge_cut_edge_ids: Vec, + pub sweep_id: ArtifactId, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub path_ids: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct Cap { + pub id: ArtifactId, + pub sub_type: CapSubType, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub edge_cut_edge_ids: Vec, + pub sweep_id: ArtifactId, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub path_ids: Vec, +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub enum CapSubType { + Start, + End, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct SweepEdge { + pub id: ArtifactId, + pub sub_type: SweepEdgeSubType, + pub seg_id: ArtifactId, + pub sweep_id: ArtifactId, +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub enum SweepEdgeSubType { + Opposite, + Adjacent, +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct EdgeCut { + pub id: ArtifactId, + pub sub_type: EdgeCutSubType, + pub consumed_edge_id: ArtifactId, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub edge_ids: Vec, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub surface_id: Option, + pub code_ref: CodeRef, +} + +#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub enum EdgeCutSubType { + Fillet, + Chamfer, +} + +impl From for EdgeCutSubType { + fn from(cut_type: kcmc::shared::CutType) -> Self { + match cut_type { + kcmc::shared::CutType::Fillet => EdgeCutSubType::Fillet, + kcmc::shared::CutType::Chamfer => EdgeCutSubType::Chamfer, + } + } +} + +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] #[serde(rename_all = "camelCase")] -pub struct Artifact { +pub struct EdgeCutEdge { pub id: ArtifactId, - #[serde(flatten)] - pub inner: ArtifactInner, - pub source_range: SourceRange, + pub edge_cut_id: ArtifactId, + pub surface_id: ArtifactId, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "type")] -pub enum ArtifactInner { +#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(tag = "type", rename_all = "camelCase")] +pub enum Artifact { + Plane(Plane), + Path(Path), + Segment(Segment), + Solid2d(Solid2d), #[serde(rename_all = "camelCase")] - StartSketchOnFace { face_id: Uuid }, + StartSketchOnFace { + id: ArtifactId, + face_id: Uuid, + source_range: SourceRange, + }, #[serde(rename_all = "camelCase")] - StartSketchOnPlane { plane_id: Uuid }, + StartSketchOnPlane { + id: ArtifactId, + plane_id: Uuid, + source_range: SourceRange, + }, + Sweep(Sweep), + Wall(Wall), + Cap(Cap), + SweepEdge(SweepEdge), + EdgeCut(EdgeCut), + EdgeCutEdge(EdgeCutEdge), +} + +impl Artifact { + pub(crate) fn id(&self) -> ArtifactId { + match self { + Artifact::Plane(a) => a.id, + Artifact::Path(a) => a.id, + Artifact::Segment(a) => a.id, + Artifact::Solid2d(a) => a.id, + Artifact::StartSketchOnFace { id, .. } => *id, + Artifact::StartSketchOnPlane { id, .. } => *id, + Artifact::Sweep(a) => a.id, + Artifact::Wall(a) => a.id, + Artifact::Cap(a) => a.id, + Artifact::SweepEdge(a) => a.id, + Artifact::EdgeCut(a) => a.id, + Artifact::EdgeCutEdge(a) => a.id, + } + } + + #[expect(dead_code)] + pub(crate) fn code_ref(&self) -> Option<&CodeRef> { + match self { + Artifact::Plane(a) => Some(&a.code_ref), + Artifact::Path(a) => Some(&a.code_ref), + Artifact::Segment(a) => Some(&a.code_ref), + Artifact::Solid2d(_) => None, + // TODO: We should add code refs for these. + Artifact::StartSketchOnFace { .. } => None, + Artifact::StartSketchOnPlane { .. } => None, + Artifact::Sweep(a) => Some(&a.code_ref), + Artifact::Wall(_) => None, + Artifact::Cap(_) => None, + Artifact::SweepEdge(_) => None, + Artifact::EdgeCut(a) => Some(&a.code_ref), + Artifact::EdgeCutEdge(_) => None, + } + } + + /// Merge the new artifact into self. If it can't because it's a different + /// type, return the new artifact which should be used as a replacement. + fn merge(&mut self, new: Artifact) -> Option { + match self { + Artifact::Plane(a) => a.merge(new), + Artifact::Path(a) => a.merge(new), + Artifact::Segment(a) => a.merge(new), + Artifact::Solid2d(_) => Some(new), + Artifact::StartSketchOnFace { .. } => Some(new), + Artifact::StartSketchOnPlane { .. } => Some(new), + Artifact::Sweep(a) => a.merge(new), + Artifact::Wall(a) => a.merge(new), + Artifact::Cap(a) => a.merge(new), + Artifact::SweepEdge(_) => Some(new), + Artifact::EdgeCut(a) => a.merge(new), + Artifact::EdgeCutEdge(_) => Some(new), + } + } +} + +impl Plane { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Plane(new) = new else { + return Some(new); + }; + merge_ids(&mut self.path_ids, new.path_ids); + + None + } +} + +impl Path { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Path(new) = new else { + return Some(new); + }; + merge_opt_id(&mut self.sweep_id, new.sweep_id); + merge_ids(&mut self.seg_ids, new.seg_ids); + merge_opt_id(&mut self.solid2d_id, new.solid2d_id); + + None + } +} + +impl Segment { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Segment(new) = new else { + return Some(new); + }; + merge_opt_id(&mut self.surface_id, new.surface_id); + merge_ids(&mut self.edge_ids, new.edge_ids); + merge_opt_id(&mut self.edge_cut_id, new.edge_cut_id); + + None + } +} + +impl Sweep { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Sweep(new) = new else { + return Some(new); + }; + merge_ids(&mut self.surface_ids, new.surface_ids); + merge_ids(&mut self.edge_ids, new.edge_ids); + + None + } +} + +impl Wall { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Wall(new) = new else { + return Some(new); + }; + merge_ids(&mut self.edge_cut_edge_ids, new.edge_cut_edge_ids); + merge_ids(&mut self.path_ids, new.path_ids); + + None + } +} + +impl Cap { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::Cap(new) = new else { + return Some(new); + }; + merge_ids(&mut self.edge_cut_edge_ids, new.edge_cut_edge_ids); + merge_ids(&mut self.path_ids, new.path_ids); + + None + } +} + +impl EdgeCut { + fn merge(&mut self, new: Artifact) -> Option { + let Artifact::EdgeCut(new) = new else { + return Some(new); + }; + merge_opt_id(&mut self.surface_id, new.surface_id); + merge_ids(&mut self.edge_ids, new.edge_ids); + + None + } +} + +#[derive(Debug, Clone, Default, PartialEq, Deserialize, Serialize, ts_rs::TS)] +#[ts(export_to = "Artifact.ts")] +#[serde(rename_all = "camelCase")] +pub struct ArtifactGraph { + map: IndexMap, +} + +pub(super) fn build_artifact_graph( + artifact_commands: &[ArtifactCommand], + responses: &IndexMap, + ast: &Node, + exec_artifacts: &IndexMap, +) -> Result { + let mut map = IndexMap::new(); + + let mut current_plane_id = None; + + for artifact_command in artifact_commands { + if let ModelingCmd::EnableSketchMode(EnableSketchMode { entity_id, .. }) = artifact_command.command { + current_plane_id = Some(entity_id); + } + if let ModelingCmd::SketchModeDisable(SketchModeDisable { .. }) = artifact_command.command { + current_plane_id = None; + } + + let flattened_responses = flatten_modeling_command_responses(responses); + let artifact_updates = artifacts_to_update( + &map, + artifact_command, + &flattened_responses, + current_plane_id, + ast, + exec_artifacts, + )?; + for artifact in artifact_updates { + // Merge with existing artifacts. + merge_artifact_into_map(&mut map, artifact); + } + } + + Ok(ArtifactGraph { map }) +} + +/// Flatten the responses into a map of command IDs to modeling command +/// responses. The raw responses from the engine contain batches. +fn flatten_modeling_command_responses( + responses: &IndexMap, +) -> FnvHashMap { + let mut map = FnvHashMap::default(); + for (cmd_id, ws_response) in responses { + let WebSocketResponse::Success(response) = ws_response else { + // Response not successful. + continue; + }; + match &response.resp { + OkWebSocketResponseData::Modeling { modeling_response } => { + map.insert(*cmd_id, modeling_response.clone()); + } + OkWebSocketResponseData::ModelingBatch { responses } => + { + #[expect( + clippy::iter_over_hash_type, + reason = "Since we're moving entries to another unordered map, it's fine that the order is undefined" + )] + for (cmd_id, batch_response) in responses { + if let BatchResponse::Success { + response: modeling_response, + } = batch_response + { + map.insert(*cmd_id.as_ref(), modeling_response.clone()); + } + } + } + OkWebSocketResponseData::IceServerInfo { .. } + | OkWebSocketResponseData::TrickleIce { .. } + | OkWebSocketResponseData::SdpAnswer { .. } + | OkWebSocketResponseData::Export { .. } + | OkWebSocketResponseData::MetricsRequest { .. } + | OkWebSocketResponseData::ModelingSessionData { .. } + | OkWebSocketResponseData::Pong { .. } => {} + } + } + + map +} + +fn merge_artifact_into_map(map: &mut IndexMap, new_artifact: Artifact) { + let id = new_artifact.id(); + let Some(old_artifact) = map.get_mut(&id) else { + // No old artifact exists. Insert the new one. + map.insert(id, new_artifact); + return; + }; + + if let Some(replacement) = old_artifact.merge(new_artifact) { + *old_artifact = replacement; + } +} + +/// Merge the new IDs into the base vector, avoiding duplicates. This is O(nm) +/// runtime. Rationale is that most of the ID collections in the artifact graph +/// are pretty small, but we may want to change this in the future. +fn merge_ids(base: &mut Vec, new: Vec) { + let original_len = base.len(); + for id in new { + // Don't bother inspecting new items that we just pushed. + let original_base = &base[..original_len]; + if !original_base.contains(&id) { + base.push(id); + } + } +} + +fn merge_opt_id(base: &mut Option, new: Option) { + // Always use the new one, even if it clears it. + *base = new; +} + +fn artifacts_to_update( + artifacts: &IndexMap, + artifact_command: &ArtifactCommand, + responses: &FnvHashMap, + current_plane_id: Option, + _ast: &Node, + _exec_artifacts: &IndexMap, +) -> Result, KclError> { + // TODO: Build path-to-node from artifact_command source range. Right now, + // we're serializing an empty array, and the TS wrapper fills it in with the + // correct value. + let path_to_node = Vec::new(); + + let range = artifact_command.range; + let uuid = artifact_command.cmd_id; + let id = ArtifactId::new(uuid); + + let Some(response) = responses.get(&uuid) else { + // Response not found or not successful. + return Ok(Vec::new()); + }; + + let cmd = &artifact_command.command; + + match cmd { + ModelingCmd::MakePlane(_) => { + if range.is_synthetic() { + return Ok(Vec::new()); + } + // If we're calling `make_plane` and the code range doesn't end at + // `0` it's not a default plane, but a custom one from the + // offsetPlane standard library function. + return Ok(vec![Artifact::Plane(Plane { + id, + path_ids: Vec::new(), + code_ref: CodeRef { range, path_to_node }, + })]); + } + ModelingCmd::EnableSketchMode(_) => { + let current_plane_id = current_plane_id.ok_or_else(|| { + KclError::internal(format!( + "Expected a current plane ID when processing EnableSketchMode command, but we have none: {id:?}" + )) + })?; + let existing_plane = artifacts.get(&ArtifactId::new(current_plane_id)); + match existing_plane { + Some(Artifact::Wall(wall)) => { + return Ok(vec![Artifact::Wall(Wall { + id: current_plane_id.into(), + seg_id: wall.seg_id, + edge_cut_edge_ids: wall.edge_cut_edge_ids.clone(), + sweep_id: wall.sweep_id, + path_ids: wall.path_ids.clone(), + })]); + } + Some(_) | None => { + let path_ids = match existing_plane { + Some(Artifact::Plane(Plane { path_ids, .. })) => path_ids.clone(), + _ => Vec::new(), + }; + return Ok(vec![Artifact::Plane(Plane { + id: current_plane_id.into(), + path_ids, + code_ref: CodeRef { range, path_to_node }, + })]); + } + } + } + ModelingCmd::StartPath(_) => { + let mut return_arr = Vec::new(); + let current_plane_id = current_plane_id.ok_or_else(|| { + KclError::internal(format!( + "Expected a current plane ID when processing StartPath command, but we have none: {id:?}" + )) + })?; + return_arr.push(Artifact::Path(Path { + id, + plane_id: current_plane_id.into(), + seg_ids: Vec::new(), + sweep_id: None, + solid2d_id: None, + code_ref: CodeRef { range, path_to_node }, + })); + let plane = artifacts.get(&ArtifactId::new(current_plane_id)); + if let Some(Artifact::Plane(plane)) = plane { + let code_ref = plane.code_ref.clone(); + return_arr.push(Artifact::Plane(Plane { + id: current_plane_id.into(), + path_ids: vec![id], + code_ref, + })); + } + if let Some(Artifact::Wall(wall)) = plane { + return_arr.push(Artifact::Wall(Wall { + id: current_plane_id.into(), + seg_id: wall.seg_id, + edge_cut_edge_ids: wall.edge_cut_edge_ids.clone(), + sweep_id: wall.sweep_id, + path_ids: vec![id], + })); + } + return Ok(return_arr); + } + ModelingCmd::ClosePath(_) | ModelingCmd::ExtendPath(_) => { + let path_id = ArtifactId::new(match cmd { + ModelingCmd::ClosePath(c) => c.path_id, + ModelingCmd::ExtendPath(e) => e.path.into(), + _ => unreachable!(), + }); + let mut return_arr = Vec::new(); + return_arr.push(Artifact::Segment(Segment { + id, + path_id, + surface_id: None, + edge_ids: Vec::new(), + edge_cut_id: None, + code_ref: CodeRef { range, path_to_node }, + })); + let path = artifacts.get(&path_id); + if let Some(Artifact::Path(path)) = path { + let mut new_path = path.clone(); + new_path.seg_ids = vec![id]; + return_arr.push(Artifact::Path(new_path)); + } + if let OkModelingCmdResponse::ClosePath(close_path) = response { + return_arr.push(Artifact::Solid2d(Solid2d { + id: close_path.face_id.into(), + path_id, + })); + if let Some(Artifact::Path(path)) = path { + let mut new_path = path.clone(); + new_path.solid2d_id = Some(close_path.face_id.into()); + return_arr.push(Artifact::Path(new_path)); + } + } + return Ok(return_arr); + } + ModelingCmd::Extrude(kcmc::Extrude { target, .. }) + | ModelingCmd::Revolve(kcmc::Revolve { target, .. }) + | ModelingCmd::Sweep(kcmc::Sweep { target, .. }) => { + let sub_type = match cmd { + ModelingCmd::Extrude(_) => SweepSubType::Extrusion, + ModelingCmd::Revolve(_) => SweepSubType::Revolve, + ModelingCmd::Sweep(_) => SweepSubType::Sweep, + _ => unreachable!(), + }; + let mut return_arr = Vec::new(); + let target = ArtifactId::from(target); + return_arr.push(Artifact::Sweep(Sweep { + id, + sub_type, + path_id: target, + surface_ids: Vec::new(), + edge_ids: Vec::new(), + code_ref: CodeRef { range, path_to_node }, + })); + let path = artifacts.get(&target); + if let Some(Artifact::Path(path)) = path { + let mut new_path = path.clone(); + new_path.sweep_id = Some(id); + return_arr.push(Artifact::Path(new_path)); + } + return Ok(return_arr); + } + ModelingCmd::Loft(loft_cmd) => { + let OkModelingCmdResponse::Loft(_) = response else { + return Ok(Vec::new()); + }; + let mut return_arr = Vec::new(); + return_arr.push(Artifact::Sweep(Sweep { + id, + sub_type: SweepSubType::Loft, + // TODO: Using the first one. Make sure to revisit this + // choice, don't think it matters for now. + path_id: ArtifactId::new(*loft_cmd.section_ids.first().ok_or_else(|| { + KclError::internal(format!( + "Expected at least one section ID in Loft command: {id:?}; cmd={cmd:?}" + )) + })?), + surface_ids: Vec::new(), + edge_ids: Vec::new(), + code_ref: CodeRef { range, path_to_node }, + })); + for section_id in &loft_cmd.section_ids { + let path = artifacts.get(&ArtifactId::new(*section_id)); + if let Some(Artifact::Path(path)) = path { + let mut new_path = path.clone(); + new_path.sweep_id = Some(id); + return_arr.push(Artifact::Path(new_path)); + } + } + return Ok(return_arr); + } + ModelingCmd::Solid3dGetExtrusionFaceInfo(_) => { + let OkModelingCmdResponse::Solid3dGetExtrusionFaceInfo(face_info) = response else { + return Ok(Vec::new()); + }; + let mut return_arr = Vec::new(); + let mut last_path = None; + for face in &face_info.faces { + if face.cap != ExtrusionFaceCapType::None { + continue; + } + let Some(curve_id) = face.curve_id.map(ArtifactId::new) else { + continue; + }; + let Some(face_id) = face.face_id.map(ArtifactId::new) else { + continue; + }; + let Some(Artifact::Segment(seg)) = artifacts.get(&curve_id) else { + continue; + }; + let Some(Artifact::Path(path)) = artifacts.get(&seg.path_id) else { + continue; + }; + last_path = Some(path); + let path_sweep_id = path.sweep_id.ok_or_else(|| { + KclError::internal(format!( + "Expected a sweep ID on the path when processing Solid3dGetExtrusionFaceInfo command, but we have none: {id:?}, {path:?}" + )) + })?; + return_arr.push(Artifact::Wall(Wall { + id: face_id, + seg_id: curve_id, + edge_cut_edge_ids: Vec::new(), + sweep_id: path_sweep_id, + path_ids: vec![], + })); + let mut new_seg = seg.clone(); + new_seg.surface_id = Some(face_id); + return_arr.push(Artifact::Segment(new_seg)); + if let Some(Artifact::Sweep(sweep)) = path.sweep_id.and_then(|id| artifacts.get(&id)) { + let mut new_sweep = sweep.clone(); + new_sweep.surface_ids = vec![face_id]; + return_arr.push(Artifact::Sweep(new_sweep)); + } + } + if let Some(path) = last_path { + for face in &face_info.faces { + let sub_type = match face.cap { + ExtrusionFaceCapType::Top => CapSubType::End, + ExtrusionFaceCapType::Bottom => CapSubType::Start, + ExtrusionFaceCapType::None | ExtrusionFaceCapType::Both => continue, + }; + let Some(face_id) = face.face_id.map(ArtifactId::new) else { + continue; + }; + let path_sweep_id = path.sweep_id.ok_or_else(|| { + KclError::internal(format!( + "Expected a sweep ID on the path when processing Solid3dGetExtrusionFaceInfo command, but we have none: {id:?}, {path:?}" + )) + })?; + return_arr.push(Artifact::Cap(Cap { + id: face_id, + sub_type, + edge_cut_edge_ids: Vec::new(), + sweep_id: path_sweep_id, + path_ids: Vec::new(), + })); + let Some(Artifact::Sweep(sweep)) = artifacts.get(&path_sweep_id) else { + continue; + }; + let mut new_sweep = sweep.clone(); + new_sweep.surface_ids = vec![face_id]; + return_arr.push(Artifact::Sweep(new_sweep)); + } + } + return Ok(return_arr); + } + ModelingCmd::Solid3dGetNextAdjacentEdge(kcmc::Solid3dGetNextAdjacentEdge { face_id, edge_id, .. }) + | ModelingCmd::Solid3dGetOppositeEdge(kcmc::Solid3dGetOppositeEdge { face_id, edge_id, .. }) => { + let sub_type = match cmd { + ModelingCmd::Solid3dGetNextAdjacentEdge(_) => SweepEdgeSubType::Adjacent, + ModelingCmd::Solid3dGetOppositeEdge(_) => SweepEdgeSubType::Opposite, + _ => unreachable!(), + }; + let face_id = ArtifactId::new(*face_id); + let edge_id = ArtifactId::new(*edge_id); + let Some(Artifact::Wall(wall)) = artifacts.get(&face_id) else { + return Ok(Vec::new()); + }; + let Some(Artifact::Sweep(sweep)) = artifacts.get(&wall.sweep_id) else { + return Ok(Vec::new()); + }; + let Some(Artifact::Path(_)) = artifacts.get(&sweep.path_id) else { + return Ok(Vec::new()); + }; + let Some(Artifact::Segment(segment)) = artifacts.get(&edge_id) else { + return Ok(Vec::new()); + }; + let response_edge_id = match response { + OkModelingCmdResponse::Solid3dGetNextAdjacentEdge(r) => { + let Some(edge_id) = r.edge else { + return Err(KclError::internal(format!( + "Expected Solid3dGetNextAdjacentEdge response to have an edge ID, but found none: id={id:?}, {response:?}" + ))); + }; + edge_id.into() + } + OkModelingCmdResponse::Solid3dGetOppositeEdge(r) => r.edge.into(), + _ => { + return Err(KclError::internal(format!( + "Expected Solid3dGetNextAdjacentEdge or Solid3dGetOppositeEdge response, but got: id={id:?}, {response:?}" + ))); + } + }; + + let mut return_arr = Vec::new(); + return_arr.push(Artifact::SweepEdge(SweepEdge { + id: response_edge_id, + sub_type, + seg_id: edge_id, + sweep_id: sweep.id, + })); + let mut new_segment = segment.clone(); + new_segment.edge_ids = vec![response_edge_id]; + return_arr.push(Artifact::Segment(new_segment)); + let mut new_sweep = sweep.clone(); + new_sweep.edge_ids = vec![response_edge_id]; + return_arr.push(Artifact::Sweep(new_sweep)); + return Ok(return_arr); + } + ModelingCmd::Solid3dFilletEdge(cmd) => { + let mut return_arr = Vec::new(); + return_arr.push(Artifact::EdgeCut(EdgeCut { + id, + sub_type: cmd.cut_type.into(), + consumed_edge_id: cmd.edge_id.into(), + edge_ids: Vec::new(), + surface_id: None, + code_ref: CodeRef { range, path_to_node }, + })); + let consumed_edge = artifacts.get(&ArtifactId::new(cmd.edge_id)); + if let Some(Artifact::Segment(consumed_edge)) = consumed_edge { + let mut new_segment = consumed_edge.clone(); + new_segment.edge_cut_id = Some(id); + return_arr.push(Artifact::Segment(new_segment)); + } else { + // TODO: Handle other types like SweepEdge. + } + return Ok(return_arr); + } + _ => {} + } + + Ok(Vec::new()) } diff --git a/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs b/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs new file mode 100644 index 0000000000..20eff2adc1 --- /dev/null +++ b/src/wasm-lib/kcl/src/execution/artifact/mermaid_tests.rs @@ -0,0 +1,527 @@ +//! Tests for the artifact graph that convert it to Mermaid diagrams. +use std::fmt::Write; + +use super::*; + +type NodeId = u32; + +type Edges = IndexMap<(NodeId, NodeId), EdgeInfo>; + +#[derive(Debug, Clone, PartialEq, Eq)] +struct EdgeInfo { + direction: EdgeDirection, + flow: EdgeFlow, + kind: EdgeKind, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +enum EdgeDirection { + Forward, + Backward, + Bidirectional, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +enum EdgeFlow { + SourceToTarget, + TargetToSource, +} + +impl EdgeFlow { + #[must_use] + fn reverse(&self) -> EdgeFlow { + match self { + EdgeFlow::SourceToTarget => EdgeFlow::TargetToSource, + EdgeFlow::TargetToSource => EdgeFlow::SourceToTarget, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +enum EdgeKind { + PathToSweep, + Other, +} + +impl EdgeDirection { + #[must_use] + fn merge(&self, other: EdgeDirection) -> EdgeDirection { + match self { + EdgeDirection::Forward => match other { + EdgeDirection::Forward => EdgeDirection::Forward, + EdgeDirection::Backward => EdgeDirection::Bidirectional, + EdgeDirection::Bidirectional => EdgeDirection::Bidirectional, + }, + EdgeDirection::Backward => match other { + EdgeDirection::Forward => EdgeDirection::Bidirectional, + EdgeDirection::Backward => EdgeDirection::Backward, + EdgeDirection::Bidirectional => EdgeDirection::Bidirectional, + }, + EdgeDirection::Bidirectional => EdgeDirection::Bidirectional, + } + } +} + +impl Artifact { + /// The IDs pointing back to prior nodes in a depth-first traversal of + /// the graph. This should be disjoint with `child_ids`. + pub(crate) fn back_edges(&self) -> Vec { + match self { + Artifact::Plane(_) => Vec::new(), + Artifact::Path(a) => vec![a.plane_id], + Artifact::Segment(a) => vec![a.path_id], + Artifact::Solid2d(a) => vec![a.path_id], + Artifact::StartSketchOnFace { face_id, .. } => vec![face_id.into()], + Artifact::StartSketchOnPlane { plane_id, .. } => vec![plane_id.into()], + Artifact::Sweep(a) => vec![a.path_id], + Artifact::Wall(a) => vec![a.seg_id, a.sweep_id], + Artifact::Cap(a) => vec![a.sweep_id], + Artifact::SweepEdge(a) => vec![a.seg_id, a.sweep_id], + Artifact::EdgeCut(a) => vec![a.consumed_edge_id], + Artifact::EdgeCutEdge(a) => vec![a.edge_cut_id], + } + } + + /// The child IDs of this artifact, used to do a depth-first traversal of + /// the graph. + pub(crate) fn child_ids(&self) -> Vec { + match self { + Artifact::Plane(a) => a.path_ids.clone(), + Artifact::Path(a) => { + // Note: Don't include these since they're parents: plane_id. + let mut ids = a.seg_ids.clone(); + if let Some(sweep_id) = a.sweep_id { + ids.push(sweep_id); + } + if let Some(solid2d_id) = a.solid2d_id { + ids.push(solid2d_id); + } + ids + } + Artifact::Segment(a) => { + // Note: Don't include these since they're parents: path_id. + let mut ids = Vec::new(); + if let Some(surface_id) = a.surface_id { + ids.push(surface_id); + } + ids.extend(&a.edge_ids); + if let Some(edge_cut_id) = a.edge_cut_id { + ids.push(edge_cut_id); + } + ids + } + Artifact::Solid2d(_) => { + // Note: Don't include these since they're parents: path_id. + Vec::new() + } + Artifact::StartSketchOnFace { .. } => Vec::new(), + Artifact::StartSketchOnPlane { .. } => Vec::new(), + Artifact::Sweep(a) => { + // Note: Don't include these since they're parents: path_id. + let mut ids = Vec::new(); + ids.extend(&a.surface_ids); + ids.extend(&a.edge_ids); + ids + } + Artifact::Wall(a) => { + // Note: Don't include these since they're parents: seg_id, + // sweep_id. + let mut ids = Vec::new(); + ids.extend(&a.edge_cut_edge_ids); + ids.extend(&a.path_ids); + ids + } + Artifact::Cap(a) => { + // Note: Don't include these since they're parents: sweep_id. + let mut ids = Vec::new(); + ids.extend(&a.edge_cut_edge_ids); + ids.extend(&a.path_ids); + ids + } + Artifact::SweepEdge(_) => { + // Note: Don't include these since they're parents: seg_id, + // sweep_id. + Vec::new() + } + Artifact::EdgeCut(a) => { + // Note: Don't include these since they're parents: + // consumed_edge_id. + let mut ids = Vec::new(); + ids.extend(&a.edge_ids); + if let Some(surface_id) = a.surface_id { + ids.push(surface_id); + } + ids + } + Artifact::EdgeCutEdge(a) => { + // Note: Don't include these since they're parents: edge_cut_id. + vec![a.surface_id] + } + } + } +} + +impl ArtifactGraph { + /// Output the Mermaid flowchart for the artifact graph. + pub(crate) fn to_mermaid_flowchart(&self) -> Result { + let mut output = String::new(); + output.push_str("```mermaid\n"); + output.push_str("flowchart LR\n"); + + let mut next_id = 1_u32; + let mut stable_id_map = FnvHashMap::default(); + for id in self.map.keys() { + stable_id_map.insert(*id, next_id); + next_id = next_id.checked_add(1).unwrap(); + } + + // Output all nodes first since edge order can change how Mermaid + // lays out nodes. This is also where we output more details about + // the nodes, like their labels. + self.flowchart_nodes(&mut output, &stable_id_map, " ")?; + self.flowchart_edges(&mut output, &stable_id_map, " ")?; + + output.push_str("```\n"); + + Ok(output) + } + + /// Output the Mermaid flowchart nodes, one for each artifact. + fn flowchart_nodes( + &self, + output: &mut W, + stable_id_map: &FnvHashMap, + prefix: &str, + ) -> std::fmt::Result { + // Artifact ID of the path is the key. The value is a list of + // artifact IDs in that group. + let mut groups = IndexMap::new(); + let mut ungrouped = Vec::new(); + + for artifact in self.map.values() { + let id = artifact.id(); + + let grouped = match artifact { + Artifact::Plane(_) => false, + Artifact::Path(_) => { + groups.entry(id).or_insert_with(Vec::new).push(id); + true + } + Artifact::Segment(segment) => { + let path_id = segment.path_id; + groups.entry(path_id).or_insert_with(Vec::new).push(id); + true + } + Artifact::Solid2d(solid2d) => { + let path_id = solid2d.path_id; + groups.entry(path_id).or_insert_with(Vec::new).push(id); + true + } + Artifact::StartSketchOnFace { .. } + | Artifact::StartSketchOnPlane { .. } + | Artifact::Sweep(_) + | Artifact::Wall(_) + | Artifact::Cap(_) + | Artifact::SweepEdge(_) + | Artifact::EdgeCut(_) + | Artifact::EdgeCutEdge(_) => false, + }; + if !grouped { + ungrouped.push(id); + } + } + + for (group_id, artifact_ids) in groups { + let group_id = *stable_id_map.get(&group_id).unwrap(); + writeln!(output, "{prefix}subgraph path{group_id} [Path]")?; + let indented = format!("{} ", prefix); + for artifact_id in artifact_ids { + let artifact = self.map.get(&artifact_id).unwrap(); + let id = *stable_id_map.get(&artifact_id).unwrap(); + self.flowchart_node(output, artifact, id, &indented)?; + } + writeln!(output, "{prefix}end")?; + } + + for artifact_id in ungrouped { + let artifact = self.map.get(&artifact_id).unwrap(); + let id = *stable_id_map.get(&artifact_id).unwrap(); + self.flowchart_node(output, artifact, id, prefix)?; + } + + Ok(()) + } + + fn flowchart_node( + &self, + output: &mut W, + artifact: &Artifact, + id: NodeId, + prefix: &str, + ) -> std::fmt::Result { + // For now, only showing the source range. + fn code_ref_display(code_ref: &CodeRef) -> [usize; 3] { + range_display(code_ref.range) + } + fn range_display(range: SourceRange) -> [usize; 3] { + [range.start(), range.end(), range.module_id().as_usize()] + } + + match artifact { + Artifact::Plane(plane) => { + writeln!( + output, + "{prefix}{}[\"Plane
{:?}\"]", + id, + code_ref_display(&plane.code_ref) + )?; + } + Artifact::Path(path) => { + writeln!( + output, + "{prefix}{}[\"Path
{:?}\"]", + id, + code_ref_display(&path.code_ref) + )?; + } + Artifact::Segment(segment) => { + writeln!( + output, + "{prefix}{}[\"Segment
{:?}\"]", + id, + code_ref_display(&segment.code_ref) + )?; + } + Artifact::Solid2d(_solid2d) => { + writeln!(output, "{prefix}{}[Solid2d]", id)?; + } + Artifact::StartSketchOnFace { source_range, .. } => { + writeln!( + output, + "{prefix}{}[\"StartSketchOnFace
{:?}\"]", + id, + range_display(*source_range) + )?; + } + Artifact::StartSketchOnPlane { source_range, .. } => { + writeln!( + output, + "{prefix}{}[\"StartSketchOnPlane
{:?}\"]", + id, + range_display(*source_range) + )?; + } + Artifact::Sweep(sweep) => { + writeln!( + output, + "{prefix}{}[\"Sweep {:?}
{:?}\"]", + id, + sweep.sub_type, + code_ref_display(&sweep.code_ref) + )?; + } + Artifact::Wall(_wall) => { + writeln!(output, "{prefix}{}[Wall]", id)?; + } + Artifact::Cap(cap) => { + writeln!(output, "{prefix}{}[\"Cap {:?}\"]", id, cap.sub_type)?; + } + Artifact::SweepEdge(sweep_edge) => { + writeln!(output, "{prefix}{}[\"SweepEdge {:?}\"]", id, sweep_edge.sub_type)?; + } + Artifact::EdgeCut(edge_cut) => { + writeln!( + output, + "{prefix}{}[\"EdgeCut {:?}
{:?}\"]", + id, + edge_cut.sub_type, + code_ref_display(&edge_cut.code_ref) + )?; + } + Artifact::EdgeCutEdge(_edge_cut_edge) => { + writeln!(output, "{prefix}{}[EdgeCutEdge]", id)?; + } + } + Ok(()) + } + + fn flowchart_edges( + &self, + output: &mut W, + stable_id_map: &FnvHashMap, + prefix: &str, + ) -> Result<(), std::fmt::Error> { + // Mermaid will display two edges in either direction, even using + // the `---` edge type. So we need to deduplicate them. + fn add_unique_edge(edges: &mut Edges, source_id: NodeId, target_id: NodeId, flow: EdgeFlow, kind: EdgeKind) { + if source_id == target_id { + // Self edge. Skip it. + return; + } + // The key is the node IDs in canonical order. + let a = source_id.min(target_id); + let b = source_id.max(target_id); + let new_direction = if a == source_id { + EdgeDirection::Forward + } else { + EdgeDirection::Backward + }; + let initial_flow = if a == source_id { flow } else { flow.reverse() }; + let edge = edges.entry((a, b)).or_insert(EdgeInfo { + direction: new_direction, + flow: initial_flow, + kind, + }); + // Merge with existing edge. + edge.direction = edge.direction.merge(new_direction); + } + + // Collect all edges to deduplicate them. + let mut edges = IndexMap::default(); + for artifact in self.map.values() { + let source_id = *stable_id_map.get(&artifact.id()).unwrap(); + // In Mermaid, the textual order defines the rank, even though the + // edge arrow can go in either direction. + // + // Back edges: parent <- self + // Child edges: self -> child + for (target_id, flow) in artifact + .back_edges() + .into_iter() + .zip(std::iter::repeat(EdgeFlow::TargetToSource)) + .chain( + artifact + .child_ids() + .into_iter() + .zip(std::iter::repeat(EdgeFlow::SourceToTarget)), + ) + { + let Some(target) = self.map.get(&target_id) else { + continue; + }; + let edge_kind = match (artifact, target) { + (Artifact::Path(_), Artifact::Sweep(_)) | (Artifact::Sweep(_), Artifact::Path(_)) => { + EdgeKind::PathToSweep + } + _ => EdgeKind::Other, + }; + let target_id = *stable_id_map.get(&target_id).unwrap(); + add_unique_edge(&mut edges, source_id, target_id, flow, edge_kind); + } + } + + // Output the edges. + for ((source_id, target_id), edge) in edges { + let extra = match edge.kind { + // Extra length. This is needed to make the graph layout more + // legible. Without it, the sweep will be at the same rank as + // the path's segments, and the sweep's edges overlap with the + // segment edges a lot. + EdgeKind::PathToSweep => "-", + EdgeKind::Other => "", + }; + match edge.flow { + EdgeFlow::SourceToTarget => match edge.direction { + EdgeDirection::Forward => { + writeln!(output, "{prefix}{source_id} x{}--> {}", extra, target_id)?; + } + EdgeDirection::Backward => { + writeln!(output, "{prefix}{source_id} <{}--x {}", extra, target_id)?; + } + EdgeDirection::Bidirectional => { + writeln!(output, "{prefix}{source_id} {}--- {}", extra, target_id)?; + } + }, + EdgeFlow::TargetToSource => match edge.direction { + EdgeDirection::Forward => { + writeln!(output, "{prefix}{target_id} x{}--> {}", extra, source_id)?; + } + EdgeDirection::Backward => { + writeln!(output, "{prefix}{target_id} <{}--x {}", extra, source_id)?; + } + EdgeDirection::Bidirectional => { + writeln!(output, "{prefix}{target_id} {}--- {}", extra, source_id)?; + } + }, + } + } + + Ok(()) + } + + /// Output the Mermaid mind map for the artifact graph. + /// + /// This is sometimes easier to read than the flowchart. But since it + /// does a depth-first traversal starting from all the planes, it may + /// not include all the artifacts. It also doesn't show edge direction. + /// It's useful for a high-level overview of the graph, not for + /// including all the information. + pub(crate) fn to_mermaid_mind_map(&self) -> Result { + let mut output = String::new(); + output.push_str("```mermaid\n"); + output.push_str("mindmap\n"); + output.push_str(" root\n"); + + for (_, artifact) in &self.map { + // Only the planes are roots. + let Artifact::Plane(_) = artifact else { + continue; + }; + self.mind_map_artifact(&mut output, artifact, " ")?; + } + + output.push_str("```\n"); + + Ok(output) + } + + fn mind_map_artifact(&self, output: &mut W, artifact: &Artifact, prefix: &str) -> std::fmt::Result { + match artifact { + Artifact::Plane(_plane) => { + writeln!(output, "{prefix}Plane")?; + } + Artifact::Path(_path) => { + writeln!(output, "{prefix}Path")?; + } + Artifact::Segment(_segment) => { + writeln!(output, "{prefix}Segment")?; + } + Artifact::Solid2d(_solid2d) => { + writeln!(output, "{prefix}Solid2d")?; + } + Artifact::StartSketchOnFace { .. } => { + writeln!(output, "{prefix}StartSketchOnFace")?; + } + Artifact::StartSketchOnPlane { .. } => { + writeln!(output, "{prefix}StartSketchOnPlane")?; + } + Artifact::Sweep(sweep) => { + writeln!(output, "{prefix}Sweep {:?}", sweep.sub_type)?; + } + Artifact::Wall(_wall) => { + writeln!(output, "{prefix}Wall")?; + } + Artifact::Cap(cap) => { + writeln!(output, "{prefix}Cap {:?}", cap.sub_type)?; + } + Artifact::SweepEdge(sweep_edge) => { + writeln!(output, "{prefix}SweepEdge {:?}", sweep_edge.sub_type,)?; + } + Artifact::EdgeCut(edge_cut) => { + writeln!(output, "{prefix}EdgeCut {:?}", edge_cut.sub_type)?; + } + Artifact::EdgeCutEdge(_edge_cut_edge) => { + writeln!(output, "{prefix}EdgeCutEdge")?; + } + } + + for child_id in artifact.child_ids() { + let Some(child_artifact) = self.map.get(&child_id) else { + continue; + }; + self.mind_map_artifact(output, child_artifact, &format!("{} ", prefix))?; + } + + Ok(()) + } +} diff --git a/src/wasm-lib/kcl/src/execution/cache.rs b/src/wasm-lib/kcl/src/execution/cache.rs index 479778aa0f..f2ff3cd202 100644 --- a/src/wasm-lib/kcl/src/execution/cache.rs +++ b/src/wasm-lib/kcl/src/execution/cache.rs @@ -8,7 +8,7 @@ use crate::{ }; /// Information for the caching an AST and smartly re-executing it if we can. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct CacheInformation { /// The old information. pub old: Option, @@ -17,7 +17,7 @@ pub struct CacheInformation { } /// The old ast and program memory. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize)] pub struct OldAstState { /// The ast. pub ast: Node, diff --git a/src/wasm-lib/kcl/src/execution/mod.rs b/src/wasm-lib/kcl/src/execution/mod.rs index 24b741f227..4504b12fdd 100644 --- a/src/wasm-lib/kcl/src/execution/mod.rs +++ b/src/wasm-lib/kcl/src/execution/mod.rs @@ -3,6 +3,7 @@ use std::{path::PathBuf, sync::Arc}; use anyhow::Result; +use artifact::build_artifact_graph; use async_recursion::async_recursion; use indexmap::IndexMap; use kcmc::{ @@ -11,8 +12,8 @@ use kcmc::{ websocket::{ModelingSessionData, OkWebSocketResponseData}, ImageFormat, ModelingCmd, }; -use kittycad_modeling_cmds as kcmc; use kittycad_modeling_cmds::length_unit::LengthUnit; +use kittycad_modeling_cmds::{self as kcmc, websocket::WebSocketResponse}; use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -49,18 +50,18 @@ use crate::{ }; // Re-exports. -pub use artifact::{Artifact, ArtifactCommand, ArtifactId, ArtifactInner}; +pub use artifact::{Artifact, ArtifactCommand, ArtifactGraph, ArtifactId}; pub use cad_op::Operation; /// State for executing a program. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct ExecState { pub global: GlobalState, pub mod_local: ModuleState, } -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] +#[derive(Debug, Clone, Deserialize, Serialize)] #[serde(rename_all = "camelCase")] pub struct GlobalState { /// The stable artifact ID generator. @@ -75,6 +76,13 @@ pub struct GlobalState { /// These are accumulated in the [`ExecutorContext`] but moved here for /// convenience of the execution cache. pub artifact_commands: Vec, + /// Responses from the engine for `artifact_commands`. We need to cache + /// this so that we can build the artifact graph. These are accumulated in + /// the [`ExecutorContext`] but moved here for convenience of the execution + /// cache. + pub artifact_responses: IndexMap, + /// Output artifact graph. + pub artifact_graph: ArtifactGraph, } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] @@ -113,6 +121,8 @@ pub struct ExecOutcome { pub artifacts: IndexMap, /// Output commands to allow building the artifact graph by the caller. pub artifact_commands: Vec, + /// Output artifact graph. + pub artifact_graph: ArtifactGraph, } impl ExecState { @@ -149,6 +159,7 @@ impl ExecState { operations: self.mod_local.operations, artifacts: self.global.artifacts, artifact_commands: self.global.artifact_commands, + artifact_graph: self.global.artifact_graph, } } @@ -165,7 +176,7 @@ impl ExecState { } pub fn add_artifact(&mut self, artifact: Artifact) { - let id = artifact.id; + let id = artifact.id(); self.global.artifacts.insert(id, artifact); } @@ -216,6 +227,8 @@ impl GlobalState { module_infos: Default::default(), artifacts: Default::default(), artifact_commands: Default::default(), + artifact_responses: Default::default(), + artifact_graph: Default::default(), }; // TODO(#4434): Use the top-level file's path. @@ -2239,22 +2252,56 @@ impl ExecutorContext { .await .map_err(KclErrorWithOutputs::no_outputs)?; - self.inner_execute(&cache_result.program, exec_state, crate::execution::BodyType::Root) + self.execute_and_build_graph(&cache_result.program, exec_state) .await .map_err(|e| { KclErrorWithOutputs::new( e, exec_state.mod_local.operations.clone(), - self.engine.take_artifact_commands(), + exec_state.global.artifact_commands.clone(), + exec_state.global.artifact_graph.clone(), ) })?; - // Move the artifact commands to simplify cache management. + + let session_data = self.engine.get_session_data(); + Ok(session_data) + } + + /// Execute an AST's program and build auxiliary outputs like the artifact + /// graph. + async fn execute_and_build_graph<'a>( + &self, + program: NodeRef<'a, crate::parsing::ast::types::Program>, + exec_state: &mut ExecState, + ) -> Result, KclError> { + // Don't early return! We need to build other outputs regardless of + // whether execution failed. + let exec_result = self + .inner_execute(program, exec_state, crate::execution::BodyType::Root) + .await; + // Move the artifact commands and responses to simplify cache management + // and error creation. exec_state .global .artifact_commands .extend(self.engine.take_artifact_commands()); - let session_data = self.engine.get_session_data(); - Ok(session_data) + exec_state.global.artifact_responses.extend(self.engine.responses()); + // Build the artifact graph. + match build_artifact_graph( + &exec_state.global.artifact_commands, + &exec_state.global.artifact_responses, + program, + &exec_state.global.artifacts, + ) { + Ok(artifact_graph) => { + exec_state.global.artifact_graph = artifact_graph; + exec_result + } + Err(err) => { + // Prefer the exec error. + exec_result.and(Err(err)) + } + } } /// Execute an AST's program. diff --git a/src/wasm-lib/kcl/src/simulation_tests.rs b/src/wasm-lib/kcl/src/simulation_tests.rs index 48a07f5efe..f4454fc89b 100644 --- a/src/wasm-lib/kcl/src/simulation_tests.rs +++ b/src/wasm-lib/kcl/src/simulation_tests.rs @@ -91,12 +91,12 @@ async fn execute(test_name: &str, render_to_png: bool) { ) .await; match exec_res { - Ok((program_memory, ops, artifact_commands, png)) => { + Ok((exec_state, png)) => { 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, { + insta::assert_json_snapshot!("program_memory", exec_state.mod_local.memory, { ".environments[].**[].from[]" => rounded_redaction(4), ".environments[].**[].to[]" => rounded_redaction(4), ".environments[].**[].x[]" => rounded_redaction(4), @@ -105,15 +105,35 @@ async fn execute(test_name: &str, render_to_png: bool) { }); }); assert_snapshot(test_name, "Operations executed", || { - insta::assert_json_snapshot!("ops", ops); + insta::assert_json_snapshot!("ops", exec_state.mod_local.operations); }); assert_snapshot(test_name, "Artifact commands", || { - insta::assert_json_snapshot!("artifact_commands", artifact_commands, { + insta::assert_json_snapshot!("artifact_commands", exec_state.global.artifact_commands, { "[].command.segment.*.x" => rounded_redaction(4), "[].command.segment.*.y" => rounded_redaction(4), "[].command.segment.*.z" => rounded_redaction(4), }); }); + assert_snapshot(test_name, "Artifact graph flowchart", || { + let flowchart = exec_state + .global + .artifact_graph + .to_mermaid_flowchart() + .unwrap_or_else(|e| format!("Failed to convert artifact graph to mind map: {e}")); + // Change the snapshot suffix so that it is rendered as a + // Markdown file in GitHub. + insta::assert_binary_snapshot!("artifact_graph_flowchart.md", flowchart.as_bytes().to_owned()); + }); + assert_snapshot(test_name, "Artifact graph mind map", || { + let mind_map = exec_state + .global + .artifact_graph + .to_mermaid_mind_map() + .unwrap_or_else(|e| format!("Failed to convert artifact graph to mind map: {e}")); + // Change the snapshot suffix so that it is rendered as a + // Markdown file in GitHub. + insta::assert_binary_snapshot!("artifact_graph_mind_map.md", mind_map.as_bytes().to_owned()); + }); } Err(e) => { match e.error { @@ -177,6 +197,90 @@ mod cube { super::execute(TEST_NAME, true).await } } +mod artifact_graph_example_code1 { + const TEST_NAME: &str = "artifact_graph_example_code1"; + + /// 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 artifact_graph_example_code_no_3d { + const TEST_NAME: &str = "artifact_graph_example_code_no_3d"; + + /// 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 artifact_graph_example_code_offset_planes { + const TEST_NAME: &str = "artifact_graph_example_code_offset_planes"; + + /// 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 artifact_graph_sketch_on_face_etc { + const TEST_NAME: &str = "artifact_graph_sketch_on_face_etc"; + + /// 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 helix_ccw { const TEST_NAME: &str = "helix_ccw"; diff --git a/src/wasm-lib/kcl/src/source_range.rs b/src/wasm-lib/kcl/src/source_range.rs index 7b618b3cd7..dcea88d98c 100644 --- a/src/wasm-lib/kcl/src/source_range.rs +++ b/src/wasm-lib/kcl/src/source_range.rs @@ -23,6 +23,13 @@ impl ModuleId { } } +/// The first two items are the start and end points (byte offsets from the start of the file). +/// The third item is whether the source range belongs to the 'main' file, i.e., the file currently +/// being rendered/displayed in the editor. +// +// Don't use a doc comment for the below since the above goes in the website docs. +// @see isTopLevelModule() in wasm.ts. +// TODO we need to handle modules better in the frontend. #[derive(Debug, Default, Deserialize, Serialize, PartialEq, Copy, Clone, ts_rs::TS, JsonSchema, Hash, Eq)] #[ts(export, type = "[number, number, number]")] pub struct SourceRange([usize; 3]); @@ -58,6 +65,12 @@ impl SourceRange { Self::default() } + /// True if this is a source range that doesn't correspond to any source + /// code. + pub fn is_synthetic(&self) -> bool { + self.start() == 0 && self.end() == 0 + } + /// Get the start of the range. pub fn start(&self) -> usize { self.0[0] diff --git a/src/wasm-lib/kcl/src/std/sketch.rs b/src/wasm-lib/kcl/src/std/sketch.rs index d6b6986dc8..562b1fad81 100644 --- a/src/wasm-lib/kcl/src/std/sketch.rs +++ b/src/wasm-lib/kcl/src/std/sketch.rs @@ -11,7 +11,7 @@ use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::execution::{Artifact, ArtifactId, ArtifactInner}; +use crate::execution::{Artifact, ArtifactId}; use crate::{ errors::{KclError, KclErrorDetails}, execution::{ @@ -1079,9 +1079,9 @@ async fn inner_start_sketch_on( SketchData::Plane(plane) => { // Create artifact used only by the UI, not the engine. let id = exec_state.next_uuid(); - exec_state.add_artifact(Artifact { + exec_state.add_artifact(Artifact::StartSketchOnPlane { id: ArtifactId::from(id), - inner: ArtifactInner::StartSketchOnPlane { plane_id: plane.id }, + plane_id: plane.id, source_range: args.source_range, }); @@ -1098,9 +1098,9 @@ async fn inner_start_sketch_on( // Create artifact used only by the UI, not the engine. let id = exec_state.next_uuid(); - exec_state.add_artifact(Artifact { + exec_state.add_artifact(Artifact::StartSketchOnFace { id: ArtifactId::from(id), - inner: ArtifactInner::StartSketchOnFace { face_id: face.id }, + face_id: face.id, source_range: args.source_range, }); diff --git a/src/wasm-lib/kcl/src/test_server.rs b/src/wasm-lib/kcl/src/test_server.rs index 716de3a995..463552ed39 100644 --- a/src/wasm-lib/kcl/src/test_server.rs +++ b/src/wasm-lib/kcl/src/test_server.rs @@ -4,7 +4,7 @@ use std::path::PathBuf; use crate::{ errors::ExecErrorWithState, - execution::{new_zoo_client, ArtifactCommand, ExecutorContext, ExecutorSettings, Operation, ProgramMemory}, + execution::{new_zoo_client, ExecutorContext, ExecutorSettings}, settings::types::UnitLength, ConnectionError, ExecError, ExecState, KclErrorWithOutputs, Program, }; @@ -39,16 +39,9 @@ pub async fn execute_and_snapshot_ast( ast: Program, units: UnitLength, project_directory: Option, -) -> Result<(ProgramMemory, Vec, Vec, image::DynamicImage), ExecErrorWithState> { +) -> Result<(ExecState, image::DynamicImage), ExecErrorWithState> { let ctx = new_context(units, true, project_directory).await?; - let res = do_execute_and_snapshot(&ctx, ast).await.map(|(state, snap)| { - ( - state.mod_local.memory, - state.mod_local.operations, - state.global.artifact_commands, - snap, - ) - }); + let res = do_execute_and_snapshot(&ctx, ast).await; ctx.close().await; res } @@ -71,7 +64,7 @@ pub async fn execute_and_snapshot_no_auth( async fn do_execute_and_snapshot( ctx: &ExecutorContext, program: Program, -) -> Result<(crate::execution::ExecState, image::DynamicImage), ExecErrorWithState> { +) -> Result<(ExecState, image::DynamicImage), ExecErrorWithState> { let mut exec_state = ExecState::new(&ctx.settings); let snapshot_png_bytes = ctx .execute_and_prepare_snapshot(&program, &mut exec_state) diff --git a/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..af1252ad28 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart add_lots.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..6486389c36 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map add_lots.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/add_lots/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..6ea83c4162 --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart angled_line.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..28a0e88178 --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_flowchart.snap.md @@ -0,0 +1,82 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 67, 0]"] + 3["Segment
[73, 94, 0]"] + 4["Segment
[100, 130, 0]"] + 5["Segment
[136, 159, 0]"] + 6["Segment
[165, 202, 0]"] + 7["Segment
[208, 232, 0]"] + 8["Segment
[238, 246, 0]"] + 9[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 10["Sweep Extrusion
[252, 265, 0]"] + 11[Wall] + 12[Wall] + 13[Wall] + 14[Wall] + 15[Wall] + 16[Wall] + 17["Cap Start"] + 18["Cap End"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["SweepEdge Opposite"] + 24["SweepEdge Adjacent"] + 25["SweepEdge Opposite"] + 26["SweepEdge Adjacent"] + 27["SweepEdge Opposite"] + 28["SweepEdge Adjacent"] + 29["SweepEdge Opposite"] + 30["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 ---- 10 + 2 --- 9 + 3 --- 16 + 3 --- 29 + 3 --- 30 + 4 --- 15 + 4 --- 27 + 4 --- 28 + 5 --- 14 + 5 --- 25 + 5 --- 26 + 6 --- 13 + 6 --- 23 + 6 --- 24 + 7 --- 12 + 7 --- 21 + 7 --- 22 + 8 --- 11 + 8 --- 19 + 8 --- 20 + 10 --- 11 + 10 --- 12 + 10 --- 13 + 10 --- 14 + 10 --- 15 + 10 --- 16 + 10 --- 17 + 10 --- 18 + 10 --- 19 + 10 --- 20 + 10 --- 21 + 10 --- 22 + 10 --- 23 + 10 --- 24 + 10 --- 25 + 10 --- 26 + 10 --- 27 + 10 --- 28 + 10 --- 29 + 10 --- 30 +``` diff --git a/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..4d45e69e73 --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map angled_line.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..6af8c110cb --- /dev/null +++ b/src/wasm-lib/kcl/tests/angled_line/artifact_graph_mind_map.snap.md @@ -0,0 +1,52 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..3712b9db48 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart array_elem_pop.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..17fc045fec --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map array_elem_pop.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_pop/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..93c718bfc5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart array_elem_push.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..a0621762f5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map array_elem_push.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_elem_push/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..31d7cc3a2e --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart array_range_expr.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..ee588eb3b9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map array_range_expr.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_expr/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..47469a0a4c --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart array_range_negative_expr.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..2514ff02d7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map array_range_negative_expr.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/array_range_negative_expr/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_commands.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_commands.snap new file mode 100644 index 0000000000..2058c491bc --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_commands.snap @@ -0,0 +1,937 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands artifact_graph_example_code1.kcl +snapshot_kind: text +--- +[ + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.7, + "g": 0.28, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.7, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.28, + "b": 0.7, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "mm" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 12, + 31, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 64, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 64, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 64, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -5.0, + "y": -5.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 70, + 86, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": 10.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 92, + 119, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 10.55, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 125, + 150, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -10.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 156, + 203, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -5.0, + "y": -5.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 209, + 217, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 209, + 217, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -10.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 231, + 254, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 260, + 301, + 0 + ], + "command": { + "type": "solid3d_fillet_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "radius": 5.0, + "tolerance": 0.0000001, + "cut_type": "fillet", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 352, + 379, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 352, + 379, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 352, + 379, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -2.0, + "y": -6.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 385, + 400, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 2.0, + "y": 3.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 406, + 422, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 2.0, + "y": -3.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 428, + 475, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -2.0, + "y": -6.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 481, + 489, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 5.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 503, + 524, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..2efe44f43c --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart artifact_graph_example_code1.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..e3897f53a2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_flowchart.snap.md @@ -0,0 +1,109 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[37, 64, 0]"] + 3["Segment
[70, 86, 0]"] + 4["Segment
[92, 119, 0]"] + 5["Segment
[125, 150, 0]"] + 6["Segment
[156, 203, 0]"] + 7["Segment
[209, 217, 0]"] + 8[Solid2d] + end + subgraph path25 [Path] + 25["Path
[352, 379, 0]"] + 26["Segment
[385, 400, 0]"] + 27["Segment
[406, 422, 0]"] + 28["Segment
[428, 475, 0]"] + 29["Segment
[481, 489, 0]"] + 30[Solid2d] + end + 1["Plane
[12, 31, 0]"] + 9["Sweep Extrusion
[231, 254, 0]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 24["EdgeCut Fillet
[260, 301, 0]"] + 31["Sweep Extrusion
[503, 524, 0]"] + 32[Wall] + 33[Wall] + 34[Wall] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["SweepEdge Opposite"] + 39["SweepEdge Adjacent"] + 40["SweepEdge Opposite"] + 41["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 13 + 3 --- 22 + 3 --- 23 + 4 --- 12 + 4 --- 20 + 4 --- 21 + 4 --- 24 + 5 --- 11 + 5 --- 18 + 5 --- 19 + 6 --- 10 + 6 --- 16 + 6 --- 17 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 + 11 --- 25 + 25 --- 26 + 25 --- 27 + 25 --- 28 + 25 --- 29 + 25 ---- 31 + 25 --- 30 + 26 --- 34 + 26 --- 40 + 26 --- 41 + 27 --- 33 + 27 --- 38 + 27 --- 39 + 28 --- 32 + 28 --- 36 + 28 --- 37 + 31 --- 32 + 31 --- 33 + 31 --- 34 + 31 --- 35 + 31 --- 36 + 31 --- 37 + 31 --- 38 + 31 --- 39 + 31 --- 40 + 31 --- 41 +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..b82f1677fa --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map artifact_graph_example_code1.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..295003054a --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/artifact_graph_mind_map.snap.md @@ -0,0 +1,92 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ast.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ast.snap new file mode 100644 index 0000000000..b7f1dc409c --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ast.snap @@ -0,0 +1,837 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing artifact_graph_example_code1.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 217, + "id": { + "end": 9, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'XY'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "XY" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 55, + "raw": "5", + "start": 54, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 55, + "operator": "-", + "start": 53, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 59, + "raw": "5", + "start": 58, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 59, + "operator": "-", + "start": 57, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 60, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 63, + "start": 62, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51, + "name": "startProfileAt", + "start": 37, + "type": "Identifier" + }, + "end": 64, + "start": 37, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 77, + "raw": "0", + "start": 76, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 81, + "raw": "10", + "start": 79, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "end": 82, + "start": 75, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 85, + "start": 84, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 74, + "name": "line", + "start": 70, + "type": "Identifier" + }, + "end": 86, + "start": 70, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 103, + "raw": "10.55", + "start": 98, + "type": "Literal", + "type": "Literal", + "value": 10.55 + }, + { + "end": 106, + "raw": "0", + "start": 105, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 107, + "start": 97, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 110, + "start": 109, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 96, + "name": "line", + "start": 92, + "type": "Identifier" + }, + "end": 119, + "start": 92, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 132, + "raw": "0", + "start": 131, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "argument": { + "end": 137, + "raw": "10", + "start": 135, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 137, + "operator": "-", + "start": 134, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 138, + "start": 130, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 141, + "start": 140, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + ], + "callee": { + "end": 129, + "name": "line", + "start": 125, + "type": "Identifier" + }, + "end": 150, + "start": 125, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 179, + "start": 178, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 177, + "name": "profileStartX", + "start": 164, + "type": "Identifier" + }, + "end": 180, + "start": 164, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 197, + "start": 196, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 195, + "name": "profileStartY", + "start": 182, + "type": "Identifier" + }, + "end": 198, + "start": 182, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 199, + "start": 163, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 202, + "start": 201, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 162, + "name": "lineTo", + "start": 156, + "type": "Identifier" + }, + "end": 203, + "start": 156, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 216, + "start": 215, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 214, + "name": "close", + "start": 209, + "type": "Identifier" + }, + "end": 217, + "start": 209, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 217, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 217, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 301, + "id": { + "end": 228, + "name": "extrude001", + "start": 218, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "argument": { + "end": 242, + "raw": "10", + "start": 240, + "type": "Literal", + "type": "Literal", + "value": 10.0 + }, + "end": 242, + "operator": "-", + "start": 239, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 253, + "name": "sketch001", + "start": 244, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 238, + "name": "extrude", + "start": 231, + "type": "Identifier" + }, + "end": 254, + "start": 231, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 297, + "properties": [ + { + "end": 279, + "key": { + "end": 275, + "name": "radius", + "start": 269, + "type": "Identifier" + }, + "start": 269, + "type": "ObjectProperty", + "value": { + "end": 279, + "raw": "5", + "start": 278, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + }, + { + "end": 295, + "key": { + "end": 285, + "name": "tags", + "start": 281, + "type": "Identifier" + }, + "start": 281, + "type": "ObjectProperty", + "value": { + "elements": [ + { + "end": 294, + "name": "seg01", + "start": 289, + "type": "Identifier", + "type": "Identifier" + } + ], + "end": 295, + "start": 288, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "start": 267, + "type": "ObjectExpression", + "type": "ObjectExpression" + }, + { + "end": 300, + "start": 299, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 266, + "name": "fillet", + "start": 260, + "type": "Identifier" + }, + "end": 301, + "start": 260, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 301, + "start": 231, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 218, + "type": "VariableDeclarator" + }, + "end": 301, + "kind": "const", + "start": 218, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 489, + "id": { + "end": 311, + "name": "sketch002", + "start": 302, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 338, + "name": "extrude001", + "start": 328, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 345, + "name": "seg02", + "start": 340, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 327, + "name": "startSketchOn", + "start": 314, + "type": "Identifier" + }, + "end": 346, + "start": 314, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 370, + "raw": "2", + "start": 369, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "end": 370, + "operator": "-", + "start": 368, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "argument": { + "end": 374, + "raw": "6", + "start": 373, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + "end": 374, + "operator": "-", + "start": 372, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 375, + "start": 367, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 378, + "start": 377, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 366, + "name": "startProfileAt", + "start": 352, + "type": "Identifier" + }, + "end": 379, + "start": 352, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 392, + "raw": "2", + "start": 391, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 395, + "raw": "3", + "start": 394, + "type": "Literal", + "type": "Literal", + "value": 3.0 + } + ], + "end": 396, + "start": 390, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 399, + "start": 398, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 389, + "name": "line", + "start": 385, + "type": "Identifier" + }, + "end": 400, + "start": 385, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 413, + "raw": "2", + "start": 412, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "argument": { + "end": 417, + "raw": "3", + "start": 416, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "end": 417, + "operator": "-", + "start": 415, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 418, + "start": 411, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 421, + "start": 420, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 410, + "name": "line", + "start": 406, + "type": "Identifier" + }, + "end": 422, + "start": 406, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 451, + "start": 450, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 449, + "name": "profileStartX", + "start": 436, + "type": "Identifier" + }, + "end": 452, + "start": 436, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 469, + "start": 468, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 467, + "name": "profileStartY", + "start": 454, + "type": "Identifier" + }, + "end": 470, + "start": 454, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 471, + "start": 435, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 474, + "start": 473, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 434, + "name": "lineTo", + "start": 428, + "type": "Identifier" + }, + "end": 475, + "start": 428, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 488, + "start": 487, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 486, + "name": "close", + "start": 481, + "type": "Identifier" + }, + "end": 489, + "start": 481, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 489, + "start": 314, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 302, + "type": "VariableDeclarator" + }, + "end": 489, + "kind": "const", + "start": 302, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 524, + "id": { + "end": 500, + "name": "extrude002", + "start": 490, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 512, + "raw": "5", + "start": 511, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 523, + "name": "sketch002", + "start": 514, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 510, + "name": "extrude", + "start": 503, + "type": "Identifier" + }, + "end": 524, + "start": 503, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 490, + "type": "VariableDeclarator" + }, + "end": 524, + "kind": "const", + "start": 490, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 525, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/input.kcl b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/input.kcl new file mode 100644 index 0000000000..ecfc0a42d3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/input.kcl @@ -0,0 +1,16 @@ +sketch001 = startSketchOn('XY') + |> startProfileAt([-5, -5], %) + |> line([0, 10], %) + |> line([10.55, 0], %, $seg01) + |> line([0, -10], %, $seg02) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(-10, sketch001) + |> fillet({ radius = 5, tags = [seg01] }, %) +sketch002 = startSketchOn(extrude001, seg02) + |> startProfileAt([-2, -6], %) + |> line([2, 3], %) + |> line([2, -3], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude002 = extrude(5, sketch002) diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ops.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ops.snap new file mode 100644 index 0000000000..067a6a8dae --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/ops.snap @@ -0,0 +1,130 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed artifact_graph_example_code1.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 239, + 242, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 244, + 253, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 231, + 254, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 267, + 297, + 0 + ] + }, + "solid": { + "sourceRange": [ + 299, + 300, + 0 + ] + } + }, + "name": "fillet", + "sourceRange": [ + 260, + 301, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 328, + 338, + 0 + ] + }, + "tag": { + "sourceRange": [ + 340, + 345, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 314, + 346, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 511, + 512, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 514, + 523, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 503, + 524, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/program_memory.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/program_memory.snap new file mode 100644 index 0000000000..64ed2fe112 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/program_memory.snap @@ -0,0 +1,1904 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing artifact_graph_example_code1.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "extrude001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.55, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.55, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.55, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ] + }, + "from": [ + 5.55, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 209, + 217, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + } + ], + "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": [ + -5.0, + -5.0 + ], + "to": [ + -5.0, + -5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 64, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.550000000000001, + 5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 112, + 118, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.550000000000001, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.550000000000001, + -5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 143, + 149, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "height": -10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "extrude002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 385, + 400, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 406, + 422, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 428, + 475, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 385, + 400, + 0 + ] + }, + "from": [ + -2.0, + -6.0 + ], + "tag": null, + "to": [ + 0.0, + -3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 406, + 422, + 0 + ] + }, + "from": [ + 0.0, + -3.0 + ], + "tag": null, + "to": [ + 2.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 475, + 0 + ] + }, + "from": [ + 2.0, + -6.0 + ], + "tag": null, + "to": [ + -2.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 481, + 489, + 0 + ] + }, + "from": [ + -2.0, + -6.0 + ], + "tag": null, + "to": [ + -2.0, + -6.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg02", + "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 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.55, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.55, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.55, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ] + }, + "from": [ + 5.55, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 209, + 217, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + } + ], + "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": [ + -5.0, + -5.0 + ], + "to": [ + -5.0, + -5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 64, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.550000000000001, + 5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 112, + 118, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.550000000000001, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.550000000000001, + -5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 143, + 149, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "height": -10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 314, + 346, + 0 + ] + } + ] + }, + "start": { + "from": [ + -2.0, + -6.0 + ], + "to": [ + -2.0, + -6.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 352, + 379, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 352, + 379, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 352, + 379, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.550000000000001, + 5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 112, + 118, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.550000000000001, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.550000000000001, + -5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 143, + 149, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.55, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.55, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.55, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ] + }, + "from": [ + 5.55, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 209, + 217, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + } + ], + "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": [ + -5.0, + -5.0 + ], + "to": [ + -5.0, + -5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 64, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.550000000000001, + 5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 112, + 118, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.550000000000001, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.550000000000001, + -5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 143, + 149, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + } + }, + "sketch002": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 385, + 400, + 0 + ] + }, + "from": [ + -2.0, + -6.0 + ], + "tag": null, + "to": [ + 0.0, + -3.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 406, + 422, + 0 + ] + }, + "from": [ + 0.0, + -3.0 + ], + "tag": null, + "to": [ + 2.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 428, + 475, + 0 + ] + }, + "from": [ + 2.0, + -6.0 + ], + "tag": null, + "to": [ + -2.0, + -6.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 481, + 489, + 0 + ] + }, + "from": [ + -2.0, + -6.0 + ], + "tag": null, + "to": [ + -2.0, + -6.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg02", + "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 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 70, + 86, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.55, + 5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.55, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.55, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 156, + 203, + 0 + ] + }, + "from": [ + 5.55, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 209, + 217, + 0 + ] + }, + "from": [ + -5.0, + -5.0 + ], + "tag": null, + "to": [ + -5.0, + -5.0 + ], + "type": "ToPoint" + } + ], + "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": [ + -5.0, + -5.0 + ], + "to": [ + -5.0, + -5.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 64, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ] + }, + "from": [ + -5.0, + 5.0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 5.550000000000001, + 5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 92, + 119, + 0 + ], + "tag": { + "end": 118, + "start": 112, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 112, + 118, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ] + }, + "from": [ + 5.550000000000001, + 5.0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 5.550000000000001, + -5.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 125, + 150, + 0 + ], + "tag": { + "end": 149, + "start": 143, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 143, + 149, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "height": -10.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": 5.0, + "edgeId": "[uuid]", + "tag": null + } + ], + "__meta": [ + { + "sourceRange": [ + 37, + 64, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 314, + 346, + 0 + ] + } + ] + }, + "start": { + "from": [ + -2.0, + -6.0 + ], + "to": [ + -2.0, + -6.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 352, + 379, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 352, + 379, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code1/rendered_model.png b/src/wasm-lib/kcl/tests/artifact_graph_example_code1/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..f43cfc5a13ee7f8be1dfb92af90f1f0a66529f30 GIT binary patch literal 61402 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 d$t~{s?UZ>F{+QZ6fd5MydfP8n-hA&<{}-Lp[37, 65, 0]"] + 3["Segment
[71, 121, 0]"] + 4["Segment
[127, 227, 0]"] + 5["Segment
[233, 353, 0]"] + 6["Segment
[359, 406, 0]"] + 7["Segment
[412, 420, 0]"] + 8[Solid2d] + end + subgraph path10 [Path] + 10["Path
[459, 488, 0]"] + 11["Segment
[494, 516, 0]"] + 12["Segment
[522, 548, 0]"] + 13["Segment
[554, 586, 0]"] + end + 1["Plane
[12, 31, 0]"] + 9["Plane
[433, 453, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 9 --- 10 + 10 --- 11 + 10 --- 12 + 10 --- 13 +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..a0660855d9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map artifact_graph_example_code_no_3d.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..53d1eed7a7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/artifact_graph_mind_map.snap.md @@ -0,0 +1,17 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Segment + Segment + Segment + Segment + Solid2d + Plane + Path + Segment + Segment + Segment +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ast.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ast.snap new file mode 100644 index 0000000000..8b3693db77 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ast.snap @@ -0,0 +1,638 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing artifact_graph_example_code_no_3d.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 420, + "id": { + "end": 9, + "name": "sketch003", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'YZ'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "YZ" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 57, + "raw": "5.82", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 5.82 + }, + { + "end": 60, + "raw": "0", + "start": 59, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 61, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 64, + "start": 63, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51, + "name": "startProfileAt", + "start": 37, + "type": "Identifier" + }, + "end": 65, + "start": 37, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 86, + "raw": "180", + "start": 83, + "type": "Literal", + "type": "Literal", + "value": 180.0 + }, + { + "end": 93, + "raw": "11.54", + "start": 88, + "type": "Literal", + "type": "Literal", + "value": 11.54 + } + ], + "end": 94, + "start": 82, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 97, + "start": 96, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 120, + "start": 99, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + } + ], + "callee": { + "end": 81, + "name": "angledLine", + "start": 71, + "type": "Identifier" + }, + "end": 121, + "start": 71, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 180, + "left": { + "arguments": [ + { + "end": 174, + "name": "rectangleSegmentA001", + "start": 154, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 153, + "name": "segAng", + "start": 147, + "type": "Identifier" + }, + "end": 175, + "start": 147, + "type": "CallExpression", + "type": "CallExpression" + }, + "operator": "-", + "right": { + "end": 180, + "raw": "90", + "start": 178, + "type": "Literal", + "type": "Literal", + "value": 90.0 + }, + "start": 147, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "end": 193, + "raw": "8.21", + "start": 189, + "type": "Literal", + "type": "Literal", + "value": 8.21 + } + ], + "end": 200, + "start": 138, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 203, + "start": 202, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 226, + "start": 205, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + } + ], + "callee": { + "end": 137, + "name": "angledLine", + "start": 127, + "type": "Identifier" + }, + "end": 227, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 280, + "name": "rectangleSegmentA001", + "start": 260, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 259, + "name": "segAng", + "start": 253, + "type": "Identifier" + }, + "end": 281, + "start": 253, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "argument": { + "arguments": [ + { + "end": 318, + "name": "rectangleSegmentA001", + "start": 298, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 297, + "name": "segLen", + "start": 291, + "type": "Identifier" + }, + "end": 319, + "start": 291, + "type": "CallExpression", + "type": "CallExpression" + }, + "end": 319, + "operator": "-", + "start": 290, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 326, + "start": 244, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 329, + "start": 328, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 352, + "start": 331, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + } + ], + "callee": { + "end": 243, + "name": "angledLine", + "start": 233, + "type": "Identifier" + }, + "end": 353, + "start": 233, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 382, + "start": 381, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 380, + "name": "profileStartX", + "start": 367, + "type": "Identifier" + }, + "end": 383, + "start": 367, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 400, + "start": 399, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 398, + "name": "profileStartY", + "start": 385, + "type": "Identifier" + }, + "end": 401, + "start": 385, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 402, + "start": 366, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 405, + "start": 404, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 365, + "name": "lineTo", + "start": 359, + "type": "Identifier" + }, + "end": 406, + "start": 359, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 419, + "start": 418, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 417, + "name": "close", + "start": 412, + "type": "Identifier" + }, + "end": 420, + "start": 412, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 420, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 420, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 586, + "id": { + "end": 430, + "name": "sketch004", + "start": 421, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 452, + "raw": "'-XZ'", + "start": 447, + "type": "Literal", + "type": "Literal", + "value": "-XZ" + } + ], + "callee": { + "end": 446, + "name": "startSketchOn", + "start": 433, + "type": "Identifier" + }, + "end": 453, + "start": 433, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 476, + "raw": "0", + "start": 475, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 483, + "raw": "14.36", + "start": 478, + "type": "Literal", + "type": "Literal", + "value": 14.36 + } + ], + "end": 484, + "start": 474, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 487, + "start": 486, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 473, + "name": "startProfileAt", + "start": 459, + "type": "Identifier" + }, + "end": 488, + "start": 459, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 505, + "raw": "15.49", + "start": 500, + "type": "Literal", + "type": "Literal", + "value": 15.49 + }, + { + "end": 511, + "raw": "0.05", + "start": 507, + "type": "Literal", + "type": "Literal", + "value": 0.05 + } + ], + "end": 512, + "start": 499, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 515, + "start": 514, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 498, + "name": "line", + "start": 494, + "type": "Identifier" + }, + "end": 516, + "start": 494, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 540, + "raw": "0", + "start": 539, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 543, + "raw": "0", + "start": 542, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 544, + "start": 538, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 547, + "start": 546, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 537, + "name": "tangentialArcTo", + "start": 522, + "type": "Identifier" + }, + "end": 548, + "start": 522, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 575, + "raw": "6.8", + "start": 572, + "type": "Literal", + "type": "Literal", + "value": 6.8 + }, + "end": 575, + "operator": "-", + "start": 571, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 581, + "raw": "8.17", + "start": 577, + "type": "Literal", + "type": "Literal", + "value": 8.17 + } + ], + "end": 582, + "start": 570, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 585, + "start": 584, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 569, + "name": "tangentialArcTo", + "start": 554, + "type": "Identifier" + }, + "end": 586, + "start": 554, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 586, + "start": 433, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 421, + "type": "VariableDeclarator" + }, + "end": 586, + "kind": "const", + "start": 421, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 587, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/input.kcl b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/input.kcl new file mode 100644 index 0000000000..a49610ea19 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/input.kcl @@ -0,0 +1,18 @@ +sketch003 = startSketchOn('YZ') + |> startProfileAt([5.82, 0], %) + |> angledLine([180, 11.54], %, $rectangleSegmentA001) + |> angledLine([ + segAng(rectangleSegmentA001) - 90, + 8.21 + ], %, $rectangleSegmentB001) + |> angledLine([ + segAng(rectangleSegmentA001), + -segLen(rectangleSegmentA001) + ], %, $rectangleSegmentC001) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +sketch004 = startSketchOn('-XZ') + |> startProfileAt([0, 14.36], %) + |> line([15.49, 0.05], %) + |> tangentialArcTo([0, 0], %) + |> tangentialArcTo([-6.8, 8.17], %) diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ops.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ops.snap new file mode 100644 index 0000000000..67bba32bc6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/ops.snap @@ -0,0 +1,45 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed artifact_graph_example_code_no_3d.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 447, + 452, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 433, + 453, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/program_memory.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/program_memory.snap new file mode 100644 index 0000000000..afc0d9d76f --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/program_memory.snap @@ -0,0 +1,616 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing artifact_graph_example_code_no_3d.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "rectangleSegmentA001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71, + 121, + 0 + ] + }, + "from": [ + 5.82, + 0.0 + ], + "tag": { + "end": 120, + "start": 99, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + -5.719999999999999, + 0.0000000000000014132424062160455 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 99, + 120, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 227, + 0 + ] + }, + "from": [ + -5.719999999999999, + 0.0000000000000014132424062160455 + ], + "tag": { + "end": 226, + "start": 205, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + -5.719999999999998, + 8.210000000000003 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 205, + 226, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 233, + 353, + 0 + ] + }, + "from": [ + -5.719999999999998, + 8.210000000000003 + ], + "tag": { + "end": 352, + "start": 331, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 5.820000000000001, + 8.21 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 331, + 352, + 0 + ] + } + ] + }, + "sketch003": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71, + 121, + 0 + ] + }, + "from": [ + 5.82, + 0.0 + ], + "tag": { + "end": 120, + "start": 99, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + -5.72, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 227, + 0 + ] + }, + "from": [ + -5.72, + 0.0 + ], + "tag": { + "end": 226, + "start": 205, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + -5.72, + 8.21 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 233, + 353, + 0 + ] + }, + "from": [ + -5.72, + 8.21 + ], + "tag": { + "end": 352, + "start": 331, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 5.82, + 8.21 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 359, + 406, + 0 + ] + }, + "from": [ + 5.82, + 8.21 + ], + "tag": null, + "to": [ + 5.82, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 412, + 420, + 0 + ] + }, + "from": [ + 5.82, + 0.0 + ], + "tag": null, + "to": [ + 5.82, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "YZ", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 5.82, + 0.0 + ], + "to": [ + 5.82, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 65, + 0 + ] + } + }, + "tags": { + "rectangleSegmentA001": { + "type": "TagIdentifier", + "value": "rectangleSegmentA001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 71, + 121, + 0 + ] + }, + "from": [ + 5.82, + 0.0 + ], + "tag": { + "end": 120, + "start": 99, + "type": "TagDeclarator", + "value": "rectangleSegmentA001" + }, + "to": [ + -5.719999999999999, + 0.0000000000000014132424062160455 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 99, + 120, + 0 + ] + } + ] + }, + "rectangleSegmentB001": { + "type": "TagIdentifier", + "value": "rectangleSegmentB001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 127, + 227, + 0 + ] + }, + "from": [ + -5.719999999999999, + 0.0000000000000014132424062160455 + ], + "tag": { + "end": 226, + "start": 205, + "type": "TagDeclarator", + "value": "rectangleSegmentB001" + }, + "to": [ + -5.719999999999998, + 8.210000000000003 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 205, + 226, + 0 + ] + } + ] + }, + "rectangleSegmentC001": { + "type": "TagIdentifier", + "value": "rectangleSegmentC001", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 233, + 353, + 0 + ] + }, + "from": [ + -5.719999999999998, + 8.210000000000003 + ], + "tag": { + "end": 352, + "start": 331, + "type": "TagDeclarator", + "value": "rectangleSegmentC001" + }, + "to": [ + 5.820000000000001, + 8.21 + ], + "type": "ToPoint" + }, + "surface": null + }, + "__meta": [ + { + "sourceRange": [ + 331, + 352, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 65, + 0 + ] + } + ] + } + }, + "sketch004": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 494, + 516, + 0 + ] + }, + "from": [ + 0.0, + 14.36 + ], + "tag": null, + "to": [ + 15.49, + 14.41 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 522, + 548, + 0 + ] + }, + "ccw": false, + "center": [ + 15.54030518835946, + -1.1745473537604454 + ], + "from": [ + 15.49, + 14.41 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "TangentialArcTo" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 554, + 586, + 0 + ] + }, + "ccw": true, + "center": [ + -7.6163791614610235, + 0.5756513711217917 + ], + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + -6.8, + 8.17 + ], + "type": "TangentialArcTo" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 14.36 + ], + "to": [ + 0.0, + 14.36 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 459, + 488, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 459, + 488, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/rendered_model.png b/src/wasm-lib/kcl/tests/artifact_graph_example_code_no_3d/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..9f297439cd80f39ea305ee6398426db893f5a281 GIT binary patch literal 38312 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 a@#>r3cuO}mh0*`J@80?Ml->Qr3;zeq)aNJw literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_commands.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_commands.snap new file mode 100644 index 0000000000..0be1cddd55 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_commands.snap @@ -0,0 +1,508 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands artifact_graph_example_code_offset_planes.kcl +snapshot_kind: text +--- +[ + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.7, + "g": 0.28, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.7, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.28, + "b": 0.7, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "mm" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 17, + 38, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 20.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 17, + 38, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.6, + "g": 0.6, + "b": 0.6, + "a": 0.3 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 56, + 78, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 50.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 56, + 78, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.6, + "g": 0.6, + "b": 0.6, + "a": 0.3 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 96, + 117, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 10.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 96, + 117, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.6, + "g": 0.6, + "b": 0.6, + "a": 0.3 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 166, + 191, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 166, + 191, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 166, + 191, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 197, + 219, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 6.78, + "y": 15.01, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 166, + 191, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..68f148788f --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart artifact_graph_example_code_offset_planes.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..ada0c8c53d --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_flowchart.snap.md @@ -0,0 +1,12 @@ +```mermaid +flowchart LR + subgraph path4 [Path] + 4["Path
[166, 191, 0]"] + 5["Segment
[197, 219, 0]"] + end + 1["Plane
[17, 38, 0]"] + 2["Plane
[56, 78, 0]"] + 3["Plane
[96, 117, 0]"] + 1 --- 4 + 4 --- 5 +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..3f1ab06be0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map artifact_graph_example_code_offset_planes.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..53575f5d82 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/artifact_graph_mind_map.snap.md @@ -0,0 +1,9 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Plane + Plane +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ast.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ast.snap new file mode 100644 index 0000000000..0fbd332da4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ast.snap @@ -0,0 +1,314 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing artifact_graph_example_code_offset_planes.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 38, + "id": { + "end": 14, + "name": "offsetPlane001", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 33, + "raw": "\"XY\"", + "start": 29, + "type": "Literal", + "type": "Literal", + "value": "XY" + }, + { + "end": 37, + "raw": "20", + "start": 35, + "type": "Literal", + "type": "Literal", + "value": 20.0 + } + ], + "callee": { + "end": 28, + "name": "offsetPlane", + "start": 17, + "type": "Identifier" + }, + "end": 38, + "start": 17, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 38, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 78, + "id": { + "end": 53, + "name": "offsetPlane002", + "start": 39, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 72, + "raw": "\"XZ\"", + "start": 68, + "type": "Literal", + "type": "Literal", + "value": "XZ" + }, + { + "argument": { + "end": 77, + "raw": "50", + "start": 75, + "type": "Literal", + "type": "Literal", + "value": 50.0 + }, + "end": 77, + "operator": "-", + "start": 74, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "callee": { + "end": 67, + "name": "offsetPlane", + "start": 56, + "type": "Identifier" + }, + "end": 78, + "start": 56, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 39, + "type": "VariableDeclarator" + }, + "end": 78, + "kind": "const", + "start": 39, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 117, + "id": { + "end": 93, + "name": "offsetPlane003", + "start": 79, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 112, + "raw": "\"YZ\"", + "start": 108, + "type": "Literal", + "type": "Literal", + "value": "YZ" + }, + { + "end": 116, + "raw": "10", + "start": 114, + "type": "Literal", + "type": "Literal", + "value": 10.0 + } + ], + "callee": { + "end": 107, + "name": "offsetPlane", + "start": 96, + "type": "Identifier" + }, + "end": 117, + "start": 96, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 79, + "type": "VariableDeclarator" + }, + "end": 117, + "kind": "const", + "start": 79, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 219, + "id": { + "end": 128, + "name": "sketch002", + "start": 119, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 159, + "name": "offsetPlane001", + "start": 145, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 144, + "name": "startSketchOn", + "start": 131, + "type": "Identifier" + }, + "end": 160, + "start": 131, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 183, + "raw": "0", + "start": 182, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 186, + "raw": "0", + "start": 185, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 187, + "start": 181, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 190, + "start": 189, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 180, + "name": "startProfileAt", + "start": 166, + "type": "Identifier" + }, + "end": 191, + "start": 166, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 207, + "raw": "6.78", + "start": 203, + "type": "Literal", + "type": "Literal", + "value": 6.78 + }, + { + "end": 214, + "raw": "15.01", + "start": 209, + "type": "Literal", + "type": "Literal", + "value": 15.01 + } + ], + "end": 215, + "start": 202, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 218, + "start": 217, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 201, + "name": "line", + "start": 197, + "type": "Identifier" + }, + "end": 219, + "start": 197, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 219, + "start": 131, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 119, + "type": "VariableDeclarator" + }, + "end": 219, + "kind": "const", + "start": 119, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 220, + "nonCodeMeta": { + "nonCodeNodes": { + "2": [ + { + "end": 119, + "start": 117, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/input.kcl b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/input.kcl new file mode 100644 index 0000000000..cfba243f7d --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/input.kcl @@ -0,0 +1,7 @@ +offsetPlane001 = offsetPlane("XY", 20) +offsetPlane002 = offsetPlane("XZ", -50) +offsetPlane003 = offsetPlane("YZ", 10) + +sketch002 = startSketchOn(offsetPlane001) + |> startProfileAt([0, 0], %) + |> line([6.78, 15.01], %) diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ops.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ops.snap new file mode 100644 index 0000000000..643431895a --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/ops.snap @@ -0,0 +1,104 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed artifact_graph_example_code_offset_planes.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "offset": { + "sourceRange": [ + 35, + 37, + 0 + ] + }, + "std_plane": { + "sourceRange": [ + 29, + 33, + 0 + ] + } + }, + "name": "offsetPlane", + "sourceRange": [ + 17, + 38, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "offset": { + "sourceRange": [ + 74, + 77, + 0 + ] + }, + "std_plane": { + "sourceRange": [ + 68, + 72, + 0 + ] + } + }, + "name": "offsetPlane", + "sourceRange": [ + 56, + 78, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "offset": { + "sourceRange": [ + 114, + 116, + 0 + ] + }, + "std_plane": { + "sourceRange": [ + 108, + 112, + 0 + ] + } + }, + "name": "offsetPlane", + "sourceRange": [ + 96, + 117, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 145, + 159, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 131, + 160, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/program_memory.snap b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/program_memory.snap new file mode 100644 index 0000000000..bf31c7a7fc --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/program_memory.snap @@ -0,0 +1,197 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing artifact_graph_example_code_offset_planes.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "offsetPlane001": { + "type": "Plane", + "id": "[uuid]", + "value": "Custom", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 20.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": [] + }, + "offsetPlane002": { + "type": "Plane", + "id": "[uuid]", + "value": "Custom", + "origin": { + "x": 0.0, + "y": 50.0, + "z": 0.0 + }, + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "offsetPlane003": { + "type": "Plane", + "id": "[uuid]", + "value": "Custom", + "origin": { + "x": 10.0, + "y": 0.0, + "z": 0.0 + }, + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "__meta": [] + }, + "sketch002": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 197, + 219, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 6.78, + 15.01 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "Custom", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 20.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": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 166, + 191, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 166, + 191, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/rendered_model.png b/src/wasm-lib/kcl/tests/artifact_graph_example_code_offset_planes/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..d7a0bbe2df279fa46752ad8b3690286012b1ab1b GIT binary patch literal 36466 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 literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_commands.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_commands.snap new file mode 100644 index 0000000000..4d2c73cb9b --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_commands.snap @@ -0,0 +1,1409 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact commands artifact_graph_sketch_on_face_etc.kcl +snapshot_kind: text +--- +[ + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.7, + "g": 0.28, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.7, + "b": 0.28, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.28, + "g": 0.28, + "b": 0.7, + "a": 0.4 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 100.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "set_scene_units", + "unit": "mm" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 0, + 0, + 0 + ], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 12, + 31, + 0 + ], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 62, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 62, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 37, + 62, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 68, + 83, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 4.0, + "y": 8.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 89, + 113, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 5.0, + "y": -8.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 119, + 166, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 172, + 180, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 172, + 180, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 6.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 194, + 215, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 266, + 296, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 266, + 296, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 266, + 296, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -0.5, + "y": 0.5, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 302, + 317, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 2.0, + "y": 5.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 323, + 339, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 2.0, + "y": -5.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 345, + 392, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -0.5, + "y": 0.5, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 398, + 406, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 5.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 420, + 441, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 492, + 519, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 492, + 519, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 492, + 519, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 1.0, + "y": 1.5, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 525, + 550, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.5, + "y": 2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 556, + 572, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 1.0, + "y": -2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 578, + 625, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 1.0, + "y": 1.5, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 631, + 639, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 4.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 653, + 674, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 725, + 752, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 725, + 752, + 0 + ], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 725, + 752, + 0 + ], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -3.0, + "y": 14.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 758, + 775, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.5, + "y": 1.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 781, + 799, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.5, + "y": -2.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 805, + 852, + 0 + ], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -3.0, + "y": 14.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [ + 858, + 866, + 0 + ], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 3.0, + "faces": null + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_opposite_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [ + 880, + 901, + 0 + ], + "command": { + "type": "solid3d_get_next_adjacent_edge", + "object_id": "[uuid]", + "edge_id": "[uuid]", + "face_id": "[uuid]" + } + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..4c6c415a0c --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart artifact_graph_sketch_on_face_etc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..75698bfba4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_flowchart.snap.md @@ -0,0 +1,186 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[37, 62, 0]"] + 3["Segment
[68, 83, 0]"] + 4["Segment
[89, 113, 0]"] + 5["Segment
[119, 166, 0]"] + 6["Segment
[172, 180, 0]"] + 7[Solid2d] + end + subgraph path20 [Path] + 20["Path
[266, 296, 0]"] + 21["Segment
[302, 317, 0]"] + 22["Segment
[323, 339, 0]"] + 23["Segment
[345, 392, 0]"] + 24["Segment
[398, 406, 0]"] + 25[Solid2d] + end + subgraph path37 [Path] + 37["Path
[492, 519, 0]"] + 38["Segment
[525, 550, 0]"] + 39["Segment
[556, 572, 0]"] + 40["Segment
[578, 625, 0]"] + 41["Segment
[631, 639, 0]"] + 42[Solid2d] + end + subgraph path54 [Path] + 54["Path
[725, 752, 0]"] + 55["Segment
[758, 775, 0]"] + 56["Segment
[781, 799, 0]"] + 57["Segment
[805, 852, 0]"] + 58["Segment
[858, 866, 0]"] + 59[Solid2d] + end + 1["Plane
[12, 31, 0]"] + 8["Sweep Extrusion
[194, 215, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12["Cap Start"] + 13["Cap End"] + 14["SweepEdge Opposite"] + 15["SweepEdge Adjacent"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 26["Sweep Extrusion
[420, 441, 0]"] + 27[Wall] + 28[Wall] + 29[Wall] + 30["Plane
[492, 519, 0]"] + 31["SweepEdge Opposite"] + 32["SweepEdge Adjacent"] + 33["SweepEdge Opposite"] + 34["SweepEdge Adjacent"] + 35["SweepEdge Opposite"] + 36["SweepEdge Adjacent"] + 43["Sweep Extrusion
[653, 674, 0]"] + 44[Wall] + 45[Wall] + 46[Wall] + 47["Cap End"] + 48["SweepEdge Opposite"] + 49["SweepEdge Adjacent"] + 50["SweepEdge Opposite"] + 51["SweepEdge Adjacent"] + 52["SweepEdge Opposite"] + 53["SweepEdge Adjacent"] + 60["Sweep Extrusion
[880, 901, 0]"] + 61[Wall] + 62[Wall] + 63[Wall] + 64["Cap End"] + 65["SweepEdge Opposite"] + 66["SweepEdge Adjacent"] + 67["SweepEdge Opposite"] + 68["SweepEdge Adjacent"] + 69["SweepEdge Opposite"] + 70["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 11 + 3 --- 18 + 3 --- 19 + 4 --- 10 + 4 --- 16 + 4 --- 17 + 5 --- 9 + 5 --- 14 + 5 --- 15 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 10 --- 20 + 20 --- 21 + 20 --- 22 + 20 --- 23 + 20 --- 24 + 20 ---- 26 + 20 --- 25 + 21 --- 29 + 21 --- 35 + 21 --- 36 + 22 --- 28 + 22 --- 33 + 22 --- 34 + 23 --- 27 + 23 --- 31 + 23 --- 32 + 26 --- 27 + 26 --- 28 + 26 --- 29 + 26 x--> 30 + 26 --- 31 + 26 --- 32 + 26 --- 33 + 26 --- 34 + 26 --- 35 + 26 --- 36 + 30 --- 37 + 37 --- 38 + 37 --- 39 + 37 --- 40 + 37 --- 41 + 37 ---- 43 + 37 --- 42 + 38 --- 46 + 38 --- 52 + 38 --- 53 + 39 --- 45 + 39 --- 50 + 39 --- 51 + 40 --- 44 + 40 --- 48 + 40 --- 49 + 43 --- 44 + 43 --- 45 + 43 --- 46 + 43 --- 47 + 43 --- 48 + 43 --- 49 + 43 --- 50 + 43 --- 51 + 43 --- 52 + 43 --- 53 + 46 --- 54 + 54 --- 55 + 54 --- 56 + 54 --- 57 + 54 --- 58 + 54 ---- 60 + 54 --- 59 + 55 --- 63 + 55 --- 69 + 55 --- 70 + 56 --- 62 + 56 --- 67 + 56 --- 68 + 57 --- 61 + 57 --- 65 + 57 --- 66 + 60 --- 61 + 60 --- 62 + 60 --- 63 + 60 --- 64 + 60 --- 65 + 60 --- 66 + 60 --- 67 + 60 --- 68 + 60 --- 69 + 60 --- 70 +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..379b2bc00c --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map artifact_graph_sketch_on_face_etc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..a3e852bf94 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/artifact_graph_mind_map.snap.md @@ -0,0 +1,319 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Plane + Path + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Plane + Path + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ast.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ast.snap new file mode 100644 index 0000000000..35b12808b1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ast.snap @@ -0,0 +1,1348 @@ +--- +source: kcl/src/simulation_tests.rs +description: Result of parsing artifact_graph_sketch_on_face_etc.kcl +snapshot_kind: text +--- +{ + "Ok": { + "body": [ + { + "declaration": { + "end": 180, + "id": { + "end": 9, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 30, + "raw": "'XZ'", + "start": 26, + "type": "Literal", + "type": "Literal", + "value": "XZ" + } + ], + "callee": { + "end": 25, + "name": "startSketchOn", + "start": 12, + "type": "Identifier" + }, + "end": 31, + "start": 12, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 54, + "raw": "0", + "start": 53, + "type": "Literal", + "type": "Literal", + "value": 0.0 + }, + { + "end": 57, + "raw": "0", + "start": 56, + "type": "Literal", + "type": "Literal", + "value": 0.0 + } + ], + "end": 58, + "start": 52, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 61, + "start": 60, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 51, + "name": "startProfileAt", + "start": 37, + "type": "Identifier" + }, + "end": 62, + "start": 37, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 75, + "raw": "4", + "start": 74, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 78, + "raw": "8", + "start": 77, + "type": "Literal", + "type": "Literal", + "value": 8.0 + } + ], + "end": 79, + "start": 73, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 82, + "start": 81, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 72, + "name": "line", + "start": 68, + "type": "Identifier" + }, + "end": 83, + "start": 68, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 96, + "raw": "5", + "start": 95, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "argument": { + "end": 100, + "raw": "8", + "start": 99, + "type": "Literal", + "type": "Literal", + "value": 8.0 + }, + "end": 100, + "operator": "-", + "start": 98, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 101, + "start": 94, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 104, + "start": 103, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + ], + "callee": { + "end": 93, + "name": "line", + "start": 89, + "type": "Identifier" + }, + "end": 113, + "start": 89, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 142, + "start": 141, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 140, + "name": "profileStartX", + "start": 127, + "type": "Identifier" + }, + "end": 143, + "start": 127, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 160, + "start": 159, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 158, + "name": "profileStartY", + "start": 145, + "type": "Identifier" + }, + "end": 161, + "start": 145, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 162, + "start": 126, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 165, + "start": 164, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 125, + "name": "lineTo", + "start": 119, + "type": "Identifier" + }, + "end": 166, + "start": 119, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 179, + "start": 178, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 177, + "name": "close", + "start": 172, + "type": "Identifier" + }, + "end": 180, + "start": 172, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 180, + "start": 12, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 180, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 215, + "id": { + "end": 191, + "name": "extrude001", + "start": 181, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 203, + "raw": "6", + "start": 202, + "type": "Literal", + "type": "Literal", + "value": 6.0 + }, + { + "end": 214, + "name": "sketch001", + "start": 205, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 201, + "name": "extrude", + "start": 194, + "type": "Identifier" + }, + "end": 215, + "start": 194, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 181, + "type": "VariableDeclarator" + }, + "end": 215, + "kind": "const", + "start": 181, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 406, + "id": { + "end": 225, + "name": "sketch002", + "start": 216, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 252, + "name": "extrude001", + "start": 242, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 259, + "name": "seg01", + "start": 254, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 241, + "name": "startSketchOn", + "start": 228, + "type": "Identifier" + }, + "end": 260, + "start": 228, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 286, + "raw": "0.5", + "start": 283, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + "end": 286, + "operator": "-", + "start": 282, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 291, + "raw": "0.5", + "start": 288, + "type": "Literal", + "type": "Literal", + "value": 0.5 + } + ], + "end": 292, + "start": 281, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 295, + "start": 294, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 280, + "name": "startProfileAt", + "start": 266, + "type": "Identifier" + }, + "end": 296, + "start": 266, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 309, + "raw": "2", + "start": 308, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "end": 312, + "raw": "5", + "start": 311, + "type": "Literal", + "type": "Literal", + "value": 5.0 + } + ], + "end": 313, + "start": 307, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 316, + "start": 315, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 306, + "name": "line", + "start": 302, + "type": "Identifier" + }, + "end": 317, + "start": 302, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 330, + "raw": "2", + "start": 329, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + { + "argument": { + "end": 334, + "raw": "5", + "start": 333, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + "end": 334, + "operator": "-", + "start": 332, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 335, + "start": 328, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 338, + "start": 337, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 327, + "name": "line", + "start": 323, + "type": "Identifier" + }, + "end": 339, + "start": 323, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 368, + "start": 367, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 366, + "name": "profileStartX", + "start": 353, + "type": "Identifier" + }, + "end": 369, + "start": 353, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 386, + "start": 385, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 384, + "name": "profileStartY", + "start": 371, + "type": "Identifier" + }, + "end": 387, + "start": 371, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 388, + "start": 352, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 391, + "start": 390, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 351, + "name": "lineTo", + "start": 345, + "type": "Identifier" + }, + "end": 392, + "start": 345, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 405, + "start": 404, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 403, + "name": "close", + "start": 398, + "type": "Identifier" + }, + "end": 406, + "start": 398, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 406, + "start": 228, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 216, + "type": "VariableDeclarator" + }, + "end": 406, + "kind": "const", + "start": 216, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 441, + "id": { + "end": 417, + "name": "extrude002", + "start": 407, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 429, + "raw": "5", + "start": 428, + "type": "Literal", + "type": "Literal", + "value": 5.0 + }, + { + "end": 440, + "name": "sketch002", + "start": 431, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 427, + "name": "extrude", + "start": 420, + "type": "Identifier" + }, + "end": 441, + "start": 420, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 407, + "type": "VariableDeclarator" + }, + "end": 441, + "kind": "const", + "start": 407, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 639, + "id": { + "end": 451, + "name": "sketch003", + "start": 442, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 478, + "name": "extrude002", + "start": 468, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 485, + "raw": "'END'", + "start": 480, + "type": "Literal", + "type": "Literal", + "value": "END" + } + ], + "callee": { + "end": 467, + "name": "startSketchOn", + "start": 454, + "type": "Identifier" + }, + "end": 486, + "start": 454, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 509, + "raw": "1", + "start": 508, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "end": 514, + "raw": "1.5", + "start": 511, + "type": "Literal", + "type": "Literal", + "value": 1.5 + } + ], + "end": 515, + "start": 507, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 518, + "start": 517, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 506, + "name": "startProfileAt", + "start": 492, + "type": "Identifier" + }, + "end": 519, + "start": 492, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 534, + "raw": "0.5", + "start": 531, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + { + "end": 537, + "raw": "2", + "start": 536, + "type": "Literal", + "type": "Literal", + "value": 2.0 + } + ], + "end": 538, + "start": 530, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 541, + "start": 540, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + }, + { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + ], + "callee": { + "end": 529, + "name": "line", + "start": 525, + "type": "Identifier" + }, + "end": 550, + "start": 525, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 563, + "raw": "1", + "start": 562, + "type": "Literal", + "type": "Literal", + "value": 1.0 + }, + { + "argument": { + "end": 567, + "raw": "2", + "start": 566, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "end": 567, + "operator": "-", + "start": 565, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 568, + "start": 561, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 571, + "start": 570, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 560, + "name": "line", + "start": 556, + "type": "Identifier" + }, + "end": 572, + "start": 556, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 601, + "start": 600, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 599, + "name": "profileStartX", + "start": 586, + "type": "Identifier" + }, + "end": 602, + "start": 586, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 619, + "start": 618, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 617, + "name": "profileStartY", + "start": 604, + "type": "Identifier" + }, + "end": 620, + "start": 604, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 621, + "start": 585, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 624, + "start": 623, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 584, + "name": "lineTo", + "start": 578, + "type": "Identifier" + }, + "end": 625, + "start": 578, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 638, + "start": 637, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 636, + "name": "close", + "start": 631, + "type": "Identifier" + }, + "end": 639, + "start": 631, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 639, + "start": 454, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 442, + "type": "VariableDeclarator" + }, + "end": 639, + "kind": "const", + "start": 442, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 674, + "id": { + "end": 650, + "name": "extrude003", + "start": 640, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 662, + "raw": "4", + "start": 661, + "type": "Literal", + "type": "Literal", + "value": 4.0 + }, + { + "end": 673, + "name": "sketch003", + "start": 664, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 660, + "name": "extrude", + "start": 653, + "type": "Identifier" + }, + "end": 674, + "start": 653, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 640, + "type": "VariableDeclarator" + }, + "end": 674, + "kind": "const", + "start": 640, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 866, + "id": { + "end": 684, + "name": "sketch004", + "start": 675, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "end": 711, + "name": "extrude003", + "start": 701, + "type": "Identifier", + "type": "Identifier" + }, + { + "end": 718, + "name": "seg02", + "start": 713, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 700, + "name": "startSketchOn", + "start": 687, + "type": "Identifier" + }, + "end": 719, + "start": 687, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "argument": { + "end": 743, + "raw": "3", + "start": 742, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + "end": 743, + "operator": "-", + "start": 741, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "end": 747, + "raw": "14", + "start": 745, + "type": "Literal", + "type": "Literal", + "value": 14.0 + } + ], + "end": 748, + "start": 740, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 751, + "start": 750, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 739, + "name": "startProfileAt", + "start": 725, + "type": "Identifier" + }, + "end": 752, + "start": 725, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 767, + "raw": "0.5", + "start": 764, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + { + "end": 770, + "raw": "1", + "start": 769, + "type": "Literal", + "type": "Literal", + "value": 1.0 + } + ], + "end": 771, + "start": 763, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 774, + "start": 773, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 762, + "name": "line", + "start": 758, + "type": "Identifier" + }, + "end": 775, + "start": 758, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "end": 790, + "raw": "0.5", + "start": 787, + "type": "Literal", + "type": "Literal", + "value": 0.5 + }, + { + "argument": { + "end": 794, + "raw": "2", + "start": 793, + "type": "Literal", + "type": "Literal", + "value": 2.0 + }, + "end": 794, + "operator": "-", + "start": 792, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 795, + "start": 786, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 798, + "start": 797, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 785, + "name": "line", + "start": 781, + "type": "Identifier" + }, + "end": 799, + "start": 781, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "elements": [ + { + "arguments": [ + { + "end": 828, + "start": 827, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 826, + "name": "profileStartX", + "start": 813, + "type": "Identifier" + }, + "end": 829, + "start": 813, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 846, + "start": 845, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 844, + "name": "profileStartY", + "start": 831, + "type": "Identifier" + }, + "end": 847, + "start": 831, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 848, + "start": 812, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "end": 851, + "start": 850, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 811, + "name": "lineTo", + "start": 805, + "type": "Identifier" + }, + "end": 852, + "start": 805, + "type": "CallExpression", + "type": "CallExpression" + }, + { + "arguments": [ + { + "end": 865, + "start": 864, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + ], + "callee": { + "end": 863, + "name": "close", + "start": 858, + "type": "Identifier" + }, + "end": 866, + "start": 858, + "type": "CallExpression", + "type": "CallExpression" + } + ], + "end": 866, + "start": 687, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 675, + "type": "VariableDeclarator" + }, + "end": 866, + "kind": "const", + "start": 675, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "declaration": { + "end": 901, + "id": { + "end": 877, + "name": "extrude004", + "start": 867, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "end": 889, + "raw": "3", + "start": 888, + "type": "Literal", + "type": "Literal", + "value": 3.0 + }, + { + "end": 900, + "name": "sketch004", + "start": 891, + "type": "Identifier", + "type": "Identifier" + } + ], + "callee": { + "end": 887, + "name": "extrude", + "start": 880, + "type": "Identifier" + }, + "end": 901, + "start": 880, + "type": "CallExpression", + "type": "CallExpression" + }, + "start": 867, + "type": "VariableDeclarator" + }, + "end": 901, + "kind": "const", + "start": 867, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "end": 902, + "start": 0 + } +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/input.kcl b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/input.kcl new file mode 100644 index 0000000000..22b3786a99 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/input.kcl @@ -0,0 +1,28 @@ +sketch001 = startSketchOn('XZ') + |> startProfileAt([0, 0], %) + |> line([4, 8], %) + |> line([5, -8], %, $seg01) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude001 = extrude(6, sketch001) +sketch002 = startSketchOn(extrude001, seg01) + |> startProfileAt([-0.5, 0.5], %) + |> line([2, 5], %) + |> line([2, -5], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude002 = extrude(5, sketch002) +sketch003 = startSketchOn(extrude002, 'END') + |> startProfileAt([1, 1.5], %) + |> line([0.5, 2], %, $seg02) + |> line([1, -2], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude003 = extrude(4, sketch003) +sketch004 = startSketchOn(extrude003, seg02) + |> startProfileAt([-3, 14], %) + |> line([0.5, 1], %) + |> line([0.5, -2], %) + |> lineTo([profileStartX(%), profileStartY(%)], %) + |> close(%) +extrude004 = extrude(3, sketch004) diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ops.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ops.snap new file mode 100644 index 0000000000..75a47816e4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/ops.snap @@ -0,0 +1,208 @@ +--- +source: kcl/src/simulation_tests.rs +description: Operations executed artifact_graph_sketch_on_face_etc.kcl +snapshot_kind: text +--- +[ + { + "labeledArgs": { + "data": { + "sourceRange": [ + 26, + 30, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 12, + 31, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 202, + 203, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 205, + 214, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 194, + 215, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 242, + 252, + 0 + ] + }, + "tag": { + "sourceRange": [ + 254, + 259, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 228, + 260, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 428, + 429, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 431, + 440, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 420, + 441, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 468, + 478, + 0 + ] + }, + "tag": { + "sourceRange": [ + 480, + 485, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 454, + 486, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 661, + 662, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 664, + 673, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 653, + 674, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "data": { + "sourceRange": [ + 701, + 711, + 0 + ] + }, + "tag": { + "sourceRange": [ + 713, + 718, + 0 + ] + } + }, + "name": "startSketchOn", + "sourceRange": [ + 687, + 719, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + }, + { + "labeledArgs": { + "length": { + "sourceRange": [ + 888, + 889, + 0 + ] + }, + "sketch_set": { + "sourceRange": [ + 891, + 900, + 0 + ] + } + }, + "name": "extrude", + "sourceRange": [ + 880, + 901, + 0 + ], + "type": "StdLibCall", + "unlabeledArg": null + } +] diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/program_memory.snap b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/program_memory.snap new file mode 100644 index 0000000000..2483e439c1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/program_memory.snap @@ -0,0 +1,4666 @@ +--- +source: kcl/src/simulation_tests.rs +description: Program memory after executing artifact_graph_sketch_on_face_etc.kcl +snapshot_kind: text +--- +{ + "environments": [ + { + "bindings": { + "HALF_TURN": { + "type": "Number", + "value": 180.0, + "__meta": [] + }, + "QUARTER_TURN": { + "type": "Number", + "value": 90.0, + "__meta": [] + }, + "THREE_QUARTER_TURN": { + "type": "Number", + "value": 270.0, + "__meta": [] + }, + "ZERO": { + "type": "Number", + "value": 0.0, + "__meta": [] + }, + "extrude001": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "extrude002": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "extrude003": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ] + }, + "from": [ + 1.5, + 3.5 + ], + "tag": null, + "to": [ + 2.5, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ] + }, + "from": [ + 2.5, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 631, + 639, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 454, + 486, + 0 + ] + } + ] + }, + "start": { + "from": [ + 1.0, + 1.5 + ], + "to": [ + 1.0, + 1.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 492, + 519, + 0 + ] + } + }, + "tags": { + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 543, + 549, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "height": 4.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "extrude004": { + "type": "Solid", + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 758, + 775, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 781, + 799, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 805, + 852, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 758, + 775, + 0 + ] + }, + "from": [ + -3.0, + 14.0 + ], + "tag": null, + "to": [ + -2.5, + 15.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 781, + 799, + 0 + ] + }, + "from": [ + -2.5, + 15.0 + ], + "tag": null, + "to": [ + -2.0, + 13.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 805, + 852, + 0 + ] + }, + "from": [ + -2.0, + 13.0 + ], + "tag": null, + "to": [ + -3.0, + 14.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 858, + 866, + 0 + ] + }, + "from": [ + -3.0, + 14.0 + ], + "tag": null, + "to": [ + -3.0, + 14.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg02", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ] + }, + "from": [ + 1.5, + 3.5 + ], + "tag": null, + "to": [ + 2.5, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ] + }, + "from": [ + 2.5, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 631, + 639, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 454, + 486, + 0 + ] + } + ] + }, + "start": { + "from": [ + 1.0, + 1.5 + ], + "to": [ + 1.0, + 1.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 492, + 519, + 0 + ] + } + }, + "tags": { + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 543, + 549, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "height": 4.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 687, + 719, + 0 + ] + } + ] + }, + "start": { + "from": [ + -3.0, + 14.0 + ], + "to": [ + -3.0, + 14.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 725, + 752, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 725, + 752, + 0 + ] + } + ] + }, + "height": 3.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 725, + 752, + 0 + ] + } + ] + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 543, + 549, + 0 + ] + } + ] + }, + "sketch001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + } + }, + "sketch002": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + } + }, + "sketch003": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ] + }, + "from": [ + 1.5, + 3.5 + ], + "tag": null, + "to": [ + 2.5, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ] + }, + "from": [ + 2.5, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 631, + 639, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 454, + 486, + 0 + ] + } + ] + }, + "start": { + "from": [ + 1.0, + 1.5 + ], + "to": [ + 1.0, + 1.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 492, + 519, + 0 + ] + } + }, + "tags": { + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 543, + 549, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + } + }, + "sketch004": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 758, + 775, + 0 + ] + }, + "from": [ + -3.0, + 14.0 + ], + "tag": null, + "to": [ + -2.5, + 15.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 781, + 799, + 0 + ] + }, + "from": [ + -2.5, + 15.0 + ], + "tag": null, + "to": [ + -2.0, + 13.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 805, + 852, + 0 + ] + }, + "from": [ + -2.0, + 13.0 + ], + "tag": null, + "to": [ + -3.0, + 14.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 858, + 866, + 0 + ] + }, + "from": [ + -3.0, + 14.0 + ], + "tag": null, + "to": [ + -3.0, + 14.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg02", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 556, + 572, + 0 + ] + }, + "from": [ + 1.5, + 3.5 + ], + "tag": null, + "to": [ + 2.5, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 578, + 625, + 0 + ] + }, + "from": [ + 2.5, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 631, + 639, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": null, + "to": [ + 1.0, + 1.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "end", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 302, + 317, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + 1.5, + 5.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 323, + 339, + 0 + ] + }, + "from": [ + 1.5, + 5.5 + ], + "tag": null, + "to": [ + 3.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 345, + 392, + 0 + ] + }, + "from": [ + 3.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 398, + 406, + 0 + ] + }, + "from": [ + -0.5, + 0.5 + ], + "tag": null, + "to": [ + -0.5, + 0.5 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "face", + "id": "[uuid]", + "value": "seg01", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "solid": { + "type": "Solid", + "id": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 68, + 83, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 4.0, + 8.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 119, + 166, + 0 + ] + }, + "from": [ + 9.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 172, + 180, + 0 + ] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint" + } + ], + "on": { + "type": "plane", + "id": "[uuid]", + "value": "XZ", + "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": 0.0, + "z": 1.0 + }, + "zAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "__meta": [] + }, + "start": { + "from": [ + 0.0, + 0.0 + ], + "to": [ + 0.0, + 0.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 37, + 62, + 0 + ] + } + }, + "tags": { + "seg01": { + "type": "TagIdentifier", + "value": "seg01", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ] + }, + "from": [ + 4.0, + 8.0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 9.0, + 0.0 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 89, + 113, + 0 + ], + "tag": { + "end": 112, + "start": 106, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 106, + 112, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "height": 6.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 37, + 62, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 228, + 260, + 0 + ] + } + ] + }, + "start": { + "from": [ + -0.5, + 0.5 + ], + "to": [ + -0.5, + 0.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 266, + 296, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "height": 5.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 266, + 296, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 454, + 486, + 0 + ] + } + ] + }, + "start": { + "from": [ + 1.0, + 1.5 + ], + "to": [ + 1.0, + 1.5 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 492, + 519, + 0 + ] + } + }, + "tags": { + "seg02": { + "type": "TagIdentifier", + "value": "seg02", + "info": { + "type": "TagEngineInfo", + "id": "[uuid]", + "sketch": "[uuid]", + "path": { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ] + }, + "from": [ + 1.0, + 1.5 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 1.5, + 3.5 + ], + "type": "ToPoint" + }, + "surface": { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [ + 525, + 550, + 0 + ], + "tag": { + "end": 549, + "start": 543, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + } + }, + "__meta": [ + { + "sourceRange": [ + 543, + 549, + 0 + ] + } + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "height": 4.0, + "startCapId": null, + "endCapId": "[uuid]", + "__meta": [ + { + "sourceRange": [ + 492, + 519, + 0 + ] + } + ] + }, + "__meta": [ + { + "sourceRange": [ + 687, + 719, + 0 + ] + } + ] + }, + "start": { + "from": [ + -3.0, + 14.0 + ], + "to": [ + -3.0, + 14.0 + ], + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [ + 725, + 752, + 0 + ] + } + }, + "__meta": [ + { + "sourceRange": [ + 725, + 752, + 0 + ] + } + ] + } + } + }, + "parent": null + } + ], + "currentEnv": 0, + "return": null +} diff --git a/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/rendered_model.png b/src/wasm-lib/kcl/tests/artifact_graph_sketch_on_face_etc/rendered_model.png new file mode 100644 index 0000000000000000000000000000000000000000..9a1e355a08293826c3193aac3ddbc1d44f39f216 GIT binary patch literal 73616 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 St3CW@)X0Z_zUF7+X8j*^Pv#B) literal 0 HcmV?d00001 diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..05d58854e4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart basic_fillet_cube_close_opposite.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..0cc3ef2f9b --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_flowchart.snap.md @@ -0,0 +1,64 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 90, 0]"] + 4["Segment
[96, 112, 0]"] + 5["Segment
[118, 144, 0]"] + 6["Segment
[150, 167, 0]"] + 7[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[173, 187, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["EdgeCut Fillet
[193, 279, 0]"] + 24["EdgeCut Fillet
[193, 279, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 6 --- 23 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 15 <--x 24 +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..dc9ab1ad7c --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map basic_fillet_cube_close_opposite.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..1b1a7fa7bc --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_close_opposite/artifact_graph_mind_map.snap.md @@ -0,0 +1,39 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..a86bc04834 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart basic_fillet_cube_end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..3dcfbdcfe3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_flowchart.snap.md @@ -0,0 +1,64 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 90, 0]"] + 4["Segment
[96, 112, 0]"] + 5["Segment
[118, 144, 0]"] + 6["Segment
[150, 158, 0]"] + 7[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[164, 178, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["EdgeCut Fillet
[184, 268, 0]"] + 24["EdgeCut Fillet
[184, 268, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 3 --- 23 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 21 <--x 24 +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..e05a68bc3c --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map basic_fillet_cube_end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..dbf07fb73e --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_end/artifact_graph_mind_map.snap.md @@ -0,0 +1,39 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..14be358f40 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart basic_fillet_cube_next_adjacent.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..d188642030 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 90, 0]"] + 4["Segment
[96, 121, 0]"] + 5["Segment
[127, 153, 0]"] + 6["Segment
[159, 176, 0]"] + 7[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[182, 196, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..6d7782170a --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map basic_fillet_cube_next_adjacent.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_next_adjacent/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..458c53c2c2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart basic_fillet_cube_previous_adjacent.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..d188642030 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 90, 0]"] + 4["Segment
[96, 121, 0]"] + 5["Segment
[127, 153, 0]"] + 6["Segment
[159, 176, 0]"] + 7[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[182, 196, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..9332d0c55a --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map basic_fillet_cube_previous_adjacent.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_previous_adjacent/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..5021d4da39 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart basic_fillet_cube_start.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..d475108426 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_flowchart.snap.md @@ -0,0 +1,64 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 90, 0]"] + 4["Segment
[96, 112, 0]"] + 5["Segment
[118, 144, 0]"] + 6["Segment
[150, 158, 0]"] + 7[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[164, 178, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["EdgeCut Fillet
[184, 233, 0]"] + 24["EdgeCut Fillet
[184, 233, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 3 --- 23 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 5 --- 24 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..83a2fbc342 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map basic_fillet_cube_start.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..4eab2a4916 --- /dev/null +++ b/src/wasm-lib/kcl/tests/basic_fillet_cube_start/artifact_graph_mind_map.snap.md @@ -0,0 +1,40 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..e99ed3ebb6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart big_number_angle_to_match_length_x.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..6653f83801 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_flowchart.snap.md @@ -0,0 +1,49 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 92, 0]"] + 4["Segment
[98, 154, 0]"] + 5["Segment
[160, 168, 0]"] + 6[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 7["Sweep Extrusion
[174, 188, 0]"] + 8[Wall] + 9[Wall] + 10[Wall] + 11["Cap Start"] + 12["Cap End"] + 13["SweepEdge Opposite"] + 14["SweepEdge Adjacent"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 7 + 2 --- 6 + 3 --- 10 + 3 --- 17 + 3 --- 18 + 4 --- 9 + 4 --- 15 + 4 --- 16 + 5 --- 8 + 5 --- 13 + 5 --- 14 + 7 --- 8 + 7 --- 9 + 7 --- 10 + 7 --- 11 + 7 --- 12 + 7 --- 13 + 7 --- 14 + 7 --- 15 + 7 --- 16 + 7 --- 17 + 7 --- 18 +``` diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..2acdd64880 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map big_number_angle_to_match_length_x.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..56c4e2fa5f --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_x/artifact_graph_mind_map.snap.md @@ -0,0 +1,31 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..c268fe9859 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart big_number_angle_to_match_length_y.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..6653f83801 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_flowchart.snap.md @@ -0,0 +1,49 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 92, 0]"] + 4["Segment
[98, 154, 0]"] + 5["Segment
[160, 168, 0]"] + 6[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 7["Sweep Extrusion
[174, 188, 0]"] + 8[Wall] + 9[Wall] + 10[Wall] + 11["Cap Start"] + 12["Cap End"] + 13["SweepEdge Opposite"] + 14["SweepEdge Adjacent"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 7 + 2 --- 6 + 3 --- 10 + 3 --- 17 + 3 --- 18 + 4 --- 9 + 4 --- 15 + 4 --- 16 + 5 --- 8 + 5 --- 13 + 5 --- 14 + 7 --- 8 + 7 --- 9 + 7 --- 10 + 7 --- 11 + 7 --- 12 + 7 --- 13 + 7 --- 14 + 7 --- 15 + 7 --- 16 + 7 --- 17 + 7 --- 18 +``` diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..8e869f3b56 --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map big_number_angle_to_match_length_y.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..56c4e2fa5f --- /dev/null +++ b/src/wasm-lib/kcl/tests/big_number_angle_to_match_length_y/artifact_graph_mind_map.snap.md @@ -0,0 +1,31 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..4d2639ee10 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart boolean_logical_and.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..f45f74d980 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map boolean_logical_and.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_and/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..11e89a7bfe --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart boolean_logical_multiple.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..b2b043b0f3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map boolean_logical_multiple.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_multiple/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..ad00136491 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart boolean_logical_or.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..3bf2819282 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map boolean_logical_or.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/boolean_logical_or/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..217a0c9840 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart circle_three_point.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..03b4909171 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_flowchart.snap.md @@ -0,0 +1,27 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[37, 98, 0]"] + 3["Segment
[37, 98, 0]"] + 4[Solid2d] + end + 1["Plane
[12, 31, 0]"] + 5["Sweep Extrusion
[109, 131, 0]"] + 6[Wall] + 7["Cap Start"] + 8["Cap End"] + 9["SweepEdge Opposite"] + 10["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 ---- 5 + 2 --- 4 + 3 --- 6 + 3 --- 9 + 3 --- 10 + 5 --- 6 + 5 --- 7 + 5 --- 8 + 5 --- 9 + 5 --- 10 +``` diff --git a/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..b7d920815a --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map circle_three_point.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..da05194e28 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circle_three_point/artifact_graph_mind_map.snap.md @@ -0,0 +1,17 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..f94e99223d --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart circular_pattern3d_a_pattern.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..29846ac896 --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[41, 66, 0]"] + 3["Segment
[72, 87, 0]"] + 4["Segment
[93, 108, 0]"] + 5["Segment
[114, 130, 0]"] + 6["Segment
[136, 144, 0]"] + 7[Solid2d] + end + 1["Plane
[16, 35, 0]"] + 8["Sweep Extrusion
[150, 163, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..5870f58c8c --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map circular_pattern3d_a_pattern.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/circular_pattern3d_a_pattern/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..fae016eb21 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart comparisons.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..d196f07014 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map comparisons.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/comparisons/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..257da967bf --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart computed_var.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..ad46c9da20 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map computed_var.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/computed_var/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..3482daf740 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart cube.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..3d647b16c6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/artifact_graph_flowchart.snap.md @@ -0,0 +1,62 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[177, 194, 0]"] + 3["Segment
[202, 215, 0]"] + 4["Segment
[223, 236, 0]"] + 5["Segment
[244, 257, 0]"] + 6["Segment
[265, 278, 0]"] + 7["Segment
[286, 294, 0]"] + 8[Solid2d] + end + 1["Plane
[177, 194, 0]"] + 9["Sweep Extrusion
[302, 320, 0]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 13 + 3 --- 22 + 3 --- 23 + 4 --- 12 + 4 --- 20 + 4 --- 21 + 5 --- 11 + 5 --- 18 + 5 --- 19 + 6 --- 10 + 6 --- 16 + 6 --- 17 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 +``` diff --git a/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..173ad1945f --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map cube.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..1e37cb6fdd --- /dev/null +++ b/src/wasm-lib/kcl/tests/cube/artifact_graph_mind_map.snap.md @@ -0,0 +1,39 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..f414d88b46 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart double_map_fn.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..88c4d4c542 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map double_map_fn.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/double_map_fn/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..853fc0784a --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart fillet-and-shell.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..bd46f030ac --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_flowchart.snap.md @@ -0,0 +1,227 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[373, 461, 0]"] + 3["Segment
[467, 549, 0]"] + 4["Segment
[555, 637, 0]"] + 5["Segment
[643, 727, 0]"] + 6["Segment
[733, 741, 0]"] + 7[Solid2d] + end + subgraph path9 [Path] + 9["Path
[775, 800, 0]"] + 10["Segment
[806, 839, 0]"] + 11["Segment
[845, 887, 0]"] + 12["Segment
[893, 927, 0]"] + 13["Segment
[933, 949, 0]"] + 14[Solid2d] + end + subgraph path31 [Path] + 31["Path
[1260, 1285, 0]"] + end + subgraph path32 [Path] + 32["Path
[1293, 1337, 0]"] + 33["Segment
[1293, 1337, 0]"] + 34[Solid2d] + end + subgraph path35 [Path] + 35["Path
[1350, 1395, 0]"] + 36["Segment
[1350, 1395, 0]"] + 37[Solid2d] + end + subgraph path45 [Path] + 45["Path
[1260, 1285, 0]"] + end + subgraph path46 [Path] + 46["Path
[1293, 1337, 0]"] + 47["Segment
[1293, 1337, 0]"] + 48[Solid2d] + end + subgraph path49 [Path] + 49["Path
[1350, 1395, 0]"] + 50["Segment
[1350, 1395, 0]"] + 51[Solid2d] + end + subgraph path59 [Path] + 59["Path
[1260, 1285, 0]"] + end + subgraph path60 [Path] + 60["Path
[1293, 1337, 0]"] + 61["Segment
[1293, 1337, 0]"] + 62[Solid2d] + end + subgraph path63 [Path] + 63["Path
[1350, 1395, 0]"] + 64["Segment
[1350, 1395, 0]"] + 65[Solid2d] + end + subgraph path73 [Path] + 73["Path
[1260, 1285, 0]"] + end + subgraph path74 [Path] + 74["Path
[1293, 1337, 0]"] + 75["Segment
[1293, 1337, 0]"] + 76[Solid2d] + end + subgraph path77 [Path] + 77["Path
[1350, 1395, 0]"] + 78["Segment
[1350, 1395, 0]"] + 79[Solid2d] + end + 1["Plane
[373, 461, 0]"] + 8["Plane
[750, 769, 0]"] + 15["Sweep Extrusion
[955, 977, 0]"] + 16[Wall] + 17[Wall] + 18[Wall] + 19[Wall] + 20["Cap Start"] + 21["Cap End"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 24["SweepEdge Opposite"] + 25["SweepEdge Adjacent"] + 26["SweepEdge Opposite"] + 27["SweepEdge Adjacent"] + 28["SweepEdge Opposite"] + 29["SweepEdge Adjacent"] + 30["Plane
[1233, 1252, 0]"] + 38["Sweep Extrusion
[1407, 1425, 0]"] + 39[Wall] + 40["Cap Start"] + 41["Cap End"] + 42["SweepEdge Opposite"] + 43["SweepEdge Adjacent"] + 44["Plane
[1233, 1252, 0]"] + 52["Sweep Extrusion
[1407, 1425, 0]"] + 53[Wall] + 54["Cap Start"] + 55["Cap End"] + 56["SweepEdge Opposite"] + 57["SweepEdge Adjacent"] + 58["Plane
[1233, 1252, 0]"] + 66["Sweep Extrusion
[1407, 1425, 0]"] + 67[Wall] + 68["Cap Start"] + 69["Cap End"] + 70["SweepEdge Opposite"] + 71["SweepEdge Adjacent"] + 72["Plane
[1233, 1252, 0]"] + 80["Sweep Extrusion
[1407, 1425, 0]"] + 81[Wall] + 82["Cap Start"] + 83["Cap End"] + 84["SweepEdge Opposite"] + 85["SweepEdge Adjacent"] + 86["EdgeCut Fillet
[983, 1193, 0]"] + 87["EdgeCut Fillet
[983, 1193, 0]"] + 88["EdgeCut Fillet
[983, 1193, 0]"] + 89["EdgeCut Fillet
[983, 1193, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 8 --- 9 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 ---- 15 + 9 --- 14 + 10 --- 16 + 10 --- 22 + 10 --- 23 + 11 --- 17 + 11 --- 24 + 11 --- 25 + 12 --- 18 + 12 --- 26 + 12 --- 27 + 13 --- 19 + 13 --- 28 + 13 --- 29 + 15 --- 16 + 15 --- 17 + 15 --- 18 + 15 --- 19 + 15 --- 20 + 15 --- 21 + 15 --- 22 + 15 --- 23 + 15 --- 24 + 15 --- 25 + 15 --- 26 + 15 --- 27 + 15 --- 28 + 15 --- 29 + 30 --- 31 + 30 --- 32 + 30 --- 35 + 32 --- 33 + 32 ---- 38 + 32 --- 34 + 33 --- 39 + 33 --- 42 + 33 --- 43 + 35 --- 36 + 35 --- 37 + 38 --- 39 + 38 --- 40 + 38 --- 41 + 38 --- 42 + 38 --- 43 + 44 --- 45 + 44 --- 46 + 44 --- 49 + 46 --- 47 + 46 ---- 52 + 46 --- 48 + 47 --- 53 + 47 --- 56 + 47 --- 57 + 49 --- 50 + 49 --- 51 + 52 --- 53 + 52 --- 54 + 52 --- 55 + 52 --- 56 + 52 --- 57 + 58 --- 59 + 58 --- 60 + 58 --- 63 + 60 --- 61 + 60 ---- 66 + 60 --- 62 + 61 --- 67 + 61 --- 70 + 61 --- 71 + 63 --- 64 + 63 --- 65 + 66 --- 67 + 66 --- 68 + 66 --- 69 + 66 --- 70 + 66 --- 71 + 72 --- 73 + 72 --- 74 + 72 --- 77 + 74 --- 75 + 74 ---- 80 + 74 --- 76 + 75 --- 81 + 75 --- 84 + 75 --- 85 + 77 --- 78 + 77 --- 79 + 80 --- 81 + 80 --- 82 + 80 --- 83 + 80 --- 84 + 80 --- 85 + 23 <--x 86 + 25 <--x 87 + 27 <--x 88 + 29 <--x 89 +``` diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..69edaff53b --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map fillet-and-shell.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..30a6c67a69 --- /dev/null +++ b/src/wasm-lib/kcl/tests/fillet-and-shell/artifact_graph_mind_map.snap.md @@ -0,0 +1,113 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Segment + Segment + Segment + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Path + Segment + Solid2d + Plane + Path + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Path + Segment + Solid2d + Plane + Path + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Path + Segment + Solid2d + Plane + Path + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Path + Segment + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..047c477501 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart function_sketch.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..860ac2e009 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[55, 80, 0]"] + 3["Segment
[88, 103, 0]"] + 4["Segment
[111, 126, 0]"] + 5["Segment
[134, 150, 0]"] + 6["Segment
[158, 166, 0]"] + 7[Solid2d] + end + 1["Plane
[28, 47, 0]"] + 8["Sweep Extrusion
[174, 187, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..6dddf55fe5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map function_sketch.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..033b8db1cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart function_sketch_with_position.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..290a77b5c2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[58, 78, 0]"] + 3["Segment
[86, 101, 0]"] + 4["Segment
[109, 124, 0]"] + 5["Segment
[132, 148, 0]"] + 6["Segment
[156, 164, 0]"] + 7[Solid2d] + end + 1["Plane
[31, 50, 0]"] + 8["Sweep Extrusion
[172, 185, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..453035590e --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map function_sketch_with_position.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/function_sketch_with_position/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..5cca29b25d --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart helix_ccw.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..fd85434c8d --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_flowchart.snap.md @@ -0,0 +1,27 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 78, 0]"] + 3["Segment
[35, 78, 0]"] + 4[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 5["Sweep Extrusion
[84, 98, 0]"] + 6[Wall] + 7["Cap Start"] + 8["Cap End"] + 9["SweepEdge Opposite"] + 10["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 ---- 5 + 2 --- 4 + 3 --- 6 + 3 --- 9 + 3 --- 10 + 5 --- 6 + 5 --- 7 + 5 --- 8 + 5 --- 9 + 5 --- 10 +``` diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..790a169ae5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map helix_ccw.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..da05194e28 --- /dev/null +++ b/src/wasm-lib/kcl/tests/helix_ccw/artifact_graph_mind_map.snap.md @@ -0,0 +1,17 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..1f1d7461d5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart i_shape.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..004edeb1cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_flowchart.snap.md @@ -0,0 +1,307 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[399, 432, 0]"] + 3["Segment
[438, 475, 0]"] + 4["Segment
[481, 539, 0]"] + 5["Segment
[545, 575, 0]"] + 6["Segment
[581, 640, 0]"] + 7["Segment
[646, 705, 0]"] + 8["Segment
[711, 770, 0]"] + 9["Segment
[776, 828, 0]"] + 10["Segment
[834, 892, 0]"] + 11["Segment
[898, 934, 0]"] + 12["Segment
[940, 998, 0]"] + 13["Segment
[1004, 1034, 0]"] + 14["Segment
[1040, 1099, 0]"] + 15["Segment
[1105, 1168, 0]"] + 16["Segment
[1174, 1234, 0]"] + 17["Segment
[1240, 1273, 0]"] + 18["Segment
[1279, 1338, 0]"] + 19["Segment
[1344, 1380, 0]"] + 20["Segment
[1386, 1445, 0]"] + 21["Segment
[1451, 1506, 0]"] + 22["Segment
[1512, 1572, 0]"] + 23["Segment
[1578, 1702, 0]"] + 24["Segment
[1708, 1768, 0]"] + 25["Segment
[1774, 1807, 0]"] + 26["Segment
[1813, 1872, 0]"] + 27["Segment
[1878, 1886, 0]"] + 28[Solid2d] + end + subgraph path30 [Path] + 30["Path
[1896, 1917, 0]"] + 31["Segment
[1923, 1936, 0]"] + 32["Segment
[1942, 2000, 0]"] + 33["Segment
[2006, 2042, 0]"] + 34["Segment
[2048, 2107, 0]"] + 35["Segment
[2113, 2127, 0]"] + 36["Segment
[2133, 2193, 0]"] + 37["Segment
[2199, 2238, 0]"] + 38["Segment
[2244, 2303, 0]"] + 39["Segment
[2309, 2317, 0]"] + 40[Solid2d] + end + 1["Plane
[399, 432, 0]"] + 29["Plane
[1896, 1917, 0]"] + 41["Sweep Extrusion
[2363, 2378, 0]"] + 42[Wall] + 43[Wall] + 44[Wall] + 45[Wall] + 46[Wall] + 47[Wall] + 48[Wall] + 49[Wall] + 50[Wall] + 51[Wall] + 52[Wall] + 53[Wall] + 54[Wall] + 55[Wall] + 56[Wall] + 57[Wall] + 58[Wall] + 59[Wall] + 60[Wall] + 61[Wall] + 62[Wall] + 63[Wall] + 64[Wall] + 65[Wall] + 66["Cap Start"] + 67["Cap End"] + 68["SweepEdge Opposite"] + 69["SweepEdge Adjacent"] + 70["SweepEdge Opposite"] + 71["SweepEdge Adjacent"] + 72["SweepEdge Opposite"] + 73["SweepEdge Adjacent"] + 74["SweepEdge Opposite"] + 75["SweepEdge Adjacent"] + 76["SweepEdge Opposite"] + 77["SweepEdge Adjacent"] + 78["SweepEdge Opposite"] + 79["SweepEdge Adjacent"] + 80["SweepEdge Opposite"] + 81["SweepEdge Adjacent"] + 82["SweepEdge Opposite"] + 83["SweepEdge Adjacent"] + 84["SweepEdge Opposite"] + 85["SweepEdge Adjacent"] + 86["SweepEdge Opposite"] + 87["SweepEdge Adjacent"] + 88["SweepEdge Opposite"] + 89["SweepEdge Adjacent"] + 90["SweepEdge Opposite"] + 91["SweepEdge Adjacent"] + 92["SweepEdge Opposite"] + 93["SweepEdge Adjacent"] + 94["SweepEdge Opposite"] + 95["SweepEdge Adjacent"] + 96["SweepEdge Opposite"] + 97["SweepEdge Adjacent"] + 98["SweepEdge Opposite"] + 99["SweepEdge Adjacent"] + 100["SweepEdge Opposite"] + 101["SweepEdge Adjacent"] + 102["SweepEdge Opposite"] + 103["SweepEdge Adjacent"] + 104["SweepEdge Opposite"] + 105["SweepEdge Adjacent"] + 106["SweepEdge Opposite"] + 107["SweepEdge Adjacent"] + 108["SweepEdge Opposite"] + 109["SweepEdge Adjacent"] + 110["SweepEdge Opposite"] + 111["SweepEdge Adjacent"] + 112["SweepEdge Opposite"] + 113["SweepEdge Adjacent"] + 114["SweepEdge Opposite"] + 115["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 --- 11 + 2 --- 12 + 2 --- 13 + 2 --- 14 + 2 --- 15 + 2 --- 16 + 2 --- 17 + 2 --- 18 + 2 --- 19 + 2 --- 20 + 2 --- 21 + 2 --- 22 + 2 --- 23 + 2 --- 24 + 2 --- 25 + 2 --- 26 + 2 --- 27 + 2 ---- 41 + 2 --- 28 + 3 --- 42 + 3 --- 68 + 3 --- 69 + 4 --- 43 + 4 --- 70 + 4 --- 71 + 5 --- 44 + 5 --- 72 + 5 --- 73 + 6 --- 45 + 6 --- 74 + 6 --- 75 + 7 --- 46 + 7 --- 76 + 7 --- 77 + 8 --- 47 + 8 --- 78 + 8 --- 79 + 9 --- 48 + 9 --- 80 + 9 --- 81 + 10 --- 49 + 10 --- 82 + 10 --- 83 + 11 --- 50 + 11 --- 84 + 11 --- 85 + 12 --- 51 + 12 --- 86 + 12 --- 87 + 13 --- 52 + 13 --- 88 + 13 --- 89 + 14 --- 53 + 14 --- 90 + 14 --- 91 + 15 --- 54 + 15 --- 92 + 15 --- 93 + 16 --- 55 + 16 --- 94 + 16 --- 95 + 17 --- 56 + 17 --- 96 + 17 --- 97 + 18 --- 57 + 18 --- 98 + 18 --- 99 + 19 --- 58 + 19 --- 100 + 19 --- 101 + 20 --- 59 + 20 --- 102 + 20 --- 103 + 21 --- 60 + 21 --- 104 + 21 --- 105 + 22 --- 61 + 22 --- 106 + 22 --- 107 + 23 --- 62 + 23 --- 108 + 23 --- 109 + 24 --- 63 + 24 --- 110 + 24 --- 111 + 25 --- 64 + 25 --- 112 + 25 --- 113 + 26 --- 65 + 26 --- 114 + 26 --- 115 + 29 --- 30 + 30 --- 31 + 30 --- 32 + 30 --- 33 + 30 --- 34 + 30 --- 35 + 30 --- 36 + 30 --- 37 + 30 --- 38 + 30 --- 39 + 30 --- 40 + 41 --- 42 + 41 --- 43 + 41 --- 44 + 41 --- 45 + 41 --- 46 + 41 --- 47 + 41 --- 48 + 41 --- 49 + 41 --- 50 + 41 --- 51 + 41 --- 52 + 41 --- 53 + 41 --- 54 + 41 --- 55 + 41 --- 56 + 41 --- 57 + 41 --- 58 + 41 --- 59 + 41 --- 60 + 41 --- 61 + 41 --- 62 + 41 --- 63 + 41 --- 64 + 41 --- 65 + 41 --- 66 + 41 --- 67 + 41 --- 68 + 41 --- 69 + 41 --- 70 + 41 --- 71 + 41 --- 72 + 41 --- 73 + 41 --- 74 + 41 --- 75 + 41 --- 76 + 41 --- 77 + 41 --- 78 + 41 --- 79 + 41 --- 80 + 41 --- 81 + 41 --- 82 + 41 --- 83 + 41 --- 84 + 41 --- 85 + 41 --- 86 + 41 --- 87 + 41 --- 88 + 41 --- 89 + 41 --- 90 + 41 --- 91 + 41 --- 92 + 41 --- 93 + 41 --- 94 + 41 --- 95 + 41 --- 96 + 41 --- 97 + 41 --- 98 + 41 --- 99 + 41 --- 100 + 41 --- 101 + 41 --- 102 + 41 --- 103 + 41 --- 104 + 41 --- 105 + 41 --- 106 + 41 --- 107 + 41 --- 108 + 41 --- 109 + 41 --- 110 + 41 --- 111 + 41 --- 112 + 41 --- 113 + 41 --- 114 + 41 --- 115 +``` diff --git a/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..d16f570ca2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map i_shape.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..5957d9c447 --- /dev/null +++ b/src/wasm-lib/kcl/tests/i_shape/artifact_graph_mind_map.snap.md @@ -0,0 +1,191 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Segment + Segment + Segment + Segment + Segment + Segment + Segment + Segment + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..08509c6dae --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart if_else.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..3a88d63040 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map if_else.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/if_else/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..92fe749c6e --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_constant.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..aeee244c75 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_constant.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_constant/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..8ce2db8495 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_export.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..ff8f8fc6a8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_export.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_export/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..ed9ba47bcb --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_glob.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..b51658e9be --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_glob.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_glob/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..8822fcd31d --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart import_whole.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..33b459ab32 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_flowchart.snap.md @@ -0,0 +1,27 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[25, 68, 1]"] + 3["Segment
[25, 68, 1]"] + 4[Solid2d] + end + 1["Plane
[0, 19, 1]"] + 5["Sweep Extrusion
[74, 88, 1]"] + 6[Wall] + 7["Cap Start"] + 8["Cap End"] + 9["SweepEdge Opposite"] + 10["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 ---- 5 + 2 --- 4 + 3 --- 6 + 3 --- 9 + 3 --- 10 + 5 --- 6 + 5 --- 7 + 5 --- 8 + 5 --- 9 + 5 --- 10 +``` diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..5f9590dc67 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map import_whole.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..da05194e28 --- /dev/null +++ b/src/wasm-lib/kcl/tests/import_whole/artifact_graph_mind_map.snap.md @@ -0,0 +1,17 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..8d268617c5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart index_of_array.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..0629f54870 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map index_of_array.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/index_of_array/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap index b82d33aff0..4313501344 100644 --- a/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap +++ b/src/wasm-lib/kcl/tests/invalid_index_fractional/execution_error.snap @@ -1,6 +1,7 @@ --- source: kcl/src/simulation_tests.rs description: Error from executing invalid_index_fractional.kcl +snapshot_kind: text --- KCL Semantic error diff --git a/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap b/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap index 11408c6a6c..35427330c9 100644 --- a/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap +++ b/src/wasm-lib/kcl/tests/invalid_index_negative/execution_error.snap @@ -1,6 +1,7 @@ --- source: kcl/src/simulation_tests.rs description: Error from executing invalid_index_negative.kcl +snapshot_kind: text --- KCL Semantic error diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..ec84c515ef --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart kittycad_svg.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..c430025872 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_flowchart.snap.md @@ -0,0 +1,3107 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[31, 56, 0]"] + 3["Segment
[62, 87, 0]"] + 4["Segment
[109, 133, 0]"] + 5["Segment
[163, 187, 0]"] + 6["Segment
[219, 244, 0]"] + 7["Segment
[274, 296, 0]"] + 8["Segment
[328, 349, 0]"] + 9["Segment
[379, 403, 0]"] + 10["Segment
[435, 459, 0]"] + 11["Segment
[489, 513, 0]"] + 12["Segment
[545, 569, 0]"] + 13["Segment
[599, 623, 0]"] + 14["Segment
[655, 678, 0]"] + 15["Segment
[708, 731, 0]"] + 16["Segment
[763, 787, 0]"] + 17["Segment
[817, 842, 0]"] + 18["Segment
[874, 898, 0]"] + 19["Segment
[928, 952, 0]"] + 20["Segment
[984, 1009, 0]"] + 21["Segment
[1040, 1065, 0]"] + 22["Segment
[1097, 1122, 0]"] + 23["Segment
[1153, 1178, 0]"] + 24["Segment
[1210, 1235, 0]"] + 25["Segment
[1265, 1287, 0]"] + 26["Segment
[1319, 1342, 0]"] + 27["Segment
[1373, 1399, 0]"] + 28["Segment
[1431, 1456, 0]"] + 29["Segment
[1487, 1512, 0]"] + 30["Segment
[1544, 1570, 0]"] + 31["Segment
[1601, 1627, 0]"] + 32["Segment
[1659, 1685, 0]"] + 33["Segment
[1716, 1741, 0]"] + 34["Segment
[1773, 1798, 0]"] + 35["Segment
[1829, 1855, 0]"] + 36["Segment
[1887, 1913, 0]"] + 37["Segment
[1943, 1968, 0]"] + 38["Segment
[2000, 2025, 0]"] + 39["Segment
[2055, 2079, 0]"] + 40["Segment
[2111, 2135, 0]"] + 41["Segment
[2166, 2191, 0]"] + 42["Segment
[2223, 2248, 0]"] + 43["Segment
[2279, 2303, 0]"] + 44["Segment
[2335, 2359, 0]"] + 45["Segment
[2390, 2415, 0]"] + 46["Segment
[2447, 2472, 0]"] + 47["Segment
[2503, 2532, 0]"] + 48["Segment
[2554, 2583, 0]"] + 49["Segment
[2614, 2639, 0]"] + 50["Segment
[2671, 2695, 0]"] + 51["Segment
[2726, 2751, 0]"] + 52["Segment
[2783, 2809, 0]"] + 53["Segment
[2840, 2866, 0]"] + 54["Segment
[2898, 2924, 0]"] + 55["Segment
[2972, 2997, 0]"] + 56["Segment
[3019, 3044, 0]"] + 57["Segment
[3075, 3101, 0]"] + 58["Segment
[3133, 3159, 0]"] + 59["Segment
[3190, 3215, 0]"] + 60["Segment
[3237, 3262, 0]"] + 61["Segment
[3293, 3318, 0]"] + 62["Segment
[3350, 3375, 0]"] + 63["Segment
[3406, 3431, 0]"] + 64["Segment
[3453, 3478, 0]"] + 65["Segment
[3509, 3534, 0]"] + 66["Segment
[3566, 3591, 0]"] + 67["Segment
[3622, 3648, 0]"] + 68["Segment
[3670, 3696, 0]"] + 69["Segment
[3727, 3766, 0]"] + 70["Segment
[3798, 3837, 0]"] + 71["Segment
[3868, 3893, 0]"] + 72["Segment
[3915, 3940, 0]"] + 73["Segment
[3971, 3997, 0]"] + 74["Segment
[4029, 4055, 0]"] + 75["Segment
[4086, 4112, 0]"] + 76["Segment
[4134, 4160, 0]"] + 77["Segment
[4191, 4217, 0]"] + 78["Segment
[4249, 4275, 0]"] + 79["Segment
[4306, 4332, 0]"] + 80["Segment
[4354, 4380, 0]"] + 81["Segment
[4411, 4437, 0]"] + 82["Segment
[4469, 4495, 0]"] + 83["Segment
[4526, 4551, 0]"] + 84["Segment
[4573, 4598, 0]"] + 85["Segment
[4628, 4653, 0]"] + 86["Segment
[4685, 4709, 0]"] + 87["Segment
[4739, 4762, 0]"] + 88["Segment
[4794, 4818, 0]"] + 89["Segment
[4848, 4872, 0]"] + 90["Segment
[4904, 4928, 0]"] + 91["Segment
[4958, 4982, 0]"] + 92["Segment
[5014, 5038, 0]"] + 93["Segment
[5068, 5096, 0]"] + 94["Segment
[5128, 5155, 0]"] + 95["Segment
[5185, 5209, 0]"] + 96["Segment
[5241, 5266, 0]"] + 97["Segment
[5296, 5321, 0]"] + 98["Segment
[5353, 5378, 0]"] + 99["Segment
[5408, 5433, 0]"] + 100["Segment
[5455, 5483, 0]"] + 101["Segment
[5515, 5544, 0]"] + 102["Segment
[5574, 5600, 0]"] + 103["Segment
[5632, 5657, 0]"] + 104["Segment
[5679, 5706, 0]"] + 105["Segment
[5736, 5764, 0]"] + 106["Segment
[5796, 5822, 0]"] + 107["Segment
[5852, 5878, 0]"] + 108["Segment
[5910, 5935, 0]"] + 109["Segment
[5966, 5991, 0]"] + 110["Segment
[6023, 6049, 0]"] + 111["Segment
[6080, 6105, 0]"] + 112["Segment
[6137, 6161, 0]"] + 113["Segment
[6191, 6215, 0]"] + 114["Segment
[6247, 6285, 0]"] + 115["Segment
[6316, 6342, 0]"] + 116["Segment
[6364, 6390, 0]"] + 117["Segment
[6421, 6447, 0]"] + 118["Segment
[6479, 6505, 0]"] + 119["Segment
[6536, 6562, 0]"] + 120["Segment
[6594, 6619, 0]"] + 121["Segment
[6641, 6667, 0]"] + 122["Segment
[6699, 6725, 0]"] + 123["Segment
[6756, 6782, 0]"] + 124["Segment
[6819, 6858, 0]"] + 125["Segment
[6889, 6928, 0]"] + 126["Segment
[6960, 6986, 0]"] + 127["Segment
[7017, 7043, 0]"] + 128["Segment
[7075, 7114, 0]"] + 129["Segment
[7145, 7184, 0]"] + 130["Segment
[7216, 7241, 0]"] + 131["Segment
[7271, 7295, 0]"] + 132["Segment
[7327, 7352, 0]"] + 133["Segment
[7382, 7407, 0]"] + 134["Segment
[7439, 7477, 0]"] + 135["Segment
[7508, 7546, 0]"] + 136["Segment
[7578, 7603, 0]"] + 137["Segment
[7634, 7660, 0]"] + 138["Segment
[7692, 7718, 0]"] + 139["Segment
[7748, 7773, 0]"] + 140["Segment
[7805, 7829, 0]"] + 141["Segment
[7851, 7876, 0]"] + 142["Segment
[7906, 7931, 0]"] + 143["Segment
[7963, 7987, 0]"] + 144["Segment
[8017, 8040, 0]"] + 145["Segment
[8072, 8096, 0]"] + 146["Segment
[8127, 8152, 0]"] + 147["Segment
[8184, 8209, 0]"] + 148["Segment
[8240, 8279, 0]"] + 149["Segment
[8311, 8350, 0]"] + 150["Segment
[8381, 8405, 0]"] + 151["Segment
[8437, 8460, 0]"] + 152["Segment
[8491, 8515, 0]"] + 153["Segment
[8537, 8561, 0]"] + 154["Segment
[8591, 8614, 0]"] + 155["Segment
[8646, 8669, 0]"] + 156["Segment
[8699, 8723, 0]"] + 157["Segment
[8755, 8779, 0]"] + 158["Segment
[8809, 8833, 0]"] + 159["Segment
[8865, 8895, 0]"] + 160["Segment
[8925, 8955, 0]"] + 161["Segment
[8987, 9011, 0]"] + 162["Segment
[9041, 9065, 0]"] + 163["Segment
[9097, 9121, 0]"] + 164["Segment
[9151, 9174, 0]"] + 165["Segment
[9206, 9229, 0]"] + 166["Segment
[9260, 9284, 0]"] + 167["Segment
[9316, 9340, 0]"] + 168["Segment
[9371, 9396, 0]"] + 169["Segment
[9418, 9443, 0]"] + 170["Segment
[9473, 9498, 0]"] + 171["Segment
[9530, 9555, 0]"] + 172["Segment
[9585, 9609, 0]"] + 173["Segment
[9641, 9665, 0]"] + 174["Segment
[9695, 9720, 0]"] + 175["Segment
[9752, 9777, 0]"] + 176["Segment
[9807, 9832, 0]"] + 177["Segment
[9864, 9895, 0]"] + 178["Segment
[9925, 9956, 0]"] + 179["Segment
[9988, 10013, 0]"] + 180["Segment
[10043, 10081, 0]"] + 181["Segment
[10113, 10151, 0]"] + 182["Segment
[10182, 10206, 0]"] + 183["Segment
[10238, 10262, 0]"] + 184["Segment
[10293, 10318, 0]"] + 185["Segment
[10340, 10362, 0]"] + 186["Segment
[10392, 10427, 0]"] + 187["Segment
[10459, 10497, 0]"] + 188["Segment
[10528, 10552, 0]"] + 189["Segment
[10584, 10608, 0]"] + 190["Segment
[10639, 10664, 0]"] + 191["Segment
[10696, 10721, 0]"] + 192["Segment
[10751, 10775, 0]"] + 193["Segment
[10807, 10831, 0]"] + 194["Segment
[10861, 10886, 0]"] + 195["Segment
[10918, 10943, 0]"] + 196["Segment
[10973, 10998, 0]"] + 197["Segment
[11030, 11061, 0]"] + 198["Segment
[11091, 11122, 0]"] + 199["Segment
[11154, 11179, 0]"] + 200["Segment
[11209, 11234, 0]"] + 201["Segment
[11266, 11291, 0]"] + 202["Segment
[11321, 11345, 0]"] + 203["Segment
[11377, 11401, 0]"] + 204["Segment
[11431, 11456, 0]"] + 205["Segment
[11488, 11513, 0]"] + 206["Segment
[11543, 11567, 0]"] + 207["Segment
[11599, 11623, 0]"] + 208["Segment
[11653, 11677, 0]"] + 209["Segment
[11699, 11720, 0]"] + 210["Segment
[11750, 11771, 0]"] + 211["Segment
[11803, 11827, 0]"] + 212["Segment
[11857, 11880, 0]"] + 213["Segment
[11912, 11935, 0]"] + 214["Segment
[11965, 11989, 0]"] + 215["Segment
[12021, 12045, 0]"] + 216["Segment
[12075, 12098, 0]"] + 217["Segment
[12130, 12153, 0]"] + 218["Segment
[12183, 12207, 0]"] + 219["Segment
[12239, 12263, 0]"] + 220["Segment
[12293, 12317, 0]"] + 221["Segment
[12349, 12379, 0]"] + 222["Segment
[12409, 12439, 0]"] + 223["Segment
[12471, 12495, 0]"] + 224["Segment
[12525, 12549, 0]"] + 225["Segment
[12581, 12605, 0]"] + 226["Segment
[12635, 12658, 0]"] + 227["Segment
[12690, 12713, 0]"] + 228["Segment
[12743, 12767, 0]"] + 229["Segment
[12799, 12823, 0]"] + 230["Segment
[12853, 12876, 0]"] + 231["Segment
[12908, 12931, 0]"] + 232["Segment
[12961, 12986, 0]"] + 233["Segment
[13008, 13033, 0]"] + 234["Segment
[13063, 13088, 0]"] + 235["Segment
[13120, 13144, 0]"] + 236["Segment
[13174, 13198, 0]"] + 237["Segment
[13230, 13255, 0]"] + 238["Segment
[13286, 13324, 0]"] + 239["Segment
[13356, 13394, 0]"] + 240["Segment
[13425, 13449, 0]"] + 241["Segment
[13471, 13494, 0]"] + 242["Segment
[13524, 13547, 0]"] + 243["Segment
[13579, 13603, 0]"] + 244["Segment
[13633, 13657, 0]"] + 245["Segment
[13689, 13713, 0]"] + 246["Segment
[13743, 13767, 0]"] + 247["Segment
[13799, 13823, 0]"] + 248["Segment
[13853, 13878, 0]"] + 249["Segment
[13900, 13925, 0]"] + 250["Segment
[13955, 13979, 0]"] + 251["Segment
[14011, 14034, 0]"] + 252["Segment
[14064, 14088, 0]"] + 253["Segment
[14120, 14145, 0]"] + 254["Segment
[14176, 14201, 0]"] + 255["Segment
[14233, 14258, 0]"] + 256["Segment
[14289, 14313, 0]"] + 257["Segment
[14335, 14359, 0]"] + 258["Segment
[14389, 14413, 0]"] + 259["Segment
[14445, 14469, 0]"] + 260["Segment
[14499, 14523, 0]"] + 261["Segment
[14555, 14578, 0]"] + 262["Segment
[14608, 14630, 0]"] + 263["Segment
[14662, 14685, 0]"] + 264["Segment
[14716, 14738, 0]"] + 265["Segment
[14760, 14783, 0]"] + 266["Segment
[14815, 14839, 0]"] + 267["Segment
[14870, 14895, 0]"] + 268["Segment
[14927, 14952, 0]"] + 269["Segment
[14982, 15006, 0]"] + 270["Segment
[15038, 15062, 0]"] + 271["Segment
[15092, 15115, 0]"] + 272["Segment
[15147, 15171, 0]"] + 273["Segment
[15193, 15216, 0]"] + 274["Segment
[15248, 15272, 0]"] + 275["Segment
[15302, 15327, 0]"] + 276["Segment
[15359, 15384, 0]"] + 277["Segment
[15414, 15439, 0]"] + 278["Segment
[15471, 15496, 0]"] + 279["Segment
[15526, 15551, 0]"] + 280["Segment
[15583, 15609, 0]"] + 281["Segment
[15631, 15657, 0]"] + 282["Segment
[15689, 15715, 0]"] + 283["Segment
[15746, 15772, 0]"] + 284["Segment
[15804, 15812, 0]"] + 285[Solid2d] + end + 1["Plane
[6, 25, 0]"] + 286["Sweep Extrusion
[15818, 15831, 0]"] + 287[Wall] + 288[Wall] + 289[Wall] + 290[Wall] + 291[Wall] + 292[Wall] + 293[Wall] + 294[Wall] + 295[Wall] + 296[Wall] + 297[Wall] + 298[Wall] + 299[Wall] + 300[Wall] + 301[Wall] + 302[Wall] + 303[Wall] + 304[Wall] + 305[Wall] + 306[Wall] + 307[Wall] + 308[Wall] + 309[Wall] + 310[Wall] + 311[Wall] + 312[Wall] + 313[Wall] + 314[Wall] + 315[Wall] + 316[Wall] + 317[Wall] + 318[Wall] + 319[Wall] + 320[Wall] + 321[Wall] + 322[Wall] + 323[Wall] + 324[Wall] + 325[Wall] + 326[Wall] + 327[Wall] + 328[Wall] + 329[Wall] + 330[Wall] + 331[Wall] + 332[Wall] + 333[Wall] + 334[Wall] + 335[Wall] + 336[Wall] + 337[Wall] + 338[Wall] + 339[Wall] + 340[Wall] + 341[Wall] + 342[Wall] + 343[Wall] + 344[Wall] + 345[Wall] + 346[Wall] + 347[Wall] + 348[Wall] + 349[Wall] + 350[Wall] + 351[Wall] + 352[Wall] + 353[Wall] + 354[Wall] + 355[Wall] + 356[Wall] + 357[Wall] + 358[Wall] + 359[Wall] + 360[Wall] + 361[Wall] + 362[Wall] + 363[Wall] + 364[Wall] + 365[Wall] + 366[Wall] + 367[Wall] + 368[Wall] + 369[Wall] + 370[Wall] + 371[Wall] + 372[Wall] + 373[Wall] + 374[Wall] + 375[Wall] + 376[Wall] + 377[Wall] + 378[Wall] + 379[Wall] + 380[Wall] + 381[Wall] + 382[Wall] + 383[Wall] + 384[Wall] + 385[Wall] + 386[Wall] + 387[Wall] + 388[Wall] + 389[Wall] + 390[Wall] + 391[Wall] + 392[Wall] + 393[Wall] + 394[Wall] + 395[Wall] + 396[Wall] + 397[Wall] + 398[Wall] + 399[Wall] + 400[Wall] + 401[Wall] + 402[Wall] + 403[Wall] + 404[Wall] + 405[Wall] + 406[Wall] + 407[Wall] + 408[Wall] + 409[Wall] + 410[Wall] + 411[Wall] + 412[Wall] + 413[Wall] + 414[Wall] + 415[Wall] + 416[Wall] + 417[Wall] + 418[Wall] + 419[Wall] + 420[Wall] + 421[Wall] + 422[Wall] + 423[Wall] + 424[Wall] + 425[Wall] + 426[Wall] + 427[Wall] + 428[Wall] + 429[Wall] + 430[Wall] + 431[Wall] + 432[Wall] + 433[Wall] + 434[Wall] + 435[Wall] + 436[Wall] + 437[Wall] + 438[Wall] + 439[Wall] + 440[Wall] + 441[Wall] + 442[Wall] + 443[Wall] + 444[Wall] + 445[Wall] + 446[Wall] + 447[Wall] + 448[Wall] + 449[Wall] + 450[Wall] + 451[Wall] + 452[Wall] + 453[Wall] + 454[Wall] + 455[Wall] + 456[Wall] + 457[Wall] + 458[Wall] + 459[Wall] + 460[Wall] + 461[Wall] + 462[Wall] + 463[Wall] + 464[Wall] + 465[Wall] + 466[Wall] + 467[Wall] + 468[Wall] + 469[Wall] + 470[Wall] + 471[Wall] + 472[Wall] + 473[Wall] + 474[Wall] + 475[Wall] + 476[Wall] + 477[Wall] + 478[Wall] + 479[Wall] + 480[Wall] + 481[Wall] + 482[Wall] + 483[Wall] + 484[Wall] + 485[Wall] + 486[Wall] + 487[Wall] + 488[Wall] + 489[Wall] + 490[Wall] + 491[Wall] + 492[Wall] + 493[Wall] + 494[Wall] + 495[Wall] + 496[Wall] + 497[Wall] + 498[Wall] + 499[Wall] + 500[Wall] + 501[Wall] + 502[Wall] + 503[Wall] + 504[Wall] + 505[Wall] + 506[Wall] + 507[Wall] + 508[Wall] + 509[Wall] + 510[Wall] + 511[Wall] + 512[Wall] + 513[Wall] + 514[Wall] + 515[Wall] + 516[Wall] + 517[Wall] + 518[Wall] + 519[Wall] + 520[Wall] + 521[Wall] + 522[Wall] + 523[Wall] + 524[Wall] + 525[Wall] + 526[Wall] + 527[Wall] + 528[Wall] + 529[Wall] + 530[Wall] + 531[Wall] + 532[Wall] + 533[Wall] + 534[Wall] + 535[Wall] + 536[Wall] + 537[Wall] + 538[Wall] + 539[Wall] + 540[Wall] + 541[Wall] + 542[Wall] + 543[Wall] + 544[Wall] + 545[Wall] + 546[Wall] + 547[Wall] + 548[Wall] + 549[Wall] + 550[Wall] + 551[Wall] + 552[Wall] + 553[Wall] + 554[Wall] + 555[Wall] + 556[Wall] + 557[Wall] + 558[Wall] + 559[Wall] + 560[Wall] + 561[Wall] + 562[Wall] + 563[Wall] + 564[Wall] + 565[Wall] + 566[Wall] + 567[Wall] + 568["Cap Start"] + 569["Cap End"] + 570["SweepEdge Opposite"] + 571["SweepEdge Adjacent"] + 572["SweepEdge Opposite"] + 573["SweepEdge Adjacent"] + 574["SweepEdge Opposite"] + 575["SweepEdge Adjacent"] + 576["SweepEdge Opposite"] + 577["SweepEdge Adjacent"] + 578["SweepEdge Opposite"] + 579["SweepEdge Adjacent"] + 580["SweepEdge Opposite"] + 581["SweepEdge Adjacent"] + 582["SweepEdge Opposite"] + 583["SweepEdge Adjacent"] + 584["SweepEdge Opposite"] + 585["SweepEdge Adjacent"] + 586["SweepEdge Opposite"] + 587["SweepEdge Adjacent"] + 588["SweepEdge Opposite"] + 589["SweepEdge Adjacent"] + 590["SweepEdge Opposite"] + 591["SweepEdge Adjacent"] + 592["SweepEdge Opposite"] + 593["SweepEdge Adjacent"] + 594["SweepEdge Opposite"] + 595["SweepEdge Adjacent"] + 596["SweepEdge Opposite"] + 597["SweepEdge Adjacent"] + 598["SweepEdge Opposite"] + 599["SweepEdge Adjacent"] + 600["SweepEdge Opposite"] + 601["SweepEdge Adjacent"] + 602["SweepEdge Opposite"] + 603["SweepEdge Adjacent"] + 604["SweepEdge Opposite"] + 605["SweepEdge Adjacent"] + 606["SweepEdge Opposite"] + 607["SweepEdge Adjacent"] + 608["SweepEdge Opposite"] + 609["SweepEdge Adjacent"] + 610["SweepEdge Opposite"] + 611["SweepEdge Adjacent"] + 612["SweepEdge Opposite"] + 613["SweepEdge Adjacent"] + 614["SweepEdge Opposite"] + 615["SweepEdge Adjacent"] + 616["SweepEdge Opposite"] + 617["SweepEdge Adjacent"] + 618["SweepEdge Opposite"] + 619["SweepEdge Adjacent"] + 620["SweepEdge Opposite"] + 621["SweepEdge Adjacent"] + 622["SweepEdge Opposite"] + 623["SweepEdge Adjacent"] + 624["SweepEdge Opposite"] + 625["SweepEdge Adjacent"] + 626["SweepEdge Opposite"] + 627["SweepEdge Adjacent"] + 628["SweepEdge Opposite"] + 629["SweepEdge Adjacent"] + 630["SweepEdge Opposite"] + 631["SweepEdge Adjacent"] + 632["SweepEdge Opposite"] + 633["SweepEdge Adjacent"] + 634["SweepEdge Opposite"] + 635["SweepEdge Adjacent"] + 636["SweepEdge Opposite"] + 637["SweepEdge Adjacent"] + 638["SweepEdge Opposite"] + 639["SweepEdge Adjacent"] + 640["SweepEdge Opposite"] + 641["SweepEdge Adjacent"] + 642["SweepEdge Opposite"] + 643["SweepEdge Adjacent"] + 644["SweepEdge Opposite"] + 645["SweepEdge Adjacent"] + 646["SweepEdge Opposite"] + 647["SweepEdge Adjacent"] + 648["SweepEdge Opposite"] + 649["SweepEdge Adjacent"] + 650["SweepEdge Opposite"] + 651["SweepEdge Adjacent"] + 652["SweepEdge Opposite"] + 653["SweepEdge Adjacent"] + 654["SweepEdge Opposite"] + 655["SweepEdge Adjacent"] + 656["SweepEdge Opposite"] + 657["SweepEdge Adjacent"] + 658["SweepEdge Opposite"] + 659["SweepEdge Adjacent"] + 660["SweepEdge Opposite"] + 661["SweepEdge Adjacent"] + 662["SweepEdge Opposite"] + 663["SweepEdge Adjacent"] + 664["SweepEdge Opposite"] + 665["SweepEdge Adjacent"] + 666["SweepEdge Opposite"] + 667["SweepEdge Adjacent"] + 668["SweepEdge Opposite"] + 669["SweepEdge Adjacent"] + 670["SweepEdge Opposite"] + 671["SweepEdge Adjacent"] + 672["SweepEdge Opposite"] + 673["SweepEdge Adjacent"] + 674["SweepEdge Opposite"] + 675["SweepEdge Adjacent"] + 676["SweepEdge Opposite"] + 677["SweepEdge Adjacent"] + 678["SweepEdge Opposite"] + 679["SweepEdge Adjacent"] + 680["SweepEdge Opposite"] + 681["SweepEdge Adjacent"] + 682["SweepEdge Opposite"] + 683["SweepEdge Adjacent"] + 684["SweepEdge Opposite"] + 685["SweepEdge Adjacent"] + 686["SweepEdge Opposite"] + 687["SweepEdge Adjacent"] + 688["SweepEdge Opposite"] + 689["SweepEdge Adjacent"] + 690["SweepEdge Opposite"] + 691["SweepEdge Adjacent"] + 692["SweepEdge Opposite"] + 693["SweepEdge Adjacent"] + 694["SweepEdge Opposite"] + 695["SweepEdge Adjacent"] + 696["SweepEdge Opposite"] + 697["SweepEdge Adjacent"] + 698["SweepEdge Opposite"] + 699["SweepEdge Adjacent"] + 700["SweepEdge Opposite"] + 701["SweepEdge Adjacent"] + 702["SweepEdge Opposite"] + 703["SweepEdge Adjacent"] + 704["SweepEdge Opposite"] + 705["SweepEdge Adjacent"] + 706["SweepEdge Opposite"] + 707["SweepEdge Adjacent"] + 708["SweepEdge Opposite"] + 709["SweepEdge Adjacent"] + 710["SweepEdge Opposite"] + 711["SweepEdge Adjacent"] + 712["SweepEdge Opposite"] + 713["SweepEdge Adjacent"] + 714["SweepEdge Opposite"] + 715["SweepEdge Adjacent"] + 716["SweepEdge Opposite"] + 717["SweepEdge Adjacent"] + 718["SweepEdge Opposite"] + 719["SweepEdge Adjacent"] + 720["SweepEdge Opposite"] + 721["SweepEdge Adjacent"] + 722["SweepEdge Opposite"] + 723["SweepEdge Adjacent"] + 724["SweepEdge Opposite"] + 725["SweepEdge Adjacent"] + 726["SweepEdge Opposite"] + 727["SweepEdge Adjacent"] + 728["SweepEdge Opposite"] + 729["SweepEdge Adjacent"] + 730["SweepEdge Opposite"] + 731["SweepEdge Adjacent"] + 732["SweepEdge Opposite"] + 733["SweepEdge Adjacent"] + 734["SweepEdge Opposite"] + 735["SweepEdge Adjacent"] + 736["SweepEdge Opposite"] + 737["SweepEdge Adjacent"] + 738["SweepEdge Opposite"] + 739["SweepEdge Adjacent"] + 740["SweepEdge Opposite"] + 741["SweepEdge Adjacent"] + 742["SweepEdge Opposite"] + 743["SweepEdge Adjacent"] + 744["SweepEdge Opposite"] + 745["SweepEdge Adjacent"] + 746["SweepEdge Opposite"] + 747["SweepEdge Adjacent"] + 748["SweepEdge Opposite"] + 749["SweepEdge Adjacent"] + 750["SweepEdge Opposite"] + 751["SweepEdge Adjacent"] + 752["SweepEdge Opposite"] + 753["SweepEdge Adjacent"] + 754["SweepEdge Opposite"] + 755["SweepEdge Adjacent"] + 756["SweepEdge Opposite"] + 757["SweepEdge Adjacent"] + 758["SweepEdge Opposite"] + 759["SweepEdge Adjacent"] + 760["SweepEdge Opposite"] + 761["SweepEdge Adjacent"] + 762["SweepEdge Opposite"] + 763["SweepEdge Adjacent"] + 764["SweepEdge Opposite"] + 765["SweepEdge Adjacent"] + 766["SweepEdge Opposite"] + 767["SweepEdge Adjacent"] + 768["SweepEdge Opposite"] + 769["SweepEdge Adjacent"] + 770["SweepEdge Opposite"] + 771["SweepEdge Adjacent"] + 772["SweepEdge Opposite"] + 773["SweepEdge Adjacent"] + 774["SweepEdge Opposite"] + 775["SweepEdge Adjacent"] + 776["SweepEdge Opposite"] + 777["SweepEdge Adjacent"] + 778["SweepEdge Opposite"] + 779["SweepEdge Adjacent"] + 780["SweepEdge Opposite"] + 781["SweepEdge Adjacent"] + 782["SweepEdge Opposite"] + 783["SweepEdge Adjacent"] + 784["SweepEdge Opposite"] + 785["SweepEdge Adjacent"] + 786["SweepEdge Opposite"] + 787["SweepEdge Adjacent"] + 788["SweepEdge Opposite"] + 789["SweepEdge Adjacent"] + 790["SweepEdge Opposite"] + 791["SweepEdge Adjacent"] + 792["SweepEdge Opposite"] + 793["SweepEdge Adjacent"] + 794["SweepEdge Opposite"] + 795["SweepEdge Adjacent"] + 796["SweepEdge Opposite"] + 797["SweepEdge Adjacent"] + 798["SweepEdge Opposite"] + 799["SweepEdge Adjacent"] + 800["SweepEdge Opposite"] + 801["SweepEdge Adjacent"] + 802["SweepEdge Opposite"] + 803["SweepEdge Adjacent"] + 804["SweepEdge Opposite"] + 805["SweepEdge Adjacent"] + 806["SweepEdge Opposite"] + 807["SweepEdge Adjacent"] + 808["SweepEdge Opposite"] + 809["SweepEdge Adjacent"] + 810["SweepEdge Opposite"] + 811["SweepEdge Adjacent"] + 812["SweepEdge Opposite"] + 813["SweepEdge Adjacent"] + 814["SweepEdge Opposite"] + 815["SweepEdge Adjacent"] + 816["SweepEdge Opposite"] + 817["SweepEdge Adjacent"] + 818["SweepEdge Opposite"] + 819["SweepEdge Adjacent"] + 820["SweepEdge Opposite"] + 821["SweepEdge Adjacent"] + 822["SweepEdge Opposite"] + 823["SweepEdge Adjacent"] + 824["SweepEdge Opposite"] + 825["SweepEdge Adjacent"] + 826["SweepEdge Opposite"] + 827["SweepEdge Adjacent"] + 828["SweepEdge Opposite"] + 829["SweepEdge Adjacent"] + 830["SweepEdge Opposite"] + 831["SweepEdge Adjacent"] + 832["SweepEdge Opposite"] + 833["SweepEdge Adjacent"] + 834["SweepEdge Opposite"] + 835["SweepEdge Adjacent"] + 836["SweepEdge Opposite"] + 837["SweepEdge Adjacent"] + 838["SweepEdge Opposite"] + 839["SweepEdge Adjacent"] + 840["SweepEdge Opposite"] + 841["SweepEdge Adjacent"] + 842["SweepEdge Opposite"] + 843["SweepEdge Adjacent"] + 844["SweepEdge Opposite"] + 845["SweepEdge Adjacent"] + 846["SweepEdge Opposite"] + 847["SweepEdge Adjacent"] + 848["SweepEdge Opposite"] + 849["SweepEdge Adjacent"] + 850["SweepEdge Opposite"] + 851["SweepEdge Adjacent"] + 852["SweepEdge Opposite"] + 853["SweepEdge Adjacent"] + 854["SweepEdge Opposite"] + 855["SweepEdge Adjacent"] + 856["SweepEdge Opposite"] + 857["SweepEdge Adjacent"] + 858["SweepEdge Opposite"] + 859["SweepEdge Adjacent"] + 860["SweepEdge Opposite"] + 861["SweepEdge Adjacent"] + 862["SweepEdge Opposite"] + 863["SweepEdge Adjacent"] + 864["SweepEdge Opposite"] + 865["SweepEdge Adjacent"] + 866["SweepEdge Opposite"] + 867["SweepEdge Adjacent"] + 868["SweepEdge Opposite"] + 869["SweepEdge Adjacent"] + 870["SweepEdge Opposite"] + 871["SweepEdge Adjacent"] + 872["SweepEdge Opposite"] + 873["SweepEdge Adjacent"] + 874["SweepEdge Opposite"] + 875["SweepEdge Adjacent"] + 876["SweepEdge Opposite"] + 877["SweepEdge Adjacent"] + 878["SweepEdge Opposite"] + 879["SweepEdge Adjacent"] + 880["SweepEdge Opposite"] + 881["SweepEdge Adjacent"] + 882["SweepEdge Opposite"] + 883["SweepEdge Adjacent"] + 884["SweepEdge Opposite"] + 885["SweepEdge Adjacent"] + 886["SweepEdge Opposite"] + 887["SweepEdge Adjacent"] + 888["SweepEdge Opposite"] + 889["SweepEdge Adjacent"] + 890["SweepEdge Opposite"] + 891["SweepEdge Adjacent"] + 892["SweepEdge Opposite"] + 893["SweepEdge Adjacent"] + 894["SweepEdge Opposite"] + 895["SweepEdge Adjacent"] + 896["SweepEdge Opposite"] + 897["SweepEdge Adjacent"] + 898["SweepEdge Opposite"] + 899["SweepEdge Adjacent"] + 900["SweepEdge Opposite"] + 901["SweepEdge Adjacent"] + 902["SweepEdge Opposite"] + 903["SweepEdge Adjacent"] + 904["SweepEdge Opposite"] + 905["SweepEdge Adjacent"] + 906["SweepEdge Opposite"] + 907["SweepEdge Adjacent"] + 908["SweepEdge Opposite"] + 909["SweepEdge Adjacent"] + 910["SweepEdge Opposite"] + 911["SweepEdge Adjacent"] + 912["SweepEdge Opposite"] + 913["SweepEdge Adjacent"] + 914["SweepEdge Opposite"] + 915["SweepEdge Adjacent"] + 916["SweepEdge Opposite"] + 917["SweepEdge Adjacent"] + 918["SweepEdge Opposite"] + 919["SweepEdge Adjacent"] + 920["SweepEdge Opposite"] + 921["SweepEdge Adjacent"] + 922["SweepEdge Opposite"] + 923["SweepEdge Adjacent"] + 924["SweepEdge Opposite"] + 925["SweepEdge Adjacent"] + 926["SweepEdge Opposite"] + 927["SweepEdge Adjacent"] + 928["SweepEdge Opposite"] + 929["SweepEdge Adjacent"] + 930["SweepEdge Opposite"] + 931["SweepEdge Adjacent"] + 932["SweepEdge Opposite"] + 933["SweepEdge Adjacent"] + 934["SweepEdge Opposite"] + 935["SweepEdge Adjacent"] + 936["SweepEdge Opposite"] + 937["SweepEdge Adjacent"] + 938["SweepEdge Opposite"] + 939["SweepEdge Adjacent"] + 940["SweepEdge Opposite"] + 941["SweepEdge Adjacent"] + 942["SweepEdge Opposite"] + 943["SweepEdge Adjacent"] + 944["SweepEdge Opposite"] + 945["SweepEdge Adjacent"] + 946["SweepEdge Opposite"] + 947["SweepEdge Adjacent"] + 948["SweepEdge Opposite"] + 949["SweepEdge Adjacent"] + 950["SweepEdge Opposite"] + 951["SweepEdge Adjacent"] + 952["SweepEdge Opposite"] + 953["SweepEdge Adjacent"] + 954["SweepEdge Opposite"] + 955["SweepEdge Adjacent"] + 956["SweepEdge Opposite"] + 957["SweepEdge Adjacent"] + 958["SweepEdge Opposite"] + 959["SweepEdge Adjacent"] + 960["SweepEdge Opposite"] + 961["SweepEdge Adjacent"] + 962["SweepEdge Opposite"] + 963["SweepEdge Adjacent"] + 964["SweepEdge Opposite"] + 965["SweepEdge Adjacent"] + 966["SweepEdge Opposite"] + 967["SweepEdge Adjacent"] + 968["SweepEdge Opposite"] + 969["SweepEdge Adjacent"] + 970["SweepEdge Opposite"] + 971["SweepEdge Adjacent"] + 972["SweepEdge Opposite"] + 973["SweepEdge Adjacent"] + 974["SweepEdge Opposite"] + 975["SweepEdge Adjacent"] + 976["SweepEdge Opposite"] + 977["SweepEdge Adjacent"] + 978["SweepEdge Opposite"] + 979["SweepEdge Adjacent"] + 980["SweepEdge Opposite"] + 981["SweepEdge Adjacent"] + 982["SweepEdge Opposite"] + 983["SweepEdge Adjacent"] + 984["SweepEdge Opposite"] + 985["SweepEdge Adjacent"] + 986["SweepEdge Opposite"] + 987["SweepEdge Adjacent"] + 988["SweepEdge Opposite"] + 989["SweepEdge Adjacent"] + 990["SweepEdge Opposite"] + 991["SweepEdge Adjacent"] + 992["SweepEdge Opposite"] + 993["SweepEdge Adjacent"] + 994["SweepEdge Opposite"] + 995["SweepEdge Adjacent"] + 996["SweepEdge Opposite"] + 997["SweepEdge Adjacent"] + 998["SweepEdge Opposite"] + 999["SweepEdge Adjacent"] + 1000["SweepEdge Opposite"] + 1001["SweepEdge Adjacent"] + 1002["SweepEdge Opposite"] + 1003["SweepEdge Adjacent"] + 1004["SweepEdge Opposite"] + 1005["SweepEdge Adjacent"] + 1006["SweepEdge Opposite"] + 1007["SweepEdge Adjacent"] + 1008["SweepEdge Opposite"] + 1009["SweepEdge Adjacent"] + 1010["SweepEdge Opposite"] + 1011["SweepEdge Adjacent"] + 1012["SweepEdge Opposite"] + 1013["SweepEdge Adjacent"] + 1014["SweepEdge Opposite"] + 1015["SweepEdge Adjacent"] + 1016["SweepEdge Opposite"] + 1017["SweepEdge Adjacent"] + 1018["SweepEdge Opposite"] + 1019["SweepEdge Adjacent"] + 1020["SweepEdge Opposite"] + 1021["SweepEdge Adjacent"] + 1022["SweepEdge Opposite"] + 1023["SweepEdge Adjacent"] + 1024["SweepEdge Opposite"] + 1025["SweepEdge Adjacent"] + 1026["SweepEdge Opposite"] + 1027["SweepEdge Adjacent"] + 1028["SweepEdge Opposite"] + 1029["SweepEdge Adjacent"] + 1030["SweepEdge Opposite"] + 1031["SweepEdge Adjacent"] + 1032["SweepEdge Opposite"] + 1033["SweepEdge Adjacent"] + 1034["SweepEdge Opposite"] + 1035["SweepEdge Adjacent"] + 1036["SweepEdge Opposite"] + 1037["SweepEdge Adjacent"] + 1038["SweepEdge Opposite"] + 1039["SweepEdge Adjacent"] + 1040["SweepEdge Opposite"] + 1041["SweepEdge Adjacent"] + 1042["SweepEdge Opposite"] + 1043["SweepEdge Adjacent"] + 1044["SweepEdge Opposite"] + 1045["SweepEdge Adjacent"] + 1046["SweepEdge Opposite"] + 1047["SweepEdge Adjacent"] + 1048["SweepEdge Opposite"] + 1049["SweepEdge Adjacent"] + 1050["SweepEdge Opposite"] + 1051["SweepEdge Adjacent"] + 1052["SweepEdge Opposite"] + 1053["SweepEdge Adjacent"] + 1054["SweepEdge Opposite"] + 1055["SweepEdge Adjacent"] + 1056["SweepEdge Opposite"] + 1057["SweepEdge Adjacent"] + 1058["SweepEdge Opposite"] + 1059["SweepEdge Adjacent"] + 1060["SweepEdge Opposite"] + 1061["SweepEdge Adjacent"] + 1062["SweepEdge Opposite"] + 1063["SweepEdge Adjacent"] + 1064["SweepEdge Opposite"] + 1065["SweepEdge Adjacent"] + 1066["SweepEdge Opposite"] + 1067["SweepEdge Adjacent"] + 1068["SweepEdge Opposite"] + 1069["SweepEdge Adjacent"] + 1070["SweepEdge Opposite"] + 1071["SweepEdge Adjacent"] + 1072["SweepEdge Opposite"] + 1073["SweepEdge Adjacent"] + 1074["SweepEdge Opposite"] + 1075["SweepEdge Adjacent"] + 1076["SweepEdge Opposite"] + 1077["SweepEdge Adjacent"] + 1078["SweepEdge Opposite"] + 1079["SweepEdge Adjacent"] + 1080["SweepEdge Opposite"] + 1081["SweepEdge Adjacent"] + 1082["SweepEdge Opposite"] + 1083["SweepEdge Adjacent"] + 1084["SweepEdge Opposite"] + 1085["SweepEdge Adjacent"] + 1086["SweepEdge Opposite"] + 1087["SweepEdge Adjacent"] + 1088["SweepEdge Opposite"] + 1089["SweepEdge Adjacent"] + 1090["SweepEdge Opposite"] + 1091["SweepEdge Adjacent"] + 1092["SweepEdge Opposite"] + 1093["SweepEdge Adjacent"] + 1094["SweepEdge Opposite"] + 1095["SweepEdge Adjacent"] + 1096["SweepEdge Opposite"] + 1097["SweepEdge Adjacent"] + 1098["SweepEdge Opposite"] + 1099["SweepEdge Adjacent"] + 1100["SweepEdge Opposite"] + 1101["SweepEdge Adjacent"] + 1102["SweepEdge Opposite"] + 1103["SweepEdge Adjacent"] + 1104["SweepEdge Opposite"] + 1105["SweepEdge Adjacent"] + 1106["SweepEdge Opposite"] + 1107["SweepEdge Adjacent"] + 1108["SweepEdge Opposite"] + 1109["SweepEdge Adjacent"] + 1110["SweepEdge Opposite"] + 1111["SweepEdge Adjacent"] + 1112["SweepEdge Opposite"] + 1113["SweepEdge Adjacent"] + 1114["SweepEdge Opposite"] + 1115["SweepEdge Adjacent"] + 1116["SweepEdge Opposite"] + 1117["SweepEdge Adjacent"] + 1118["SweepEdge Opposite"] + 1119["SweepEdge Adjacent"] + 1120["SweepEdge Opposite"] + 1121["SweepEdge Adjacent"] + 1122["SweepEdge Opposite"] + 1123["SweepEdge Adjacent"] + 1124["SweepEdge Opposite"] + 1125["SweepEdge Adjacent"] + 1126["SweepEdge Opposite"] + 1127["SweepEdge Adjacent"] + 1128["SweepEdge Opposite"] + 1129["SweepEdge Adjacent"] + 1130["SweepEdge Opposite"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 --- 11 + 2 --- 12 + 2 --- 13 + 2 --- 14 + 2 --- 15 + 2 --- 16 + 2 --- 17 + 2 --- 18 + 2 --- 19 + 2 --- 20 + 2 --- 21 + 2 --- 22 + 2 --- 23 + 2 --- 24 + 2 --- 25 + 2 --- 26 + 2 --- 27 + 2 --- 28 + 2 --- 29 + 2 --- 30 + 2 --- 31 + 2 --- 32 + 2 --- 33 + 2 --- 34 + 2 --- 35 + 2 --- 36 + 2 --- 37 + 2 --- 38 + 2 --- 39 + 2 --- 40 + 2 --- 41 + 2 --- 42 + 2 --- 43 + 2 --- 44 + 2 --- 45 + 2 --- 46 + 2 --- 47 + 2 --- 48 + 2 --- 49 + 2 --- 50 + 2 --- 51 + 2 --- 52 + 2 --- 53 + 2 --- 54 + 2 --- 55 + 2 --- 56 + 2 --- 57 + 2 --- 58 + 2 --- 59 + 2 --- 60 + 2 --- 61 + 2 --- 62 + 2 --- 63 + 2 --- 64 + 2 --- 65 + 2 --- 66 + 2 --- 67 + 2 --- 68 + 2 --- 69 + 2 --- 70 + 2 --- 71 + 2 --- 72 + 2 --- 73 + 2 --- 74 + 2 --- 75 + 2 --- 76 + 2 --- 77 + 2 --- 78 + 2 --- 79 + 2 --- 80 + 2 --- 81 + 2 --- 82 + 2 --- 83 + 2 --- 84 + 2 --- 85 + 2 --- 86 + 2 --- 87 + 2 --- 88 + 2 --- 89 + 2 --- 90 + 2 --- 91 + 2 --- 92 + 2 --- 93 + 2 --- 94 + 2 --- 95 + 2 --- 96 + 2 --- 97 + 2 --- 98 + 2 --- 99 + 2 --- 100 + 2 --- 101 + 2 --- 102 + 2 --- 103 + 2 --- 104 + 2 --- 105 + 2 --- 106 + 2 --- 107 + 2 --- 108 + 2 --- 109 + 2 --- 110 + 2 --- 111 + 2 --- 112 + 2 --- 113 + 2 --- 114 + 2 --- 115 + 2 --- 116 + 2 --- 117 + 2 --- 118 + 2 --- 119 + 2 --- 120 + 2 --- 121 + 2 --- 122 + 2 --- 123 + 2 --- 124 + 2 --- 125 + 2 --- 126 + 2 --- 127 + 2 --- 128 + 2 --- 129 + 2 --- 130 + 2 --- 131 + 2 --- 132 + 2 --- 133 + 2 --- 134 + 2 --- 135 + 2 --- 136 + 2 --- 137 + 2 --- 138 + 2 --- 139 + 2 --- 140 + 2 --- 141 + 2 --- 142 + 2 --- 143 + 2 --- 144 + 2 --- 145 + 2 --- 146 + 2 --- 147 + 2 --- 148 + 2 --- 149 + 2 --- 150 + 2 --- 151 + 2 --- 152 + 2 --- 153 + 2 --- 154 + 2 --- 155 + 2 --- 156 + 2 --- 157 + 2 --- 158 + 2 --- 159 + 2 --- 160 + 2 --- 161 + 2 --- 162 + 2 --- 163 + 2 --- 164 + 2 --- 165 + 2 --- 166 + 2 --- 167 + 2 --- 168 + 2 --- 169 + 2 --- 170 + 2 --- 171 + 2 --- 172 + 2 --- 173 + 2 --- 174 + 2 --- 175 + 2 --- 176 + 2 --- 177 + 2 --- 178 + 2 --- 179 + 2 --- 180 + 2 --- 181 + 2 --- 182 + 2 --- 183 + 2 --- 184 + 2 --- 185 + 2 --- 186 + 2 --- 187 + 2 --- 188 + 2 --- 189 + 2 --- 190 + 2 --- 191 + 2 --- 192 + 2 --- 193 + 2 --- 194 + 2 --- 195 + 2 --- 196 + 2 --- 197 + 2 --- 198 + 2 --- 199 + 2 --- 200 + 2 --- 201 + 2 --- 202 + 2 --- 203 + 2 --- 204 + 2 --- 205 + 2 --- 206 + 2 --- 207 + 2 --- 208 + 2 --- 209 + 2 --- 210 + 2 --- 211 + 2 --- 212 + 2 --- 213 + 2 --- 214 + 2 --- 215 + 2 --- 216 + 2 --- 217 + 2 --- 218 + 2 --- 219 + 2 --- 220 + 2 --- 221 + 2 --- 222 + 2 --- 223 + 2 --- 224 + 2 --- 225 + 2 --- 226 + 2 --- 227 + 2 --- 228 + 2 --- 229 + 2 --- 230 + 2 --- 231 + 2 --- 232 + 2 --- 233 + 2 --- 234 + 2 --- 235 + 2 --- 236 + 2 --- 237 + 2 --- 238 + 2 --- 239 + 2 --- 240 + 2 --- 241 + 2 --- 242 + 2 --- 243 + 2 --- 244 + 2 --- 245 + 2 --- 246 + 2 --- 247 + 2 --- 248 + 2 --- 249 + 2 --- 250 + 2 --- 251 + 2 --- 252 + 2 --- 253 + 2 --- 254 + 2 --- 255 + 2 --- 256 + 2 --- 257 + 2 --- 258 + 2 --- 259 + 2 --- 260 + 2 --- 261 + 2 --- 262 + 2 --- 263 + 2 --- 264 + 2 --- 265 + 2 --- 266 + 2 --- 267 + 2 --- 268 + 2 --- 269 + 2 --- 270 + 2 --- 271 + 2 --- 272 + 2 --- 273 + 2 --- 274 + 2 --- 275 + 2 --- 276 + 2 --- 277 + 2 --- 278 + 2 --- 279 + 2 --- 280 + 2 --- 281 + 2 --- 282 + 2 --- 283 + 2 --- 284 + 2 ---- 286 + 2 --- 285 + 3 --- 567 + 3 --- 1130 + 3 --- 571 + 4 --- 566 + 4 --- 1128 + 4 --- 1129 + 5 --- 565 + 5 --- 1126 + 5 --- 1127 + 6 --- 564 + 6 --- 1124 + 6 --- 1125 + 7 --- 563 + 7 --- 1122 + 7 --- 1123 + 8 --- 562 + 8 --- 1120 + 8 --- 1121 + 9 --- 561 + 9 --- 1118 + 9 --- 1119 + 10 --- 560 + 10 --- 1116 + 10 --- 1117 + 11 --- 559 + 11 --- 1114 + 11 --- 1115 + 12 --- 558 + 12 --- 1112 + 12 --- 1113 + 13 --- 557 + 13 --- 1110 + 13 --- 1111 + 14 --- 556 + 14 --- 1108 + 14 --- 1109 + 15 --- 555 + 15 --- 1106 + 15 --- 1107 + 16 --- 554 + 16 --- 1104 + 16 --- 1105 + 17 --- 553 + 17 --- 1102 + 17 --- 1103 + 18 --- 552 + 18 --- 1100 + 18 --- 1101 + 19 --- 551 + 19 --- 1098 + 19 --- 1099 + 20 --- 550 + 20 --- 1096 + 20 --- 1097 + 21 --- 549 + 21 --- 1094 + 21 --- 1095 + 22 --- 548 + 22 --- 1092 + 22 --- 1093 + 23 --- 547 + 23 --- 1090 + 23 --- 1091 + 24 --- 546 + 24 --- 1088 + 24 --- 1089 + 25 --- 545 + 25 --- 1086 + 25 --- 1087 + 26 --- 544 + 26 --- 1084 + 26 --- 1085 + 27 --- 543 + 27 --- 1082 + 27 --- 1083 + 28 --- 542 + 28 --- 1080 + 28 --- 1081 + 29 --- 541 + 29 --- 1078 + 29 --- 1079 + 30 --- 540 + 30 --- 1076 + 30 --- 1077 + 31 --- 539 + 31 --- 1074 + 31 --- 1075 + 32 --- 538 + 32 --- 1072 + 32 --- 1073 + 33 --- 537 + 33 --- 1070 + 33 --- 1071 + 34 --- 536 + 34 --- 1068 + 34 --- 1069 + 35 --- 535 + 35 --- 1066 + 35 --- 1067 + 36 --- 534 + 36 --- 1064 + 36 --- 1065 + 37 --- 533 + 37 --- 1062 + 37 --- 1063 + 38 --- 532 + 38 --- 1060 + 38 --- 1061 + 39 --- 531 + 39 --- 1058 + 39 --- 1059 + 40 --- 530 + 40 --- 1056 + 40 --- 1057 + 41 --- 529 + 41 --- 1054 + 41 --- 1055 + 42 --- 528 + 42 --- 1052 + 42 --- 1053 + 43 --- 527 + 43 --- 1050 + 43 --- 1051 + 44 --- 526 + 44 --- 1048 + 44 --- 1049 + 45 --- 525 + 45 --- 1046 + 45 --- 1047 + 46 --- 524 + 46 --- 1044 + 46 --- 1045 + 47 --- 523 + 47 --- 1042 + 47 --- 1043 + 48 --- 522 + 48 --- 1040 + 48 --- 1041 + 49 --- 521 + 49 --- 1038 + 49 --- 1039 + 50 --- 520 + 50 --- 1036 + 50 --- 1037 + 51 --- 519 + 51 --- 1034 + 51 --- 1035 + 52 --- 518 + 52 --- 1032 + 52 --- 1033 + 53 --- 517 + 53 --- 1030 + 53 --- 1031 + 54 --- 516 + 54 --- 1028 + 54 --- 1029 + 55 --- 515 + 55 --- 1026 + 55 --- 1027 + 56 --- 514 + 56 --- 1024 + 56 --- 1025 + 57 --- 513 + 57 --- 1022 + 57 --- 1023 + 58 --- 512 + 58 --- 1020 + 58 --- 1021 + 59 --- 511 + 59 --- 1018 + 59 --- 1019 + 60 --- 510 + 60 --- 1016 + 60 --- 1017 + 61 --- 509 + 61 --- 1014 + 61 --- 1015 + 62 --- 508 + 62 --- 1012 + 62 --- 1013 + 63 --- 507 + 63 --- 1010 + 63 --- 1011 + 64 --- 506 + 64 --- 1008 + 64 --- 1009 + 65 --- 505 + 65 --- 1006 + 65 --- 1007 + 66 --- 504 + 66 --- 1004 + 66 --- 1005 + 67 --- 503 + 67 --- 1002 + 67 --- 1003 + 68 --- 502 + 68 --- 1000 + 68 --- 1001 + 69 --- 501 + 69 --- 998 + 69 --- 999 + 70 --- 500 + 70 --- 996 + 70 --- 997 + 71 --- 499 + 71 --- 994 + 71 --- 995 + 72 --- 498 + 72 --- 992 + 72 --- 993 + 73 --- 497 + 73 --- 990 + 73 --- 991 + 74 --- 496 + 74 --- 988 + 74 --- 989 + 75 --- 495 + 75 --- 986 + 75 --- 987 + 76 --- 494 + 76 --- 984 + 76 --- 985 + 77 --- 493 + 77 --- 982 + 77 --- 983 + 78 --- 492 + 78 --- 980 + 78 --- 981 + 79 --- 491 + 79 --- 978 + 79 --- 979 + 80 --- 490 + 80 --- 976 + 80 --- 977 + 81 --- 489 + 81 --- 974 + 81 --- 975 + 82 --- 488 + 82 --- 972 + 82 --- 973 + 83 --- 487 + 83 --- 970 + 83 --- 971 + 84 --- 486 + 84 --- 968 + 84 --- 969 + 85 --- 485 + 85 --- 966 + 85 --- 967 + 86 --- 484 + 86 --- 964 + 86 --- 965 + 87 --- 483 + 87 --- 962 + 87 --- 963 + 88 --- 482 + 88 --- 960 + 88 --- 961 + 89 --- 481 + 89 --- 958 + 89 --- 959 + 90 --- 480 + 90 --- 956 + 90 --- 957 + 91 --- 479 + 91 --- 954 + 91 --- 955 + 92 --- 478 + 92 --- 952 + 92 --- 953 + 93 --- 477 + 93 --- 950 + 93 --- 951 + 94 --- 476 + 94 --- 948 + 94 --- 949 + 95 --- 475 + 95 --- 946 + 95 --- 947 + 96 --- 474 + 96 --- 944 + 96 --- 945 + 97 --- 473 + 97 --- 942 + 97 --- 943 + 98 --- 472 + 98 --- 940 + 98 --- 941 + 99 --- 471 + 99 --- 938 + 99 --- 939 + 100 --- 470 + 100 --- 936 + 100 --- 937 + 101 --- 469 + 101 --- 934 + 101 --- 935 + 102 --- 468 + 102 --- 932 + 102 --- 933 + 103 --- 467 + 103 --- 930 + 103 --- 931 + 104 --- 466 + 104 --- 928 + 104 --- 929 + 105 --- 465 + 105 --- 926 + 105 --- 927 + 106 --- 464 + 106 --- 924 + 106 --- 925 + 107 --- 463 + 107 --- 922 + 107 --- 923 + 108 --- 462 + 108 --- 920 + 108 --- 921 + 109 --- 461 + 109 --- 918 + 109 --- 919 + 110 --- 460 + 110 --- 916 + 110 --- 917 + 111 --- 459 + 111 --- 914 + 111 --- 915 + 112 --- 458 + 112 --- 912 + 112 --- 913 + 113 --- 457 + 113 --- 910 + 113 --- 911 + 114 --- 456 + 114 --- 908 + 114 --- 909 + 115 --- 455 + 115 --- 906 + 115 --- 907 + 116 --- 454 + 116 --- 904 + 116 --- 905 + 117 --- 453 + 117 --- 902 + 117 --- 903 + 118 --- 452 + 118 --- 900 + 118 --- 901 + 120 --- 451 + 120 --- 898 + 120 --- 899 + 121 --- 450 + 121 --- 896 + 121 --- 897 + 122 --- 449 + 122 --- 894 + 122 --- 895 + 123 --- 448 + 123 --- 892 + 123 --- 893 + 124 --- 447 + 124 --- 890 + 124 --- 891 + 125 --- 446 + 125 --- 888 + 125 --- 889 + 126 --- 445 + 126 --- 886 + 126 --- 887 + 127 --- 444 + 127 --- 884 + 127 --- 885 + 128 --- 443 + 128 --- 882 + 128 --- 883 + 129 --- 442 + 129 --- 880 + 129 --- 881 + 130 --- 441 + 130 --- 878 + 130 --- 879 + 131 --- 440 + 131 --- 876 + 131 --- 877 + 132 --- 439 + 132 --- 874 + 132 --- 875 + 133 --- 438 + 133 --- 872 + 133 --- 873 + 134 --- 437 + 134 --- 870 + 134 --- 871 + 135 --- 436 + 135 --- 868 + 135 --- 869 + 136 --- 435 + 136 --- 866 + 136 --- 867 + 137 --- 434 + 137 --- 864 + 137 --- 865 + 138 --- 433 + 138 --- 862 + 138 --- 863 + 139 --- 432 + 139 --- 860 + 139 --- 861 + 140 --- 431 + 140 --- 858 + 140 --- 859 + 141 --- 430 + 141 --- 856 + 141 --- 857 + 142 --- 429 + 142 --- 854 + 142 --- 855 + 143 --- 428 + 143 --- 852 + 143 --- 853 + 144 --- 427 + 144 --- 850 + 144 --- 851 + 145 --- 426 + 145 --- 848 + 145 --- 849 + 146 --- 425 + 146 --- 846 + 146 --- 847 + 147 --- 424 + 147 --- 844 + 147 --- 845 + 148 --- 423 + 148 --- 842 + 148 --- 843 + 149 --- 422 + 149 --- 840 + 149 --- 841 + 150 --- 421 + 150 --- 838 + 150 --- 839 + 151 --- 420 + 151 --- 836 + 151 --- 837 + 152 --- 419 + 152 --- 834 + 152 --- 835 + 153 --- 418 + 153 --- 832 + 153 --- 833 + 154 --- 417 + 154 --- 830 + 154 --- 831 + 155 --- 416 + 155 --- 828 + 155 --- 829 + 156 --- 415 + 156 --- 826 + 156 --- 827 + 157 --- 414 + 157 --- 824 + 157 --- 825 + 158 --- 413 + 158 --- 822 + 158 --- 823 + 159 --- 412 + 159 --- 820 + 159 --- 821 + 160 --- 411 + 160 --- 818 + 160 --- 819 + 161 --- 410 + 161 --- 816 + 161 --- 817 + 162 --- 409 + 162 --- 814 + 162 --- 815 + 163 --- 408 + 163 --- 812 + 163 --- 813 + 164 --- 407 + 164 --- 810 + 164 --- 811 + 165 --- 406 + 165 --- 808 + 165 --- 809 + 166 --- 405 + 166 --- 806 + 166 --- 807 + 167 --- 404 + 167 --- 804 + 167 --- 805 + 168 --- 403 + 168 --- 802 + 168 --- 803 + 169 --- 402 + 169 --- 800 + 169 --- 801 + 170 --- 401 + 170 --- 798 + 170 --- 799 + 171 --- 400 + 171 --- 796 + 171 --- 797 + 172 --- 399 + 172 --- 794 + 172 --- 795 + 173 --- 398 + 173 --- 792 + 173 --- 793 + 174 --- 397 + 174 --- 790 + 174 --- 791 + 175 --- 396 + 175 --- 788 + 175 --- 789 + 176 --- 395 + 176 --- 786 + 176 --- 787 + 177 --- 394 + 177 --- 784 + 177 --- 785 + 178 --- 393 + 178 --- 782 + 178 --- 783 + 179 --- 392 + 179 --- 780 + 179 --- 781 + 180 --- 391 + 180 --- 778 + 180 --- 779 + 181 --- 390 + 181 --- 776 + 181 --- 777 + 182 --- 389 + 182 --- 774 + 182 --- 775 + 183 --- 388 + 183 --- 772 + 183 --- 773 + 184 --- 387 + 184 --- 770 + 184 --- 771 + 185 --- 386 + 185 --- 768 + 185 --- 769 + 186 --- 385 + 186 --- 766 + 186 --- 767 + 187 --- 384 + 187 --- 764 + 187 --- 765 + 188 --- 383 + 188 --- 762 + 188 --- 763 + 189 --- 382 + 189 --- 760 + 189 --- 761 + 190 --- 381 + 190 --- 758 + 190 --- 759 + 191 --- 380 + 191 --- 756 + 191 --- 757 + 192 --- 379 + 192 --- 754 + 192 --- 755 + 193 --- 378 + 193 --- 752 + 193 --- 753 + 194 --- 377 + 194 --- 750 + 194 --- 751 + 195 --- 376 + 195 --- 748 + 195 --- 749 + 196 --- 375 + 196 --- 746 + 196 --- 747 + 197 --- 374 + 197 --- 744 + 197 --- 745 + 198 --- 373 + 198 --- 742 + 198 --- 743 + 199 --- 372 + 199 --- 740 + 199 --- 741 + 200 --- 371 + 200 --- 738 + 200 --- 739 + 201 --- 370 + 201 --- 736 + 201 --- 737 + 202 --- 369 + 202 --- 734 + 202 --- 735 + 203 --- 368 + 203 --- 732 + 203 --- 733 + 204 --- 367 + 204 --- 730 + 204 --- 731 + 205 --- 366 + 205 --- 728 + 205 --- 729 + 206 --- 365 + 206 --- 726 + 206 --- 727 + 207 --- 364 + 207 --- 724 + 207 --- 725 + 208 --- 363 + 208 --- 722 + 208 --- 723 + 209 --- 362 + 209 --- 720 + 209 --- 721 + 210 --- 361 + 210 --- 718 + 210 --- 719 + 211 --- 360 + 211 --- 716 + 211 --- 717 + 212 --- 359 + 212 --- 714 + 212 --- 715 + 213 --- 358 + 213 --- 712 + 213 --- 713 + 214 --- 357 + 214 --- 710 + 214 --- 711 + 215 --- 356 + 215 --- 708 + 215 --- 709 + 216 --- 355 + 216 --- 706 + 216 --- 707 + 217 --- 354 + 217 --- 704 + 217 --- 705 + 218 --- 353 + 218 --- 702 + 218 --- 703 + 219 --- 352 + 219 --- 700 + 219 --- 701 + 220 --- 351 + 220 --- 698 + 220 --- 699 + 221 --- 350 + 221 --- 696 + 221 --- 697 + 222 --- 349 + 222 --- 694 + 222 --- 695 + 223 --- 348 + 223 --- 692 + 223 --- 693 + 224 --- 347 + 224 --- 690 + 224 --- 691 + 225 --- 346 + 225 --- 688 + 225 --- 689 + 226 --- 345 + 226 --- 686 + 226 --- 687 + 227 --- 344 + 227 --- 684 + 227 --- 685 + 228 --- 343 + 228 --- 682 + 228 --- 683 + 229 --- 342 + 229 --- 680 + 229 --- 681 + 230 --- 341 + 230 --- 678 + 230 --- 679 + 231 --- 340 + 231 --- 676 + 231 --- 677 + 232 --- 339 + 232 --- 674 + 232 --- 675 + 233 --- 338 + 233 --- 672 + 233 --- 673 + 234 --- 337 + 234 --- 670 + 234 --- 671 + 235 --- 336 + 235 --- 668 + 235 --- 669 + 236 --- 335 + 236 --- 666 + 236 --- 667 + 237 --- 334 + 237 --- 664 + 237 --- 665 + 238 --- 333 + 238 --- 662 + 238 --- 663 + 239 --- 332 + 239 --- 660 + 239 --- 661 + 240 --- 331 + 240 --- 658 + 240 --- 659 + 241 --- 330 + 241 --- 656 + 241 --- 657 + 242 --- 329 + 242 --- 654 + 242 --- 655 + 243 --- 328 + 243 --- 652 + 243 --- 653 + 244 --- 327 + 244 --- 650 + 244 --- 651 + 245 --- 326 + 245 --- 648 + 245 --- 649 + 246 --- 325 + 246 --- 646 + 246 --- 647 + 247 --- 324 + 247 --- 644 + 247 --- 645 + 248 --- 323 + 248 --- 642 + 248 --- 643 + 249 --- 322 + 249 --- 640 + 249 --- 641 + 250 --- 321 + 250 --- 638 + 250 --- 639 + 251 --- 320 + 251 --- 636 + 251 --- 637 + 252 --- 319 + 252 --- 634 + 252 --- 635 + 253 --- 318 + 253 --- 632 + 253 --- 633 + 254 --- 317 + 254 --- 630 + 254 --- 631 + 255 --- 316 + 255 --- 628 + 255 --- 629 + 256 --- 315 + 256 --- 626 + 256 --- 627 + 257 --- 314 + 257 --- 624 + 257 --- 625 + 258 --- 313 + 258 --- 622 + 258 --- 623 + 259 --- 312 + 259 --- 620 + 259 --- 621 + 260 --- 311 + 260 --- 618 + 260 --- 619 + 261 --- 310 + 261 --- 616 + 261 --- 617 + 262 --- 309 + 262 --- 614 + 262 --- 615 + 263 --- 308 + 263 --- 612 + 263 --- 613 + 264 --- 307 + 264 --- 610 + 264 --- 611 + 265 --- 306 + 265 --- 608 + 265 --- 609 + 266 --- 305 + 266 --- 606 + 266 --- 607 + 267 --- 304 + 267 --- 604 + 267 --- 605 + 268 --- 303 + 268 --- 602 + 268 --- 603 + 269 --- 302 + 269 --- 600 + 269 --- 601 + 270 --- 301 + 270 --- 598 + 270 --- 599 + 271 --- 300 + 271 --- 596 + 271 --- 597 + 272 --- 299 + 272 --- 594 + 272 --- 595 + 273 --- 298 + 273 --- 592 + 273 --- 593 + 274 --- 297 + 274 --- 590 + 274 --- 591 + 275 --- 296 + 275 --- 588 + 275 --- 589 + 276 --- 295 + 276 --- 586 + 276 --- 587 + 277 --- 294 + 277 --- 584 + 277 --- 585 + 278 --- 293 + 278 --- 582 + 278 --- 583 + 279 --- 292 + 279 --- 580 + 279 --- 581 + 280 --- 291 + 280 --- 578 + 280 --- 579 + 281 --- 290 + 281 --- 576 + 281 --- 577 + 282 --- 289 + 282 --- 574 + 282 --- 575 + 283 --- 288 + 283 --- 572 + 283 --- 573 + 284 --- 287 + 284 --- 570 + 284 x--> 571 + 286 --- 287 + 286 --- 288 + 286 --- 289 + 286 --- 290 + 286 --- 291 + 286 --- 292 + 286 --- 293 + 286 --- 294 + 286 --- 295 + 286 --- 296 + 286 --- 297 + 286 --- 298 + 286 --- 299 + 286 --- 300 + 286 --- 301 + 286 --- 302 + 286 --- 303 + 286 --- 304 + 286 --- 305 + 286 --- 306 + 286 --- 307 + 286 --- 308 + 286 --- 309 + 286 --- 310 + 286 --- 311 + 286 --- 312 + 286 --- 313 + 286 --- 314 + 286 --- 315 + 286 --- 316 + 286 --- 317 + 286 --- 318 + 286 --- 319 + 286 --- 320 + 286 --- 321 + 286 --- 322 + 286 --- 323 + 286 --- 324 + 286 --- 325 + 286 --- 326 + 286 --- 327 + 286 --- 328 + 286 --- 329 + 286 --- 330 + 286 --- 331 + 286 --- 332 + 286 --- 333 + 286 --- 334 + 286 --- 335 + 286 --- 336 + 286 --- 337 + 286 --- 338 + 286 --- 339 + 286 --- 340 + 286 --- 341 + 286 --- 342 + 286 --- 343 + 286 --- 344 + 286 --- 345 + 286 --- 346 + 286 --- 347 + 286 --- 348 + 286 --- 349 + 286 --- 350 + 286 --- 351 + 286 --- 352 + 286 --- 353 + 286 --- 354 + 286 --- 355 + 286 --- 356 + 286 --- 357 + 286 --- 358 + 286 --- 359 + 286 --- 360 + 286 --- 361 + 286 --- 362 + 286 --- 363 + 286 --- 364 + 286 --- 365 + 286 --- 366 + 286 --- 367 + 286 --- 368 + 286 --- 369 + 286 --- 370 + 286 --- 371 + 286 --- 372 + 286 --- 373 + 286 --- 374 + 286 --- 375 + 286 --- 376 + 286 --- 377 + 286 --- 378 + 286 --- 379 + 286 --- 380 + 286 --- 381 + 286 --- 382 + 286 --- 383 + 286 --- 384 + 286 --- 385 + 286 --- 386 + 286 --- 387 + 286 --- 388 + 286 --- 389 + 286 --- 390 + 286 --- 391 + 286 --- 392 + 286 --- 393 + 286 --- 394 + 286 --- 395 + 286 --- 396 + 286 --- 397 + 286 --- 398 + 286 --- 399 + 286 --- 400 + 286 --- 401 + 286 --- 402 + 286 --- 403 + 286 --- 404 + 286 --- 405 + 286 --- 406 + 286 --- 407 + 286 --- 408 + 286 --- 409 + 286 --- 410 + 286 --- 411 + 286 --- 412 + 286 --- 413 + 286 --- 414 + 286 --- 415 + 286 --- 416 + 286 --- 417 + 286 --- 418 + 286 --- 419 + 286 --- 420 + 286 --- 421 + 286 --- 422 + 286 --- 423 + 286 --- 424 + 286 --- 425 + 286 --- 426 + 286 --- 427 + 286 --- 428 + 286 --- 429 + 286 --- 430 + 286 --- 431 + 286 --- 432 + 286 --- 433 + 286 --- 434 + 286 --- 435 + 286 --- 436 + 286 --- 437 + 286 --- 438 + 286 --- 439 + 286 --- 440 + 286 --- 441 + 286 --- 442 + 286 --- 443 + 286 --- 444 + 286 --- 445 + 286 --- 446 + 286 --- 447 + 286 --- 448 + 286 --- 449 + 286 --- 450 + 286 --- 451 + 286 --- 452 + 286 --- 453 + 286 --- 454 + 286 --- 455 + 286 --- 456 + 286 --- 457 + 286 --- 458 + 286 --- 459 + 286 --- 460 + 286 --- 461 + 286 --- 462 + 286 --- 463 + 286 --- 464 + 286 --- 465 + 286 --- 466 + 286 --- 467 + 286 --- 468 + 286 --- 469 + 286 --- 470 + 286 --- 471 + 286 --- 472 + 286 --- 473 + 286 --- 474 + 286 --- 475 + 286 --- 476 + 286 --- 477 + 286 --- 478 + 286 --- 479 + 286 --- 480 + 286 --- 481 + 286 --- 482 + 286 --- 483 + 286 --- 484 + 286 --- 485 + 286 --- 486 + 286 --- 487 + 286 --- 488 + 286 --- 489 + 286 --- 490 + 286 --- 491 + 286 --- 492 + 286 --- 493 + 286 --- 494 + 286 --- 495 + 286 --- 496 + 286 --- 497 + 286 --- 498 + 286 --- 499 + 286 --- 500 + 286 --- 501 + 286 --- 502 + 286 --- 503 + 286 --- 504 + 286 --- 505 + 286 --- 506 + 286 --- 507 + 286 --- 508 + 286 --- 509 + 286 --- 510 + 286 --- 511 + 286 --- 512 + 286 --- 513 + 286 --- 514 + 286 --- 515 + 286 --- 516 + 286 --- 517 + 286 --- 518 + 286 --- 519 + 286 --- 520 + 286 --- 521 + 286 --- 522 + 286 --- 523 + 286 --- 524 + 286 --- 525 + 286 --- 526 + 286 --- 527 + 286 --- 528 + 286 --- 529 + 286 --- 530 + 286 --- 531 + 286 --- 532 + 286 --- 533 + 286 --- 534 + 286 --- 535 + 286 --- 536 + 286 --- 537 + 286 --- 538 + 286 --- 539 + 286 --- 540 + 286 --- 541 + 286 --- 542 + 286 --- 543 + 286 --- 544 + 286 --- 545 + 286 --- 546 + 286 --- 547 + 286 --- 548 + 286 --- 549 + 286 --- 550 + 286 --- 551 + 286 --- 552 + 286 --- 553 + 286 --- 554 + 286 --- 555 + 286 --- 556 + 286 --- 557 + 286 --- 558 + 286 --- 559 + 286 --- 560 + 286 --- 561 + 286 --- 562 + 286 --- 563 + 286 --- 564 + 286 --- 565 + 286 --- 566 + 286 --- 567 + 286 --- 568 + 286 --- 569 + 286 --- 570 + 286 --- 571 + 286 --- 572 + 286 --- 573 + 286 --- 574 + 286 --- 575 + 286 --- 576 + 286 --- 577 + 286 --- 578 + 286 --- 579 + 286 --- 580 + 286 --- 581 + 286 --- 582 + 286 --- 583 + 286 --- 584 + 286 --- 585 + 286 --- 586 + 286 --- 587 + 286 --- 588 + 286 --- 589 + 286 --- 590 + 286 --- 591 + 286 --- 592 + 286 --- 593 + 286 --- 594 + 286 --- 595 + 286 --- 596 + 286 --- 597 + 286 --- 598 + 286 --- 599 + 286 --- 600 + 286 --- 601 + 286 --- 602 + 286 --- 603 + 286 --- 604 + 286 --- 605 + 286 --- 606 + 286 --- 607 + 286 --- 608 + 286 --- 609 + 286 --- 610 + 286 --- 611 + 286 --- 612 + 286 --- 613 + 286 --- 614 + 286 --- 615 + 286 --- 616 + 286 --- 617 + 286 --- 618 + 286 --- 619 + 286 --- 620 + 286 --- 621 + 286 --- 622 + 286 --- 623 + 286 --- 624 + 286 --- 625 + 286 --- 626 + 286 --- 627 + 286 --- 628 + 286 --- 629 + 286 --- 630 + 286 --- 631 + 286 --- 632 + 286 --- 633 + 286 --- 634 + 286 --- 635 + 286 --- 636 + 286 --- 637 + 286 --- 638 + 286 --- 639 + 286 --- 640 + 286 --- 641 + 286 --- 642 + 286 --- 643 + 286 --- 644 + 286 --- 645 + 286 --- 646 + 286 --- 647 + 286 --- 648 + 286 --- 649 + 286 --- 650 + 286 --- 651 + 286 --- 652 + 286 --- 653 + 286 --- 654 + 286 --- 655 + 286 --- 656 + 286 --- 657 + 286 --- 658 + 286 --- 659 + 286 --- 660 + 286 --- 661 + 286 --- 662 + 286 --- 663 + 286 --- 664 + 286 --- 665 + 286 --- 666 + 286 --- 667 + 286 --- 668 + 286 --- 669 + 286 --- 670 + 286 --- 671 + 286 --- 672 + 286 --- 673 + 286 --- 674 + 286 --- 675 + 286 --- 676 + 286 --- 677 + 286 --- 678 + 286 --- 679 + 286 --- 680 + 286 --- 681 + 286 --- 682 + 286 --- 683 + 286 --- 684 + 286 --- 685 + 286 --- 686 + 286 --- 687 + 286 --- 688 + 286 --- 689 + 286 --- 690 + 286 --- 691 + 286 --- 692 + 286 --- 693 + 286 --- 694 + 286 --- 695 + 286 --- 696 + 286 --- 697 + 286 --- 698 + 286 --- 699 + 286 --- 700 + 286 --- 701 + 286 --- 702 + 286 --- 703 + 286 --- 704 + 286 --- 705 + 286 --- 706 + 286 --- 707 + 286 --- 708 + 286 --- 709 + 286 --- 710 + 286 --- 711 + 286 --- 712 + 286 --- 713 + 286 --- 714 + 286 --- 715 + 286 --- 716 + 286 --- 717 + 286 --- 718 + 286 --- 719 + 286 --- 720 + 286 --- 721 + 286 --- 722 + 286 --- 723 + 286 --- 724 + 286 --- 725 + 286 --- 726 + 286 --- 727 + 286 --- 728 + 286 --- 729 + 286 --- 730 + 286 --- 731 + 286 --- 732 + 286 --- 733 + 286 --- 734 + 286 --- 735 + 286 --- 736 + 286 --- 737 + 286 --- 738 + 286 --- 739 + 286 --- 740 + 286 --- 741 + 286 --- 742 + 286 --- 743 + 286 --- 744 + 286 --- 745 + 286 --- 746 + 286 --- 747 + 286 --- 748 + 286 --- 749 + 286 --- 750 + 286 --- 751 + 286 --- 752 + 286 --- 753 + 286 --- 754 + 286 --- 755 + 286 --- 756 + 286 --- 757 + 286 --- 758 + 286 --- 759 + 286 --- 760 + 286 --- 761 + 286 --- 762 + 286 --- 763 + 286 --- 764 + 286 --- 765 + 286 --- 766 + 286 --- 767 + 286 --- 768 + 286 --- 769 + 286 --- 770 + 286 --- 771 + 286 --- 772 + 286 --- 773 + 286 --- 774 + 286 --- 775 + 286 --- 776 + 286 --- 777 + 286 --- 778 + 286 --- 779 + 286 --- 780 + 286 --- 781 + 286 --- 782 + 286 --- 783 + 286 --- 784 + 286 --- 785 + 286 --- 786 + 286 --- 787 + 286 --- 788 + 286 --- 789 + 286 --- 790 + 286 --- 791 + 286 --- 792 + 286 --- 793 + 286 --- 794 + 286 --- 795 + 286 --- 796 + 286 --- 797 + 286 --- 798 + 286 --- 799 + 286 --- 800 + 286 --- 801 + 286 --- 802 + 286 --- 803 + 286 --- 804 + 286 --- 805 + 286 --- 806 + 286 --- 807 + 286 --- 808 + 286 --- 809 + 286 --- 810 + 286 --- 811 + 286 --- 812 + 286 --- 813 + 286 --- 814 + 286 --- 815 + 286 --- 816 + 286 --- 817 + 286 --- 818 + 286 --- 819 + 286 --- 820 + 286 --- 821 + 286 --- 822 + 286 --- 823 + 286 --- 824 + 286 --- 825 + 286 --- 826 + 286 --- 827 + 286 --- 828 + 286 --- 829 + 286 --- 830 + 286 --- 831 + 286 --- 832 + 286 --- 833 + 286 --- 834 + 286 --- 835 + 286 --- 836 + 286 --- 837 + 286 --- 838 + 286 --- 839 + 286 --- 840 + 286 --- 841 + 286 --- 842 + 286 --- 843 + 286 --- 844 + 286 --- 845 + 286 --- 846 + 286 --- 847 + 286 --- 848 + 286 --- 849 + 286 --- 850 + 286 --- 851 + 286 --- 852 + 286 --- 853 + 286 --- 854 + 286 --- 855 + 286 --- 856 + 286 --- 857 + 286 --- 858 + 286 --- 859 + 286 --- 860 + 286 --- 861 + 286 --- 862 + 286 --- 863 + 286 --- 864 + 286 --- 865 + 286 --- 866 + 286 --- 867 + 286 --- 868 + 286 --- 869 + 286 --- 870 + 286 --- 871 + 286 --- 872 + 286 --- 873 + 286 --- 874 + 286 --- 875 + 286 --- 876 + 286 --- 877 + 286 --- 878 + 286 --- 879 + 286 --- 880 + 286 --- 881 + 286 --- 882 + 286 --- 883 + 286 --- 884 + 286 --- 885 + 286 --- 886 + 286 --- 887 + 286 --- 888 + 286 --- 889 + 286 --- 890 + 286 --- 891 + 286 --- 892 + 286 --- 893 + 286 --- 894 + 286 --- 895 + 286 --- 896 + 286 --- 897 + 286 --- 898 + 286 --- 899 + 286 --- 900 + 286 --- 901 + 286 --- 902 + 286 --- 903 + 286 --- 904 + 286 --- 905 + 286 --- 906 + 286 --- 907 + 286 --- 908 + 286 --- 909 + 286 --- 910 + 286 --- 911 + 286 --- 912 + 286 --- 913 + 286 --- 914 + 286 --- 915 + 286 --- 916 + 286 --- 917 + 286 --- 918 + 286 --- 919 + 286 --- 920 + 286 --- 921 + 286 --- 922 + 286 --- 923 + 286 --- 924 + 286 --- 925 + 286 --- 926 + 286 --- 927 + 286 --- 928 + 286 --- 929 + 286 --- 930 + 286 --- 931 + 286 --- 932 + 286 --- 933 + 286 --- 934 + 286 --- 935 + 286 --- 936 + 286 --- 937 + 286 --- 938 + 286 --- 939 + 286 --- 940 + 286 --- 941 + 286 --- 942 + 286 --- 943 + 286 --- 944 + 286 --- 945 + 286 --- 946 + 286 --- 947 + 286 --- 948 + 286 --- 949 + 286 --- 950 + 286 --- 951 + 286 --- 952 + 286 --- 953 + 286 --- 954 + 286 --- 955 + 286 --- 956 + 286 --- 957 + 286 --- 958 + 286 --- 959 + 286 --- 960 + 286 --- 961 + 286 --- 962 + 286 --- 963 + 286 --- 964 + 286 --- 965 + 286 --- 966 + 286 --- 967 + 286 --- 968 + 286 --- 969 + 286 --- 970 + 286 --- 971 + 286 --- 972 + 286 --- 973 + 286 --- 974 + 286 --- 975 + 286 --- 976 + 286 --- 977 + 286 --- 978 + 286 --- 979 + 286 --- 980 + 286 --- 981 + 286 --- 982 + 286 --- 983 + 286 --- 984 + 286 --- 985 + 286 --- 986 + 286 --- 987 + 286 --- 988 + 286 --- 989 + 286 --- 990 + 286 --- 991 + 286 --- 992 + 286 --- 993 + 286 --- 994 + 286 --- 995 + 286 --- 996 + 286 --- 997 + 286 --- 998 + 286 --- 999 + 286 --- 1000 + 286 --- 1001 + 286 --- 1002 + 286 --- 1003 + 286 --- 1004 + 286 --- 1005 + 286 --- 1006 + 286 --- 1007 + 286 --- 1008 + 286 --- 1009 + 286 --- 1010 + 286 --- 1011 + 286 --- 1012 + 286 --- 1013 + 286 --- 1014 + 286 --- 1015 + 286 --- 1016 + 286 --- 1017 + 286 --- 1018 + 286 --- 1019 + 286 --- 1020 + 286 --- 1021 + 286 --- 1022 + 286 --- 1023 + 286 --- 1024 + 286 --- 1025 + 286 --- 1026 + 286 --- 1027 + 286 --- 1028 + 286 --- 1029 + 286 --- 1030 + 286 --- 1031 + 286 --- 1032 + 286 --- 1033 + 286 --- 1034 + 286 --- 1035 + 286 --- 1036 + 286 --- 1037 + 286 --- 1038 + 286 --- 1039 + 286 --- 1040 + 286 --- 1041 + 286 --- 1042 + 286 --- 1043 + 286 --- 1044 + 286 --- 1045 + 286 --- 1046 + 286 --- 1047 + 286 --- 1048 + 286 --- 1049 + 286 --- 1050 + 286 --- 1051 + 286 --- 1052 + 286 --- 1053 + 286 --- 1054 + 286 --- 1055 + 286 --- 1056 + 286 --- 1057 + 286 --- 1058 + 286 --- 1059 + 286 --- 1060 + 286 --- 1061 + 286 --- 1062 + 286 --- 1063 + 286 --- 1064 + 286 --- 1065 + 286 --- 1066 + 286 --- 1067 + 286 --- 1068 + 286 --- 1069 + 286 --- 1070 + 286 --- 1071 + 286 --- 1072 + 286 --- 1073 + 286 --- 1074 + 286 --- 1075 + 286 --- 1076 + 286 --- 1077 + 286 --- 1078 + 286 --- 1079 + 286 --- 1080 + 286 --- 1081 + 286 --- 1082 + 286 --- 1083 + 286 --- 1084 + 286 --- 1085 + 286 --- 1086 + 286 --- 1087 + 286 --- 1088 + 286 --- 1089 + 286 --- 1090 + 286 --- 1091 + 286 --- 1092 + 286 --- 1093 + 286 --- 1094 + 286 --- 1095 + 286 --- 1096 + 286 --- 1097 + 286 --- 1098 + 286 --- 1099 + 286 --- 1100 + 286 --- 1101 + 286 --- 1102 + 286 --- 1103 + 286 --- 1104 + 286 --- 1105 + 286 --- 1106 + 286 --- 1107 + 286 --- 1108 + 286 --- 1109 + 286 --- 1110 + 286 --- 1111 + 286 --- 1112 + 286 --- 1113 + 286 --- 1114 + 286 --- 1115 + 286 --- 1116 + 286 --- 1117 + 286 --- 1118 + 286 --- 1119 + 286 --- 1120 + 286 --- 1121 + 286 --- 1122 + 286 --- 1123 + 286 --- 1124 + 286 --- 1125 + 286 --- 1126 + 286 --- 1127 + 286 --- 1128 + 286 --- 1129 + 286 --- 1130 +``` diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..f3678b0c96 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map kittycad_svg.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..053afbdb87 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kittycad_svg/artifact_graph_mind_map.snap.md @@ -0,0 +1,1977 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..6aefb0015f --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart kw_fn.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..e6877ca4d2 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map kw_fn.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..dfc00ce118 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart kw_fn_with_defaults.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..ba880800bf --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map kw_fn_with_defaults.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/kw_fn_with_defaults/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..4d7b777185 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart linear_pattern3d_a_pattern.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..29846ac896 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[41, 66, 0]"] + 3["Segment
[72, 87, 0]"] + 4["Segment
[93, 108, 0]"] + 5["Segment
[114, 130, 0]"] + 6["Segment
[136, 144, 0]"] + 7[Solid2d] + end + 1["Plane
[16, 35, 0]"] + 8["Sweep Extrusion
[150, 163, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..f7d7d7af63 --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map linear_pattern3d_a_pattern.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/linear_pattern3d_a_pattern/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..dda718cdaa --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart mike_stress_test.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..a06af27f73 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_flowchart.snap.md @@ -0,0 +1,11027 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 64, 0]"] + 3["Segment
[70, 142, 0]"] + 4["Segment
[148, 219, 0]"] + 5["Segment
[225, 296, 0]"] + 6["Segment
[302, 375, 0]"] + 7["Segment
[381, 453, 0]"] + 8["Segment
[459, 531, 0]"] + 9["Segment
[537, 609, 0]"] + 10["Segment
[615, 689, 0]"] + 11["Segment
[695, 767, 0]"] + 12["Segment
[773, 847, 0]"] + 13["Segment
[853, 924, 0]"] + 14["Segment
[930, 1001, 0]"] + 15["Segment
[1007, 1056, 0]"] + 16["Segment
[1062, 1136, 0]"] + 17["Segment
[1142, 1215, 0]"] + 18["Segment
[1221, 1294, 0]"] + 19["Segment
[1300, 1348, 0]"] + 20["Segment
[1354, 1427, 0]"] + 21["Segment
[1433, 1481, 0]"] + 22["Segment
[1487, 1559, 0]"] + 23["Segment
[1565, 1614, 0]"] + 24["Segment
[1620, 1691, 0]"] + 25["Segment
[1697, 1746, 0]"] + 26["Segment
[1752, 1825, 0]"] + 27["Segment
[1831, 1902, 0]"] + 28["Segment
[1908, 1980, 0]"] + 29["Segment
[1986, 2060, 0]"] + 30["Segment
[2066, 2139, 0]"] + 31["Segment
[2145, 2217, 0]"] + 32["Segment
[2223, 2295, 0]"] + 33["Segment
[2301, 2350, 0]"] + 34["Segment
[2356, 2427, 0]"] + 35["Segment
[2433, 2505, 0]"] + 36["Segment
[2511, 2585, 0]"] + 37["Segment
[2591, 2663, 0]"] + 38["Segment
[2669, 2741, 0]"] + 39["Segment
[2747, 2796, 0]"] + 40["Segment
[2802, 2875, 0]"] + 41["Segment
[2881, 2952, 0]"] + 42["Segment
[2958, 3029, 0]"] + 43["Segment
[3035, 3084, 0]"] + 44["Segment
[3090, 3161, 0]"] + 45["Segment
[3167, 3216, 0]"] + 46["Segment
[3222, 3293, 0]"] + 47["Segment
[3299, 3370, 0]"] + 48["Segment
[3376, 3448, 0]"] + 49["Segment
[3454, 3528, 0]"] + 50["Segment
[3534, 3607, 0]"] + 51["Segment
[3613, 3685, 0]"] + 52["Segment
[3691, 3764, 0]"] + 53["Segment
[3770, 3841, 0]"] + 54["Segment
[3847, 3918, 0]"] + 55["Segment
[3924, 3995, 0]"] + 56["Segment
[4001, 4074, 0]"] + 57["Segment
[4080, 4152, 0]"] + 58["Segment
[4158, 4230, 0]"] + 59["Segment
[4236, 4308, 0]"] + 60["Segment
[4314, 4388, 0]"] + 61["Segment
[4394, 4466, 0]"] + 62["Segment
[4472, 4546, 0]"] + 63["Segment
[4552, 4623, 0]"] + 64["Segment
[4629, 4700, 0]"] + 65["Segment
[4706, 4755, 0]"] + 66["Segment
[4761, 4835, 0]"] + 67["Segment
[4841, 4914, 0]"] + 68["Segment
[4920, 4993, 0]"] + 69["Segment
[4999, 5047, 0]"] + 70["Segment
[5053, 5126, 0]"] + 71["Segment
[5132, 5180, 0]"] + 72["Segment
[5186, 5258, 0]"] + 73["Segment
[5264, 5313, 0]"] + 74["Segment
[5319, 5390, 0]"] + 75["Segment
[5396, 5445, 0]"] + 76["Segment
[5451, 5524, 0]"] + 77["Segment
[5530, 5601, 0]"] + 78["Segment
[5607, 5678, 0]"] + 79["Segment
[5684, 5755, 0]"] + 80["Segment
[5761, 5832, 0]"] + 81["Segment
[5838, 5887, 0]"] + 82["Segment
[5893, 5966, 0]"] + 83["Segment
[5972, 6044, 0]"] + 84["Segment
[6050, 6123, 0]"] + 85["Segment
[6129, 6200, 0]"] + 86["Segment
[6206, 6277, 0]"] + 87["Segment
[6283, 6354, 0]"] + 88["Segment
[6360, 6431, 0]"] + 89["Segment
[6437, 6508, 0]"] + 90["Segment
[6514, 6587, 0]"] + 91["Segment
[6593, 6642, 0]"] + 92["Segment
[6648, 6720, 0]"] + 93["Segment
[6726, 6797, 0]"] + 94["Segment
[6803, 6874, 0]"] + 95["Segment
[6880, 6951, 0]"] + 96["Segment
[6957, 7028, 0]"] + 97["Segment
[7034, 7106, 0]"] + 98["Segment
[7112, 7184, 0]"] + 99["Segment
[7190, 7263, 0]"] + 100["Segment
[7269, 7342, 0]"] + 101["Segment
[7348, 7421, 0]"] + 102["Segment
[7427, 7476, 0]"] + 103["Segment
[7482, 7554, 0]"] + 104["Segment
[7560, 7631, 0]"] + 105["Segment
[7637, 7708, 0]"] + 106["Segment
[7714, 7787, 0]"] + 107["Segment
[7793, 7865, 0]"] + 108["Segment
[7871, 7943, 0]"] + 109["Segment
[7949, 8021, 0]"] + 110["Segment
[8027, 8101, 0]"] + 111["Segment
[8107, 8179, 0]"] + 112["Segment
[8185, 8259, 0]"] + 113["Segment
[8265, 8336, 0]"] + 114["Segment
[8342, 8413, 0]"] + 115["Segment
[8419, 8468, 0]"] + 116["Segment
[8474, 8548, 0]"] + 117["Segment
[8554, 8627, 0]"] + 118["Segment
[8633, 8706, 0]"] + 119["Segment
[8712, 8760, 0]"] + 120["Segment
[8766, 8839, 0]"] + 121["Segment
[8845, 8893, 0]"] + 122["Segment
[8899, 8971, 0]"] + 123["Segment
[8977, 9026, 0]"] + 124["Segment
[9032, 9103, 0]"] + 125["Segment
[9109, 9158, 0]"] + 126["Segment
[9164, 9237, 0]"] + 127["Segment
[9243, 9314, 0]"] + 128["Segment
[9320, 9392, 0]"] + 129["Segment
[9398, 9472, 0]"] + 130["Segment
[9478, 9551, 0]"] + 131["Segment
[9557, 9629, 0]"] + 132["Segment
[9635, 9707, 0]"] + 133["Segment
[9713, 9762, 0]"] + 134["Segment
[9768, 9839, 0]"] + 135["Segment
[9845, 9917, 0]"] + 136["Segment
[9923, 9997, 0]"] + 137["Segment
[10003, 10075, 0]"] + 138["Segment
[10081, 10153, 0]"] + 139["Segment
[10159, 10208, 0]"] + 140["Segment
[10214, 10287, 0]"] + 141["Segment
[10293, 10364, 0]"] + 142["Segment
[10370, 10441, 0]"] + 143["Segment
[10447, 10496, 0]"] + 144["Segment
[10502, 10573, 0]"] + 145["Segment
[10579, 10628, 0]"] + 146["Segment
[10634, 10705, 0]"] + 147["Segment
[10711, 10782, 0]"] + 148["Segment
[10788, 10860, 0]"] + 149["Segment
[10866, 10940, 0]"] + 150["Segment
[10946, 11019, 0]"] + 151["Segment
[11025, 11097, 0]"] + 152["Segment
[11103, 11176, 0]"] + 153["Segment
[11182, 11253, 0]"] + 154["Segment
[11259, 11330, 0]"] + 155["Segment
[11336, 11407, 0]"] + 156["Segment
[11413, 11486, 0]"] + 157["Segment
[11492, 11564, 0]"] + 158["Segment
[11570, 11642, 0]"] + 159["Segment
[11648, 11720, 0]"] + 160["Segment
[11726, 11800, 0]"] + 161["Segment
[11806, 11878, 0]"] + 162["Segment
[11884, 11958, 0]"] + 163["Segment
[11964, 12035, 0]"] + 164["Segment
[12041, 12112, 0]"] + 165["Segment
[12118, 12167, 0]"] + 166["Segment
[12173, 12247, 0]"] + 167["Segment
[12253, 12326, 0]"] + 168["Segment
[12332, 12405, 0]"] + 169["Segment
[12411, 12459, 0]"] + 170["Segment
[12465, 12538, 0]"] + 171["Segment
[12544, 12592, 0]"] + 172["Segment
[12598, 12670, 0]"] + 173["Segment
[12676, 12725, 0]"] + 174["Segment
[12731, 12802, 0]"] + 175["Segment
[12808, 12857, 0]"] + 176["Segment
[12863, 12935, 0]"] + 177["Segment
[12941, 13012, 0]"] + 178["Segment
[13018, 13089, 0]"] + 179["Segment
[13095, 13168, 0]"] + 180["Segment
[13174, 13246, 0]"] + 181["Segment
[13252, 13324, 0]"] + 182["Segment
[13330, 13402, 0]"] + 183["Segment
[13408, 13482, 0]"] + 184["Segment
[13488, 13560, 0]"] + 185["Segment
[13566, 13640, 0]"] + 186["Segment
[13646, 13717, 0]"] + 187["Segment
[13723, 13794, 0]"] + 188["Segment
[13800, 13849, 0]"] + 189["Segment
[13855, 13929, 0]"] + 190["Segment
[13935, 14008, 0]"] + 191["Segment
[14014, 14087, 0]"] + 192["Segment
[14093, 14141, 0]"] + 193["Segment
[14147, 14220, 0]"] + 194["Segment
[14226, 14274, 0]"] + 195["Segment
[14280, 14352, 0]"] + 196["Segment
[14358, 14407, 0]"] + 197["Segment
[14413, 14484, 0]"] + 198["Segment
[14490, 14539, 0]"] + 199["Segment
[14545, 14618, 0]"] + 200["Segment
[14624, 14695, 0]"] + 201["Segment
[14701, 14773, 0]"] + 202["Segment
[14779, 14853, 0]"] + 203["Segment
[14859, 14931, 0]"] + 204["Segment
[14937, 15008, 0]"] + 205["Segment
[15014, 15085, 0]"] + 206["Segment
[15091, 15164, 0]"] + 207["Segment
[15170, 15242, 0]"] + 208["Segment
[15248, 15320, 0]"] + 209["Segment
[15326, 15398, 0]"] + 210["Segment
[15404, 15478, 0]"] + 211["Segment
[15484, 15556, 0]"] + 212["Segment
[15562, 15636, 0]"] + 213["Segment
[15642, 15713, 0]"] + 214["Segment
[15719, 15790, 0]"] + 215["Segment
[15796, 15845, 0]"] + 216["Segment
[15851, 15925, 0]"] + 217["Segment
[15931, 16004, 0]"] + 218["Segment
[16010, 16083, 0]"] + 219["Segment
[16089, 16137, 0]"] + 220["Segment
[16143, 16216, 0]"] + 221["Segment
[16222, 16270, 0]"] + 222["Segment
[16276, 16348, 0]"] + 223["Segment
[16354, 16403, 0]"] + 224["Segment
[16409, 16480, 0]"] + 225["Segment
[16486, 16535, 0]"] + 226["Segment
[16541, 16614, 0]"] + 227["Segment
[16620, 16691, 0]"] + 228["Segment
[16697, 16769, 0]"] + 229["Segment
[16775, 16849, 0]"] + 230["Segment
[16855, 16928, 0]"] + 231["Segment
[16934, 17006, 0]"] + 232["Segment
[17012, 17084, 0]"] + 233["Segment
[17090, 17139, 0]"] + 234["Segment
[17145, 17216, 0]"] + 235["Segment
[17222, 17294, 0]"] + 236["Segment
[17300, 17374, 0]"] + 237["Segment
[17380, 17452, 0]"] + 238["Segment
[17458, 17530, 0]"] + 239["Segment
[17536, 17585, 0]"] + 240["Segment
[17591, 17664, 0]"] + 241["Segment
[17670, 17741, 0]"] + 242["Segment
[17747, 17818, 0]"] + 243["Segment
[17824, 17873, 0]"] + 244["Segment
[17879, 17950, 0]"] + 245["Segment
[17956, 18005, 0]"] + 246["Segment
[18011, 18082, 0]"] + 247["Segment
[18088, 18159, 0]"] + 248["Segment
[18165, 18237, 0]"] + 249["Segment
[18243, 18317, 0]"] + 250["Segment
[18323, 18396, 0]"] + 251["Segment
[18402, 18474, 0]"] + 252["Segment
[18480, 18553, 0]"] + 253["Segment
[18559, 18630, 0]"] + 254["Segment
[18636, 18707, 0]"] + 255["Segment
[18713, 18784, 0]"] + 256["Segment
[18790, 18863, 0]"] + 257["Segment
[18869, 18941, 0]"] + 258["Segment
[18947, 19019, 0]"] + 259["Segment
[19025, 19097, 0]"] + 260["Segment
[19103, 19177, 0]"] + 261["Segment
[19183, 19255, 0]"] + 262["Segment
[19261, 19335, 0]"] + 263["Segment
[19341, 19412, 0]"] + 264["Segment
[19418, 19489, 0]"] + 265["Segment
[19495, 19544, 0]"] + 266["Segment
[19550, 19624, 0]"] + 267["Segment
[19630, 19703, 0]"] + 268["Segment
[19709, 19782, 0]"] + 269["Segment
[19788, 19836, 0]"] + 270["Segment
[19842, 19915, 0]"] + 271["Segment
[19921, 19969, 0]"] + 272["Segment
[19975, 20047, 0]"] + 273["Segment
[20053, 20102, 0]"] + 274["Segment
[20108, 20179, 0]"] + 275["Segment
[20185, 20234, 0]"] + 276["Segment
[20240, 20313, 0]"] + 277["Segment
[20319, 20390, 0]"] + 278["Segment
[20396, 20467, 0]"] + 279["Segment
[20473, 20544, 0]"] + 280["Segment
[20550, 20621, 0]"] + 281["Segment
[20627, 20676, 0]"] + 282["Segment
[20682, 20755, 0]"] + 283["Segment
[20761, 20833, 0]"] + 284["Segment
[20839, 20912, 0]"] + 285["Segment
[20918, 20989, 0]"] + 286["Segment
[20995, 21066, 0]"] + 287["Segment
[21072, 21143, 0]"] + 288["Segment
[21149, 21220, 0]"] + 289["Segment
[21226, 21297, 0]"] + 290["Segment
[21303, 21376, 0]"] + 291["Segment
[21382, 21431, 0]"] + 292["Segment
[21437, 21509, 0]"] + 293["Segment
[21515, 21586, 0]"] + 294["Segment
[21592, 21663, 0]"] + 295["Segment
[21669, 21740, 0]"] + 296["Segment
[21746, 21817, 0]"] + 297["Segment
[21823, 21895, 0]"] + 298["Segment
[21901, 21973, 0]"] + 299["Segment
[21979, 22052, 0]"] + 300["Segment
[22058, 22131, 0]"] + 301["Segment
[22137, 22210, 0]"] + 302["Segment
[22216, 22265, 0]"] + 303["Segment
[22271, 22343, 0]"] + 304["Segment
[22349, 22420, 0]"] + 305["Segment
[22426, 22497, 0]"] + 306["Segment
[22503, 22576, 0]"] + 307["Segment
[22582, 22654, 0]"] + 308["Segment
[22660, 22732, 0]"] + 309["Segment
[22738, 22810, 0]"] + 310["Segment
[22816, 22890, 0]"] + 311["Segment
[22896, 22968, 0]"] + 312["Segment
[22974, 23048, 0]"] + 313["Segment
[23054, 23125, 0]"] + 314["Segment
[23131, 23202, 0]"] + 315["Segment
[23208, 23257, 0]"] + 316["Segment
[23263, 23337, 0]"] + 317["Segment
[23343, 23416, 0]"] + 318["Segment
[23422, 23495, 0]"] + 319["Segment
[23501, 23549, 0]"] + 320["Segment
[23555, 23628, 0]"] + 321["Segment
[23634, 23682, 0]"] + 322["Segment
[23688, 23760, 0]"] + 323["Segment
[23766, 23815, 0]"] + 324["Segment
[23821, 23892, 0]"] + 325["Segment
[23898, 23947, 0]"] + 326["Segment
[23953, 24026, 0]"] + 327["Segment
[24032, 24103, 0]"] + 328["Segment
[24109, 24181, 0]"] + 329["Segment
[24187, 24261, 0]"] + 330["Segment
[24267, 24340, 0]"] + 331["Segment
[24346, 24418, 0]"] + 332["Segment
[24424, 24496, 0]"] + 333["Segment
[24502, 24551, 0]"] + 334["Segment
[24557, 24628, 0]"] + 335["Segment
[24634, 24706, 0]"] + 336["Segment
[24712, 24786, 0]"] + 337["Segment
[24792, 24864, 0]"] + 338["Segment
[24870, 24942, 0]"] + 339["Segment
[24948, 24997, 0]"] + 340["Segment
[25003, 25076, 0]"] + 341["Segment
[25082, 25153, 0]"] + 342["Segment
[25159, 25230, 0]"] + 343["Segment
[25236, 25285, 0]"] + 344["Segment
[25291, 25362, 0]"] + 345["Segment
[25368, 25417, 0]"] + 346["Segment
[25423, 25494, 0]"] + 347["Segment
[25500, 25571, 0]"] + 348["Segment
[25577, 25649, 0]"] + 349["Segment
[25655, 25729, 0]"] + 350["Segment
[25735, 25808, 0]"] + 351["Segment
[25814, 25886, 0]"] + 352["Segment
[25892, 25965, 0]"] + 353["Segment
[25971, 26042, 0]"] + 354["Segment
[26048, 26119, 0]"] + 355["Segment
[26125, 26196, 0]"] + 356["Segment
[26202, 26275, 0]"] + 357["Segment
[26281, 26353, 0]"] + 358["Segment
[26359, 26431, 0]"] + 359["Segment
[26437, 26509, 0]"] + 360["Segment
[26515, 26589, 0]"] + 361["Segment
[26595, 26667, 0]"] + 362["Segment
[26673, 26747, 0]"] + 363["Segment
[26753, 26824, 0]"] + 364["Segment
[26830, 26901, 0]"] + 365["Segment
[26907, 26956, 0]"] + 366["Segment
[26962, 27036, 0]"] + 367["Segment
[27042, 27115, 0]"] + 368["Segment
[27121, 27194, 0]"] + 369["Segment
[27200, 27248, 0]"] + 370["Segment
[27254, 27327, 0]"] + 371["Segment
[27333, 27381, 0]"] + 372["Segment
[27387, 27459, 0]"] + 373["Segment
[27465, 27514, 0]"] + 374["Segment
[27520, 27591, 0]"] + 375["Segment
[27597, 27646, 0]"] + 376["Segment
[27652, 27724, 0]"] + 377["Segment
[27730, 27801, 0]"] + 378["Segment
[27807, 27878, 0]"] + 379["Segment
[27884, 27957, 0]"] + 380["Segment
[27963, 28035, 0]"] + 381["Segment
[28041, 28113, 0]"] + 382["Segment
[28119, 28191, 0]"] + 383["Segment
[28197, 28271, 0]"] + 384["Segment
[28277, 28349, 0]"] + 385["Segment
[28355, 28429, 0]"] + 386["Segment
[28435, 28506, 0]"] + 387["Segment
[28512, 28583, 0]"] + 388["Segment
[28589, 28638, 0]"] + 389["Segment
[28644, 28718, 0]"] + 390["Segment
[28724, 28797, 0]"] + 391["Segment
[28803, 28876, 0]"] + 392["Segment
[28882, 28930, 0]"] + 393["Segment
[28936, 29009, 0]"] + 394["Segment
[29015, 29063, 0]"] + 395["Segment
[29069, 29141, 0]"] + 396["Segment
[29147, 29196, 0]"] + 397["Segment
[29202, 29273, 0]"] + 398["Segment
[29279, 29328, 0]"] + 399["Segment
[29334, 29407, 0]"] + 400["Segment
[29413, 29484, 0]"] + 401["Segment
[29490, 29562, 0]"] + 402["Segment
[29568, 29642, 0]"] + 403["Segment
[29648, 29721, 0]"] + 404["Segment
[29727, 29799, 0]"] + 405["Segment
[29805, 29877, 0]"] + 406["Segment
[29883, 29932, 0]"] + 407["Segment
[29938, 30009, 0]"] + 408["Segment
[30015, 30087, 0]"] + 409["Segment
[30093, 30167, 0]"] + 410["Segment
[30173, 30245, 0]"] + 411["Segment
[30251, 30323, 0]"] + 412["Segment
[30329, 30378, 0]"] + 413["Segment
[30384, 30457, 0]"] + 414["Segment
[30463, 30534, 0]"] + 415["Segment
[30540, 30611, 0]"] + 416["Segment
[30617, 30666, 0]"] + 417["Segment
[30672, 30743, 0]"] + 418["Segment
[30749, 30798, 0]"] + 419["Segment
[30804, 30875, 0]"] + 420["Segment
[30881, 30952, 0]"] + 421["Segment
[30958, 31030, 0]"] + 422["Segment
[31036, 31110, 0]"] + 423["Segment
[31116, 31189, 0]"] + 424["Segment
[31195, 31267, 0]"] + 425["Segment
[31273, 31346, 0]"] + 426["Segment
[31352, 31423, 0]"] + 427["Segment
[31429, 31500, 0]"] + 428["Segment
[31506, 31577, 0]"] + 429["Segment
[31583, 31656, 0]"] + 430["Segment
[31662, 31734, 0]"] + 431["Segment
[31740, 31812, 0]"] + 432["Segment
[31818, 31890, 0]"] + 433["Segment
[31896, 31970, 0]"] + 434["Segment
[31976, 32048, 0]"] + 435["Segment
[32054, 32128, 0]"] + 436["Segment
[32134, 32205, 0]"] + 437["Segment
[32211, 32282, 0]"] + 438["Segment
[32288, 32337, 0]"] + 439["Segment
[32343, 32417, 0]"] + 440["Segment
[32423, 32496, 0]"] + 441["Segment
[32502, 32575, 0]"] + 442["Segment
[32581, 32629, 0]"] + 443["Segment
[32635, 32708, 0]"] + 444["Segment
[32714, 32762, 0]"] + 445["Segment
[32768, 32840, 0]"] + 446["Segment
[32846, 32895, 0]"] + 447["Segment
[32901, 32972, 0]"] + 448["Segment
[32978, 33051, 0]"] + 449["Segment
[33057, 33130, 0]"] + 450["Segment
[33136, 33185, 0]"] + 451["Segment
[33191, 33264, 0]"] + 452["Segment
[33270, 33341, 0]"] + 453["Segment
[33347, 33418, 0]"] + 454["Segment
[33424, 33495, 0]"] + 455["Segment
[33501, 33572, 0]"] + 456["Segment
[33578, 33627, 0]"] + 457["Segment
[33633, 33706, 0]"] + 458["Segment
[33712, 33784, 0]"] + 459["Segment
[33790, 33863, 0]"] + 460["Segment
[33869, 33940, 0]"] + 461["Segment
[33946, 34017, 0]"] + 462["Segment
[34023, 34094, 0]"] + 463["Segment
[34100, 34171, 0]"] + 464["Segment
[34177, 34248, 0]"] + 465["Segment
[34254, 34327, 0]"] + 466["Segment
[34333, 34382, 0]"] + 467["Segment
[34388, 34460, 0]"] + 468["Segment
[34466, 34537, 0]"] + 469["Segment
[34543, 34614, 0]"] + 470["Segment
[34620, 34691, 0]"] + 471["Segment
[34697, 34768, 0]"] + 472["Segment
[34774, 34846, 0]"] + 473["Segment
[34852, 34924, 0]"] + 474["Segment
[34930, 35003, 0]"] + 475["Segment
[35009, 35082, 0]"] + 476["Segment
[35088, 35161, 0]"] + 477["Segment
[35167, 35216, 0]"] + 478["Segment
[35222, 35293, 0]"] + 479["Segment
[35299, 35371, 0]"] + 480["Segment
[35377, 35448, 0]"] + 481["Segment
[35454, 35503, 0]"] + 482["Segment
[35509, 35582, 0]"] + 483["Segment
[35588, 35660, 0]"] + 484["Segment
[35666, 35739, 0]"] + 485["Segment
[35745, 35819, 0]"] + 486["Segment
[35825, 35896, 0]"] + 487["Segment
[35902, 35951, 0]"] + 488["Segment
[35957, 36028, 0]"] + 489["Segment
[36034, 36109, 0]"] + 490["Segment
[36115, 36188, 0]"] + 491["Segment
[36194, 36242, 0]"] + 492["Segment
[36248, 36319, 0]"] + 493["Segment
[36325, 36397, 0]"] + 494["Segment
[36403, 36475, 0]"] + 495["Segment
[36481, 36552, 0]"] + 496["Segment
[36558, 36607, 0]"] + 497["Segment
[36613, 36685, 0]"] + 498["Segment
[36691, 36762, 0]"] + 499["Segment
[36768, 36839, 0]"] + 500["Segment
[36845, 36917, 0]"] + 501["Segment
[36923, 36996, 0]"] + 502["Segment
[37002, 37073, 0]"] + 503["Segment
[37079, 37151, 0]"] + 504["Segment
[37157, 37228, 0]"] + 505["Segment
[37234, 37305, 0]"] + 506["Segment
[37311, 37384, 0]"] + 507["Segment
[37390, 37462, 0]"] + 508["Segment
[37468, 37540, 0]"] + 509["Segment
[37546, 37618, 0]"] + 510["Segment
[37624, 37698, 0]"] + 511["Segment
[37704, 37776, 0]"] + 512["Segment
[37782, 37856, 0]"] + 513["Segment
[37862, 37933, 0]"] + 514["Segment
[37939, 38010, 0]"] + 515["Segment
[38016, 38065, 0]"] + 516["Segment
[38071, 38145, 0]"] + 517["Segment
[38151, 38224, 0]"] + 518["Segment
[38230, 38303, 0]"] + 519["Segment
[38309, 38357, 0]"] + 520["Segment
[38363, 38436, 0]"] + 521["Segment
[38442, 38490, 0]"] + 522["Segment
[38496, 38568, 0]"] + 523["Segment
[38574, 38623, 0]"] + 524["Segment
[38629, 38700, 0]"] + 525["Segment
[38706, 38755, 0]"] + 526["Segment
[38761, 38834, 0]"] + 527["Segment
[38840, 38911, 0]"] + 528["Segment
[38917, 38989, 0]"] + 529["Segment
[38995, 39069, 0]"] + 530["Segment
[39075, 39148, 0]"] + 531["Segment
[39154, 39226, 0]"] + 532["Segment
[39232, 39304, 0]"] + 533["Segment
[39310, 39359, 0]"] + 534["Segment
[39365, 39436, 0]"] + 535["Segment
[39442, 39514, 0]"] + 536["Segment
[39520, 39594, 0]"] + 537["Segment
[39600, 39672, 0]"] + 538["Segment
[39678, 39750, 0]"] + 539["Segment
[39756, 39805, 0]"] + 540["Segment
[39811, 39884, 0]"] + 541["Segment
[39890, 39961, 0]"] + 542["Segment
[39967, 40038, 0]"] + 543["Segment
[40044, 40093, 0]"] + 544["Segment
[40099, 40170, 0]"] + 545["Segment
[40176, 40225, 0]"] + 546["Segment
[40231, 40302, 0]"] + 547["Segment
[40308, 40379, 0]"] + 548["Segment
[40385, 40457, 0]"] + 549["Segment
[40463, 40537, 0]"] + 550["Segment
[40543, 40616, 0]"] + 551["Segment
[40622, 40694, 0]"] + 552["Segment
[40700, 40773, 0]"] + 553["Segment
[40779, 40850, 0]"] + 554["Segment
[40856, 40927, 0]"] + 555["Segment
[40933, 41004, 0]"] + 556["Segment
[41010, 41083, 0]"] + 557["Segment
[41089, 41161, 0]"] + 558["Segment
[41167, 41239, 0]"] + 559["Segment
[41245, 41317, 0]"] + 560["Segment
[41323, 41397, 0]"] + 561["Segment
[41403, 41475, 0]"] + 562["Segment
[41481, 41555, 0]"] + 563["Segment
[41561, 41632, 0]"] + 564["Segment
[41638, 41709, 0]"] + 565["Segment
[41715, 41764, 0]"] + 566["Segment
[41770, 41844, 0]"] + 567["Segment
[41850, 41923, 0]"] + 568["Segment
[41929, 42002, 0]"] + 569["Segment
[42008, 42056, 0]"] + 570["Segment
[42062, 42135, 0]"] + 571["Segment
[42141, 42189, 0]"] + 572["Segment
[42195, 42267, 0]"] + 573["Segment
[42273, 42322, 0]"] + 574["Segment
[42328, 42399, 0]"] + 575["Segment
[42405, 42454, 0]"] + 576["Segment
[42460, 42533, 0]"] + 577["Segment
[42539, 42610, 0]"] + 578["Segment
[42616, 42687, 0]"] + 579["Segment
[42693, 42764, 0]"] + 580["Segment
[42770, 42841, 0]"] + 581["Segment
[42847, 42896, 0]"] + 582["Segment
[42902, 42975, 0]"] + 583["Segment
[42981, 43053, 0]"] + 584["Segment
[43059, 43132, 0]"] + 585["Segment
[43138, 43209, 0]"] + 586["Segment
[43215, 43286, 0]"] + 587["Segment
[43292, 43363, 0]"] + 588["Segment
[43369, 43440, 0]"] + 589["Segment
[43446, 43517, 0]"] + 590["Segment
[43523, 43596, 0]"] + 591["Segment
[43602, 43651, 0]"] + 592["Segment
[43657, 43729, 0]"] + 593["Segment
[43735, 43806, 0]"] + 594["Segment
[43812, 43883, 0]"] + 595["Segment
[43889, 43960, 0]"] + 596["Segment
[43966, 44037, 0]"] + 597["Segment
[44043, 44115, 0]"] + 598["Segment
[44121, 44193, 0]"] + 599["Segment
[44199, 44272, 0]"] + 600["Segment
[44278, 44351, 0]"] + 601["Segment
[44357, 44430, 0]"] + 602["Segment
[44436, 44485, 0]"] + 603["Segment
[44491, 44563, 0]"] + 604["Segment
[44569, 44640, 0]"] + 605["Segment
[44646, 44717, 0]"] + 606["Segment
[44723, 44796, 0]"] + 607["Segment
[44802, 44874, 0]"] + 608["Segment
[44880, 44952, 0]"] + 609["Segment
[44958, 45030, 0]"] + 610["Segment
[45036, 45110, 0]"] + 611["Segment
[45116, 45188, 0]"] + 612["Segment
[45194, 45268, 0]"] + 613["Segment
[45274, 45345, 0]"] + 614["Segment
[45351, 45422, 0]"] + 615["Segment
[45428, 45477, 0]"] + 616["Segment
[45483, 45557, 0]"] + 617["Segment
[45563, 45636, 0]"] + 618["Segment
[45642, 45715, 0]"] + 619["Segment
[45721, 45769, 0]"] + 620["Segment
[45775, 45848, 0]"] + 621["Segment
[45854, 45902, 0]"] + 622["Segment
[45908, 45980, 0]"] + 623["Segment
[45986, 46035, 0]"] + 624["Segment
[46041, 46112, 0]"] + 625["Segment
[46118, 46167, 0]"] + 626["Segment
[46173, 46246, 0]"] + 627["Segment
[46252, 46323, 0]"] + 628["Segment
[46329, 46401, 0]"] + 629["Segment
[46407, 46481, 0]"] + 630["Segment
[46487, 46560, 0]"] + 631["Segment
[46566, 46638, 0]"] + 632["Segment
[46644, 46716, 0]"] + 633["Segment
[46722, 46771, 0]"] + 634["Segment
[46777, 46848, 0]"] + 635["Segment
[46854, 46926, 0]"] + 636["Segment
[46932, 47006, 0]"] + 637["Segment
[47012, 47084, 0]"] + 638["Segment
[47090, 47162, 0]"] + 639["Segment
[47168, 47217, 0]"] + 640["Segment
[47223, 47296, 0]"] + 641["Segment
[47302, 47373, 0]"] + 642["Segment
[47379, 47450, 0]"] + 643["Segment
[47456, 47505, 0]"] + 644["Segment
[47511, 47582, 0]"] + 645["Segment
[47588, 47637, 0]"] + 646["Segment
[47643, 47714, 0]"] + 647["Segment
[47720, 47791, 0]"] + 648["Segment
[47797, 47869, 0]"] + 649["Segment
[47875, 47949, 0]"] + 650["Segment
[47955, 48028, 0]"] + 651["Segment
[48034, 48106, 0]"] + 652["Segment
[48112, 48185, 0]"] + 653["Segment
[48191, 48262, 0]"] + 654["Segment
[48268, 48339, 0]"] + 655["Segment
[48345, 48416, 0]"] + 656["Segment
[48422, 48495, 0]"] + 657["Segment
[48501, 48573, 0]"] + 658["Segment
[48579, 48651, 0]"] + 659["Segment
[48657, 48729, 0]"] + 660["Segment
[48735, 48809, 0]"] + 661["Segment
[48815, 48887, 0]"] + 662["Segment
[48893, 48967, 0]"] + 663["Segment
[48973, 49044, 0]"] + 664["Segment
[49050, 49121, 0]"] + 665["Segment
[49127, 49176, 0]"] + 666["Segment
[49182, 49256, 0]"] + 667["Segment
[49262, 49335, 0]"] + 668["Segment
[49341, 49414, 0]"] + 669["Segment
[49420, 49468, 0]"] + 670["Segment
[49474, 49547, 0]"] + 671["Segment
[49553, 49601, 0]"] + 672["Segment
[49607, 49679, 0]"] + 673["Segment
[49685, 49734, 0]"] + 674["Segment
[49740, 49811, 0]"] + 675["Segment
[49817, 49866, 0]"] + 676["Segment
[49872, 49944, 0]"] + 677["Segment
[49950, 50021, 0]"] + 678["Segment
[50027, 50098, 0]"] + 679["Segment
[50104, 50177, 0]"] + 680["Segment
[50183, 50255, 0]"] + 681["Segment
[50261, 50333, 0]"] + 682["Segment
[50339, 50411, 0]"] + 683["Segment
[50417, 50491, 0]"] + 684["Segment
[50497, 50569, 0]"] + 685["Segment
[50575, 50649, 0]"] + 686["Segment
[50655, 50726, 0]"] + 687["Segment
[50732, 50803, 0]"] + 688["Segment
[50809, 50858, 0]"] + 689["Segment
[50864, 50938, 0]"] + 690["Segment
[50944, 51017, 0]"] + 691["Segment
[51023, 51096, 0]"] + 692["Segment
[51102, 51150, 0]"] + 693["Segment
[51156, 51229, 0]"] + 694["Segment
[51235, 51283, 0]"] + 695["Segment
[51289, 51361, 0]"] + 696["Segment
[51367, 51416, 0]"] + 697["Segment
[51422, 51493, 0]"] + 698["Segment
[51499, 51548, 0]"] + 699["Segment
[51554, 51627, 0]"] + 700["Segment
[51633, 51704, 0]"] + 701["Segment
[51710, 51782, 0]"] + 702["Segment
[51788, 51862, 0]"] + 703["Segment
[51868, 51940, 0]"] + 704["Segment
[51946, 52017, 0]"] + 705["Segment
[52023, 52094, 0]"] + 706["Segment
[52100, 52173, 0]"] + 707["Segment
[52179, 52251, 0]"] + 708["Segment
[52257, 52329, 0]"] + 709["Segment
[52335, 52407, 0]"] + 710["Segment
[52413, 52487, 0]"] + 711["Segment
[52493, 52565, 0]"] + 712["Segment
[52571, 52645, 0]"] + 713["Segment
[52651, 52722, 0]"] + 714["Segment
[52728, 52799, 0]"] + 715["Segment
[52805, 52854, 0]"] + 716["Segment
[52860, 52934, 0]"] + 717["Segment
[52940, 53013, 0]"] + 718["Segment
[53019, 53092, 0]"] + 719["Segment
[53098, 53146, 0]"] + 720["Segment
[53152, 53225, 0]"] + 721["Segment
[53231, 53279, 0]"] + 722["Segment
[53285, 53357, 0]"] + 723["Segment
[53363, 53412, 0]"] + 724["Segment
[53418, 53489, 0]"] + 725["Segment
[53495, 53544, 0]"] + 726["Segment
[53550, 53623, 0]"] + 727["Segment
[53629, 53700, 0]"] + 728["Segment
[53706, 53778, 0]"] + 729["Segment
[53784, 53858, 0]"] + 730["Segment
[53864, 53937, 0]"] + 731["Segment
[53943, 54015, 0]"] + 732["Segment
[54021, 54093, 0]"] + 733["Segment
[54099, 54148, 0]"] + 734["Segment
[54154, 54225, 0]"] + 735["Segment
[54231, 54303, 0]"] + 736["Segment
[54309, 54383, 0]"] + 737["Segment
[54389, 54461, 0]"] + 738["Segment
[54467, 54539, 0]"] + 739["Segment
[54545, 54594, 0]"] + 740["Segment
[54600, 54673, 0]"] + 741["Segment
[54679, 54750, 0]"] + 742["Segment
[54756, 54827, 0]"] + 743["Segment
[54833, 54882, 0]"] + 744["Segment
[54888, 54959, 0]"] + 745["Segment
[54965, 55014, 0]"] + 746["Segment
[55020, 55091, 0]"] + 747["Segment
[55097, 55168, 0]"] + 748["Segment
[55174, 55246, 0]"] + 749["Segment
[55252, 55326, 0]"] + 750["Segment
[55332, 55405, 0]"] + 751["Segment
[55411, 55483, 0]"] + 752["Segment
[55489, 55562, 0]"] + 753["Segment
[55568, 55639, 0]"] + 754["Segment
[55645, 55716, 0]"] + 755["Segment
[55722, 55793, 0]"] + 756["Segment
[55799, 55872, 0]"] + 757["Segment
[55878, 55950, 0]"] + 758["Segment
[55956, 56028, 0]"] + 759["Segment
[56034, 56106, 0]"] + 760["Segment
[56112, 56186, 0]"] + 761["Segment
[56192, 56264, 0]"] + 762["Segment
[56270, 56344, 0]"] + 763["Segment
[56350, 56421, 0]"] + 764["Segment
[56427, 56498, 0]"] + 765["Segment
[56504, 56553, 0]"] + 766["Segment
[56559, 56633, 0]"] + 767["Segment
[56639, 56712, 0]"] + 768["Segment
[56718, 56791, 0]"] + 769["Segment
[56797, 56845, 0]"] + 770["Segment
[56851, 56924, 0]"] + 771["Segment
[56930, 56978, 0]"] + 772["Segment
[56984, 57056, 0]"] + 773["Segment
[57062, 57111, 0]"] + 774["Segment
[57117, 57188, 0]"] + 775["Segment
[57194, 57243, 0]"] + 776["Segment
[57249, 57322, 0]"] + 777["Segment
[57328, 57399, 0]"] + 778["Segment
[57405, 57476, 0]"] + 779["Segment
[57482, 57553, 0]"] + 780["Segment
[57559, 57630, 0]"] + 781["Segment
[57636, 57685, 0]"] + 782["Segment
[57691, 57764, 0]"] + 783["Segment
[57770, 57842, 0]"] + 784["Segment
[57848, 57921, 0]"] + 785["Segment
[57927, 57998, 0]"] + 786["Segment
[58004, 58075, 0]"] + 787["Segment
[58081, 58152, 0]"] + 788["Segment
[58158, 58229, 0]"] + 789["Segment
[58235, 58306, 0]"] + 790["Segment
[58312, 58385, 0]"] + 791["Segment
[58391, 58440, 0]"] + 792["Segment
[58446, 58518, 0]"] + 793["Segment
[58524, 58595, 0]"] + 794["Segment
[58601, 58672, 0]"] + 795["Segment
[58678, 58749, 0]"] + 796["Segment
[58755, 58826, 0]"] + 797["Segment
[58832, 58904, 0]"] + 798["Segment
[58910, 58982, 0]"] + 799["Segment
[58988, 59061, 0]"] + 800["Segment
[59067, 59140, 0]"] + 801["Segment
[59146, 59219, 0]"] + 802["Segment
[59225, 59274, 0]"] + 803["Segment
[59280, 59352, 0]"] + 804["Segment
[59358, 59429, 0]"] + 805["Segment
[59435, 59506, 0]"] + 806["Segment
[59512, 59585, 0]"] + 807["Segment
[59591, 59663, 0]"] + 808["Segment
[59669, 59741, 0]"] + 809["Segment
[59747, 59819, 0]"] + 810["Segment
[59825, 59899, 0]"] + 811["Segment
[59905, 59977, 0]"] + 812["Segment
[59983, 60057, 0]"] + 813["Segment
[60063, 60134, 0]"] + 814["Segment
[60140, 60211, 0]"] + 815["Segment
[60217, 60266, 0]"] + 816["Segment
[60272, 60346, 0]"] + 817["Segment
[60352, 60425, 0]"] + 818["Segment
[60431, 60504, 0]"] + 819["Segment
[60510, 60558, 0]"] + 820["Segment
[60564, 60637, 0]"] + 821["Segment
[60643, 60691, 0]"] + 822["Segment
[60697, 60769, 0]"] + 823["Segment
[60775, 60824, 0]"] + 824["Segment
[60830, 60901, 0]"] + 825["Segment
[60907, 60956, 0]"] + 826["Segment
[60962, 61035, 0]"] + 827["Segment
[61041, 61112, 0]"] + 828["Segment
[61118, 61190, 0]"] + 829["Segment
[61196, 61270, 0]"] + 830["Segment
[61276, 61349, 0]"] + 831["Segment
[61355, 61427, 0]"] + 832["Segment
[61433, 61505, 0]"] + 833["Segment
[61511, 61560, 0]"] + 834["Segment
[61566, 61637, 0]"] + 835["Segment
[61643, 61715, 0]"] + 836["Segment
[61721, 61795, 0]"] + 837["Segment
[61801, 61873, 0]"] + 838["Segment
[61879, 61951, 0]"] + 839["Segment
[61957, 62006, 0]"] + 840["Segment
[62012, 62085, 0]"] + 841["Segment
[62091, 62162, 0]"] + 842["Segment
[62168, 62239, 0]"] + 843["Segment
[62245, 62294, 0]"] + 844["Segment
[62300, 62371, 0]"] + 845["Segment
[62377, 62426, 0]"] + 846["Segment
[62432, 62503, 0]"] + 847["Segment
[62509, 62580, 0]"] + 848["Segment
[62586, 62658, 0]"] + 849["Segment
[62664, 62738, 0]"] + 850["Segment
[62744, 62817, 0]"] + 851["Segment
[62823, 62895, 0]"] + 852["Segment
[62901, 62974, 0]"] + 853["Segment
[62980, 63051, 0]"] + 854["Segment
[63057, 63128, 0]"] + 855["Segment
[63134, 63205, 0]"] + 856["Segment
[63211, 63284, 0]"] + 857["Segment
[63290, 63362, 0]"] + 858["Segment
[63368, 63440, 0]"] + 859["Segment
[63446, 63518, 0]"] + 860["Segment
[63524, 63598, 0]"] + 861["Segment
[63604, 63676, 0]"] + 862["Segment
[63682, 63756, 0]"] + 863["Segment
[63762, 63833, 0]"] + 864["Segment
[63839, 63910, 0]"] + 865["Segment
[63916, 63965, 0]"] + 866["Segment
[63971, 64045, 0]"] + 867["Segment
[64051, 64124, 0]"] + 868["Segment
[64130, 64203, 0]"] + 869["Segment
[64209, 64257, 0]"] + 870["Segment
[64263, 64336, 0]"] + 871["Segment
[64342, 64390, 0]"] + 872["Segment
[64396, 64468, 0]"] + 873["Segment
[64474, 64523, 0]"] + 874["Segment
[64529, 64600, 0]"] + 875["Segment
[64606, 64655, 0]"] + 876["Segment
[64661, 64733, 0]"] + 877["Segment
[64739, 64810, 0]"] + 878["Segment
[64816, 64887, 0]"] + 879["Segment
[64893, 64966, 0]"] + 880["Segment
[64972, 65044, 0]"] + 881["Segment
[65050, 65122, 0]"] + 882["Segment
[65128, 65200, 0]"] + 883["Segment
[65206, 65280, 0]"] + 884["Segment
[65286, 65358, 0]"] + 885["Segment
[65364, 65438, 0]"] + 886["Segment
[65444, 65515, 0]"] + 887["Segment
[65521, 65592, 0]"] + 888["Segment
[65598, 65647, 0]"] + 889["Segment
[65653, 65727, 0]"] + 890["Segment
[65733, 65806, 0]"] + 891["Segment
[65812, 65885, 0]"] + 892["Segment
[65891, 65939, 0]"] + 893["Segment
[65945, 66018, 0]"] + 894["Segment
[66024, 66072, 0]"] + 895["Segment
[66078, 66150, 0]"] + 896["Segment
[66156, 66205, 0]"] + 897["Segment
[66211, 66282, 0]"] + 898["Segment
[66288, 66337, 0]"] + 899["Segment
[66343, 66416, 0]"] + 900["Segment
[66422, 66493, 0]"] + 901["Segment
[66499, 66571, 0]"] + 902["Segment
[66577, 66651, 0]"] + 903["Segment
[66657, 66730, 0]"] + 904["Segment
[66736, 66808, 0]"] + 905["Segment
[66814, 66886, 0]"] + 906["Segment
[66892, 66941, 0]"] + 907["Segment
[66947, 67018, 0]"] + 908["Segment
[67024, 67096, 0]"] + 909["Segment
[67102, 67176, 0]"] + 910["Segment
[67182, 67254, 0]"] + 911["Segment
[67260, 67332, 0]"] + 912["Segment
[67338, 67387, 0]"] + 913["Segment
[67393, 67466, 0]"] + 914["Segment
[67472, 67543, 0]"] + 915["Segment
[67549, 67620, 0]"] + 916["Segment
[67626, 67675, 0]"] + 917["Segment
[67681, 67752, 0]"] + 918["Segment
[67758, 67807, 0]"] + 919["Segment
[67813, 67884, 0]"] + 920["Segment
[67890, 67961, 0]"] + 921["Segment
[67967, 68039, 0]"] + 922["Segment
[68045, 68119, 0]"] + 923["Segment
[68125, 68198, 0]"] + 924["Segment
[68204, 68276, 0]"] + 925["Segment
[68282, 68355, 0]"] + 926["Segment
[68361, 68432, 0]"] + 927["Segment
[68438, 68509, 0]"] + 928["Segment
[68515, 68586, 0]"] + 929["Segment
[68592, 68665, 0]"] + 930["Segment
[68671, 68743, 0]"] + 931["Segment
[68749, 68821, 0]"] + 932["Segment
[68827, 68899, 0]"] + 933["Segment
[68905, 68979, 0]"] + 934["Segment
[68985, 69057, 0]"] + 935["Segment
[69063, 69137, 0]"] + 936["Segment
[69143, 69214, 0]"] + 937["Segment
[69220, 69291, 0]"] + 938["Segment
[69297, 69346, 0]"] + 939["Segment
[69352, 69426, 0]"] + 940["Segment
[69432, 69505, 0]"] + 941["Segment
[69511, 69584, 0]"] + 942["Segment
[69590, 69638, 0]"] + 943["Segment
[69644, 69717, 0]"] + 944["Segment
[69723, 69771, 0]"] + 945["Segment
[69777, 69849, 0]"] + 946["Segment
[69855, 69904, 0]"] + 947["Segment
[69910, 69981, 0]"] + 948["Segment
[69987, 70060, 0]"] + 949["Segment
[70066, 70139, 0]"] + 950["Segment
[70145, 70194, 0]"] + 951["Segment
[70200, 70273, 0]"] + 952["Segment
[70279, 70350, 0]"] + 953["Segment
[70356, 70427, 0]"] + 954["Segment
[70433, 70504, 0]"] + 955["Segment
[70510, 70581, 0]"] + 956["Segment
[70587, 70636, 0]"] + 957["Segment
[70642, 70715, 0]"] + 958["Segment
[70721, 70793, 0]"] + 959["Segment
[70799, 70872, 0]"] + 960["Segment
[70878, 70949, 0]"] + 961["Segment
[70955, 71026, 0]"] + 962["Segment
[71032, 71103, 0]"] + 963["Segment
[71109, 71180, 0]"] + 964["Segment
[71186, 71257, 0]"] + 965["Segment
[71263, 71336, 0]"] + 966["Segment
[71342, 71391, 0]"] + 967["Segment
[71397, 71469, 0]"] + 968["Segment
[71475, 71546, 0]"] + 969["Segment
[71552, 71623, 0]"] + 970["Segment
[71629, 71700, 0]"] + 971["Segment
[71706, 71777, 0]"] + 972["Segment
[71783, 71855, 0]"] + 973["Segment
[71861, 71933, 0]"] + 974["Segment
[71939, 72012, 0]"] + 975["Segment
[72018, 72091, 0]"] + 976["Segment
[72097, 72170, 0]"] + 977["Segment
[72176, 72225, 0]"] + 978["Segment
[72231, 72302, 0]"] + 979["Segment
[72308, 72380, 0]"] + 980["Segment
[72386, 72457, 0]"] + 981["Segment
[72463, 72512, 0]"] + 982["Segment
[72518, 72591, 0]"] + 983["Segment
[72597, 72669, 0]"] + 984["Segment
[72675, 72748, 0]"] + 985["Segment
[72754, 72828, 0]"] + 986["Segment
[72834, 72905, 0]"] + 987["Segment
[72911, 72960, 0]"] + 988["Segment
[72966, 73037, 0]"] + 989["Segment
[73043, 73118, 0]"] + 990["Segment
[73124, 73197, 0]"] + 991["Segment
[73203, 73251, 0]"] + 992["Segment
[73257, 73328, 0]"] + 993["Segment
[73334, 73406, 0]"] + 994["Segment
[73412, 73484, 0]"] + 995["Segment
[73490, 73561, 0]"] + 996["Segment
[73567, 73616, 0]"] + 997["Segment
[73622, 73694, 0]"] + 998["Segment
[73700, 73771, 0]"] + 999["Segment
[73777, 73848, 0]"] + 1000["Segment
[73854, 73926, 0]"] + 1001["Segment
[73932, 74005, 0]"] + 1002["Segment
[74011, 74082, 0]"] + 1003["Segment
[74088, 74096, 0]"] + 1004[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 1005["Sweep Extrusion
[74102, 74115, 0]"] + 1006[Wall] + 1007[Wall] + 1008[Wall] + 1009[Wall] + 1010[Wall] + 1011[Wall] + 1012[Wall] + 1013[Wall] + 1014[Wall] + 1015[Wall] + 1016[Wall] + 1017[Wall] + 1018[Wall] + 1019[Wall] + 1020[Wall] + 1021[Wall] + 1022[Wall] + 1023[Wall] + 1024[Wall] + 1025[Wall] + 1026[Wall] + 1027[Wall] + 1028[Wall] + 1029[Wall] + 1030[Wall] + 1031[Wall] + 1032[Wall] + 1033[Wall] + 1034[Wall] + 1035[Wall] + 1036[Wall] + 1037[Wall] + 1038[Wall] + 1039[Wall] + 1040[Wall] + 1041[Wall] + 1042[Wall] + 1043[Wall] + 1044[Wall] + 1045[Wall] + 1046[Wall] + 1047[Wall] + 1048[Wall] + 1049[Wall] + 1050[Wall] + 1051[Wall] + 1052[Wall] + 1053[Wall] + 1054[Wall] + 1055[Wall] + 1056[Wall] + 1057[Wall] + 1058[Wall] + 1059[Wall] + 1060[Wall] + 1061[Wall] + 1062[Wall] + 1063[Wall] + 1064[Wall] + 1065[Wall] + 1066[Wall] + 1067[Wall] + 1068[Wall] + 1069[Wall] + 1070[Wall] + 1071[Wall] + 1072[Wall] + 1073[Wall] + 1074[Wall] + 1075[Wall] + 1076[Wall] + 1077[Wall] + 1078[Wall] + 1079[Wall] + 1080[Wall] + 1081[Wall] + 1082[Wall] + 1083[Wall] + 1084[Wall] + 1085[Wall] + 1086[Wall] + 1087[Wall] + 1088[Wall] + 1089[Wall] + 1090[Wall] + 1091[Wall] + 1092[Wall] + 1093[Wall] + 1094[Wall] + 1095[Wall] + 1096[Wall] + 1097[Wall] + 1098[Wall] + 1099[Wall] + 1100[Wall] + 1101[Wall] + 1102[Wall] + 1103[Wall] + 1104[Wall] + 1105[Wall] + 1106[Wall] + 1107[Wall] + 1108[Wall] + 1109[Wall] + 1110[Wall] + 1111[Wall] + 1112[Wall] + 1113[Wall] + 1114[Wall] + 1115[Wall] + 1116[Wall] + 1117[Wall] + 1118[Wall] + 1119[Wall] + 1120[Wall] + 1121[Wall] + 1122[Wall] + 1123[Wall] + 1124[Wall] + 1125[Wall] + 1126[Wall] + 1127[Wall] + 1128[Wall] + 1129[Wall] + 1130[Wall] + 1131[Wall] + 1132[Wall] + 1133[Wall] + 1134[Wall] + 1135[Wall] + 1136[Wall] + 1137[Wall] + 1138[Wall] + 1139[Wall] + 1140[Wall] + 1141[Wall] + 1142[Wall] + 1143[Wall] + 1144[Wall] + 1145[Wall] + 1146[Wall] + 1147[Wall] + 1148[Wall] + 1149[Wall] + 1150[Wall] + 1151[Wall] + 1152[Wall] + 1153[Wall] + 1154[Wall] + 1155[Wall] + 1156[Wall] + 1157[Wall] + 1158[Wall] + 1159[Wall] + 1160[Wall] + 1161[Wall] + 1162[Wall] + 1163[Wall] + 1164[Wall] + 1165[Wall] + 1166[Wall] + 1167[Wall] + 1168[Wall] + 1169[Wall] + 1170[Wall] + 1171[Wall] + 1172[Wall] + 1173[Wall] + 1174[Wall] + 1175[Wall] + 1176[Wall] + 1177[Wall] + 1178[Wall] + 1179[Wall] + 1180[Wall] + 1181[Wall] + 1182[Wall] + 1183[Wall] + 1184[Wall] + 1185[Wall] + 1186[Wall] + 1187[Wall] + 1188[Wall] + 1189[Wall] + 1190[Wall] + 1191[Wall] + 1192[Wall] + 1193[Wall] + 1194[Wall] + 1195[Wall] + 1196[Wall] + 1197[Wall] + 1198[Wall] + 1199[Wall] + 1200[Wall] + 1201[Wall] + 1202[Wall] + 1203[Wall] + 1204[Wall] + 1205[Wall] + 1206[Wall] + 1207[Wall] + 1208[Wall] + 1209[Wall] + 1210[Wall] + 1211[Wall] + 1212[Wall] + 1213[Wall] + 1214[Wall] + 1215[Wall] + 1216[Wall] + 1217[Wall] + 1218[Wall] + 1219[Wall] + 1220[Wall] + 1221[Wall] + 1222[Wall] + 1223[Wall] + 1224[Wall] + 1225[Wall] + 1226[Wall] + 1227[Wall] + 1228[Wall] + 1229[Wall] + 1230[Wall] + 1231[Wall] + 1232[Wall] + 1233[Wall] + 1234[Wall] + 1235[Wall] + 1236[Wall] + 1237[Wall] + 1238[Wall] + 1239[Wall] + 1240[Wall] + 1241[Wall] + 1242[Wall] + 1243[Wall] + 1244[Wall] + 1245[Wall] + 1246[Wall] + 1247[Wall] + 1248[Wall] + 1249[Wall] + 1250[Wall] + 1251[Wall] + 1252[Wall] + 1253[Wall] + 1254[Wall] + 1255[Wall] + 1256[Wall] + 1257[Wall] + 1258[Wall] + 1259[Wall] + 1260[Wall] + 1261[Wall] + 1262[Wall] + 1263[Wall] + 1264[Wall] + 1265[Wall] + 1266[Wall] + 1267[Wall] + 1268[Wall] + 1269[Wall] + 1270[Wall] + 1271[Wall] + 1272[Wall] + 1273[Wall] + 1274[Wall] + 1275[Wall] + 1276[Wall] + 1277[Wall] + 1278[Wall] + 1279[Wall] + 1280[Wall] + 1281[Wall] + 1282[Wall] + 1283[Wall] + 1284[Wall] + 1285[Wall] + 1286[Wall] + 1287[Wall] + 1288[Wall] + 1289[Wall] + 1290[Wall] + 1291[Wall] + 1292[Wall] + 1293[Wall] + 1294[Wall] + 1295[Wall] + 1296[Wall] + 1297[Wall] + 1298[Wall] + 1299[Wall] + 1300[Wall] + 1301[Wall] + 1302[Wall] + 1303[Wall] + 1304[Wall] + 1305[Wall] + 1306[Wall] + 1307[Wall] + 1308[Wall] + 1309[Wall] + 1310[Wall] + 1311[Wall] + 1312[Wall] + 1313[Wall] + 1314[Wall] + 1315[Wall] + 1316[Wall] + 1317[Wall] + 1318[Wall] + 1319[Wall] + 1320[Wall] + 1321[Wall] + 1322[Wall] + 1323[Wall] + 1324[Wall] + 1325[Wall] + 1326[Wall] + 1327[Wall] + 1328[Wall] + 1329[Wall] + 1330[Wall] + 1331[Wall] + 1332[Wall] + 1333[Wall] + 1334[Wall] + 1335[Wall] + 1336[Wall] + 1337[Wall] + 1338[Wall] + 1339[Wall] + 1340[Wall] + 1341[Wall] + 1342[Wall] + 1343[Wall] + 1344[Wall] + 1345[Wall] + 1346[Wall] + 1347[Wall] + 1348[Wall] + 1349[Wall] + 1350[Wall] + 1351[Wall] + 1352[Wall] + 1353[Wall] + 1354[Wall] + 1355[Wall] + 1356[Wall] + 1357[Wall] + 1358[Wall] + 1359[Wall] + 1360[Wall] + 1361[Wall] + 1362[Wall] + 1363[Wall] + 1364[Wall] + 1365[Wall] + 1366[Wall] + 1367[Wall] + 1368[Wall] + 1369[Wall] + 1370[Wall] + 1371[Wall] + 1372[Wall] + 1373[Wall] + 1374[Wall] + 1375[Wall] + 1376[Wall] + 1377[Wall] + 1378[Wall] + 1379[Wall] + 1380[Wall] + 1381[Wall] + 1382[Wall] + 1383[Wall] + 1384[Wall] + 1385[Wall] + 1386[Wall] + 1387[Wall] + 1388[Wall] + 1389[Wall] + 1390[Wall] + 1391[Wall] + 1392[Wall] + 1393[Wall] + 1394[Wall] + 1395[Wall] + 1396[Wall] + 1397[Wall] + 1398[Wall] + 1399[Wall] + 1400[Wall] + 1401[Wall] + 1402[Wall] + 1403[Wall] + 1404[Wall] + 1405[Wall] + 1406[Wall] + 1407[Wall] + 1408[Wall] + 1409[Wall] + 1410[Wall] + 1411[Wall] + 1412[Wall] + 1413[Wall] + 1414[Wall] + 1415[Wall] + 1416[Wall] + 1417[Wall] + 1418[Wall] + 1419[Wall] + 1420[Wall] + 1421[Wall] + 1422[Wall] + 1423[Wall] + 1424[Wall] + 1425[Wall] + 1426[Wall] + 1427[Wall] + 1428[Wall] + 1429[Wall] + 1430[Wall] + 1431[Wall] + 1432[Wall] + 1433[Wall] + 1434[Wall] + 1435[Wall] + 1436[Wall] + 1437[Wall] + 1438[Wall] + 1439[Wall] + 1440[Wall] + 1441[Wall] + 1442[Wall] + 1443[Wall] + 1444[Wall] + 1445[Wall] + 1446[Wall] + 1447[Wall] + 1448[Wall] + 1449[Wall] + 1450[Wall] + 1451[Wall] + 1452[Wall] + 1453[Wall] + 1454[Wall] + 1455[Wall] + 1456[Wall] + 1457[Wall] + 1458[Wall] + 1459[Wall] + 1460[Wall] + 1461[Wall] + 1462[Wall] + 1463[Wall] + 1464[Wall] + 1465[Wall] + 1466[Wall] + 1467[Wall] + 1468[Wall] + 1469[Wall] + 1470[Wall] + 1471[Wall] + 1472[Wall] + 1473[Wall] + 1474[Wall] + 1475[Wall] + 1476[Wall] + 1477[Wall] + 1478[Wall] + 1479[Wall] + 1480[Wall] + 1481[Wall] + 1482[Wall] + 1483[Wall] + 1484[Wall] + 1485[Wall] + 1486[Wall] + 1487[Wall] + 1488[Wall] + 1489[Wall] + 1490[Wall] + 1491[Wall] + 1492[Wall] + 1493[Wall] + 1494[Wall] + 1495[Wall] + 1496[Wall] + 1497[Wall] + 1498[Wall] + 1499[Wall] + 1500[Wall] + 1501[Wall] + 1502[Wall] + 1503[Wall] + 1504[Wall] + 1505[Wall] + 1506[Wall] + 1507[Wall] + 1508[Wall] + 1509[Wall] + 1510[Wall] + 1511[Wall] + 1512[Wall] + 1513[Wall] + 1514[Wall] + 1515[Wall] + 1516[Wall] + 1517[Wall] + 1518[Wall] + 1519[Wall] + 1520[Wall] + 1521[Wall] + 1522[Wall] + 1523[Wall] + 1524[Wall] + 1525[Wall] + 1526[Wall] + 1527[Wall] + 1528[Wall] + 1529[Wall] + 1530[Wall] + 1531[Wall] + 1532[Wall] + 1533[Wall] + 1534[Wall] + 1535[Wall] + 1536[Wall] + 1537[Wall] + 1538[Wall] + 1539[Wall] + 1540[Wall] + 1541[Wall] + 1542[Wall] + 1543[Wall] + 1544[Wall] + 1545[Wall] + 1546[Wall] + 1547[Wall] + 1548[Wall] + 1549[Wall] + 1550[Wall] + 1551[Wall] + 1552[Wall] + 1553[Wall] + 1554[Wall] + 1555[Wall] + 1556[Wall] + 1557[Wall] + 1558[Wall] + 1559[Wall] + 1560[Wall] + 1561[Wall] + 1562[Wall] + 1563[Wall] + 1564[Wall] + 1565[Wall] + 1566[Wall] + 1567[Wall] + 1568[Wall] + 1569[Wall] + 1570[Wall] + 1571[Wall] + 1572[Wall] + 1573[Wall] + 1574[Wall] + 1575[Wall] + 1576[Wall] + 1577[Wall] + 1578[Wall] + 1579[Wall] + 1580[Wall] + 1581[Wall] + 1582[Wall] + 1583[Wall] + 1584[Wall] + 1585[Wall] + 1586[Wall] + 1587[Wall] + 1588[Wall] + 1589[Wall] + 1590[Wall] + 1591[Wall] + 1592[Wall] + 1593[Wall] + 1594[Wall] + 1595[Wall] + 1596[Wall] + 1597[Wall] + 1598[Wall] + 1599[Wall] + 1600[Wall] + 1601[Wall] + 1602[Wall] + 1603[Wall] + 1604[Wall] + 1605[Wall] + 1606[Wall] + 1607[Wall] + 1608[Wall] + 1609[Wall] + 1610[Wall] + 1611[Wall] + 1612[Wall] + 1613[Wall] + 1614[Wall] + 1615[Wall] + 1616[Wall] + 1617[Wall] + 1618[Wall] + 1619[Wall] + 1620[Wall] + 1621[Wall] + 1622[Wall] + 1623[Wall] + 1624[Wall] + 1625[Wall] + 1626[Wall] + 1627[Wall] + 1628[Wall] + 1629[Wall] + 1630[Wall] + 1631[Wall] + 1632[Wall] + 1633[Wall] + 1634[Wall] + 1635[Wall] + 1636[Wall] + 1637[Wall] + 1638[Wall] + 1639[Wall] + 1640[Wall] + 1641[Wall] + 1642[Wall] + 1643[Wall] + 1644[Wall] + 1645[Wall] + 1646[Wall] + 1647[Wall] + 1648[Wall] + 1649[Wall] + 1650[Wall] + 1651[Wall] + 1652[Wall] + 1653[Wall] + 1654[Wall] + 1655[Wall] + 1656[Wall] + 1657[Wall] + 1658[Wall] + 1659[Wall] + 1660[Wall] + 1661[Wall] + 1662[Wall] + 1663[Wall] + 1664[Wall] + 1665[Wall] + 1666[Wall] + 1667[Wall] + 1668[Wall] + 1669[Wall] + 1670[Wall] + 1671[Wall] + 1672[Wall] + 1673[Wall] + 1674[Wall] + 1675[Wall] + 1676[Wall] + 1677[Wall] + 1678[Wall] + 1679[Wall] + 1680[Wall] + 1681[Wall] + 1682[Wall] + 1683[Wall] + 1684[Wall] + 1685[Wall] + 1686[Wall] + 1687[Wall] + 1688[Wall] + 1689[Wall] + 1690[Wall] + 1691[Wall] + 1692[Wall] + 1693[Wall] + 1694[Wall] + 1695[Wall] + 1696[Wall] + 1697[Wall] + 1698[Wall] + 1699[Wall] + 1700[Wall] + 1701[Wall] + 1702[Wall] + 1703[Wall] + 1704[Wall] + 1705[Wall] + 1706[Wall] + 1707[Wall] + 1708[Wall] + 1709[Wall] + 1710[Wall] + 1711[Wall] + 1712[Wall] + 1713[Wall] + 1714[Wall] + 1715[Wall] + 1716[Wall] + 1717[Wall] + 1718[Wall] + 1719[Wall] + 1720[Wall] + 1721[Wall] + 1722[Wall] + 1723[Wall] + 1724[Wall] + 1725[Wall] + 1726[Wall] + 1727[Wall] + 1728[Wall] + 1729[Wall] + 1730[Wall] + 1731[Wall] + 1732[Wall] + 1733[Wall] + 1734[Wall] + 1735[Wall] + 1736[Wall] + 1737[Wall] + 1738[Wall] + 1739[Wall] + 1740[Wall] + 1741[Wall] + 1742[Wall] + 1743[Wall] + 1744[Wall] + 1745[Wall] + 1746[Wall] + 1747[Wall] + 1748[Wall] + 1749[Wall] + 1750[Wall] + 1751[Wall] + 1752[Wall] + 1753[Wall] + 1754[Wall] + 1755[Wall] + 1756[Wall] + 1757[Wall] + 1758[Wall] + 1759[Wall] + 1760[Wall] + 1761[Wall] + 1762[Wall] + 1763[Wall] + 1764[Wall] + 1765[Wall] + 1766[Wall] + 1767[Wall] + 1768[Wall] + 1769[Wall] + 1770[Wall] + 1771[Wall] + 1772[Wall] + 1773[Wall] + 1774[Wall] + 1775[Wall] + 1776[Wall] + 1777[Wall] + 1778[Wall] + 1779[Wall] + 1780[Wall] + 1781[Wall] + 1782[Wall] + 1783[Wall] + 1784[Wall] + 1785[Wall] + 1786[Wall] + 1787[Wall] + 1788[Wall] + 1789[Wall] + 1790[Wall] + 1791[Wall] + 1792[Wall] + 1793[Wall] + 1794[Wall] + 1795[Wall] + 1796[Wall] + 1797[Wall] + 1798[Wall] + 1799[Wall] + 1800[Wall] + 1801[Wall] + 1802[Wall] + 1803[Wall] + 1804[Wall] + 1805[Wall] + 1806[Wall] + 1807[Wall] + 1808[Wall] + 1809[Wall] + 1810[Wall] + 1811[Wall] + 1812[Wall] + 1813[Wall] + 1814[Wall] + 1815[Wall] + 1816[Wall] + 1817[Wall] + 1818[Wall] + 1819[Wall] + 1820[Wall] + 1821[Wall] + 1822[Wall] + 1823[Wall] + 1824[Wall] + 1825[Wall] + 1826[Wall] + 1827[Wall] + 1828[Wall] + 1829[Wall] + 1830[Wall] + 1831[Wall] + 1832[Wall] + 1833[Wall] + 1834[Wall] + 1835[Wall] + 1836[Wall] + 1837[Wall] + 1838[Wall] + 1839[Wall] + 1840[Wall] + 1841[Wall] + 1842[Wall] + 1843[Wall] + 1844[Wall] + 1845[Wall] + 1846[Wall] + 1847[Wall] + 1848[Wall] + 1849[Wall] + 1850[Wall] + 1851[Wall] + 1852[Wall] + 1853[Wall] + 1854[Wall] + 1855[Wall] + 1856[Wall] + 1857[Wall] + 1858[Wall] + 1859[Wall] + 1860[Wall] + 1861[Wall] + 1862[Wall] + 1863[Wall] + 1864[Wall] + 1865[Wall] + 1866[Wall] + 1867[Wall] + 1868[Wall] + 1869[Wall] + 1870[Wall] + 1871[Wall] + 1872[Wall] + 1873[Wall] + 1874[Wall] + 1875[Wall] + 1876[Wall] + 1877[Wall] + 1878[Wall] + 1879[Wall] + 1880[Wall] + 1881[Wall] + 1882[Wall] + 1883[Wall] + 1884[Wall] + 1885[Wall] + 1886[Wall] + 1887[Wall] + 1888[Wall] + 1889[Wall] + 1890[Wall] + 1891[Wall] + 1892[Wall] + 1893[Wall] + 1894[Wall] + 1895[Wall] + 1896[Wall] + 1897[Wall] + 1898[Wall] + 1899[Wall] + 1900[Wall] + 1901[Wall] + 1902[Wall] + 1903[Wall] + 1904[Wall] + 1905[Wall] + 1906[Wall] + 1907[Wall] + 1908[Wall] + 1909[Wall] + 1910[Wall] + 1911[Wall] + 1912[Wall] + 1913[Wall] + 1914[Wall] + 1915[Wall] + 1916[Wall] + 1917[Wall] + 1918[Wall] + 1919[Wall] + 1920[Wall] + 1921[Wall] + 1922[Wall] + 1923[Wall] + 1924[Wall] + 1925[Wall] + 1926[Wall] + 1927[Wall] + 1928[Wall] + 1929[Wall] + 1930[Wall] + 1931[Wall] + 1932[Wall] + 1933[Wall] + 1934[Wall] + 1935[Wall] + 1936[Wall] + 1937[Wall] + 1938[Wall] + 1939[Wall] + 1940[Wall] + 1941[Wall] + 1942[Wall] + 1943[Wall] + 1944[Wall] + 1945[Wall] + 1946[Wall] + 1947[Wall] + 1948[Wall] + 1949[Wall] + 1950[Wall] + 1951[Wall] + 1952[Wall] + 1953[Wall] + 1954[Wall] + 1955[Wall] + 1956[Wall] + 1957[Wall] + 1958[Wall] + 1959[Wall] + 1960[Wall] + 1961[Wall] + 1962[Wall] + 1963[Wall] + 1964[Wall] + 1965[Wall] + 1966[Wall] + 1967[Wall] + 1968[Wall] + 1969[Wall] + 1970[Wall] + 1971[Wall] + 1972[Wall] + 1973[Wall] + 1974[Wall] + 1975[Wall] + 1976[Wall] + 1977[Wall] + 1978[Wall] + 1979[Wall] + 1980[Wall] + 1981[Wall] + 1982[Wall] + 1983[Wall] + 1984[Wall] + 1985[Wall] + 1986[Wall] + 1987[Wall] + 1988[Wall] + 1989[Wall] + 1990[Wall] + 1991[Wall] + 1992[Wall] + 1993[Wall] + 1994[Wall] + 1995[Wall] + 1996[Wall] + 1997[Wall] + 1998[Wall] + 1999[Wall] + 2000[Wall] + 2001[Wall] + 2002[Wall] + 2003[Wall] + 2004[Wall] + 2005[Wall] + 2006[Wall] + 2007["Cap Start"] + 2008["Cap End"] + 2009["SweepEdge Opposite"] + 2010["SweepEdge Adjacent"] + 2011["SweepEdge Opposite"] + 2012["SweepEdge Adjacent"] + 2013["SweepEdge Opposite"] + 2014["SweepEdge Adjacent"] + 2015["SweepEdge Opposite"] + 2016["SweepEdge Adjacent"] + 2017["SweepEdge Opposite"] + 2018["SweepEdge Adjacent"] + 2019["SweepEdge Opposite"] + 2020["SweepEdge Adjacent"] + 2021["SweepEdge Opposite"] + 2022["SweepEdge Adjacent"] + 2023["SweepEdge Opposite"] + 2024["SweepEdge Adjacent"] + 2025["SweepEdge Opposite"] + 2026["SweepEdge Adjacent"] + 2027["SweepEdge Opposite"] + 2028["SweepEdge Adjacent"] + 2029["SweepEdge Opposite"] + 2030["SweepEdge Adjacent"] + 2031["SweepEdge Opposite"] + 2032["SweepEdge Adjacent"] + 2033["SweepEdge Opposite"] + 2034["SweepEdge Adjacent"] + 2035["SweepEdge Opposite"] + 2036["SweepEdge Adjacent"] + 2037["SweepEdge Opposite"] + 2038["SweepEdge Adjacent"] + 2039["SweepEdge Opposite"] + 2040["SweepEdge Adjacent"] + 2041["SweepEdge Opposite"] + 2042["SweepEdge Adjacent"] + 2043["SweepEdge Opposite"] + 2044["SweepEdge Adjacent"] + 2045["SweepEdge Opposite"] + 2046["SweepEdge Adjacent"] + 2047["SweepEdge Opposite"] + 2048["SweepEdge Adjacent"] + 2049["SweepEdge Opposite"] + 2050["SweepEdge Adjacent"] + 2051["SweepEdge Opposite"] + 2052["SweepEdge Adjacent"] + 2053["SweepEdge Opposite"] + 2054["SweepEdge Adjacent"] + 2055["SweepEdge Opposite"] + 2056["SweepEdge Adjacent"] + 2057["SweepEdge Opposite"] + 2058["SweepEdge Adjacent"] + 2059["SweepEdge Opposite"] + 2060["SweepEdge Adjacent"] + 2061["SweepEdge Opposite"] + 2062["SweepEdge Adjacent"] + 2063["SweepEdge Opposite"] + 2064["SweepEdge Adjacent"] + 2065["SweepEdge Opposite"] + 2066["SweepEdge Adjacent"] + 2067["SweepEdge Opposite"] + 2068["SweepEdge Adjacent"] + 2069["SweepEdge Opposite"] + 2070["SweepEdge Adjacent"] + 2071["SweepEdge Opposite"] + 2072["SweepEdge Adjacent"] + 2073["SweepEdge Opposite"] + 2074["SweepEdge Adjacent"] + 2075["SweepEdge Opposite"] + 2076["SweepEdge Adjacent"] + 2077["SweepEdge Opposite"] + 2078["SweepEdge Adjacent"] + 2079["SweepEdge Opposite"] + 2080["SweepEdge Adjacent"] + 2081["SweepEdge Opposite"] + 2082["SweepEdge Adjacent"] + 2083["SweepEdge Opposite"] + 2084["SweepEdge Adjacent"] + 2085["SweepEdge Opposite"] + 2086["SweepEdge Adjacent"] + 2087["SweepEdge Opposite"] + 2088["SweepEdge Adjacent"] + 2089["SweepEdge Opposite"] + 2090["SweepEdge Adjacent"] + 2091["SweepEdge Opposite"] + 2092["SweepEdge Adjacent"] + 2093["SweepEdge Opposite"] + 2094["SweepEdge Adjacent"] + 2095["SweepEdge Opposite"] + 2096["SweepEdge Adjacent"] + 2097["SweepEdge Opposite"] + 2098["SweepEdge Adjacent"] + 2099["SweepEdge Opposite"] + 2100["SweepEdge Adjacent"] + 2101["SweepEdge Opposite"] + 2102["SweepEdge Adjacent"] + 2103["SweepEdge Opposite"] + 2104["SweepEdge Adjacent"] + 2105["SweepEdge Opposite"] + 2106["SweepEdge Adjacent"] + 2107["SweepEdge Opposite"] + 2108["SweepEdge Adjacent"] + 2109["SweepEdge Opposite"] + 2110["SweepEdge Adjacent"] + 2111["SweepEdge Opposite"] + 2112["SweepEdge Adjacent"] + 2113["SweepEdge Opposite"] + 2114["SweepEdge Adjacent"] + 2115["SweepEdge Opposite"] + 2116["SweepEdge Adjacent"] + 2117["SweepEdge Opposite"] + 2118["SweepEdge Adjacent"] + 2119["SweepEdge Opposite"] + 2120["SweepEdge Adjacent"] + 2121["SweepEdge Opposite"] + 2122["SweepEdge Adjacent"] + 2123["SweepEdge Opposite"] + 2124["SweepEdge Adjacent"] + 2125["SweepEdge Opposite"] + 2126["SweepEdge Adjacent"] + 2127["SweepEdge Opposite"] + 2128["SweepEdge Adjacent"] + 2129["SweepEdge Opposite"] + 2130["SweepEdge Adjacent"] + 2131["SweepEdge Opposite"] + 2132["SweepEdge Adjacent"] + 2133["SweepEdge Opposite"] + 2134["SweepEdge Adjacent"] + 2135["SweepEdge Opposite"] + 2136["SweepEdge Adjacent"] + 2137["SweepEdge Opposite"] + 2138["SweepEdge Adjacent"] + 2139["SweepEdge Opposite"] + 2140["SweepEdge Adjacent"] + 2141["SweepEdge Opposite"] + 2142["SweepEdge Adjacent"] + 2143["SweepEdge Opposite"] + 2144["SweepEdge Adjacent"] + 2145["SweepEdge Opposite"] + 2146["SweepEdge Adjacent"] + 2147["SweepEdge Opposite"] + 2148["SweepEdge Adjacent"] + 2149["SweepEdge Opposite"] + 2150["SweepEdge Adjacent"] + 2151["SweepEdge Opposite"] + 2152["SweepEdge Adjacent"] + 2153["SweepEdge Opposite"] + 2154["SweepEdge Adjacent"] + 2155["SweepEdge Opposite"] + 2156["SweepEdge Adjacent"] + 2157["SweepEdge Opposite"] + 2158["SweepEdge Adjacent"] + 2159["SweepEdge Opposite"] + 2160["SweepEdge Adjacent"] + 2161["SweepEdge Opposite"] + 2162["SweepEdge Adjacent"] + 2163["SweepEdge Opposite"] + 2164["SweepEdge Adjacent"] + 2165["SweepEdge Opposite"] + 2166["SweepEdge Adjacent"] + 2167["SweepEdge Opposite"] + 2168["SweepEdge Adjacent"] + 2169["SweepEdge Opposite"] + 2170["SweepEdge Adjacent"] + 2171["SweepEdge Opposite"] + 2172["SweepEdge Adjacent"] + 2173["SweepEdge Opposite"] + 2174["SweepEdge Adjacent"] + 2175["SweepEdge Opposite"] + 2176["SweepEdge Adjacent"] + 2177["SweepEdge Opposite"] + 2178["SweepEdge Adjacent"] + 2179["SweepEdge Opposite"] + 2180["SweepEdge Adjacent"] + 2181["SweepEdge Opposite"] + 2182["SweepEdge Adjacent"] + 2183["SweepEdge Opposite"] + 2184["SweepEdge Adjacent"] + 2185["SweepEdge Opposite"] + 2186["SweepEdge Adjacent"] + 2187["SweepEdge Opposite"] + 2188["SweepEdge Adjacent"] + 2189["SweepEdge Opposite"] + 2190["SweepEdge Adjacent"] + 2191["SweepEdge Opposite"] + 2192["SweepEdge Adjacent"] + 2193["SweepEdge Opposite"] + 2194["SweepEdge Adjacent"] + 2195["SweepEdge Opposite"] + 2196["SweepEdge Adjacent"] + 2197["SweepEdge Opposite"] + 2198["SweepEdge Adjacent"] + 2199["SweepEdge Opposite"] + 2200["SweepEdge Adjacent"] + 2201["SweepEdge Opposite"] + 2202["SweepEdge Adjacent"] + 2203["SweepEdge Opposite"] + 2204["SweepEdge Adjacent"] + 2205["SweepEdge Opposite"] + 2206["SweepEdge Adjacent"] + 2207["SweepEdge Opposite"] + 2208["SweepEdge Adjacent"] + 2209["SweepEdge Opposite"] + 2210["SweepEdge Adjacent"] + 2211["SweepEdge Opposite"] + 2212["SweepEdge Adjacent"] + 2213["SweepEdge Opposite"] + 2214["SweepEdge Adjacent"] + 2215["SweepEdge Opposite"] + 2216["SweepEdge Adjacent"] + 2217["SweepEdge Opposite"] + 2218["SweepEdge Adjacent"] + 2219["SweepEdge Opposite"] + 2220["SweepEdge Adjacent"] + 2221["SweepEdge Opposite"] + 2222["SweepEdge Adjacent"] + 2223["SweepEdge Opposite"] + 2224["SweepEdge Adjacent"] + 2225["SweepEdge Opposite"] + 2226["SweepEdge Adjacent"] + 2227["SweepEdge Opposite"] + 2228["SweepEdge Adjacent"] + 2229["SweepEdge Opposite"] + 2230["SweepEdge Adjacent"] + 2231["SweepEdge Opposite"] + 2232["SweepEdge Adjacent"] + 2233["SweepEdge Opposite"] + 2234["SweepEdge Adjacent"] + 2235["SweepEdge Opposite"] + 2236["SweepEdge Adjacent"] + 2237["SweepEdge Opposite"] + 2238["SweepEdge Adjacent"] + 2239["SweepEdge Opposite"] + 2240["SweepEdge Adjacent"] + 2241["SweepEdge Opposite"] + 2242["SweepEdge Adjacent"] + 2243["SweepEdge Opposite"] + 2244["SweepEdge Adjacent"] + 2245["SweepEdge Opposite"] + 2246["SweepEdge Adjacent"] + 2247["SweepEdge Opposite"] + 2248["SweepEdge Adjacent"] + 2249["SweepEdge Opposite"] + 2250["SweepEdge Adjacent"] + 2251["SweepEdge Opposite"] + 2252["SweepEdge Adjacent"] + 2253["SweepEdge Opposite"] + 2254["SweepEdge Adjacent"] + 2255["SweepEdge Opposite"] + 2256["SweepEdge Adjacent"] + 2257["SweepEdge Opposite"] + 2258["SweepEdge Adjacent"] + 2259["SweepEdge Opposite"] + 2260["SweepEdge Adjacent"] + 2261["SweepEdge Opposite"] + 2262["SweepEdge Adjacent"] + 2263["SweepEdge Opposite"] + 2264["SweepEdge Adjacent"] + 2265["SweepEdge Opposite"] + 2266["SweepEdge Adjacent"] + 2267["SweepEdge Opposite"] + 2268["SweepEdge Adjacent"] + 2269["SweepEdge Opposite"] + 2270["SweepEdge Adjacent"] + 2271["SweepEdge Opposite"] + 2272["SweepEdge Adjacent"] + 2273["SweepEdge Opposite"] + 2274["SweepEdge Adjacent"] + 2275["SweepEdge Opposite"] + 2276["SweepEdge Adjacent"] + 2277["SweepEdge Opposite"] + 2278["SweepEdge Adjacent"] + 2279["SweepEdge Opposite"] + 2280["SweepEdge Adjacent"] + 2281["SweepEdge Opposite"] + 2282["SweepEdge Adjacent"] + 2283["SweepEdge Opposite"] + 2284["SweepEdge Adjacent"] + 2285["SweepEdge Opposite"] + 2286["SweepEdge Adjacent"] + 2287["SweepEdge Opposite"] + 2288["SweepEdge Adjacent"] + 2289["SweepEdge Opposite"] + 2290["SweepEdge Adjacent"] + 2291["SweepEdge Opposite"] + 2292["SweepEdge Adjacent"] + 2293["SweepEdge Opposite"] + 2294["SweepEdge Adjacent"] + 2295["SweepEdge Opposite"] + 2296["SweepEdge Adjacent"] + 2297["SweepEdge Opposite"] + 2298["SweepEdge Adjacent"] + 2299["SweepEdge Opposite"] + 2300["SweepEdge Adjacent"] + 2301["SweepEdge Opposite"] + 2302["SweepEdge Adjacent"] + 2303["SweepEdge Opposite"] + 2304["SweepEdge Adjacent"] + 2305["SweepEdge Opposite"] + 2306["SweepEdge Adjacent"] + 2307["SweepEdge Opposite"] + 2308["SweepEdge Adjacent"] + 2309["SweepEdge Opposite"] + 2310["SweepEdge Adjacent"] + 2311["SweepEdge Opposite"] + 2312["SweepEdge Adjacent"] + 2313["SweepEdge Opposite"] + 2314["SweepEdge Adjacent"] + 2315["SweepEdge Opposite"] + 2316["SweepEdge Adjacent"] + 2317["SweepEdge Opposite"] + 2318["SweepEdge Adjacent"] + 2319["SweepEdge Opposite"] + 2320["SweepEdge Adjacent"] + 2321["SweepEdge Opposite"] + 2322["SweepEdge Adjacent"] + 2323["SweepEdge Opposite"] + 2324["SweepEdge Adjacent"] + 2325["SweepEdge Opposite"] + 2326["SweepEdge Adjacent"] + 2327["SweepEdge Opposite"] + 2328["SweepEdge Adjacent"] + 2329["SweepEdge Opposite"] + 2330["SweepEdge Adjacent"] + 2331["SweepEdge Opposite"] + 2332["SweepEdge Adjacent"] + 2333["SweepEdge Opposite"] + 2334["SweepEdge Adjacent"] + 2335["SweepEdge Opposite"] + 2336["SweepEdge Adjacent"] + 2337["SweepEdge Opposite"] + 2338["SweepEdge Adjacent"] + 2339["SweepEdge Opposite"] + 2340["SweepEdge Adjacent"] + 2341["SweepEdge Opposite"] + 2342["SweepEdge Adjacent"] + 2343["SweepEdge Opposite"] + 2344["SweepEdge Adjacent"] + 2345["SweepEdge Opposite"] + 2346["SweepEdge Adjacent"] + 2347["SweepEdge Opposite"] + 2348["SweepEdge Adjacent"] + 2349["SweepEdge Opposite"] + 2350["SweepEdge Adjacent"] + 2351["SweepEdge Opposite"] + 2352["SweepEdge Adjacent"] + 2353["SweepEdge Opposite"] + 2354["SweepEdge Adjacent"] + 2355["SweepEdge Opposite"] + 2356["SweepEdge Adjacent"] + 2357["SweepEdge Opposite"] + 2358["SweepEdge Adjacent"] + 2359["SweepEdge Opposite"] + 2360["SweepEdge Adjacent"] + 2361["SweepEdge Opposite"] + 2362["SweepEdge Adjacent"] + 2363["SweepEdge Opposite"] + 2364["SweepEdge Adjacent"] + 2365["SweepEdge Opposite"] + 2366["SweepEdge Adjacent"] + 2367["SweepEdge Opposite"] + 2368["SweepEdge Adjacent"] + 2369["SweepEdge Opposite"] + 2370["SweepEdge Adjacent"] + 2371["SweepEdge Opposite"] + 2372["SweepEdge Adjacent"] + 2373["SweepEdge Opposite"] + 2374["SweepEdge Adjacent"] + 2375["SweepEdge Opposite"] + 2376["SweepEdge Adjacent"] + 2377["SweepEdge Opposite"] + 2378["SweepEdge Adjacent"] + 2379["SweepEdge Opposite"] + 2380["SweepEdge Adjacent"] + 2381["SweepEdge Opposite"] + 2382["SweepEdge Adjacent"] + 2383["SweepEdge Opposite"] + 2384["SweepEdge Adjacent"] + 2385["SweepEdge Opposite"] + 2386["SweepEdge Adjacent"] + 2387["SweepEdge Opposite"] + 2388["SweepEdge Adjacent"] + 2389["SweepEdge Opposite"] + 2390["SweepEdge Adjacent"] + 2391["SweepEdge Opposite"] + 2392["SweepEdge Adjacent"] + 2393["SweepEdge Opposite"] + 2394["SweepEdge Adjacent"] + 2395["SweepEdge Opposite"] + 2396["SweepEdge Adjacent"] + 2397["SweepEdge Opposite"] + 2398["SweepEdge Adjacent"] + 2399["SweepEdge Opposite"] + 2400["SweepEdge Adjacent"] + 2401["SweepEdge Opposite"] + 2402["SweepEdge Adjacent"] + 2403["SweepEdge Opposite"] + 2404["SweepEdge Adjacent"] + 2405["SweepEdge Opposite"] + 2406["SweepEdge Adjacent"] + 2407["SweepEdge Opposite"] + 2408["SweepEdge Adjacent"] + 2409["SweepEdge Opposite"] + 2410["SweepEdge Adjacent"] + 2411["SweepEdge Opposite"] + 2412["SweepEdge Adjacent"] + 2413["SweepEdge Opposite"] + 2414["SweepEdge Adjacent"] + 2415["SweepEdge Opposite"] + 2416["SweepEdge Adjacent"] + 2417["SweepEdge Opposite"] + 2418["SweepEdge Adjacent"] + 2419["SweepEdge Opposite"] + 2420["SweepEdge Adjacent"] + 2421["SweepEdge Opposite"] + 2422["SweepEdge Adjacent"] + 2423["SweepEdge Opposite"] + 2424["SweepEdge Adjacent"] + 2425["SweepEdge Opposite"] + 2426["SweepEdge Adjacent"] + 2427["SweepEdge Opposite"] + 2428["SweepEdge Adjacent"] + 2429["SweepEdge Opposite"] + 2430["SweepEdge Adjacent"] + 2431["SweepEdge Opposite"] + 2432["SweepEdge Adjacent"] + 2433["SweepEdge Opposite"] + 2434["SweepEdge Adjacent"] + 2435["SweepEdge Opposite"] + 2436["SweepEdge Adjacent"] + 2437["SweepEdge Opposite"] + 2438["SweepEdge Adjacent"] + 2439["SweepEdge Opposite"] + 2440["SweepEdge Adjacent"] + 2441["SweepEdge Opposite"] + 2442["SweepEdge Adjacent"] + 2443["SweepEdge Opposite"] + 2444["SweepEdge Adjacent"] + 2445["SweepEdge Opposite"] + 2446["SweepEdge Adjacent"] + 2447["SweepEdge Opposite"] + 2448["SweepEdge Adjacent"] + 2449["SweepEdge Opposite"] + 2450["SweepEdge Adjacent"] + 2451["SweepEdge Opposite"] + 2452["SweepEdge Adjacent"] + 2453["SweepEdge Opposite"] + 2454["SweepEdge Adjacent"] + 2455["SweepEdge Opposite"] + 2456["SweepEdge Adjacent"] + 2457["SweepEdge Opposite"] + 2458["SweepEdge Adjacent"] + 2459["SweepEdge Opposite"] + 2460["SweepEdge Adjacent"] + 2461["SweepEdge Opposite"] + 2462["SweepEdge Adjacent"] + 2463["SweepEdge Opposite"] + 2464["SweepEdge Adjacent"] + 2465["SweepEdge Opposite"] + 2466["SweepEdge Adjacent"] + 2467["SweepEdge Opposite"] + 2468["SweepEdge Adjacent"] + 2469["SweepEdge Opposite"] + 2470["SweepEdge Adjacent"] + 2471["SweepEdge Opposite"] + 2472["SweepEdge Adjacent"] + 2473["SweepEdge Opposite"] + 2474["SweepEdge Adjacent"] + 2475["SweepEdge Opposite"] + 2476["SweepEdge Adjacent"] + 2477["SweepEdge Opposite"] + 2478["SweepEdge Adjacent"] + 2479["SweepEdge Opposite"] + 2480["SweepEdge Adjacent"] + 2481["SweepEdge Opposite"] + 2482["SweepEdge Adjacent"] + 2483["SweepEdge Opposite"] + 2484["SweepEdge Adjacent"] + 2485["SweepEdge Opposite"] + 2486["SweepEdge Adjacent"] + 2487["SweepEdge Opposite"] + 2488["SweepEdge Adjacent"] + 2489["SweepEdge Opposite"] + 2490["SweepEdge Adjacent"] + 2491["SweepEdge Opposite"] + 2492["SweepEdge Adjacent"] + 2493["SweepEdge Opposite"] + 2494["SweepEdge Adjacent"] + 2495["SweepEdge Opposite"] + 2496["SweepEdge Adjacent"] + 2497["SweepEdge Opposite"] + 2498["SweepEdge Adjacent"] + 2499["SweepEdge Opposite"] + 2500["SweepEdge Adjacent"] + 2501["SweepEdge Opposite"] + 2502["SweepEdge Adjacent"] + 2503["SweepEdge Opposite"] + 2504["SweepEdge Adjacent"] + 2505["SweepEdge Opposite"] + 2506["SweepEdge Adjacent"] + 2507["SweepEdge Opposite"] + 2508["SweepEdge Adjacent"] + 2509["SweepEdge Opposite"] + 2510["SweepEdge Adjacent"] + 2511["SweepEdge Opposite"] + 2512["SweepEdge Adjacent"] + 2513["SweepEdge Opposite"] + 2514["SweepEdge Adjacent"] + 2515["SweepEdge Opposite"] + 2516["SweepEdge Adjacent"] + 2517["SweepEdge Opposite"] + 2518["SweepEdge Adjacent"] + 2519["SweepEdge Opposite"] + 2520["SweepEdge Adjacent"] + 2521["SweepEdge Opposite"] + 2522["SweepEdge Adjacent"] + 2523["SweepEdge Opposite"] + 2524["SweepEdge Adjacent"] + 2525["SweepEdge Opposite"] + 2526["SweepEdge Adjacent"] + 2527["SweepEdge Opposite"] + 2528["SweepEdge Adjacent"] + 2529["SweepEdge Opposite"] + 2530["SweepEdge Adjacent"] + 2531["SweepEdge Opposite"] + 2532["SweepEdge Adjacent"] + 2533["SweepEdge Opposite"] + 2534["SweepEdge Adjacent"] + 2535["SweepEdge Opposite"] + 2536["SweepEdge Adjacent"] + 2537["SweepEdge Opposite"] + 2538["SweepEdge Adjacent"] + 2539["SweepEdge Opposite"] + 2540["SweepEdge Adjacent"] + 2541["SweepEdge Opposite"] + 2542["SweepEdge Adjacent"] + 2543["SweepEdge Opposite"] + 2544["SweepEdge Adjacent"] + 2545["SweepEdge Opposite"] + 2546["SweepEdge Adjacent"] + 2547["SweepEdge Opposite"] + 2548["SweepEdge Adjacent"] + 2549["SweepEdge Opposite"] + 2550["SweepEdge Adjacent"] + 2551["SweepEdge Opposite"] + 2552["SweepEdge Adjacent"] + 2553["SweepEdge Opposite"] + 2554["SweepEdge Adjacent"] + 2555["SweepEdge Opposite"] + 2556["SweepEdge Adjacent"] + 2557["SweepEdge Opposite"] + 2558["SweepEdge Adjacent"] + 2559["SweepEdge Opposite"] + 2560["SweepEdge Adjacent"] + 2561["SweepEdge Opposite"] + 2562["SweepEdge Adjacent"] + 2563["SweepEdge Opposite"] + 2564["SweepEdge Adjacent"] + 2565["SweepEdge Opposite"] + 2566["SweepEdge Adjacent"] + 2567["SweepEdge Opposite"] + 2568["SweepEdge Adjacent"] + 2569["SweepEdge Opposite"] + 2570["SweepEdge Adjacent"] + 2571["SweepEdge Opposite"] + 2572["SweepEdge Adjacent"] + 2573["SweepEdge Opposite"] + 2574["SweepEdge Adjacent"] + 2575["SweepEdge Opposite"] + 2576["SweepEdge Adjacent"] + 2577["SweepEdge Opposite"] + 2578["SweepEdge Adjacent"] + 2579["SweepEdge Opposite"] + 2580["SweepEdge Adjacent"] + 2581["SweepEdge Opposite"] + 2582["SweepEdge Adjacent"] + 2583["SweepEdge Opposite"] + 2584["SweepEdge Adjacent"] + 2585["SweepEdge Opposite"] + 2586["SweepEdge Adjacent"] + 2587["SweepEdge Opposite"] + 2588["SweepEdge Adjacent"] + 2589["SweepEdge Opposite"] + 2590["SweepEdge Adjacent"] + 2591["SweepEdge Opposite"] + 2592["SweepEdge Adjacent"] + 2593["SweepEdge Opposite"] + 2594["SweepEdge Adjacent"] + 2595["SweepEdge Opposite"] + 2596["SweepEdge Adjacent"] + 2597["SweepEdge Opposite"] + 2598["SweepEdge Adjacent"] + 2599["SweepEdge Opposite"] + 2600["SweepEdge Adjacent"] + 2601["SweepEdge Opposite"] + 2602["SweepEdge Adjacent"] + 2603["SweepEdge Opposite"] + 2604["SweepEdge Adjacent"] + 2605["SweepEdge Opposite"] + 2606["SweepEdge Adjacent"] + 2607["SweepEdge Opposite"] + 2608["SweepEdge Adjacent"] + 2609["SweepEdge Opposite"] + 2610["SweepEdge Adjacent"] + 2611["SweepEdge Opposite"] + 2612["SweepEdge Adjacent"] + 2613["SweepEdge Opposite"] + 2614["SweepEdge Adjacent"] + 2615["SweepEdge Opposite"] + 2616["SweepEdge Adjacent"] + 2617["SweepEdge Opposite"] + 2618["SweepEdge Adjacent"] + 2619["SweepEdge Opposite"] + 2620["SweepEdge Adjacent"] + 2621["SweepEdge Opposite"] + 2622["SweepEdge Adjacent"] + 2623["SweepEdge Opposite"] + 2624["SweepEdge Adjacent"] + 2625["SweepEdge Opposite"] + 2626["SweepEdge Adjacent"] + 2627["SweepEdge Opposite"] + 2628["SweepEdge Adjacent"] + 2629["SweepEdge Opposite"] + 2630["SweepEdge Adjacent"] + 2631["SweepEdge Opposite"] + 2632["SweepEdge Adjacent"] + 2633["SweepEdge Opposite"] + 2634["SweepEdge Adjacent"] + 2635["SweepEdge Opposite"] + 2636["SweepEdge Adjacent"] + 2637["SweepEdge Opposite"] + 2638["SweepEdge Adjacent"] + 2639["SweepEdge Opposite"] + 2640["SweepEdge Adjacent"] + 2641["SweepEdge Opposite"] + 2642["SweepEdge Adjacent"] + 2643["SweepEdge Opposite"] + 2644["SweepEdge Adjacent"] + 2645["SweepEdge Opposite"] + 2646["SweepEdge Adjacent"] + 2647["SweepEdge Opposite"] + 2648["SweepEdge Adjacent"] + 2649["SweepEdge Opposite"] + 2650["SweepEdge Adjacent"] + 2651["SweepEdge Opposite"] + 2652["SweepEdge Adjacent"] + 2653["SweepEdge Opposite"] + 2654["SweepEdge Adjacent"] + 2655["SweepEdge Opposite"] + 2656["SweepEdge Adjacent"] + 2657["SweepEdge Opposite"] + 2658["SweepEdge Adjacent"] + 2659["SweepEdge Opposite"] + 2660["SweepEdge Adjacent"] + 2661["SweepEdge Opposite"] + 2662["SweepEdge Adjacent"] + 2663["SweepEdge Opposite"] + 2664["SweepEdge Adjacent"] + 2665["SweepEdge Opposite"] + 2666["SweepEdge Adjacent"] + 2667["SweepEdge Opposite"] + 2668["SweepEdge Adjacent"] + 2669["SweepEdge Opposite"] + 2670["SweepEdge Adjacent"] + 2671["SweepEdge Opposite"] + 2672["SweepEdge Adjacent"] + 2673["SweepEdge Opposite"] + 2674["SweepEdge Adjacent"] + 2675["SweepEdge Opposite"] + 2676["SweepEdge Adjacent"] + 2677["SweepEdge Opposite"] + 2678["SweepEdge Adjacent"] + 2679["SweepEdge Opposite"] + 2680["SweepEdge Adjacent"] + 2681["SweepEdge Opposite"] + 2682["SweepEdge Adjacent"] + 2683["SweepEdge Opposite"] + 2684["SweepEdge Adjacent"] + 2685["SweepEdge Opposite"] + 2686["SweepEdge Adjacent"] + 2687["SweepEdge Opposite"] + 2688["SweepEdge Adjacent"] + 2689["SweepEdge Opposite"] + 2690["SweepEdge Adjacent"] + 2691["SweepEdge Opposite"] + 2692["SweepEdge Adjacent"] + 2693["SweepEdge Opposite"] + 2694["SweepEdge Adjacent"] + 2695["SweepEdge Opposite"] + 2696["SweepEdge Adjacent"] + 2697["SweepEdge Opposite"] + 2698["SweepEdge Adjacent"] + 2699["SweepEdge Opposite"] + 2700["SweepEdge Adjacent"] + 2701["SweepEdge Opposite"] + 2702["SweepEdge Adjacent"] + 2703["SweepEdge Opposite"] + 2704["SweepEdge Adjacent"] + 2705["SweepEdge Opposite"] + 2706["SweepEdge Adjacent"] + 2707["SweepEdge Opposite"] + 2708["SweepEdge Adjacent"] + 2709["SweepEdge Opposite"] + 2710["SweepEdge Adjacent"] + 2711["SweepEdge Opposite"] + 2712["SweepEdge Adjacent"] + 2713["SweepEdge Opposite"] + 2714["SweepEdge Adjacent"] + 2715["SweepEdge Opposite"] + 2716["SweepEdge Adjacent"] + 2717["SweepEdge Opposite"] + 2718["SweepEdge Adjacent"] + 2719["SweepEdge Opposite"] + 2720["SweepEdge Adjacent"] + 2721["SweepEdge Opposite"] + 2722["SweepEdge Adjacent"] + 2723["SweepEdge Opposite"] + 2724["SweepEdge Adjacent"] + 2725["SweepEdge Opposite"] + 2726["SweepEdge Adjacent"] + 2727["SweepEdge Opposite"] + 2728["SweepEdge Adjacent"] + 2729["SweepEdge Opposite"] + 2730["SweepEdge Adjacent"] + 2731["SweepEdge Opposite"] + 2732["SweepEdge Adjacent"] + 2733["SweepEdge Opposite"] + 2734["SweepEdge Adjacent"] + 2735["SweepEdge Opposite"] + 2736["SweepEdge Adjacent"] + 2737["SweepEdge Opposite"] + 2738["SweepEdge Adjacent"] + 2739["SweepEdge Opposite"] + 2740["SweepEdge Adjacent"] + 2741["SweepEdge Opposite"] + 2742["SweepEdge Adjacent"] + 2743["SweepEdge Opposite"] + 2744["SweepEdge Adjacent"] + 2745["SweepEdge Opposite"] + 2746["SweepEdge Adjacent"] + 2747["SweepEdge Opposite"] + 2748["SweepEdge Adjacent"] + 2749["SweepEdge Opposite"] + 2750["SweepEdge Adjacent"] + 2751["SweepEdge Opposite"] + 2752["SweepEdge Adjacent"] + 2753["SweepEdge Opposite"] + 2754["SweepEdge Adjacent"] + 2755["SweepEdge Opposite"] + 2756["SweepEdge Adjacent"] + 2757["SweepEdge Opposite"] + 2758["SweepEdge Adjacent"] + 2759["SweepEdge Opposite"] + 2760["SweepEdge Adjacent"] + 2761["SweepEdge Opposite"] + 2762["SweepEdge Adjacent"] + 2763["SweepEdge Opposite"] + 2764["SweepEdge Adjacent"] + 2765["SweepEdge Opposite"] + 2766["SweepEdge Adjacent"] + 2767["SweepEdge Opposite"] + 2768["SweepEdge Adjacent"] + 2769["SweepEdge Opposite"] + 2770["SweepEdge Adjacent"] + 2771["SweepEdge Opposite"] + 2772["SweepEdge Adjacent"] + 2773["SweepEdge Opposite"] + 2774["SweepEdge Adjacent"] + 2775["SweepEdge Opposite"] + 2776["SweepEdge Adjacent"] + 2777["SweepEdge Opposite"] + 2778["SweepEdge Adjacent"] + 2779["SweepEdge Opposite"] + 2780["SweepEdge Adjacent"] + 2781["SweepEdge Opposite"] + 2782["SweepEdge Adjacent"] + 2783["SweepEdge Opposite"] + 2784["SweepEdge Adjacent"] + 2785["SweepEdge Opposite"] + 2786["SweepEdge Adjacent"] + 2787["SweepEdge Opposite"] + 2788["SweepEdge Adjacent"] + 2789["SweepEdge Opposite"] + 2790["SweepEdge Adjacent"] + 2791["SweepEdge Opposite"] + 2792["SweepEdge Adjacent"] + 2793["SweepEdge Opposite"] + 2794["SweepEdge Adjacent"] + 2795["SweepEdge Opposite"] + 2796["SweepEdge Adjacent"] + 2797["SweepEdge Opposite"] + 2798["SweepEdge Adjacent"] + 2799["SweepEdge Opposite"] + 2800["SweepEdge Adjacent"] + 2801["SweepEdge Opposite"] + 2802["SweepEdge Adjacent"] + 2803["SweepEdge Opposite"] + 2804["SweepEdge Adjacent"] + 2805["SweepEdge Opposite"] + 2806["SweepEdge Adjacent"] + 2807["SweepEdge Opposite"] + 2808["SweepEdge Adjacent"] + 2809["SweepEdge Opposite"] + 2810["SweepEdge Adjacent"] + 2811["SweepEdge Opposite"] + 2812["SweepEdge Adjacent"] + 2813["SweepEdge Opposite"] + 2814["SweepEdge Adjacent"] + 2815["SweepEdge Opposite"] + 2816["SweepEdge Adjacent"] + 2817["SweepEdge Opposite"] + 2818["SweepEdge Adjacent"] + 2819["SweepEdge Opposite"] + 2820["SweepEdge Adjacent"] + 2821["SweepEdge Opposite"] + 2822["SweepEdge Adjacent"] + 2823["SweepEdge Opposite"] + 2824["SweepEdge Adjacent"] + 2825["SweepEdge Opposite"] + 2826["SweepEdge Adjacent"] + 2827["SweepEdge Opposite"] + 2828["SweepEdge Adjacent"] + 2829["SweepEdge Opposite"] + 2830["SweepEdge Adjacent"] + 2831["SweepEdge Opposite"] + 2832["SweepEdge Adjacent"] + 2833["SweepEdge Opposite"] + 2834["SweepEdge Adjacent"] + 2835["SweepEdge Opposite"] + 2836["SweepEdge Adjacent"] + 2837["SweepEdge Opposite"] + 2838["SweepEdge Adjacent"] + 2839["SweepEdge Opposite"] + 2840["SweepEdge Adjacent"] + 2841["SweepEdge Opposite"] + 2842["SweepEdge Adjacent"] + 2843["SweepEdge Opposite"] + 2844["SweepEdge Adjacent"] + 2845["SweepEdge Opposite"] + 2846["SweepEdge Adjacent"] + 2847["SweepEdge Opposite"] + 2848["SweepEdge Adjacent"] + 2849["SweepEdge Opposite"] + 2850["SweepEdge Adjacent"] + 2851["SweepEdge Opposite"] + 2852["SweepEdge Adjacent"] + 2853["SweepEdge Opposite"] + 2854["SweepEdge Adjacent"] + 2855["SweepEdge Opposite"] + 2856["SweepEdge Adjacent"] + 2857["SweepEdge Opposite"] + 2858["SweepEdge Adjacent"] + 2859["SweepEdge Opposite"] + 2860["SweepEdge Adjacent"] + 2861["SweepEdge Opposite"] + 2862["SweepEdge Adjacent"] + 2863["SweepEdge Opposite"] + 2864["SweepEdge Adjacent"] + 2865["SweepEdge Opposite"] + 2866["SweepEdge Adjacent"] + 2867["SweepEdge Opposite"] + 2868["SweepEdge Adjacent"] + 2869["SweepEdge Opposite"] + 2870["SweepEdge Adjacent"] + 2871["SweepEdge Opposite"] + 2872["SweepEdge Adjacent"] + 2873["SweepEdge Opposite"] + 2874["SweepEdge Adjacent"] + 2875["SweepEdge Opposite"] + 2876["SweepEdge Adjacent"] + 2877["SweepEdge Opposite"] + 2878["SweepEdge Adjacent"] + 2879["SweepEdge Opposite"] + 2880["SweepEdge Adjacent"] + 2881["SweepEdge Opposite"] + 2882["SweepEdge Adjacent"] + 2883["SweepEdge Opposite"] + 2884["SweepEdge Adjacent"] + 2885["SweepEdge Opposite"] + 2886["SweepEdge Adjacent"] + 2887["SweepEdge Opposite"] + 2888["SweepEdge Adjacent"] + 2889["SweepEdge Opposite"] + 2890["SweepEdge Adjacent"] + 2891["SweepEdge Opposite"] + 2892["SweepEdge Adjacent"] + 2893["SweepEdge Opposite"] + 2894["SweepEdge Adjacent"] + 2895["SweepEdge Opposite"] + 2896["SweepEdge Adjacent"] + 2897["SweepEdge Opposite"] + 2898["SweepEdge Adjacent"] + 2899["SweepEdge Opposite"] + 2900["SweepEdge Adjacent"] + 2901["SweepEdge Opposite"] + 2902["SweepEdge Adjacent"] + 2903["SweepEdge Opposite"] + 2904["SweepEdge Adjacent"] + 2905["SweepEdge Opposite"] + 2906["SweepEdge Adjacent"] + 2907["SweepEdge Opposite"] + 2908["SweepEdge Adjacent"] + 2909["SweepEdge Opposite"] + 2910["SweepEdge Adjacent"] + 2911["SweepEdge Opposite"] + 2912["SweepEdge Adjacent"] + 2913["SweepEdge Opposite"] + 2914["SweepEdge Adjacent"] + 2915["SweepEdge Opposite"] + 2916["SweepEdge Adjacent"] + 2917["SweepEdge Opposite"] + 2918["SweepEdge Adjacent"] + 2919["SweepEdge Opposite"] + 2920["SweepEdge Adjacent"] + 2921["SweepEdge Opposite"] + 2922["SweepEdge Adjacent"] + 2923["SweepEdge Opposite"] + 2924["SweepEdge Adjacent"] + 2925["SweepEdge Opposite"] + 2926["SweepEdge Adjacent"] + 2927["SweepEdge Opposite"] + 2928["SweepEdge Adjacent"] + 2929["SweepEdge Opposite"] + 2930["SweepEdge Adjacent"] + 2931["SweepEdge Opposite"] + 2932["SweepEdge Adjacent"] + 2933["SweepEdge Opposite"] + 2934["SweepEdge Adjacent"] + 2935["SweepEdge Opposite"] + 2936["SweepEdge Adjacent"] + 2937["SweepEdge Opposite"] + 2938["SweepEdge Adjacent"] + 2939["SweepEdge Opposite"] + 2940["SweepEdge Adjacent"] + 2941["SweepEdge Opposite"] + 2942["SweepEdge Adjacent"] + 2943["SweepEdge Opposite"] + 2944["SweepEdge Adjacent"] + 2945["SweepEdge Opposite"] + 2946["SweepEdge Adjacent"] + 2947["SweepEdge Opposite"] + 2948["SweepEdge Adjacent"] + 2949["SweepEdge Opposite"] + 2950["SweepEdge Adjacent"] + 2951["SweepEdge Opposite"] + 2952["SweepEdge Adjacent"] + 2953["SweepEdge Opposite"] + 2954["SweepEdge Adjacent"] + 2955["SweepEdge Opposite"] + 2956["SweepEdge Adjacent"] + 2957["SweepEdge Opposite"] + 2958["SweepEdge Adjacent"] + 2959["SweepEdge Opposite"] + 2960["SweepEdge Adjacent"] + 2961["SweepEdge Opposite"] + 2962["SweepEdge Adjacent"] + 2963["SweepEdge Opposite"] + 2964["SweepEdge Adjacent"] + 2965["SweepEdge Opposite"] + 2966["SweepEdge Adjacent"] + 2967["SweepEdge Opposite"] + 2968["SweepEdge Adjacent"] + 2969["SweepEdge Opposite"] + 2970["SweepEdge Adjacent"] + 2971["SweepEdge Opposite"] + 2972["SweepEdge Adjacent"] + 2973["SweepEdge Opposite"] + 2974["SweepEdge Adjacent"] + 2975["SweepEdge Opposite"] + 2976["SweepEdge Adjacent"] + 2977["SweepEdge Opposite"] + 2978["SweepEdge Adjacent"] + 2979["SweepEdge Opposite"] + 2980["SweepEdge Adjacent"] + 2981["SweepEdge Opposite"] + 2982["SweepEdge Adjacent"] + 2983["SweepEdge Opposite"] + 2984["SweepEdge Adjacent"] + 2985["SweepEdge Opposite"] + 2986["SweepEdge Adjacent"] + 2987["SweepEdge Opposite"] + 2988["SweepEdge Adjacent"] + 2989["SweepEdge Opposite"] + 2990["SweepEdge Adjacent"] + 2991["SweepEdge Opposite"] + 2992["SweepEdge Adjacent"] + 2993["SweepEdge Opposite"] + 2994["SweepEdge Adjacent"] + 2995["SweepEdge Opposite"] + 2996["SweepEdge Adjacent"] + 2997["SweepEdge Opposite"] + 2998["SweepEdge Adjacent"] + 2999["SweepEdge Opposite"] + 3000["SweepEdge Adjacent"] + 3001["SweepEdge Opposite"] + 3002["SweepEdge Adjacent"] + 3003["SweepEdge Opposite"] + 3004["SweepEdge Adjacent"] + 3005["SweepEdge Opposite"] + 3006["SweepEdge Adjacent"] + 3007["SweepEdge Opposite"] + 3008["SweepEdge Adjacent"] + 3009["SweepEdge Opposite"] + 3010["SweepEdge Adjacent"] + 3011["SweepEdge Opposite"] + 3012["SweepEdge Adjacent"] + 3013["SweepEdge Opposite"] + 3014["SweepEdge Adjacent"] + 3015["SweepEdge Opposite"] + 3016["SweepEdge Adjacent"] + 3017["SweepEdge Opposite"] + 3018["SweepEdge Adjacent"] + 3019["SweepEdge Opposite"] + 3020["SweepEdge Adjacent"] + 3021["SweepEdge Opposite"] + 3022["SweepEdge Adjacent"] + 3023["SweepEdge Opposite"] + 3024["SweepEdge Adjacent"] + 3025["SweepEdge Opposite"] + 3026["SweepEdge Adjacent"] + 3027["SweepEdge Opposite"] + 3028["SweepEdge Adjacent"] + 3029["SweepEdge Opposite"] + 3030["SweepEdge Adjacent"] + 3031["SweepEdge Opposite"] + 3032["SweepEdge Adjacent"] + 3033["SweepEdge Opposite"] + 3034["SweepEdge Adjacent"] + 3035["SweepEdge Opposite"] + 3036["SweepEdge Adjacent"] + 3037["SweepEdge Opposite"] + 3038["SweepEdge Adjacent"] + 3039["SweepEdge Opposite"] + 3040["SweepEdge Adjacent"] + 3041["SweepEdge Opposite"] + 3042["SweepEdge Adjacent"] + 3043["SweepEdge Opposite"] + 3044["SweepEdge Adjacent"] + 3045["SweepEdge Opposite"] + 3046["SweepEdge Adjacent"] + 3047["SweepEdge Opposite"] + 3048["SweepEdge Adjacent"] + 3049["SweepEdge Opposite"] + 3050["SweepEdge Adjacent"] + 3051["SweepEdge Opposite"] + 3052["SweepEdge Adjacent"] + 3053["SweepEdge Opposite"] + 3054["SweepEdge Adjacent"] + 3055["SweepEdge Opposite"] + 3056["SweepEdge Adjacent"] + 3057["SweepEdge Opposite"] + 3058["SweepEdge Adjacent"] + 3059["SweepEdge Opposite"] + 3060["SweepEdge Adjacent"] + 3061["SweepEdge Opposite"] + 3062["SweepEdge Adjacent"] + 3063["SweepEdge Opposite"] + 3064["SweepEdge Adjacent"] + 3065["SweepEdge Opposite"] + 3066["SweepEdge Adjacent"] + 3067["SweepEdge Opposite"] + 3068["SweepEdge Adjacent"] + 3069["SweepEdge Opposite"] + 3070["SweepEdge Adjacent"] + 3071["SweepEdge Opposite"] + 3072["SweepEdge Adjacent"] + 3073["SweepEdge Opposite"] + 3074["SweepEdge Adjacent"] + 3075["SweepEdge Opposite"] + 3076["SweepEdge Adjacent"] + 3077["SweepEdge Opposite"] + 3078["SweepEdge Adjacent"] + 3079["SweepEdge Opposite"] + 3080["SweepEdge Adjacent"] + 3081["SweepEdge Opposite"] + 3082["SweepEdge Adjacent"] + 3083["SweepEdge Opposite"] + 3084["SweepEdge Adjacent"] + 3085["SweepEdge Opposite"] + 3086["SweepEdge Adjacent"] + 3087["SweepEdge Opposite"] + 3088["SweepEdge Adjacent"] + 3089["SweepEdge Opposite"] + 3090["SweepEdge Adjacent"] + 3091["SweepEdge Opposite"] + 3092["SweepEdge Adjacent"] + 3093["SweepEdge Opposite"] + 3094["SweepEdge Adjacent"] + 3095["SweepEdge Opposite"] + 3096["SweepEdge Adjacent"] + 3097["SweepEdge Opposite"] + 3098["SweepEdge Adjacent"] + 3099["SweepEdge Opposite"] + 3100["SweepEdge Adjacent"] + 3101["SweepEdge Opposite"] + 3102["SweepEdge Adjacent"] + 3103["SweepEdge Opposite"] + 3104["SweepEdge Adjacent"] + 3105["SweepEdge Opposite"] + 3106["SweepEdge Adjacent"] + 3107["SweepEdge Opposite"] + 3108["SweepEdge Adjacent"] + 3109["SweepEdge Opposite"] + 3110["SweepEdge Adjacent"] + 3111["SweepEdge Opposite"] + 3112["SweepEdge Adjacent"] + 3113["SweepEdge Opposite"] + 3114["SweepEdge Adjacent"] + 3115["SweepEdge Opposite"] + 3116["SweepEdge Adjacent"] + 3117["SweepEdge Opposite"] + 3118["SweepEdge Adjacent"] + 3119["SweepEdge Opposite"] + 3120["SweepEdge Adjacent"] + 3121["SweepEdge Opposite"] + 3122["SweepEdge Adjacent"] + 3123["SweepEdge Opposite"] + 3124["SweepEdge Adjacent"] + 3125["SweepEdge Opposite"] + 3126["SweepEdge Adjacent"] + 3127["SweepEdge Opposite"] + 3128["SweepEdge Adjacent"] + 3129["SweepEdge Opposite"] + 3130["SweepEdge Adjacent"] + 3131["SweepEdge Opposite"] + 3132["SweepEdge Adjacent"] + 3133["SweepEdge Opposite"] + 3134["SweepEdge Adjacent"] + 3135["SweepEdge Opposite"] + 3136["SweepEdge Adjacent"] + 3137["SweepEdge Opposite"] + 3138["SweepEdge Adjacent"] + 3139["SweepEdge Opposite"] + 3140["SweepEdge Adjacent"] + 3141["SweepEdge Opposite"] + 3142["SweepEdge Adjacent"] + 3143["SweepEdge Opposite"] + 3144["SweepEdge Adjacent"] + 3145["SweepEdge Opposite"] + 3146["SweepEdge Adjacent"] + 3147["SweepEdge Opposite"] + 3148["SweepEdge Adjacent"] + 3149["SweepEdge Opposite"] + 3150["SweepEdge Adjacent"] + 3151["SweepEdge Opposite"] + 3152["SweepEdge Adjacent"] + 3153["SweepEdge Opposite"] + 3154["SweepEdge Adjacent"] + 3155["SweepEdge Opposite"] + 3156["SweepEdge Adjacent"] + 3157["SweepEdge Opposite"] + 3158["SweepEdge Adjacent"] + 3159["SweepEdge Opposite"] + 3160["SweepEdge Adjacent"] + 3161["SweepEdge Opposite"] + 3162["SweepEdge Adjacent"] + 3163["SweepEdge Opposite"] + 3164["SweepEdge Adjacent"] + 3165["SweepEdge Opposite"] + 3166["SweepEdge Adjacent"] + 3167["SweepEdge Opposite"] + 3168["SweepEdge Adjacent"] + 3169["SweepEdge Opposite"] + 3170["SweepEdge Adjacent"] + 3171["SweepEdge Opposite"] + 3172["SweepEdge Adjacent"] + 3173["SweepEdge Opposite"] + 3174["SweepEdge Adjacent"] + 3175["SweepEdge Opposite"] + 3176["SweepEdge Adjacent"] + 3177["SweepEdge Opposite"] + 3178["SweepEdge Adjacent"] + 3179["SweepEdge Opposite"] + 3180["SweepEdge Adjacent"] + 3181["SweepEdge Opposite"] + 3182["SweepEdge Adjacent"] + 3183["SweepEdge Opposite"] + 3184["SweepEdge Adjacent"] + 3185["SweepEdge Opposite"] + 3186["SweepEdge Adjacent"] + 3187["SweepEdge Opposite"] + 3188["SweepEdge Adjacent"] + 3189["SweepEdge Opposite"] + 3190["SweepEdge Adjacent"] + 3191["SweepEdge Opposite"] + 3192["SweepEdge Adjacent"] + 3193["SweepEdge Opposite"] + 3194["SweepEdge Adjacent"] + 3195["SweepEdge Opposite"] + 3196["SweepEdge Adjacent"] + 3197["SweepEdge Opposite"] + 3198["SweepEdge Adjacent"] + 3199["SweepEdge Opposite"] + 3200["SweepEdge Adjacent"] + 3201["SweepEdge Opposite"] + 3202["SweepEdge Adjacent"] + 3203["SweepEdge Opposite"] + 3204["SweepEdge Adjacent"] + 3205["SweepEdge Opposite"] + 3206["SweepEdge Adjacent"] + 3207["SweepEdge Opposite"] + 3208["SweepEdge Adjacent"] + 3209["SweepEdge Opposite"] + 3210["SweepEdge Adjacent"] + 3211["SweepEdge Opposite"] + 3212["SweepEdge Adjacent"] + 3213["SweepEdge Opposite"] + 3214["SweepEdge Adjacent"] + 3215["SweepEdge Opposite"] + 3216["SweepEdge Adjacent"] + 3217["SweepEdge Opposite"] + 3218["SweepEdge Adjacent"] + 3219["SweepEdge Opposite"] + 3220["SweepEdge Adjacent"] + 3221["SweepEdge Opposite"] + 3222["SweepEdge Adjacent"] + 3223["SweepEdge Opposite"] + 3224["SweepEdge Adjacent"] + 3225["SweepEdge Opposite"] + 3226["SweepEdge Adjacent"] + 3227["SweepEdge Opposite"] + 3228["SweepEdge Adjacent"] + 3229["SweepEdge Opposite"] + 3230["SweepEdge Adjacent"] + 3231["SweepEdge Opposite"] + 3232["SweepEdge Adjacent"] + 3233["SweepEdge Opposite"] + 3234["SweepEdge Adjacent"] + 3235["SweepEdge Opposite"] + 3236["SweepEdge Adjacent"] + 3237["SweepEdge Opposite"] + 3238["SweepEdge Adjacent"] + 3239["SweepEdge Opposite"] + 3240["SweepEdge Adjacent"] + 3241["SweepEdge Opposite"] + 3242["SweepEdge Adjacent"] + 3243["SweepEdge Opposite"] + 3244["SweepEdge Adjacent"] + 3245["SweepEdge Opposite"] + 3246["SweepEdge Adjacent"] + 3247["SweepEdge Opposite"] + 3248["SweepEdge Adjacent"] + 3249["SweepEdge Opposite"] + 3250["SweepEdge Adjacent"] + 3251["SweepEdge Opposite"] + 3252["SweepEdge Adjacent"] + 3253["SweepEdge Opposite"] + 3254["SweepEdge Adjacent"] + 3255["SweepEdge Opposite"] + 3256["SweepEdge Adjacent"] + 3257["SweepEdge Opposite"] + 3258["SweepEdge Adjacent"] + 3259["SweepEdge Opposite"] + 3260["SweepEdge Adjacent"] + 3261["SweepEdge Opposite"] + 3262["SweepEdge Adjacent"] + 3263["SweepEdge Opposite"] + 3264["SweepEdge Adjacent"] + 3265["SweepEdge Opposite"] + 3266["SweepEdge Adjacent"] + 3267["SweepEdge Opposite"] + 3268["SweepEdge Adjacent"] + 3269["SweepEdge Opposite"] + 3270["SweepEdge Adjacent"] + 3271["SweepEdge Opposite"] + 3272["SweepEdge Adjacent"] + 3273["SweepEdge Opposite"] + 3274["SweepEdge Adjacent"] + 3275["SweepEdge Opposite"] + 3276["SweepEdge Adjacent"] + 3277["SweepEdge Opposite"] + 3278["SweepEdge Adjacent"] + 3279["SweepEdge Opposite"] + 3280["SweepEdge Adjacent"] + 3281["SweepEdge Opposite"] + 3282["SweepEdge Adjacent"] + 3283["SweepEdge Opposite"] + 3284["SweepEdge Adjacent"] + 3285["SweepEdge Opposite"] + 3286["SweepEdge Adjacent"] + 3287["SweepEdge Opposite"] + 3288["SweepEdge Adjacent"] + 3289["SweepEdge Opposite"] + 3290["SweepEdge Adjacent"] + 3291["SweepEdge Opposite"] + 3292["SweepEdge Adjacent"] + 3293["SweepEdge Opposite"] + 3294["SweepEdge Adjacent"] + 3295["SweepEdge Opposite"] + 3296["SweepEdge Adjacent"] + 3297["SweepEdge Opposite"] + 3298["SweepEdge Adjacent"] + 3299["SweepEdge Opposite"] + 3300["SweepEdge Adjacent"] + 3301["SweepEdge Opposite"] + 3302["SweepEdge Adjacent"] + 3303["SweepEdge Opposite"] + 3304["SweepEdge Adjacent"] + 3305["SweepEdge Opposite"] + 3306["SweepEdge Adjacent"] + 3307["SweepEdge Opposite"] + 3308["SweepEdge Adjacent"] + 3309["SweepEdge Opposite"] + 3310["SweepEdge Adjacent"] + 3311["SweepEdge Opposite"] + 3312["SweepEdge Adjacent"] + 3313["SweepEdge Opposite"] + 3314["SweepEdge Adjacent"] + 3315["SweepEdge Opposite"] + 3316["SweepEdge Adjacent"] + 3317["SweepEdge Opposite"] + 3318["SweepEdge Adjacent"] + 3319["SweepEdge Opposite"] + 3320["SweepEdge Adjacent"] + 3321["SweepEdge Opposite"] + 3322["SweepEdge Adjacent"] + 3323["SweepEdge Opposite"] + 3324["SweepEdge Adjacent"] + 3325["SweepEdge Opposite"] + 3326["SweepEdge Adjacent"] + 3327["SweepEdge Opposite"] + 3328["SweepEdge Adjacent"] + 3329["SweepEdge Opposite"] + 3330["SweepEdge Adjacent"] + 3331["SweepEdge Opposite"] + 3332["SweepEdge Adjacent"] + 3333["SweepEdge Opposite"] + 3334["SweepEdge Adjacent"] + 3335["SweepEdge Opposite"] + 3336["SweepEdge Adjacent"] + 3337["SweepEdge Opposite"] + 3338["SweepEdge Adjacent"] + 3339["SweepEdge Opposite"] + 3340["SweepEdge Adjacent"] + 3341["SweepEdge Opposite"] + 3342["SweepEdge Adjacent"] + 3343["SweepEdge Opposite"] + 3344["SweepEdge Adjacent"] + 3345["SweepEdge Opposite"] + 3346["SweepEdge Adjacent"] + 3347["SweepEdge Opposite"] + 3348["SweepEdge Adjacent"] + 3349["SweepEdge Opposite"] + 3350["SweepEdge Adjacent"] + 3351["SweepEdge Opposite"] + 3352["SweepEdge Adjacent"] + 3353["SweepEdge Opposite"] + 3354["SweepEdge Adjacent"] + 3355["SweepEdge Opposite"] + 3356["SweepEdge Adjacent"] + 3357["SweepEdge Opposite"] + 3358["SweepEdge Adjacent"] + 3359["SweepEdge Opposite"] + 3360["SweepEdge Adjacent"] + 3361["SweepEdge Opposite"] + 3362["SweepEdge Adjacent"] + 3363["SweepEdge Opposite"] + 3364["SweepEdge Adjacent"] + 3365["SweepEdge Opposite"] + 3366["SweepEdge Adjacent"] + 3367["SweepEdge Opposite"] + 3368["SweepEdge Adjacent"] + 3369["SweepEdge Opposite"] + 3370["SweepEdge Adjacent"] + 3371["SweepEdge Opposite"] + 3372["SweepEdge Adjacent"] + 3373["SweepEdge Opposite"] + 3374["SweepEdge Adjacent"] + 3375["SweepEdge Opposite"] + 3376["SweepEdge Adjacent"] + 3377["SweepEdge Opposite"] + 3378["SweepEdge Adjacent"] + 3379["SweepEdge Opposite"] + 3380["SweepEdge Adjacent"] + 3381["SweepEdge Opposite"] + 3382["SweepEdge Adjacent"] + 3383["SweepEdge Opposite"] + 3384["SweepEdge Adjacent"] + 3385["SweepEdge Opposite"] + 3386["SweepEdge Adjacent"] + 3387["SweepEdge Opposite"] + 3388["SweepEdge Adjacent"] + 3389["SweepEdge Opposite"] + 3390["SweepEdge Adjacent"] + 3391["SweepEdge Opposite"] + 3392["SweepEdge Adjacent"] + 3393["SweepEdge Opposite"] + 3394["SweepEdge Adjacent"] + 3395["SweepEdge Opposite"] + 3396["SweepEdge Adjacent"] + 3397["SweepEdge Opposite"] + 3398["SweepEdge Adjacent"] + 3399["SweepEdge Opposite"] + 3400["SweepEdge Adjacent"] + 3401["SweepEdge Opposite"] + 3402["SweepEdge Adjacent"] + 3403["SweepEdge Opposite"] + 3404["SweepEdge Adjacent"] + 3405["SweepEdge Opposite"] + 3406["SweepEdge Adjacent"] + 3407["SweepEdge Opposite"] + 3408["SweepEdge Adjacent"] + 3409["SweepEdge Opposite"] + 3410["SweepEdge Adjacent"] + 3411["SweepEdge Opposite"] + 3412["SweepEdge Adjacent"] + 3413["SweepEdge Opposite"] + 3414["SweepEdge Adjacent"] + 3415["SweepEdge Opposite"] + 3416["SweepEdge Adjacent"] + 3417["SweepEdge Opposite"] + 3418["SweepEdge Adjacent"] + 3419["SweepEdge Opposite"] + 3420["SweepEdge Adjacent"] + 3421["SweepEdge Opposite"] + 3422["SweepEdge Adjacent"] + 3423["SweepEdge Opposite"] + 3424["SweepEdge Adjacent"] + 3425["SweepEdge Opposite"] + 3426["SweepEdge Adjacent"] + 3427["SweepEdge Opposite"] + 3428["SweepEdge Adjacent"] + 3429["SweepEdge Opposite"] + 3430["SweepEdge Adjacent"] + 3431["SweepEdge Opposite"] + 3432["SweepEdge Adjacent"] + 3433["SweepEdge Opposite"] + 3434["SweepEdge Adjacent"] + 3435["SweepEdge Opposite"] + 3436["SweepEdge Adjacent"] + 3437["SweepEdge Opposite"] + 3438["SweepEdge Adjacent"] + 3439["SweepEdge Opposite"] + 3440["SweepEdge Adjacent"] + 3441["SweepEdge Opposite"] + 3442["SweepEdge Adjacent"] + 3443["SweepEdge Opposite"] + 3444["SweepEdge Adjacent"] + 3445["SweepEdge Opposite"] + 3446["SweepEdge Adjacent"] + 3447["SweepEdge Opposite"] + 3448["SweepEdge Adjacent"] + 3449["SweepEdge Opposite"] + 3450["SweepEdge Adjacent"] + 3451["SweepEdge Opposite"] + 3452["SweepEdge Adjacent"] + 3453["SweepEdge Opposite"] + 3454["SweepEdge Adjacent"] + 3455["SweepEdge Opposite"] + 3456["SweepEdge Adjacent"] + 3457["SweepEdge Opposite"] + 3458["SweepEdge Adjacent"] + 3459["SweepEdge Opposite"] + 3460["SweepEdge Adjacent"] + 3461["SweepEdge Opposite"] + 3462["SweepEdge Adjacent"] + 3463["SweepEdge Opposite"] + 3464["SweepEdge Adjacent"] + 3465["SweepEdge Opposite"] + 3466["SweepEdge Adjacent"] + 3467["SweepEdge Opposite"] + 3468["SweepEdge Adjacent"] + 3469["SweepEdge Opposite"] + 3470["SweepEdge Adjacent"] + 3471["SweepEdge Opposite"] + 3472["SweepEdge Adjacent"] + 3473["SweepEdge Opposite"] + 3474["SweepEdge Adjacent"] + 3475["SweepEdge Opposite"] + 3476["SweepEdge Adjacent"] + 3477["SweepEdge Opposite"] + 3478["SweepEdge Adjacent"] + 3479["SweepEdge Opposite"] + 3480["SweepEdge Adjacent"] + 3481["SweepEdge Opposite"] + 3482["SweepEdge Adjacent"] + 3483["SweepEdge Opposite"] + 3484["SweepEdge Adjacent"] + 3485["SweepEdge Opposite"] + 3486["SweepEdge Adjacent"] + 3487["SweepEdge Opposite"] + 3488["SweepEdge Adjacent"] + 3489["SweepEdge Opposite"] + 3490["SweepEdge Adjacent"] + 3491["SweepEdge Opposite"] + 3492["SweepEdge Adjacent"] + 3493["SweepEdge Opposite"] + 3494["SweepEdge Adjacent"] + 3495["SweepEdge Opposite"] + 3496["SweepEdge Adjacent"] + 3497["SweepEdge Opposite"] + 3498["SweepEdge Adjacent"] + 3499["SweepEdge Opposite"] + 3500["SweepEdge Adjacent"] + 3501["SweepEdge Opposite"] + 3502["SweepEdge Adjacent"] + 3503["SweepEdge Opposite"] + 3504["SweepEdge Adjacent"] + 3505["SweepEdge Opposite"] + 3506["SweepEdge Adjacent"] + 3507["SweepEdge Opposite"] + 3508["SweepEdge Adjacent"] + 3509["SweepEdge Opposite"] + 3510["SweepEdge Adjacent"] + 3511["SweepEdge Opposite"] + 3512["SweepEdge Adjacent"] + 3513["SweepEdge Opposite"] + 3514["SweepEdge Adjacent"] + 3515["SweepEdge Opposite"] + 3516["SweepEdge Adjacent"] + 3517["SweepEdge Opposite"] + 3518["SweepEdge Adjacent"] + 3519["SweepEdge Opposite"] + 3520["SweepEdge Adjacent"] + 3521["SweepEdge Opposite"] + 3522["SweepEdge Adjacent"] + 3523["SweepEdge Opposite"] + 3524["SweepEdge Adjacent"] + 3525["SweepEdge Opposite"] + 3526["SweepEdge Adjacent"] + 3527["SweepEdge Opposite"] + 3528["SweepEdge Adjacent"] + 3529["SweepEdge Opposite"] + 3530["SweepEdge Adjacent"] + 3531["SweepEdge Opposite"] + 3532["SweepEdge Adjacent"] + 3533["SweepEdge Opposite"] + 3534["SweepEdge Adjacent"] + 3535["SweepEdge Opposite"] + 3536["SweepEdge Adjacent"] + 3537["SweepEdge Opposite"] + 3538["SweepEdge Adjacent"] + 3539["SweepEdge Opposite"] + 3540["SweepEdge Adjacent"] + 3541["SweepEdge Opposite"] + 3542["SweepEdge Adjacent"] + 3543["SweepEdge Opposite"] + 3544["SweepEdge Adjacent"] + 3545["SweepEdge Opposite"] + 3546["SweepEdge Adjacent"] + 3547["SweepEdge Opposite"] + 3548["SweepEdge Adjacent"] + 3549["SweepEdge Opposite"] + 3550["SweepEdge Adjacent"] + 3551["SweepEdge Opposite"] + 3552["SweepEdge Adjacent"] + 3553["SweepEdge Opposite"] + 3554["SweepEdge Adjacent"] + 3555["SweepEdge Opposite"] + 3556["SweepEdge Adjacent"] + 3557["SweepEdge Opposite"] + 3558["SweepEdge Adjacent"] + 3559["SweepEdge Opposite"] + 3560["SweepEdge Adjacent"] + 3561["SweepEdge Opposite"] + 3562["SweepEdge Adjacent"] + 3563["SweepEdge Opposite"] + 3564["SweepEdge Adjacent"] + 3565["SweepEdge Opposite"] + 3566["SweepEdge Adjacent"] + 3567["SweepEdge Opposite"] + 3568["SweepEdge Adjacent"] + 3569["SweepEdge Opposite"] + 3570["SweepEdge Adjacent"] + 3571["SweepEdge Opposite"] + 3572["SweepEdge Adjacent"] + 3573["SweepEdge Opposite"] + 3574["SweepEdge Adjacent"] + 3575["SweepEdge Opposite"] + 3576["SweepEdge Adjacent"] + 3577["SweepEdge Opposite"] + 3578["SweepEdge Adjacent"] + 3579["SweepEdge Opposite"] + 3580["SweepEdge Adjacent"] + 3581["SweepEdge Opposite"] + 3582["SweepEdge Adjacent"] + 3583["SweepEdge Opposite"] + 3584["SweepEdge Adjacent"] + 3585["SweepEdge Opposite"] + 3586["SweepEdge Adjacent"] + 3587["SweepEdge Opposite"] + 3588["SweepEdge Adjacent"] + 3589["SweepEdge Opposite"] + 3590["SweepEdge Adjacent"] + 3591["SweepEdge Opposite"] + 3592["SweepEdge Adjacent"] + 3593["SweepEdge Opposite"] + 3594["SweepEdge Adjacent"] + 3595["SweepEdge Opposite"] + 3596["SweepEdge Adjacent"] + 3597["SweepEdge Opposite"] + 3598["SweepEdge Adjacent"] + 3599["SweepEdge Opposite"] + 3600["SweepEdge Adjacent"] + 3601["SweepEdge Opposite"] + 3602["SweepEdge Adjacent"] + 3603["SweepEdge Opposite"] + 3604["SweepEdge Adjacent"] + 3605["SweepEdge Opposite"] + 3606["SweepEdge Adjacent"] + 3607["SweepEdge Opposite"] + 3608["SweepEdge Adjacent"] + 3609["SweepEdge Opposite"] + 3610["SweepEdge Adjacent"] + 3611["SweepEdge Opposite"] + 3612["SweepEdge Adjacent"] + 3613["SweepEdge Opposite"] + 3614["SweepEdge Adjacent"] + 3615["SweepEdge Opposite"] + 3616["SweepEdge Adjacent"] + 3617["SweepEdge Opposite"] + 3618["SweepEdge Adjacent"] + 3619["SweepEdge Opposite"] + 3620["SweepEdge Adjacent"] + 3621["SweepEdge Opposite"] + 3622["SweepEdge Adjacent"] + 3623["SweepEdge Opposite"] + 3624["SweepEdge Adjacent"] + 3625["SweepEdge Opposite"] + 3626["SweepEdge Adjacent"] + 3627["SweepEdge Opposite"] + 3628["SweepEdge Adjacent"] + 3629["SweepEdge Opposite"] + 3630["SweepEdge Adjacent"] + 3631["SweepEdge Opposite"] + 3632["SweepEdge Adjacent"] + 3633["SweepEdge Opposite"] + 3634["SweepEdge Adjacent"] + 3635["SweepEdge Opposite"] + 3636["SweepEdge Adjacent"] + 3637["SweepEdge Opposite"] + 3638["SweepEdge Adjacent"] + 3639["SweepEdge Opposite"] + 3640["SweepEdge Adjacent"] + 3641["SweepEdge Opposite"] + 3642["SweepEdge Adjacent"] + 3643["SweepEdge Opposite"] + 3644["SweepEdge Adjacent"] + 3645["SweepEdge Opposite"] + 3646["SweepEdge Adjacent"] + 3647["SweepEdge Opposite"] + 3648["SweepEdge Adjacent"] + 3649["SweepEdge Opposite"] + 3650["SweepEdge Adjacent"] + 3651["SweepEdge Opposite"] + 3652["SweepEdge Adjacent"] + 3653["SweepEdge Opposite"] + 3654["SweepEdge Adjacent"] + 3655["SweepEdge Opposite"] + 3656["SweepEdge Adjacent"] + 3657["SweepEdge Opposite"] + 3658["SweepEdge Adjacent"] + 3659["SweepEdge Opposite"] + 3660["SweepEdge Adjacent"] + 3661["SweepEdge Opposite"] + 3662["SweepEdge Adjacent"] + 3663["SweepEdge Opposite"] + 3664["SweepEdge Adjacent"] + 3665["SweepEdge Opposite"] + 3666["SweepEdge Adjacent"] + 3667["SweepEdge Opposite"] + 3668["SweepEdge Adjacent"] + 3669["SweepEdge Opposite"] + 3670["SweepEdge Adjacent"] + 3671["SweepEdge Opposite"] + 3672["SweepEdge Adjacent"] + 3673["SweepEdge Opposite"] + 3674["SweepEdge Adjacent"] + 3675["SweepEdge Opposite"] + 3676["SweepEdge Adjacent"] + 3677["SweepEdge Opposite"] + 3678["SweepEdge Adjacent"] + 3679["SweepEdge Opposite"] + 3680["SweepEdge Adjacent"] + 3681["SweepEdge Opposite"] + 3682["SweepEdge Adjacent"] + 3683["SweepEdge Opposite"] + 3684["SweepEdge Adjacent"] + 3685["SweepEdge Opposite"] + 3686["SweepEdge Adjacent"] + 3687["SweepEdge Opposite"] + 3688["SweepEdge Adjacent"] + 3689["SweepEdge Opposite"] + 3690["SweepEdge Adjacent"] + 3691["SweepEdge Opposite"] + 3692["SweepEdge Adjacent"] + 3693["SweepEdge Opposite"] + 3694["SweepEdge Adjacent"] + 3695["SweepEdge Opposite"] + 3696["SweepEdge Adjacent"] + 3697["SweepEdge Opposite"] + 3698["SweepEdge Adjacent"] + 3699["SweepEdge Opposite"] + 3700["SweepEdge Adjacent"] + 3701["SweepEdge Opposite"] + 3702["SweepEdge Adjacent"] + 3703["SweepEdge Opposite"] + 3704["SweepEdge Adjacent"] + 3705["SweepEdge Opposite"] + 3706["SweepEdge Adjacent"] + 3707["SweepEdge Opposite"] + 3708["SweepEdge Adjacent"] + 3709["SweepEdge Opposite"] + 3710["SweepEdge Adjacent"] + 3711["SweepEdge Opposite"] + 3712["SweepEdge Adjacent"] + 3713["SweepEdge Opposite"] + 3714["SweepEdge Adjacent"] + 3715["SweepEdge Opposite"] + 3716["SweepEdge Adjacent"] + 3717["SweepEdge Opposite"] + 3718["SweepEdge Adjacent"] + 3719["SweepEdge Opposite"] + 3720["SweepEdge Adjacent"] + 3721["SweepEdge Opposite"] + 3722["SweepEdge Adjacent"] + 3723["SweepEdge Opposite"] + 3724["SweepEdge Adjacent"] + 3725["SweepEdge Opposite"] + 3726["SweepEdge Adjacent"] + 3727["SweepEdge Opposite"] + 3728["SweepEdge Adjacent"] + 3729["SweepEdge Opposite"] + 3730["SweepEdge Adjacent"] + 3731["SweepEdge Opposite"] + 3732["SweepEdge Adjacent"] + 3733["SweepEdge Opposite"] + 3734["SweepEdge Adjacent"] + 3735["SweepEdge Opposite"] + 3736["SweepEdge Adjacent"] + 3737["SweepEdge Opposite"] + 3738["SweepEdge Adjacent"] + 3739["SweepEdge Opposite"] + 3740["SweepEdge Adjacent"] + 3741["SweepEdge Opposite"] + 3742["SweepEdge Adjacent"] + 3743["SweepEdge Opposite"] + 3744["SweepEdge Adjacent"] + 3745["SweepEdge Opposite"] + 3746["SweepEdge Adjacent"] + 3747["SweepEdge Opposite"] + 3748["SweepEdge Adjacent"] + 3749["SweepEdge Opposite"] + 3750["SweepEdge Adjacent"] + 3751["SweepEdge Opposite"] + 3752["SweepEdge Adjacent"] + 3753["SweepEdge Opposite"] + 3754["SweepEdge Adjacent"] + 3755["SweepEdge Opposite"] + 3756["SweepEdge Adjacent"] + 3757["SweepEdge Opposite"] + 3758["SweepEdge Adjacent"] + 3759["SweepEdge Opposite"] + 3760["SweepEdge Adjacent"] + 3761["SweepEdge Opposite"] + 3762["SweepEdge Adjacent"] + 3763["SweepEdge Opposite"] + 3764["SweepEdge Adjacent"] + 3765["SweepEdge Opposite"] + 3766["SweepEdge Adjacent"] + 3767["SweepEdge Opposite"] + 3768["SweepEdge Adjacent"] + 3769["SweepEdge Opposite"] + 3770["SweepEdge Adjacent"] + 3771["SweepEdge Opposite"] + 3772["SweepEdge Adjacent"] + 3773["SweepEdge Opposite"] + 3774["SweepEdge Adjacent"] + 3775["SweepEdge Opposite"] + 3776["SweepEdge Adjacent"] + 3777["SweepEdge Opposite"] + 3778["SweepEdge Adjacent"] + 3779["SweepEdge Opposite"] + 3780["SweepEdge Adjacent"] + 3781["SweepEdge Opposite"] + 3782["SweepEdge Adjacent"] + 3783["SweepEdge Opposite"] + 3784["SweepEdge Adjacent"] + 3785["SweepEdge Opposite"] + 3786["SweepEdge Adjacent"] + 3787["SweepEdge Opposite"] + 3788["SweepEdge Adjacent"] + 3789["SweepEdge Opposite"] + 3790["SweepEdge Adjacent"] + 3791["SweepEdge Opposite"] + 3792["SweepEdge Adjacent"] + 3793["SweepEdge Opposite"] + 3794["SweepEdge Adjacent"] + 3795["SweepEdge Opposite"] + 3796["SweepEdge Adjacent"] + 3797["SweepEdge Opposite"] + 3798["SweepEdge Adjacent"] + 3799["SweepEdge Opposite"] + 3800["SweepEdge Adjacent"] + 3801["SweepEdge Opposite"] + 3802["SweepEdge Adjacent"] + 3803["SweepEdge Opposite"] + 3804["SweepEdge Adjacent"] + 3805["SweepEdge Opposite"] + 3806["SweepEdge Adjacent"] + 3807["SweepEdge Opposite"] + 3808["SweepEdge Adjacent"] + 3809["SweepEdge Opposite"] + 3810["SweepEdge Adjacent"] + 3811["SweepEdge Opposite"] + 3812["SweepEdge Adjacent"] + 3813["SweepEdge Opposite"] + 3814["SweepEdge Adjacent"] + 3815["SweepEdge Opposite"] + 3816["SweepEdge Adjacent"] + 3817["SweepEdge Opposite"] + 3818["SweepEdge Adjacent"] + 3819["SweepEdge Opposite"] + 3820["SweepEdge Adjacent"] + 3821["SweepEdge Opposite"] + 3822["SweepEdge Adjacent"] + 3823["SweepEdge Opposite"] + 3824["SweepEdge Adjacent"] + 3825["SweepEdge Opposite"] + 3826["SweepEdge Adjacent"] + 3827["SweepEdge Opposite"] + 3828["SweepEdge Adjacent"] + 3829["SweepEdge Opposite"] + 3830["SweepEdge Adjacent"] + 3831["SweepEdge Opposite"] + 3832["SweepEdge Adjacent"] + 3833["SweepEdge Opposite"] + 3834["SweepEdge Adjacent"] + 3835["SweepEdge Opposite"] + 3836["SweepEdge Adjacent"] + 3837["SweepEdge Opposite"] + 3838["SweepEdge Adjacent"] + 3839["SweepEdge Opposite"] + 3840["SweepEdge Adjacent"] + 3841["SweepEdge Opposite"] + 3842["SweepEdge Adjacent"] + 3843["SweepEdge Opposite"] + 3844["SweepEdge Adjacent"] + 3845["SweepEdge Opposite"] + 3846["SweepEdge Adjacent"] + 3847["SweepEdge Opposite"] + 3848["SweepEdge Adjacent"] + 3849["SweepEdge Opposite"] + 3850["SweepEdge Adjacent"] + 3851["SweepEdge Opposite"] + 3852["SweepEdge Adjacent"] + 3853["SweepEdge Opposite"] + 3854["SweepEdge Adjacent"] + 3855["SweepEdge Opposite"] + 3856["SweepEdge Adjacent"] + 3857["SweepEdge Opposite"] + 3858["SweepEdge Adjacent"] + 3859["SweepEdge Opposite"] + 3860["SweepEdge Adjacent"] + 3861["SweepEdge Opposite"] + 3862["SweepEdge Adjacent"] + 3863["SweepEdge Opposite"] + 3864["SweepEdge Adjacent"] + 3865["SweepEdge Opposite"] + 3866["SweepEdge Adjacent"] + 3867["SweepEdge Opposite"] + 3868["SweepEdge Adjacent"] + 3869["SweepEdge Opposite"] + 3870["SweepEdge Adjacent"] + 3871["SweepEdge Opposite"] + 3872["SweepEdge Adjacent"] + 3873["SweepEdge Opposite"] + 3874["SweepEdge Adjacent"] + 3875["SweepEdge Opposite"] + 3876["SweepEdge Adjacent"] + 3877["SweepEdge Opposite"] + 3878["SweepEdge Adjacent"] + 3879["SweepEdge Opposite"] + 3880["SweepEdge Adjacent"] + 3881["SweepEdge Opposite"] + 3882["SweepEdge Adjacent"] + 3883["SweepEdge Opposite"] + 3884["SweepEdge Adjacent"] + 3885["SweepEdge Opposite"] + 3886["SweepEdge Adjacent"] + 3887["SweepEdge Opposite"] + 3888["SweepEdge Adjacent"] + 3889["SweepEdge Opposite"] + 3890["SweepEdge Adjacent"] + 3891["SweepEdge Opposite"] + 3892["SweepEdge Adjacent"] + 3893["SweepEdge Opposite"] + 3894["SweepEdge Adjacent"] + 3895["SweepEdge Opposite"] + 3896["SweepEdge Adjacent"] + 3897["SweepEdge Opposite"] + 3898["SweepEdge Adjacent"] + 3899["SweepEdge Opposite"] + 3900["SweepEdge Adjacent"] + 3901["SweepEdge Opposite"] + 3902["SweepEdge Adjacent"] + 3903["SweepEdge Opposite"] + 3904["SweepEdge Adjacent"] + 3905["SweepEdge Opposite"] + 3906["SweepEdge Adjacent"] + 3907["SweepEdge Opposite"] + 3908["SweepEdge Adjacent"] + 3909["SweepEdge Opposite"] + 3910["SweepEdge Adjacent"] + 3911["SweepEdge Opposite"] + 3912["SweepEdge Adjacent"] + 3913["SweepEdge Opposite"] + 3914["SweepEdge Adjacent"] + 3915["SweepEdge Opposite"] + 3916["SweepEdge Adjacent"] + 3917["SweepEdge Opposite"] + 3918["SweepEdge Adjacent"] + 3919["SweepEdge Opposite"] + 3920["SweepEdge Adjacent"] + 3921["SweepEdge Opposite"] + 3922["SweepEdge Adjacent"] + 3923["SweepEdge Opposite"] + 3924["SweepEdge Adjacent"] + 3925["SweepEdge Opposite"] + 3926["SweepEdge Adjacent"] + 3927["SweepEdge Opposite"] + 3928["SweepEdge Adjacent"] + 3929["SweepEdge Opposite"] + 3930["SweepEdge Adjacent"] + 3931["SweepEdge Opposite"] + 3932["SweepEdge Adjacent"] + 3933["SweepEdge Opposite"] + 3934["SweepEdge Adjacent"] + 3935["SweepEdge Opposite"] + 3936["SweepEdge Adjacent"] + 3937["SweepEdge Opposite"] + 3938["SweepEdge Adjacent"] + 3939["SweepEdge Opposite"] + 3940["SweepEdge Adjacent"] + 3941["SweepEdge Opposite"] + 3942["SweepEdge Adjacent"] + 3943["SweepEdge Opposite"] + 3944["SweepEdge Adjacent"] + 3945["SweepEdge Opposite"] + 3946["SweepEdge Adjacent"] + 3947["SweepEdge Opposite"] + 3948["SweepEdge Adjacent"] + 3949["SweepEdge Opposite"] + 3950["SweepEdge Adjacent"] + 3951["SweepEdge Opposite"] + 3952["SweepEdge Adjacent"] + 3953["SweepEdge Opposite"] + 3954["SweepEdge Adjacent"] + 3955["SweepEdge Opposite"] + 3956["SweepEdge Adjacent"] + 3957["SweepEdge Opposite"] + 3958["SweepEdge Adjacent"] + 3959["SweepEdge Opposite"] + 3960["SweepEdge Adjacent"] + 3961["SweepEdge Opposite"] + 3962["SweepEdge Adjacent"] + 3963["SweepEdge Opposite"] + 3964["SweepEdge Adjacent"] + 3965["SweepEdge Opposite"] + 3966["SweepEdge Adjacent"] + 3967["SweepEdge Opposite"] + 3968["SweepEdge Adjacent"] + 3969["SweepEdge Opposite"] + 3970["SweepEdge Adjacent"] + 3971["SweepEdge Opposite"] + 3972["SweepEdge Adjacent"] + 3973["SweepEdge Opposite"] + 3974["SweepEdge Adjacent"] + 3975["SweepEdge Opposite"] + 3976["SweepEdge Adjacent"] + 3977["SweepEdge Opposite"] + 3978["SweepEdge Adjacent"] + 3979["SweepEdge Opposite"] + 3980["SweepEdge Adjacent"] + 3981["SweepEdge Opposite"] + 3982["SweepEdge Adjacent"] + 3983["SweepEdge Opposite"] + 3984["SweepEdge Adjacent"] + 3985["SweepEdge Opposite"] + 3986["SweepEdge Adjacent"] + 3987["SweepEdge Opposite"] + 3988["SweepEdge Adjacent"] + 3989["SweepEdge Opposite"] + 3990["SweepEdge Adjacent"] + 3991["SweepEdge Opposite"] + 3992["SweepEdge Adjacent"] + 3993["SweepEdge Opposite"] + 3994["SweepEdge Adjacent"] + 3995["SweepEdge Opposite"] + 3996["SweepEdge Adjacent"] + 3997["SweepEdge Opposite"] + 3998["SweepEdge Adjacent"] + 3999["SweepEdge Opposite"] + 4000["SweepEdge Adjacent"] + 4001["SweepEdge Opposite"] + 4002["SweepEdge Adjacent"] + 4003["SweepEdge Opposite"] + 4004["SweepEdge Adjacent"] + 4005["SweepEdge Opposite"] + 4006["SweepEdge Adjacent"] + 4007["SweepEdge Opposite"] + 4008["SweepEdge Adjacent"] + 4009["SweepEdge Opposite"] + 4010["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 --- 11 + 2 --- 12 + 2 --- 13 + 2 --- 14 + 2 --- 15 + 2 --- 16 + 2 --- 17 + 2 --- 18 + 2 --- 19 + 2 --- 20 + 2 --- 21 + 2 --- 22 + 2 --- 23 + 2 --- 24 + 2 --- 25 + 2 --- 26 + 2 --- 27 + 2 --- 28 + 2 --- 29 + 2 --- 30 + 2 --- 31 + 2 --- 32 + 2 --- 33 + 2 --- 34 + 2 --- 35 + 2 --- 36 + 2 --- 37 + 2 --- 38 + 2 --- 39 + 2 --- 40 + 2 --- 41 + 2 --- 42 + 2 --- 43 + 2 --- 44 + 2 --- 45 + 2 --- 46 + 2 --- 47 + 2 --- 48 + 2 --- 49 + 2 --- 50 + 2 --- 51 + 2 --- 52 + 2 --- 53 + 2 --- 54 + 2 --- 55 + 2 --- 56 + 2 --- 57 + 2 --- 58 + 2 --- 59 + 2 --- 60 + 2 --- 61 + 2 --- 62 + 2 --- 63 + 2 --- 64 + 2 --- 65 + 2 --- 66 + 2 --- 67 + 2 --- 68 + 2 --- 69 + 2 --- 70 + 2 --- 71 + 2 --- 72 + 2 --- 73 + 2 --- 74 + 2 --- 75 + 2 --- 76 + 2 --- 77 + 2 --- 78 + 2 --- 79 + 2 --- 80 + 2 --- 81 + 2 --- 82 + 2 --- 83 + 2 --- 84 + 2 --- 85 + 2 --- 86 + 2 --- 87 + 2 --- 88 + 2 --- 89 + 2 --- 90 + 2 --- 91 + 2 --- 92 + 2 --- 93 + 2 --- 94 + 2 --- 95 + 2 --- 96 + 2 --- 97 + 2 --- 98 + 2 --- 99 + 2 --- 100 + 2 --- 101 + 2 --- 102 + 2 --- 103 + 2 --- 104 + 2 --- 105 + 2 --- 106 + 2 --- 107 + 2 --- 108 + 2 --- 109 + 2 --- 110 + 2 --- 111 + 2 --- 112 + 2 --- 113 + 2 --- 114 + 2 --- 115 + 2 --- 116 + 2 --- 117 + 2 --- 118 + 2 --- 119 + 2 --- 120 + 2 --- 121 + 2 --- 122 + 2 --- 123 + 2 --- 124 + 2 --- 125 + 2 --- 126 + 2 --- 127 + 2 --- 128 + 2 --- 129 + 2 --- 130 + 2 --- 131 + 2 --- 132 + 2 --- 133 + 2 --- 134 + 2 --- 135 + 2 --- 136 + 2 --- 137 + 2 --- 138 + 2 --- 139 + 2 --- 140 + 2 --- 141 + 2 --- 142 + 2 --- 143 + 2 --- 144 + 2 --- 145 + 2 --- 146 + 2 --- 147 + 2 --- 148 + 2 --- 149 + 2 --- 150 + 2 --- 151 + 2 --- 152 + 2 --- 153 + 2 --- 154 + 2 --- 155 + 2 --- 156 + 2 --- 157 + 2 --- 158 + 2 --- 159 + 2 --- 160 + 2 --- 161 + 2 --- 162 + 2 --- 163 + 2 --- 164 + 2 --- 165 + 2 --- 166 + 2 --- 167 + 2 --- 168 + 2 --- 169 + 2 --- 170 + 2 --- 171 + 2 --- 172 + 2 --- 173 + 2 --- 174 + 2 --- 175 + 2 --- 176 + 2 --- 177 + 2 --- 178 + 2 --- 179 + 2 --- 180 + 2 --- 181 + 2 --- 182 + 2 --- 183 + 2 --- 184 + 2 --- 185 + 2 --- 186 + 2 --- 187 + 2 --- 188 + 2 --- 189 + 2 --- 190 + 2 --- 191 + 2 --- 192 + 2 --- 193 + 2 --- 194 + 2 --- 195 + 2 --- 196 + 2 --- 197 + 2 --- 198 + 2 --- 199 + 2 --- 200 + 2 --- 201 + 2 --- 202 + 2 --- 203 + 2 --- 204 + 2 --- 205 + 2 --- 206 + 2 --- 207 + 2 --- 208 + 2 --- 209 + 2 --- 210 + 2 --- 211 + 2 --- 212 + 2 --- 213 + 2 --- 214 + 2 --- 215 + 2 --- 216 + 2 --- 217 + 2 --- 218 + 2 --- 219 + 2 --- 220 + 2 --- 221 + 2 --- 222 + 2 --- 223 + 2 --- 224 + 2 --- 225 + 2 --- 226 + 2 --- 227 + 2 --- 228 + 2 --- 229 + 2 --- 230 + 2 --- 231 + 2 --- 232 + 2 --- 233 + 2 --- 234 + 2 --- 235 + 2 --- 236 + 2 --- 237 + 2 --- 238 + 2 --- 239 + 2 --- 240 + 2 --- 241 + 2 --- 242 + 2 --- 243 + 2 --- 244 + 2 --- 245 + 2 --- 246 + 2 --- 247 + 2 --- 248 + 2 --- 249 + 2 --- 250 + 2 --- 251 + 2 --- 252 + 2 --- 253 + 2 --- 254 + 2 --- 255 + 2 --- 256 + 2 --- 257 + 2 --- 258 + 2 --- 259 + 2 --- 260 + 2 --- 261 + 2 --- 262 + 2 --- 263 + 2 --- 264 + 2 --- 265 + 2 --- 266 + 2 --- 267 + 2 --- 268 + 2 --- 269 + 2 --- 270 + 2 --- 271 + 2 --- 272 + 2 --- 273 + 2 --- 274 + 2 --- 275 + 2 --- 276 + 2 --- 277 + 2 --- 278 + 2 --- 279 + 2 --- 280 + 2 --- 281 + 2 --- 282 + 2 --- 283 + 2 --- 284 + 2 --- 285 + 2 --- 286 + 2 --- 287 + 2 --- 288 + 2 --- 289 + 2 --- 290 + 2 --- 291 + 2 --- 292 + 2 --- 293 + 2 --- 294 + 2 --- 295 + 2 --- 296 + 2 --- 297 + 2 --- 298 + 2 --- 299 + 2 --- 300 + 2 --- 301 + 2 --- 302 + 2 --- 303 + 2 --- 304 + 2 --- 305 + 2 --- 306 + 2 --- 307 + 2 --- 308 + 2 --- 309 + 2 --- 310 + 2 --- 311 + 2 --- 312 + 2 --- 313 + 2 --- 314 + 2 --- 315 + 2 --- 316 + 2 --- 317 + 2 --- 318 + 2 --- 319 + 2 --- 320 + 2 --- 321 + 2 --- 322 + 2 --- 323 + 2 --- 324 + 2 --- 325 + 2 --- 326 + 2 --- 327 + 2 --- 328 + 2 --- 329 + 2 --- 330 + 2 --- 331 + 2 --- 332 + 2 --- 333 + 2 --- 334 + 2 --- 335 + 2 --- 336 + 2 --- 337 + 2 --- 338 + 2 --- 339 + 2 --- 340 + 2 --- 341 + 2 --- 342 + 2 --- 343 + 2 --- 344 + 2 --- 345 + 2 --- 346 + 2 --- 347 + 2 --- 348 + 2 --- 349 + 2 --- 350 + 2 --- 351 + 2 --- 352 + 2 --- 353 + 2 --- 354 + 2 --- 355 + 2 --- 356 + 2 --- 357 + 2 --- 358 + 2 --- 359 + 2 --- 360 + 2 --- 361 + 2 --- 362 + 2 --- 363 + 2 --- 364 + 2 --- 365 + 2 --- 366 + 2 --- 367 + 2 --- 368 + 2 --- 369 + 2 --- 370 + 2 --- 371 + 2 --- 372 + 2 --- 373 + 2 --- 374 + 2 --- 375 + 2 --- 376 + 2 --- 377 + 2 --- 378 + 2 --- 379 + 2 --- 380 + 2 --- 381 + 2 --- 382 + 2 --- 383 + 2 --- 384 + 2 --- 385 + 2 --- 386 + 2 --- 387 + 2 --- 388 + 2 --- 389 + 2 --- 390 + 2 --- 391 + 2 --- 392 + 2 --- 393 + 2 --- 394 + 2 --- 395 + 2 --- 396 + 2 --- 397 + 2 --- 398 + 2 --- 399 + 2 --- 400 + 2 --- 401 + 2 --- 402 + 2 --- 403 + 2 --- 404 + 2 --- 405 + 2 --- 406 + 2 --- 407 + 2 --- 408 + 2 --- 409 + 2 --- 410 + 2 --- 411 + 2 --- 412 + 2 --- 413 + 2 --- 414 + 2 --- 415 + 2 --- 416 + 2 --- 417 + 2 --- 418 + 2 --- 419 + 2 --- 420 + 2 --- 421 + 2 --- 422 + 2 --- 423 + 2 --- 424 + 2 --- 425 + 2 --- 426 + 2 --- 427 + 2 --- 428 + 2 --- 429 + 2 --- 430 + 2 --- 431 + 2 --- 432 + 2 --- 433 + 2 --- 434 + 2 --- 435 + 2 --- 436 + 2 --- 437 + 2 --- 438 + 2 --- 439 + 2 --- 440 + 2 --- 441 + 2 --- 442 + 2 --- 443 + 2 --- 444 + 2 --- 445 + 2 --- 446 + 2 --- 447 + 2 --- 448 + 2 --- 449 + 2 --- 450 + 2 --- 451 + 2 --- 452 + 2 --- 453 + 2 --- 454 + 2 --- 455 + 2 --- 456 + 2 --- 457 + 2 --- 458 + 2 --- 459 + 2 --- 460 + 2 --- 461 + 2 --- 462 + 2 --- 463 + 2 --- 464 + 2 --- 465 + 2 --- 466 + 2 --- 467 + 2 --- 468 + 2 --- 469 + 2 --- 470 + 2 --- 471 + 2 --- 472 + 2 --- 473 + 2 --- 474 + 2 --- 475 + 2 --- 476 + 2 --- 477 + 2 --- 478 + 2 --- 479 + 2 --- 480 + 2 --- 481 + 2 --- 482 + 2 --- 483 + 2 --- 484 + 2 --- 485 + 2 --- 486 + 2 --- 487 + 2 --- 488 + 2 --- 489 + 2 --- 490 + 2 --- 491 + 2 --- 492 + 2 --- 493 + 2 --- 494 + 2 --- 495 + 2 --- 496 + 2 --- 497 + 2 --- 498 + 2 --- 499 + 2 --- 500 + 2 --- 501 + 2 --- 502 + 2 --- 503 + 2 --- 504 + 2 --- 505 + 2 --- 506 + 2 --- 507 + 2 --- 508 + 2 --- 509 + 2 --- 510 + 2 --- 511 + 2 --- 512 + 2 --- 513 + 2 --- 514 + 2 --- 515 + 2 --- 516 + 2 --- 517 + 2 --- 518 + 2 --- 519 + 2 --- 520 + 2 --- 521 + 2 --- 522 + 2 --- 523 + 2 --- 524 + 2 --- 525 + 2 --- 526 + 2 --- 527 + 2 --- 528 + 2 --- 529 + 2 --- 530 + 2 --- 531 + 2 --- 532 + 2 --- 533 + 2 --- 534 + 2 --- 535 + 2 --- 536 + 2 --- 537 + 2 --- 538 + 2 --- 539 + 2 --- 540 + 2 --- 541 + 2 --- 542 + 2 --- 543 + 2 --- 544 + 2 --- 545 + 2 --- 546 + 2 --- 547 + 2 --- 548 + 2 --- 549 + 2 --- 550 + 2 --- 551 + 2 --- 552 + 2 --- 553 + 2 --- 554 + 2 --- 555 + 2 --- 556 + 2 --- 557 + 2 --- 558 + 2 --- 559 + 2 --- 560 + 2 --- 561 + 2 --- 562 + 2 --- 563 + 2 --- 564 + 2 --- 565 + 2 --- 566 + 2 --- 567 + 2 --- 568 + 2 --- 569 + 2 --- 570 + 2 --- 571 + 2 --- 572 + 2 --- 573 + 2 --- 574 + 2 --- 575 + 2 --- 576 + 2 --- 577 + 2 --- 578 + 2 --- 579 + 2 --- 580 + 2 --- 581 + 2 --- 582 + 2 --- 583 + 2 --- 584 + 2 --- 585 + 2 --- 586 + 2 --- 587 + 2 --- 588 + 2 --- 589 + 2 --- 590 + 2 --- 591 + 2 --- 592 + 2 --- 593 + 2 --- 594 + 2 --- 595 + 2 --- 596 + 2 --- 597 + 2 --- 598 + 2 --- 599 + 2 --- 600 + 2 --- 601 + 2 --- 602 + 2 --- 603 + 2 --- 604 + 2 --- 605 + 2 --- 606 + 2 --- 607 + 2 --- 608 + 2 --- 609 + 2 --- 610 + 2 --- 611 + 2 --- 612 + 2 --- 613 + 2 --- 614 + 2 --- 615 + 2 --- 616 + 2 --- 617 + 2 --- 618 + 2 --- 619 + 2 --- 620 + 2 --- 621 + 2 --- 622 + 2 --- 623 + 2 --- 624 + 2 --- 625 + 2 --- 626 + 2 --- 627 + 2 --- 628 + 2 --- 629 + 2 --- 630 + 2 --- 631 + 2 --- 632 + 2 --- 633 + 2 --- 634 + 2 --- 635 + 2 --- 636 + 2 --- 637 + 2 --- 638 + 2 --- 639 + 2 --- 640 + 2 --- 641 + 2 --- 642 + 2 --- 643 + 2 --- 644 + 2 --- 645 + 2 --- 646 + 2 --- 647 + 2 --- 648 + 2 --- 649 + 2 --- 650 + 2 --- 651 + 2 --- 652 + 2 --- 653 + 2 --- 654 + 2 --- 655 + 2 --- 656 + 2 --- 657 + 2 --- 658 + 2 --- 659 + 2 --- 660 + 2 --- 661 + 2 --- 662 + 2 --- 663 + 2 --- 664 + 2 --- 665 + 2 --- 666 + 2 --- 667 + 2 --- 668 + 2 --- 669 + 2 --- 670 + 2 --- 671 + 2 --- 672 + 2 --- 673 + 2 --- 674 + 2 --- 675 + 2 --- 676 + 2 --- 677 + 2 --- 678 + 2 --- 679 + 2 --- 680 + 2 --- 681 + 2 --- 682 + 2 --- 683 + 2 --- 684 + 2 --- 685 + 2 --- 686 + 2 --- 687 + 2 --- 688 + 2 --- 689 + 2 --- 690 + 2 --- 691 + 2 --- 692 + 2 --- 693 + 2 --- 694 + 2 --- 695 + 2 --- 696 + 2 --- 697 + 2 --- 698 + 2 --- 699 + 2 --- 700 + 2 --- 701 + 2 --- 702 + 2 --- 703 + 2 --- 704 + 2 --- 705 + 2 --- 706 + 2 --- 707 + 2 --- 708 + 2 --- 709 + 2 --- 710 + 2 --- 711 + 2 --- 712 + 2 --- 713 + 2 --- 714 + 2 --- 715 + 2 --- 716 + 2 --- 717 + 2 --- 718 + 2 --- 719 + 2 --- 720 + 2 --- 721 + 2 --- 722 + 2 --- 723 + 2 --- 724 + 2 --- 725 + 2 --- 726 + 2 --- 727 + 2 --- 728 + 2 --- 729 + 2 --- 730 + 2 --- 731 + 2 --- 732 + 2 --- 733 + 2 --- 734 + 2 --- 735 + 2 --- 736 + 2 --- 737 + 2 --- 738 + 2 --- 739 + 2 --- 740 + 2 --- 741 + 2 --- 742 + 2 --- 743 + 2 --- 744 + 2 --- 745 + 2 --- 746 + 2 --- 747 + 2 --- 748 + 2 --- 749 + 2 --- 750 + 2 --- 751 + 2 --- 752 + 2 --- 753 + 2 --- 754 + 2 --- 755 + 2 --- 756 + 2 --- 757 + 2 --- 758 + 2 --- 759 + 2 --- 760 + 2 --- 761 + 2 --- 762 + 2 --- 763 + 2 --- 764 + 2 --- 765 + 2 --- 766 + 2 --- 767 + 2 --- 768 + 2 --- 769 + 2 --- 770 + 2 --- 771 + 2 --- 772 + 2 --- 773 + 2 --- 774 + 2 --- 775 + 2 --- 776 + 2 --- 777 + 2 --- 778 + 2 --- 779 + 2 --- 780 + 2 --- 781 + 2 --- 782 + 2 --- 783 + 2 --- 784 + 2 --- 785 + 2 --- 786 + 2 --- 787 + 2 --- 788 + 2 --- 789 + 2 --- 790 + 2 --- 791 + 2 --- 792 + 2 --- 793 + 2 --- 794 + 2 --- 795 + 2 --- 796 + 2 --- 797 + 2 --- 798 + 2 --- 799 + 2 --- 800 + 2 --- 801 + 2 --- 802 + 2 --- 803 + 2 --- 804 + 2 --- 805 + 2 --- 806 + 2 --- 807 + 2 --- 808 + 2 --- 809 + 2 --- 810 + 2 --- 811 + 2 --- 812 + 2 --- 813 + 2 --- 814 + 2 --- 815 + 2 --- 816 + 2 --- 817 + 2 --- 818 + 2 --- 819 + 2 --- 820 + 2 --- 821 + 2 --- 822 + 2 --- 823 + 2 --- 824 + 2 --- 825 + 2 --- 826 + 2 --- 827 + 2 --- 828 + 2 --- 829 + 2 --- 830 + 2 --- 831 + 2 --- 832 + 2 --- 833 + 2 --- 834 + 2 --- 835 + 2 --- 836 + 2 --- 837 + 2 --- 838 + 2 --- 839 + 2 --- 840 + 2 --- 841 + 2 --- 842 + 2 --- 843 + 2 --- 844 + 2 --- 845 + 2 --- 846 + 2 --- 847 + 2 --- 848 + 2 --- 849 + 2 --- 850 + 2 --- 851 + 2 --- 852 + 2 --- 853 + 2 --- 854 + 2 --- 855 + 2 --- 856 + 2 --- 857 + 2 --- 858 + 2 --- 859 + 2 --- 860 + 2 --- 861 + 2 --- 862 + 2 --- 863 + 2 --- 864 + 2 --- 865 + 2 --- 866 + 2 --- 867 + 2 --- 868 + 2 --- 869 + 2 --- 870 + 2 --- 871 + 2 --- 872 + 2 --- 873 + 2 --- 874 + 2 --- 875 + 2 --- 876 + 2 --- 877 + 2 --- 878 + 2 --- 879 + 2 --- 880 + 2 --- 881 + 2 --- 882 + 2 --- 883 + 2 --- 884 + 2 --- 885 + 2 --- 886 + 2 --- 887 + 2 --- 888 + 2 --- 889 + 2 --- 890 + 2 --- 891 + 2 --- 892 + 2 --- 893 + 2 --- 894 + 2 --- 895 + 2 --- 896 + 2 --- 897 + 2 --- 898 + 2 --- 899 + 2 --- 900 + 2 --- 901 + 2 --- 902 + 2 --- 903 + 2 --- 904 + 2 --- 905 + 2 --- 906 + 2 --- 907 + 2 --- 908 + 2 --- 909 + 2 --- 910 + 2 --- 911 + 2 --- 912 + 2 --- 913 + 2 --- 914 + 2 --- 915 + 2 --- 916 + 2 --- 917 + 2 --- 918 + 2 --- 919 + 2 --- 920 + 2 --- 921 + 2 --- 922 + 2 --- 923 + 2 --- 924 + 2 --- 925 + 2 --- 926 + 2 --- 927 + 2 --- 928 + 2 --- 929 + 2 --- 930 + 2 --- 931 + 2 --- 932 + 2 --- 933 + 2 --- 934 + 2 --- 935 + 2 --- 936 + 2 --- 937 + 2 --- 938 + 2 --- 939 + 2 --- 940 + 2 --- 941 + 2 --- 942 + 2 --- 943 + 2 --- 944 + 2 --- 945 + 2 --- 946 + 2 --- 947 + 2 --- 948 + 2 --- 949 + 2 --- 950 + 2 --- 951 + 2 --- 952 + 2 --- 953 + 2 --- 954 + 2 --- 955 + 2 --- 956 + 2 --- 957 + 2 --- 958 + 2 --- 959 + 2 --- 960 + 2 --- 961 + 2 --- 962 + 2 --- 963 + 2 --- 964 + 2 --- 965 + 2 --- 966 + 2 --- 967 + 2 --- 968 + 2 --- 969 + 2 --- 970 + 2 --- 971 + 2 --- 972 + 2 --- 973 + 2 --- 974 + 2 --- 975 + 2 --- 976 + 2 --- 977 + 2 --- 978 + 2 --- 979 + 2 --- 980 + 2 --- 981 + 2 --- 982 + 2 --- 983 + 2 --- 984 + 2 --- 985 + 2 --- 986 + 2 --- 987 + 2 --- 988 + 2 --- 989 + 2 --- 990 + 2 --- 991 + 2 --- 992 + 2 --- 993 + 2 --- 994 + 2 --- 995 + 2 --- 996 + 2 --- 997 + 2 --- 998 + 2 --- 999 + 2 --- 1000 + 2 --- 1001 + 2 --- 1002 + 2 --- 1003 + 2 ---- 1005 + 2 --- 1004 + 3 --- 2006 + 3 --- 4009 + 3 --- 4010 + 4 --- 2005 + 4 --- 4007 + 4 --- 4008 + 5 --- 2004 + 5 --- 4005 + 5 --- 4006 + 6 --- 2003 + 6 --- 4003 + 6 --- 4004 + 7 --- 2002 + 7 --- 4001 + 7 --- 4002 + 8 --- 2001 + 8 --- 3999 + 8 --- 4000 + 9 --- 2000 + 9 --- 3997 + 9 --- 3998 + 10 --- 1999 + 10 --- 3995 + 10 --- 3996 + 11 --- 1998 + 11 --- 3993 + 11 --- 3994 + 12 --- 1997 + 12 --- 3991 + 12 --- 3992 + 13 --- 1996 + 13 --- 3989 + 13 --- 3990 + 14 --- 1995 + 14 --- 3987 + 14 --- 3988 + 15 --- 1994 + 15 --- 3985 + 15 --- 3986 + 16 --- 1993 + 16 --- 3983 + 16 --- 3984 + 17 --- 1992 + 17 --- 3981 + 17 --- 3982 + 18 --- 1991 + 18 --- 3979 + 18 --- 3980 + 19 --- 1990 + 19 --- 3977 + 19 --- 3978 + 20 --- 1989 + 20 --- 3975 + 20 --- 3976 + 21 --- 1988 + 21 --- 3973 + 21 --- 3974 + 22 --- 1987 + 22 --- 3971 + 22 --- 3972 + 23 --- 1986 + 23 --- 3969 + 23 --- 3970 + 24 --- 1985 + 24 --- 3967 + 24 --- 3968 + 25 --- 1984 + 25 --- 3965 + 25 --- 3966 + 26 --- 1983 + 26 --- 3963 + 26 --- 3964 + 27 --- 1982 + 27 --- 3961 + 27 --- 3962 + 28 --- 1981 + 28 --- 3959 + 28 --- 3960 + 29 --- 1980 + 29 --- 3957 + 29 --- 3958 + 30 --- 1979 + 30 --- 3955 + 30 --- 3956 + 31 --- 1978 + 31 --- 3953 + 31 --- 3954 + 32 --- 1977 + 32 --- 3951 + 32 --- 3952 + 33 --- 1976 + 33 --- 3949 + 33 --- 3950 + 34 --- 1975 + 34 --- 3947 + 34 --- 3948 + 35 --- 1974 + 35 --- 3945 + 35 --- 3946 + 36 --- 1973 + 36 --- 3943 + 36 --- 3944 + 37 --- 1972 + 37 --- 3941 + 37 --- 3942 + 38 --- 1971 + 38 --- 3939 + 38 --- 3940 + 39 --- 1970 + 39 --- 3937 + 39 --- 3938 + 40 --- 1969 + 40 --- 3935 + 40 --- 3936 + 41 --- 1968 + 41 --- 3933 + 41 --- 3934 + 42 --- 1967 + 42 --- 3931 + 42 --- 3932 + 43 --- 1966 + 43 --- 3929 + 43 --- 3930 + 44 --- 1965 + 44 --- 3927 + 44 --- 3928 + 45 --- 1964 + 45 --- 3925 + 45 --- 3926 + 46 --- 1963 + 46 --- 3923 + 46 --- 3924 + 47 --- 1962 + 47 --- 3921 + 47 --- 3922 + 48 --- 1961 + 48 --- 3919 + 48 --- 3920 + 49 --- 1960 + 49 --- 3917 + 49 --- 3918 + 50 --- 1959 + 50 --- 3915 + 50 --- 3916 + 51 --- 1958 + 51 --- 3913 + 51 --- 3914 + 52 --- 1957 + 52 --- 3911 + 52 --- 3912 + 53 --- 1956 + 53 --- 3909 + 53 --- 3910 + 54 --- 1955 + 54 --- 3907 + 54 --- 3908 + 55 --- 1954 + 55 --- 3905 + 55 --- 3906 + 56 --- 1953 + 56 --- 3903 + 56 --- 3904 + 57 --- 1952 + 57 --- 3901 + 57 --- 3902 + 58 --- 1951 + 58 --- 3899 + 58 --- 3900 + 59 --- 1950 + 59 --- 3897 + 59 --- 3898 + 60 --- 1949 + 60 --- 3895 + 60 --- 3896 + 61 --- 1948 + 61 --- 3893 + 61 --- 3894 + 62 --- 1947 + 62 --- 3891 + 62 --- 3892 + 63 --- 1946 + 63 --- 3889 + 63 --- 3890 + 64 --- 1945 + 64 --- 3887 + 64 --- 3888 + 65 --- 1944 + 65 --- 3885 + 65 --- 3886 + 66 --- 1943 + 66 --- 3883 + 66 --- 3884 + 67 --- 1942 + 67 --- 3881 + 67 --- 3882 + 68 --- 1941 + 68 --- 3879 + 68 --- 3880 + 69 --- 1940 + 69 --- 3877 + 69 --- 3878 + 70 --- 1939 + 70 --- 3875 + 70 --- 3876 + 71 --- 1938 + 71 --- 3873 + 71 --- 3874 + 72 --- 1937 + 72 --- 3871 + 72 --- 3872 + 73 --- 1936 + 73 --- 3869 + 73 --- 3870 + 74 --- 1935 + 74 --- 3867 + 74 --- 3868 + 75 --- 1934 + 75 --- 3865 + 75 --- 3866 + 76 --- 1933 + 76 --- 3863 + 76 --- 3864 + 77 --- 1932 + 77 --- 3861 + 77 --- 3862 + 78 --- 1931 + 78 --- 3859 + 78 --- 3860 + 79 --- 1930 + 79 --- 3857 + 79 --- 3858 + 80 --- 1929 + 80 --- 3855 + 80 --- 3856 + 81 --- 1928 + 81 --- 3853 + 81 --- 3854 + 82 --- 1927 + 82 --- 3851 + 82 --- 3852 + 83 --- 1926 + 83 --- 3849 + 83 --- 3850 + 84 --- 1925 + 84 --- 3847 + 84 --- 3848 + 85 --- 1924 + 85 --- 3845 + 85 --- 3846 + 86 --- 1923 + 86 --- 3843 + 86 --- 3844 + 87 --- 1922 + 87 --- 3841 + 87 --- 3842 + 88 --- 1921 + 88 --- 3839 + 88 --- 3840 + 89 --- 1920 + 89 --- 3837 + 89 --- 3838 + 90 --- 1919 + 90 --- 3835 + 90 --- 3836 + 91 --- 1918 + 91 --- 3833 + 91 --- 3834 + 92 --- 1917 + 92 --- 3831 + 92 --- 3832 + 93 --- 1916 + 93 --- 3829 + 93 --- 3830 + 94 --- 1915 + 94 --- 3827 + 94 --- 3828 + 95 --- 1914 + 95 --- 3825 + 95 --- 3826 + 96 --- 1913 + 96 --- 3823 + 96 --- 3824 + 97 --- 1912 + 97 --- 3821 + 97 --- 3822 + 98 --- 1911 + 98 --- 3819 + 98 --- 3820 + 99 --- 1910 + 99 --- 3817 + 99 --- 3818 + 100 --- 1909 + 100 --- 3815 + 100 --- 3816 + 101 --- 1908 + 101 --- 3813 + 101 --- 3814 + 102 --- 1907 + 102 --- 3811 + 102 --- 3812 + 103 --- 1906 + 103 --- 3809 + 103 --- 3810 + 104 --- 1905 + 104 --- 3807 + 104 --- 3808 + 105 --- 1904 + 105 --- 3805 + 105 --- 3806 + 106 --- 1903 + 106 --- 3803 + 106 --- 3804 + 107 --- 1902 + 107 --- 3801 + 107 --- 3802 + 108 --- 1901 + 108 --- 3799 + 108 --- 3800 + 109 --- 1900 + 109 --- 3797 + 109 --- 3798 + 110 --- 1899 + 110 --- 3795 + 110 --- 3796 + 111 --- 1898 + 111 --- 3793 + 111 --- 3794 + 112 --- 1897 + 112 --- 3791 + 112 --- 3792 + 113 --- 1896 + 113 --- 3789 + 113 --- 3790 + 114 --- 1895 + 114 --- 3787 + 114 --- 3788 + 115 --- 1894 + 115 --- 3785 + 115 --- 3786 + 116 --- 1893 + 116 --- 3783 + 116 --- 3784 + 117 --- 1892 + 117 --- 3781 + 117 --- 3782 + 118 --- 1891 + 118 --- 3779 + 118 --- 3780 + 119 --- 1890 + 119 --- 3777 + 119 --- 3778 + 120 --- 1889 + 120 --- 3775 + 120 --- 3776 + 121 --- 1888 + 121 --- 3773 + 121 --- 3774 + 122 --- 1887 + 122 --- 3771 + 122 --- 3772 + 123 --- 1886 + 123 --- 3769 + 123 --- 3770 + 124 --- 1885 + 124 --- 3767 + 124 --- 3768 + 125 --- 1884 + 125 --- 3765 + 125 --- 3766 + 126 --- 1883 + 126 --- 3763 + 126 --- 3764 + 127 --- 1882 + 127 --- 3761 + 127 --- 3762 + 128 --- 1881 + 128 --- 3759 + 128 --- 3760 + 129 --- 1880 + 129 --- 3757 + 129 --- 3758 + 130 --- 1879 + 130 --- 3755 + 130 --- 3756 + 131 --- 1878 + 131 --- 3753 + 131 --- 3754 + 132 --- 1877 + 132 --- 3751 + 132 --- 3752 + 133 --- 1876 + 133 --- 3749 + 133 --- 3750 + 134 --- 1875 + 134 --- 3747 + 134 --- 3748 + 135 --- 1874 + 135 --- 3745 + 135 --- 3746 + 136 --- 1873 + 136 --- 3743 + 136 --- 3744 + 137 --- 1872 + 137 --- 3741 + 137 --- 3742 + 138 --- 1871 + 138 --- 3739 + 138 --- 3740 + 139 --- 1870 + 139 --- 3737 + 139 --- 3738 + 140 --- 1869 + 140 --- 3735 + 140 --- 3736 + 141 --- 1868 + 141 --- 3733 + 141 --- 3734 + 142 --- 1867 + 142 --- 3731 + 142 --- 3732 + 143 --- 1866 + 143 --- 3729 + 143 --- 3730 + 144 --- 1865 + 144 --- 3727 + 144 --- 3728 + 145 --- 1864 + 145 --- 3725 + 145 --- 3726 + 146 --- 1863 + 146 --- 3723 + 146 --- 3724 + 147 --- 1862 + 147 --- 3721 + 147 --- 3722 + 148 --- 1861 + 148 --- 3719 + 148 --- 3720 + 149 --- 1860 + 149 --- 3717 + 149 --- 3718 + 150 --- 1859 + 150 --- 3715 + 150 --- 3716 + 151 --- 1858 + 151 --- 3713 + 151 --- 3714 + 152 --- 1857 + 152 --- 3711 + 152 --- 3712 + 153 --- 1856 + 153 --- 3709 + 153 --- 3710 + 154 --- 1855 + 154 --- 3707 + 154 --- 3708 + 155 --- 1854 + 155 --- 3705 + 155 --- 3706 + 156 --- 1853 + 156 --- 3703 + 156 --- 3704 + 157 --- 1852 + 157 --- 3701 + 157 --- 3702 + 158 --- 1851 + 158 --- 3699 + 158 --- 3700 + 159 --- 1850 + 159 --- 3697 + 159 --- 3698 + 160 --- 1849 + 160 --- 3695 + 160 --- 3696 + 161 --- 1848 + 161 --- 3693 + 161 --- 3694 + 162 --- 1847 + 162 --- 3691 + 162 --- 3692 + 163 --- 1846 + 163 --- 3689 + 163 --- 3690 + 164 --- 1845 + 164 --- 3687 + 164 --- 3688 + 165 --- 1844 + 165 --- 3685 + 165 --- 3686 + 166 --- 1843 + 166 --- 3683 + 166 --- 3684 + 167 --- 1842 + 167 --- 3681 + 167 --- 3682 + 168 --- 1841 + 168 --- 3679 + 168 --- 3680 + 169 --- 1840 + 169 --- 3677 + 169 --- 3678 + 170 --- 1839 + 170 --- 3675 + 170 --- 3676 + 171 --- 1838 + 171 --- 3673 + 171 --- 3674 + 172 --- 1837 + 172 --- 3671 + 172 --- 3672 + 173 --- 1836 + 173 --- 3669 + 173 --- 3670 + 174 --- 1835 + 174 --- 3667 + 174 --- 3668 + 175 --- 1834 + 175 --- 3665 + 175 --- 3666 + 176 --- 1833 + 176 --- 3663 + 176 --- 3664 + 177 --- 1832 + 177 --- 3661 + 177 --- 3662 + 178 --- 1831 + 178 --- 3659 + 178 --- 3660 + 179 --- 1830 + 179 --- 3657 + 179 --- 3658 + 180 --- 1829 + 180 --- 3655 + 180 --- 3656 + 181 --- 1828 + 181 --- 3653 + 181 --- 3654 + 182 --- 1827 + 182 --- 3651 + 182 --- 3652 + 183 --- 1826 + 183 --- 3649 + 183 --- 3650 + 184 --- 1825 + 184 --- 3647 + 184 --- 3648 + 185 --- 1824 + 185 --- 3645 + 185 --- 3646 + 186 --- 1823 + 186 --- 3643 + 186 --- 3644 + 187 --- 1822 + 187 --- 3641 + 187 --- 3642 + 188 --- 1821 + 188 --- 3639 + 188 --- 3640 + 189 --- 1820 + 189 --- 3637 + 189 --- 3638 + 190 --- 1819 + 190 --- 3635 + 190 --- 3636 + 191 --- 1818 + 191 --- 3633 + 191 --- 3634 + 192 --- 1817 + 192 --- 3631 + 192 --- 3632 + 193 --- 1816 + 193 --- 3629 + 193 --- 3630 + 194 --- 1815 + 194 --- 3627 + 194 --- 3628 + 195 --- 1814 + 195 --- 3625 + 195 --- 3626 + 196 --- 1813 + 196 --- 3623 + 196 --- 3624 + 197 --- 1812 + 197 --- 3621 + 197 --- 3622 + 198 --- 1811 + 198 --- 3619 + 198 --- 3620 + 199 --- 1810 + 199 --- 3617 + 199 --- 3618 + 200 --- 1809 + 200 --- 3615 + 200 --- 3616 + 201 --- 1808 + 201 --- 3613 + 201 --- 3614 + 202 --- 1807 + 202 --- 3611 + 202 --- 3612 + 203 --- 1806 + 203 --- 3609 + 203 --- 3610 + 204 --- 1805 + 204 --- 3607 + 204 --- 3608 + 205 --- 1804 + 205 --- 3605 + 205 --- 3606 + 206 --- 1803 + 206 --- 3603 + 206 --- 3604 + 207 --- 1802 + 207 --- 3601 + 207 --- 3602 + 208 --- 1801 + 208 --- 3599 + 208 --- 3600 + 209 --- 1800 + 209 --- 3597 + 209 --- 3598 + 210 --- 1799 + 210 --- 3595 + 210 --- 3596 + 211 --- 1798 + 211 --- 3593 + 211 --- 3594 + 212 --- 1797 + 212 --- 3591 + 212 --- 3592 + 213 --- 1796 + 213 --- 3589 + 213 --- 3590 + 214 --- 1795 + 214 --- 3587 + 214 --- 3588 + 215 --- 1794 + 215 --- 3585 + 215 --- 3586 + 216 --- 1793 + 216 --- 3583 + 216 --- 3584 + 217 --- 1792 + 217 --- 3581 + 217 --- 3582 + 218 --- 1791 + 218 --- 3579 + 218 --- 3580 + 219 --- 1790 + 219 --- 3577 + 219 --- 3578 + 220 --- 1789 + 220 --- 3575 + 220 --- 3576 + 221 --- 1788 + 221 --- 3573 + 221 --- 3574 + 222 --- 1787 + 222 --- 3571 + 222 --- 3572 + 223 --- 1786 + 223 --- 3569 + 223 --- 3570 + 224 --- 1785 + 224 --- 3567 + 224 --- 3568 + 225 --- 1784 + 225 --- 3565 + 225 --- 3566 + 226 --- 1783 + 226 --- 3563 + 226 --- 3564 + 227 --- 1782 + 227 --- 3561 + 227 --- 3562 + 228 --- 1781 + 228 --- 3559 + 228 --- 3560 + 229 --- 1780 + 229 --- 3557 + 229 --- 3558 + 230 --- 1779 + 230 --- 3555 + 230 --- 3556 + 231 --- 1778 + 231 --- 3553 + 231 --- 3554 + 232 --- 1777 + 232 --- 3551 + 232 --- 3552 + 233 --- 1776 + 233 --- 3549 + 233 --- 3550 + 234 --- 1775 + 234 --- 3547 + 234 --- 3548 + 235 --- 1774 + 235 --- 3545 + 235 --- 3546 + 236 --- 1773 + 236 --- 3543 + 236 --- 3544 + 237 --- 1772 + 237 --- 3541 + 237 --- 3542 + 238 --- 1771 + 238 --- 3539 + 238 --- 3540 + 239 --- 1770 + 239 --- 3537 + 239 --- 3538 + 240 --- 1769 + 240 --- 3535 + 240 --- 3536 + 241 --- 1768 + 241 --- 3533 + 241 --- 3534 + 242 --- 1767 + 242 --- 3531 + 242 --- 3532 + 243 --- 1766 + 243 --- 3529 + 243 --- 3530 + 244 --- 1765 + 244 --- 3527 + 244 --- 3528 + 245 --- 1764 + 245 --- 3525 + 245 --- 3526 + 246 --- 1763 + 246 --- 3523 + 246 --- 3524 + 247 --- 1762 + 247 --- 3521 + 247 --- 3522 + 248 --- 1761 + 248 --- 3519 + 248 --- 3520 + 249 --- 1760 + 249 --- 3517 + 249 --- 3518 + 250 --- 1759 + 250 --- 3515 + 250 --- 3516 + 251 --- 1758 + 251 --- 3513 + 251 --- 3514 + 252 --- 1757 + 252 --- 3511 + 252 --- 3512 + 253 --- 1756 + 253 --- 3509 + 253 --- 3510 + 254 --- 1755 + 254 --- 3507 + 254 --- 3508 + 255 --- 1754 + 255 --- 3505 + 255 --- 3506 + 256 --- 1753 + 256 --- 3503 + 256 --- 3504 + 257 --- 1752 + 257 --- 3501 + 257 --- 3502 + 258 --- 1751 + 258 --- 3499 + 258 --- 3500 + 259 --- 1750 + 259 --- 3497 + 259 --- 3498 + 260 --- 1749 + 260 --- 3495 + 260 --- 3496 + 261 --- 1748 + 261 --- 3493 + 261 --- 3494 + 262 --- 1747 + 262 --- 3491 + 262 --- 3492 + 263 --- 1746 + 263 --- 3489 + 263 --- 3490 + 264 --- 1745 + 264 --- 3487 + 264 --- 3488 + 265 --- 1744 + 265 --- 3485 + 265 --- 3486 + 266 --- 1743 + 266 --- 3483 + 266 --- 3484 + 267 --- 1742 + 267 --- 3481 + 267 --- 3482 + 268 --- 1741 + 268 --- 3479 + 268 --- 3480 + 269 --- 1740 + 269 --- 3477 + 269 --- 3478 + 270 --- 1739 + 270 --- 3475 + 270 --- 3476 + 271 --- 1738 + 271 --- 3473 + 271 --- 3474 + 272 --- 1737 + 272 --- 3471 + 272 --- 3472 + 273 --- 1736 + 273 --- 3469 + 273 --- 3470 + 274 --- 1735 + 274 --- 3467 + 274 --- 3468 + 275 --- 1734 + 275 --- 3465 + 275 --- 3466 + 276 --- 1733 + 276 --- 3463 + 276 --- 3464 + 277 --- 1732 + 277 --- 3461 + 277 --- 3462 + 278 --- 1731 + 278 --- 3459 + 278 --- 3460 + 279 --- 1730 + 279 --- 3457 + 279 --- 3458 + 280 --- 1729 + 280 --- 3455 + 280 --- 3456 + 281 --- 1728 + 281 --- 3453 + 281 --- 3454 + 282 --- 1727 + 282 --- 3451 + 282 --- 3452 + 283 --- 1726 + 283 --- 3449 + 283 --- 3450 + 284 --- 1725 + 284 --- 3447 + 284 --- 3448 + 285 --- 1724 + 285 --- 3445 + 285 --- 3446 + 286 --- 1723 + 286 --- 3443 + 286 --- 3444 + 287 --- 1722 + 287 --- 3441 + 287 --- 3442 + 288 --- 1721 + 288 --- 3439 + 288 --- 3440 + 289 --- 1720 + 289 --- 3437 + 289 --- 3438 + 290 --- 1719 + 290 --- 3435 + 290 --- 3436 + 291 --- 1718 + 291 --- 3433 + 291 --- 3434 + 292 --- 1717 + 292 --- 3431 + 292 --- 3432 + 293 --- 1716 + 293 --- 3429 + 293 --- 3430 + 294 --- 1715 + 294 --- 3427 + 294 --- 3428 + 295 --- 1714 + 295 --- 3425 + 295 --- 3426 + 296 --- 1713 + 296 --- 3423 + 296 --- 3424 + 297 --- 1712 + 297 --- 3421 + 297 --- 3422 + 298 --- 1711 + 298 --- 3419 + 298 --- 3420 + 299 --- 1710 + 299 --- 3417 + 299 --- 3418 + 300 --- 1709 + 300 --- 3415 + 300 --- 3416 + 301 --- 1708 + 301 --- 3413 + 301 --- 3414 + 302 --- 1707 + 302 --- 3411 + 302 --- 3412 + 303 --- 1706 + 303 --- 3409 + 303 --- 3410 + 304 --- 1705 + 304 --- 3407 + 304 --- 3408 + 305 --- 1704 + 305 --- 3405 + 305 --- 3406 + 306 --- 1703 + 306 --- 3403 + 306 --- 3404 + 307 --- 1702 + 307 --- 3401 + 307 --- 3402 + 308 --- 1701 + 308 --- 3399 + 308 --- 3400 + 309 --- 1700 + 309 --- 3397 + 309 --- 3398 + 310 --- 1699 + 310 --- 3395 + 310 --- 3396 + 311 --- 1698 + 311 --- 3393 + 311 --- 3394 + 312 --- 1697 + 312 --- 3391 + 312 --- 3392 + 313 --- 1696 + 313 --- 3389 + 313 --- 3390 + 314 --- 1695 + 314 --- 3387 + 314 --- 3388 + 315 --- 1694 + 315 --- 3385 + 315 --- 3386 + 316 --- 1693 + 316 --- 3383 + 316 --- 3384 + 317 --- 1692 + 317 --- 3381 + 317 --- 3382 + 318 --- 1691 + 318 --- 3379 + 318 --- 3380 + 319 --- 1690 + 319 --- 3377 + 319 --- 3378 + 320 --- 1689 + 320 --- 3375 + 320 --- 3376 + 321 --- 1688 + 321 --- 3373 + 321 --- 3374 + 322 --- 1687 + 322 --- 3371 + 322 --- 3372 + 323 --- 1686 + 323 --- 3369 + 323 --- 3370 + 324 --- 1685 + 324 --- 3367 + 324 --- 3368 + 325 --- 1684 + 325 --- 3365 + 325 --- 3366 + 326 --- 1683 + 326 --- 3363 + 326 --- 3364 + 327 --- 1682 + 327 --- 3361 + 327 --- 3362 + 328 --- 1681 + 328 --- 3359 + 328 --- 3360 + 329 --- 1680 + 329 --- 3357 + 329 --- 3358 + 330 --- 1679 + 330 --- 3355 + 330 --- 3356 + 331 --- 1678 + 331 --- 3353 + 331 --- 3354 + 332 --- 1677 + 332 --- 3351 + 332 --- 3352 + 333 --- 1676 + 333 --- 3349 + 333 --- 3350 + 334 --- 1675 + 334 --- 3347 + 334 --- 3348 + 335 --- 1674 + 335 --- 3345 + 335 --- 3346 + 336 --- 1673 + 336 --- 3343 + 336 --- 3344 + 337 --- 1672 + 337 --- 3341 + 337 --- 3342 + 338 --- 1671 + 338 --- 3339 + 338 --- 3340 + 339 --- 1670 + 339 --- 3337 + 339 --- 3338 + 340 --- 1669 + 340 --- 3335 + 340 --- 3336 + 341 --- 1668 + 341 --- 3333 + 341 --- 3334 + 342 --- 1667 + 342 --- 3331 + 342 --- 3332 + 343 --- 1666 + 343 --- 3329 + 343 --- 3330 + 344 --- 1665 + 344 --- 3327 + 344 --- 3328 + 345 --- 1664 + 345 --- 3325 + 345 --- 3326 + 346 --- 1663 + 346 --- 3323 + 346 --- 3324 + 347 --- 1662 + 347 --- 3321 + 347 --- 3322 + 348 --- 1661 + 348 --- 3319 + 348 --- 3320 + 349 --- 1660 + 349 --- 3317 + 349 --- 3318 + 350 --- 1659 + 350 --- 3315 + 350 --- 3316 + 351 --- 1658 + 351 --- 3313 + 351 --- 3314 + 352 --- 1657 + 352 --- 3311 + 352 --- 3312 + 353 --- 1656 + 353 --- 3309 + 353 --- 3310 + 354 --- 1655 + 354 --- 3307 + 354 --- 3308 + 355 --- 1654 + 355 --- 3305 + 355 --- 3306 + 356 --- 1653 + 356 --- 3303 + 356 --- 3304 + 357 --- 1652 + 357 --- 3301 + 357 --- 3302 + 358 --- 1651 + 358 --- 3299 + 358 --- 3300 + 359 --- 1650 + 359 --- 3297 + 359 --- 3298 + 360 --- 1649 + 360 --- 3295 + 360 --- 3296 + 361 --- 1648 + 361 --- 3293 + 361 --- 3294 + 362 --- 1647 + 362 --- 3291 + 362 --- 3292 + 363 --- 1646 + 363 --- 3289 + 363 --- 3290 + 364 --- 1645 + 364 --- 3287 + 364 --- 3288 + 365 --- 1644 + 365 --- 3285 + 365 --- 3286 + 366 --- 1643 + 366 --- 3283 + 366 --- 3284 + 367 --- 1642 + 367 --- 3281 + 367 --- 3282 + 368 --- 1641 + 368 --- 3279 + 368 --- 3280 + 369 --- 1640 + 369 --- 3277 + 369 --- 3278 + 370 --- 1639 + 370 --- 3275 + 370 --- 3276 + 371 --- 1638 + 371 --- 3273 + 371 --- 3274 + 372 --- 1637 + 372 --- 3271 + 372 --- 3272 + 373 --- 1636 + 373 --- 3269 + 373 --- 3270 + 374 --- 1635 + 374 --- 3267 + 374 --- 3268 + 375 --- 1634 + 375 --- 3265 + 375 --- 3266 + 376 --- 1633 + 376 --- 3263 + 376 --- 3264 + 377 --- 1632 + 377 --- 3261 + 377 --- 3262 + 378 --- 1631 + 378 --- 3259 + 378 --- 3260 + 379 --- 1630 + 379 --- 3257 + 379 --- 3258 + 380 --- 1629 + 380 --- 3255 + 380 --- 3256 + 381 --- 1628 + 381 --- 3253 + 381 --- 3254 + 382 --- 1627 + 382 --- 3251 + 382 --- 3252 + 383 --- 1626 + 383 --- 3249 + 383 --- 3250 + 384 --- 1625 + 384 --- 3247 + 384 --- 3248 + 385 --- 1624 + 385 --- 3245 + 385 --- 3246 + 386 --- 1623 + 386 --- 3243 + 386 --- 3244 + 387 --- 1622 + 387 --- 3241 + 387 --- 3242 + 388 --- 1621 + 388 --- 3239 + 388 --- 3240 + 389 --- 1620 + 389 --- 3237 + 389 --- 3238 + 390 --- 1619 + 390 --- 3235 + 390 --- 3236 + 391 --- 1618 + 391 --- 3233 + 391 --- 3234 + 392 --- 1617 + 392 --- 3231 + 392 --- 3232 + 393 --- 1616 + 393 --- 3229 + 393 --- 3230 + 394 --- 1615 + 394 --- 3227 + 394 --- 3228 + 395 --- 1614 + 395 --- 3225 + 395 --- 3226 + 396 --- 1613 + 396 --- 3223 + 396 --- 3224 + 397 --- 1612 + 397 --- 3221 + 397 --- 3222 + 398 --- 1611 + 398 --- 3219 + 398 --- 3220 + 399 --- 1610 + 399 --- 3217 + 399 --- 3218 + 400 --- 1609 + 400 --- 3215 + 400 --- 3216 + 401 --- 1608 + 401 --- 3213 + 401 --- 3214 + 402 --- 1607 + 402 --- 3211 + 402 --- 3212 + 403 --- 1606 + 403 --- 3209 + 403 --- 3210 + 404 --- 1605 + 404 --- 3207 + 404 --- 3208 + 405 --- 1604 + 405 --- 3205 + 405 --- 3206 + 406 --- 1603 + 406 --- 3203 + 406 --- 3204 + 407 --- 1602 + 407 --- 3201 + 407 --- 3202 + 408 --- 1601 + 408 --- 3199 + 408 --- 3200 + 409 --- 1600 + 409 --- 3197 + 409 --- 3198 + 410 --- 1599 + 410 --- 3195 + 410 --- 3196 + 411 --- 1598 + 411 --- 3193 + 411 --- 3194 + 412 --- 1597 + 412 --- 3191 + 412 --- 3192 + 413 --- 1596 + 413 --- 3189 + 413 --- 3190 + 414 --- 1595 + 414 --- 3187 + 414 --- 3188 + 415 --- 1594 + 415 --- 3185 + 415 --- 3186 + 416 --- 1593 + 416 --- 3183 + 416 --- 3184 + 417 --- 1592 + 417 --- 3181 + 417 --- 3182 + 418 --- 1591 + 418 --- 3179 + 418 --- 3180 + 419 --- 1590 + 419 --- 3177 + 419 --- 3178 + 420 --- 1589 + 420 --- 3175 + 420 --- 3176 + 421 --- 1588 + 421 --- 3173 + 421 --- 3174 + 422 --- 1587 + 422 --- 3171 + 422 --- 3172 + 423 --- 1586 + 423 --- 3169 + 423 --- 3170 + 424 --- 1585 + 424 --- 3167 + 424 --- 3168 + 425 --- 1584 + 425 --- 3165 + 425 --- 3166 + 426 --- 1583 + 426 --- 3163 + 426 --- 3164 + 427 --- 1582 + 427 --- 3161 + 427 --- 3162 + 428 --- 1581 + 428 --- 3159 + 428 --- 3160 + 429 --- 1580 + 429 --- 3157 + 429 --- 3158 + 430 --- 1579 + 430 --- 3155 + 430 --- 3156 + 431 --- 1578 + 431 --- 3153 + 431 --- 3154 + 432 --- 1577 + 432 --- 3151 + 432 --- 3152 + 433 --- 1576 + 433 --- 3149 + 433 --- 3150 + 434 --- 1575 + 434 --- 3147 + 434 --- 3148 + 435 --- 1574 + 435 --- 3145 + 435 --- 3146 + 436 --- 1573 + 436 --- 3143 + 436 --- 3144 + 437 --- 1572 + 437 --- 3141 + 437 --- 3142 + 438 --- 1571 + 438 --- 3139 + 438 --- 3140 + 439 --- 1570 + 439 --- 3137 + 439 --- 3138 + 440 --- 1569 + 440 --- 3135 + 440 --- 3136 + 441 --- 1568 + 441 --- 3133 + 441 --- 3134 + 442 --- 1567 + 442 --- 3131 + 442 --- 3132 + 443 --- 1566 + 443 --- 3129 + 443 --- 3130 + 444 --- 1565 + 444 --- 3127 + 444 --- 3128 + 445 --- 1564 + 445 --- 3125 + 445 --- 3126 + 446 --- 1563 + 446 --- 3123 + 446 --- 3124 + 447 --- 1562 + 447 --- 3121 + 447 --- 3122 + 448 --- 1561 + 448 --- 3119 + 448 --- 3120 + 449 --- 1560 + 449 --- 3117 + 449 --- 3118 + 450 --- 1559 + 450 --- 3115 + 450 --- 3116 + 451 --- 1558 + 451 --- 3113 + 451 --- 3114 + 452 --- 1557 + 452 --- 3111 + 452 --- 3112 + 453 --- 1556 + 453 --- 3109 + 453 --- 3110 + 454 --- 1555 + 454 --- 3107 + 454 --- 3108 + 455 --- 1554 + 455 --- 3105 + 455 --- 3106 + 456 --- 1553 + 456 --- 3103 + 456 --- 3104 + 457 --- 1552 + 457 --- 3101 + 457 --- 3102 + 458 --- 1551 + 458 --- 3099 + 458 --- 3100 + 459 --- 1550 + 459 --- 3097 + 459 --- 3098 + 460 --- 1549 + 460 --- 3095 + 460 --- 3096 + 461 --- 1548 + 461 --- 3093 + 461 --- 3094 + 462 --- 1547 + 462 --- 3091 + 462 --- 3092 + 463 --- 1546 + 463 --- 3089 + 463 --- 3090 + 464 --- 1545 + 464 --- 3087 + 464 --- 3088 + 465 --- 1544 + 465 --- 3085 + 465 --- 3086 + 466 --- 1543 + 466 --- 3083 + 466 --- 3084 + 467 --- 1542 + 467 --- 3081 + 467 --- 3082 + 468 --- 1541 + 468 --- 3079 + 468 --- 3080 + 469 --- 1540 + 469 --- 3077 + 469 --- 3078 + 470 --- 1539 + 470 --- 3075 + 470 --- 3076 + 471 --- 1538 + 471 --- 3073 + 471 --- 3074 + 472 --- 1537 + 472 --- 3071 + 472 --- 3072 + 473 --- 1536 + 473 --- 3069 + 473 --- 3070 + 474 --- 1535 + 474 --- 3067 + 474 --- 3068 + 475 --- 1534 + 475 --- 3065 + 475 --- 3066 + 476 --- 1533 + 476 --- 3063 + 476 --- 3064 + 477 --- 1532 + 477 --- 3061 + 477 --- 3062 + 478 --- 1531 + 478 --- 3059 + 478 --- 3060 + 479 --- 1530 + 479 --- 3057 + 479 --- 3058 + 480 --- 1529 + 480 --- 3055 + 480 --- 3056 + 481 --- 1528 + 481 --- 3053 + 481 --- 3054 + 482 --- 1527 + 482 --- 3051 + 482 --- 3052 + 483 --- 1526 + 483 --- 3049 + 483 --- 3050 + 484 --- 1525 + 484 --- 3047 + 484 --- 3048 + 485 --- 1524 + 485 --- 3045 + 485 --- 3046 + 486 --- 1523 + 486 --- 3043 + 486 --- 3044 + 487 --- 1522 + 487 --- 3041 + 487 --- 3042 + 488 --- 1521 + 488 --- 3039 + 488 --- 3040 + 489 --- 1520 + 489 --- 3037 + 489 --- 3038 + 490 --- 1519 + 490 --- 3035 + 490 --- 3036 + 491 --- 1518 + 491 --- 3033 + 491 --- 3034 + 492 --- 1517 + 492 --- 3031 + 492 --- 3032 + 493 --- 1516 + 493 --- 3029 + 493 --- 3030 + 494 --- 1515 + 494 --- 3027 + 494 --- 3028 + 495 --- 1514 + 495 --- 3025 + 495 --- 3026 + 496 --- 1513 + 496 --- 3023 + 496 --- 3024 + 497 --- 1512 + 497 --- 3021 + 497 --- 3022 + 498 --- 1511 + 498 --- 3019 + 498 --- 3020 + 499 --- 1510 + 499 --- 3017 + 499 --- 3018 + 500 --- 1509 + 500 --- 3015 + 500 --- 3016 + 501 --- 1508 + 501 --- 3013 + 501 --- 3014 + 502 --- 1507 + 502 --- 3011 + 502 --- 3012 + 503 --- 1506 + 503 --- 3009 + 503 --- 3010 + 504 --- 1505 + 504 --- 3007 + 504 --- 3008 + 505 --- 1504 + 505 --- 3005 + 505 --- 3006 + 506 --- 1503 + 506 --- 3003 + 506 --- 3004 + 507 --- 1502 + 507 --- 3001 + 507 --- 3002 + 508 --- 1501 + 508 --- 2999 + 508 --- 3000 + 509 --- 1500 + 509 --- 2997 + 509 --- 2998 + 510 --- 1499 + 510 --- 2995 + 510 --- 2996 + 511 --- 1498 + 511 --- 2993 + 511 --- 2994 + 512 --- 1497 + 512 --- 2991 + 512 --- 2992 + 513 --- 1496 + 513 --- 2989 + 513 --- 2990 + 514 --- 1495 + 514 --- 2987 + 514 --- 2988 + 515 --- 1494 + 515 --- 2985 + 515 --- 2986 + 516 --- 1493 + 516 --- 2983 + 516 --- 2984 + 517 --- 1492 + 517 --- 2981 + 517 --- 2982 + 518 --- 1491 + 518 --- 2979 + 518 --- 2980 + 519 --- 1490 + 519 --- 2977 + 519 --- 2978 + 520 --- 1489 + 520 --- 2975 + 520 --- 2976 + 521 --- 1488 + 521 --- 2973 + 521 --- 2974 + 522 --- 1487 + 522 --- 2971 + 522 --- 2972 + 523 --- 1486 + 523 --- 2969 + 523 --- 2970 + 524 --- 1485 + 524 --- 2967 + 524 --- 2968 + 525 --- 1484 + 525 --- 2965 + 525 --- 2966 + 526 --- 1483 + 526 --- 2963 + 526 --- 2964 + 527 --- 1482 + 527 --- 2961 + 527 --- 2962 + 528 --- 1481 + 528 --- 2959 + 528 --- 2960 + 529 --- 1480 + 529 --- 2957 + 529 --- 2958 + 530 --- 1479 + 530 --- 2955 + 530 --- 2956 + 531 --- 1478 + 531 --- 2953 + 531 --- 2954 + 532 --- 1477 + 532 --- 2951 + 532 --- 2952 + 533 --- 1476 + 533 --- 2949 + 533 --- 2950 + 534 --- 1475 + 534 --- 2947 + 534 --- 2948 + 535 --- 1474 + 535 --- 2945 + 535 --- 2946 + 536 --- 1473 + 536 --- 2943 + 536 --- 2944 + 537 --- 1472 + 537 --- 2941 + 537 --- 2942 + 538 --- 1471 + 538 --- 2939 + 538 --- 2940 + 539 --- 1470 + 539 --- 2937 + 539 --- 2938 + 540 --- 1469 + 540 --- 2935 + 540 --- 2936 + 541 --- 1468 + 541 --- 2933 + 541 --- 2934 + 542 --- 1467 + 542 --- 2931 + 542 --- 2932 + 543 --- 1466 + 543 --- 2929 + 543 --- 2930 + 544 --- 1465 + 544 --- 2927 + 544 --- 2928 + 545 --- 1464 + 545 --- 2925 + 545 --- 2926 + 546 --- 1463 + 546 --- 2923 + 546 --- 2924 + 547 --- 1462 + 547 --- 2921 + 547 --- 2922 + 548 --- 1461 + 548 --- 2919 + 548 --- 2920 + 549 --- 1460 + 549 --- 2917 + 549 --- 2918 + 550 --- 1459 + 550 --- 2915 + 550 --- 2916 + 551 --- 1458 + 551 --- 2913 + 551 --- 2914 + 552 --- 1457 + 552 --- 2911 + 552 --- 2912 + 553 --- 1456 + 553 --- 2909 + 553 --- 2910 + 554 --- 1455 + 554 --- 2907 + 554 --- 2908 + 555 --- 1454 + 555 --- 2905 + 555 --- 2906 + 556 --- 1453 + 556 --- 2903 + 556 --- 2904 + 557 --- 1452 + 557 --- 2901 + 557 --- 2902 + 558 --- 1451 + 558 --- 2899 + 558 --- 2900 + 559 --- 1450 + 559 --- 2897 + 559 --- 2898 + 560 --- 1449 + 560 --- 2895 + 560 --- 2896 + 561 --- 1448 + 561 --- 2893 + 561 --- 2894 + 562 --- 1447 + 562 --- 2891 + 562 --- 2892 + 563 --- 1446 + 563 --- 2889 + 563 --- 2890 + 564 --- 1445 + 564 --- 2887 + 564 --- 2888 + 565 --- 1444 + 565 --- 2885 + 565 --- 2886 + 566 --- 1443 + 566 --- 2883 + 566 --- 2884 + 567 --- 1442 + 567 --- 2881 + 567 --- 2882 + 568 --- 1441 + 568 --- 2879 + 568 --- 2880 + 569 --- 1440 + 569 --- 2877 + 569 --- 2878 + 570 --- 1439 + 570 --- 2875 + 570 --- 2876 + 571 --- 1438 + 571 --- 2873 + 571 --- 2874 + 572 --- 1437 + 572 --- 2871 + 572 --- 2872 + 573 --- 1436 + 573 --- 2869 + 573 --- 2870 + 574 --- 1435 + 574 --- 2867 + 574 --- 2868 + 575 --- 1434 + 575 --- 2865 + 575 --- 2866 + 576 --- 1433 + 576 --- 2863 + 576 --- 2864 + 577 --- 1432 + 577 --- 2861 + 577 --- 2862 + 578 --- 1431 + 578 --- 2859 + 578 --- 2860 + 579 --- 1430 + 579 --- 2857 + 579 --- 2858 + 580 --- 1429 + 580 --- 2855 + 580 --- 2856 + 581 --- 1428 + 581 --- 2853 + 581 --- 2854 + 582 --- 1427 + 582 --- 2851 + 582 --- 2852 + 583 --- 1426 + 583 --- 2849 + 583 --- 2850 + 584 --- 1425 + 584 --- 2847 + 584 --- 2848 + 585 --- 1424 + 585 --- 2845 + 585 --- 2846 + 586 --- 1423 + 586 --- 2843 + 586 --- 2844 + 587 --- 1422 + 587 --- 2841 + 587 --- 2842 + 588 --- 1421 + 588 --- 2839 + 588 --- 2840 + 589 --- 1420 + 589 --- 2837 + 589 --- 2838 + 590 --- 1419 + 590 --- 2835 + 590 --- 2836 + 591 --- 1418 + 591 --- 2833 + 591 --- 2834 + 592 --- 1417 + 592 --- 2831 + 592 --- 2832 + 593 --- 1416 + 593 --- 2829 + 593 --- 2830 + 594 --- 1415 + 594 --- 2827 + 594 --- 2828 + 595 --- 1414 + 595 --- 2825 + 595 --- 2826 + 596 --- 1413 + 596 --- 2823 + 596 --- 2824 + 597 --- 1412 + 597 --- 2821 + 597 --- 2822 + 598 --- 1411 + 598 --- 2819 + 598 --- 2820 + 599 --- 1410 + 599 --- 2817 + 599 --- 2818 + 600 --- 1409 + 600 --- 2815 + 600 --- 2816 + 601 --- 1408 + 601 --- 2813 + 601 --- 2814 + 602 --- 1407 + 602 --- 2811 + 602 --- 2812 + 603 --- 1406 + 603 --- 2809 + 603 --- 2810 + 604 --- 1405 + 604 --- 2807 + 604 --- 2808 + 605 --- 1404 + 605 --- 2805 + 605 --- 2806 + 606 --- 1403 + 606 --- 2803 + 606 --- 2804 + 607 --- 1402 + 607 --- 2801 + 607 --- 2802 + 608 --- 1401 + 608 --- 2799 + 608 --- 2800 + 609 --- 1400 + 609 --- 2797 + 609 --- 2798 + 610 --- 1399 + 610 --- 2795 + 610 --- 2796 + 611 --- 1398 + 611 --- 2793 + 611 --- 2794 + 612 --- 1397 + 612 --- 2791 + 612 --- 2792 + 613 --- 1396 + 613 --- 2789 + 613 --- 2790 + 614 --- 1395 + 614 --- 2787 + 614 --- 2788 + 615 --- 1394 + 615 --- 2785 + 615 --- 2786 + 616 --- 1393 + 616 --- 2783 + 616 --- 2784 + 617 --- 1392 + 617 --- 2781 + 617 --- 2782 + 618 --- 1391 + 618 --- 2779 + 618 --- 2780 + 619 --- 1390 + 619 --- 2777 + 619 --- 2778 + 620 --- 1389 + 620 --- 2775 + 620 --- 2776 + 621 --- 1388 + 621 --- 2773 + 621 --- 2774 + 622 --- 1387 + 622 --- 2771 + 622 --- 2772 + 623 --- 1386 + 623 --- 2769 + 623 --- 2770 + 624 --- 1385 + 624 --- 2767 + 624 --- 2768 + 625 --- 1384 + 625 --- 2765 + 625 --- 2766 + 626 --- 1383 + 626 --- 2763 + 626 --- 2764 + 627 --- 1382 + 627 --- 2761 + 627 --- 2762 + 628 --- 1381 + 628 --- 2759 + 628 --- 2760 + 629 --- 1380 + 629 --- 2757 + 629 --- 2758 + 630 --- 1379 + 630 --- 2755 + 630 --- 2756 + 631 --- 1378 + 631 --- 2753 + 631 --- 2754 + 632 --- 1377 + 632 --- 2751 + 632 --- 2752 + 633 --- 1376 + 633 --- 2749 + 633 --- 2750 + 634 --- 1375 + 634 --- 2747 + 634 --- 2748 + 635 --- 1374 + 635 --- 2745 + 635 --- 2746 + 636 --- 1373 + 636 --- 2743 + 636 --- 2744 + 637 --- 1372 + 637 --- 2741 + 637 --- 2742 + 638 --- 1371 + 638 --- 2739 + 638 --- 2740 + 639 --- 1370 + 639 --- 2737 + 639 --- 2738 + 640 --- 1369 + 640 --- 2735 + 640 --- 2736 + 641 --- 1368 + 641 --- 2733 + 641 --- 2734 + 642 --- 1367 + 642 --- 2731 + 642 --- 2732 + 643 --- 1366 + 643 --- 2729 + 643 --- 2730 + 644 --- 1365 + 644 --- 2727 + 644 --- 2728 + 645 --- 1364 + 645 --- 2725 + 645 --- 2726 + 646 --- 1363 + 646 --- 2723 + 646 --- 2724 + 647 --- 1362 + 647 --- 2721 + 647 --- 2722 + 648 --- 1361 + 648 --- 2719 + 648 --- 2720 + 649 --- 1360 + 649 --- 2717 + 649 --- 2718 + 650 --- 1359 + 650 --- 2715 + 650 --- 2716 + 651 --- 1358 + 651 --- 2713 + 651 --- 2714 + 652 --- 1357 + 652 --- 2711 + 652 --- 2712 + 653 --- 1356 + 653 --- 2709 + 653 --- 2710 + 654 --- 1355 + 654 --- 2707 + 654 --- 2708 + 655 --- 1354 + 655 --- 2705 + 655 --- 2706 + 656 --- 1353 + 656 --- 2703 + 656 --- 2704 + 657 --- 1352 + 657 --- 2701 + 657 --- 2702 + 658 --- 1351 + 658 --- 2699 + 658 --- 2700 + 659 --- 1350 + 659 --- 2697 + 659 --- 2698 + 660 --- 1349 + 660 --- 2695 + 660 --- 2696 + 661 --- 1348 + 661 --- 2693 + 661 --- 2694 + 662 --- 1347 + 662 --- 2691 + 662 --- 2692 + 663 --- 1346 + 663 --- 2689 + 663 --- 2690 + 664 --- 1345 + 664 --- 2687 + 664 --- 2688 + 665 --- 1344 + 665 --- 2685 + 665 --- 2686 + 666 --- 1343 + 666 --- 2683 + 666 --- 2684 + 667 --- 1342 + 667 --- 2681 + 667 --- 2682 + 668 --- 1341 + 668 --- 2679 + 668 --- 2680 + 669 --- 1340 + 669 --- 2677 + 669 --- 2678 + 670 --- 1339 + 670 --- 2675 + 670 --- 2676 + 671 --- 1338 + 671 --- 2673 + 671 --- 2674 + 672 --- 1337 + 672 --- 2671 + 672 --- 2672 + 673 --- 1336 + 673 --- 2669 + 673 --- 2670 + 674 --- 1335 + 674 --- 2667 + 674 --- 2668 + 675 --- 1334 + 675 --- 2665 + 675 --- 2666 + 676 --- 1333 + 676 --- 2663 + 676 --- 2664 + 677 --- 1332 + 677 --- 2661 + 677 --- 2662 + 678 --- 1331 + 678 --- 2659 + 678 --- 2660 + 679 --- 1330 + 679 --- 2657 + 679 --- 2658 + 680 --- 1329 + 680 --- 2655 + 680 --- 2656 + 681 --- 1328 + 681 --- 2653 + 681 --- 2654 + 682 --- 1327 + 682 --- 2651 + 682 --- 2652 + 683 --- 1326 + 683 --- 2649 + 683 --- 2650 + 684 --- 1325 + 684 --- 2647 + 684 --- 2648 + 685 --- 1324 + 685 --- 2645 + 685 --- 2646 + 686 --- 1323 + 686 --- 2643 + 686 --- 2644 + 687 --- 1322 + 687 --- 2641 + 687 --- 2642 + 688 --- 1321 + 688 --- 2639 + 688 --- 2640 + 689 --- 1320 + 689 --- 2637 + 689 --- 2638 + 690 --- 1319 + 690 --- 2635 + 690 --- 2636 + 691 --- 1318 + 691 --- 2633 + 691 --- 2634 + 692 --- 1317 + 692 --- 2631 + 692 --- 2632 + 693 --- 1316 + 693 --- 2629 + 693 --- 2630 + 694 --- 1315 + 694 --- 2627 + 694 --- 2628 + 695 --- 1314 + 695 --- 2625 + 695 --- 2626 + 696 --- 1313 + 696 --- 2623 + 696 --- 2624 + 697 --- 1312 + 697 --- 2621 + 697 --- 2622 + 698 --- 1311 + 698 --- 2619 + 698 --- 2620 + 699 --- 1310 + 699 --- 2617 + 699 --- 2618 + 700 --- 1309 + 700 --- 2615 + 700 --- 2616 + 701 --- 1308 + 701 --- 2613 + 701 --- 2614 + 702 --- 1307 + 702 --- 2611 + 702 --- 2612 + 703 --- 1306 + 703 --- 2609 + 703 --- 2610 + 704 --- 1305 + 704 --- 2607 + 704 --- 2608 + 705 --- 1304 + 705 --- 2605 + 705 --- 2606 + 706 --- 1303 + 706 --- 2603 + 706 --- 2604 + 707 --- 1302 + 707 --- 2601 + 707 --- 2602 + 708 --- 1301 + 708 --- 2599 + 708 --- 2600 + 709 --- 1300 + 709 --- 2597 + 709 --- 2598 + 710 --- 1299 + 710 --- 2595 + 710 --- 2596 + 711 --- 1298 + 711 --- 2593 + 711 --- 2594 + 712 --- 1297 + 712 --- 2591 + 712 --- 2592 + 713 --- 1296 + 713 --- 2589 + 713 --- 2590 + 714 --- 1295 + 714 --- 2587 + 714 --- 2588 + 715 --- 1294 + 715 --- 2585 + 715 --- 2586 + 716 --- 1293 + 716 --- 2583 + 716 --- 2584 + 717 --- 1292 + 717 --- 2581 + 717 --- 2582 + 718 --- 1291 + 718 --- 2579 + 718 --- 2580 + 719 --- 1290 + 719 --- 2577 + 719 --- 2578 + 720 --- 1289 + 720 --- 2575 + 720 --- 2576 + 721 --- 1288 + 721 --- 2573 + 721 --- 2574 + 722 --- 1287 + 722 --- 2571 + 722 --- 2572 + 723 --- 1286 + 723 --- 2569 + 723 --- 2570 + 724 --- 1285 + 724 --- 2567 + 724 --- 2568 + 725 --- 1284 + 725 --- 2565 + 725 --- 2566 + 726 --- 1283 + 726 --- 2563 + 726 --- 2564 + 727 --- 1282 + 727 --- 2561 + 727 --- 2562 + 728 --- 1281 + 728 --- 2559 + 728 --- 2560 + 729 --- 1280 + 729 --- 2557 + 729 --- 2558 + 730 --- 1279 + 730 --- 2555 + 730 --- 2556 + 731 --- 1278 + 731 --- 2553 + 731 --- 2554 + 732 --- 1277 + 732 --- 2551 + 732 --- 2552 + 733 --- 1276 + 733 --- 2549 + 733 --- 2550 + 734 --- 1275 + 734 --- 2547 + 734 --- 2548 + 735 --- 1274 + 735 --- 2545 + 735 --- 2546 + 736 --- 1273 + 736 --- 2543 + 736 --- 2544 + 737 --- 1272 + 737 --- 2541 + 737 --- 2542 + 738 --- 1271 + 738 --- 2539 + 738 --- 2540 + 739 --- 1270 + 739 --- 2537 + 739 --- 2538 + 740 --- 1269 + 740 --- 2535 + 740 --- 2536 + 741 --- 1268 + 741 --- 2533 + 741 --- 2534 + 742 --- 1267 + 742 --- 2531 + 742 --- 2532 + 743 --- 1266 + 743 --- 2529 + 743 --- 2530 + 744 --- 1265 + 744 --- 2527 + 744 --- 2528 + 745 --- 1264 + 745 --- 2525 + 745 --- 2526 + 746 --- 1263 + 746 --- 2523 + 746 --- 2524 + 747 --- 1262 + 747 --- 2521 + 747 --- 2522 + 748 --- 1261 + 748 --- 2519 + 748 --- 2520 + 749 --- 1260 + 749 --- 2517 + 749 --- 2518 + 750 --- 1259 + 750 --- 2515 + 750 --- 2516 + 751 --- 1258 + 751 --- 2513 + 751 --- 2514 + 752 --- 1257 + 752 --- 2511 + 752 --- 2512 + 753 --- 1256 + 753 --- 2509 + 753 --- 2510 + 754 --- 1255 + 754 --- 2507 + 754 --- 2508 + 755 --- 1254 + 755 --- 2505 + 755 --- 2506 + 756 --- 1253 + 756 --- 2503 + 756 --- 2504 + 757 --- 1252 + 757 --- 2501 + 757 --- 2502 + 758 --- 1251 + 758 --- 2499 + 758 --- 2500 + 759 --- 1250 + 759 --- 2497 + 759 --- 2498 + 760 --- 1249 + 760 --- 2495 + 760 --- 2496 + 761 --- 1248 + 761 --- 2493 + 761 --- 2494 + 762 --- 1247 + 762 --- 2491 + 762 --- 2492 + 763 --- 1246 + 763 --- 2489 + 763 --- 2490 + 764 --- 1245 + 764 --- 2487 + 764 --- 2488 + 765 --- 1244 + 765 --- 2485 + 765 --- 2486 + 766 --- 1243 + 766 --- 2483 + 766 --- 2484 + 767 --- 1242 + 767 --- 2481 + 767 --- 2482 + 768 --- 1241 + 768 --- 2479 + 768 --- 2480 + 769 --- 1240 + 769 --- 2477 + 769 --- 2478 + 770 --- 1239 + 770 --- 2475 + 770 --- 2476 + 771 --- 1238 + 771 --- 2473 + 771 --- 2474 + 772 --- 1237 + 772 --- 2471 + 772 --- 2472 + 773 --- 1236 + 773 --- 2469 + 773 --- 2470 + 774 --- 1235 + 774 --- 2467 + 774 --- 2468 + 775 --- 1234 + 775 --- 2465 + 775 --- 2466 + 776 --- 1233 + 776 --- 2463 + 776 --- 2464 + 777 --- 1232 + 777 --- 2461 + 777 --- 2462 + 778 --- 1231 + 778 --- 2459 + 778 --- 2460 + 779 --- 1230 + 779 --- 2457 + 779 --- 2458 + 780 --- 1229 + 780 --- 2455 + 780 --- 2456 + 781 --- 1228 + 781 --- 2453 + 781 --- 2454 + 782 --- 1227 + 782 --- 2451 + 782 --- 2452 + 783 --- 1226 + 783 --- 2449 + 783 --- 2450 + 784 --- 1225 + 784 --- 2447 + 784 --- 2448 + 785 --- 1224 + 785 --- 2445 + 785 --- 2446 + 786 --- 1223 + 786 --- 2443 + 786 --- 2444 + 787 --- 1222 + 787 --- 2441 + 787 --- 2442 + 788 --- 1221 + 788 --- 2439 + 788 --- 2440 + 789 --- 1220 + 789 --- 2437 + 789 --- 2438 + 790 --- 1219 + 790 --- 2435 + 790 --- 2436 + 791 --- 1218 + 791 --- 2433 + 791 --- 2434 + 792 --- 1217 + 792 --- 2431 + 792 --- 2432 + 793 --- 1216 + 793 --- 2429 + 793 --- 2430 + 794 --- 1215 + 794 --- 2427 + 794 --- 2428 + 795 --- 1214 + 795 --- 2425 + 795 --- 2426 + 796 --- 1213 + 796 --- 2423 + 796 --- 2424 + 797 --- 1212 + 797 --- 2421 + 797 --- 2422 + 798 --- 1211 + 798 --- 2419 + 798 --- 2420 + 799 --- 1210 + 799 --- 2417 + 799 --- 2418 + 800 --- 1209 + 800 --- 2415 + 800 --- 2416 + 801 --- 1208 + 801 --- 2413 + 801 --- 2414 + 802 --- 1207 + 802 --- 2411 + 802 --- 2412 + 803 --- 1206 + 803 --- 2409 + 803 --- 2410 + 804 --- 1205 + 804 --- 2407 + 804 --- 2408 + 805 --- 1204 + 805 --- 2405 + 805 --- 2406 + 806 --- 1203 + 806 --- 2403 + 806 --- 2404 + 807 --- 1202 + 807 --- 2401 + 807 --- 2402 + 808 --- 1201 + 808 --- 2399 + 808 --- 2400 + 809 --- 1200 + 809 --- 2397 + 809 --- 2398 + 810 --- 1199 + 810 --- 2395 + 810 --- 2396 + 811 --- 1198 + 811 --- 2393 + 811 --- 2394 + 812 --- 1197 + 812 --- 2391 + 812 --- 2392 + 813 --- 1196 + 813 --- 2389 + 813 --- 2390 + 814 --- 1195 + 814 --- 2387 + 814 --- 2388 + 815 --- 1194 + 815 --- 2385 + 815 --- 2386 + 816 --- 1193 + 816 --- 2383 + 816 --- 2384 + 817 --- 1192 + 817 --- 2381 + 817 --- 2382 + 818 --- 1191 + 818 --- 2379 + 818 --- 2380 + 819 --- 1190 + 819 --- 2377 + 819 --- 2378 + 820 --- 1189 + 820 --- 2375 + 820 --- 2376 + 821 --- 1188 + 821 --- 2373 + 821 --- 2374 + 822 --- 1187 + 822 --- 2371 + 822 --- 2372 + 823 --- 1186 + 823 --- 2369 + 823 --- 2370 + 824 --- 1185 + 824 --- 2367 + 824 --- 2368 + 825 --- 1184 + 825 --- 2365 + 825 --- 2366 + 826 --- 1183 + 826 --- 2363 + 826 --- 2364 + 827 --- 1182 + 827 --- 2361 + 827 --- 2362 + 828 --- 1181 + 828 --- 2359 + 828 --- 2360 + 829 --- 1180 + 829 --- 2357 + 829 --- 2358 + 830 --- 1179 + 830 --- 2355 + 830 --- 2356 + 831 --- 1178 + 831 --- 2353 + 831 --- 2354 + 832 --- 1177 + 832 --- 2351 + 832 --- 2352 + 833 --- 1176 + 833 --- 2349 + 833 --- 2350 + 834 --- 1175 + 834 --- 2347 + 834 --- 2348 + 835 --- 1174 + 835 --- 2345 + 835 --- 2346 + 836 --- 1173 + 836 --- 2343 + 836 --- 2344 + 837 --- 1172 + 837 --- 2341 + 837 --- 2342 + 838 --- 1171 + 838 --- 2339 + 838 --- 2340 + 839 --- 1170 + 839 --- 2337 + 839 --- 2338 + 840 --- 1169 + 840 --- 2335 + 840 --- 2336 + 841 --- 1168 + 841 --- 2333 + 841 --- 2334 + 842 --- 1167 + 842 --- 2331 + 842 --- 2332 + 843 --- 1166 + 843 --- 2329 + 843 --- 2330 + 844 --- 1165 + 844 --- 2327 + 844 --- 2328 + 845 --- 1164 + 845 --- 2325 + 845 --- 2326 + 846 --- 1163 + 846 --- 2323 + 846 --- 2324 + 847 --- 1162 + 847 --- 2321 + 847 --- 2322 + 848 --- 1161 + 848 --- 2319 + 848 --- 2320 + 849 --- 1160 + 849 --- 2317 + 849 --- 2318 + 850 --- 1159 + 850 --- 2315 + 850 --- 2316 + 851 --- 1158 + 851 --- 2313 + 851 --- 2314 + 852 --- 1157 + 852 --- 2311 + 852 --- 2312 + 853 --- 1156 + 853 --- 2309 + 853 --- 2310 + 854 --- 1155 + 854 --- 2307 + 854 --- 2308 + 855 --- 1154 + 855 --- 2305 + 855 --- 2306 + 856 --- 1153 + 856 --- 2303 + 856 --- 2304 + 857 --- 1152 + 857 --- 2301 + 857 --- 2302 + 858 --- 1151 + 858 --- 2299 + 858 --- 2300 + 859 --- 1150 + 859 --- 2297 + 859 --- 2298 + 860 --- 1149 + 860 --- 2295 + 860 --- 2296 + 861 --- 1148 + 861 --- 2293 + 861 --- 2294 + 862 --- 1147 + 862 --- 2291 + 862 --- 2292 + 863 --- 1146 + 863 --- 2289 + 863 --- 2290 + 864 --- 1145 + 864 --- 2287 + 864 --- 2288 + 865 --- 1144 + 865 --- 2285 + 865 --- 2286 + 866 --- 1143 + 866 --- 2283 + 866 --- 2284 + 867 --- 1142 + 867 --- 2281 + 867 --- 2282 + 868 --- 1141 + 868 --- 2279 + 868 --- 2280 + 869 --- 1140 + 869 --- 2277 + 869 --- 2278 + 870 --- 1139 + 870 --- 2275 + 870 --- 2276 + 871 --- 1138 + 871 --- 2273 + 871 --- 2274 + 872 --- 1137 + 872 --- 2271 + 872 --- 2272 + 873 --- 1136 + 873 --- 2269 + 873 --- 2270 + 874 --- 1135 + 874 --- 2267 + 874 --- 2268 + 875 --- 1134 + 875 --- 2265 + 875 --- 2266 + 876 --- 1133 + 876 --- 2263 + 876 --- 2264 + 877 --- 1132 + 877 --- 2261 + 877 --- 2262 + 878 --- 1131 + 878 --- 2259 + 878 --- 2260 + 879 --- 1130 + 879 --- 2257 + 879 --- 2258 + 880 --- 1129 + 880 --- 2255 + 880 --- 2256 + 881 --- 1128 + 881 --- 2253 + 881 --- 2254 + 882 --- 1127 + 882 --- 2251 + 882 --- 2252 + 883 --- 1126 + 883 --- 2249 + 883 --- 2250 + 884 --- 1125 + 884 --- 2247 + 884 --- 2248 + 885 --- 1124 + 885 --- 2245 + 885 --- 2246 + 886 --- 1123 + 886 --- 2243 + 886 --- 2244 + 887 --- 1122 + 887 --- 2241 + 887 --- 2242 + 888 --- 1121 + 888 --- 2239 + 888 --- 2240 + 889 --- 1120 + 889 --- 2237 + 889 --- 2238 + 890 --- 1119 + 890 --- 2235 + 890 --- 2236 + 891 --- 1118 + 891 --- 2233 + 891 --- 2234 + 892 --- 1117 + 892 --- 2231 + 892 --- 2232 + 893 --- 1116 + 893 --- 2229 + 893 --- 2230 + 894 --- 1115 + 894 --- 2227 + 894 --- 2228 + 895 --- 1114 + 895 --- 2225 + 895 --- 2226 + 896 --- 1113 + 896 --- 2223 + 896 --- 2224 + 897 --- 1112 + 897 --- 2221 + 897 --- 2222 + 898 --- 1111 + 898 --- 2219 + 898 --- 2220 + 899 --- 1110 + 899 --- 2217 + 899 --- 2218 + 900 --- 1109 + 900 --- 2215 + 900 --- 2216 + 901 --- 1108 + 901 --- 2213 + 901 --- 2214 + 902 --- 1107 + 902 --- 2211 + 902 --- 2212 + 903 --- 1106 + 903 --- 2209 + 903 --- 2210 + 904 --- 1105 + 904 --- 2207 + 904 --- 2208 + 905 --- 1104 + 905 --- 2205 + 905 --- 2206 + 906 --- 1103 + 906 --- 2203 + 906 --- 2204 + 907 --- 1102 + 907 --- 2201 + 907 --- 2202 + 908 --- 1101 + 908 --- 2199 + 908 --- 2200 + 909 --- 1100 + 909 --- 2197 + 909 --- 2198 + 910 --- 1099 + 910 --- 2195 + 910 --- 2196 + 911 --- 1098 + 911 --- 2193 + 911 --- 2194 + 912 --- 1097 + 912 --- 2191 + 912 --- 2192 + 913 --- 1096 + 913 --- 2189 + 913 --- 2190 + 914 --- 1095 + 914 --- 2187 + 914 --- 2188 + 915 --- 1094 + 915 --- 2185 + 915 --- 2186 + 916 --- 1093 + 916 --- 2183 + 916 --- 2184 + 917 --- 1092 + 917 --- 2181 + 917 --- 2182 + 918 --- 1091 + 918 --- 2179 + 918 --- 2180 + 919 --- 1090 + 919 --- 2177 + 919 --- 2178 + 920 --- 1089 + 920 --- 2175 + 920 --- 2176 + 921 --- 1088 + 921 --- 2173 + 921 --- 2174 + 922 --- 1087 + 922 --- 2171 + 922 --- 2172 + 923 --- 1086 + 923 --- 2169 + 923 --- 2170 + 924 --- 1085 + 924 --- 2167 + 924 --- 2168 + 925 --- 1084 + 925 --- 2165 + 925 --- 2166 + 926 --- 1083 + 926 --- 2163 + 926 --- 2164 + 927 --- 1082 + 927 --- 2161 + 927 --- 2162 + 928 --- 1081 + 928 --- 2159 + 928 --- 2160 + 929 --- 1080 + 929 --- 2157 + 929 --- 2158 + 930 --- 1079 + 930 --- 2155 + 930 --- 2156 + 931 --- 1078 + 931 --- 2153 + 931 --- 2154 + 932 --- 1077 + 932 --- 2151 + 932 --- 2152 + 933 --- 1076 + 933 --- 2149 + 933 --- 2150 + 934 --- 1075 + 934 --- 2147 + 934 --- 2148 + 935 --- 1074 + 935 --- 2145 + 935 --- 2146 + 936 --- 1073 + 936 --- 2143 + 936 --- 2144 + 937 --- 1072 + 937 --- 2141 + 937 --- 2142 + 938 --- 1071 + 938 --- 2139 + 938 --- 2140 + 939 --- 1070 + 939 --- 2137 + 939 --- 2138 + 940 --- 1069 + 940 --- 2135 + 940 --- 2136 + 941 --- 1068 + 941 --- 2133 + 941 --- 2134 + 942 --- 1067 + 942 --- 2131 + 942 --- 2132 + 943 --- 1066 + 943 --- 2129 + 943 --- 2130 + 944 --- 1065 + 944 --- 2127 + 944 --- 2128 + 945 --- 1064 + 945 --- 2125 + 945 --- 2126 + 946 --- 1063 + 946 --- 2123 + 946 --- 2124 + 947 --- 1062 + 947 --- 2121 + 947 --- 2122 + 948 --- 1061 + 948 --- 2119 + 948 --- 2120 + 949 --- 1060 + 949 --- 2117 + 949 --- 2118 + 950 --- 1059 + 950 --- 2115 + 950 --- 2116 + 951 --- 1058 + 951 --- 2113 + 951 --- 2114 + 952 --- 1057 + 952 --- 2111 + 952 --- 2112 + 953 --- 1056 + 953 --- 2109 + 953 --- 2110 + 954 --- 1055 + 954 --- 2107 + 954 --- 2108 + 955 --- 1054 + 955 --- 2105 + 955 --- 2106 + 956 --- 1053 + 956 --- 2103 + 956 --- 2104 + 957 --- 1052 + 957 --- 2101 + 957 --- 2102 + 958 --- 1051 + 958 --- 2099 + 958 --- 2100 + 959 --- 1050 + 959 --- 2097 + 959 --- 2098 + 960 --- 1049 + 960 --- 2095 + 960 --- 2096 + 961 --- 1048 + 961 --- 2093 + 961 --- 2094 + 962 --- 1047 + 962 --- 2091 + 962 --- 2092 + 963 --- 1046 + 963 --- 2089 + 963 --- 2090 + 964 --- 1045 + 964 --- 2087 + 964 --- 2088 + 965 --- 1044 + 965 --- 2085 + 965 --- 2086 + 966 --- 1043 + 966 --- 2083 + 966 --- 2084 + 967 --- 1042 + 967 --- 2081 + 967 --- 2082 + 968 --- 1041 + 968 --- 2079 + 968 --- 2080 + 969 --- 1040 + 969 --- 2077 + 969 --- 2078 + 970 --- 1039 + 970 --- 2075 + 970 --- 2076 + 971 --- 1038 + 971 --- 2073 + 971 --- 2074 + 972 --- 1037 + 972 --- 2071 + 972 --- 2072 + 973 --- 1036 + 973 --- 2069 + 973 --- 2070 + 974 --- 1035 + 974 --- 2067 + 974 --- 2068 + 975 --- 1034 + 975 --- 2065 + 975 --- 2066 + 976 --- 1033 + 976 --- 2063 + 976 --- 2064 + 977 --- 1032 + 977 --- 2061 + 977 --- 2062 + 978 --- 1031 + 978 --- 2059 + 978 --- 2060 + 979 --- 1030 + 979 --- 2057 + 979 --- 2058 + 980 --- 1029 + 980 --- 2055 + 980 --- 2056 + 981 --- 1028 + 981 --- 2053 + 981 --- 2054 + 982 --- 1027 + 982 --- 2051 + 982 --- 2052 + 983 --- 1026 + 983 --- 2049 + 983 --- 2050 + 984 --- 1025 + 984 --- 2047 + 984 --- 2048 + 985 --- 1024 + 985 --- 2045 + 985 --- 2046 + 986 --- 1023 + 986 --- 2043 + 986 --- 2044 + 987 --- 1022 + 987 --- 2041 + 987 --- 2042 + 988 --- 1021 + 988 --- 2039 + 988 --- 2040 + 989 --- 1020 + 989 --- 2037 + 989 --- 2038 + 990 --- 1019 + 990 --- 2035 + 990 --- 2036 + 991 --- 1018 + 991 --- 2033 + 991 --- 2034 + 992 --- 1017 + 992 --- 2031 + 992 --- 2032 + 993 --- 1016 + 993 --- 2029 + 993 --- 2030 + 994 --- 1015 + 994 --- 2027 + 994 --- 2028 + 995 --- 1014 + 995 --- 2025 + 995 --- 2026 + 996 --- 1013 + 996 --- 2023 + 996 --- 2024 + 997 --- 1012 + 997 --- 2021 + 997 --- 2022 + 998 --- 1011 + 998 --- 2019 + 998 --- 2020 + 999 --- 1010 + 999 --- 2017 + 999 --- 2018 + 1000 --- 1009 + 1000 --- 2015 + 1000 --- 2016 + 1001 --- 1008 + 1001 --- 2013 + 1001 --- 2014 + 1002 --- 1007 + 1002 --- 2011 + 1002 --- 2012 + 1003 --- 1006 + 1003 --- 2009 + 1003 --- 2010 + 1005 --- 1006 + 1005 --- 1007 + 1005 --- 1008 + 1005 --- 1009 + 1005 --- 1010 + 1005 --- 1011 + 1005 --- 1012 + 1005 --- 1013 + 1005 --- 1014 + 1005 --- 1015 + 1005 --- 1016 + 1005 --- 1017 + 1005 --- 1018 + 1005 --- 1019 + 1005 --- 1020 + 1005 --- 1021 + 1005 --- 1022 + 1005 --- 1023 + 1005 --- 1024 + 1005 --- 1025 + 1005 --- 1026 + 1005 --- 1027 + 1005 --- 1028 + 1005 --- 1029 + 1005 --- 1030 + 1005 --- 1031 + 1005 --- 1032 + 1005 --- 1033 + 1005 --- 1034 + 1005 --- 1035 + 1005 --- 1036 + 1005 --- 1037 + 1005 --- 1038 + 1005 --- 1039 + 1005 --- 1040 + 1005 --- 1041 + 1005 --- 1042 + 1005 --- 1043 + 1005 --- 1044 + 1005 --- 1045 + 1005 --- 1046 + 1005 --- 1047 + 1005 --- 1048 + 1005 --- 1049 + 1005 --- 1050 + 1005 --- 1051 + 1005 --- 1052 + 1005 --- 1053 + 1005 --- 1054 + 1005 --- 1055 + 1005 --- 1056 + 1005 --- 1057 + 1005 --- 1058 + 1005 --- 1059 + 1005 --- 1060 + 1005 --- 1061 + 1005 --- 1062 + 1005 --- 1063 + 1005 --- 1064 + 1005 --- 1065 + 1005 --- 1066 + 1005 --- 1067 + 1005 --- 1068 + 1005 --- 1069 + 1005 --- 1070 + 1005 --- 1071 + 1005 --- 1072 + 1005 --- 1073 + 1005 --- 1074 + 1005 --- 1075 + 1005 --- 1076 + 1005 --- 1077 + 1005 --- 1078 + 1005 --- 1079 + 1005 --- 1080 + 1005 --- 1081 + 1005 --- 1082 + 1005 --- 1083 + 1005 --- 1084 + 1005 --- 1085 + 1005 --- 1086 + 1005 --- 1087 + 1005 --- 1088 + 1005 --- 1089 + 1005 --- 1090 + 1005 --- 1091 + 1005 --- 1092 + 1005 --- 1093 + 1005 --- 1094 + 1005 --- 1095 + 1005 --- 1096 + 1005 --- 1097 + 1005 --- 1098 + 1005 --- 1099 + 1005 --- 1100 + 1005 --- 1101 + 1005 --- 1102 + 1005 --- 1103 + 1005 --- 1104 + 1005 --- 1105 + 1005 --- 1106 + 1005 --- 1107 + 1005 --- 1108 + 1005 --- 1109 + 1005 --- 1110 + 1005 --- 1111 + 1005 --- 1112 + 1005 --- 1113 + 1005 --- 1114 + 1005 --- 1115 + 1005 --- 1116 + 1005 --- 1117 + 1005 --- 1118 + 1005 --- 1119 + 1005 --- 1120 + 1005 --- 1121 + 1005 --- 1122 + 1005 --- 1123 + 1005 --- 1124 + 1005 --- 1125 + 1005 --- 1126 + 1005 --- 1127 + 1005 --- 1128 + 1005 --- 1129 + 1005 --- 1130 + 1005 --- 1131 + 1005 --- 1132 + 1005 --- 1133 + 1005 --- 1134 + 1005 --- 1135 + 1005 --- 1136 + 1005 --- 1137 + 1005 --- 1138 + 1005 --- 1139 + 1005 --- 1140 + 1005 --- 1141 + 1005 --- 1142 + 1005 --- 1143 + 1005 --- 1144 + 1005 --- 1145 + 1005 --- 1146 + 1005 --- 1147 + 1005 --- 1148 + 1005 --- 1149 + 1005 --- 1150 + 1005 --- 1151 + 1005 --- 1152 + 1005 --- 1153 + 1005 --- 1154 + 1005 --- 1155 + 1005 --- 1156 + 1005 --- 1157 + 1005 --- 1158 + 1005 --- 1159 + 1005 --- 1160 + 1005 --- 1161 + 1005 --- 1162 + 1005 --- 1163 + 1005 --- 1164 + 1005 --- 1165 + 1005 --- 1166 + 1005 --- 1167 + 1005 --- 1168 + 1005 --- 1169 + 1005 --- 1170 + 1005 --- 1171 + 1005 --- 1172 + 1005 --- 1173 + 1005 --- 1174 + 1005 --- 1175 + 1005 --- 1176 + 1005 --- 1177 + 1005 --- 1178 + 1005 --- 1179 + 1005 --- 1180 + 1005 --- 1181 + 1005 --- 1182 + 1005 --- 1183 + 1005 --- 1184 + 1005 --- 1185 + 1005 --- 1186 + 1005 --- 1187 + 1005 --- 1188 + 1005 --- 1189 + 1005 --- 1190 + 1005 --- 1191 + 1005 --- 1192 + 1005 --- 1193 + 1005 --- 1194 + 1005 --- 1195 + 1005 --- 1196 + 1005 --- 1197 + 1005 --- 1198 + 1005 --- 1199 + 1005 --- 1200 + 1005 --- 1201 + 1005 --- 1202 + 1005 --- 1203 + 1005 --- 1204 + 1005 --- 1205 + 1005 --- 1206 + 1005 --- 1207 + 1005 --- 1208 + 1005 --- 1209 + 1005 --- 1210 + 1005 --- 1211 + 1005 --- 1212 + 1005 --- 1213 + 1005 --- 1214 + 1005 --- 1215 + 1005 --- 1216 + 1005 --- 1217 + 1005 --- 1218 + 1005 --- 1219 + 1005 --- 1220 + 1005 --- 1221 + 1005 --- 1222 + 1005 --- 1223 + 1005 --- 1224 + 1005 --- 1225 + 1005 --- 1226 + 1005 --- 1227 + 1005 --- 1228 + 1005 --- 1229 + 1005 --- 1230 + 1005 --- 1231 + 1005 --- 1232 + 1005 --- 1233 + 1005 --- 1234 + 1005 --- 1235 + 1005 --- 1236 + 1005 --- 1237 + 1005 --- 1238 + 1005 --- 1239 + 1005 --- 1240 + 1005 --- 1241 + 1005 --- 1242 + 1005 --- 1243 + 1005 --- 1244 + 1005 --- 1245 + 1005 --- 1246 + 1005 --- 1247 + 1005 --- 1248 + 1005 --- 1249 + 1005 --- 1250 + 1005 --- 1251 + 1005 --- 1252 + 1005 --- 1253 + 1005 --- 1254 + 1005 --- 1255 + 1005 --- 1256 + 1005 --- 1257 + 1005 --- 1258 + 1005 --- 1259 + 1005 --- 1260 + 1005 --- 1261 + 1005 --- 1262 + 1005 --- 1263 + 1005 --- 1264 + 1005 --- 1265 + 1005 --- 1266 + 1005 --- 1267 + 1005 --- 1268 + 1005 --- 1269 + 1005 --- 1270 + 1005 --- 1271 + 1005 --- 1272 + 1005 --- 1273 + 1005 --- 1274 + 1005 --- 1275 + 1005 --- 1276 + 1005 --- 1277 + 1005 --- 1278 + 1005 --- 1279 + 1005 --- 1280 + 1005 --- 1281 + 1005 --- 1282 + 1005 --- 1283 + 1005 --- 1284 + 1005 --- 1285 + 1005 --- 1286 + 1005 --- 1287 + 1005 --- 1288 + 1005 --- 1289 + 1005 --- 1290 + 1005 --- 1291 + 1005 --- 1292 + 1005 --- 1293 + 1005 --- 1294 + 1005 --- 1295 + 1005 --- 1296 + 1005 --- 1297 + 1005 --- 1298 + 1005 --- 1299 + 1005 --- 1300 + 1005 --- 1301 + 1005 --- 1302 + 1005 --- 1303 + 1005 --- 1304 + 1005 --- 1305 + 1005 --- 1306 + 1005 --- 1307 + 1005 --- 1308 + 1005 --- 1309 + 1005 --- 1310 + 1005 --- 1311 + 1005 --- 1312 + 1005 --- 1313 + 1005 --- 1314 + 1005 --- 1315 + 1005 --- 1316 + 1005 --- 1317 + 1005 --- 1318 + 1005 --- 1319 + 1005 --- 1320 + 1005 --- 1321 + 1005 --- 1322 + 1005 --- 1323 + 1005 --- 1324 + 1005 --- 1325 + 1005 --- 1326 + 1005 --- 1327 + 1005 --- 1328 + 1005 --- 1329 + 1005 --- 1330 + 1005 --- 1331 + 1005 --- 1332 + 1005 --- 1333 + 1005 --- 1334 + 1005 --- 1335 + 1005 --- 1336 + 1005 --- 1337 + 1005 --- 1338 + 1005 --- 1339 + 1005 --- 1340 + 1005 --- 1341 + 1005 --- 1342 + 1005 --- 1343 + 1005 --- 1344 + 1005 --- 1345 + 1005 --- 1346 + 1005 --- 1347 + 1005 --- 1348 + 1005 --- 1349 + 1005 --- 1350 + 1005 --- 1351 + 1005 --- 1352 + 1005 --- 1353 + 1005 --- 1354 + 1005 --- 1355 + 1005 --- 1356 + 1005 --- 1357 + 1005 --- 1358 + 1005 --- 1359 + 1005 --- 1360 + 1005 --- 1361 + 1005 --- 1362 + 1005 --- 1363 + 1005 --- 1364 + 1005 --- 1365 + 1005 --- 1366 + 1005 --- 1367 + 1005 --- 1368 + 1005 --- 1369 + 1005 --- 1370 + 1005 --- 1371 + 1005 --- 1372 + 1005 --- 1373 + 1005 --- 1374 + 1005 --- 1375 + 1005 --- 1376 + 1005 --- 1377 + 1005 --- 1378 + 1005 --- 1379 + 1005 --- 1380 + 1005 --- 1381 + 1005 --- 1382 + 1005 --- 1383 + 1005 --- 1384 + 1005 --- 1385 + 1005 --- 1386 + 1005 --- 1387 + 1005 --- 1388 + 1005 --- 1389 + 1005 --- 1390 + 1005 --- 1391 + 1005 --- 1392 + 1005 --- 1393 + 1005 --- 1394 + 1005 --- 1395 + 1005 --- 1396 + 1005 --- 1397 + 1005 --- 1398 + 1005 --- 1399 + 1005 --- 1400 + 1005 --- 1401 + 1005 --- 1402 + 1005 --- 1403 + 1005 --- 1404 + 1005 --- 1405 + 1005 --- 1406 + 1005 --- 1407 + 1005 --- 1408 + 1005 --- 1409 + 1005 --- 1410 + 1005 --- 1411 + 1005 --- 1412 + 1005 --- 1413 + 1005 --- 1414 + 1005 --- 1415 + 1005 --- 1416 + 1005 --- 1417 + 1005 --- 1418 + 1005 --- 1419 + 1005 --- 1420 + 1005 --- 1421 + 1005 --- 1422 + 1005 --- 1423 + 1005 --- 1424 + 1005 --- 1425 + 1005 --- 1426 + 1005 --- 1427 + 1005 --- 1428 + 1005 --- 1429 + 1005 --- 1430 + 1005 --- 1431 + 1005 --- 1432 + 1005 --- 1433 + 1005 --- 1434 + 1005 --- 1435 + 1005 --- 1436 + 1005 --- 1437 + 1005 --- 1438 + 1005 --- 1439 + 1005 --- 1440 + 1005 --- 1441 + 1005 --- 1442 + 1005 --- 1443 + 1005 --- 1444 + 1005 --- 1445 + 1005 --- 1446 + 1005 --- 1447 + 1005 --- 1448 + 1005 --- 1449 + 1005 --- 1450 + 1005 --- 1451 + 1005 --- 1452 + 1005 --- 1453 + 1005 --- 1454 + 1005 --- 1455 + 1005 --- 1456 + 1005 --- 1457 + 1005 --- 1458 + 1005 --- 1459 + 1005 --- 1460 + 1005 --- 1461 + 1005 --- 1462 + 1005 --- 1463 + 1005 --- 1464 + 1005 --- 1465 + 1005 --- 1466 + 1005 --- 1467 + 1005 --- 1468 + 1005 --- 1469 + 1005 --- 1470 + 1005 --- 1471 + 1005 --- 1472 + 1005 --- 1473 + 1005 --- 1474 + 1005 --- 1475 + 1005 --- 1476 + 1005 --- 1477 + 1005 --- 1478 + 1005 --- 1479 + 1005 --- 1480 + 1005 --- 1481 + 1005 --- 1482 + 1005 --- 1483 + 1005 --- 1484 + 1005 --- 1485 + 1005 --- 1486 + 1005 --- 1487 + 1005 --- 1488 + 1005 --- 1489 + 1005 --- 1490 + 1005 --- 1491 + 1005 --- 1492 + 1005 --- 1493 + 1005 --- 1494 + 1005 --- 1495 + 1005 --- 1496 + 1005 --- 1497 + 1005 --- 1498 + 1005 --- 1499 + 1005 --- 1500 + 1005 --- 1501 + 1005 --- 1502 + 1005 --- 1503 + 1005 --- 1504 + 1005 --- 1505 + 1005 --- 1506 + 1005 --- 1507 + 1005 --- 1508 + 1005 --- 1509 + 1005 --- 1510 + 1005 --- 1511 + 1005 --- 1512 + 1005 --- 1513 + 1005 --- 1514 + 1005 --- 1515 + 1005 --- 1516 + 1005 --- 1517 + 1005 --- 1518 + 1005 --- 1519 + 1005 --- 1520 + 1005 --- 1521 + 1005 --- 1522 + 1005 --- 1523 + 1005 --- 1524 + 1005 --- 1525 + 1005 --- 1526 + 1005 --- 1527 + 1005 --- 1528 + 1005 --- 1529 + 1005 --- 1530 + 1005 --- 1531 + 1005 --- 1532 + 1005 --- 1533 + 1005 --- 1534 + 1005 --- 1535 + 1005 --- 1536 + 1005 --- 1537 + 1005 --- 1538 + 1005 --- 1539 + 1005 --- 1540 + 1005 --- 1541 + 1005 --- 1542 + 1005 --- 1543 + 1005 --- 1544 + 1005 --- 1545 + 1005 --- 1546 + 1005 --- 1547 + 1005 --- 1548 + 1005 --- 1549 + 1005 --- 1550 + 1005 --- 1551 + 1005 --- 1552 + 1005 --- 1553 + 1005 --- 1554 + 1005 --- 1555 + 1005 --- 1556 + 1005 --- 1557 + 1005 --- 1558 + 1005 --- 1559 + 1005 --- 1560 + 1005 --- 1561 + 1005 --- 1562 + 1005 --- 1563 + 1005 --- 1564 + 1005 --- 1565 + 1005 --- 1566 + 1005 --- 1567 + 1005 --- 1568 + 1005 --- 1569 + 1005 --- 1570 + 1005 --- 1571 + 1005 --- 1572 + 1005 --- 1573 + 1005 --- 1574 + 1005 --- 1575 + 1005 --- 1576 + 1005 --- 1577 + 1005 --- 1578 + 1005 --- 1579 + 1005 --- 1580 + 1005 --- 1581 + 1005 --- 1582 + 1005 --- 1583 + 1005 --- 1584 + 1005 --- 1585 + 1005 --- 1586 + 1005 --- 1587 + 1005 --- 1588 + 1005 --- 1589 + 1005 --- 1590 + 1005 --- 1591 + 1005 --- 1592 + 1005 --- 1593 + 1005 --- 1594 + 1005 --- 1595 + 1005 --- 1596 + 1005 --- 1597 + 1005 --- 1598 + 1005 --- 1599 + 1005 --- 1600 + 1005 --- 1601 + 1005 --- 1602 + 1005 --- 1603 + 1005 --- 1604 + 1005 --- 1605 + 1005 --- 1606 + 1005 --- 1607 + 1005 --- 1608 + 1005 --- 1609 + 1005 --- 1610 + 1005 --- 1611 + 1005 --- 1612 + 1005 --- 1613 + 1005 --- 1614 + 1005 --- 1615 + 1005 --- 1616 + 1005 --- 1617 + 1005 --- 1618 + 1005 --- 1619 + 1005 --- 1620 + 1005 --- 1621 + 1005 --- 1622 + 1005 --- 1623 + 1005 --- 1624 + 1005 --- 1625 + 1005 --- 1626 + 1005 --- 1627 + 1005 --- 1628 + 1005 --- 1629 + 1005 --- 1630 + 1005 --- 1631 + 1005 --- 1632 + 1005 --- 1633 + 1005 --- 1634 + 1005 --- 1635 + 1005 --- 1636 + 1005 --- 1637 + 1005 --- 1638 + 1005 --- 1639 + 1005 --- 1640 + 1005 --- 1641 + 1005 --- 1642 + 1005 --- 1643 + 1005 --- 1644 + 1005 --- 1645 + 1005 --- 1646 + 1005 --- 1647 + 1005 --- 1648 + 1005 --- 1649 + 1005 --- 1650 + 1005 --- 1651 + 1005 --- 1652 + 1005 --- 1653 + 1005 --- 1654 + 1005 --- 1655 + 1005 --- 1656 + 1005 --- 1657 + 1005 --- 1658 + 1005 --- 1659 + 1005 --- 1660 + 1005 --- 1661 + 1005 --- 1662 + 1005 --- 1663 + 1005 --- 1664 + 1005 --- 1665 + 1005 --- 1666 + 1005 --- 1667 + 1005 --- 1668 + 1005 --- 1669 + 1005 --- 1670 + 1005 --- 1671 + 1005 --- 1672 + 1005 --- 1673 + 1005 --- 1674 + 1005 --- 1675 + 1005 --- 1676 + 1005 --- 1677 + 1005 --- 1678 + 1005 --- 1679 + 1005 --- 1680 + 1005 --- 1681 + 1005 --- 1682 + 1005 --- 1683 + 1005 --- 1684 + 1005 --- 1685 + 1005 --- 1686 + 1005 --- 1687 + 1005 --- 1688 + 1005 --- 1689 + 1005 --- 1690 + 1005 --- 1691 + 1005 --- 1692 + 1005 --- 1693 + 1005 --- 1694 + 1005 --- 1695 + 1005 --- 1696 + 1005 --- 1697 + 1005 --- 1698 + 1005 --- 1699 + 1005 --- 1700 + 1005 --- 1701 + 1005 --- 1702 + 1005 --- 1703 + 1005 --- 1704 + 1005 --- 1705 + 1005 --- 1706 + 1005 --- 1707 + 1005 --- 1708 + 1005 --- 1709 + 1005 --- 1710 + 1005 --- 1711 + 1005 --- 1712 + 1005 --- 1713 + 1005 --- 1714 + 1005 --- 1715 + 1005 --- 1716 + 1005 --- 1717 + 1005 --- 1718 + 1005 --- 1719 + 1005 --- 1720 + 1005 --- 1721 + 1005 --- 1722 + 1005 --- 1723 + 1005 --- 1724 + 1005 --- 1725 + 1005 --- 1726 + 1005 --- 1727 + 1005 --- 1728 + 1005 --- 1729 + 1005 --- 1730 + 1005 --- 1731 + 1005 --- 1732 + 1005 --- 1733 + 1005 --- 1734 + 1005 --- 1735 + 1005 --- 1736 + 1005 --- 1737 + 1005 --- 1738 + 1005 --- 1739 + 1005 --- 1740 + 1005 --- 1741 + 1005 --- 1742 + 1005 --- 1743 + 1005 --- 1744 + 1005 --- 1745 + 1005 --- 1746 + 1005 --- 1747 + 1005 --- 1748 + 1005 --- 1749 + 1005 --- 1750 + 1005 --- 1751 + 1005 --- 1752 + 1005 --- 1753 + 1005 --- 1754 + 1005 --- 1755 + 1005 --- 1756 + 1005 --- 1757 + 1005 --- 1758 + 1005 --- 1759 + 1005 --- 1760 + 1005 --- 1761 + 1005 --- 1762 + 1005 --- 1763 + 1005 --- 1764 + 1005 --- 1765 + 1005 --- 1766 + 1005 --- 1767 + 1005 --- 1768 + 1005 --- 1769 + 1005 --- 1770 + 1005 --- 1771 + 1005 --- 1772 + 1005 --- 1773 + 1005 --- 1774 + 1005 --- 1775 + 1005 --- 1776 + 1005 --- 1777 + 1005 --- 1778 + 1005 --- 1779 + 1005 --- 1780 + 1005 --- 1781 + 1005 --- 1782 + 1005 --- 1783 + 1005 --- 1784 + 1005 --- 1785 + 1005 --- 1786 + 1005 --- 1787 + 1005 --- 1788 + 1005 --- 1789 + 1005 --- 1790 + 1005 --- 1791 + 1005 --- 1792 + 1005 --- 1793 + 1005 --- 1794 + 1005 --- 1795 + 1005 --- 1796 + 1005 --- 1797 + 1005 --- 1798 + 1005 --- 1799 + 1005 --- 1800 + 1005 --- 1801 + 1005 --- 1802 + 1005 --- 1803 + 1005 --- 1804 + 1005 --- 1805 + 1005 --- 1806 + 1005 --- 1807 + 1005 --- 1808 + 1005 --- 1809 + 1005 --- 1810 + 1005 --- 1811 + 1005 --- 1812 + 1005 --- 1813 + 1005 --- 1814 + 1005 --- 1815 + 1005 --- 1816 + 1005 --- 1817 + 1005 --- 1818 + 1005 --- 1819 + 1005 --- 1820 + 1005 --- 1821 + 1005 --- 1822 + 1005 --- 1823 + 1005 --- 1824 + 1005 --- 1825 + 1005 --- 1826 + 1005 --- 1827 + 1005 --- 1828 + 1005 --- 1829 + 1005 --- 1830 + 1005 --- 1831 + 1005 --- 1832 + 1005 --- 1833 + 1005 --- 1834 + 1005 --- 1835 + 1005 --- 1836 + 1005 --- 1837 + 1005 --- 1838 + 1005 --- 1839 + 1005 --- 1840 + 1005 --- 1841 + 1005 --- 1842 + 1005 --- 1843 + 1005 --- 1844 + 1005 --- 1845 + 1005 --- 1846 + 1005 --- 1847 + 1005 --- 1848 + 1005 --- 1849 + 1005 --- 1850 + 1005 --- 1851 + 1005 --- 1852 + 1005 --- 1853 + 1005 --- 1854 + 1005 --- 1855 + 1005 --- 1856 + 1005 --- 1857 + 1005 --- 1858 + 1005 --- 1859 + 1005 --- 1860 + 1005 --- 1861 + 1005 --- 1862 + 1005 --- 1863 + 1005 --- 1864 + 1005 --- 1865 + 1005 --- 1866 + 1005 --- 1867 + 1005 --- 1868 + 1005 --- 1869 + 1005 --- 1870 + 1005 --- 1871 + 1005 --- 1872 + 1005 --- 1873 + 1005 --- 1874 + 1005 --- 1875 + 1005 --- 1876 + 1005 --- 1877 + 1005 --- 1878 + 1005 --- 1879 + 1005 --- 1880 + 1005 --- 1881 + 1005 --- 1882 + 1005 --- 1883 + 1005 --- 1884 + 1005 --- 1885 + 1005 --- 1886 + 1005 --- 1887 + 1005 --- 1888 + 1005 --- 1889 + 1005 --- 1890 + 1005 --- 1891 + 1005 --- 1892 + 1005 --- 1893 + 1005 --- 1894 + 1005 --- 1895 + 1005 --- 1896 + 1005 --- 1897 + 1005 --- 1898 + 1005 --- 1899 + 1005 --- 1900 + 1005 --- 1901 + 1005 --- 1902 + 1005 --- 1903 + 1005 --- 1904 + 1005 --- 1905 + 1005 --- 1906 + 1005 --- 1907 + 1005 --- 1908 + 1005 --- 1909 + 1005 --- 1910 + 1005 --- 1911 + 1005 --- 1912 + 1005 --- 1913 + 1005 --- 1914 + 1005 --- 1915 + 1005 --- 1916 + 1005 --- 1917 + 1005 --- 1918 + 1005 --- 1919 + 1005 --- 1920 + 1005 --- 1921 + 1005 --- 1922 + 1005 --- 1923 + 1005 --- 1924 + 1005 --- 1925 + 1005 --- 1926 + 1005 --- 1927 + 1005 --- 1928 + 1005 --- 1929 + 1005 --- 1930 + 1005 --- 1931 + 1005 --- 1932 + 1005 --- 1933 + 1005 --- 1934 + 1005 --- 1935 + 1005 --- 1936 + 1005 --- 1937 + 1005 --- 1938 + 1005 --- 1939 + 1005 --- 1940 + 1005 --- 1941 + 1005 --- 1942 + 1005 --- 1943 + 1005 --- 1944 + 1005 --- 1945 + 1005 --- 1946 + 1005 --- 1947 + 1005 --- 1948 + 1005 --- 1949 + 1005 --- 1950 + 1005 --- 1951 + 1005 --- 1952 + 1005 --- 1953 + 1005 --- 1954 + 1005 --- 1955 + 1005 --- 1956 + 1005 --- 1957 + 1005 --- 1958 + 1005 --- 1959 + 1005 --- 1960 + 1005 --- 1961 + 1005 --- 1962 + 1005 --- 1963 + 1005 --- 1964 + 1005 --- 1965 + 1005 --- 1966 + 1005 --- 1967 + 1005 --- 1968 + 1005 --- 1969 + 1005 --- 1970 + 1005 --- 1971 + 1005 --- 1972 + 1005 --- 1973 + 1005 --- 1974 + 1005 --- 1975 + 1005 --- 1976 + 1005 --- 1977 + 1005 --- 1978 + 1005 --- 1979 + 1005 --- 1980 + 1005 --- 1981 + 1005 --- 1982 + 1005 --- 1983 + 1005 --- 1984 + 1005 --- 1985 + 1005 --- 1986 + 1005 --- 1987 + 1005 --- 1988 + 1005 --- 1989 + 1005 --- 1990 + 1005 --- 1991 + 1005 --- 1992 + 1005 --- 1993 + 1005 --- 1994 + 1005 --- 1995 + 1005 --- 1996 + 1005 --- 1997 + 1005 --- 1998 + 1005 --- 1999 + 1005 --- 2000 + 1005 --- 2001 + 1005 --- 2002 + 1005 --- 2003 + 1005 --- 2004 + 1005 --- 2005 + 1005 --- 2006 + 1005 --- 2007 + 1005 --- 2008 + 1005 --- 2009 + 1005 --- 2010 + 1005 --- 2011 + 1005 --- 2012 + 1005 --- 2013 + 1005 --- 2014 + 1005 --- 2015 + 1005 --- 2016 + 1005 --- 2017 + 1005 --- 2018 + 1005 --- 2019 + 1005 --- 2020 + 1005 --- 2021 + 1005 --- 2022 + 1005 --- 2023 + 1005 --- 2024 + 1005 --- 2025 + 1005 --- 2026 + 1005 --- 2027 + 1005 --- 2028 + 1005 --- 2029 + 1005 --- 2030 + 1005 --- 2031 + 1005 --- 2032 + 1005 --- 2033 + 1005 --- 2034 + 1005 --- 2035 + 1005 --- 2036 + 1005 --- 2037 + 1005 --- 2038 + 1005 --- 2039 + 1005 --- 2040 + 1005 --- 2041 + 1005 --- 2042 + 1005 --- 2043 + 1005 --- 2044 + 1005 --- 2045 + 1005 --- 2046 + 1005 --- 2047 + 1005 --- 2048 + 1005 --- 2049 + 1005 --- 2050 + 1005 --- 2051 + 1005 --- 2052 + 1005 --- 2053 + 1005 --- 2054 + 1005 --- 2055 + 1005 --- 2056 + 1005 --- 2057 + 1005 --- 2058 + 1005 --- 2059 + 1005 --- 2060 + 1005 --- 2061 + 1005 --- 2062 + 1005 --- 2063 + 1005 --- 2064 + 1005 --- 2065 + 1005 --- 2066 + 1005 --- 2067 + 1005 --- 2068 + 1005 --- 2069 + 1005 --- 2070 + 1005 --- 2071 + 1005 --- 2072 + 1005 --- 2073 + 1005 --- 2074 + 1005 --- 2075 + 1005 --- 2076 + 1005 --- 2077 + 1005 --- 2078 + 1005 --- 2079 + 1005 --- 2080 + 1005 --- 2081 + 1005 --- 2082 + 1005 --- 2083 + 1005 --- 2084 + 1005 --- 2085 + 1005 --- 2086 + 1005 --- 2087 + 1005 --- 2088 + 1005 --- 2089 + 1005 --- 2090 + 1005 --- 2091 + 1005 --- 2092 + 1005 --- 2093 + 1005 --- 2094 + 1005 --- 2095 + 1005 --- 2096 + 1005 --- 2097 + 1005 --- 2098 + 1005 --- 2099 + 1005 --- 2100 + 1005 --- 2101 + 1005 --- 2102 + 1005 --- 2103 + 1005 --- 2104 + 1005 --- 2105 + 1005 --- 2106 + 1005 --- 2107 + 1005 --- 2108 + 1005 --- 2109 + 1005 --- 2110 + 1005 --- 2111 + 1005 --- 2112 + 1005 --- 2113 + 1005 --- 2114 + 1005 --- 2115 + 1005 --- 2116 + 1005 --- 2117 + 1005 --- 2118 + 1005 --- 2119 + 1005 --- 2120 + 1005 --- 2121 + 1005 --- 2122 + 1005 --- 2123 + 1005 --- 2124 + 1005 --- 2125 + 1005 --- 2126 + 1005 --- 2127 + 1005 --- 2128 + 1005 --- 2129 + 1005 --- 2130 + 1005 --- 2131 + 1005 --- 2132 + 1005 --- 2133 + 1005 --- 2134 + 1005 --- 2135 + 1005 --- 2136 + 1005 --- 2137 + 1005 --- 2138 + 1005 --- 2139 + 1005 --- 2140 + 1005 --- 2141 + 1005 --- 2142 + 1005 --- 2143 + 1005 --- 2144 + 1005 --- 2145 + 1005 --- 2146 + 1005 --- 2147 + 1005 --- 2148 + 1005 --- 2149 + 1005 --- 2150 + 1005 --- 2151 + 1005 --- 2152 + 1005 --- 2153 + 1005 --- 2154 + 1005 --- 2155 + 1005 --- 2156 + 1005 --- 2157 + 1005 --- 2158 + 1005 --- 2159 + 1005 --- 2160 + 1005 --- 2161 + 1005 --- 2162 + 1005 --- 2163 + 1005 --- 2164 + 1005 --- 2165 + 1005 --- 2166 + 1005 --- 2167 + 1005 --- 2168 + 1005 --- 2169 + 1005 --- 2170 + 1005 --- 2171 + 1005 --- 2172 + 1005 --- 2173 + 1005 --- 2174 + 1005 --- 2175 + 1005 --- 2176 + 1005 --- 2177 + 1005 --- 2178 + 1005 --- 2179 + 1005 --- 2180 + 1005 --- 2181 + 1005 --- 2182 + 1005 --- 2183 + 1005 --- 2184 + 1005 --- 2185 + 1005 --- 2186 + 1005 --- 2187 + 1005 --- 2188 + 1005 --- 2189 + 1005 --- 2190 + 1005 --- 2191 + 1005 --- 2192 + 1005 --- 2193 + 1005 --- 2194 + 1005 --- 2195 + 1005 --- 2196 + 1005 --- 2197 + 1005 --- 2198 + 1005 --- 2199 + 1005 --- 2200 + 1005 --- 2201 + 1005 --- 2202 + 1005 --- 2203 + 1005 --- 2204 + 1005 --- 2205 + 1005 --- 2206 + 1005 --- 2207 + 1005 --- 2208 + 1005 --- 2209 + 1005 --- 2210 + 1005 --- 2211 + 1005 --- 2212 + 1005 --- 2213 + 1005 --- 2214 + 1005 --- 2215 + 1005 --- 2216 + 1005 --- 2217 + 1005 --- 2218 + 1005 --- 2219 + 1005 --- 2220 + 1005 --- 2221 + 1005 --- 2222 + 1005 --- 2223 + 1005 --- 2224 + 1005 --- 2225 + 1005 --- 2226 + 1005 --- 2227 + 1005 --- 2228 + 1005 --- 2229 + 1005 --- 2230 + 1005 --- 2231 + 1005 --- 2232 + 1005 --- 2233 + 1005 --- 2234 + 1005 --- 2235 + 1005 --- 2236 + 1005 --- 2237 + 1005 --- 2238 + 1005 --- 2239 + 1005 --- 2240 + 1005 --- 2241 + 1005 --- 2242 + 1005 --- 2243 + 1005 --- 2244 + 1005 --- 2245 + 1005 --- 2246 + 1005 --- 2247 + 1005 --- 2248 + 1005 --- 2249 + 1005 --- 2250 + 1005 --- 2251 + 1005 --- 2252 + 1005 --- 2253 + 1005 --- 2254 + 1005 --- 2255 + 1005 --- 2256 + 1005 --- 2257 + 1005 --- 2258 + 1005 --- 2259 + 1005 --- 2260 + 1005 --- 2261 + 1005 --- 2262 + 1005 --- 2263 + 1005 --- 2264 + 1005 --- 2265 + 1005 --- 2266 + 1005 --- 2267 + 1005 --- 2268 + 1005 --- 2269 + 1005 --- 2270 + 1005 --- 2271 + 1005 --- 2272 + 1005 --- 2273 + 1005 --- 2274 + 1005 --- 2275 + 1005 --- 2276 + 1005 --- 2277 + 1005 --- 2278 + 1005 --- 2279 + 1005 --- 2280 + 1005 --- 2281 + 1005 --- 2282 + 1005 --- 2283 + 1005 --- 2284 + 1005 --- 2285 + 1005 --- 2286 + 1005 --- 2287 + 1005 --- 2288 + 1005 --- 2289 + 1005 --- 2290 + 1005 --- 2291 + 1005 --- 2292 + 1005 --- 2293 + 1005 --- 2294 + 1005 --- 2295 + 1005 --- 2296 + 1005 --- 2297 + 1005 --- 2298 + 1005 --- 2299 + 1005 --- 2300 + 1005 --- 2301 + 1005 --- 2302 + 1005 --- 2303 + 1005 --- 2304 + 1005 --- 2305 + 1005 --- 2306 + 1005 --- 2307 + 1005 --- 2308 + 1005 --- 2309 + 1005 --- 2310 + 1005 --- 2311 + 1005 --- 2312 + 1005 --- 2313 + 1005 --- 2314 + 1005 --- 2315 + 1005 --- 2316 + 1005 --- 2317 + 1005 --- 2318 + 1005 --- 2319 + 1005 --- 2320 + 1005 --- 2321 + 1005 --- 2322 + 1005 --- 2323 + 1005 --- 2324 + 1005 --- 2325 + 1005 --- 2326 + 1005 --- 2327 + 1005 --- 2328 + 1005 --- 2329 + 1005 --- 2330 + 1005 --- 2331 + 1005 --- 2332 + 1005 --- 2333 + 1005 --- 2334 + 1005 --- 2335 + 1005 --- 2336 + 1005 --- 2337 + 1005 --- 2338 + 1005 --- 2339 + 1005 --- 2340 + 1005 --- 2341 + 1005 --- 2342 + 1005 --- 2343 + 1005 --- 2344 + 1005 --- 2345 + 1005 --- 2346 + 1005 --- 2347 + 1005 --- 2348 + 1005 --- 2349 + 1005 --- 2350 + 1005 --- 2351 + 1005 --- 2352 + 1005 --- 2353 + 1005 --- 2354 + 1005 --- 2355 + 1005 --- 2356 + 1005 --- 2357 + 1005 --- 2358 + 1005 --- 2359 + 1005 --- 2360 + 1005 --- 2361 + 1005 --- 2362 + 1005 --- 2363 + 1005 --- 2364 + 1005 --- 2365 + 1005 --- 2366 + 1005 --- 2367 + 1005 --- 2368 + 1005 --- 2369 + 1005 --- 2370 + 1005 --- 2371 + 1005 --- 2372 + 1005 --- 2373 + 1005 --- 2374 + 1005 --- 2375 + 1005 --- 2376 + 1005 --- 2377 + 1005 --- 2378 + 1005 --- 2379 + 1005 --- 2380 + 1005 --- 2381 + 1005 --- 2382 + 1005 --- 2383 + 1005 --- 2384 + 1005 --- 2385 + 1005 --- 2386 + 1005 --- 2387 + 1005 --- 2388 + 1005 --- 2389 + 1005 --- 2390 + 1005 --- 2391 + 1005 --- 2392 + 1005 --- 2393 + 1005 --- 2394 + 1005 --- 2395 + 1005 --- 2396 + 1005 --- 2397 + 1005 --- 2398 + 1005 --- 2399 + 1005 --- 2400 + 1005 --- 2401 + 1005 --- 2402 + 1005 --- 2403 + 1005 --- 2404 + 1005 --- 2405 + 1005 --- 2406 + 1005 --- 2407 + 1005 --- 2408 + 1005 --- 2409 + 1005 --- 2410 + 1005 --- 2411 + 1005 --- 2412 + 1005 --- 2413 + 1005 --- 2414 + 1005 --- 2415 + 1005 --- 2416 + 1005 --- 2417 + 1005 --- 2418 + 1005 --- 2419 + 1005 --- 2420 + 1005 --- 2421 + 1005 --- 2422 + 1005 --- 2423 + 1005 --- 2424 + 1005 --- 2425 + 1005 --- 2426 + 1005 --- 2427 + 1005 --- 2428 + 1005 --- 2429 + 1005 --- 2430 + 1005 --- 2431 + 1005 --- 2432 + 1005 --- 2433 + 1005 --- 2434 + 1005 --- 2435 + 1005 --- 2436 + 1005 --- 2437 + 1005 --- 2438 + 1005 --- 2439 + 1005 --- 2440 + 1005 --- 2441 + 1005 --- 2442 + 1005 --- 2443 + 1005 --- 2444 + 1005 --- 2445 + 1005 --- 2446 + 1005 --- 2447 + 1005 --- 2448 + 1005 --- 2449 + 1005 --- 2450 + 1005 --- 2451 + 1005 --- 2452 + 1005 --- 2453 + 1005 --- 2454 + 1005 --- 2455 + 1005 --- 2456 + 1005 --- 2457 + 1005 --- 2458 + 1005 --- 2459 + 1005 --- 2460 + 1005 --- 2461 + 1005 --- 2462 + 1005 --- 2463 + 1005 --- 2464 + 1005 --- 2465 + 1005 --- 2466 + 1005 --- 2467 + 1005 --- 2468 + 1005 --- 2469 + 1005 --- 2470 + 1005 --- 2471 + 1005 --- 2472 + 1005 --- 2473 + 1005 --- 2474 + 1005 --- 2475 + 1005 --- 2476 + 1005 --- 2477 + 1005 --- 2478 + 1005 --- 2479 + 1005 --- 2480 + 1005 --- 2481 + 1005 --- 2482 + 1005 --- 2483 + 1005 --- 2484 + 1005 --- 2485 + 1005 --- 2486 + 1005 --- 2487 + 1005 --- 2488 + 1005 --- 2489 + 1005 --- 2490 + 1005 --- 2491 + 1005 --- 2492 + 1005 --- 2493 + 1005 --- 2494 + 1005 --- 2495 + 1005 --- 2496 + 1005 --- 2497 + 1005 --- 2498 + 1005 --- 2499 + 1005 --- 2500 + 1005 --- 2501 + 1005 --- 2502 + 1005 --- 2503 + 1005 --- 2504 + 1005 --- 2505 + 1005 --- 2506 + 1005 --- 2507 + 1005 --- 2508 + 1005 --- 2509 + 1005 --- 2510 + 1005 --- 2511 + 1005 --- 2512 + 1005 --- 2513 + 1005 --- 2514 + 1005 --- 2515 + 1005 --- 2516 + 1005 --- 2517 + 1005 --- 2518 + 1005 --- 2519 + 1005 --- 2520 + 1005 --- 2521 + 1005 --- 2522 + 1005 --- 2523 + 1005 --- 2524 + 1005 --- 2525 + 1005 --- 2526 + 1005 --- 2527 + 1005 --- 2528 + 1005 --- 2529 + 1005 --- 2530 + 1005 --- 2531 + 1005 --- 2532 + 1005 --- 2533 + 1005 --- 2534 + 1005 --- 2535 + 1005 --- 2536 + 1005 --- 2537 + 1005 --- 2538 + 1005 --- 2539 + 1005 --- 2540 + 1005 --- 2541 + 1005 --- 2542 + 1005 --- 2543 + 1005 --- 2544 + 1005 --- 2545 + 1005 --- 2546 + 1005 --- 2547 + 1005 --- 2548 + 1005 --- 2549 + 1005 --- 2550 + 1005 --- 2551 + 1005 --- 2552 + 1005 --- 2553 + 1005 --- 2554 + 1005 --- 2555 + 1005 --- 2556 + 1005 --- 2557 + 1005 --- 2558 + 1005 --- 2559 + 1005 --- 2560 + 1005 --- 2561 + 1005 --- 2562 + 1005 --- 2563 + 1005 --- 2564 + 1005 --- 2565 + 1005 --- 2566 + 1005 --- 2567 + 1005 --- 2568 + 1005 --- 2569 + 1005 --- 2570 + 1005 --- 2571 + 1005 --- 2572 + 1005 --- 2573 + 1005 --- 2574 + 1005 --- 2575 + 1005 --- 2576 + 1005 --- 2577 + 1005 --- 2578 + 1005 --- 2579 + 1005 --- 2580 + 1005 --- 2581 + 1005 --- 2582 + 1005 --- 2583 + 1005 --- 2584 + 1005 --- 2585 + 1005 --- 2586 + 1005 --- 2587 + 1005 --- 2588 + 1005 --- 2589 + 1005 --- 2590 + 1005 --- 2591 + 1005 --- 2592 + 1005 --- 2593 + 1005 --- 2594 + 1005 --- 2595 + 1005 --- 2596 + 1005 --- 2597 + 1005 --- 2598 + 1005 --- 2599 + 1005 --- 2600 + 1005 --- 2601 + 1005 --- 2602 + 1005 --- 2603 + 1005 --- 2604 + 1005 --- 2605 + 1005 --- 2606 + 1005 --- 2607 + 1005 --- 2608 + 1005 --- 2609 + 1005 --- 2610 + 1005 --- 2611 + 1005 --- 2612 + 1005 --- 2613 + 1005 --- 2614 + 1005 --- 2615 + 1005 --- 2616 + 1005 --- 2617 + 1005 --- 2618 + 1005 --- 2619 + 1005 --- 2620 + 1005 --- 2621 + 1005 --- 2622 + 1005 --- 2623 + 1005 --- 2624 + 1005 --- 2625 + 1005 --- 2626 + 1005 --- 2627 + 1005 --- 2628 + 1005 --- 2629 + 1005 --- 2630 + 1005 --- 2631 + 1005 --- 2632 + 1005 --- 2633 + 1005 --- 2634 + 1005 --- 2635 + 1005 --- 2636 + 1005 --- 2637 + 1005 --- 2638 + 1005 --- 2639 + 1005 --- 2640 + 1005 --- 2641 + 1005 --- 2642 + 1005 --- 2643 + 1005 --- 2644 + 1005 --- 2645 + 1005 --- 2646 + 1005 --- 2647 + 1005 --- 2648 + 1005 --- 2649 + 1005 --- 2650 + 1005 --- 2651 + 1005 --- 2652 + 1005 --- 2653 + 1005 --- 2654 + 1005 --- 2655 + 1005 --- 2656 + 1005 --- 2657 + 1005 --- 2658 + 1005 --- 2659 + 1005 --- 2660 + 1005 --- 2661 + 1005 --- 2662 + 1005 --- 2663 + 1005 --- 2664 + 1005 --- 2665 + 1005 --- 2666 + 1005 --- 2667 + 1005 --- 2668 + 1005 --- 2669 + 1005 --- 2670 + 1005 --- 2671 + 1005 --- 2672 + 1005 --- 2673 + 1005 --- 2674 + 1005 --- 2675 + 1005 --- 2676 + 1005 --- 2677 + 1005 --- 2678 + 1005 --- 2679 + 1005 --- 2680 + 1005 --- 2681 + 1005 --- 2682 + 1005 --- 2683 + 1005 --- 2684 + 1005 --- 2685 + 1005 --- 2686 + 1005 --- 2687 + 1005 --- 2688 + 1005 --- 2689 + 1005 --- 2690 + 1005 --- 2691 + 1005 --- 2692 + 1005 --- 2693 + 1005 --- 2694 + 1005 --- 2695 + 1005 --- 2696 + 1005 --- 2697 + 1005 --- 2698 + 1005 --- 2699 + 1005 --- 2700 + 1005 --- 2701 + 1005 --- 2702 + 1005 --- 2703 + 1005 --- 2704 + 1005 --- 2705 + 1005 --- 2706 + 1005 --- 2707 + 1005 --- 2708 + 1005 --- 2709 + 1005 --- 2710 + 1005 --- 2711 + 1005 --- 2712 + 1005 --- 2713 + 1005 --- 2714 + 1005 --- 2715 + 1005 --- 2716 + 1005 --- 2717 + 1005 --- 2718 + 1005 --- 2719 + 1005 --- 2720 + 1005 --- 2721 + 1005 --- 2722 + 1005 --- 2723 + 1005 --- 2724 + 1005 --- 2725 + 1005 --- 2726 + 1005 --- 2727 + 1005 --- 2728 + 1005 --- 2729 + 1005 --- 2730 + 1005 --- 2731 + 1005 --- 2732 + 1005 --- 2733 + 1005 --- 2734 + 1005 --- 2735 + 1005 --- 2736 + 1005 --- 2737 + 1005 --- 2738 + 1005 --- 2739 + 1005 --- 2740 + 1005 --- 2741 + 1005 --- 2742 + 1005 --- 2743 + 1005 --- 2744 + 1005 --- 2745 + 1005 --- 2746 + 1005 --- 2747 + 1005 --- 2748 + 1005 --- 2749 + 1005 --- 2750 + 1005 --- 2751 + 1005 --- 2752 + 1005 --- 2753 + 1005 --- 2754 + 1005 --- 2755 + 1005 --- 2756 + 1005 --- 2757 + 1005 --- 2758 + 1005 --- 2759 + 1005 --- 2760 + 1005 --- 2761 + 1005 --- 2762 + 1005 --- 2763 + 1005 --- 2764 + 1005 --- 2765 + 1005 --- 2766 + 1005 --- 2767 + 1005 --- 2768 + 1005 --- 2769 + 1005 --- 2770 + 1005 --- 2771 + 1005 --- 2772 + 1005 --- 2773 + 1005 --- 2774 + 1005 --- 2775 + 1005 --- 2776 + 1005 --- 2777 + 1005 --- 2778 + 1005 --- 2779 + 1005 --- 2780 + 1005 --- 2781 + 1005 --- 2782 + 1005 --- 2783 + 1005 --- 2784 + 1005 --- 2785 + 1005 --- 2786 + 1005 --- 2787 + 1005 --- 2788 + 1005 --- 2789 + 1005 --- 2790 + 1005 --- 2791 + 1005 --- 2792 + 1005 --- 2793 + 1005 --- 2794 + 1005 --- 2795 + 1005 --- 2796 + 1005 --- 2797 + 1005 --- 2798 + 1005 --- 2799 + 1005 --- 2800 + 1005 --- 2801 + 1005 --- 2802 + 1005 --- 2803 + 1005 --- 2804 + 1005 --- 2805 + 1005 --- 2806 + 1005 --- 2807 + 1005 --- 2808 + 1005 --- 2809 + 1005 --- 2810 + 1005 --- 2811 + 1005 --- 2812 + 1005 --- 2813 + 1005 --- 2814 + 1005 --- 2815 + 1005 --- 2816 + 1005 --- 2817 + 1005 --- 2818 + 1005 --- 2819 + 1005 --- 2820 + 1005 --- 2821 + 1005 --- 2822 + 1005 --- 2823 + 1005 --- 2824 + 1005 --- 2825 + 1005 --- 2826 + 1005 --- 2827 + 1005 --- 2828 + 1005 --- 2829 + 1005 --- 2830 + 1005 --- 2831 + 1005 --- 2832 + 1005 --- 2833 + 1005 --- 2834 + 1005 --- 2835 + 1005 --- 2836 + 1005 --- 2837 + 1005 --- 2838 + 1005 --- 2839 + 1005 --- 2840 + 1005 --- 2841 + 1005 --- 2842 + 1005 --- 2843 + 1005 --- 2844 + 1005 --- 2845 + 1005 --- 2846 + 1005 --- 2847 + 1005 --- 2848 + 1005 --- 2849 + 1005 --- 2850 + 1005 --- 2851 + 1005 --- 2852 + 1005 --- 2853 + 1005 --- 2854 + 1005 --- 2855 + 1005 --- 2856 + 1005 --- 2857 + 1005 --- 2858 + 1005 --- 2859 + 1005 --- 2860 + 1005 --- 2861 + 1005 --- 2862 + 1005 --- 2863 + 1005 --- 2864 + 1005 --- 2865 + 1005 --- 2866 + 1005 --- 2867 + 1005 --- 2868 + 1005 --- 2869 + 1005 --- 2870 + 1005 --- 2871 + 1005 --- 2872 + 1005 --- 2873 + 1005 --- 2874 + 1005 --- 2875 + 1005 --- 2876 + 1005 --- 2877 + 1005 --- 2878 + 1005 --- 2879 + 1005 --- 2880 + 1005 --- 2881 + 1005 --- 2882 + 1005 --- 2883 + 1005 --- 2884 + 1005 --- 2885 + 1005 --- 2886 + 1005 --- 2887 + 1005 --- 2888 + 1005 --- 2889 + 1005 --- 2890 + 1005 --- 2891 + 1005 --- 2892 + 1005 --- 2893 + 1005 --- 2894 + 1005 --- 2895 + 1005 --- 2896 + 1005 --- 2897 + 1005 --- 2898 + 1005 --- 2899 + 1005 --- 2900 + 1005 --- 2901 + 1005 --- 2902 + 1005 --- 2903 + 1005 --- 2904 + 1005 --- 2905 + 1005 --- 2906 + 1005 --- 2907 + 1005 --- 2908 + 1005 --- 2909 + 1005 --- 2910 + 1005 --- 2911 + 1005 --- 2912 + 1005 --- 2913 + 1005 --- 2914 + 1005 --- 2915 + 1005 --- 2916 + 1005 --- 2917 + 1005 --- 2918 + 1005 --- 2919 + 1005 --- 2920 + 1005 --- 2921 + 1005 --- 2922 + 1005 --- 2923 + 1005 --- 2924 + 1005 --- 2925 + 1005 --- 2926 + 1005 --- 2927 + 1005 --- 2928 + 1005 --- 2929 + 1005 --- 2930 + 1005 --- 2931 + 1005 --- 2932 + 1005 --- 2933 + 1005 --- 2934 + 1005 --- 2935 + 1005 --- 2936 + 1005 --- 2937 + 1005 --- 2938 + 1005 --- 2939 + 1005 --- 2940 + 1005 --- 2941 + 1005 --- 2942 + 1005 --- 2943 + 1005 --- 2944 + 1005 --- 2945 + 1005 --- 2946 + 1005 --- 2947 + 1005 --- 2948 + 1005 --- 2949 + 1005 --- 2950 + 1005 --- 2951 + 1005 --- 2952 + 1005 --- 2953 + 1005 --- 2954 + 1005 --- 2955 + 1005 --- 2956 + 1005 --- 2957 + 1005 --- 2958 + 1005 --- 2959 + 1005 --- 2960 + 1005 --- 2961 + 1005 --- 2962 + 1005 --- 2963 + 1005 --- 2964 + 1005 --- 2965 + 1005 --- 2966 + 1005 --- 2967 + 1005 --- 2968 + 1005 --- 2969 + 1005 --- 2970 + 1005 --- 2971 + 1005 --- 2972 + 1005 --- 2973 + 1005 --- 2974 + 1005 --- 2975 + 1005 --- 2976 + 1005 --- 2977 + 1005 --- 2978 + 1005 --- 2979 + 1005 --- 2980 + 1005 --- 2981 + 1005 --- 2982 + 1005 --- 2983 + 1005 --- 2984 + 1005 --- 2985 + 1005 --- 2986 + 1005 --- 2987 + 1005 --- 2988 + 1005 --- 2989 + 1005 --- 2990 + 1005 --- 2991 + 1005 --- 2992 + 1005 --- 2993 + 1005 --- 2994 + 1005 --- 2995 + 1005 --- 2996 + 1005 --- 2997 + 1005 --- 2998 + 1005 --- 2999 + 1005 --- 3000 + 1005 --- 3001 + 1005 --- 3002 + 1005 --- 3003 + 1005 --- 3004 + 1005 --- 3005 + 1005 --- 3006 + 1005 --- 3007 + 1005 --- 3008 + 1005 --- 3009 + 1005 --- 3010 + 1005 --- 3011 + 1005 --- 3012 + 1005 --- 3013 + 1005 --- 3014 + 1005 --- 3015 + 1005 --- 3016 + 1005 --- 3017 + 1005 --- 3018 + 1005 --- 3019 + 1005 --- 3020 + 1005 --- 3021 + 1005 --- 3022 + 1005 --- 3023 + 1005 --- 3024 + 1005 --- 3025 + 1005 --- 3026 + 1005 --- 3027 + 1005 --- 3028 + 1005 --- 3029 + 1005 --- 3030 + 1005 --- 3031 + 1005 --- 3032 + 1005 --- 3033 + 1005 --- 3034 + 1005 --- 3035 + 1005 --- 3036 + 1005 --- 3037 + 1005 --- 3038 + 1005 --- 3039 + 1005 --- 3040 + 1005 --- 3041 + 1005 --- 3042 + 1005 --- 3043 + 1005 --- 3044 + 1005 --- 3045 + 1005 --- 3046 + 1005 --- 3047 + 1005 --- 3048 + 1005 --- 3049 + 1005 --- 3050 + 1005 --- 3051 + 1005 --- 3052 + 1005 --- 3053 + 1005 --- 3054 + 1005 --- 3055 + 1005 --- 3056 + 1005 --- 3057 + 1005 --- 3058 + 1005 --- 3059 + 1005 --- 3060 + 1005 --- 3061 + 1005 --- 3062 + 1005 --- 3063 + 1005 --- 3064 + 1005 --- 3065 + 1005 --- 3066 + 1005 --- 3067 + 1005 --- 3068 + 1005 --- 3069 + 1005 --- 3070 + 1005 --- 3071 + 1005 --- 3072 + 1005 --- 3073 + 1005 --- 3074 + 1005 --- 3075 + 1005 --- 3076 + 1005 --- 3077 + 1005 --- 3078 + 1005 --- 3079 + 1005 --- 3080 + 1005 --- 3081 + 1005 --- 3082 + 1005 --- 3083 + 1005 --- 3084 + 1005 --- 3085 + 1005 --- 3086 + 1005 --- 3087 + 1005 --- 3088 + 1005 --- 3089 + 1005 --- 3090 + 1005 --- 3091 + 1005 --- 3092 + 1005 --- 3093 + 1005 --- 3094 + 1005 --- 3095 + 1005 --- 3096 + 1005 --- 3097 + 1005 --- 3098 + 1005 --- 3099 + 1005 --- 3100 + 1005 --- 3101 + 1005 --- 3102 + 1005 --- 3103 + 1005 --- 3104 + 1005 --- 3105 + 1005 --- 3106 + 1005 --- 3107 + 1005 --- 3108 + 1005 --- 3109 + 1005 --- 3110 + 1005 --- 3111 + 1005 --- 3112 + 1005 --- 3113 + 1005 --- 3114 + 1005 --- 3115 + 1005 --- 3116 + 1005 --- 3117 + 1005 --- 3118 + 1005 --- 3119 + 1005 --- 3120 + 1005 --- 3121 + 1005 --- 3122 + 1005 --- 3123 + 1005 --- 3124 + 1005 --- 3125 + 1005 --- 3126 + 1005 --- 3127 + 1005 --- 3128 + 1005 --- 3129 + 1005 --- 3130 + 1005 --- 3131 + 1005 --- 3132 + 1005 --- 3133 + 1005 --- 3134 + 1005 --- 3135 + 1005 --- 3136 + 1005 --- 3137 + 1005 --- 3138 + 1005 --- 3139 + 1005 --- 3140 + 1005 --- 3141 + 1005 --- 3142 + 1005 --- 3143 + 1005 --- 3144 + 1005 --- 3145 + 1005 --- 3146 + 1005 --- 3147 + 1005 --- 3148 + 1005 --- 3149 + 1005 --- 3150 + 1005 --- 3151 + 1005 --- 3152 + 1005 --- 3153 + 1005 --- 3154 + 1005 --- 3155 + 1005 --- 3156 + 1005 --- 3157 + 1005 --- 3158 + 1005 --- 3159 + 1005 --- 3160 + 1005 --- 3161 + 1005 --- 3162 + 1005 --- 3163 + 1005 --- 3164 + 1005 --- 3165 + 1005 --- 3166 + 1005 --- 3167 + 1005 --- 3168 + 1005 --- 3169 + 1005 --- 3170 + 1005 --- 3171 + 1005 --- 3172 + 1005 --- 3173 + 1005 --- 3174 + 1005 --- 3175 + 1005 --- 3176 + 1005 --- 3177 + 1005 --- 3178 + 1005 --- 3179 + 1005 --- 3180 + 1005 --- 3181 + 1005 --- 3182 + 1005 --- 3183 + 1005 --- 3184 + 1005 --- 3185 + 1005 --- 3186 + 1005 --- 3187 + 1005 --- 3188 + 1005 --- 3189 + 1005 --- 3190 + 1005 --- 3191 + 1005 --- 3192 + 1005 --- 3193 + 1005 --- 3194 + 1005 --- 3195 + 1005 --- 3196 + 1005 --- 3197 + 1005 --- 3198 + 1005 --- 3199 + 1005 --- 3200 + 1005 --- 3201 + 1005 --- 3202 + 1005 --- 3203 + 1005 --- 3204 + 1005 --- 3205 + 1005 --- 3206 + 1005 --- 3207 + 1005 --- 3208 + 1005 --- 3209 + 1005 --- 3210 + 1005 --- 3211 + 1005 --- 3212 + 1005 --- 3213 + 1005 --- 3214 + 1005 --- 3215 + 1005 --- 3216 + 1005 --- 3217 + 1005 --- 3218 + 1005 --- 3219 + 1005 --- 3220 + 1005 --- 3221 + 1005 --- 3222 + 1005 --- 3223 + 1005 --- 3224 + 1005 --- 3225 + 1005 --- 3226 + 1005 --- 3227 + 1005 --- 3228 + 1005 --- 3229 + 1005 --- 3230 + 1005 --- 3231 + 1005 --- 3232 + 1005 --- 3233 + 1005 --- 3234 + 1005 --- 3235 + 1005 --- 3236 + 1005 --- 3237 + 1005 --- 3238 + 1005 --- 3239 + 1005 --- 3240 + 1005 --- 3241 + 1005 --- 3242 + 1005 --- 3243 + 1005 --- 3244 + 1005 --- 3245 + 1005 --- 3246 + 1005 --- 3247 + 1005 --- 3248 + 1005 --- 3249 + 1005 --- 3250 + 1005 --- 3251 + 1005 --- 3252 + 1005 --- 3253 + 1005 --- 3254 + 1005 --- 3255 + 1005 --- 3256 + 1005 --- 3257 + 1005 --- 3258 + 1005 --- 3259 + 1005 --- 3260 + 1005 --- 3261 + 1005 --- 3262 + 1005 --- 3263 + 1005 --- 3264 + 1005 --- 3265 + 1005 --- 3266 + 1005 --- 3267 + 1005 --- 3268 + 1005 --- 3269 + 1005 --- 3270 + 1005 --- 3271 + 1005 --- 3272 + 1005 --- 3273 + 1005 --- 3274 + 1005 --- 3275 + 1005 --- 3276 + 1005 --- 3277 + 1005 --- 3278 + 1005 --- 3279 + 1005 --- 3280 + 1005 --- 3281 + 1005 --- 3282 + 1005 --- 3283 + 1005 --- 3284 + 1005 --- 3285 + 1005 --- 3286 + 1005 --- 3287 + 1005 --- 3288 + 1005 --- 3289 + 1005 --- 3290 + 1005 --- 3291 + 1005 --- 3292 + 1005 --- 3293 + 1005 --- 3294 + 1005 --- 3295 + 1005 --- 3296 + 1005 --- 3297 + 1005 --- 3298 + 1005 --- 3299 + 1005 --- 3300 + 1005 --- 3301 + 1005 --- 3302 + 1005 --- 3303 + 1005 --- 3304 + 1005 --- 3305 + 1005 --- 3306 + 1005 --- 3307 + 1005 --- 3308 + 1005 --- 3309 + 1005 --- 3310 + 1005 --- 3311 + 1005 --- 3312 + 1005 --- 3313 + 1005 --- 3314 + 1005 --- 3315 + 1005 --- 3316 + 1005 --- 3317 + 1005 --- 3318 + 1005 --- 3319 + 1005 --- 3320 + 1005 --- 3321 + 1005 --- 3322 + 1005 --- 3323 + 1005 --- 3324 + 1005 --- 3325 + 1005 --- 3326 + 1005 --- 3327 + 1005 --- 3328 + 1005 --- 3329 + 1005 --- 3330 + 1005 --- 3331 + 1005 --- 3332 + 1005 --- 3333 + 1005 --- 3334 + 1005 --- 3335 + 1005 --- 3336 + 1005 --- 3337 + 1005 --- 3338 + 1005 --- 3339 + 1005 --- 3340 + 1005 --- 3341 + 1005 --- 3342 + 1005 --- 3343 + 1005 --- 3344 + 1005 --- 3345 + 1005 --- 3346 + 1005 --- 3347 + 1005 --- 3348 + 1005 --- 3349 + 1005 --- 3350 + 1005 --- 3351 + 1005 --- 3352 + 1005 --- 3353 + 1005 --- 3354 + 1005 --- 3355 + 1005 --- 3356 + 1005 --- 3357 + 1005 --- 3358 + 1005 --- 3359 + 1005 --- 3360 + 1005 --- 3361 + 1005 --- 3362 + 1005 --- 3363 + 1005 --- 3364 + 1005 --- 3365 + 1005 --- 3366 + 1005 --- 3367 + 1005 --- 3368 + 1005 --- 3369 + 1005 --- 3370 + 1005 --- 3371 + 1005 --- 3372 + 1005 --- 3373 + 1005 --- 3374 + 1005 --- 3375 + 1005 --- 3376 + 1005 --- 3377 + 1005 --- 3378 + 1005 --- 3379 + 1005 --- 3380 + 1005 --- 3381 + 1005 --- 3382 + 1005 --- 3383 + 1005 --- 3384 + 1005 --- 3385 + 1005 --- 3386 + 1005 --- 3387 + 1005 --- 3388 + 1005 --- 3389 + 1005 --- 3390 + 1005 --- 3391 + 1005 --- 3392 + 1005 --- 3393 + 1005 --- 3394 + 1005 --- 3395 + 1005 --- 3396 + 1005 --- 3397 + 1005 --- 3398 + 1005 --- 3399 + 1005 --- 3400 + 1005 --- 3401 + 1005 --- 3402 + 1005 --- 3403 + 1005 --- 3404 + 1005 --- 3405 + 1005 --- 3406 + 1005 --- 3407 + 1005 --- 3408 + 1005 --- 3409 + 1005 --- 3410 + 1005 --- 3411 + 1005 --- 3412 + 1005 --- 3413 + 1005 --- 3414 + 1005 --- 3415 + 1005 --- 3416 + 1005 --- 3417 + 1005 --- 3418 + 1005 --- 3419 + 1005 --- 3420 + 1005 --- 3421 + 1005 --- 3422 + 1005 --- 3423 + 1005 --- 3424 + 1005 --- 3425 + 1005 --- 3426 + 1005 --- 3427 + 1005 --- 3428 + 1005 --- 3429 + 1005 --- 3430 + 1005 --- 3431 + 1005 --- 3432 + 1005 --- 3433 + 1005 --- 3434 + 1005 --- 3435 + 1005 --- 3436 + 1005 --- 3437 + 1005 --- 3438 + 1005 --- 3439 + 1005 --- 3440 + 1005 --- 3441 + 1005 --- 3442 + 1005 --- 3443 + 1005 --- 3444 + 1005 --- 3445 + 1005 --- 3446 + 1005 --- 3447 + 1005 --- 3448 + 1005 --- 3449 + 1005 --- 3450 + 1005 --- 3451 + 1005 --- 3452 + 1005 --- 3453 + 1005 --- 3454 + 1005 --- 3455 + 1005 --- 3456 + 1005 --- 3457 + 1005 --- 3458 + 1005 --- 3459 + 1005 --- 3460 + 1005 --- 3461 + 1005 --- 3462 + 1005 --- 3463 + 1005 --- 3464 + 1005 --- 3465 + 1005 --- 3466 + 1005 --- 3467 + 1005 --- 3468 + 1005 --- 3469 + 1005 --- 3470 + 1005 --- 3471 + 1005 --- 3472 + 1005 --- 3473 + 1005 --- 3474 + 1005 --- 3475 + 1005 --- 3476 + 1005 --- 3477 + 1005 --- 3478 + 1005 --- 3479 + 1005 --- 3480 + 1005 --- 3481 + 1005 --- 3482 + 1005 --- 3483 + 1005 --- 3484 + 1005 --- 3485 + 1005 --- 3486 + 1005 --- 3487 + 1005 --- 3488 + 1005 --- 3489 + 1005 --- 3490 + 1005 --- 3491 + 1005 --- 3492 + 1005 --- 3493 + 1005 --- 3494 + 1005 --- 3495 + 1005 --- 3496 + 1005 --- 3497 + 1005 --- 3498 + 1005 --- 3499 + 1005 --- 3500 + 1005 --- 3501 + 1005 --- 3502 + 1005 --- 3503 + 1005 --- 3504 + 1005 --- 3505 + 1005 --- 3506 + 1005 --- 3507 + 1005 --- 3508 + 1005 --- 3509 + 1005 --- 3510 + 1005 --- 3511 + 1005 --- 3512 + 1005 --- 3513 + 1005 --- 3514 + 1005 --- 3515 + 1005 --- 3516 + 1005 --- 3517 + 1005 --- 3518 + 1005 --- 3519 + 1005 --- 3520 + 1005 --- 3521 + 1005 --- 3522 + 1005 --- 3523 + 1005 --- 3524 + 1005 --- 3525 + 1005 --- 3526 + 1005 --- 3527 + 1005 --- 3528 + 1005 --- 3529 + 1005 --- 3530 + 1005 --- 3531 + 1005 --- 3532 + 1005 --- 3533 + 1005 --- 3534 + 1005 --- 3535 + 1005 --- 3536 + 1005 --- 3537 + 1005 --- 3538 + 1005 --- 3539 + 1005 --- 3540 + 1005 --- 3541 + 1005 --- 3542 + 1005 --- 3543 + 1005 --- 3544 + 1005 --- 3545 + 1005 --- 3546 + 1005 --- 3547 + 1005 --- 3548 + 1005 --- 3549 + 1005 --- 3550 + 1005 --- 3551 + 1005 --- 3552 + 1005 --- 3553 + 1005 --- 3554 + 1005 --- 3555 + 1005 --- 3556 + 1005 --- 3557 + 1005 --- 3558 + 1005 --- 3559 + 1005 --- 3560 + 1005 --- 3561 + 1005 --- 3562 + 1005 --- 3563 + 1005 --- 3564 + 1005 --- 3565 + 1005 --- 3566 + 1005 --- 3567 + 1005 --- 3568 + 1005 --- 3569 + 1005 --- 3570 + 1005 --- 3571 + 1005 --- 3572 + 1005 --- 3573 + 1005 --- 3574 + 1005 --- 3575 + 1005 --- 3576 + 1005 --- 3577 + 1005 --- 3578 + 1005 --- 3579 + 1005 --- 3580 + 1005 --- 3581 + 1005 --- 3582 + 1005 --- 3583 + 1005 --- 3584 + 1005 --- 3585 + 1005 --- 3586 + 1005 --- 3587 + 1005 --- 3588 + 1005 --- 3589 + 1005 --- 3590 + 1005 --- 3591 + 1005 --- 3592 + 1005 --- 3593 + 1005 --- 3594 + 1005 --- 3595 + 1005 --- 3596 + 1005 --- 3597 + 1005 --- 3598 + 1005 --- 3599 + 1005 --- 3600 + 1005 --- 3601 + 1005 --- 3602 + 1005 --- 3603 + 1005 --- 3604 + 1005 --- 3605 + 1005 --- 3606 + 1005 --- 3607 + 1005 --- 3608 + 1005 --- 3609 + 1005 --- 3610 + 1005 --- 3611 + 1005 --- 3612 + 1005 --- 3613 + 1005 --- 3614 + 1005 --- 3615 + 1005 --- 3616 + 1005 --- 3617 + 1005 --- 3618 + 1005 --- 3619 + 1005 --- 3620 + 1005 --- 3621 + 1005 --- 3622 + 1005 --- 3623 + 1005 --- 3624 + 1005 --- 3625 + 1005 --- 3626 + 1005 --- 3627 + 1005 --- 3628 + 1005 --- 3629 + 1005 --- 3630 + 1005 --- 3631 + 1005 --- 3632 + 1005 --- 3633 + 1005 --- 3634 + 1005 --- 3635 + 1005 --- 3636 + 1005 --- 3637 + 1005 --- 3638 + 1005 --- 3639 + 1005 --- 3640 + 1005 --- 3641 + 1005 --- 3642 + 1005 --- 3643 + 1005 --- 3644 + 1005 --- 3645 + 1005 --- 3646 + 1005 --- 3647 + 1005 --- 3648 + 1005 --- 3649 + 1005 --- 3650 + 1005 --- 3651 + 1005 --- 3652 + 1005 --- 3653 + 1005 --- 3654 + 1005 --- 3655 + 1005 --- 3656 + 1005 --- 3657 + 1005 --- 3658 + 1005 --- 3659 + 1005 --- 3660 + 1005 --- 3661 + 1005 --- 3662 + 1005 --- 3663 + 1005 --- 3664 + 1005 --- 3665 + 1005 --- 3666 + 1005 --- 3667 + 1005 --- 3668 + 1005 --- 3669 + 1005 --- 3670 + 1005 --- 3671 + 1005 --- 3672 + 1005 --- 3673 + 1005 --- 3674 + 1005 --- 3675 + 1005 --- 3676 + 1005 --- 3677 + 1005 --- 3678 + 1005 --- 3679 + 1005 --- 3680 + 1005 --- 3681 + 1005 --- 3682 + 1005 --- 3683 + 1005 --- 3684 + 1005 --- 3685 + 1005 --- 3686 + 1005 --- 3687 + 1005 --- 3688 + 1005 --- 3689 + 1005 --- 3690 + 1005 --- 3691 + 1005 --- 3692 + 1005 --- 3693 + 1005 --- 3694 + 1005 --- 3695 + 1005 --- 3696 + 1005 --- 3697 + 1005 --- 3698 + 1005 --- 3699 + 1005 --- 3700 + 1005 --- 3701 + 1005 --- 3702 + 1005 --- 3703 + 1005 --- 3704 + 1005 --- 3705 + 1005 --- 3706 + 1005 --- 3707 + 1005 --- 3708 + 1005 --- 3709 + 1005 --- 3710 + 1005 --- 3711 + 1005 --- 3712 + 1005 --- 3713 + 1005 --- 3714 + 1005 --- 3715 + 1005 --- 3716 + 1005 --- 3717 + 1005 --- 3718 + 1005 --- 3719 + 1005 --- 3720 + 1005 --- 3721 + 1005 --- 3722 + 1005 --- 3723 + 1005 --- 3724 + 1005 --- 3725 + 1005 --- 3726 + 1005 --- 3727 + 1005 --- 3728 + 1005 --- 3729 + 1005 --- 3730 + 1005 --- 3731 + 1005 --- 3732 + 1005 --- 3733 + 1005 --- 3734 + 1005 --- 3735 + 1005 --- 3736 + 1005 --- 3737 + 1005 --- 3738 + 1005 --- 3739 + 1005 --- 3740 + 1005 --- 3741 + 1005 --- 3742 + 1005 --- 3743 + 1005 --- 3744 + 1005 --- 3745 + 1005 --- 3746 + 1005 --- 3747 + 1005 --- 3748 + 1005 --- 3749 + 1005 --- 3750 + 1005 --- 3751 + 1005 --- 3752 + 1005 --- 3753 + 1005 --- 3754 + 1005 --- 3755 + 1005 --- 3756 + 1005 --- 3757 + 1005 --- 3758 + 1005 --- 3759 + 1005 --- 3760 + 1005 --- 3761 + 1005 --- 3762 + 1005 --- 3763 + 1005 --- 3764 + 1005 --- 3765 + 1005 --- 3766 + 1005 --- 3767 + 1005 --- 3768 + 1005 --- 3769 + 1005 --- 3770 + 1005 --- 3771 + 1005 --- 3772 + 1005 --- 3773 + 1005 --- 3774 + 1005 --- 3775 + 1005 --- 3776 + 1005 --- 3777 + 1005 --- 3778 + 1005 --- 3779 + 1005 --- 3780 + 1005 --- 3781 + 1005 --- 3782 + 1005 --- 3783 + 1005 --- 3784 + 1005 --- 3785 + 1005 --- 3786 + 1005 --- 3787 + 1005 --- 3788 + 1005 --- 3789 + 1005 --- 3790 + 1005 --- 3791 + 1005 --- 3792 + 1005 --- 3793 + 1005 --- 3794 + 1005 --- 3795 + 1005 --- 3796 + 1005 --- 3797 + 1005 --- 3798 + 1005 --- 3799 + 1005 --- 3800 + 1005 --- 3801 + 1005 --- 3802 + 1005 --- 3803 + 1005 --- 3804 + 1005 --- 3805 + 1005 --- 3806 + 1005 --- 3807 + 1005 --- 3808 + 1005 --- 3809 + 1005 --- 3810 + 1005 --- 3811 + 1005 --- 3812 + 1005 --- 3813 + 1005 --- 3814 + 1005 --- 3815 + 1005 --- 3816 + 1005 --- 3817 + 1005 --- 3818 + 1005 --- 3819 + 1005 --- 3820 + 1005 --- 3821 + 1005 --- 3822 + 1005 --- 3823 + 1005 --- 3824 + 1005 --- 3825 + 1005 --- 3826 + 1005 --- 3827 + 1005 --- 3828 + 1005 --- 3829 + 1005 --- 3830 + 1005 --- 3831 + 1005 --- 3832 + 1005 --- 3833 + 1005 --- 3834 + 1005 --- 3835 + 1005 --- 3836 + 1005 --- 3837 + 1005 --- 3838 + 1005 --- 3839 + 1005 --- 3840 + 1005 --- 3841 + 1005 --- 3842 + 1005 --- 3843 + 1005 --- 3844 + 1005 --- 3845 + 1005 --- 3846 + 1005 --- 3847 + 1005 --- 3848 + 1005 --- 3849 + 1005 --- 3850 + 1005 --- 3851 + 1005 --- 3852 + 1005 --- 3853 + 1005 --- 3854 + 1005 --- 3855 + 1005 --- 3856 + 1005 --- 3857 + 1005 --- 3858 + 1005 --- 3859 + 1005 --- 3860 + 1005 --- 3861 + 1005 --- 3862 + 1005 --- 3863 + 1005 --- 3864 + 1005 --- 3865 + 1005 --- 3866 + 1005 --- 3867 + 1005 --- 3868 + 1005 --- 3869 + 1005 --- 3870 + 1005 --- 3871 + 1005 --- 3872 + 1005 --- 3873 + 1005 --- 3874 + 1005 --- 3875 + 1005 --- 3876 + 1005 --- 3877 + 1005 --- 3878 + 1005 --- 3879 + 1005 --- 3880 + 1005 --- 3881 + 1005 --- 3882 + 1005 --- 3883 + 1005 --- 3884 + 1005 --- 3885 + 1005 --- 3886 + 1005 --- 3887 + 1005 --- 3888 + 1005 --- 3889 + 1005 --- 3890 + 1005 --- 3891 + 1005 --- 3892 + 1005 --- 3893 + 1005 --- 3894 + 1005 --- 3895 + 1005 --- 3896 + 1005 --- 3897 + 1005 --- 3898 + 1005 --- 3899 + 1005 --- 3900 + 1005 --- 3901 + 1005 --- 3902 + 1005 --- 3903 + 1005 --- 3904 + 1005 --- 3905 + 1005 --- 3906 + 1005 --- 3907 + 1005 --- 3908 + 1005 --- 3909 + 1005 --- 3910 + 1005 --- 3911 + 1005 --- 3912 + 1005 --- 3913 + 1005 --- 3914 + 1005 --- 3915 + 1005 --- 3916 + 1005 --- 3917 + 1005 --- 3918 + 1005 --- 3919 + 1005 --- 3920 + 1005 --- 3921 + 1005 --- 3922 + 1005 --- 3923 + 1005 --- 3924 + 1005 --- 3925 + 1005 --- 3926 + 1005 --- 3927 + 1005 --- 3928 + 1005 --- 3929 + 1005 --- 3930 + 1005 --- 3931 + 1005 --- 3932 + 1005 --- 3933 + 1005 --- 3934 + 1005 --- 3935 + 1005 --- 3936 + 1005 --- 3937 + 1005 --- 3938 + 1005 --- 3939 + 1005 --- 3940 + 1005 --- 3941 + 1005 --- 3942 + 1005 --- 3943 + 1005 --- 3944 + 1005 --- 3945 + 1005 --- 3946 + 1005 --- 3947 + 1005 --- 3948 + 1005 --- 3949 + 1005 --- 3950 + 1005 --- 3951 + 1005 --- 3952 + 1005 --- 3953 + 1005 --- 3954 + 1005 --- 3955 + 1005 --- 3956 + 1005 --- 3957 + 1005 --- 3958 + 1005 --- 3959 + 1005 --- 3960 + 1005 --- 3961 + 1005 --- 3962 + 1005 --- 3963 + 1005 --- 3964 + 1005 --- 3965 + 1005 --- 3966 + 1005 --- 3967 + 1005 --- 3968 + 1005 --- 3969 + 1005 --- 3970 + 1005 --- 3971 + 1005 --- 3972 + 1005 --- 3973 + 1005 --- 3974 + 1005 --- 3975 + 1005 --- 3976 + 1005 --- 3977 + 1005 --- 3978 + 1005 --- 3979 + 1005 --- 3980 + 1005 --- 3981 + 1005 --- 3982 + 1005 --- 3983 + 1005 --- 3984 + 1005 --- 3985 + 1005 --- 3986 + 1005 --- 3987 + 1005 --- 3988 + 1005 --- 3989 + 1005 --- 3990 + 1005 --- 3991 + 1005 --- 3992 + 1005 --- 3993 + 1005 --- 3994 + 1005 --- 3995 + 1005 --- 3996 + 1005 --- 3997 + 1005 --- 3998 + 1005 --- 3999 + 1005 --- 4000 + 1005 --- 4001 + 1005 --- 4002 + 1005 --- 4003 + 1005 --- 4004 + 1005 --- 4005 + 1005 --- 4006 + 1005 --- 4007 + 1005 --- 4008 + 1005 --- 4009 + 1005 --- 4010 +``` diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..906d41c678 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map mike_stress_test.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..268a258573 --- /dev/null +++ b/src/wasm-lib/kcl/tests/mike_stress_test/artifact_graph_mind_map.snap.md @@ -0,0 +1,7017 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..67a842ea9a --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart neg_xz_plane.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..d9763a493a --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_flowchart.snap.md @@ -0,0 +1,49 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[36, 61, 0]"] + 3["Segment
[67, 88, 0]"] + 4["Segment
[94, 113, 0]"] + 5["Segment
[119, 127, 0]"] + 6[Solid2d] + end + 1["Plane
[10, 30, 0]"] + 7["Sweep Extrusion
[133, 150, 0]"] + 8[Wall] + 9[Wall] + 10[Wall] + 11["Cap Start"] + 12["Cap End"] + 13["SweepEdge Opposite"] + 14["SweepEdge Adjacent"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 7 + 2 --- 6 + 3 --- 10 + 3 --- 17 + 3 --- 18 + 4 --- 9 + 4 --- 15 + 4 --- 16 + 5 --- 8 + 5 --- 13 + 5 --- 14 + 7 --- 8 + 7 --- 9 + 7 --- 10 + 7 --- 11 + 7 --- 12 + 7 --- 13 + 7 --- 14 + 7 --- 15 + 7 --- 16 + 7 --- 17 + 7 --- 18 +``` diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..4e3a941e53 --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map neg_xz_plane.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..56c4e2fa5f --- /dev/null +++ b/src/wasm-lib/kcl/tests/neg_xz_plane/artifact_graph_mind_map.snap.md @@ -0,0 +1,31 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..9c979bde7b --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart parametric.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..d9de73a72e --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/artifact_graph_flowchart.snap.md @@ -0,0 +1,82 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[253, 278, 0]"] + 3["Segment
[284, 302, 0]"] + 4["Segment
[308, 326, 0]"] + 5["Segment
[332, 356, 0]"] + 6["Segment
[362, 393, 0]"] + 7["Segment
[399, 430, 0]"] + 8["Segment
[436, 444, 0]"] + 9[Solid2d] + end + 1["Plane
[228, 247, 0]"] + 10["Sweep Extrusion
[450, 467, 0]"] + 11[Wall] + 12[Wall] + 13[Wall] + 14[Wall] + 15[Wall] + 16[Wall] + 17["Cap Start"] + 18["Cap End"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["SweepEdge Opposite"] + 24["SweepEdge Adjacent"] + 25["SweepEdge Opposite"] + 26["SweepEdge Adjacent"] + 27["SweepEdge Opposite"] + 28["SweepEdge Adjacent"] + 29["SweepEdge Opposite"] + 30["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 ---- 10 + 2 --- 9 + 3 --- 16 + 3 --- 29 + 3 --- 30 + 4 --- 15 + 4 --- 27 + 4 --- 28 + 5 --- 14 + 5 --- 25 + 5 --- 26 + 6 --- 13 + 6 --- 23 + 6 --- 24 + 7 --- 12 + 7 --- 21 + 7 --- 22 + 8 --- 11 + 8 --- 19 + 8 --- 20 + 10 --- 11 + 10 --- 12 + 10 --- 13 + 10 --- 14 + 10 --- 15 + 10 --- 16 + 10 --- 17 + 10 --- 18 + 10 --- 19 + 10 --- 20 + 10 --- 21 + 10 --- 22 + 10 --- 23 + 10 --- 24 + 10 --- 25 + 10 --- 26 + 10 --- 27 + 10 --- 28 + 10 --- 29 + 10 --- 30 +``` diff --git a/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..8fadf4d2ea --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map parametric.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..6af8c110cb --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric/artifact_graph_mind_map.snap.md @@ -0,0 +1,52 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..b83af8c971 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart parametric_with_tan_arc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..7c45d27409 --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_flowchart.snap.md @@ -0,0 +1,104 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[239, 260, 0]"] + 3["Segment
[266, 290, 0]"] + 4["Segment
[296, 347, 0]"] + 5["Segment
[353, 379, 0]"] + 6["Segment
[385, 409, 0]"] + 7["Segment
[415, 440, 0]"] + 8["Segment
[446, 529, 0]"] + 9["Segment
[535, 560, 0]"] + 10["Segment
[566, 574, 0]"] + 11[Solid2d] + end + 1["Plane
[239, 260, 0]"] + 12["Sweep Extrusion
[580, 597, 0]"] + 13[Wall] + 14[Wall] + 15[Wall] + 16[Wall] + 17[Wall] + 18[Wall] + 19[Wall] + 20[Wall] + 21["Cap Start"] + 22["Cap End"] + 23["SweepEdge Opposite"] + 24["SweepEdge Adjacent"] + 25["SweepEdge Opposite"] + 26["SweepEdge Adjacent"] + 27["SweepEdge Opposite"] + 28["SweepEdge Adjacent"] + 29["SweepEdge Opposite"] + 30["SweepEdge Adjacent"] + 31["SweepEdge Opposite"] + 32["SweepEdge Adjacent"] + 33["SweepEdge Opposite"] + 34["SweepEdge Adjacent"] + 35["SweepEdge Opposite"] + 36["SweepEdge Adjacent"] + 37["SweepEdge Opposite"] + 38["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 ---- 12 + 2 --- 11 + 3 --- 13 + 3 --- 23 + 3 --- 24 + 4 --- 14 + 4 --- 25 + 4 --- 26 + 5 --- 15 + 5 --- 27 + 5 --- 28 + 6 --- 16 + 6 --- 29 + 6 --- 30 + 7 --- 17 + 7 --- 31 + 7 --- 32 + 8 --- 18 + 8 --- 33 + 8 --- 34 + 9 --- 19 + 9 --- 35 + 9 --- 36 + 10 --- 20 + 10 --- 37 + 10 --- 38 + 12 --- 13 + 12 --- 14 + 12 --- 15 + 12 --- 16 + 12 --- 17 + 12 --- 18 + 12 --- 19 + 12 --- 20 + 12 --- 21 + 12 --- 22 + 12 --- 23 + 12 --- 24 + 12 --- 25 + 12 --- 26 + 12 --- 27 + 12 --- 28 + 12 --- 29 + 12 --- 30 + 12 --- 31 + 12 --- 32 + 12 --- 33 + 12 --- 34 + 12 --- 35 + 12 --- 36 + 12 --- 37 + 12 --- 38 +``` diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..44269ad79e --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map parametric_with_tan_arc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..23c574178e --- /dev/null +++ b/src/wasm-lib/kcl/tests/parametric_with_tan_arc/artifact_graph_mind_map.snap.md @@ -0,0 +1,66 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..48db6775b0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart pentagon_fillet_sugar.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..c248428e0b --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_flowchart.snap.md @@ -0,0 +1,101 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[163, 188, 0]"] + 3["Segment
[194, 249, 0]"] + 4["Segment
[255, 311, 0]"] + 5["Segment
[317, 373, 0]"] + end + subgraph path18 [Path] + 18["Path
[466, 517, 0]"] + 19["Segment
[525, 547, 0]"] + 20["Segment
[555, 563, 0]"] + 21[Solid2d] + end + subgraph path29 [Path] + 29["Path
[466, 517, 0]"] + 30["Segment
[525, 547, 0]"] + 31["Segment
[555, 563, 0]"] + 32[Solid2d] + end + 1["Plane
[138, 157, 0]"] + 6["Sweep Extrusion
[379, 405, 0]"] + 7[Wall] + 8[Wall] + 9[Wall] + 10["Cap Start"] + 11["Cap End"] + 12["SweepEdge Opposite"] + 13["SweepEdge Adjacent"] + 14["SweepEdge Opposite"] + 15["SweepEdge Adjacent"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 22["Sweep Extrusion
[606, 628, 0]"] + 23[Wall] + 24["Cap End"] + 25["SweepEdge Opposite"] + 26["SweepEdge Adjacent"] + 27["EdgeCut Fillet
[634, 765, 0]"] + 28["EdgeCut Fillet
[634, 765, 0]"] + 33["Sweep Extrusion
[804, 826, 0]"] + 34[Wall] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["EdgeCut Fillet
[832, 963, 0]"] + 39["EdgeCut Fillet
[832, 963, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 6 + 3 --- 7 + 3 --- 12 + 3 --- 13 + 4 --- 8 + 4 --- 14 + 4 --- 15 + 5 --- 9 + 5 --- 16 + 5 --- 17 + 6 --- 7 + 6 --- 8 + 6 --- 9 + 6 --- 10 + 6 --- 11 + 6 --- 12 + 6 --- 13 + 6 --- 14 + 6 --- 15 + 6 --- 16 + 6 --- 17 + 7 --- 29 + 9 --- 18 + 18 --- 19 + 18 --- 20 + 18 ---- 22 + 18 --- 21 + 19 --- 23 + 19 --- 25 + 19 --- 26 + 19 --- 27 + 22 --- 23 + 22 --- 24 + 22 --- 25 + 22 --- 26 + 25 <--x 28 + 29 --- 30 + 29 --- 31 + 29 ---- 33 + 29 --- 32 + 30 --- 34 + 30 --- 36 + 30 --- 37 + 30 --- 38 + 33 --- 34 + 33 --- 35 + 33 --- 36 + 33 --- 37 + 36 <--x 39 +``` diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..3a6a65ac03 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map pentagon_fillet_sugar.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..1c812299ef --- /dev/null +++ b/src/wasm-lib/kcl/tests/pentagon_fillet_sugar/artifact_graph_mind_map.snap.md @@ -0,0 +1,82 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Sweep Extrusion + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Sweep Extrusion + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Sweep Extrusion + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Sweep Extrusion + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent +``` diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..d67a9f3603 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart pipe_as_arg.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..3d647b16c6 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_flowchart.snap.md @@ -0,0 +1,62 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[177, 194, 0]"] + 3["Segment
[202, 215, 0]"] + 4["Segment
[223, 236, 0]"] + 5["Segment
[244, 257, 0]"] + 6["Segment
[265, 278, 0]"] + 7["Segment
[286, 294, 0]"] + 8[Solid2d] + end + 1["Plane
[177, 194, 0]"] + 9["Sweep Extrusion
[302, 320, 0]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 13 + 3 --- 22 + 3 --- 23 + 4 --- 12 + 4 --- 20 + 4 --- 21 + 5 --- 11 + 5 --- 18 + 5 --- 19 + 6 --- 10 + 6 --- 16 + 6 --- 17 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 +``` diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..eb163bc284 --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map pipe_as_arg.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..1e37cb6fdd --- /dev/null +++ b/src/wasm-lib/kcl/tests/pipe_as_arg/artifact_graph_mind_map.snap.md @@ -0,0 +1,39 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..a00e2052d4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart poop_chute.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..a1b0c04b74 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_flowchart.snap.md @@ -0,0 +1,315 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[208, 252, 0]"] + 3["Segment
[258, 286, 0]"] + 4["Segment
[292, 355, 0]"] + 5["Segment
[361, 379, 0]"] + 6["Segment
[385, 410, 0]"] + 7["Segment
[416, 442, 0]"] + 8["Segment
[448, 547, 0]"] + 9["Segment
[553, 578, 0]"] + 10["Segment
[584, 662, 0]"] + 11["Segment
[668, 686, 0]"] + 12["Segment
[692, 705, 0]"] + 13["Segment
[711, 737, 0]"] + 14["Segment
[743, 789, 0]"] + 15["Segment
[795, 803, 0]"] + 16[Solid2d] + end + subgraph path60 [Path] + 60["Path
[992, 1036, 0]"] + 61["Segment
[1042, 1070, 0]"] + 62["Segment
[1076, 1139, 0]"] + 63["Segment
[1145, 1163, 0]"] + 64["Segment
[1169, 1194, 0]"] + 65["Segment
[1200, 1226, 0]"] + 66["Segment
[1232, 1331, 0]"] + 67["Segment
[1337, 1362, 0]"] + 68["Segment
[1368, 1446, 0]"] + 69["Segment
[1452, 1470, 0]"] + 70["Segment
[1476, 1489, 0]"] + 71["Segment
[1495, 1521, 0]"] + 72["Segment
[1527, 1573, 0]"] + 73["Segment
[1579, 1587, 0]"] + 74[Solid2d] + end + 1["Plane
[182, 202, 0]"] + 17["Sweep Revolve
[814, 952, 0]"] + 18[Wall] + 19[Wall] + 20[Wall] + 21[Wall] + 22[Wall] + 23[Wall] + 24[Wall] + 25[Wall] + 26[Wall] + 27[Wall] + 28[Wall] + 29[Wall] + 30[Wall] + 31["Cap Start"] + 32["Cap End"] + 33["SweepEdge Opposite"] + 34["SweepEdge Adjacent"] + 35["SweepEdge Opposite"] + 36["SweepEdge Adjacent"] + 37["SweepEdge Opposite"] + 38["SweepEdge Adjacent"] + 39["SweepEdge Opposite"] + 40["SweepEdge Adjacent"] + 41["SweepEdge Opposite"] + 42["SweepEdge Adjacent"] + 43["SweepEdge Opposite"] + 44["SweepEdge Adjacent"] + 45["SweepEdge Opposite"] + 46["SweepEdge Adjacent"] + 47["SweepEdge Opposite"] + 48["SweepEdge Adjacent"] + 49["SweepEdge Opposite"] + 50["SweepEdge Adjacent"] + 51["SweepEdge Opposite"] + 52["SweepEdge Adjacent"] + 53["SweepEdge Opposite"] + 54["SweepEdge Adjacent"] + 55["SweepEdge Opposite"] + 56["SweepEdge Adjacent"] + 57["SweepEdge Opposite"] + 58["SweepEdge Adjacent"] + 59["Plane
[966, 986, 0]"] + 75["Sweep Extrusion
[1593, 1625, 0]"] + 76[Wall] + 77[Wall] + 78[Wall] + 79[Wall] + 80[Wall] + 81[Wall] + 82[Wall] + 83[Wall] + 84[Wall] + 85[Wall] + 86[Wall] + 87[Wall] + 88[Wall] + 89["Cap Start"] + 90["Cap End"] + 91["SweepEdge Opposite"] + 92["SweepEdge Adjacent"] + 93["SweepEdge Opposite"] + 94["SweepEdge Adjacent"] + 95["SweepEdge Opposite"] + 96["SweepEdge Adjacent"] + 97["SweepEdge Opposite"] + 98["SweepEdge Adjacent"] + 99["SweepEdge Opposite"] + 100["SweepEdge Adjacent"] + 101["SweepEdge Opposite"] + 102["SweepEdge Adjacent"] + 103["SweepEdge Opposite"] + 104["SweepEdge Adjacent"] + 105["SweepEdge Opposite"] + 106["SweepEdge Adjacent"] + 107["SweepEdge Opposite"] + 108["SweepEdge Adjacent"] + 109["SweepEdge Opposite"] + 110["SweepEdge Adjacent"] + 111["SweepEdge Opposite"] + 112["SweepEdge Adjacent"] + 113["SweepEdge Opposite"] + 114["SweepEdge Adjacent"] + 115["SweepEdge Opposite"] + 116["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 --- 9 + 2 --- 10 + 2 --- 11 + 2 --- 12 + 2 --- 13 + 2 --- 14 + 2 --- 15 + 2 ---- 17 + 2 --- 16 + 3 --- 18 + 3 --- 33 + 3 --- 34 + 4 --- 19 + 4 --- 35 + 4 --- 36 + 5 --- 20 + 5 --- 37 + 5 --- 38 + 6 --- 21 + 6 --- 39 + 6 --- 40 + 7 --- 22 + 7 --- 41 + 7 --- 42 + 8 --- 23 + 8 --- 43 + 8 --- 44 + 9 --- 24 + 9 --- 45 + 9 --- 46 + 10 --- 25 + 10 --- 47 + 10 --- 48 + 11 --- 26 + 11 --- 49 + 11 --- 50 + 12 --- 27 + 12 --- 51 + 12 --- 52 + 13 --- 28 + 13 --- 53 + 13 --- 54 + 14 --- 29 + 14 --- 55 + 14 --- 56 + 15 --- 30 + 15 --- 57 + 15 --- 58 + 17 --- 18 + 17 --- 19 + 17 --- 20 + 17 --- 21 + 17 --- 22 + 17 --- 23 + 17 --- 24 + 17 --- 25 + 17 --- 26 + 17 --- 27 + 17 --- 28 + 17 --- 29 + 17 --- 30 + 17 --- 31 + 17 --- 32 + 17 --- 33 + 17 --- 34 + 17 --- 35 + 17 --- 36 + 17 --- 37 + 17 --- 38 + 17 --- 39 + 17 --- 40 + 17 --- 41 + 17 --- 42 + 17 --- 43 + 17 --- 44 + 17 --- 45 + 17 --- 46 + 17 --- 47 + 17 --- 48 + 17 --- 49 + 17 --- 50 + 17 --- 51 + 17 --- 52 + 17 --- 53 + 17 --- 54 + 17 --- 55 + 17 --- 56 + 17 --- 57 + 17 --- 58 + 59 --- 60 + 60 --- 61 + 60 --- 62 + 60 --- 63 + 60 --- 64 + 60 --- 65 + 60 --- 66 + 60 --- 67 + 60 --- 68 + 60 --- 69 + 60 --- 70 + 60 --- 71 + 60 --- 72 + 60 --- 73 + 60 ---- 75 + 60 --- 74 + 61 --- 76 + 61 --- 91 + 61 --- 92 + 62 --- 77 + 62 --- 93 + 62 --- 94 + 63 --- 78 + 63 --- 95 + 63 --- 96 + 64 --- 79 + 64 --- 97 + 64 --- 98 + 65 --- 80 + 65 --- 99 + 65 --- 100 + 66 --- 81 + 66 --- 101 + 66 --- 102 + 67 --- 82 + 67 --- 103 + 67 --- 104 + 68 --- 83 + 68 --- 105 + 68 --- 106 + 69 --- 84 + 69 --- 107 + 69 --- 108 + 70 --- 85 + 70 --- 109 + 70 --- 110 + 71 --- 86 + 71 --- 111 + 71 --- 112 + 72 --- 87 + 72 --- 113 + 72 --- 114 + 73 --- 88 + 73 --- 115 + 73 --- 116 + 75 --- 76 + 75 --- 77 + 75 --- 78 + 75 --- 79 + 75 --- 80 + 75 --- 81 + 75 --- 82 + 75 --- 83 + 75 --- 84 + 75 --- 85 + 75 --- 86 + 75 --- 87 + 75 --- 88 + 75 --- 89 + 75 --- 90 + 75 --- 91 + 75 --- 92 + 75 --- 93 + 75 --- 94 + 75 --- 95 + 75 --- 96 + 75 --- 97 + 75 --- 98 + 75 --- 99 + 75 --- 100 + 75 --- 101 + 75 --- 102 + 75 --- 103 + 75 --- 104 + 75 --- 105 + 75 --- 106 + 75 --- 107 + 75 --- 108 + 75 --- 109 + 75 --- 110 + 75 --- 111 + 75 --- 112 + 75 --- 113 + 75 --- 114 + 75 --- 115 + 75 --- 116 +``` diff --git a/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..756ec54a66 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map poop_chute.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..9d101f1a68 --- /dev/null +++ b/src/wasm-lib/kcl/tests/poop_chute/artifact_graph_mind_map.snap.md @@ -0,0 +1,198 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Revolve + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..3045bc3c23 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart property_of_object.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..13e5335097 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..a119002bd0 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map property_of_object.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..32dc0f6d42 --- /dev/null +++ b/src/wasm-lib/kcl/tests/property_of_object/artifact_graph_mind_map.snap.md @@ -0,0 +1,4 @@ +```mermaid +mindmap + root +``` diff --git a/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..31758041e4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart riddle_small.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..9808d2ba21 --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_flowchart.snap.md @@ -0,0 +1,60 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[166, 193, 0]"] + 3["Segment
[199, 214, 0]"] + 4["Segment
[220, 236, 0]"] + 5["Segment
[242, 258, 0]"] + 6["Segment
[264, 272, 0]"] + 7[Solid2d] + end + 1["Plane
[141, 160, 0]"] + 8["Sweep Extrusion
[278, 291, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 +``` diff --git a/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..4a3c793456 --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map riddle_small.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d67f1f1f3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/riddle_small/artifact_graph_mind_map.snap.md @@ -0,0 +1,38 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..cd5d126b6f --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch-on-chamfer-two-times-different-order.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..7199bc4c9a --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_flowchart.snap.md @@ -0,0 +1,139 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[37, 69, 0]"] + 3["Segment
[105, 154, 0]"] + 4["Segment
[160, 247, 0]"] + 5["Segment
[253, 350, 0]"] + 6["Segment
[356, 411, 0]"] + 7["Segment
[417, 425, 0]"] + 8[Solid2d] + end + subgraph path27 [Path] + 27["Path
[712, 746, 0]"] + 28["Segment
[752, 800, 0]"] + 29["Segment
[806, 907, 0]"] + 30["Segment
[913, 1033, 0]"] + 31["Segment
[1039, 1086, 0]"] + 32["Segment
[1092, 1100, 0]"] + 33[Solid2d] + end + subgraph path34 [Path] + 34["Path
[1151, 1186, 0]"] + 35["Segment
[1192, 1240, 0]"] + 36["Segment
[1246, 1348, 0]"] + 37["Segment
[1354, 1474, 0]"] + 38["Segment
[1480, 1527, 0]"] + 39["Segment
[1533, 1541, 0]"] + 40[Solid2d] + end + 1["Plane
[12, 31, 0]"] + 9["Sweep Extrusion
[439, 462, 0]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 24["EdgeCut Fillet
[468, 510, 0]"] + 25["Plane
[1151, 1186, 0]"] + 26["Plane
[712, 746, 0]"] + 41["Sweep Extrusion
[1555, 1577, 0]"] + 42[Wall] + 43[Wall] + 44[Wall] + 45[Wall] + 46["Cap End"] + 47["SweepEdge Opposite"] + 48["SweepEdge Adjacent"] + 49["SweepEdge Opposite"] + 50["SweepEdge Adjacent"] + 51["SweepEdge Opposite"] + 52["SweepEdge Adjacent"] + 53["SweepEdge Opposite"] + 54["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 13 + 3 --- 22 + 3 --- 23 + 4 --- 12 + 4 --- 20 + 4 --- 21 + 4 --- 24 + 5 --- 11 + 5 --- 18 + 5 --- 19 + 6 --- 10 + 6 --- 16 + 6 --- 17 + 6 x--> 26 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 + 25 --- 34 + 26 --- 27 + 27 --- 28 + 27 --- 29 + 27 --- 30 + 27 --- 31 + 27 --- 32 + 27 --- 33 + 34 --- 35 + 34 --- 36 + 34 --- 37 + 34 --- 38 + 34 --- 39 + 34 ---- 41 + 34 --- 40 + 35 --- 45 + 35 --- 53 + 35 --- 54 + 36 --- 44 + 36 --- 51 + 36 --- 52 + 37 --- 43 + 37 --- 49 + 37 --- 50 + 38 --- 42 + 38 --- 47 + 38 --- 48 + 41 --- 42 + 41 --- 43 + 41 --- 44 + 41 --- 45 + 41 --- 46 + 41 --- 47 + 41 --- 48 + 41 --- 49 + 41 --- 50 + 41 --- 51 + 41 --- 52 + 41 --- 53 + 41 --- 54 +``` diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..e599c77149 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch-on-chamfer-two-times-different-order.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..709ba9eb3d --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times-different-order/artifact_graph_mind_map.snap.md @@ -0,0 +1,90 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Plane + Path + Segment + Segment + Segment + Segment + Segment + Solid2d + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Segment + Segment + Segment + Segment + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..ff77f8e377 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch-on-chamfer-two-times.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..95bc00bd78 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_flowchart.snap.md @@ -0,0 +1,139 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[37, 69, 0]"] + 3["Segment
[105, 154, 0]"] + 4["Segment
[160, 247, 0]"] + 5["Segment
[253, 350, 0]"] + 6["Segment
[356, 411, 0]"] + 7["Segment
[417, 425, 0]"] + 8[Solid2d] + end + subgraph path27 [Path] + 27["Path
[712, 746, 0]"] + 28["Segment
[752, 800, 0]"] + 29["Segment
[806, 907, 0]"] + 30["Segment
[913, 1033, 0]"] + 31["Segment
[1039, 1086, 0]"] + 32["Segment
[1092, 1100, 0]"] + 33[Solid2d] + end + subgraph path34 [Path] + 34["Path
[1151, 1186, 0]"] + 35["Segment
[1192, 1240, 0]"] + 36["Segment
[1246, 1348, 0]"] + 37["Segment
[1354, 1474, 0]"] + 38["Segment
[1480, 1527, 0]"] + 39["Segment
[1533, 1541, 0]"] + 40[Solid2d] + end + 1["Plane
[12, 31, 0]"] + 9["Sweep Extrusion
[439, 462, 0]"] + 10[Wall] + 11[Wall] + 12[Wall] + 13[Wall] + 14["Cap Start"] + 15["Cap End"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 18["SweepEdge Opposite"] + 19["SweepEdge Adjacent"] + 20["SweepEdge Opposite"] + 21["SweepEdge Adjacent"] + 22["SweepEdge Opposite"] + 23["SweepEdge Adjacent"] + 24["EdgeCut Fillet
[468, 510, 0]"] + 25["Plane
[712, 746, 0]"] + 26["Plane
[1151, 1186, 0]"] + 41["Sweep Extrusion
[1555, 1577, 0]"] + 42[Wall] + 43[Wall] + 44[Wall] + 45[Wall] + 46["Cap End"] + 47["SweepEdge Opposite"] + 48["SweepEdge Adjacent"] + 49["SweepEdge Opposite"] + 50["SweepEdge Adjacent"] + 51["SweepEdge Opposite"] + 52["SweepEdge Adjacent"] + 53["SweepEdge Opposite"] + 54["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 ---- 9 + 2 --- 8 + 3 --- 13 + 3 --- 22 + 3 --- 23 + 4 --- 12 + 4 --- 20 + 4 --- 21 + 4 --- 24 + 5 --- 11 + 5 --- 18 + 5 --- 19 + 6 --- 10 + 6 --- 16 + 6 --- 17 + 6 x--> 25 + 9 --- 10 + 9 --- 11 + 9 --- 12 + 9 --- 13 + 9 --- 14 + 9 --- 15 + 9 --- 16 + 9 --- 17 + 9 --- 18 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 + 25 --- 27 + 26 --- 34 + 27 --- 28 + 27 --- 29 + 27 --- 30 + 27 --- 31 + 27 --- 32 + 27 --- 33 + 34 --- 35 + 34 --- 36 + 34 --- 37 + 34 --- 38 + 34 --- 39 + 34 ---- 41 + 34 --- 40 + 35 --- 45 + 35 --- 53 + 35 --- 54 + 36 --- 44 + 36 --- 51 + 36 --- 52 + 37 --- 43 + 37 --- 49 + 37 --- 50 + 38 --- 42 + 38 --- 47 + 38 --- 48 + 41 --- 42 + 41 --- 43 + 41 --- 44 + 41 --- 45 + 41 --- 46 + 41 --- 47 + 41 --- 48 + 41 --- 49 + 41 --- 50 + 41 --- 51 + 41 --- 52 + 41 --- 53 + 41 --- 54 +``` diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..d71a397902 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch-on-chamfer-two-times.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..c433c1ae82 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch-on-chamfer-two-times/artifact_graph_mind_map.snap.md @@ -0,0 +1,90 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + EdgeCut Fillet + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Plane + Path + Segment + Segment + Segment + Segment + Segment + Solid2d + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Segment + Segment + Segment + Segment + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..d8004ad9e5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_in_object.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..68da5fad9e --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_flowchart.snap.md @@ -0,0 +1,117 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[48, 73, 0]"] + 3["Segment
[81, 96, 0]"] + 4["Segment
[104, 119, 0]"] + 5["Segment
[127, 143, 0]"] + 6["Segment
[151, 159, 0]"] + 7[Solid2d] + end + subgraph path24 [Path] + 24["Path
[248, 273, 0]"] + 25["Segment
[285, 300, 0]"] + 26["Segment
[312, 327, 0]"] + 27["Segment
[339, 355, 0]"] + 28["Segment
[367, 375, 0]"] + 29[Solid2d] + end + 1["Plane
[21, 40, 0]"] + 8["Sweep Extrusion
[407, 422, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["Plane
[217, 236, 0]"] + 30["Sweep Extrusion
[459, 473, 0]"] + 31[Wall] + 32[Wall] + 33[Wall] + 34[Wall] + 35["Cap Start"] + 36["Cap End"] + 37["SweepEdge Opposite"] + 38["SweepEdge Adjacent"] + 39["SweepEdge Opposite"] + 40["SweepEdge Adjacent"] + 41["SweepEdge Opposite"] + 42["SweepEdge Adjacent"] + 43["SweepEdge Opposite"] + 44["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 23 --- 24 + 24 --- 25 + 24 --- 26 + 24 --- 27 + 24 --- 28 + 24 ---- 30 + 24 --- 29 + 25 --- 34 + 25 --- 43 + 25 --- 44 + 26 --- 33 + 26 --- 41 + 26 --- 42 + 27 --- 32 + 27 --- 39 + 27 --- 40 + 28 --- 31 + 28 --- 37 + 28 --- 38 + 30 --- 31 + 30 --- 32 + 30 --- 33 + 30 --- 34 + 30 --- 35 + 30 --- 36 + 30 --- 37 + 30 --- 38 + 30 --- 39 + 30 --- 40 + 30 --- 41 + 30 --- 42 + 30 --- 43 + 30 --- 44 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..fec50fd248 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_in_object.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..0f155a58dd --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_in_object/artifact_graph_mind_map.snap.md @@ -0,0 +1,72 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..e63494c077 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..3acf2f1c01 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_flowchart.snap.md @@ -0,0 +1,116 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 68, 0]"] + 3["Segment
[74, 105, 0]"] + 4["Segment
[111, 135, 0]"] + 5["Segment
[141, 165, 0]"] + 6["Segment
[171, 179, 0]"] + 7[Solid2d] + end + subgraph path23 [Path] + 23["Path
[244, 269, 0]"] + 24["Segment
[275, 291, 0]"] + 25["Segment
[297, 313, 0]"] + 26["Segment
[319, 336, 0]"] + 27["Segment
[342, 350, 0]"] + 28[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 8["Sweep Extrusion
[185, 198, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 29["Sweep Extrusion
[356, 369, 0]"] + 30[Wall] + 31[Wall] + 32[Wall] + 33[Wall] + 34["Cap Start"] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["SweepEdge Opposite"] + 39["SweepEdge Adjacent"] + 40["SweepEdge Opposite"] + 41["SweepEdge Adjacent"] + 42["SweepEdge Opposite"] + 43["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 12 --- 23 + 23 --- 24 + 23 --- 25 + 23 --- 26 + 23 --- 27 + 23 ---- 29 + 23 --- 28 + 24 --- 33 + 24 --- 42 + 24 --- 43 + 25 --- 32 + 25 --- 40 + 25 --- 41 + 26 --- 31 + 26 --- 38 + 26 --- 39 + 27 --- 30 + 27 --- 36 + 27 --- 37 + 29 --- 30 + 29 --- 31 + 29 --- 32 + 29 --- 33 + 29 --- 34 + 29 --- 35 + 29 --- 36 + 29 --- 37 + 29 --- 38 + 29 --- 39 + 29 --- 40 + 29 --- 41 + 29 --- 42 + 29 --- 43 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..6eb1857d68 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..d5ff3359d5 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face/artifact_graph_mind_map.snap.md @@ -0,0 +1,104 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..3f5518e6f8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face_after_fillets_referencing_face.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..966960fcb9 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_flowchart.snap.md @@ -0,0 +1,142 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[1017, 1042, 0]"] + 3["Segment
[1048, 1084, 0]"] + 4["Segment
[1090, 1124, 0]"] + 5["Segment
[1130, 1154, 0]"] + 6["Segment
[1160, 1209, 0]"] + 7["Segment
[1215, 1252, 0]"] + 8["Segment
[1258, 1266, 0]"] + 9[Solid2d] + end + subgraph path33 [Path] + 33["Path
[1544, 1575, 0]"] + 34["Segment
[1581, 1603, 0]"] + 35["Segment
[1609, 1631, 0]"] + 36["Segment
[1637, 1659, 0]"] + 37["Segment
[1665, 1712, 0]"] + 38["Segment
[1718, 1726, 0]"] + 39[Solid2d] + end + 1["Plane
[992, 1011, 0]"] + 10["Sweep Extrusion
[1272, 1289, 0]"] + 11[Wall] + 12[Wall] + 13[Wall] + 14[Wall] + 15[Wall] + 16[Wall] + 17["Cap Start"] + 18["Cap End"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 23["SweepEdge Opposite"] + 24["SweepEdge Adjacent"] + 25["SweepEdge Opposite"] + 26["SweepEdge Adjacent"] + 27["SweepEdge Opposite"] + 28["SweepEdge Adjacent"] + 29["SweepEdge Opposite"] + 30["SweepEdge Adjacent"] + 31["EdgeCut Fillet
[1295, 1386, 0]"] + 32["EdgeCut Fillet
[1392, 1495, 0]"] + 40["Sweep Extrusion
[1732, 1746, 0]"] + 41[Wall] + 42[Wall] + 43[Wall] + 44[Wall] + 45["Cap End"] + 46["SweepEdge Opposite"] + 47["SweepEdge Adjacent"] + 48["SweepEdge Opposite"] + 49["SweepEdge Adjacent"] + 50["SweepEdge Opposite"] + 51["SweepEdge Adjacent"] + 52["SweepEdge Opposite"] + 53["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 + 2 --- 8 + 2 ---- 10 + 2 --- 9 + 3 --- 11 + 3 --- 19 + 3 --- 20 + 4 --- 12 + 4 --- 21 + 4 --- 22 + 5 --- 13 + 5 --- 23 + 5 --- 24 + 6 --- 14 + 6 --- 25 + 6 --- 26 + 7 --- 15 + 7 --- 27 + 7 --- 28 + 8 --- 16 + 8 --- 29 + 8 --- 30 + 10 --- 11 + 10 --- 12 + 10 --- 13 + 10 --- 14 + 10 --- 15 + 10 --- 16 + 10 --- 17 + 10 --- 18 + 10 --- 19 + 10 --- 20 + 10 --- 21 + 10 --- 22 + 10 --- 23 + 10 --- 24 + 10 --- 25 + 10 --- 26 + 10 --- 27 + 10 --- 28 + 10 --- 29 + 10 --- 30 + 12 --- 33 + 26 <--x 31 + 20 <--x 32 + 33 --- 34 + 33 --- 35 + 33 --- 36 + 33 --- 37 + 33 --- 38 + 33 ---- 40 + 33 --- 39 + 34 --- 44 + 34 --- 52 + 34 --- 53 + 35 --- 43 + 35 --- 50 + 35 --- 51 + 36 --- 42 + 36 --- 48 + 36 --- 49 + 37 --- 41 + 37 --- 46 + 37 --- 47 + 40 --- 41 + 40 --- 42 + 40 --- 43 + 40 --- 44 + 40 --- 45 + 40 --- 46 + 40 --- 47 + 40 --- 48 + 40 --- 49 + 40 --- 50 + 40 --- 51 + 40 --- 52 + 40 --- 53 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..749eff81a3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face_after_fillets_referencing_face.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..78e301e205 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_after_fillets_referencing_face/artifact_graph_mind_map.snap.md @@ -0,0 +1,118 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..82f6063ec7 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face_circle_tagged.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..dd5e9e104c --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_flowchart.snap.md @@ -0,0 +1,83 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[56, 78, 0]"] + 3["Segment
[86, 105, 0]"] + 4["Segment
[113, 132, 0]"] + 5["Segment
[140, 160, 0]"] + 6["Segment
[208, 216, 0]"] + 7[Solid2d] + end + subgraph path23 [Path] + 23["Path
[283, 336, 0]"] + 24["Segment
[283, 336, 0]"] + 25[Solid2d] + end + 1["Plane
[29, 48, 0]"] + 8["Sweep Extrusion
[222, 236, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Plane
[283, 336, 0]"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 26["Sweep Extrusion
[342, 355, 0]"] + 27[Wall] + 28["Cap Start"] + 29["Cap End"] + 30["SweepEdge Opposite"] + 31["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 x--> 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 14 --- 23 + 23 --- 24 + 23 ---- 26 + 23 --- 25 + 24 --- 27 + 24 --- 30 + 24 --- 31 + 26 --- 27 + 26 --- 28 + 26 --- 29 + 26 --- 30 + 26 --- 31 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..7c32c0c14a --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face_circle_tagged.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..c0507c6d3b --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_circle_tagged/artifact_graph_mind_map.snap.md @@ -0,0 +1,63 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..2b47e0d012 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face_end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..db179fd281 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_flowchart.snap.md @@ -0,0 +1,116 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[56, 78, 0]"] + 3["Segment
[86, 105, 0]"] + 4["Segment
[113, 132, 0]"] + 5["Segment
[140, 160, 0]"] + 6["Segment
[208, 216, 0]"] + 7[Solid2d] + end + subgraph path23 [Path] + 23["Path
[283, 308, 0]"] + 24["Segment
[314, 330, 0]"] + 25["Segment
[336, 352, 0]"] + 26["Segment
[358, 375, 0]"] + 27["Segment
[381, 389, 0]"] + 28[Solid2d] + end + 1["Plane
[29, 48, 0]"] + 8["Sweep Extrusion
[222, 236, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Plane
[283, 308, 0]"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 29["Sweep Extrusion
[395, 408, 0]"] + 30[Wall] + 31[Wall] + 32[Wall] + 33[Wall] + 34["Cap Start"] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["SweepEdge Opposite"] + 39["SweepEdge Adjacent"] + 40["SweepEdge Opposite"] + 41["SweepEdge Adjacent"] + 42["SweepEdge Opposite"] + 43["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 x--> 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 14 --- 23 + 23 --- 24 + 23 --- 25 + 23 --- 26 + 23 --- 27 + 23 ---- 29 + 23 --- 28 + 24 --- 33 + 24 --- 42 + 24 --- 43 + 25 --- 32 + 25 --- 40 + 25 --- 41 + 26 --- 31 + 26 --- 38 + 26 --- 39 + 27 --- 30 + 27 --- 36 + 27 --- 37 + 29 --- 30 + 29 --- 31 + 29 --- 32 + 29 --- 33 + 29 --- 34 + 29 --- 35 + 29 --- 36 + 29 --- 37 + 29 --- 38 + 29 --- 39 + 29 --- 40 + 29 --- 41 + 29 --- 42 + 29 --- 43 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..eb0572e2f8 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face_end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..c7ab082c4c --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end/artifact_graph_mind_map.snap.md @@ -0,0 +1,105 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..3f01d10077 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face_end_negative_extrude.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..5c9e53dd27 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_flowchart.snap.md @@ -0,0 +1,116 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[56, 78, 0]"] + 3["Segment
[86, 105, 0]"] + 4["Segment
[113, 132, 0]"] + 5["Segment
[140, 160, 0]"] + 6["Segment
[208, 216, 0]"] + 7[Solid2d] + end + subgraph path23 [Path] + 23["Path
[283, 308, 0]"] + 24["Segment
[314, 330, 0]"] + 25["Segment
[336, 352, 0]"] + 26["Segment
[358, 375, 0]"] + 27["Segment
[381, 389, 0]"] + 28[Solid2d] + end + 1["Plane
[29, 48, 0]"] + 8["Sweep Extrusion
[222, 236, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Cap Start"] + 14["Plane
[283, 308, 0]"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 29["Sweep Extrusion
[395, 409, 0]"] + 30[Wall] + 31[Wall] + 32[Wall] + 33[Wall] + 34["Cap Start"] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["SweepEdge Opposite"] + 39["SweepEdge Adjacent"] + 40["SweepEdge Opposite"] + 41["SweepEdge Adjacent"] + 42["SweepEdge Opposite"] + 43["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 --- 13 + 8 x--> 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 14 --- 23 + 23 --- 24 + 23 --- 25 + 23 --- 26 + 23 --- 27 + 23 ---- 29 + 23 --- 28 + 24 --- 33 + 24 --- 42 + 24 --- 43 + 25 --- 32 + 25 --- 40 + 25 --- 41 + 26 --- 31 + 26 --- 38 + 26 --- 39 + 27 --- 30 + 27 --- 36 + 27 --- 37 + 29 --- 30 + 29 --- 31 + 29 --- 32 + 29 --- 33 + 29 --- 34 + 29 --- 35 + 29 --- 36 + 29 --- 37 + 29 --- 38 + 29 --- 39 + 29 --- 40 + 29 --- 41 + 29 --- 42 + 29 --- 43 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..2e3b33870d --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face_end_negative_extrude.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..c7ab082c4c --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_end_negative_extrude/artifact_graph_mind_map.snap.md @@ -0,0 +1,105 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..5df7d542d1 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart sketch_on_face_start.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..30a6b4a683 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_flowchart.snap.md @@ -0,0 +1,116 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[56, 78, 0]"] + 3["Segment
[86, 105, 0]"] + 4["Segment
[113, 132, 0]"] + 5["Segment
[140, 160, 0]"] + 6["Segment
[208, 216, 0]"] + 7[Solid2d] + end + subgraph path23 [Path] + 23["Path
[288, 313, 0]"] + 24["Segment
[319, 335, 0]"] + 25["Segment
[341, 357, 0]"] + 26["Segment
[363, 380, 0]"] + 27["Segment
[386, 394, 0]"] + 28[Solid2d] + end + 1["Plane
[29, 48, 0]"] + 8["Sweep Extrusion
[222, 236, 0]"] + 9[Wall] + 10[Wall] + 11[Wall] + 12[Wall] + 13["Plane
[288, 313, 0]"] + 14["Cap End"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 19["SweepEdge Opposite"] + 20["SweepEdge Adjacent"] + 21["SweepEdge Opposite"] + 22["SweepEdge Adjacent"] + 29["Sweep Extrusion
[400, 413, 0]"] + 30[Wall] + 31[Wall] + 32[Wall] + 33[Wall] + 34["Cap Start"] + 35["Cap End"] + 36["SweepEdge Opposite"] + 37["SweepEdge Adjacent"] + 38["SweepEdge Opposite"] + 39["SweepEdge Adjacent"] + 40["SweepEdge Opposite"] + 41["SweepEdge Adjacent"] + 42["SweepEdge Opposite"] + 43["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 ---- 8 + 2 --- 7 + 3 --- 12 + 3 --- 21 + 3 --- 22 + 4 --- 11 + 4 --- 19 + 4 --- 20 + 5 --- 10 + 5 --- 17 + 5 --- 18 + 6 --- 9 + 6 --- 15 + 6 --- 16 + 8 --- 9 + 8 --- 10 + 8 --- 11 + 8 --- 12 + 8 x--> 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 19 + 8 --- 20 + 8 --- 21 + 8 --- 22 + 13 --- 23 + 23 --- 24 + 23 --- 25 + 23 --- 26 + 23 --- 27 + 23 ---- 29 + 23 --- 28 + 24 --- 33 + 24 --- 42 + 24 --- 43 + 25 --- 32 + 25 --- 40 + 25 --- 41 + 26 --- 31 + 26 --- 38 + 26 --- 39 + 27 --- 30 + 27 --- 36 + 27 --- 37 + 29 --- 30 + 29 --- 31 + 29 --- 32 + 29 --- 33 + 29 --- 34 + 29 --- 35 + 29 --- 36 + 29 --- 37 + 29 --- 38 + 29 --- 39 + 29 --- 40 + 29 --- 41 + 29 --- 42 + 29 --- 43 +``` diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..27c0f9b32b --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map sketch_on_face_start.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..b05194afe4 --- /dev/null +++ b/src/wasm-lib/kcl/tests/sketch_on_face_start/artifact_graph_mind_map.snap.md @@ -0,0 +1,105 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..ec8c9ac997 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart tan_arc_x_line.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..bf3151d303 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_flowchart.snap.md @@ -0,0 +1,18 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[89, 124, 0]"] + 3["Segment
[130, 185, 0]"] + 4["Segment
[191, 252, 0]"] + 5["Segment
[258, 344, 0]"] + 6["Segment
[350, 437, 0]"] + 7["Segment
[443, 456, 0]"] + end + 1["Plane
[64, 83, 0]"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 --- 6 + 2 --- 7 +``` diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..07afc8fc94 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map tan_arc_x_line.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..784c1ea97d --- /dev/null +++ b/src/wasm-lib/kcl/tests/tan_arc_x_line/artifact_graph_mind_map.snap.md @@ -0,0 +1,11 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Segment + Segment + Segment + Segment +``` diff --git a/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..cd19a7667d --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart tangential_arc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..a9753f4086 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_flowchart.snap.md @@ -0,0 +1,47 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[12, 33, 0]"] + 3["Segment
[39, 55, 0]"] + 4["Segment
[61, 106, 0]"] + 5["Segment
[112, 129, 0]"] + end + 1["Plane
[12, 33, 0]"] + 6["Sweep Extrusion
[135, 149, 0]"] + 7[Wall] + 8[Wall] + 9[Wall] + 10["Cap Start"] + 11["Cap End"] + 12["SweepEdge Opposite"] + 13["SweepEdge Adjacent"] + 14["SweepEdge Opposite"] + 15["SweepEdge Adjacent"] + 16["SweepEdge Opposite"] + 17["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 6 + 3 --- 7 + 3 --- 12 + 3 --- 13 + 4 --- 8 + 4 --- 14 + 4 --- 15 + 5 --- 9 + 5 --- 16 + 5 --- 17 + 6 --- 7 + 6 --- 8 + 6 --- 9 + 6 --- 10 + 6 --- 11 + 6 --- 12 + 6 --- 13 + 6 --- 14 + 6 --- 15 + 6 --- 16 + 6 --- 17 +``` diff --git a/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..c0150e3d43 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map tangential_arc.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..c3451daa00 --- /dev/null +++ b/src/wasm-lib/kcl/tests/tangential_arc/artifact_graph_mind_map.snap.md @@ -0,0 +1,30 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent +``` diff --git a/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap new file mode 100644 index 0000000000..6076a608cc --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph flowchart xz_plane.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap.md b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap.md new file mode 100644 index 0000000000..a352611406 --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_flowchart.snap.md @@ -0,0 +1,49 @@ +```mermaid +flowchart LR + subgraph path2 [Path] + 2["Path
[35, 60, 0]"] + 3["Segment
[66, 87, 0]"] + 4["Segment
[93, 112, 0]"] + 5["Segment
[118, 126, 0]"] + 6[Solid2d] + end + 1["Plane
[10, 29, 0]"] + 7["Sweep Extrusion
[132, 149, 0]"] + 8[Wall] + 9[Wall] + 10[Wall] + 11["Cap Start"] + 12["Cap End"] + 13["SweepEdge Opposite"] + 14["SweepEdge Adjacent"] + 15["SweepEdge Opposite"] + 16["SweepEdge Adjacent"] + 17["SweepEdge Opposite"] + 18["SweepEdge Adjacent"] + 1 --- 2 + 2 --- 3 + 2 --- 4 + 2 --- 5 + 2 ---- 7 + 2 --- 6 + 3 --- 10 + 3 --- 17 + 3 --- 18 + 4 --- 9 + 4 --- 15 + 4 --- 16 + 5 --- 8 + 5 --- 13 + 5 --- 14 + 7 --- 8 + 7 --- 9 + 7 --- 10 + 7 --- 11 + 7 --- 12 + 7 --- 13 + 7 --- 14 + 7 --- 15 + 7 --- 16 + 7 --- 17 + 7 --- 18 +``` diff --git a/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap new file mode 100644 index 0000000000..a5e6fa45f3 --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap @@ -0,0 +1,6 @@ +--- +source: kcl/src/simulation_tests.rs +description: Artifact graph mind map xz_plane.kcl +extension: md +snapshot_kind: binary +--- diff --git a/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap.md b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap.md new file mode 100644 index 0000000000..56c4e2fa5f --- /dev/null +++ b/src/wasm-lib/kcl/tests/xz_plane/artifact_graph_mind_map.snap.md @@ -0,0 +1,31 @@ +```mermaid +mindmap + root + Plane + Path + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Segment + Wall + SweepEdge Opposite + SweepEdge Adjacent + Sweep Extrusion + Wall + Wall + Wall + Cap Start + Cap End + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + SweepEdge Opposite + SweepEdge Adjacent + Solid2d +``` diff --git a/src/wasm-lib/tests/executor/cache.rs b/src/wasm-lib/tests/executor/cache.rs index 6677d18e41..85e9cc2c03 100644 --- a/src/wasm-lib/tests/executor/cache.rs +++ b/src/wasm-lib/tests/executor/cache.rs @@ -263,4 +263,10 @@ extrude(4, sketch001) first.2.global.artifact_commands.len(), second.2.global.artifact_commands.len() ); + assert!( + first.2.global.artifact_responses.len() < second.2.global.artifact_responses.len(), + "Second should have all the artifact responses of the first, plus more. first={:?}, second={:?}", + first.2.global.artifact_responses.len(), + second.2.global.artifact_responses.len() + ); } diff --git a/yarn.lock b/yarn.lock index 681a2b9ec9..2a0ec7b35f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2258,11 +2258,6 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/d3-force@^3.0.10": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" - integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== - "@types/debug@^4.1.6": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -3880,30 +3875,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -"d3-dispatch@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-force@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -"d3-quadtree@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -"d3-timer@1 - 3": - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - damerau-levenshtein@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"